mini2440移植网卡驱动

内核编译和嵌入式产品的设计与开发
回复
头像
田春龙
帖子: 46
注册时间: 2009-08-12 0:39

mini2440移植网卡驱动

#1

帖子 田春龙 » 2010-04-06 13:06

转载自:http://www.cnblogs.com/gumptious/archiv ... 69706.html

一,开发环境:
主机:ubuntu9.10
内核:linux2.6.30.10
交叉编译器:arm-linux-gcc3.4.1
平台:mini2440,64M nandflash
网卡:DM9000


二,DM9000移植的好文章:

1.http://blog.chinaunix.net/u1/57901/showart_2023852.html

2.http://blog.csdn.net/baozhongchao/archi ... 38182.aspx

三,步骤

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
4,编译即可。
头像
wangdu2002
帖子: 13284
注册时间: 2008-12-13 19:39
来自: 物华天宝人杰地灵

Re: mini2440移植网卡驱动

#2

帖子 wangdu2002 » 2010-04-06 13:08

菜鸟路过支持楼主分享经验。 :em11
行到水穷处,坐看云起时。
海内生明月,天涯共此夕。
--------------------吾本独!
头像
田春龙
帖子: 46
注册时间: 2009-08-12 0:39

Re: mini2440移植网卡驱动

#3

帖子 田春龙 » 2010-04-06 23:34

wangdu2002 写了:菜鸟路过支持楼主分享经验。 :em11
呵呵,我也是个菜鸟。都是网友的经验,linux自己学效率比较低,得多交流!
回复