close
         u-boot , 是早期由ARM-Boot所衍化出來的一個 , 能在ARM上所使用之boot loader. 因為使用者基於是一個Open source 的萬用bootloader , 故u-boot(Universal bootloader) , 就這樣應蘊而生. 第一個plarform 是po 在PowerPc(ppc) 的平台上 , 接著像是ARM等處理器等平台 , 也在Maintainer及廣大的Linux愛好者的努力下 , 被建構了出來...



        因為廣大使用者的愛好 , 加上坊間也有許多的書籍 , 拿u-boot當成入門bootload的範例. 也因此可以應用的資源也算是不少. u-boot在載入測試平台前 , 需先編譯成為二進制檔(bin) , 或是十六進制的S-Record檔(srec. Motorola格式) , 這在Binutils的套件中 , 有許多工具程式可以應用. 而在u-boot的指令稿中(Makefile) , 也早已編入成為必備的程序 , 所以在編譯成功的結果. 會得到u-boot.bin , u-boot.srec. u-boot.smap , u-boot等四個不同格式的檔案. 接下來 , 我們就看看編譯的步驟為何:

         u-boot從早期的0,x,x版本開始 , 一直到1.0.0版 , 到最新的1.3.1版 , 演化出許多不同的版本. 使用這可以在das u-boot上找到相關版本的訊息 , 但也別忘了 ,  在source code 下載後, 去看看裏面的README檔案 , 那可是有許多有用的信息喔.

         要編譯u-boot , 當然不可以少了cross compile tools. 在Das u-boot裏 , 提供了ELDK(Embedded Linux Development Kit)套件. 可以透過不同的方式 , 將其由ftp網站下載拿到. 不過 , 要注意的一件事  , ELDK也有版本的分別 , 最新的版本是4.1  , 而最早的是2.10版 , 如果下載了早期的ELDK , 就無法編譯較新版本的u-boot source喔 , 這在套件裏的 distribution目錄下的README.html檔裏, 都會有清楚的說明(懶的看完全部的話 , 可以直接看該檔案的後段的List of Target Packages描述). 另外 , 也並非所有的ELDK都有支援ARM 的架構 , 這可以在一點進ELDK的套件目錄中 , 就可以看到支援不同系統的版本 , 像是ARM 系統的 , 就是arm-linux-x86 , 如果是Power PC版本 , 就是ppc-linux-86. 以我們現在用的是ARM Architecture的cpu , 所以就下載arm-linux-x86的那一個版本吧.

        經過我幾次錯誤的經驗後 , 所得的結果是

        u-boot 1.1.4以後的版本 , 就必須使用ELDK4.0以上的版本 (像是 u-boot 1.1.4~1.2.0)
        u-boot 1.3.0以後的版本 , 建議使用ELDK4.1(像是 u-boot 1.3.0~1.3.1)
       
至於最新的ELDK , 是否能適用於u-boot 1.0.0以前的版本 , 我沒試過 , 所以不得而知了.   Das u-boot裏面有提到 , 一個distribution的ELDK套件 , 大約要790MB , 相當的龐大 , 主要是因為裏頭包了許多的套件 , 除了cross compile tools , 還有像是makeimage  , nfs , tftp等許多可以利用rpm built進去的套件 , 這對當我們許要透過主機(Host) , 將kernel image載入到利用u-boot當bootloader啟動的裝置時 , 就會發出其功效. 當然啦 , 如果你覺得麻煩 , 那也可以去build 像是gcc 或是binutils等各套件 或是透過各大網站上去找已經build好的corss compile tool chain , 不過就還是得鰾注意一下它們的版本 , 是否與u-boot 不同版本的source code相match了唷.

        理解過如何編譯u-boot的方式後 , 再來我們就要將工具準備好......也就是要讓u-boot的source在編譯的過程中 , 能找到arm-linux-gcc等相關的編譯工具. 如果你不是使用ELDK的工具的話 , 我想在你應該在找這些相關工具的過程中 , 已經知道如何使用它們了 , 不過還是提醒一下 , 別忘了將執行檔的目錄(bin ) , 串在路徑($PATH)中喔. 這常會不經意的遺忘了. 至於使用ELDK套件的方式 , 則必須先做install的程序.我們可以在你下載的distribution中, 找到一個名為install的檔案 , 執行它, 它就會自動的把所有套件 , 利用rpm的方式解到你指定的目錄中. 不過在執行install 這個檔案前 , 先把檔案的執行權限打開 , 或許是當初因為允許製成光碟(iso960 format) , 所以install 檔的權限是 " Read Only " , 所以設定好權限後 , 就可以執行下列的程序來進行安裝. 
(再幾次安裝過程 , 得到經驗是 , 在執行install的目錄 , 不能跟目的的目錄是同一個. 要不會找不到 rpm裏面的相關套件檔)       

        # . /install  [ -d dir] [ cpu]  

         dir 指的是你預定要存放的目錄
         cpu 則是你想使用的cpu規格

如果這兩個參數都不寫 , 則install會直接安裝在現在的目錄 , 並且所有的cpu type都會被安裝進去. 詳細的資料 , 可以詳閱distribution中的README html page.  安裝完後的bin檔 , 是放在 " installRoot/usr/bin " 中, 別被外頭幾個arm-linux或是 arm等檔案給騙了喔.
 

         為了能先試用u-boot 與現有手上kaise套件的相容性 , 我選用了u-boot 1.2.0的版本 , 裏頭已經有built好的測試平台 sbc2410x , 因此 , 我下載了相對應的ELDK 4.0 , 來進行編譯. 而編譯u-boot的程序很簡單 , 可分為下列三步驟:

         1.make distclean 
            (可以清除之前相關編譯 , 或是設定的舊資料 , 為了穩定 , 建議執行 , 但並非必要動作)

         2.make sbc2410x_config
            (依照不同的mpu平台 , 先行做config的動作 , 如果是smdk2410的平台 , 就敲smdk2410_config. 這都是在Makefile中先定義好的)

         3 make CROSS_COMPILE=arm-linux-
            (CROSS_COMPILE是Makefile中 , compile prefix所引用的變數 , 在這個case中 , 使用到的都是arm-linux-gcc, arm-linux-objcopy等程式 , 所以prefix指令變數就設為 arm-linux-)

        4.make
           (利用 Makefile 及rules.mk 進行 compiler  , 並透過 u-boot.lds loader 對image 進行位置配置)

執行步驟四後 , 就可以看到一大堆的compile過程 , 在螢幕上run了起來 , 如果之前的程序及版本都對的話 , 以686等級的電腦, 大概就3~5分鐘就會編譯完成. 如果你能在u-boot的folder中, 找到u-boot.bin 等四個相關檔案.  就代表u-boot得編譯程序.....成功.     



[ ELDK套件的FTP下載點

[ u-boot source code 的FTP下載點 ]

[ ELDK 4.0版本的README file Link ]

[ ARM-LINUX Cross Compile Tools chain 的下載點 ]



編按 :

         在使用ELDK套件前 , 我曾試過由ARM-Linux 網站中所下載的cross-compile tool chain 2.95.33.3.3兩個版本來編譯u-boot source. 結果得 , 2.95.3 版來編u-boot 0,4,x 版的source是ok的 , 但編1.x.x 版就出現了問題 , 而3.3.3版本的tool chain 可以編譯到1.0.x~1.1.3 版的u-boot source是成功了, 但之後的版本就會出現一些像是compiler不符合程序的錯誤行為.  但如果拿3.3.3 版來編u-boot-0.2.x 版的source , 是否就能cover呢? 答案也是不行. 所以這就驗證O'REILLY出版的Building Embedded Linux一書中所提到說 , 不同版本的kernel及cross compiler tool chain , 往往會有很多難以憶測的結果., 也因此建議使用已經知道的成熟版本來編譯 , 成功的機會就會提高許多.


後記:

              在一段時間 , 使用u-boot 的編譯後 ,  有了下面幾項心得 :
        
              一. 除了第一次編譯必須要執行   make distclean ,  make sbc2410x_config , 其他時後 , 要編譯只要執行 make 就可以了

              二. 有的時後 , 單純的只想移除一些編譯過程所產生的檔案 , 像是 .a or .obj 等 , 只要執行 make clean 就行了.

              三. 在 u-boot 中, 因為有透過一些 script 去分析你現在的 CPU 架構 , 而設置了 CROSS_COMPILE的 prefix. 像是我們現在用的是arm-linux- , 所以也不一定要執行像是 make CORSS_COMPILE=arm-linux- 來做為設定. 但如果 script 中沒有載明 , 而我們也沒有在 shell 下提示 , 就會在編譯時 , 出現錯誤喔.

arrow
arrow
    全站熱搜

    jslinux 發表在 痞客邦 留言(0) 人氣()