在上一章,使uboot能夠支持nor、nand 本節繼續修改讓uboot支持DM9000C網卡,便可以通過網路來傳輸文件 首先uboot已帶有dm9000網卡的驅動,位於drivers/net/下的dm9000x.h、dm9000x.c 1.DM9000C介紹 參考之前寫的移植DM9000C驅動章節 ...
本節繼續修改讓uboot支持DM9000C網卡,便可以通過網路來傳輸文件
首先uboot已帶有dm9000網卡的驅動,位於drivers/net/下的dm9000x.h、dm9000x.c
1.DM9000C介紹
參考之前寫的移植DM9000C驅動章節, 我們的DM9000是放在2440的bank4(0X20000000)的片選上面
而DM9000的CMD引腳接在bank4的LADDR2上面
也就是說當向0X20000000地址上讀寫數據時, 此時CMD為低,則讀寫的便是DM9000C的地址
向0X20000000+4地址上讀寫數據時,此時CMD為高,則讀寫的便是DM9000C的數據
2.修改記憶體控制器時序
由於之前在start.S里,就調用了board/samsung/smdk2440/lowlevl_init.S來初始化各個bank的配置、時序。所以我們只需要在那裡修改bank4的內容即可
(也可以直接在dm9000x.c里的dm9000_initialize()函數設置)
參考之前寫的移植DM9000C驅動里的時序
由於相容DM9000E,所以修改的值儘量大一點,設為:
.long 0x00000740; //BANKCON4
3.修改巨集,通過Makefile把dm9000x編譯進uboot
3.1 查找巨集
cd drivers/net
vi Makefile
找到:
找到有兩個巨集: CONFIG_CS8900、CONFIG_DRIVER_DM9000
由於uboot預設定義的是CONFIG_CS8900巨集,而我們板子上的網卡是dm9000C,所以我們要修改為CONFIG_DRIVER_DM9000巨集(巨集位於include/configs/smdk2440.h)
將:
#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 */
改為:
#define CONFIG_DRIVER_DM9000 /*DM9000*/ #define CONFIG_DM9000_BASE 0x20000000 #define DM9000_IO CONFIG_DM9000_BASE #define DM9000_DATA (CONFIG_DM9000_BASE + 4)
4. 然後來看看初始化dm9000c的流程
1)uboot重定位後進入第二階段board_init_r():
void board_init_r(gd_t *id, ulong dest_addr) //gd uboot重定位地址 { ... ... #if defined(CONFIG_CMD_NET) puts("Net: "); eth_initialize(gd->bd); // 乙太網初始化 #if defined(CONFIG_RESET_PHY_R) debug("Reset Ethernet PHY\n"); reset_phy(); #endif #endif ... ... }
2)然後進入board_init_r()->eth_initialize():
int eth_initialize(bd_t *bis) { ... ... if (board_eth_init(bis) < 0) //初始化 單板上的乙太網 printf("Board Net Initialization Failed\n"); ... ... if (!eth_devices) { //初始化失敗,列印"No ethernet found.\n" puts ("No ethernet found.\n"); bootstage_error(BOOTSTAGE_ID_NET_ETH_START); } ... ... }
3)進入board_eth_init(), 位於board/samsung/smdk2440/smdk2440.c
int board_eth_init(bd_t *bis) { int rc = 0; #ifdef CONFIG_CS8900 rc = cs8900_initialize(0, CONFIG_CS8900_BASE); //初始化cs8900 #endif return rc; }
4.1從上面代碼看到,單板初始化board_eth_init()函數里,只支持初始化CS8900,沒有DM9000C
搜索其它單板的board_eth_init()是如何初始化DM9000C的,如下圖所示:
所以,我們修改2440單板的board_eth_init(),使它支持DM9000C
修改代碼如下(位於board/samsung/smdk2440/smdk2440.c):
int board_eth_init(bd_t *bis) { int rc = 0; #ifdef CONFIG_CS8900 rc = cs8900_initialize(0, CONFIG_CS8900_BASE); //初始化cs8900 #endif #ifdef CONFIG_DRIVER_DM9000 rc = dm9000_initialize(bis); //初始化DM9000C #endif return rc; }
5.編譯測試
使用loady命令重新燒寫uboot,列印如下圖所示:
然後試驗,來ping下PC機,輸入:
set ipaddr 192.168.2.103 ping 192.168.2.101
列印如下圖所示:
上面表示,MAC(硬體地址)沒有設置,我們需要設置ethaddr,來更改MAC地址
輸入(參考虛擬機的MAC地址):
set ethaddr 00:0c:29:35:21:29 //設置MAC地址 ping 192.168.2.101 //重新ping
便可以ping通,如下圖所示:
5.1 使用tftp工具,通過網卡來下載內核
tftp工具是通過電腦來設置本機為伺服器,然後開發板作為客戶端,便可以讀取到PC機里的文件了
1)PC機打開tftp工具,設置文件根目錄,以及PC本機的IP地址
2)進入開發板,輸入:
set serverip 192.168.2.101 //設置PC機地址 tftp 30000000 uImage //下載PC機設置的tftp根目錄下的uImage文件 bootm 30000000 //使用bootm命令啟動內核代碼
啟動內核時,列印如下圖所示:
由於uboot沒有配置mtdparts命令,所以啟動內核沒成功.
接下來,在下章-設置預設環境變數,裁剪,分區里會講到如何配置mtdparts命令