Allwinner H5提供了Lichee Linux BSP,其主要由brandy、buildroot、linux-3.10、tools这几个目录组成,能够实现Linux系统的开发构建。
1. Lichee目录结构
1.1. brandy目录
arm-trusted-firmware-1.0为TrustZone软件参考实现,提供了一个可信、安全的执行环境。
basic_loader为boot0的源码,芯片上电启动后,最先运行boot0的代码,然后再加载其它bootloader(如uboot)。
pack_tools为各个打包工具源码。
toolchain为交叉编译器存放目录路径,32位的uboot交叉编译工具链以及64位内核交叉编译工具链应放在该目录。
u-boot-2014.07为uboot源码,包括了H5的boot0源码。
1.2. buildroot目录
buildroot目录主要管理包之间的依赖关系,包含各个Lichee编译脚本,管理BSP的编译。
1.3. linux-3.10目录
linux-3.10目录为Allwinner平台内核源码。
1.4. tool目录
tool目录为打包目录,与打包相关的脚本和工具,以及BSP的配置都放在该目录。
2. Lichee编译
进入lichee目录,lichee编译包括uboot的编译,linux内核的编译,打包生成镜像这三个步骤。把交叉编译工具链gcc-linaro-aarch64.tar.xz和gcc-linaro-arm-4.6.3.tar.xz复制到/lichee/brandy/toolchain目录。
2.1. 方案板配置
Lichee作为一个通用的软件平台,可以适应用户不同的方案。通过给出一个对应的配置,用户的方案就可以自动运行,而不需要修改系统里面的代码或参数。
\lichee\tools\pack\chips\sun50iw2p1\configs目录下包含了各个方案的硬件板级配置文件及开机logo,定制移植时,可复制公版作为方案配置,根据方案的原理图和各个模块的实际使用情况进行修改。
每个配置方案都由两个文件sys_config.fex和sys_partition.fex来定义。sys_config.fex是对方案板一些相关功能的配置文件,一些模块功能的使能、关闭,以及一些参数的设置都可以通过修改该文件实现。sys_partition.fex描述了分区配置信息。
此处以NanoPi-NEO2为例说明配置方案的添加。
NanoPi-NEO2采用了Allwinner H5处理器,芯片代号为sun50iw2p1,在\tools\pack\chips\sun50iw2p1\configs目录下,新建NanoPi-NEO2文件夹作为NanoPi-NEO2的方案配置目录。
拷贝lichee\tools\pack\chips\sun50iw2p1\configs\cheetah-p1\sys_partition.fex文件到NanoPi-NEO2目录。
拷贝lichee\tools\pack\chips\sun50iw2p1\configs\cheetah-p1\board\sys_config_nanopi-neo2.fex文件到NanoPi-NEO2目录,并命名为sys_config.fex。
拷贝lichee\linux-3.10\arch\arm64\boot\dts\sun50iw2p1-cheetah-p1.dts一份复本,并命名为sun50iw2p1- NanoPi-NEO2.dts,这是方案的设备树文件。
2.2. 编译uboot
uboot放在brandy目录,在brandy有一个build.sh的uboot编译脚本。进入/lichee/brandy目录,键入命令编译boot0和uboot。
./build.sh-p sun50iw2p1
2.3. 编译linux内核
进入lichee目录,键入./build.sh config进行平台的编译配置。
选择sun50iw2p1芯片。
Welcome to mkscript setup progress
All available chips:
sun50iw1p1
sun50iw2p1
sun8iw11p1
sun8iw6p1
sun8iw7p1
sun8iw8p1
sun9iw1p1
Choice: 1
选择linux平台。
All available platforms:
android
dragonboard
linux
eyeseelinux
Choice: 2
选择NanoPi-NEO2方案板
All available boards:
cheetah-cmcc-p1
cheetah-p1
cheetah-perf
NanoPi-NEO2
Choice: 3
配置完成后,会在目录中生成.buildconfig的配置文件并开始编译linux内核。
再次编译内核只需键入./build.sh即可。
2.4. 打包
编译完成后,用./build.sh pack进行打包生成镜像。打包工具会自动向boot0和uboot填充相应的镜像头,uboot加入二进制dtb设备树文件等等。
3. 烧写
3.1. boot0的烧写
用dd命令把生成的boot0镜像烧写进sd卡开头8k位置。
dd bs=1k seek=8 if=./tools/pack/out/boot0_sdcard.fex of=/dev/sdb
3.2. uboot的烧写
用dd命令把生成的uboot镜像烧写进sd卡16400k位置。
dd bs=1k seek=16400 if=./tools/pack/out/boot_package.fex of=/dev/sdb
3.3. kernel的烧写
在PC端把生成的boot.img替换掉sd卡里的boot.img。boot.img在/lichee/out/sun50iw2p1/linux/common目录。