1. 程式人生 > >uboot移植之網路驅動移植--移植操作--7.29

uboot移植之網路驅動移植--移植操作--7.29

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