uboot 添加 DM9000支援,作為uboot移植網卡驅動參考

來源:互聯網
上載者:User

uboot 1.1.6添加dm9000支援

 

 

 

前兩天在6410開發板上玩了玩u-boot,開發板是友堅的
6410開發板,配套的光碟片中給的是很古老的u-boot
1.1.6,而且沒有網路支援。從網上下了個最新的uboot-2010.06版本,看了下發現它並不支援6410的SD卡啟動模式,本來是想移植下,使
得新版本也支援SD卡啟動,但現在時間很緊張,沒那麼多時間慢慢玩了,於是就想把dm9000弄上去。

本來以為dm9000這類的大白菜,uboot肯定是一切ok了,但google了下,發現有人說低版本的uboot帶的dm9000x.c驅動是
不支援dm9000a的,只支援比較老的dm9000x。於是看linux
2.6.32核心代碼,發現有dm9000驅動,對比了下,也沒覺得有多大差別,為了省事,又看了下uboot2010.06版本裡面的dm9000驅
動。看注釋,發現它已經支援dm9000ae了。於是直接拷貝過來,替換原先的dm9000x.c。

在include/configs/smdk6410.h中添加

#define CONFIG_DRIVER_DM9000 1

#define CONFIG_DM9000_BASE 0X18000300

#define DM9000_IO  CONFIG_DM9000_BASE

#define DM9000_DATA (CONFIG_DM9000_BASE+4)

#define CONFIG_DM9000_NO_SROM   1

登出其他網卡晶片的支援,比如//#define CONFIG_DRIVER_SMC911X      1     /* we have a SMC9115 on-board */

再添加:

#define CONFIG_NET_MULTI    1

 

修改board/smdk6410.c

本來裡面好像是cs8900的,所以裡面有這麼一些與cs8900相關的代碼:

#define CS8900_Tacs    (0x0)      // 0clk            address set-up

#define CS8900_Tcos    (0x4)      // 4clk            chip selection set-up

#define CS8900_Tacc    (0xE)      // 14clk   access cycle

#define CS8900_Tcoh    (0x1)      // 1clk            chip selection hold

#define CS8900_Tah      (0x4)      // 4clk            address holding time

#define CS8900_Tacp    (0x6)      // 6clk            page mode access cycle

#define CS8900_PMC    (0x0)      // normal(1data)page mode configuration

static void cs8900_pre_init(void)

{

       SROM_BW_REG &= ~(0xf << 4);

       SROM_BW_REG |= (1<<7) | (1<<6) | (1<<4);

       SROM_BC1_REG =
((CS8900_Tacs<<28)+(CS8900_Tcos<<24)+(CS8900_Tacc<<16)+(CS8900_Tcoh<<12)+(CS8900_Tah<<8)+(CS8900_Tacp<<4)+(CS8900_PMC));

}

 

int board_init(void)

{

       DECLARE_GLOBAL_DATA_PTR;

 

       cs8900_pre_init();//改為dm9000_pre_init

 

       gd->bd->bi_arch_number = MACH_TYPE;

       gd->bd->bi_boot_params = (PHYS_SDRAM_1+0x100);

 

#if 0

       icache_enable();

       dcache_enable();

#endif

       return 0;

}

把所有cs8900改為dm9000,代碼是不需要改的,對照s3c6410手冊,這塊memory訪問的配置是沒問題。這個開發板是用的是16bit的模式,所以確認cs8900_pre_init確實是把匯流排初始化為16bit模式的。

 

在net/eth.c中添加

extern int dm9000_initialize(bd_t*);

 

int eth_initialize(bd_t *bis)

{

       char enetvar[32], env_enetaddr[6];

       int i, eth_number = 0;

       char *tmp, *end;

 

       eth_devices = NULL;

       eth_current = NULL;

 

#if defined(CONFIG_MII) || (CONFIG_COMMANDS & CFG_CMD_MII)

       miiphy_init();

#endif

#if defined(CONFIG_DRIVER_DM9000)

 

       dm9000_initialize(bis);//這是我添加的

#endif

#if defined(CONFIG_DB64360) || defined(CONFIG_CPCI750)

       mv6436x_eth_initialize(bis);

#endif

 

編譯測試。順便說下,這個工作看起來是簡單的,但仍然碰到一些問題,花了兩天時間才搞定。特別開始的時候忘記定義#define CONFIG_DM9000_NO_SROM   1

結果導致每次mac地址都不對,後來看了下代碼,才發現如果沒有定義CONFIG_DM9000_NO_SROM,則uboot會從eeprom中
讀mac地址,dm9000是支援eeprom介面的,但友堅開發板上並沒有用這個功能,所以需要設定CONFIG_DM9000_NO_SROM。

還遇到個噁心的問題,就是ping不通,一會說checksum bad,一會又是無任何提示的,直接給出”host is not
active“。這個問題足足浪費我一天時間,最後發現是防火牆問題,把系統防火牆關閉就正常。不過我在另一台台式機上測試,防火牆開了也沒啥影響,就是
在我這台筆記本上不行。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.