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“。這個問題足足浪費我一天時間,最後發現是防火牆問題,把系統防火牆關閉就正常。不過我在另一台台式機上測試,防火牆開了也沒啥影響,就是
在我這台筆記本上不行。