天天看點

Lichee(一)­­ lichee目錄結構介紹和編譯指令

經過繁瑣的環境搭建和漫長的代碼下載下傳的等待,我們終于可以開始我們的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

它的主要作用是

  1. 管理包之間的依賴關系
  2. 生成ARM交叉工具鍊
  3. 生成U-Boot
  4. 制作根檔案系統,可以包含strace, directfb, oprofile等非常豐富的應用軟體和測試軟體
  5. 生成最終用于燒寫的固件包

它的目錄結構如下

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的腳本檔案,這個檔案就是我們實作自動化一步打包的腳本 具體過程如下圖

Lichee(一)­­ lichee目錄結構介紹和編譯指令

編譯代碼

首先,我們來看看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等全部搞定啦

繼續閱讀