移植DM9000C驱动程序之确定相异性

来源:互联网 发布:淘宝小二人工服务电话 编辑:程序博客网 时间:2024/06/05 17:04

内核自带的DM9000驱动程序不能用在DM9000C上面

厂家驱动dm9dev9000c

一 原理图

用什么地址访问网卡芯片,根据片选nGCS4为低电平时选中


2440手册内存控制器部分可以知道芯片地址


在不同开发板上的区别(基地址 位宽 中断引脚

所以移植的关键是找出相异性并进行修改


二厂家驱动修改

dmfe_probe1函数

(1)入口函数调用的dmfe_probe函数

分配 设置 注册 net_device结构体

如何设置到函数dmfe_probe1里面看

想读寄存器,先把地址写到索引寄存器里面,再读数据寄存器

 outb(DM9KS_VID_L, iobase); /*写 DM9000C的索引寄存器(cmd引脚为0) */

DM9KS_VID_L是寄存器地址

   id_val = inb(iobase + 4);  /* 读DM9000C的数据寄存器(cmd引脚为1) */

这里地址值加4,表示bit2,

DM9000网卡部分

s3c2440部分


为什么2440只有27根地址线?

答:2440地址空间分为8bank每个bank128M(即为2^27nGCS[0:7]作为bank的片选信号,总的寻址空间为128M*8=1G。


outb(DM9KS_VID_L, iobase);//将要操作的寄存器地址写入DM9000C的索引寄存器
id_val = inb(iobase + 4);//从DM9000C的数据寄存器里读出数据
 那么怎么分辨是操作的索引寄存器还是数据寄存器呢?就是通过CMD引脚!我们看到CMD引脚接的是LADDR2,当LADDR2为0时表示操作的是索引寄存器,当LADDR2为1时,表示操作的是数据寄存器。
DM9000的地址线只有LADDR2。


(2)iobase的设置(入口函数)

iobase = (int)ioremap(0x20000000, 1024);//基地址是0x20000000,映射1M

(3)中断号

看原理图,网卡芯片收到数据后会产生1个中断,网卡芯片里面也会有内存的,收到数据后会先放在内存,然后产生中断。在中断服务程序里面把数据从网卡芯片里面拿出来。构造1个sk_buff,然后提交上去,发送的时候从sk_buff把数据拿出来,扔给网卡芯片发送出去,发送完后产生1个中断,需要中断号。


看原理图看中断引脚接到2440的哪1个引脚


外部中断7


在入口函数设置中断

irq    = IRQ_EINT7; 

2dmfe_open函数

注册中断(可以是上升沿触发或下降沿触发)

request_irq(dev->irq,&dmfe_interrupt, IRQF_TRIGGER_RISING,dev->name,dev)

irq是中断号

dmfe_interrupt是中断处理函数

 IRQF_TRIGGER_RISING表示上升沿触发

3 时序修改

读写脉冲信号时序肯定会有要求,有时间上的要求

网卡接在2440上的,内存控制器负责发出读写信号,地址信号,信号时间的设置在内存控制器里面设置,这里没有设置也能用是因为uboot帮我们设置好了。想写1个不依赖uboot的驱动程序需要在入口函数中设置



/* 设置S3C2440的memory controller */
bwscon   = ioremap(0x48000000, 4);//总线位宽和等待状态寄存器
bankcon4 = ioremap(0x48000014, 4);

片选4

BWSCON



/* DW4[17:16]: 01-16bit   位宽
* WS4[18]   : 0-WAIT disable 不使用等待信号
* ST4[19]   : 0 = Not using UB/LB (The pins are dedicated nWBE[3:0])

不了解取缺省值
*/

val = *bwscon;
val &= ~(0xf<<16); //先将4个bit位置0
val |= (1<<16);   //再进行置位

*bwscon = val;


0 0