码迷,mamicode.com
首页 > 其他好文 > 详细

网卡移植

时间:2016-01-09 06:25:46      阅读:221      评论:0      收藏:0      [点我收藏+]

标签:dm9000、网络驱动、驱动移植

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

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

    移植的程序模板是jz2440厂家提供的驱动程序,首先就是找差异的地方:

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

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

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

  4. 还有就是模板程序中的细节修改:比如模板程序中有要监测网卡版本号的,不满足就直接退出了,事实上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,重新烧写内核。以网络文件系统驱动,能启动,说明驱动程序移植成功。


本文出自 “君峰俊宇” 博客,请务必保留此出处http://10274409.blog.51cto.com/10264409/1733116

网卡移植

标签:dm9000、网络驱动、驱动移植

原文地址:http://10274409.blog.51cto.com/10264409/1733116

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!