u-boot-2014.10移植第18天----新增DM9000網路卡支援(二)
硬體平臺: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
#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
這個值不會出現卡頓的現象。相關文章
- u-boot-2014.10移植第17天----新增DM9000網路卡支援(一)boot
- u-boot-2014.10移植第20天----新增nand flash命令支援(二)bootNaN
- u-boot-2014.10移植第21天----新增nand flash命令支援(三)bootNaN
- u-boot-2014.10移植第22天----新增nand flash命令支援(四)bootNaN
- u-boot-2014.10移植第19天----新增nand flash命令支援(一)bootNaN
- u-boot-2014.10移植第24天----nand flash啟動(二)bootNaN
- u-boot-2014.10移植第30天----nand flash的SPL啟動(二)bootNaN
- u-boot-2014.10移植第15天----nor flash操作boot
- u-boot-2014.10移植第31天----核心啟動(一)boot
- u-boot-2014.10移植第16天----Nor flash啟動boot
- u-boot-2014.10移植第28天----nand flash啟動(六)bootNaN
- u-boot-2014.10移植第27天----nand flash啟動(五)bootNaN
- u-boot-2014.10移植第25天----nand flash啟動(三)bootNaN
- u-boot-2014.10移植第26天----nand flash啟動(四)bootNaN
- u-boot-2014.10移植第23天----nand flash啟動(一)bootNaN
- u-boot-2014.10移植第29天----nand flash的SPL啟動(一)bootNaN
- centos 7.4 新增新網路卡CentOS
- 雲主機新增網路卡配置多網路卡策略路由路由
- LINUX下手工新增網路卡Linux
- Linux系統新增自定義網路卡並更改網路卡介面Linux
- Centos(RHEL) 6 新增網路卡的方法CentOS
- Xen虛擬機器新增網路卡虛擬機
- KVM虛擬機器新增物理網路卡虛擬機
- 新增MyEclipse WebSphere Portal Server支援(二)EclipseWebServer
- vmware中新增網路卡後無法識別
- 第216天:Angular—自定義指令(二)Angular
- KVM之十:虛擬機器線上新增網路卡虛擬機
- 前端面試每日 3+1 —— 第918天前端面試
- 檢視無線網路卡是否支援監聽模式模式
- Killer E3000網路卡釋出:首個支援2.5G乙太網的千兆網路卡
- Windows10系統新增虛擬網路卡的方法Windows
- Win8新增虛擬網路卡方法圖文教程
- 配置WindowsServer2008支援無線網路卡WindowsServer
- 第 0 天/第 1 天/第 2 天:雲時代的軟體生命週期
- win10怎麼檢視網路卡支援千兆網_檢視win10是否支援千兆網的方法Win10
- 未來180天構建180個網站網站
- 判斷無線網路卡是否支援5GHz頻段
- 《linux 網路卡別名的新增和繫結》RHEL6Linux