27.Linux-DM9000C网卡移植(详解)
上一节 我们学习了:
网卡驱动介绍以及制作虚拟网卡驱动: http://www.cnblogs.com/lifexy/p/7763352.html
接下来本节,学习网卡芯片DM9000C,如何编写移植DM9000C网卡驱动程序。
1.首先来看DM9000C原理图
如下图所示:
(#:表示低电平有效)
- SD0~15: 16位数据线,有CMD引脚决定访问类型
- CMD: 命令线,当CMD为高,表示SD 传输的是数据,CMD为低表示传输的是地址
- INT: 中断引脚,接在2440的GPF7脚上
- IOR#: 读引脚,接在2440的nOE脚上
- IOW#: 写引脚,接在2440的nWE脚上
- CS#: 片选,放在2440的bank4的片选上面
1.1其中2440手册的bank4地址区间如下图:
bank4的区间位于: 0X20000000~0X28000000,当我们访问这个区间的地址,内存控制器便会使能网卡DM9000C的使能脚,所以我们的DM9000C的io基地址=0X20000000
其中DM9000C的CMD引脚接在bank4的LADDR2上面
比如当在地址0X2000 0000上读写数据时,表示读写的数据是DM9000C的地址
访问的地址0X2000 0004上读写数据时,表示读写的数据是DM9000C的数据
1.2 DM9000C收发过程
当DM9000C收到外部的数据后,会暂存到内部地址中,然后产生一个上升沿中断,等待2440读取数据
当DM9000C将2440的数据转发出去后,也会产生一个上升沿中断给2440
如下图所示,DM9000C的中断引脚位于pin34脚
接在2440的GPF7引脚上,使用的中断为EINT7
接下来便来修改厂家提供的DM9000C源代码
2.发现它的init_module()入口函数前有个条件编译
所以要注释掉 “#ifdef MODULE” 和 “#endif”
3.修改入口出口函数名,并修饰它们(修改函数名避免与内核的其它函数重名)
4.修改驱动的硬件相异性(设置基地址,寄存器,中断等)
4.1先来找找代码在哪里初始化DM9000C硬件的
进入dm9000c_init()
-> dmfe_probe()
其中dmfe_probe()函数如下:
- struct net_device * __init dmfe_probe(void)
- {
- struct net_device *dev;
- dev= alloc_etherdev(sizeof(struct board_info)); //分配一个net_device结构体
- ... ...
- err = dmfe_probe1(dev); //调用dmfe_probe1()函数
- ... ...
- err = register_netdev(dev); //向内核注册net_device结构体
- ... ...
- }
显然dmfe_probe1()函数就是用来初始化DM9000C硬件和设置net_device结构体的成员用的
4.2 进入dmfe_probe1()函数
如下图,这个iobase 变量就是我们DM9000C的io基地址0x20000000
iobase的作用:
如上图, 读一次DM9000C的VID低字节之前,需要先将地址赋为0x20000000,也就是将DM9000C的CMD置0,然后向0x20000000写入要读的DM9KS_VID_L地址值
最后再将地址+4,也就是赋为0x20000100,将CMD置1,然后读出0x20000100的值,也就是DM9000C的VID低字节
DM9000C的读写方式都是这样的,先将CMD置0,写入DM9000C的地址,然后再将CMD置1,来读写数据
4.3所以在init函数中便重新设置iobase 变量,其中iobase是int型
并在exit出口函数中,添加iounmp()
4.4 继续进入dmfe_probe1()函数,往下看
如下图所示,屏蔽红框里的代码,该代码用来核对版本,我们的DM9000C版本号不一样,所以要屏蔽
4.5 在init函数中,修改中断名,将irq改为IRQ_EINT7
4.6 修改中断
当使用了register_netdev()注册了网卡驱动net_device后,在内核中使用ifconfig就会进入net_device->open成员函数申请中断,激活队列等
所以我们要修改open成员函数的申请中断函数,将触发中断改为“IRQT_RISING”,上升沿触发
5.接下来便开始设置2440的存储控制寄存器
设置2440的bank4的硬件位宽,时序,因为不同的硬件,涉及的数据收发都不同,
5.1设置BWSCON总线宽度控制寄存器
我们只设置BANK4的内容,所以只有下面3个(BANK0的位宽由OM[1:0] 硬件设置)
设置ST4=0,不使用UB/LB(UB/LB:表示高字节与低字节数据是否分开传输)
设置WS4=0,其中WAIT引脚为PE4,而我们DM9000C没有引脚接入PE4,所以禁止
设置DW4=0x01,我们的DM9000C的数据线为16位
5.2设置BANKCON4控制寄存器
设置这些时序之前,首先来看DM9000C芯片手册时序图和2440的时序图
参考上图,得出BANKCON4 寄存器设置如下(HCLK=100MHZ,1个时钟等于10ns)
- 设置Tacs=0,因为CS和CMD可以同时结束(bank4地址(也就是CMD)稳定多久后,CS片选才启动)
- 设置Tcos=T1=0(CS片选后,多久才能使能读写)
- 设置Tacc=T2>=10ns=1,表示2个时钟 (access cycle ,读写使能后,多久才能访问数据)
- 设置Tcoh=T4>=3ns=1,表示1个时钟 ,因为当DM9000的写信号取消后,数据线上的数据还需要至少3ns才消失(nOE读写取消后,片选需要维持多长时间)
- 设置Tcah=0,因为 CS和CMD可以同时结束 (CS片选取消后,地址(也就是CMD)需要维持多长时间)
代码如下图,在init入口函数中设置
(PS:若DM9000C无法驱动,可能是Tacc时间太短,导致读取不到数据,可以将Tacc设大一点)
与硬件相关的部分已经改好了,接下来开始编译
6.编译测试
编译之前,首先添加该驱动需要的内核头文件:
- #include <asm/delay.h>
- #include <asm/irq.h>
- #include <linux/irq.h>
- #include <asm/io.h>
- #include <asm/arch-s3c2410/regs-mem.h>
编译无误后,便开始测试DM9000C驱动程序:
1) 把dm9dev9000c.c放到内核的drivers/net目录下,来替换原来内核的DM9000C
2) 修改drivers/net/Makefile
把
obj-$(CONFIG_DM9000) += dm9000.o
改为(如下图所示)
obj-$(CONFIG_DM9000) += dm9dev9000c.o
3) make uImage
如下图,说明新的驱动已编译进内核
4) 使用新内核启动
ifconfig eth0 192.168.2.107
ping 192.168.2.1
如下图,可以ping通,说明移植成功
下章学习:28.Linux-IIC驱动(详解)
27.Linux-DM9000C网卡移植(详解)的更多相关文章
- 网卡配置文件详解 用户管理与文件权限篇 文件与目录权限 软连接 tar解压命令 killall命令 linux防火墙 dns解析设置 计划任务crond服务 软件包安装 阿里云 yum源 安装
Linux系统基础优化及常用命令 Linux基础系统优化 引言没有,只有一张图. Linux的网络功能相当强悍,一时之间我们无法了解所有的网络命令,在配置服务器基础环境时,先了解下网络参数设定命令. ...
- Java网络编程和NIO详解6:Linux epoll实现原理详解
Java网络编程和NIO详解6:Linux epoll实现原理详解 本系列文章首发于我的个人博客:https://h2pl.github.io/ 欢迎阅览我的CSDN专栏:Java网络编程和NIO h ...
- Linux环境fork()函数详解
Linux环境fork()函数详解 引言 先来看一段代码吧, 1 #include <sys/types.h> 2 #include <unistd.h> 3 #include ...
- Linux内核异常处理体系结构详解(一)【转】
转自:http://www.techbulo.com/1841.html 2015年11月30日 ⁄ 基础知识 ⁄ 共 6653字 ⁄ 字号 小 中 大 ⁄ Linux内核异常处理体系结构详解(一)已 ...
- linux nc命令使用详解(转)
linux nc命令使用详解 功能说明:功能强大的网络工具 语 法:nc [-hlnruz][-g<网关...>][-G<指向器数目>][-i<延迟秒数>][-o& ...
- Linux 系统性能监控命令详解
Linux 系统性能监控命令详解 CPU MEMORY IO NETWORK LINUX进程内存占用查看方法 系统负载过重时往往会引起其它子系统的问题,比如:->大量的读入内存的IO请求(pag ...
- Linux下桥接模式详解一
注册博客园已经好长时间,一直以来也没有在上面写过文章,都是随意的记录在了未知笔记上,今天开始本着分享和学习的精神想把之前总结的笔记逐步分享到博客园,和大家一起学习,一起进步吧! 2016-09-20 ...
- linux下IPTABLES配置详解 (防火墙命令)
linux下IPTABLES配置详解 -A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 24000 -j ACCEPT ...
- freebsd网卡驱动程序详解
freebsd网卡驱动程序详解 来源 https://blog.csdn.net/h_cszc/article/details/7776116 /* 注释:xie_minix */ /*此处为BSD申 ...
随机推荐
- Manacher详解
之前的字符串题解中对Manacher的思想进行了简略的介绍,在这篇文章中,我将会详细的将这个算法的初衷和具体实现理论进行解释.声明一点,这是我个人的理解,可能有不全面之处,望多包涵.在之前的几篇文章中 ...
- appium python andiroid自动化文档整理笔记
from appium import webdriver import time,unittest,HTMLTestRunner class Testlogin(unittest.TestCase): ...
- oracle 角色
一.介绍角色就是相关权限的命令集合,使用角色的主要目的就是为了简化权限的管理.假定有用户a,b,c为了让他们都拥有如下权限1. 连接数据库2. 在scott.emp表上select,insert,up ...
- python 库之lxml安装 坑一个
error: command 'C:\\Users\\Admin\\AppData\\Local\\Programs\\Common\\Microsoft\\Visual C++ for Python ...
- 在Storyboard中为UITableView添加Header和Footer
我在这里所说的Header和Footer并不是sectionHeader和sectionFooter,而是指UITableView的tableHeaderView和tableFooterView,这两 ...
- python之路第四篇(基础篇)
一.冒泡算法实现: 方法一: li = [13,33,12,80,66,1] print li for m in range(4): num1 = li[m] num2 = li[m+1] if nu ...
- ASP.NET没有魔法——ASP.NET MVC 与数据库之EntityFramework配置与连接字符串
前几篇文章中介绍了如何使用Entity Framework来操作数据库,但是对EF的配置.连接字符串的指定仍然存在一些疑问. 本章将对EF的配置进行介绍. EF可以通过两种方式来实现配置,分别是代码方 ...
- linux命令和awk
1.统计一下代码量 find . -name "*.py" | xargs wc -l | awk 'BEGIN {size = 0} { size+=$1} END{print ...
- gitlab仓库迁移
遇到一个情况,需要将两个gitlab仓库合并.好在都是使用的ldap账户登陆,用户账户不需要迁移. 实际的使用情况下,需要迁移的主要部分为分组及分组下项目.gitlab的api还是很给力的,能够获取所 ...
- nginx + keepalived 实现高可靠web网站
组网图: 配置信息: 左边nigx 服务器的 /usr/local/nginx/conf/nginx.conf #user nobody; worker_processes 1; #error_l ...