1. 程式人生 > >第八章:基於九鼎X210開發板移植2014.10版U-boot之初始化網絡卡

第八章:基於九鼎X210開發板移植2014.10版U-boot之初始化網絡卡

接下來就要開始處理網絡卡相關的了,這樣我們才能掛載網路檔案系統,使用tftp伺服器之類的,但是很不幸,2014.10版本的uboot裡面沒有支援我們的開發板上的網絡卡。所以接下來要手動移植網絡卡相關的程式。

首先查詢網絡卡初始化的程式碼/arch/arm/lib目錄下的board.c中的board_init_r函式可以看到有設定,那就需要在/include/config目錄下的x210.h下追加#define CONFIG_CMD_NET和#define CONFIG_CMD_PING


同時在x210.h中還發現了#undefCONFIG_CMD_NET,這個也需要遮蔽掉,要不就會將之前定義的CONFIG_CMD_NET

給取消掉了。之後燒錄進sd卡啟動,發現,沒有找到Ethernet,這也和之前咱們說的一致,需要我們自己移植網絡卡相關的程式了。

進入board_init_r下的eth_initialize裡面可以看到以下程式碼:
Net Initialization Skipped,這個之前在uboot中有看到,那麼就知道上面兩個case都沒執行到,也就是意味著board_eth_init 的返回值等於__def_eth_init的返回值。


深入研究發現並沒有board_eth_init這個函式,而是定義了以下函式

不知道這個是啥意思,百度之後,大概就是說如果沒有board_eth_init這個函式,那麼board_eth_init

函式就等於__def_eth_init這個函式,這樣一來,就會打印出Net Initialization Skipped

既然沒有這個函式,咱們就定義一個這個函式,而這個函式就用來初始化開發板的網絡卡吧。

首先優先在/driver/net目錄中查詢是否有DM9000相關的網絡卡,果然還真的有,然後檢視/driver/net目錄下的makefile,看要怎麼才能將DM9000.o編譯進來。

在makefile中看到obj-$(CONFIG_DRIVER_DM9000) += dm9000x.o

X210.h中追加CONFIG_DRIVER_DM9000的巨集定義,然後review下dm9000x.c這個檔案的初始化函式在哪裡?最後在/board/Samsung/X210

目錄下的x210.c檔案中新增這個函式


之後編譯程式,果然不可能那麼順利的。但是問題不大,只是缺少了DM9000_DATA,DM9000_IO,CONFIG_DM9000_BASE三個巨集定義,網絡卡這部分的東西,之前在移植三星版本的uboot的時候已經弄過了,所以這裡我直接使用之前移植過的引數來減少工作量。


順利編譯通過,再次燒錄,啟動,發現還是有問題,會提示ERROR: resetting DM9000 -> not responding,這裡正好在網上看到解決的辦法。

修改地方就是遮蔽掉之前lowlevel_init.S中的CLK_IP1的時鐘初始化。


再編譯燒錄啟動後,就沒有那麼多問題的了,如果出現了

WARNING: Bad MAC address (uninitialized EEPROM?)
operating at 100M full duplex mode
*** ERROR: `serverip' not set

那就設定一下ip地址這類的東西,然後再save一下,儲存起來即可。

這時候我準備下載東西到記憶體中去了,使用tftp命令下載的時候,出現瞭如下錯誤。


想起來丟了之前移植三星版本的網絡卡的一個初始化,將它移植過來就好了,具體內容,哪天的整好之前移植三星版本時候的筆記,再貼出來吧。

/borad/Samsung/x210目錄下出x210.c中追加以下程式碼。


之後執行下載命令,下載成功,也說明我們的網絡卡打通了。