(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加入到要初始化的設備鏈表里去,內核啟動(dòng)時(shí)將會(huì )檢測設
備并加載驅動(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文件中添加的內容:
4.1 為dm9000添加硬件復位,在dm9000_reset函數開(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)有這一步,但板子硬件復位后會(huì )出現系統找不到網(wǎng)卡設備,并出現以下錯誤信息:
dm9000 Ethernet Driver
dm9000: read wrong id 0x00000000
dm9000: read wrong id 0x00000000
dm9000: wrong id: 0x00000000
dm9000: not found (0).
........
4.2 MAC 地址設置:
在dm9000_probe函數中添加兩處語(yǔ)句:
(1)在函數體的開(kāi)頭兒添加:
static char net_mac_addr[]={0x00,0xe0,0x3d,0xf4,0xdd,0xf7}; // 自己設的MAC地址,隨意設,盡量不要
全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 **************/
注意:至此編譯內核下載系統就能加載dm9000網(wǎng)卡設備了,啟動(dòng)信息中會(huì )出現:
dm9000 Ethernet Driver
eth0: dm9000 at c485e300,c4860304 IRQ 16 MAC: 00:e0:3d:f4:dd:f7
4.3 設置外部中斷:
(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步添加代碼處添加一句中斷設置語(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要根據自己開(kāi)發(fā)板而定,與步驟1中對應.
/******************end **************/
注意:代碼修改完成,配合第5步,第6步,編譯下載可以ping通其他機器了.
5,配置內核:
Device Drivers --->
Network device support --->
Ethernet (10 or 100Mbit) --->
<*> DM9000 support //選上該項
6,網(wǎng)絡(luò )設置:
下載內核,啟動(dòng)后執行以下命令(否則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
出現如下信息:
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通其它機器了,如果ping不通,可以試著(zhù)把ip設成與你要ping的機器在同一網(wǎng)段,網(wǎng)關(guān)也設成一樣.
/ $ 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移植完成,如果內核配置了nfs,這時(shí)就可以直接使用了.
本文在參考了網(wǎng)上一些文章的基礎上針對自己遇到的問(wèn)題做了一些修改和補充,主要是指出了針對不同開(kāi)發(fā)板需要修改的地方,并將外部中斷的設置方式改為函數設置,從而將原來(lái)的十句代碼化簡(jiǎn)到一句,執行效率上也許比不上直接代碼設置,但是對于新手來(lái)說(shuō)這樣更簡(jiǎn)潔明了,節省時(shí)間。
參考文章:http://blog.ednchina.com/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
聯(lián)系客服