經過繁瑣的環境搭建和漫長的代碼下載下傳的等待,我們終于可以開始我們的lichee之旅了,由于内容很繁雜,涉及面比較廣,接下來就針對linux uboot modules等是如何被打包到固件這條主線來分析,先理清樹幹,再慢慢理清枝葉吧!
先認識一下什麼是Lichee: Lichee表示全志科技A10晶片的開發代号,英 [,laɪ'tʃiː] 美 [,laɪ'tʃi] 荔枝的意思, 跟魔獸裡面的巫妖lich沒有關系哈 ^_^!
目錄結構
.
├── boot
├── buildroot
├── build.sh
├── linux-3.0
├── out
├── README
├── tools
└── u-boot
buildroot
它的主要作用是
- 管理包之間的依賴關系
- 生成ARM交叉工具鍊
- 生成U-Boot
- 制作根檔案系統,可以包含strace, directfb, oprofile等非常豐富的應用軟體和測試軟體
- 生成最終用于燒寫的固件包
它的目錄結構如下
buildroot/
|-- board
|-- boot
|-- CHANGES
|-- Config.in
|-- configs
|-- COPYING
|-- dl
|-- docs
|-- fs
|-- linux
|-- Makefile
|-- package
|-- readme.txt
|-- scripts
|-- target
|-- tools
`-- toolchain
其中,boot目錄裡存放Boot代碼,config目錄裡存放預定義好的配置檔案,比如我們的sun4i_defconfig,dl目錄裡存放已經下載下傳好的軟體包,scripts目錄裡存放buildroot運作的代碼,target目錄裡存放用于生成根檔案系統的一些規則檔案,在tools目錄中存放的是用于打包和量産的pc工具。對于我們來說最為重要的是package目錄,裡面存放了将近3000個軟體包的生成規則,我們可以在裡面添加我們自己的軟體包或者是中間件。更多關于buildroot的介紹,可以到buildroot的官方網站http://buildroot.uclibc.org/擷取。
linux-3.0
目錄結構如下,
linux-3.0/
|-- arch
|-- block
|-- build
|-- COPYING
|-- CREDITS
|-- crypto
|-- Documentation
|-- drivers
|-- firmware
|-- fs
|-- include
|-- init
|-- ipc
|-- Kbuild
|-- kernel
|-- lib
|-- MAINTAINERS
|-- Makefile
|-- mm
|-- modules
|-- net
|-- output
|-- README
|-- REPORTING-BUGS
|-- rootfs
|-- samples
|-- scripts
|-- security
|-- sound
|-- tools
|-- usr
`-- virt
以上目錄結構跟标準的Linux核心是一緻的,除了多一個modules目錄。modules目錄是我們擴充用來存放沒有跟核心的menuconfig內建的外部子產品的地方。我們目前放了example, mali和wifi這3個外部子產品,其中example是示例用的,mali是我們的3D GPU驅動。
linux-3.0/modules/
├── cedarx
├── example
├── gps
├── mali
├── nand
└── wifi
tools 基本作用: 1. 不同晶片不同産品的內建打包功能 2. 不同産品的特殊配置,例如分區、各種外設的配置、CPU頻率電壓等,基本上涵蓋了配置一款産品的所有功能 3. 制作固件包時可能用到的工具和腳本
目錄結構 tools
├── daily_build
├── pack
└── tools_win
tools目錄是非常重要的,daily_build存放的是各種版本各種型号的自動化腳本
目錄結構 tools/daily_build/
├── android_clean.sh
├── auto_crane_2.6.sh
├── auto_crane_3.0.sh
├── auto_linux_2.6.sh
├── auto_linux_3.0.sh
├── auto_linux_3.0_sun5i_a12.sh
├── auto_linux_3.0_sun5i_a13.sh
├── build_android4.0.sh
└── clean.sh
這些腳本目前僅僅作為參考,因為在目前的sun4i這個版本中,沒有用到其中任何一個腳本
目錄結構 tools/pack/
├── chips
├── out
├── pack
├── pack.bat
├── pctools
├── sun4i_crane_test1.img
└── sun4i_crane_test2.img
pack是一個非常關鍵的目錄,chips存放着各種制造商的配置,當然後面的移植過程中将會重點提到,out目錄是打包過程中産生的各種bin、cfg、fex檔案,為最終的img打封包件做準備;pack腳本是将out目錄中的各種檔案打包的腳本,後面也會專門探讨,pack.bat很顯然是windows平台下打包的批處理腳本,pctools是windows linux2種平台中打包過程中可能用到的小工具,暫時還沒有用到;sun4i_crane_xxx.img就是我們通過pack打包生成的固件,可以直接燒寫到目标闆,其中sun4i代表是晶片版本(還有sun5i sun6i等) crane代表是android的固件,xxx代表是産品名,都是自己起的
u-boot
目錄結構 u-boot/
├── api
├── arch
├── board
├── boards.cfg
├── build.sh
├── common
├── config.mk
├── COPYING
├── CREDITS
├── disk
├── doc
├── drivers
├── examples
├── fs
├── include
├── lib
├── MAINTAINERS
├── MAKEALL
├── Makefile
├── mkconfig
├── mmc_spl
├── nand_spl
├── nand_sunxi
├── net
├── onenand_ipl
├── post
├── README
├── rules.mk
├── snapshot.commit
├── spl
├── System.map
├── tools
├── u-boot
├── u-boot.bin
├── u-boot.lds
├── u-boot.map
└── u-boot.srec
其中build.sh就是用來編譯u-boot
build.sh
打包的腳本,細心的人應該已經觀察到,在buildroot linux3.0 u-boot目錄中都存在一個build.sh的腳本檔案,這個檔案就是我們實作自動化一步打包的腳本 具體過程如下圖
編譯代碼
首先,我們來看看build.sh的usage
NAME
build - The top level build script for Lichee Linux BSP
SYNOPSIS
build [-h] | [-p platform] [-k kern_version] [-m module] | pack
OPTIONS
-h Display help message
-p [platform] platform, e.g. sun4i, sun4i-lite, sun4i-debug, sun4i_crane
sun4i: full linux bsp
sun4i-lite: linux bsp with less packages
sun4i-debug: linux bsp for debug
sun4i_crane: android kernel
-k [kern_ver] 2.6.36(default), or 3.0 [OPTIONAL]
-m [module] Use this option when you dont want to build all. [OPTIONAL]
e.g. kernel, buildroot, uboot, all(default)...
pack To start pack program
Examples:
./build.sh -p sun4i
./build.sh -p sun4i_crane
./build.sh -p sun4i-lite
./build.sh pack
我們目前的平台是android,是以platform 要選 sun4i_crane 目前的核心版本是linux3.0 ,是以kern_ver 是3.0 如果不帶-k參數,當然就是預設的2.6.36
是以我們的編譯指令就是
$./build.sh -p sun4i-crane -k 3.0
太友善了! 一條指令把linux uboot 自定義的modules和configs等全部搞定啦