我手頭的板子是學校的周立功MagicARM2410,原先上面有周立功的bootloader(應該也是U-boot),但是只有壹個bin文件,不提供源碼(很不厚道的說)。
開發環境就是我的虛擬機Vmware Workstation ACE版+Fedora12+esroot。
相關閱讀:U-Boot源代碼下載地址 /Linux/2011-07/38897.htm
強烈推薦Vmware Workstation ACE版,性能真強大,我原先的壹個fedora8的虛擬機映像用別的版本的Vmware Workstation都打不開,要不就是進不了圖形界面。在ACE版本下壹下子就打開了。
Fedora12經過這些天的使用,感覺還是很不錯的,應該說是最好用的fedora版本。交叉編譯等操作都沒出現過什麽問題,網絡功能也很好用,
設置虛擬機的時候選擇使用網橋,fedora12能方便的訪問window下的文件夾(該文件夾需設置為***享),也能方便的上網。做嵌入式linux的人
應該知道,上面這兩點是多麽的重要。
esroot就是我的秘密武器啦!是利用chroot構建的嵌入式linux的開發環境,或者叫山寨版的IDE。可以大幅提高開發效率,有效的管理開發相關的文件。有時間的時候在把這個東西寫上來。
U-boot移植到2410的方法網上資料已經很多了(參考/Linux/2011-02/32772.htm),
基本上是基於smdk2410(U-boot支持)再針對自己的板子做壹些修改。我們可以思考壹下在bootloader階段會用到板子的那些設備。如果
妳的U-boot只用於下載kernel(還有ramdisk等)和引導系統,那麽cpu,sdram,nor flash, nand
flash,串口,網卡也就基本夠了。 而通常所需要做的修改主要集中在2個部分:網卡和nand
flash。smdk2410選用的網卡是cs8900,而MagicARM2410是DM9000。smdk2410沒有對nand
flash的初始化,這部分也需要修改。
下面說說我遇到的問題,就是卡住我5個工作日的問題:DM9000不工作。
先說說我壹開始做的:
使用DM9000,需要修改my2410.h(復制於smdk2410.h),去掉原先cs8900的內容,改為DM9000的內容。如下:
#define CONFIG_DRIVER_DM9000 1
#define CONFIG_DM9000_BASE 0x18000300
#define DM9000_IO 0x18000300
#define DM9000_DATA 0x18000304
#define CONFIG_NET_MULTI
#define CONFIG_DM9000_USE_16BIT 1
#define CONFIG_DM9000_NO_SROM 1
//#define CONFIG_DM9000_DEBUG 0x01
DM9000的基地址0x18000300是由MagicARM2410的硬件結構決定的。它采用nGCS3片選DM9000,所以基地址為
0x18000300。CONFIG_DM9000_NO_SROM定義不從DM9000片內EEPROM讀取MAC地址,這個要設定,因為
MagicARM2410上的DM9000片內EEPROM管腳根本就都沒有接,全懸空著怎麽讀取MAC地址?!
CONFIG_DM9000_DEBUG選擇如果設為真的話,會使能dm9000x.c(DM9000驅動)串口會輸出更多的調試信息。
然後我改了壹點兒dm9000x.c,在最後的dm9000_initialize(bd_t
*bis)函數裏面加了壹條dm9000_init(dev,bis)。這樣U-boot啟動後會初始化壹次DM9000,否則在用到網卡時才進行初始化
(如使用PING,tftp命令等)。
這樣看來就沒什麽問題了。編譯通過,下載到板子上ok。上電後串口出現:
U-Boot 2009.11 (Dec 30 2009 - 00:04:33)
DRAM: 64 MB
Flash: 2 MB
*** Warning - bad CRC, using default environment
In: serial
Out: serial
Err: serial
Net: dm9000
SMDK2410 #
dm9000_init
resetting DM9000
resetting the DM9000, 1st reset
resetting the DM9000, 2nd reset
ERROR: resetting DM9000 -> not responding
dm9000 not found at 0x18000300 id: 0x00000000
網卡燈不亮,PC顯示本地連接斷開。
問題出現了。然後就是
do{
google,baidu...
修改
編譯
下載
上電
試驗
}while(網卡工作)
但是5天都沒跳出這個循環,逐漸變的食之無味,睡之不香...
不過,在調試中,我也變得越來越了解U-boot。通過查看dm9000x.c,發現初始化的第壹步dm9000_reset就沒過去,在這壹步,
程序會檢測DM9000的ID是不是0x90000a46,如果不是,就打印“resetting DM9000 -> not
responding”
開始懷疑是AEN腳的使能信號(DM9000的AEN連接cpu的nGCS3)沒傳過來,應該是傳送壹個低電平並持續10us。上示波
器!DM9000的管腳太密測起來也挺困難。結果發現這個信號是沒問題的,確實送來了壹個低電平。這也說明了0x18000300這個網卡基地址是沒錯
的。繼續郁悶...
直到今天,在下決心仔細再看壹編DM9000的芯片資料後,終於靈光壹顯,發現了壹個RST管腳。這是個硬件復位管腳,高電平復位。上示波器!原來...,它竟然壹直是高電平!總在復位,片子怎麽工作呢?!
直接把它接地,重啟,網卡燈亮啦!!!
串口輸出:
SMDK2410 #
dm9000_init
resetting DM9000
resetting the DM9000, 1st reset
resetting the DM9000, 2nd reset
dm9000 i/o: 0x18000300, id: 0x90000a46
DM9000: running in 16 bit mode
MAC: 00:14:97:0f:00:00
然後ping,tftp下載都ok啦。調通心情好:)