本文選自:http://blog.csdn.net/baozhongchao/article/details/4538182
- 特別說(shuō)明:本人是按第二種方法移植的,因?yàn)槲沂芩螌毴A老師的影響很深。他說(shuō)過(guò),移植的時(shí)候,跟CPU無(wú)關(guān)的驅(qū)動(dòng) ,即跟平臺(tái)有關(guān)的驅(qū)動(dòng),應(yīng)該只在板文件中修改。這里,我們只需要修改DM9000平臺(tái)對(duì)應(yīng)設(shè)備的寄存器和數(shù)據(jù)址進(jìn)行賦值,并指定正確的IRQ資源即可。
a) #make menuconfig
進(jìn)入配置菜單選中
driver——
net——
10/100M net——
DM9000 support
b)
在arch/arm/plat-s3c24xx/devs.c(也可做在arch/arm/mach-s3c2440/mach-smdk2440.c中的)
中加入DM9000A的端口及設(shè)備說(shuō)明,仿照前面的設(shè)備添加就是了,結(jié)構(gòu)都一樣就是值不同。
static struct resource s3c_dm9k_resource[] = {
[0] = {
.start = 0x18000000,
//dm9000a的片選我的板子接的是nGCS3,這里沒(méi)有加300的基址
.end = 0x18000003,
//這里搞不懂為什么是加3[可能因?yàn)槭菈K設(shè)備吧]
.flags = IORESOURCE_MEM,
},
[1] = {
.start = 0x18000004,
//因?yàn)?/SPAN>CMD接的是A2,其為1時(shí)就是數(shù)據(jù)端口
.end = 0x18000007,
//0X3F,0X7F,為什么是這個(gè)地址
.flags = IORESOURCE_MEM,
},
[2] = {
.start = IRQ_EINT9, //根據(jù)電路圖接的是EINT9管腳
.end = IRQ_EINT9,
.flags = IORESOURCE_IRQ,
// .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE, //at2440evb中的設(shè)置
}
};
static struct dm9000_plat_data s3c_device_dm9k_pdata = {
// .flags = (DM9000_PLATF_16BITONLY|DM9000_PLATF_NO_EEPROM), //at2440evb中的設(shè)置
.flags = DM9000_PLATF_16BITONLY
};
static struct platform_device s3c_device_dm9k = {
.name = "dm9000",
.id = -1,
.num_resources = ARRAY_SIZE(s3c_dm9k_resource),
.resource = s3c_dm9k_resource,
.dev = {
.platform_data = &s3c_device_dm9k_pdata,
},
};
EXPORT_SYMBOL(s3c_device_dm9k);
c) arch/arm/plat-s3c24xx/include/plat/devs.h中添加網(wǎng)卡聲明
extern struct platform_device s3c_device_dm9k;
d) arch/arm/mach-s3c2440/ mach-s3c2440.c中將dm9000a加到平臺(tái)設(shè)備初始化列表中
static struct platform_device *smdk2440_devices[] __initdata = {
&s3c_device_usb,
&s3c_device_lcd,
&s3c_device_wdt,
&s3c_device_i2c,
&s3c_device_iis,
&s3c_device_dm9k,
};至此,向內(nèi)核注冊(cè)DM9000A已經(jīng)完成。
e) 在drivers/net/dm9000.c開(kāi)頭中添加
#include <mach/regs-gpio.h>
#define EINTMASK (0x560000a4) //外部中斷屏蔽
#define EXTINT1 (0x5600008c) //外部中斷方式
#define INTMSK (0x4a000008) //中斷屏蔽
在dm9000_probe()中ret = register_netdev(ndev); 1392行,之前添加
memcpy(ndev->dev_addr,"/oandy1",6);
extint1 =ioremap_nocache(EXTINT1,0x00000004);
intmsk =ioremp_nocache(INTMSK,4);
s3c2410_gpio_cfgpin(s3c2410_GPG1,s3c2410_GPG1_EINT9); //設(shè)置GPG1為中斷功能
writel(readl(extint1)|0x40,extint1); //中斷為上升沿
writel(readl(intmsk)&0xfff1,intmsk);
iounmap(intmsk);
iounmap(extint1);
f) 第二種方案是直接參考/arch/arm/mach-s3c2440/mach-at2440evb.c進(jìn)行修改,我按照此方案更改完全有效。
i. 修改/arch/arm/mach-s3c2440/mach-smdk2440.c拷貝/arch/arm/mach-s3c2440/mach-at2440evb.c中關(guān)于DM9000AEP的代碼進(jìn)行修改:
#include <linux/dm9000.h>
static struct resource s3c_dm9k_resource[] = {
[0] = {
.start = S3C2410_CS3,
.end = S3C2410_CS3 + 3,
.flags = IORESOURCE_MEM
},
[1] = {
.start = S3C2410_CS3 + 4,
.end = S3C2410_CS3 + 7,
.flags = IORESOURCE_MEM
},
[2] = {
.start = IRQ_EINT9,
.end = IRQ_EINT9,
.flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE,
}
};
static struct dm9000_plat_data s3c_dm9k_pdata = {
.flags = (DM9000_PLATF_16BITONLY | DM9000_PLATF_NO_EEPROM),
};
static struct platform_device s3c_device_dm9k = {
.name = "dm9000",
.id = -1,
.num_resources = ARRAY_SIZE(s3c_dm9k_resource),
.resource = s3c_dm9k_resource,
.dev = {
.platform_data = & s3c_dm9k_pdata,
},
};
這段代碼加在static struct platform_device *smdk2440_devices[] __initdata之前,修改設(shè)備初始化
static struct platform_device *smdk2440_devices[] __initdata = {
&s3c_device_usb,
&s3c_device_lcd,
&s3c_device_wdt,
&s3c_device_i2c,
&s3c_device_iis,
&s3c_device_dm9k,
};
g) 修改根文件系統(tǒng)/etc/init.d/rcS配置網(wǎng)卡,增加下面的代碼
ifconfig lo 127.0.0.1
ifconfig eth0 hw ether 08:00:3e:26:0a:5b
ifconfig eth0 192.168.1.70
route add default gw 192.168.1.1
h) 配置內(nèi)核:
#make menuconfig
Device Drivers—
Network device support—
Ethernet(10 or 10Mbit)—
DM9000 support
有圖有真相,下面上圖:
