Tuesday, November 06, 2007

在 KB9202B (AT91RM9200 core) 上安裝新 Kernel - 使用 u-boot

KB9202BKwikbyte 推出的 ARM920T 學習板,核心是使用 Atmel 製造的 AT91RM9200 。最近花了很多時間在學這張板子,雖然有一些概念了,也懂的怎麼使用內建的 linux 系統,但是離入門還有點距離。

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

KB9202Bu-boot 設定參數中,會告訴 u-boot 要到 0x10000000 的位址去載入 kernel image。如何看到 u-boot 的設定呢?
  1. 在開機時,當出現 "Hit any key to stop autoboot:" 時按下任意鍵,就可以進入 u-boot 的環境。
  2. 輸入 "printenv" 找到 bootcmd 這個變數。
KB9202B 的預設值是︰"bootcmd=bootm 0x10000000" ,因此 u-boot 會在開機時,到 0x10000000 的位址去載入 kernel image。而且只要修改 bootcmd 這個變數就可以自由改變 linux kernel 放置的位址。事實上,如果透過 flinfo 的指令,可以發現 KB9202B 的 Flash 位址就是介於0x10000000 ~ 0x10FE0000 之間,所以 kernel image 是存放在 Flash 內的。

那怎麼把編好的 kernel 放到 0x10000000 位址呢?我參考了u-boot 線上說明文件(這篇是說明如何安裝新的 u-boot),整理如下,

1.將編好的 kernel image - uImage 放到 host 的 tftpboot 的目錄下。

2.設定好 u-boot 的環境變數︰
#設定 ARM 板子的 IP
U-Boot> setenv ipaddr 192.168.xxx.xxx

#設定 host 的 IP
U-Boot> setenv serverip 192.168.xxx.xxx

#儲存變數到 EEPROM
U-Boot> saveenv
3. 下載及安裝 linux kernel image
#使用 tftp 下載 kernel 到 0x2000d000 (這個位置是暫存區),假設大小為 31c8d0
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
4.重開機
U-Boot> reset
接下來要再看看怎麼使用 GPIO api 了

3 comments:

Gene said...

你搞定了哦
怎麼把壞掉的U-boot回來的
好奇中........

chinsonyeh said...

這是在搞壞之前寫的啊@_@

chinsonyeh said...

u-boot救回來了,
而且把新的 b-boot 跟新的 linux kernel 裝進去了 XD