美学原理27.Linux-DM9000C网卡移植(详解)

齐等同节约 我们读了:  

网卡驱动介绍和做虚拟网卡驱动:  http://www.cnblogs.com/lifexy/p/7763352.html

连着下去本节,学习网卡芯片DM9000C,如何编写移植DM9000C网卡驱动程序。

 


 

1.先是来拘禁DM9000C原理图

正如图所示:

 美学原理 1

  (#:表示小电平有效)

  • SD0~15: 16号数据线,有CMD引脚决定访问类型
  • CMD:      命令线,当CMD为胜,表示SD
    传输的是数,CMD为小表示传输的凡地方
  • INT:      
      
    暂停引脚,接在2440之GPF7底上
  • IOR#:    
     
    读引脚,接在2440的nOE脚上
  • IOW#:  
      
    写引脚,接在2440的nWE脚上
  • CS#:    
      
    片选,放在2440底bank4的片选上面

1.1里头2440手册的bank4地址区间如下图:

 美学原理 2

bank4的间隔在: 0X20000000~0X28000000,当我们看是距离的地点,内存控制器便会要能网卡DM9000C的使能下,所以我们的DM9000C的io基地址=0X20000000

其中DM9000C的CMD引脚接在bank4的LADDR2上面

之所以当以地址0X2000 0000臻读写多少常常,表示读写的数额是DM9000C的地点

访问的地址0X2000 0100及宣读写多少时,表示读写的数量是DM9000C的数量

 

1.2
DM9000C收发过程

当DM9000C收到外部的数码后,会暂存到内部地址被,然后出一个升高沿中断,等待2440读取数据

当DM9000C将2440之数码转发出来后,也会见有一个上升沿中断给2440

一般来说图所示,DM9000C的刹车引脚位于pin34底

 美学原理 3

美学原理 4

连通在2440之GPF7唤起脚上,使用的中断为EINT7

 

对接下去就来改厂家提供的DM9000C源代码

2.意识她的init_module()入口函数前发生只标准化编译

美学原理 5

所以只要诠释掉 “#ifdef MODULE” 和 “#endif”

3.改动入口出口函数名,并修饰它们(修改函数称避免与基础的外函数重名)

 美学原理 6

美学原理 7

美学原理 8

 

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

 美学原理 9

 

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型

 美学原理 10

连于exit出口函数中,添加iounmp()

 美学原理 11

4.4
继续上dmfe_probe1()函数,往下看

正如图所示,屏蔽红框里的代码,该代码用来甄别版本,我们的DM9000C版本号不雷同,所以要屏蔽

美学原理 12

4.5
在init函数中,修改被断名,将irq改呢IRQ_EINT7

 美学原理 13

4.6
修改中断

当使用了register_netdev()注册了网卡驱动net_device后,在基础中采取ifconfig就会进net_device->open成员函数申请中断,激活队列等

据此我们若改open成员函数的提请中断函数,将沾中断改吗“IRQT_RISING”,上升沿触发

 美学原理 14

5.接下来就是起设置2440之储存控制寄存器

安2440之bank4的硬件位富有,时序,因为不同的硬件,涉及的多少收发都不可同日而语,

5.1装BWSCON总线宽度控制寄存器

咱仅仅设置BANK4的情,所以只有脚3个(BANK0的各项宽由OM[1:0]
硬件设置)

 美学原理 15

装ST4=0,不动UB/LB(UB/LB:表示高字节与低字节数据是否分手传输)

装WS4=0,其中WAIT引脚为PE4,而我们DM9000C没有引脚接抱PE4,所以禁止

装DW4=0x01,我们的DM9000C的数据线为16各类

5.2安BANKCON4操寄存器

 美学原理 16

 设置这些时序之前,首先来拘禁DM9000C芯片手册时序图和2440的时序图

 美学原理 17

参照上图,得出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入口函数中安装

 美学原理 18

和硬件相关的有就改好了,接下开始编译

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

 美学原理 19

 

3) make
uImage

正如图,说明新的叫已编译进基本

 美学原理 20

 

4) 动初水源启动

ifconfig eth0 192.168.2.107

ping 192.168.2.1

如下图,可以ping通,说明移植成功

 美学原理 21