您的位置:首页 > 理论基础 > 计算机网络

网卡移植

2016-01-08 23:12 495 查看
Linux系统中具有相当完善的各类驱动代码,很大时候都不需要我们从头到尾去写一个驱动程序,对于一些相对复杂的驱动程序,从头到尾写也没这个必要,最好的方法就是移植:将厂家提供的驱动模板或Linux中相似相近的驱动程序通过修改,让程序能支持自己的设备使用。

移植驱动程序,首先要做的就是将模板程序找出不符合自己设备的地方进行修改,比如中断、寄存器地址等等。一般来说,不需要改变模板驱动程序的框架,只需要根据需求删除或添砖加瓦即可。我觉得这就叫做“站在巨人的肩膀上”,进行开发。下面将网卡DM9000C移植到jz2440为例子。
移植的程序模板是jz2440厂家提供的驱动程序,首先就是找差异的地方:

网卡的基地址,DM9000A网卡的硬件原理图以及jz2440数据手册中memory control一章中可以知道网卡在jz2440中基地址应该为0x20000000

中断号,DM9000A网卡中断号为EINT7。

网卡的硬件相关设置:芯片位宽、设置内存控制器中的片选、时序等等。

还有就是模板程序中的细节修改:比如模板程序中有要监测网卡版本号的,不满足就直接退出了,事实上DM9000不符合那个版本号,但还是可以支持的,所以需要修改。

本次移植的重点和难点都在设置jz2440的内存控制器的时序要求。
修改的目的是为了让jz2440的内存控制器片选为网卡,时序和网卡的时序要求一致,查看对比jz2440内存控制器和DM9000手册即可获得相关的设置信息。
jz2440相关:








DM9000相关:












通过对照着几副时序图,可以得出这样的结果:
Tacs[14:13]: 发出片选信号之前,多长时间内要先发出地址信号。DM9000C的片选信号和CMD信号可以同时发出,所以它设为0
Tcos[12:11]: 发出片选信号之后,多长时间才能发出读信号nOE DM9000C的T1>=0ns, 所以它设为0
Tacc[10:8] : 读写信号的脉冲长度,DM9000C的T2>=10ns, 所以它设为1,
Tcoh[7:6] : 当读信号nOE变为高电平后,片选信号还要维持多长时间,DM9000C进行写操作时, nWE变为高电平之后, 数据线上的数据还要维持最少3ns,设为01。
Tcah[5:4] : 当片选信号变为高电平后, 地址信号还要维持多长时间。DM9000C的片选信号和CMD信号可以同时出现,同时消失,所以设为0
PMC[1:0] : 00-正常模式
所以,做如下修改:

volatile unsigned long* bwscon;//0x48000000
volatile unsigned long* bankcon4;//0x48000014
iobase=ioremap(0x20000000,4096);
bwscon=ioremap(0x48000000,4);
bankcon4=ioremap(0x48000014,4);
//片选
*bwscon &= ~(0xf<<16);
*bwscon |= (0x1<<16);
//时序
*bankcon4=0x160;

关于测试:
首先保证驱动程序没有语法错误,然后将驱动程序dm9dev9000c.c拷贝到要编译的内核下的drivers/net目录下,然后使用打开该目录下的Makefile,将系统的网卡驱动修改成自己的驱动。如图:



然后回到内核目录,make uImage编译内核,编译成功后,复制arch/arm/boot下的uImage,重新烧写内核。以网络文件系统驱动,能启动,说明驱动程序移植成功。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息