内核自带的DM9000驱动程序不能用在DM9000C上面
厂家驱动dm9dev9000c
一 原理图
用什么地址访问网卡芯片,根据片选nGCS4为低电平时选中
2440手册内存控制器部分可以知道芯片地址
在不同开发板上的区别(基地址 位宽 中断引脚)
所以移植的关键是找出相异性并进行修改
二厂家驱动修改
1dmfe_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地址空间分为8个bank,每个bank为128M(即为2^27),nGCS[0:7]作为bank的片选信号,总的寻址空间为128M*8=1G。
(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;