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的一個偏移量。