修正uboot網絡不可用
通過使用uboot的網絡功能可以更新ubook,燒寫內核,文件係統,如果網絡功能不可能,那還不如同變磚了一樣.當然如果支持sd卡啟動,可能通過sd卡完成這些功能,但是也太過麻煩了.飛淩的6410開發板提供的uboot的網絡驅動是cs8900,但是實際上網卡是dm9000ae.
燒入後發無法ping通,tftp不可用,輸出:
- CS8900 Ethernet chip not found?!
CS8900 Ethernet chip not found?!下麵,提供簡單的修改方法,把驅動改為dm9000,讓網絡功能用起來.
1.修改include/configs/smdk6410.h
- #ifdef CONFIG_DRIVER_SMC911X
- #undef CONFIG_DRIVER_CS8900
- #define CONFIG_DRIVER_SMC911X_BASE 0x18800300
- #else
- //注釋掉下麵3行
- //#define CONFIG_DRIVER_CS8900 0 /* we have a CS8900 on-board */
- //#define CS8900_BASE 0x18800300
- //#define CS8900_BUS16 1 /* the Linux driver does accesses as shorts */
- //增加下麵4行
- #define CONFIG_DRIVER_DM9000 1
- #define CONFIG_DM9000_BASE 0x18000000
- #define DM9000_IO CONFIG_DM9000_BASE
- #define DM9000_DATA (CONFIG_DM9000_BASE+4)
- #define CONFIG_DM9000_USE_16BIT
- //#define CONFIG_DM9000_DEBUG
- #endif
#ifdef CONFIG_DRIVER_SMC911X #undef CONFIG_DRIVER_CS8900 #define CONFIG_DRIVER_SMC911X_BASE 0x18800300 #else //注釋掉下麵3行 //#define CONFIG_DRIVER_CS8900 0 /* we have a CS8900 on-board */ //#define CS8900_BASE 0x18800300 //#define CS8900_BUS16 1 /* the Linux driver does accesses as shorts */ //增加下麵4行 #define CONFIG_DRIVER_DM9000 1 #define CONFIG_DM9000_BASE 0x18000000 #define DM9000_IO CONFIG_DM9000_BASE #define DM9000_DATA (CONFIG_DM9000_BASE+4) #define CONFIG_DM9000_USE_16BIT //#define CONFIG_DM9000_DEBUG #endif2.303行
從環境變量中讀取MAC地址
把((u16 *) bd->bi_enetaddr)[i] = read_srom_word(i);替換為:
- char *s, *e;
- s = getenv ("ethaddr");
- for (i = 0; i < 6; ++i)
- {
- bd->bi_enetaddr[i] = s ? simple_strtoul (s, &e, 16) : 0;
- if (s)
- s = (*e) ? e + 1 : e;
- }
char *s, *e; s = getenv ("ethaddr"); for (i = 0; i < 6; ++i) { bd->bi_enetaddr[i] = s ? simple_strtoul (s, &e, 16) : 0; if (s) s = (*e) ? e + 1 : e; }3.修改318行,修改0x00為0xff
修改MAR寄存器(Multicast Address Register)的值,修正第一次收不到數據的錯誤
- for (i = 0, oft = 0x16; i < 8; i++, oft++)
- DM9000_iow(oft,0x00);
- //DM9000_iow(oft, 0xff);
for (i = 0, oft = 0x16; i < 8; i++, oft++) DM9000_iow(oft,0x00); //DM9000_iow(oft, 0xff);4.413行
注釋掉下麵2行
修正一直無法收到數據的錯誤,不要每次調用halt的時候都對PHY進行複位操作,否則會引起無法接受到數據的情況
- void
- eth_halt(void)
- {
- DM9000_DBG("eth_halt\n");
- /* RESET devie */
- //phy_write(0, 0x8000); /* PHY RESET */
- //DM9000_iow(DM9000_GPR, 0x01); /* Power-Down PHY */
- DM9000_iow(DM9000_IMR, 0x80); /* Disable all interrupt */
- DM9000_iow(DM9000_RCR, 0x00); /* Disable RX */
- }
void eth_halt(void) { DM9000_DBG("eth_halt\n"); /* RESET devie */ //phy_write(0, 0x8000); /* PHY RESET */ //DM9000_iow(DM9000_GPR, 0x01); /* Power-Down PHY */ DM9000_iow(DM9000_IMR, 0x80); /* Disable all interrupt */ DM9000_iow(DM9000_RCR, 0x00); /* Disable RX */ }這裏隻是根據別人的文章進行實現,的確可行,但是具體為什麼這麼做還有些問題需要自己去弄明白.
最後更新:2017-04-03 12:53:54