出來半年了,感覺學到的關於技術方面的東西很少很少,更多的是對軟體大環境和行業有了更多的瞭解,為了鞏固以前學過的知識和學習新的知識,我決定移植一個uboot到我的mini2440開發板上。
一、準備工作:包括兩方面,一方面是知識儲備,也即是移植uboot前必須清楚明白的一些基本原理和常識。另一方面是搭建環境。
首先 知識儲備,uboot是什嗎?U-Boot 是bootloader的一種,是 Das U-Boot 的簡稱,其含義是 Universal Boot Loader,是遵循 GPL 條款的開放源碼項目。最早德國 DENX 軟體工程中心的 Wolfgang Denk 基於 8xxROM 和 FADSROM的源碼建立了 PPCBoot 工程項目,此後不斷添加處理器的支援。而後,Sysgo
Gmbh 把PPCBoot 移植到 ARM 平台上,建立了 ARMBoot 工程目。最終,以 PPCBoot 工程和ARMBoot 工程為基礎,建立了 U-Boot 工程,2002 年 12 月 17 日第一個版本 U-Boot-0.2.0發布,同時 PPCBoot 和 ARMBoot 停止維護。
那什麼是bootloader?先來看看linux系統中軟體的結構:
一般情況下嵌入式 Linux 系統中的軟體主要分為以下幾部分:
1) 引導載入程式:其中包括內部 ROM 中的固化啟動代碼和 BootLoader 兩部分。內部固化 ROM 是廠家在晶片生產時候固化的,作用基本上是引導 BootLoader。有的晶片比較複雜,比如 Omap3 在 flash 中沒有代碼的時候有許多啟動方式:USB、UART 或乙太網路等等。而 S3C24x0 則很簡單,只有 Norboot 和 Nandboot。
2) Linux kernel 和 drivers。
3) 檔案系統。包括根檔案系統和建立於 Flash 記憶體裝置之上的檔案系統(EXT4、UBI、CRAMFS 等等)。它是提供管理系統的各種設定檔以及系統執行使用者應用程式的良好運行環境及載體。
4) 應用程式。使用者自訂的應用程式,存放於檔案系統之中。
具體結構如:
bootloader做了什嗎?在 CPU 剛上電啟動的時候,一般連記憶體控制器都沒有初始化過,根本無法在記憶體中運行程式,更不可能處在 Linux 核心啟動環境中。為了初始化CPU 及其他外設,使得 Linux核心可以在系統主存中運行,並讓系統符合 Linux 核心啟動的必備條件,必須要有一個先於核心啟動並執行程式,他就是所謂的引導載入程式(bootloader)。而 BootLoader 並不是 Linux 才需要,而是幾乎所有運行作業系統的裝置都需要。我們的PC
的 BOIS 就是 Boot Loader 的一部分(只是前期引導,後面一般還有外存中的各種 BootLoader)。對於linux pc來說,bootloader = BIOS + GRUB/LILO。
再來說第二方面,開發環境搭建。所謂開發環境,就是指如何得到一個uboot的bin檔案,並將這個bin檔案燒寫到開發板中。如何得到一個bin檔案?從uboot官網上下載一個uboot的源碼包,解壓到linux環境中通過一些列移植,最終交叉編譯即可。我的開發環境是ubuntu12.04,編譯器是友善之臂提供的交叉編譯器arm-linux-gcc-4.4.3。如何燒寫到開發板中?可以使用HJTAG通過並口燒寫到nandflash中。由於友善之臂提供的supervivi具有下載和燒寫功能,所以一種較為簡單的方法是可以通過supervivi+dnw通過usb完成該過程。具體方法可以參照友善之臂提供的手冊。