前些天完成了DM9000在MINI2440平台上的驱动移植。完成之后对源码进行了进一步的分析和整理。
1. 移植DM9000网卡驱动
Linux-2..6.32.2已经自带了完善的DM9000 网卡驱动驱动(源代码位置:linux-2.6.32.2/drivers/net/dm9000.c),它也是一个平台设备,因此在目标平台初始化代码中,只要填写好相
应的结构表即可,具体步骤如下:
1.1 首先添加驱动所需的头文件 dm9000.h:
1.2 再定义DM9000 网卡设备的物理基地址,以便后面用到:
/* DM9000AEP 10/100 ethernet controller */
#define MACH_MINI2440_DM9K_BASE (S3C2410_CS4 + 0x300)
1.3 再填充该平台设备的资源设置接口,以便和 DM9000 网卡驱动接口配合起来,如下
网卡映射的片选地址设定为CS4
static struct resource mini2440_dm9k_resource[] = {
[0] = {
.start = MACH_MINI2440_DM9K_BASE,
.end = MACH_MINI2440_DM9K_BASE + 3,
.flags = IORESOURCE_MEM //IO内存地址地址IO地址
},
[1] = {
.start = MACH_MINI2440_DM9K_BASE + 4,
.end = MACH_MINI2440_DM9K_BASE + 7,
.flags = IORESOURCE_MEM//数据IO地址
},
[2] = {
.start = IRQ_EINT7, //设置网卡设备的中断号
.end = IRQ_EINT7,
.flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE,
}
};
1.4 然后再将该平台设备添加到统一的平台设备,进行注册。
1.5 调整DM9000 所用的位宽寄存器
因为 Linux-2.6.32.2 的DM9000 网卡驱动并不是专门为mini2440 准备的,所以还要在
其源代码中做一些移植工作
static int __init
dm9000_init(void)
{
#if defined(CONFIG_ARCH_S3C2410)
unsigned int oldval_bwscon = *(volatile unsigned int *)S3C2410_BWSCON;
unsigned int oldval_bankcon4 = *(volatile unsigned int *)S3C2410_BANKCON4;
//设置带宽为16位,启用BANK4的WAIT状态,启用BANK4 的SRAM的写搞的字节使能
*((volatile unsigned int *)S3C2410_BWSCON) =
(oldval_bwscon & ~(3<<16)) | S3C2410_BWSCON_DW4_16 | S3C2410_BWSCON_WS4 | S3C2410_BWSCON_ST4;
//设定读写时序
*((volatile unsigned int *)S3C2410_BANKCON4) = 0x1f7c;
#endif
printk(KERN_INFO "%s Ethernet Driver, V%s\n", CARDNAME, DRV_VERSION);
return platform_driver_register(&dm9000_driver);
}
MAC地址的修改,因为没有介入EEPROM,所以直接可以在软件中修改。
时序图中的时间参数设定
1.时间参数为多少纳秒
2.时间参数为多少个时钟周期。比如400MHZ 一个时钟周期就是5ns
3.对应的时间参数bit位的设定。
4.写信号的流程:片选使能(TCOS) + 写命令使能(TACC)+ 写命令使能结束
S3C2410_BWSCON_WS4
有参考:
http://www.doc88.com/p-949836023276.html