1.1.1 設備資源初始化
Linux-2..6.32.2已經自帶了完善的DM9000網卡驅動驅動(源代碼位置:linux-2.6.32.2/ drivers/net/dm9000.c),它也是一個平臺設備,因此在目標平臺初始化代碼中,只要填寫好相應的結構表即可(在mach-mini2440.c裏面),具體步驟如下:
首先添加驅動所需的頭文件dm9000.h:
#include <linux/dm9000.h>
再定義DM9000網卡設備的物理基地址,以便後面用到:
/* DM9000AEP 10/100 ethernet controller */
#define MACH_MINI2440_DM9K_BASE (S3C2410_CS4 + 0x300)
再填充該平臺設備的資源設置,以便和DM9000網卡驅動接口配合起來,如下
static struct resource mini2440_dm9k_resource[] = {
[0] = {
.start = MACH_MINI2440_DM9K_BASE,
.end = MACH_MINI2440_DM9K_BASE + 3,
.flags = IORESOURCE_MEM
},
[1] = {
.start = MACH_MINI2440_DM9K_BASE + 4,
.end = MACH_MINI2440_DM9K_BASE + 7,
.flags = IORESOURCE_MEM
},
[2] = {
.start = IRQ_EINT7,
.end = IRQ_EINT7,
.flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE,
}
};
/*
* * * The DM9000 has no eeprom, and it's MAC address is set by
* * * the bootloader before starting the kernel.
* * */
static struct dm9000_plat_data mini2440_dm9k_pdata = {
.flags = (DM9000_PLATF_16BITONLY | DM9000_PLATF_NO_EEPROM),
};
static struct platform_device mini2440_device_eth = {
.name = "dm9000",
.id = -1,
.num_resources = ARRAY_SIZE(mini2440_dm9k_resource),
.resource = mini2440_dm9k_resource,
.dev = {
.platform_data = &mini2440_dm9k_pdata,
},
};
//同時在mini2440設備集中添加上面做好的網卡平臺設備,如下紅色部分
static struct platform_device *mini2440_devices[] __initdata = {
&s3c_device_usb,
&s3c_device_lcd,
&s3c_device_wdt,
&s3c_device_i2c0,
&s3c_device_iis,
&mini2440_device_eth,
&s3c_device_nand,
};
這樣,DM9000平臺設備的接口就填完了。
1.1.2 調整DM9000所用的位寬寄存器
因爲Linux-2.6.32.2的DM9000網卡驅動並不是專門爲mini2440準備的,所以還要在其源代碼中做一些移植工作,如下步驟。打開linux-2.6.32.2/ drivers/net/dm9000.c,頭文件處添加2410相關的配置定義,如下
#include <asm/delay.h>
#include <asm/irq.h>
#include <asm/io.h>
#if defined(CONFIG_ARCH_S3C2410)
#include <mach/regs-mem.h>
#endif
#include "dm9000.h"
在dm9000設備的初始化函數中添加如下紅色部分,這裏是配置DM9000所用片選總線的時序,因爲mini2440目前只有一個通過總線外擴的設備,在此設備驅動中直接修改相關的寄存器配置會更加容易理解一些,當然這部分也可以放到mach-mini2440.c中(注意將這部分放在mach-mini2440.c裏會有幾個常量需要自己找定義),你可以自行實驗一下,在此不再贅述。
static int __init dm9000_init(void)
{
#if defined(CONFIG_ARCH_S3C2410)
unsigned int oldval_bwscon = *(volatile unsigned int *)S3C2410_BWSCON;
unsigned int oldval_bankcon4 = *(volatile unsigned int *)S3C2410_BANKCON4;
*((volatile unsigned int *)S3C2410_BWSCON) =
(oldval_bwscon & ~(3<<16)) | S3C2410_BWSCON_DW4_16 |
S3C2410_BWSCON_WS4 | S3C2410_BWSCON_ST4;
*((volatile unsigned int *)S3C2410_BANKCON4) = 0x1f7c;
#endif
printk(KERN_INFO "%s Ethernet Driver, V%s\n", CARDNAME, DRV_VERSION);
return platform_driver_register(&dm9000_driver);
}
1.1.3 關於MAC地址
需要注意的是,本開發板所用的DM9000網卡並沒有外接EEPROM用以存儲MAC地址,因此係統中的MAC地址是一個“軟”地址,也就是可以通過軟件進行修改,可以隨意改爲其他值,在static int __devinit dm9000_probe(struct platform_device *pdev)函數中可以看出:
/* try reading the node address from the attached EEPROM */
//嘗試從EEPROM讀取MAC地址
for (i = 0; i < 6; i += 2)
dm9000_read_eeprom(db, i / 2, ndev->dev_addr+i);
if (!is_valid_ether_addr(ndev->dev_addr) && pdata != NULL) {
mac_src = "platform data";
memcpy(ndev->dev_addr, pdata->dev_addr, 6);
}
if (!is_valid_ether_addr(ndev->dev_addr)) {
/* try reading from mac */
mac_src = "chip";
for (i = 0; i < 6; i++)
ndev->dev_addr[i] = ior(db, i+DM9000_PAR);
}
//使用“軟”MAC地址: 08:90:90:90:90:90
memcpy(ndev->dev_addr, "\x08\x90\x90\x90\x90\x90", 6);
if (!is_valid_ether_addr(ndev->dev_addr))
dev_warn(db->dev, "%s: Invalid ethernet MAC address. Please "
"set using ifconfig\n", ndev->name);
實際上到此爲止DM9000就已經移植結束了。
1.1.4 配置內核加入DM9000,並編譯運行測試
此時會帶內核源代碼目錄,執行:
#make menuconfig
開始在內核中配置網卡驅動,依次選擇如下菜單項
Device Drivers --->Network device support ---> Ethernet (10 or 100Mbit) --->
即可找到DM9000的配置項,可以看到DM9000已經被選中,這是因爲Linux-2.6.32.2默認的內核配置已經加入了DM9000的支持。
然後執行:
#make zImage
最後生成 arch/arm/boot/zImage 文件,使用"k"命令把它燒寫到開發板,並使用默認的文件系統啓動,在命令行終端運行 ifconfig 命令可以看到如下所示。
[root@FriendlyARM /]# ifconfig
eth0 Link encap:Ethernet HWaddr 08:90:90:90:90:90
inet addr:192.168.1.230 Bcast:192.168.1.255 Mask:255.255.255.0
UP BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
Interrupt:51 Base address:0x300
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
測試網絡:ping 127.0.0.1,等號後面有數的話,就是網卡正常ping 網關地址,等號後面有數的話,就是和網關連接正常ping 別的主機的IP,等號後面有數的話,就是和別的主機連接正常.