事情的开始是这样,去年在咸鱼蹲了一块Khadas VIM3的开发板,本来是想体验一下Fuchsia系统的的,但是Fuchsia系统对VIM3支持并不好,一直没有运行成功,但是呢,最近发现Google的Android Open Source Project(AOSP)项目已经支持Khadas VIM3了,所以就特意下载源码来了一个编译体验,下面是编译好后Android Version显示的信息,可以看到基于AOSP Master分之编译运行后,Android的版本显示Android S,内核版本是4.19,接下来简单介绍下编译刷机的过程和方法,另外对于repo工具和编译环境的准备,网上资料已经非常多了,各位同学可以上网进行查看
AOSP源码下载
Google官方下载
在国外有条件的同学可以通过下面的方式进行源码的下载,国内的同学这节可以跳过了,直接看下一节通过清华镜像源进行下载
1 2 3 |
repo init -u https://android.googlesource.com/platform/manifest -b master --depth=5 repo sync -j8 -c |
上面--depth=5
表示指下载完之后每个git仓库只显示最近的5条修改,同时这个指令可以加快我们的下载速度
清华镜像源下载
清华镜像源的官网上已经有比较详细的说明了,如果不行看的话,可以直接无脑的运行下面两条指令进行下载
1 2 3 |
repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest --depth=5 repo sync -j8 -c |
同样--depth=5
表示指下载完之后每个git仓库指显示最近的5条修改,同时这个指令可以加快我们的下载速度
AOSP源码编译
有了AOSP源码,想要为Khadas VIM3编译系统镜像,其实也很简单,只需要执行下面几条指令,然后等待系统编译完成即可。
1 2 3 4 |
source build/envsetup.sh lunch yukawa-userdebug make TARGET_USE_TABLET_LAUNCHER=true TARGET_VIM3=true -j8 |
-j8
编译使用8个线程进行编译,这个看大家电脑的配置就行。接下来就是漫长的等待,等待编译完成即可。
VIM3刷机方法
刷机的话首先需要让开发版进入刷机模式,VIM3有三个实体按键,在插入type-c后,快速按中间的按钮3下,按的时候会显示蓝灯,蓝灯熄灭后,开发版就进入刷机模式了,是否进入刷机模式可以通过lsusb
指令进行查看,如下图显示ID显示为1b8e:c003
即表示已经进入刷机模式了,
随后进入到源码device/amlogic/yukawa/bootloader/
目录内,执行下属指令
1 2 3 4 |
./tools/update write u-boot_kvim3_noab.bin 0xfffa0000 0x10000 ./tools/update run 0xfffa0000 ./tools/update bl2_boot u-boot_kvim3_noab.bin |
如果上面的指令无法执行(macOS不支持啊),也可以通过pyamlboot tool
工具进行写入,想要使用pyamlboot tool
工具,首先主机需要安装python3,以macOS系统为例,按照如下指令进行安装,其他系统可以参考进行安装
1 2 3 4 5 |
pip3 install pyamlboot pip3 install pyusb pip3 install libusb brew install libusb-compat libusb |
安装完毕,同样进入源码device/amlogic/yukawa/bootloader/
目录,执行如下指令:
1 2 |
boot-g12.py u-boot_kvim3_noab.bin |
执行完效果如下:
执行完上述指令后,开发版就进入了fastboot模式,同样在源码device/amlogic/yukawa/bootloader/
目录执行如下指令:
1 2 3 4 5 |
fastboot oem format fastboot flash bootloader u-boot_kvim3_noab.bin fastboot erase bootenv fastboot reboot bootloader |
非常重要的一点,执行完上述指令后,需要拔出type-c数据线,让开发板断电之后,再重新插入type-c数据线,让开发板自然进入fastboot模式,同样可以通过lsusb
指令查看,这里显示1b8e:fada
表示已经进入fastboot模式
如果进入fastboot模式后,进入源码out/target/product/yukawa
目录,执行如下fastboot指令进行镜像刷写,如果执行出错可以尝试断电再上电重试,或者从头再来让开发板进入刷机模式执行一遍
1 2 3 4 5 6 7 8 |
fastboot flash boot boot.img fastboot flash super super.img fastboot flash cache cache.img fastboot flash userdata userdata.img fastboot flash recovery recovery.img fastboot flash dtbo dtbo-unsigned.img fastboot reboot |
执行完后,开发板会直接重启,重启后理应能够直接进入系统了,当然这里需要通过HDMI接显示器才能看到。
基于源码编译VIM3 5.4内核
可以另外开启一个命令行窗口,执行下述指令
1 2 3 4 |
export AOSP_TOPDIR=/path/to/your/aosp/source cd ${AOSP_TOPDIR} git clone https://android.googlesource.com/platform/prebuilts/gas/linux-x86 prebuilts/gas/linux-x86 |
/path/to/your/aosp/source
为AOSP源码的根目录,首先是先下载编译内核依赖的工具链,然后通过下述指令下载VIM3的内核源码,这里有两个版本,一个是4.19的内核,另一个则是5.4的内核,同学们可以按照自身需求进行下载和编译,这里如标题所说了,我们以5.4的内核为例
1 2 3 4 5 |
# for 4.19 git clone https://android.googlesource.com/kernel/hikey-linaro -b android-amlogic-bmeson-4.19 # for 5.4 git clone https://android.googlesource.com/kernel/hikey-linaro -b android-amlogic-bmeson-5.4 |
下载完内核源码之后,对于Ubuntu等Linux系统可以执行下述语句,设置编译环境,而如果同学用的是macOS系统的话,建议通过docker运行Ubuntu进行编译,博主试过在macOS本机系统上进行编译,发现有些编译依赖错误无法解决(也可能是博主最近才开始接触macOS,有好些地方不理解)
1 2 3 4 5 6 7 |
export PATH=${AOSP_TOPDIR}/prebuilts/clang/host/linux-x86/clang-r399163b/bin:$PATH export PATH=${AOSP_TOPDIR}/prebuilts/gas/linux-x86:$PATH export PATH=${AOSP_TOPDIR}/prebuilts/misc/linux-x86/lz4:$PATH export ARCH=arm64 export CROSS_COMPILE=aarch64-linux-gnu- export LLVM=1 |
环境变量配置好后,便可以进行编译了
1 2 3 |
make meson_defconfig make DTC_FLAGS="-@" -j24 |
如果上述编译没有问题,那么之后需要将编译后的文件复制到AOSP源码中
1 2 3 4 5 6 7 8 |
lz4c -f arch/arm64/boot/Image arch/arm64/boot/Image.lz4 KERN_VER=5.4 # for 5.4 kernel for f in arch/arm64/boot/dts/amlogic/*{g12b-a311d,sm1}-khadas-vim3*.dtb; do cp -v -p $f ${AOSP_TOPDIR}/device/amlogic/yukawa-kernel/${KERN_VER}/$(basename $f); done cp -v -p arch/arm64/boot/Image.lz4 ${AOSP_TOPDIR}/device/amlogic/yukawa-kernel/${KERN_VER}/Image.lz4 |
执行完上述语句,现在可以回到AOSP的源码目录,重新编译boot.img
即可,编译完boot.img
后,我们通过fastboot指令重新刷写boot分区
1 2 3 4 5 6 7 |
# 编译boot.image make TARGET_USE_TABLET_LAUNCHER=true TARGET_VIM3=true TARGET_KERNEL_USE=5.4 bootimage -j24 # 进入刷机模式 adb reboot bootloader fastboot flash boot boot.img fastboot reboot |
重启后,在settings设备信息中可以看到,Kernel的版本已经更新为我们自行编译的版本,后面内核开发的同学就可以自由的玩转5.4版本的内核了。
基于源码编译VIM3 u-boot
源码需要通过如下指令下载并切换到对应的分之和目录
1 2 3 4 |
git clone https://gitlab.com/baylibre/amlogic/atv/u-boot.git cd u-boot git checkout u-boot/v2021.01/integ-20210202 |
在进行编译之前需要下载配置相应的编译链工具并配置环境变量,可按照下述指令进行:
1 2 3 4 5 6 7 8 9 10 11 12 |
# 下载交叉编译链 http://releases.linaro.org/components/toolchain/binaries/7.2-2017.11/aarch64-elf/gcc-linaro-7.2.1-2017.11-x86_64_aarch64-elf.tar.xz # 解压 xz gcc-linaro-7.2.1-2017.11-x86_64_aarch64-elf.tar.xz tar -xvf gcc-linaro-7.2.1-2017.11-x86_64_aarch64-elf.tar # 配置环境变量 export PATH=<path-to-toolchain>/gcc-linaro-7.2.1-2017.11-x86_64_aarch64-elf/bin:$PATH export CROSS_COMPILE=aarch64-elf- # 编译 make khadas-vim3_android_defconfig make -j24 |
通过上面的指令,我们完成了uboot的编译了,但是现在编译出来的Uboot二进制文件是无法直接烧写到开发板来运行的,需要进一步进行完善,首先到AOSP源码device/amlogic/yukawa/bootloader/fip_packages
目录下,执行下面指令解压出vim3所需要的firmware文件
1 2 |
tar -zxvf fip-collect-g12b-kvim3-khadas-vims-pie-20210111-211833.tar.gz |
然后切换到device/amlogic/yukawa/bootloader
目录下,执行如下指令生成最终的uboot文件
1 2 |
./scripts/generate-bins-new.sh ${AOSP_TOPDIR}/device/amlogic/yukawa/bootloader/fip_packages/fip-collect-g12b-kvim3-khadas-vims-pie-20210111-211833 u-boot.bin |
最后开发板使用的uboot刷机文件会生成在uboot-bins/u-boot.bin
,之后就可以通过fastboot模式来烧写bootloader分区了。
总结
总的来说,现在看AOSP对Khadas VIM3的支持已经是相当的完善了,从bootloader、到kernel、再到Android都有完整的源码和编译支持,就是不知道后续Google是否有可能会将trusty TEE运行环境也移植到VIM3上,这个我们可以稍微进行期待。