KB9202B 板子上提供有 GPIO 埠,但是如果要使用的話,似乎要自行把針腳焊接上去。不過目前的問題卡在,在程式中該怎麼存取系統的 GPIO ,尤期原廠沒有提供相關的資訊。根據 Linux 2.6.21 報馬仔 這篇的說明,2.6.21 的 linux kernel 提供有 GPIO api ,可省去自行撰寫驅動程式的過程,因此我就想嘗試將 kernel 升級。
KB9202B 的說明文件中,有說明如何建立 linux host 的開發環境,及如何編譯新板的 u-boot 、linux kernel。可是奇怪的是,linux kernel編好了之後,只說放到 tftpboot 的目錄下就沒了...囧
後來我進入 u-boot 模式,亂用 tftp 下載 kernel 後,系統每次在載入 kernel 時就會失敗,糗了@@。不過可說是塞翁失馬,焉知非福啦,因為這樣,逼的我去學 u-boot 了。
u-boot 是個類似 grub, lilo 等 linux x86 系統常用的開機程式,但是專用於各種嵌入式系統的應用。在 PC 系統中,linux kernel 通常是放在 /boot 或是系統根目錄(/) 下,但是在嵌入式系統的應用下,linux kernel 的放置位址通常與 root file system 是分開的,在 KB9202B 中,預設是放置在 NOR Flash 上,Flash Filesystems 的介紹可參考 Flash Filesystems for Embedded Linux Systems 。
在 KB9202B 的 u-boot 設定參數中,會告訴 u-boot 要到 0x10000000 的位址去載入 kernel image。如何看到 u-boot 的設定呢?
KB9202B 的預設值是︰"bootcmd=bootm 0x10000000" ,因此 u-boot 會在開機時,到 0x10000000 的位址去載入 kernel image。而且只要修改 bootcmd 這個變數就可以自由改變 linux kernel 放置的位址。事實上,如果透過 flinfo 的指令,可以發現 KB9202B 的 Flash 位址就是介於0x10000000 ~ 0x10FE0000 之間,所以 kernel image 是存放在 Flash 內的。
- 在開機時,當出現 "Hit any key to stop autoboot:" 時按下任意鍵,就可以進入 u-boot 的環境。
- 輸入 "printenv" 找到 bootcmd 這個變數。
那怎麼把編好的 kernel 放到 0x10000000 位址呢?我參考了u-boot 線上說明文件(這篇是說明如何安裝新的 u-boot),整理如下,
1.將編好的 kernel image - uImage 放到 host 的 tftpboot 的目錄下。
2.設定好 u-boot 的環境變數︰
#設定 ARM 板子的 IP3. 下載及安裝 linux kernel image
U-Boot> setenv ipaddr 192.168.xxx.xxx
#設定 host 的 IP
U-Boot> setenv serverip 192.168.xxx.xxx
#儲存變數到 EEPROM
U-Boot> saveenv
#使用 tftp 下載 kernel 到 0x2000d000 (這個位置是暫存區),假設大小為 31c8d04.重開機
U-Boot> tftp 2000d000 uImage
#開啟 0x10000000 ~ 0x104fffff 之間的保護
U-Boot> protect off 10000000 104fffff
#將0x10000000 ~ 0x104fffff 的資料抹除
U-Boot> era 10000000 104fffff
#將暫存於 0x2000d000 的 kernel image 複製到 0x10000000 ,這個過程式滿久的#時間,請耐心等待
U-Boot> cp.b 2000d000 10000000 31c8d0
U-Boot> reset接下來要再看看怎麼使用 GPIO api 了
3 comments:
你搞定了哦
怎麼把壞掉的U-boot回來的
好奇中........
這是在搞壞之前寫的啊@_@
u-boot救回來了,
而且把新的 b-boot 跟新的 linux kernel 裝進去了 XD
Post a Comment