天天看点

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等全部搞定啦

继续阅读