内核自带的DM9000驱动程序不能用于DM9000C上,把厂家提供的驱动程序移植到开发板上。
DM9000 是一个内存接口的芯片,两个同样接有 DM9000 的开发板,最小差异:基地址、位宽和中断引脚。
1,基地址
地址线和数据线上挂有网卡芯片、内存和 NORFLASH。如何访问一个网卡设备而不被其他诸如“内存”或“NORFLASH”影响,则是将每个设备选中再访问。让“nGCS4”片选信号为低电平。
当只要 CPU 发出的物理地址是“0x2000_0000 - 0x2800_0000”之间时,引脚“(nGCS4)”就会变成低电平。所以基地址根据这个物理地址“0x2000_0000 - 0x2800_0000”设置而来。
在“入口函数”中设置“基地址”
iobase = (int)ioremap(0x20000000, 1024);
2.中断号
网卡芯片接收到数据后,会产生一个中断(网卡芯片里面也会有内存,因为它接收到数据后是先放在自已的内存里,然后再产生一个中断)。在“中断服务程序”里再将此缓存的数据从网卡芯片里拿出来构造成一个“skb_buff”,然后才提交上去。发送时也是从“skb_buff”里拿出数据交给网卡芯片。网卡芯片硬件就会再把数据从 skb_buff 中取出发送出去,发送完成后就会产生一个中断。
原理图上,DM9000C 的“INT”引脚最终接到了2440 的外部中断7 上“EINT7/GPF7”。查找到中断号后,在入口函数中指定此中断号。触发方式改为上升沿触发。
irq = IRQ_EINT7;
request_irq(dev->irq,&dmfe_interrupt, IRQF_TRIGGER_RISING,dev->name,dev)
3.设置时序
网卡是内存一样的接口,地址信号,读写脉冲,这些信号的读写时序会有要求。
CPU 发指令给内存控制器,再由“内存控制器”负责发读写、地址等信号给网卡芯片,这些信号间的时间要设置。所以还要设置内存控制器。
BWSCON(等待和位宽控制寄存器):位宽16位,不使用等待信号,使用数据掩码引脚
BANKCON4(控制寄存器):可编程的访问周期,控制访问时序。如:片选后多久发出地址信号,片选后多久发出读信号,读信号脉冲长度,读信号高电平片选维持多久,片选高电平地址信号维持多久。
测试DM9000C驱动程序:
1 把dm9dev9000c.c放到内核的drivers/net目录下
2. 修改drivers/net/Makefile
把obj-
(
C
O
N
F
I
G
D
M
9000
)
+
=
d
m
9000.
o
改
为
o
b
j
−
(CONFIG_DM9000) += dm9000.o 改为obj-
(CONFIGDM9000)+=dm9000.o改为obj−(CONFIG_DM9000) += dm9dev9000c.o
3. make uImage使用新内核启动
cp arch/arm/boot/uImage /work/nfs_root/uImage_dm9000c
4. 使用NFS启动
nfs 30000000 192.168.1.190:/work/nfs_root/uImage_dm9000c
bootm 30000000
或
ifconfig eth0 192.168.1.17
ping 192.168.1.1