u-boot-2014.10移植第18天----新增DM9000網路卡支援(二)

fulinux發表於2014-12-31

硬體平臺:tq2440

開發環境:Ubuntu-3.11

u-boot版本:2014.10

本文允許轉載,請註明出處:http://blog.csdn.net/fulinus


修改程式碼

一不小心把這篇本已寫好的部落格刪除了,回收站竟然沒有儲存草稿的東西。現在只能重新寫了!

DM9000自身也有基地址,這個基地址是由TXD[3:0](strap pins)引腳來約束的,滿足公式:

IO base = (strap pin value of TXD[2:0]) * 10H + 300H

TXD[2:0]引腳有8中狀態,故IO基地址有8種基地址,它們是300H,310H,320H,340H,350H,360H和370H。

畢竟有些應用場合會用到多片DM9000網路卡,因此需要根據每個網路卡的基地址來選擇需要操作的網路卡,SA4~9是地址匯流排,用來選擇DM9000,當SA9和SA8引腳高電平,SA7和AEN處於低電平,SA6~4引腳狀態與TXD2~0(strap pins)引腳狀態匹配時,該DM9000網路卡就會被選中。

TQ2440原理圖上面DM9000部分電路圖表明TXD2~0引腳是懸空的,那他是處於什麼狀態呢?SA7~4引腳是直接地的,即低電平的,因此推測懸空的TXD2~0引腳狀態為低電平,要不然,dm9000網路卡就不會被選中。SA9~8是接3.3V電壓,故為高電平。因此推斷DM9000基地址是300H。

考慮到DM9000被2440對映到BANK4,空間,即0x2000 0000 ~ 0x2FFF FFFF空間,對映的基地址是0x2000 0000,加上DM9000網路卡自身的IO基地址,所以TQ2440開發板上的網路卡的基地址是0x2000 0300。

因此我們在include/configs/tq2440.h標頭檔案中定義IO基地址如下:

#define NONE_FLAG 0
#if NONE_FLAG  
#define CONFIG_CS8900       /* we have a CS8900 on-board */
#define CONFIG_CS8900_BASE  0x19000300
#define CONFIG_CS8900_BUS16 /* the Linux driver does accesses as shorts */
#else
#define CONFIG_DRIVER_DM9000
+ #define CONFIG_DM9000_BASE 0x20000300
#endif
很多文件和網上的部落格都是0x2000 0000這個基地址,有的網友說0x2000 0300這個基地址是因為CMD引腳被接到了LADDR8的緣故。我認為這種說法是不對的,原因如前面分析。可能我的推測不正確,但是又能怎麼樣呢?如果錯了就當做是移除失敗的經歷吧!SA9~8接高電平,這樣SA9~4用二進位制表示就是11 0000 0000,剛好就是0x300。這可能就是300H這個值的原因吧(?)

由於DM9000是地址和資料埠引腳是複用的,通過CMD引腳來決定,我們這裡CMD引腳接LADDR2,如果CMD為低電平即為地址埠,如果為高即為資料埠。因此DM9000的地址埠(暫存器地址)是0x2000 0300,而資料埠(暫存器地址)是0x2000 0304。在tq2440.h檔案中定義如下:

#else
#define CONFIG_DRIVER_DM9000
#define CONFIG_DM9000_BASE 0x20000300
+ #define DM9000_IO CONFIG_DM9000_BASE
+ #define DM9000_DATA (CONFIG_DM9000_BASE + 4)
#endif


我們的u-boot移植2440是以2410為模板,因為2410沒有做DM9000網路卡的移植工作,所以這裡要在tq2440.c(board/samsung/tq2440/ 檔案中)加上DM9000網路卡的初始化工作,如下:

#ifdef CONFIG_CMD_NET
int board_eth_init(bd_t *bis)
{
    int rc = 0;
#ifdef CONFIG_CS8900
    rc = cs8900_initialize(0, CONFIG_CS8900_BASE);
#endif

+ #ifdef CONFIG_DRIVER_DM9000
+     rc = dm9000_initialize(bis);
+ #endif

    return rc;
}
#endif


dm9000_initialize()函式註冊了操作DM9000網路卡的一些操作函式,即將操作函式的首地址賦值個網路裝置的結構體中,這樣統一了網路裝置的操作。


開啟ping網路操作命令巨集:

#if NONE_FLAG
#define CONFIG_CMD_DHCP
#define CONFIG_CMD_ELF
#define CONFIG_CMD_PING
#define CONFIG_CMD_REGINFO
#define CONFIG_CMD_USB
+ #else
+ #define CONFIG_CMD_PING
#endif

為了便於除錯,我們還將u-boot燒錄到SDRAM中,在tq2440.h標頭檔案中:

#define CONFIG_SYS_TEXT_BASE 0x33F00000 
跳過底層初始化:

#define CONFIG_SKIP_LOWLEVEL_INIT


編譯,燒錄執行(燒錄和時注意起始地址是0x33F00000),列印如下資訊:

Net:   dm9000

測試DM9000

請確保你的開發板連線了網線,設定MAC,IP:

[TQ2440 #] set ethaddr 00:12:34:56:78:90
[TQ2440 #] set ipaddr 192.168.169.9
[TQ2440 #] save

其中save用於儲存環境變數到NORflash中去。

我的ubuntu系統伺服器的IP地址是192.168.169.8,測試是否能ping通ubuntu伺服器:

[TQ2440 #] ping 192.168.169.8
dm9000 i/o: 0x20000300, id: 0x90000a46 
DM9000: running in 16 bit mode
MAC: 00:12:34:56:78:90
could not establish link
Using dm9000 device
host 192.168.169.8 is alive 有效的,說明能ping通。
[TQ2440 #] 

說明DM9000網路功能移植成功。對於u-boot而言tftp是一個重要的功能,對於今後的開發極有幫助,下面演示tftp功能:

首選確保你的ubuntu開啟了tftp服務功能,我的ubuntu伺服器的tftp目錄是/tftpboot,我在其中任意放置一個檔案:

u-boot-2014.10]$ vim /tftpboot/test
1234567890

在u-boot中設定伺服器IP地址:

[TQ2440 #] set serverip 192.168.169.8
[TQ2440 #] save

u-boot下載test檔案到SDRAM的0x3300 0000地址處:

[TQ2440 #] tftpboot 33000000 test
[TQ2440 #] md 33000000

33000000: 34333231 38373635 0a0a3039 4c220889    1234567890...."L

說明tftp功能正常。


修改基地址

奇怪的是我修改了DM9000的基地址,照樣能夠執行,這是很奇怪的問題:

#define CONFIG_DM9000_BASE 0x20000000

重新編譯執行,效果一樣。這個問題留在後面深入研究。

後話:

我後來實際執行的經驗告訴我

#define CONFIG_DM9000_BASE 0x20000300
這個值不會出現卡頓的現象。
















相關文章