2014年8月31日 星期日

Embedded Linux on Cubieboard2 (II): Kernel

本篇Outline


  1. Kernel 開機所需檔案
  2. Building Kernel

Kernel 開機所需檔案

    前一篇最後講完了 U-boot 的事,但如果要讓 cb2 開機,還需要一些設定檔。第一個要講的是 script.bin。
 
    script.bin 基本上是 cb2 自己的硬體設定檔,供設定的參數非常的多種,它也是個 binary 檔,原來的文本不用自己寫,官方已經有寫好了,可從 linux sunxi 的 github 抓取。
git clone https://github.com/linux-sunxi/sunxi-boards.git
script.bin 原來的文本副檔名是 .fex,而 cb2 的 fex 檔位於 sunxi-boards/sys_config/a20/cubieboard2.fex。所有可設定的硬體參數都在這個官方文件裡,在這邊我要提起的一個設定是 MAC address 問題。cb2 本身有 EMAC 的功能,簡單來說就是動態獲取 MAC address,當然你也可以把它關掉使用靜態 address,但必須要注意的是 fex 檔裡絕對不能鬧雙包,也就是同時使用 EMAC 及靜態 address,鬧雙包的話他不會噴錯,但核心網路界面就會莫名其妙的不見了。如果你要使用靜態 MAC (預設是 EMAC ),就在 fex 檔裡加入下列文字。
[dynamic]
MAC="你的address"
接著找到檔案裡的 emac_para 區段(也就是找到"[emac_para]"),把第一行 "emac_used=1" 改成 "emac_used=0"。
接下來要把 fex 檔轉換成 binary 檔,需要 linux sunxi 的工具。
git clone https://github.com/linux-sunxi/sunxi-tools.git
切換到 sunxi-tools 目錄之後,建置 fex2bin。
make fex2bin
轉換 fex 檔。
fex2bin cubieboard2.fex ./script.bin

    接著要講boot.scr。boot.scr 是 U-boot 開機時會讀取的 binary 設定檔,它原來的文本( boot.cmd )是一個腳本,可以在裡面寫你要執行的 U-boot 指令。boot.scr 並非必要,沒有它 U-boot 還是有自己的預設值,雖然如此,我還是親手來寫一遍比較有感覺吧。我在 boot.cmd 裡第一條要寫的是設定 kernel argument。cb2 完整的 kernel arguments 在這個網站,但在這邊,我只要設定最重要的幾個。
setenv bootargs console=ttyS0,115200 root=/dev/mmcblk0p2 rootwait panic=10
" setenv bootargs" 是 U-boot 的指令,後面接的那些才是真正的 kernel arguments,上例是用於把 boot 分割區獨立畫出來的情況,所以 root 參數,也就是根檔案系統的位置,是在 p2,如果是沒分開來的情況就要寫 root=/dev/mmcblk0p1。接下來要寫的就是載入核心以及 script.bin,這裡採用的方法是先把他們載到一個記憶體位址再用 bootm 指令開機。
fatload mmc 0 0x43000000 script.bin
fatload mmc 0 0x48000000 uImage
fatload 顧名思義就是從 FAT 型態檔案系統裡載入所需檔案,因此,如果你沒有把 boot 分割區特別畫出來,核心等檔案放在 boot 資料夾且檔案系統是用 ext2 的話,就要這樣寫。
ext2load mmc 0 0x43000000 boot/script.bin
ext2load mmc 0 0x48000000 uImage boot/uImage
接著就是開機的指令了。
bootm 0x48000000
上面講的就是要寫進 boot.cmd 的指令。最後一步是把文本轉成 binary 檔,這裡需要 mkimage 工具,沒有意外的話是包含在 U-boot 原碼裡,跟 U-boot 主體一起編譯好了,位於 U-boot 目錄底下的 tools 資料夾。
mkimage -C none -A arm -T script -d ./boot.cmd boot.scr
boot.scr 也是放在 boot 分割區(或是 boot 資料夾)裡,U-boot 開機時自己會去找。如果你之後開機時出現 machine id 不被 kernel 接受的錯誤,就先記下接受的 machine id,接著用下方指令在 boot.cmd 中設定。(假設 kernel 接受的 id 是 0xf0)
setenv machid 0xf0

Building Kernel

    編譯 kernel 這個步驟相較於前面,顯的非常簡單。首先把官方改過得 kernel 抓下來。
git clone https://github.com/cubieboard2/linux-sunxi.git -b sunxi-3.4-cb2
要注意的是不要用 cb2 的 3.3 kernel,不僅問題很多(我連開機都開不起來),貌似也沒有繼續維護了。

接著設定環境。
export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabihf-
套用 cb2 預設 config。
make cubieboard2_defconfig
祈禱不會出錯吧
make all modules
建置 uImage。要注意建置 uImage 需要 mkimage 工具喔
make uImage
基本的 kernel 建置就這麼簡單,下一篇會開始講 user space 的事。

沒有留言:

張貼留言