1.修改arch/arm/plat-s3c24xx/common-smdk.c文件
在包含头文件的区域增加以下代码:
#if defined(CONFIG_DM9000) || defined(CONFIG_DM9000_MODULE)
#include <linux/dm9000.h>
#endif
在smdk_devs结构体之前添加以下代码:
#if defined(CONFIG_DM9000) || defined(CONFIG_DM9000_MODULE)
//DM9000网卡使用的资源列表。使用0x20000000、0x20000004这两个地址就可以操作DM9000网卡。
static struct resource s3c_dm9k_resource[] = {
[0] = {
.start = S3C2410_CS4, //S3C2410_CS4被定义为0x20000000(BANK4基地址)
.end = S3C2410_CS4+3,
.flags = IORESOURCE_MEM,
},
[1] = {
.start = S3C2410_CS4 + 4, //0x20000004
.end = S3C2410_CS4 + 4 + 3,
.flags = IORESOURCE_MEM,
},
[2] = {
.start = IRQ_EINT7, //连接S3C2440的EINT7引脚
.end = IRQ_EINT7,
.flags = IORESOURCE_IRQ | IRQF_TRIGGER_RISING, //上升沿触发
}
};
//DM9000与开发板相关的数据,指定访问DM9000时,数据位宽为16
static struct dm9000_plat_data s3c_dm9k_platdata = {
.flags = DM9000_PLATF_16BITONLY,
};
static struct platform_device s3c_device_dm9k = {
.name = "dm9000",
.id = 0,
.num_resources = ARRAY_SIZE(s3c_dm9k_resource),
.resource = s3c_dm9k_resource,
.dev = {
.platform_data = &s3c_dm9k_platdata,
}
};
#endif
在smdk_devs结构体中添加以下代码:
#if defined(CONFIG_DM9000) || defined(CONFIG_DM9000_MODULE)
&s3c_device_dm9k,
#endif
2.修改drivers/net/dm9000.c文件
在包含头文件区域添加以下代码
#if defined(CONFIG_ARCH_S3C2410)
#include <mach/regs-mem.h>
#endif
在dm9000_probe函数中的变量声明之后添加以下代码:
#if defined(CONFIG_ARCH_S3C2410)
unsigned int oldval_bwscon;
unsigned int oldval_bankcon4;
#endif
在dev_dbg(&pdev->dev, "dm9000_probe()\n");语句之后添加以下代码:
#if defined(CONFIG_ARCH_S3C2410)
oldval_bwscon=*((volatile unsigned int *)S3C2410_BWSCON);
*((volatile unsigned int *)S3C2410_BWSCON)=(oldval_bwscon & ~(3<<16))| S3C2410_BWSCON_DW4_16 | S3C2410_BWSCON_WS4 | S3C2410_BWSCON_ST4;
oldval_bankcon4=*((volatile unsigned int *)S3C2410_BANKCON4);
*((volatile unsigned int *)S3C2410_BANKCON4)=0x1f7c;
#endif
将platform_set_drvdata(pdev, ndev);之前的if判断语句改为:
if (!is_valid_ether_addr(ndev->dev_addr))
{
dev_warn(db->dev, "%s: Invalid ethernet MAC address. Please "
"set using ifconfig\n", ndev->name);
#if defined(CONFIG_ARCH_S3C2410)
printk("Now use the default MAC address: 08:90:90:90:90:90\n");
ndev->dev_addr[0]=0x08;
ndev->dev_addr[1]=0x90;
ndev->dev_addr[2]=0x90;
ndev->dev_addr[3]=0x90;
ndev->dev_addr[4]=0x90;
ndev->dev_addr[5]=0x90;
#endif
}
在dev_err(db->dev, "not found (%d).\n", ret);之后添加以下代码:
#if defined(CONFIG_ARCH_S3C2410)
*((volatile unsigned int *)S3C2410_BWSCON)=oldval_bwscon;
*((volatile unsigned int *)S3C2410_BWSCON)=oldval_bankcon4;
#endif
3.配置内核
Device Drivers --->
Network device support --->
[*] Network device support --->
Ethernet (10 or 100Mbit) --->
<*> DM9000 support
到这里,网卡的内核驱动移植算是完成了,
但是工作还是没有做完。你必须在根文件系统中添加相应的初始化语句,才算完成了整个网卡的移植
在根文件系统的 /etc/init.d/rcS中添加如下语句
echo "network interface"
/sbin/ifconfig lo 127.0.0.1
/sbin/ifconfig eth0 210.46.98.112 up
route add default gw 210.46.98.112
ifconfig eth0 down
ifconfig eth0 hw ether XX:XX:XX:XX:XX:XX ÅMAC 地址,随便设
ifconfig eth0 up
这样网卡就算是全部移植完成了