閱讀633 返回首頁    go 阿裏雲 go 技術社區[雲棲]


修正uboot網絡不可用

通過使用uboot的網絡功能可以更新ubook,燒寫內核,文件係統,如果網絡功能不可能,那還不如同變磚了一樣.當然如果支持sd卡啟動,可能通過sd卡完成這些功能,但是也太過麻煩了.飛淩的6410開發板提供的uboot的網絡驅動是cs8900,但是實際上網卡是dm9000ae.

燒入後發無法ping通,tftp不可用,輸出:

  1. CS8900 Ethernet chip not found?!  
CS8900 Ethernet chip not found?!
下麵,提供簡單的修改方法,把驅動改為dm9000,讓網絡功能用起來.

1.修改include/configs/smdk6410.h

  1. #ifdef  CONFIG_DRIVER_SMC911X      
  2. #undef  CONFIG_DRIVER_CS8900       
  3. #define CONFIG_DRIVER_SMC911X_BASE  0x18800300   
  4. #else   
  5. //注釋掉下麵3行   
  6. //#define CONFIG_DRIVER_CS8900  0   /* we have a CS8900 on-board */   
  7. //#define CS8900_BASE       0x18800300   
  8. //#define CS8900_BUS16      1   /* the Linux driver does accesses as shorts */   
  9. //增加下麵4行   
  10. #define CONFIG_DRIVER_DM9000                1   
  11. #define CONFIG_DM9000_BASE          0x18000000   
  12. #define DM9000_IO                   CONFIG_DM9000_BASE   
  13. #define DM9000_DATA                 (CONFIG_DM9000_BASE+4)   
  14. #define CONFIG_DM9000_USE_16BIT   
  15. //#define CONFIG_DM9000_DEBUG   
  16. #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
#endif
2.303行
從環境變量中讀取MAC地址
把((u16 *) bd->bi_enetaddr)[i] = read_srom_word(i);替換為:
  1. char *s, *e;  
  2. s = getenv ("ethaddr");  
  3. for (i = 0; i < 6; ++i)   
  4. {  
  5.     bd->bi_enetaddr[i] = s ? simple_strtoul (s, &e, 16) : 0;  
  6.     if (s)  
  7.         s = (*e) ? e + 1 : e;  
  8. }  
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)的值,修正第一次收不到數據的錯誤
  1. for (i = 0, oft = 0x16; i < 8; i++, oft++)  
  2.     DM9000_iow(oft,0x00);  
  3.     //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進行複位操作,否則會引起無法接受到數據的情況  
  1. void  
  2. eth_halt(void)  
  3. {  
  4.     DM9000_DBG("eth_halt\n");  
  5.   
  6.   
  7.     /* RESET devie */  
  8.     //phy_write(0, 0x8000); /* PHY RESET */   
  9.     //DM9000_iow(DM9000_GPR, 0x01); /* Power-Down PHY */   
  10.     DM9000_iow(DM9000_IMR, 0x80);   /* Disable all interrupt */  
  11.     DM9000_iow(DM9000_RCR, 0x00);   /* Disable RX */  
  12. }  
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

  上一篇:go SVN報錯:could not connect to server
  下一篇:go Java反射機製--Class類