4.移植uboot-使uboot支持DM9000網卡


上一章,使uboot能夠支持nor、nand

本節繼續修改讓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 08:00:3e:26:0a:5b    //設置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命令

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM