DM9000C的驱动移植

mini2440使用的网卡是DM9000,因此这个实验无法用mini2440来实现。所以这一节没有把改好的驱动程序编入内核,只是说明理论部分。

首先思考一下,两个不同设备上如果用同一种网卡,用法如何不同呢?简单的来说有三点:基地址、位宽和中断引脚。因此,想要移植一个网卡驱动,一般来说,我们只需要在厂家提供的驱动里修改这三个参数就行。

在入口函数里加上:iobase =(int)ioremap(0x20000000,1024);还要在出口函数iounmap。

然后在dmfe_probe1中去掉:if((db->chip_revision!=0x1A) || ((chip_info&(1<<5))!=0) || ((chip_info&(1<<2))!=1)) return -ENODEV;

还要在入口函数中加入:irq=IRQ_ EINT7为什么是EINT7呢,是从原理图中看出来的。

再在dmfe_open中,把request_irq里的flag改为IRQT_RISING。
这样,一个简单的网卡驱动程序就修改好了。记得要在drivers/net/Makefile中把这个原来的网卡文件注释掉,把这个文件加上去。

但是实际上,我们并没有设置一些时序参数,但为什么我们上面的驱动可以用呢,那是因为在uboot里已经做了设置。倘若想要写出一个不依赖于uboot的完整的驱动程序,我们需要手动通过设置内存控制器来设置一些时序参数。
我们需要查看2440芯片手册和dm9000c芯片手册。

首先要设置S3C2440的memory controller的
bwscon = ioremap(0x48000000, 4);
bankcon4 = ioremap(0x48000014, 4);
然后
/* DW4[17:16]: 01-16bit
* WS4[18] : 0-WAIT disable
* ST4[19] : 0 = Not using UB/LB (The pins are dedicated nWBE[3:0])
*/
val = *bwscon;
val &= ~(0xf<<16);
val |= (1<<16);
*bwscon = val;

这都比较好理解,关键是对bankcon4的操作。先贴出几个图:
读时序

写时序

寄存器描述

Tacs[14:13]: 发出片选信号之前,多长时间内要先发出地址信号,DM9000C的片选信号和CMD信号可以同时发出,所以它设为0。如何看出呢?因为根据原理图,dm9000c的地址和命令共用一个引脚。

Tcos[12:11]: 发出片选信号之后,多长时间才能发出读信号nOE,即T1,DM9000C的T1>=0ns,,所以它设为0。

Tacc[10:8] : 读写信号的脉冲长度, 即T2,DM9000C的T2>=10ns,所以可以设为1, 表示2个hclk周期,hclk=100MHz,就是20ns。

Tcoh[7:6] : 当读信号nOE变为高电平后,片选信号还要维持多长时间,即T5,在读和写的时序里可以看到T5的最小值是0,但要考虑到T4,即DM9000C进行写操作时, nWE变为高电平之后, 数据线上的数据还要维持最少3ns,以及DM9000C进行读操作时, nOE变为高电平之后, 数据线上的数据在6ns之内会消失,所以我们取一个宽松值: 让片选信号在nOE放为高电平后,再维持10ns, 设为01。

Tcah[5:4] : 当片选信号变为高电平后, 地址信号还要维持多长时间,DM9000C的片选信号和CMD信号可以同时出现,同时消失,所以设为0

PMC[1:0] : 00-正常模式。
所以综合下来,就是:
*bankcon4 = (1<<8)|(1<<6);

这样,一个不依赖于uboot的完整dm9000c驱动程序就完成了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值