经过繁琐的环境搭建和漫长的代码下载的等待,我们终于可以开始我们的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等全部搞定啦