网卡移植
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,重新烧写内核。以网络文件系统驱动,能启动,说明驱动程序移植成功。
移植驱动程序,首先要做的就是将模板程序找出不符合自己设备的地方进行修改,比如中断、寄存器地址等等。一般来说,不需要改变模板驱动程序的框架,只需要根据需求删除或添砖加瓦即可。我觉得这就叫做“站在巨人的肩膀上”,进行开发。下面将网卡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,重新烧写内核。以网络文件系统驱动,能启动,说明驱动程序移植成功。
相关文章推荐
- 一步步写网卡驱动(-)
- 一步步写网卡驱动(二)
- 一步步写网卡驱动(三)
- STM32F207,LWIP,DM9000,netif_set_up()与ping
- STM32F207,LWIP,DM9000,网口驱动,ping不通
- Linux下MTK 3G网卡驱动移植
- DM9000驱动详细分析(二)
- DM9000驱动详细分析(一)
- OK6410 uboot2013.04-rc1 DM9000移植及tftp配置使用
- Linux 下蓝牙驱动移植
- 在mini210 上面实现rt3070ap功能的移植内核版本 是linux3.0.8
- 在移植rt3070驱动的时候编译遇到的问题
- zedboard--ubuntu12.04(基于pc机)编译globalmem驱动
- tiny6410(mini6410)移植RT5370方案USBWIFI网卡
- S5PC100芯片的linux-lcd驱动移植(基于2.6.35.13内核)
- S5pc100 的linux 触摸屏驱动移植(linux 2.6.35.13内核)
- Cstyle的札记,R&D必读手册,第4篇 Embedded Ethernet Controller
- Cstyle的札记,R&D必读手册,第4.1篇 Embedded Ethernet Controller (续)
- linux-2.6.32在mini2440开发板上移植之DM9000网卡移植(3)
- linux-2.6.32在mini2440开发板上移植之RTC移植(4)