From:http://hi.baidu.com/soft_hard/blog/item/c54f8d23cf977dad4723e826.html
linux-2.6.22內(nèi)核下dm9000網(wǎng)卡移植具體步驟如下: 平臺(tái)信息: 開(kāi)發(fā)板: 芯片 s3c2410 系統(tǒng)內(nèi)核 linux-2.6.22.19 主機(jī): 操作系統(tǒng):redhat9.0 交叉編譯器:arm-linux-gcc3.4.1 1. 修改arch/arm/plat-s3c24xx/devs.c,加入dm9000的信息,,并使用EXPORT_SYMBOL 宏將platform_device s3c_device_dm9000導(dǎo)出,,在smdk2410.c中會(huì)用到先添加頭文件: #include <linux/dm9000.h> // 再添加以下代碼: //=========================================================================== /*注意:以下有兩個(gè)地方需要根據(jù)自己的開(kāi)發(fā)板上的dm9000與s3c2410硬件電路連接情況而定(一般在開(kāi)發(fā)板的手冊(cè)上有說(shuō)明): (1)dm9000的基地址 DM9000_BASE,
(2)所采用的是哪個(gè)外部中斷*/
#define DM9000_BASE 0x18000300 //依個(gè)人情況而定 static struct resource s3c_dm9000_resource[] = { [0] = { .start = DM9000_BASE, .end = DM9000_BASE+ 0x3, .flags = IORESOURCE_MEM }, [1]={ .start = DM9000_BASE + 0x4, .end = DM9000_BASE + 0x4 + 0x7c, .flags = IORESOURCE_MEM }, [2] = { .start = IRQ_EINT0, //依個(gè)人情況而定 .end = IRQ_EINT0, //依個(gè)人情況而定
.flags = IORESOURCE_IRQ } };
static struct dm9000_plat_data s3c_device_dm9000_platdata = { .flags= DM9000_PLATF_16BITONLY, };
struct platform_device s3c_device_dm9000 = { .name= "dm9000", .id= -1, .num_resources= ARRAY_SIZE(s3c_dm9000_resource), .resource= s3c_dm9000_resource, .dev= { .platform_data = &s3c_device_dm9000_platdata, } };
EXPORT_SYMBOL(s3c_device_dm9000); //end of DM9000 //===========================================================================
2.在include/asm-arm/plat-s3c24xx/devs.h 文件中 添加一行 extern struct platform_device s3c_device_dm9000;
3.在arch/arm/mach-s3c2410/mach-smdk2410.c中將dm9000加入到要初始化的設(shè)備鏈表里去,,內(nèi)核啟動(dòng)時(shí)將會(huì)檢測(cè)設(shè)
備并加載驅(qū)動(dòng)
static struct platform_device *smdk2410_devices[] __initdata = { &s3c_device_usb, &s3c_device_lcd, &s3c_device_wdt, &s3c_device_i2c,
&s3c_device_iis, &s3c_device_dm9000,//add for dm9000
};
4, 以下是要在linux-2.6.24/drivers/net/dm9000.c文件中添加的內(nèi)容:
4.1 為dm9000添加硬件復(fù)位,在dm9000_reset函數(shù)開(kāi)頭添加以下代碼: /*reset hardware --add by Eric Fu */ s3c2410_gpio_cfgpin(S3C2410_GPG2,S3C2410_GPG2_OUTP);
s3c2410_gpio_setpin(S3C2410_GPG2,0); udelay(500); s3c2410_gpio_setpin(S3C2410_GPG2,1);
udelay(500); s3c2410_gpio_setpin(S3C2410_GPG2,0); udelay(500); /*end of add*/
注意:網(wǎng)上很多移植都沒(méi)有這一步,但在我的板子上如果沒(méi)有這一步,但板子硬件復(fù)位后會(huì)出現(xiàn)系統(tǒng)找不到網(wǎng)卡設(shè)備,并出現(xiàn)以下錯(cuò)誤信息: dm9000 Ethernet Driver dm9000: read wrong id 0x00000000 dm9000: read wrong id 0x00000000 dm9000: wrong id: 0x00000000
dm9000: not found (0). ........
4.2 MAC 地址設(shè)置: 在dm9000_probe函數(shù)中添加兩處語(yǔ)句: (1)在函數(shù)體的開(kāi)頭兒添加: static char net_mac_addr[]={0x00,0xe0,0x3d,0xf4,0xdd,0xf7}; // 自己設(shè)的MAC地址,隨意設(shè),盡量不要
全0或全1 (2) 在/* Set Node Address */ for (i = 0; i < 6; i++) ndev->dev_addr[i] = db->srom[i]; 的后面 if (!is_valid_ether_addr(ndev->dev_addr)) { /* try reading from mac */ for (i = 0; i < 6; i++) ndev->dev_addr[i] = ior(db, i+DM9000_PAR); } 的前面,添加: /*********** add by Eric Fu ************/ for(i=0;i<6;i++){ ndev->dev_addr[i]=net_mac_addr[i]; }
/******************end **************/
注意:至此編譯內(nèi)核下載系統(tǒng)就能加載dm9000網(wǎng)卡設(shè)備了,啟動(dòng)信息中會(huì)出現(xiàn): dm9000 Ethernet Driver eth0: dm9000 at c485e300,c4860304 IRQ 16 MAC: 00:e0:3d:f4:dd:f7
4.3 設(shè)置外部中斷: (1)在dm9000.c頂部添加以下頭文件: #include <asm-arm/arch/irqs.h> #include <asm-arm/arch/hardware.h> #include <asm-arm/arch/regs-gpio.h> #include <linux/irq.h>
(2)在4.2步添加代碼處添加一句中斷設(shè)置語(yǔ)句,連同4.2步整體效果如下: /*********** add by Eric Fu ************/ for(i=0;i<6;i++){ ndev->dev_addr[i]=net_mac_addr[i]; }
/*Set external intruppt*/ set_irq_type(IRQ_EINT0,IRQT_HIGH);//IRQ_EINT0要根據(jù)自己開(kāi)發(fā)板而定,與步驟1中對(duì)應(yīng).
/******************end **************/ 注意:代碼修改完成,配合第5步,第6步,編譯下載可以ping通其他機(jī)器了.
5,配置內(nèi)核: Device Drivers ---> Network device support ---> Ethernet (10 or 100Mbit) ---> <*> DM9000 support //選上該項(xiàng)
6,網(wǎng)絡(luò)設(shè)置: 下載內(nèi)核,啟動(dòng)后執(zhí)行以下命令(否則ifconfig命令無(wú)效): / $ cd sbin /sbin $ ifconfig lo up /sbin $ ifconfig eth0 192.168.0.106 netmask 255.0.0.0 up eth0: link up, 100Mbps, full-duplex, lpa 0x45E1 /sbin $ inetd /sbin $ mount -t proc proc /proc /sbin $ ifconfig 出現(xiàn)如下信息: eth0 Link encap:Ethernet HWaddr 00:E0:3D:F4:DD:F7 inet addr:192.168.0.106 Bcast:192.255.255.255 Mask:255.0.0.0 UP BROADCAST RUNNING 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:19 Base address:0xe300 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)
這時(shí)可以ping通其它機(jī)器了,如果ping不通,可以試著把ip設(shè)成與你要ping的機(jī)器在同一網(wǎng)段,網(wǎng)關(guān)也設(shè)成一樣.
/ $ ping 192.168.0.105 PING 192.168.0.105 (192.168.0.105): 56 data bytes 84 bytes from 192.168.0.105: icmp_seq=0 ttl=64 time=2.0 ms 84 bytes from
192.168.0.105: icmp_seq=1 ttl=64 time=0.5 ms 84 bytes from 192.168.0.105: icmp_seq=2 ttl=64 time=0.5 ms 84 bytes from 192.168.0.105: icmp_seq=3 ttl=64 time=0.5 ms 84 bytes from 192.168.0.105: icmp_seq=4 ttl=64 time=0.5 ms 至此dm9000移植完成,如果內(nèi)核配置了nfs,這時(shí)就可以直接使用了.
本文在參考了網(wǎng)上一些文章的基礎(chǔ)上針對(duì)自己遇到的問(wèn)題做了一些修改和補(bǔ)充,主要是指出了針對(duì)不同開(kāi)發(fā)板需要修改的地方,,并將外部中斷的設(shè)置方式改為函數(shù)設(shè)置,,從而將原來(lái)的十句代碼化簡(jiǎn)到一句,執(zhí)行效率上也許比不上直接代碼設(shè)置,,但是對(duì)于新手來(lái)說(shuō)這樣更簡(jiǎn)潔明了,,節(jié)省時(shí)間。
參考文章:http://blog./brucedeng/76545/message.aspx
http://blog.21ic.com/user1/3074/archives/2009/57085.html
http://blog.csdn.net/yang_dk/archive/2008/05/01/2357664.aspx
|