1、网卡驱动文件介绍
uboot/drivers/net/dm9000x.c和dm9000x.h。
这个驱动来自于linux kernel源代码。所以我们uboot中是移植而不是编写。
2、网卡移植的关键:初始化
(1)网卡初始化代码地方在:
start_armboot
init_sequence
board_init
dm9000_pre_init这个函数就是移植的关键
(2)必须要结合开发板原理图来分析,然后决定这个函数怎么编程。
BW寄存器
SROM_BW_REG &= ~(0xf << 4);
SROM_BW_REG |= (1<<7)|(1<<6)|(1<<5)|(1<<4);
BC寄存器
SROM_BC1_REG =((0<<28)|(1<<24)|(5<<16)|(1<<12)|(4<<8)|(6<<4)|(0<<0));
MP0_1CON寄存器
tmp = MP01CON_REG;
tmp &= ~(0XF<<4);
tmp |=(2<<4);
MP01CON_REG =tmp ;
(3)#define DM9000_16BIT_DATA这个宏用来表示DM9000工作在16位总线模式下。根据上节课的硬件原理图的分析,可以看到我们开发板上DM9000确实工作在16位模式下。
(4)从三星版本的代码中可以看出,它操作的是bit20-bit23,对照数据手册中寄存器定义,可以看出三星的开发板DM9000是接在Bank5上的。而我们接在bank1上的,因此我们需要操作的bit位是bit4-bit7
(5)总结:三个寄存器的修改。主要是三星的开发板DM9000接在bank5,我们接在了bank1上,因此要做一些修改。
3、基地址的配置等
(1)驱动分为2部分:代码和数据。代码不用动,数据要修改。
(2)CONFIG_DM9000_BASE是DM9000网卡通过SROM bank映射到SoC中地址空间中的地址。这个地址的值取决于硬件接到了哪个bank,这个bank的基地址是SoC自己定义好的。譬如我们这里接到了bank1上,bank1的基地址是0x88000000.
(3)DM9000_IO表示访问芯片IO的基地址,直接就是CONFIG_DM9000_BASE;DM9000_DATA表示我们访问数据时的基地址,因为DM9000芯片的CMD引脚接到了ADDR2,因此这里要+4(0b100,对应ADDR2)
(4)本来这样配置就完了,重新编译运行网卡就应该工作了。但是实际测试发现不工作,要怎么样修改呢?修改方式是将CONFIG_DM9000_BASE改成0x88000300就工作了。
问题?这个0x300从哪里来的?我得出的感觉最靠谱的解释是:跟DM9000网卡芯片型号版本有关,我认为这个0x300是DM9000网卡本身的问题,他本身的内部寄存器就有一个0x300的一个偏移量。