全部博文(59)
分类: LINUX
2011-03-29 20:35:31
DM9000网卡驱动移植
内核版本2.6.29.6
宿主机:
fedora 11
目标机:
utu s3c2440
1.编译内核的时候,在 menuconfig 的配置选项,选中driver-->net-->10/100M net-->DM9000 support
2.在arch/arm/plat-s3c24xx中的devs.c中添加
/**********whs add 2009-3-28 12:06***************************/
static struct resource s3c_dm9000_resource[] = {
[0] = {
.start = 0x18000000, //对应电路图nGCS3
.end = 0x18000003,
.flags = IORESOURCE_MEM,
},
[1] = {
.start = 0x18000004,
.end = 0x18000007, // 0x3f
.flags = IORESOURCE_MEM,
},
[2] = {
.start = IRQ_EINT9,
.end = IRQ_EINT9,
.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);
/**********whs add 2009-3-28 12:06------end ****************/
3.在arch/arm/plat-s3c24xx/include/plat/devs.h添加声明
/**********whs add 2009-3-28 12:06***************************/
extern struct platform_device s3c_device_dm9000;
/**********whs add 2009-3-28 12:06----end***************/
4.在arch/arm/mach-s3c2440/mach-smdk2440.c中将andy_dm9000_device添加到平台设备列表中
static struct platform_device *smdk2440_devices[] __initdata = {
&s3c_device_usb,
&s3c_device_lcd,
&s3c_device_wdt,
&s3c_device_i2c,
&s3c_device_iis,
&s3c_device_dm9000,/***whs add 2009-3-28 12:06****/
};
5.OK,经过上述努力,Dm9000设备已经成功注册进入驱动核心。下面进入drivers/net/dm9000.C中,
还需要做两方面的工作:设置芯片MAC地址,使能DM9000的中断。
根据2440资料。有几个地方需要设置:
1)设置GPGCON 使GPG1功能设置为EINT9 。
这可以用函数实现:s3c2410_gpio_cfgpin(S3C2410_GPG1, S3C2410_GPF3_EINT9);
2)外部中断EXTINT1 的[6:4]位 置100 上升沿触发中断
代码修改:
在dm9000.C的开始添加如下定义:
/**********whs add 2009-3-28 12:06***************************/
#i nclude
static void *extint1,*intmsk;
#define EINTMASK (0x560000a4) //外部中断屏蔽
#define EXTINT1 (0x5600008c) //外部中断方式
#define INTMSK (0x4A000008) //中断屏蔽
/**********whs add 2009-3-28 12:06----end***************/
在DM9000_probe函数中,register_netdev之前(1400行左右)添加如下
/**********whs add 2009-3-28 12:06***************************/
memcpy(ndev->dev_addr,"\0andy1",6); //mac地址设置
extint1=ioremap_nocache(EXTINT1,0x0000004); //I/O内存映射
intmsk=ioremap_nocache(INTMSK,4);
s3c2410_gpio_cfgpin(S3C2410_GPG1, S3C2410_GPG1_EINT9); //设置中断
writel(readl(extint1)|0x40,extint1); //rising edge
writel(readl(intmsk)&0xfff1,intmsk);
iounmap(intmsk);
iounmap(extint1);
/**********whs add 2009-3-28 12:06------end ****************/
这样就大功告成了啊。
http://blog.csdn.net/baozhongchao/archive/2009/09/10/4538182.aspx
主要参照了http://blog.chinaunix.net/u3/91018/showart_1835810.html,感谢andykuo分享。
http://blog.chinaunix.net/u3/91018/showart_1835810.html
http://blog.mcuol.com/User/lvembededsys/Article/6856_1.htm
http://blog.chinaunix.net/u1/34474/showart_400516.html
确实是成功了,我试了
还有别的版本,但是好像不能成功,也给个网址吧,可以作为参考
http://liuyinqiang5188.blog.163.com/blog/static/47065926200961943033922/