本帖最后由 风火轮用户41363 于 2019-12-26 09:53 编辑
此资料为作者根据目前互联网上的一些博客文章,经过亲自动手实践、汇总并加以提炼而成,互联网上的资料有些写得不正确,也有一些遗漏,本文全面的总结了基于 AOSP android-9.0.0_r8 分支代码如何编译以及烧写到 Hikey 970 当中。 文中的 $AOSP_ROOT 指代的是用户自身的 AOSP 9 源码目录。
1. 获取源码
1.1 获取 AOSP 源码
路径:$AOSP_ROOT - $ repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-9.0.0_r8 --no-repo-verify --repo-branch=stable
- $ git clone https://github.com/96boards-hikey/android-manifest.git -b hikey970_v1.0 .repo/local_manifests
- $ repo sync -j4
复制代码手动修复点: - $ cd $AOSP_ROOT/device/linaro/hikey
- $ git diff
- diff --git a/manifest.xml b/manifest.xml
- index fb88f0d..e15f51b 100644
- --- a/manifest.xml
- +++ b/manifest.xml
- @@ -62,4 +62,13 @@
- <instance>default</instance>
- </interface>
- </hal>
- + <hal format="hidl">
- + <name>android.hardware.wifi.hostapd</name>
- + <transport>hwbinder</transport>
- + <version>1.0</version>
- + <interface>
- + <name>IHostapd</name>
- + <instance>default</instance>
- + </interface>
- + </hal>
- </manifest>
- diff --git a/sepolicy/hostapd.te b/sepolicy/hostapd.te
- index 86b985a..78b135c 100644
- --- a/sepolicy/hostapd.te
- +++ b/sepolicy/hostapd.te
- @@ -1,11 +1,11 @@
- # TODO(b/36657258): Remove data_between_core_and_vendor_violators once
- # hostapd no longer directly accesses /data outside /data/vendor.
- -typeattribute hostapd data_between_core_and_vendor_violators;
- +#typeattribute hostapd data_between_core_and_vendor_violators;
- # hostapd can read and write WiFi related data and configuration.
- -allow hostapd wifi_data_file:file rw_file_perms;
- -r_dir_file(hostapd, wifi_data_file)
- +#allow hostapd wifi_data_file:file rw_file_perms;
- +#r_dir_file(hostapd, wifi_data_file)
- # hostapd wants to create the directory holding its control socket.
- -allow hostapd hostapd_socket:dir create_dir_perms;
- +#allow hostapd hostapd_socket:dir create_dir_perms;
- # hostapd needs to create, bind to, read, and write its control socket.
- -allow hostapd hostapd_socket:sock_file create_file_perms;
- +#allow hostapd hostapd_socket:sock_file create_file_perms;
复制代码
1.2 获取 bootloader 源码路径:$AOSP_ROOT/bootloader - $ sudo apt install uuid-dev build-essential
- $ sudo apt install libssl-dev
- $ git clone https://github.com/96boards-hikey/tools-images-hikey970.git
- $ git clone https://github.com/96boards-hikey/OpenPlatformPkg.git -b hikey970_v1.0
- $ git clone https://github.com/96boards-hikey/arm-trusted-firmware.git -b hikey970_v1.0
- $ git clone https://github.com/96boards-hikey/l-loader.git -b hikey970_v1.0
- $ git clone https://github.com/96boards-hikey/edk2.git -b hikey970_v1.0
- $ git clone https://github.com/96boards-hikey/uefi-tools.git -b hikey970_v1.0
- $
- $ cd edk2
- $ ln -sf ../OpenPlatformPkg
复制代码手动修复点: - $ cd $AOSP_ROOT/bootloader/l-loader
- $ git diff build_uefi.sh
- diff --git a/build_uefi.sh b/build_uefi.sh
- index 3449246..e7e957d 100755
- --- a/build_uefi.sh
- +++ b/build_uefi.sh
- @@ -43,7 +43,8 @@ case "${SELECT_GCC}" in
- CROSS_COMPILE=aarch64-linux-gnu-
- ;;
- "LINARO_GCC_7_1")
- - AARCH64_GCC_7_1=/opt/toolchain/gcc-linaro-7.1.1-2017.08-x86_64_aarch64-linux-gnu/bin/
- + # AARCH64_GCC_7_1=/opt/toolchain/gcc-linaro-7.1.1-2017.08-x86_64_aarch64-linux-gnu/bin/
- + AARCH64_GCC_7_1=/home/hand/workspace/aosp/bootloader/gcc-linaro-7.1.1-2017.08-x86_64_aarch64-linux-gnu/bin/
- PATH=${AARCH64_GCC_7_1}:${PATH} && export PATH
- export AARCH64_TOOLCHAIN=GCC5
- CROSS_COMPILE=aarch64-linux-gnu-
复制代码
linaro-gcc 获取: - $ wget https://releases.linaro.org/components/toolchain/binaries/7.1-2017.08/aarch64-linux-gnu/gcc-linaro-7.1.1-2017.08-x86_64_aarch64-linux-gnu.tar.xz
复制代码
1.3 获取 kernel 源码
原生的 kernel 不能 boot 这个版本的 AOSP,会导致各种问题,建议重新 clone linaro 官方针对 hikey970 的 kernel 源码。路径:$AOSP/kernel - $ cd $AOSP_ROOT/kernel
- $ git clone https://github.com/96boards-hikey/linux.git -b hikey970-v4.9 linux
复制代码
2. 编译镜像
2.1 编译 bootloader命令: - $ $AOSP_ROOT/bootloader/l-loader/build_uefi.sh hikey970
复制代码生成物: $AOSP_ROOT/bootloader/l-loader/ptable-aosp-64g.img $AOSP_ROOT/bootloader/tools-images-hikey970/sec_xloader.img $AOSP_ROOT/bootloader/l-loader/l-loader.bin $AOSP_ROOT/bootloader/l-loader/fip.bin
2.2 编译 kernel命令: - $ cd $AOSP_ROOT/kernel/linux
- $ export ARCH=arm64
- $ export CROSS_COMPILE=$AOSP_ROOT/prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/bin/aarch64-linux-android-
- $ make hikey970_defconfig && make -j4 Image.gz modules
- $ make hisilicon/kirin970-hikey970.dtb
复制代码生成物: $AOSP_ROOT/kernel/linux/arch/arm64/boot/dts/hisilicon/kirin970-hikey970.dts $AOSP_ROOT/kernel/linux/arch/arm64/boot/Image.gz-dtb 复制到 AOSP 的对应目录 - $ cp $AOSP_ROOT/kernel/linux/arch/arm64/boot/dts/hisilicon/kirin970-hikey970.dtb $AOSP_ROOT/device/linaro/hikey-kernel/kirin970-hikey970.dtb-4.9
- $ cp $AOSP_ROOT/kernel/linux/arch/arm64/boot/Image.gz $AOSP_ROOT/device/linaro/hikey-kernel/Image.gz-hikey970-4.9
复制代码
2.3 编译 AOSP
命令:
- $ cd $AOSP_ROOT
- $ . build/envsetup.sh
- $ lunch hikey970-userdebug
- $ make -j4
复制代码生成物: $AOSP_ROOT/out/target/product/hikey970/boot.img // 这个 boot.img 是通过预编译的 kernel 镜像制作的,并非我们通过源码编译生成的 kernel 镜像,所以不能用 $AOSP_ROOT/out/target/product/hikey970/system.img $AOSP_ROOT/out/target/product/hikey970/cache.img $AOSP_ROOT/out/target/product/hikey970/userdata.img $AOSP_ROOT/out/target/product/hikey970/dt.img
2.4 手动制作 boot.img
这一步建议放到 编译 AOSP 之后执行- $ cd $AOSP_ROOT
- $ cp $AOSP_ROOT/out/target/product/hikey970/ramdisk.img $AOSP/ramdisk.img
- $ cat $AOSP_ROOT/kernel/linux/arch/arm64/boot/Image $AOSP_ROOT/kernel/linux/arch/arm64/boot/dts/hisilicon/kirin970-hikey970.dtb > $AOSP_ROOT/Image-dtb
- $ $AOSP_ROOT/out/host/linux-x86/bin/mkbootimg --kernel Image-dtb --ramdisk ramdisk.img --cmdline "androidboot.hardware=hikey970 firmware_class.path=/system/etc/firmware loglevel=15 buildvariant=userdebug androidboot.selinux=permissive clk_ignore_unused=true initrd=0xBE19D000,0x16677F earlycon=pl011,0xfff32000,115200 console=ttyAMA6 androidboot.serialno=54DA9CD5022525E4 clk_ignore_unused=true" -o boot.img
- $ cp $AOSP_ROOT/boot.img $AOSP_ROOT/out/target/product/hikey970/boot_built.img
复制代码
3. 烧写
首先通过 Hikey970 跳线 引脚 1,3 拉高;引脚 2,4 拉低进入 fastboot 模式,然后运行(注意中间有两次必要的 reboot):
- $ cd $AOSP_ROOT/bootloader
- $ fastboot flash ptable l-loader/ptable-aosp-64g.img
- $ fastboot reboot
- $ fastboot flash xloader tools-images-hikey970/sec_xloader.img
- $ fastboot flash fip l-loader/fip.bin
- $ fastboot flash fastboot l-loader/l-loader.bin
- $ fastboot reboot
- $ cd $AOSP_ROOT/out/target/product/hikey970
- $ fastboot flash boot boot_built.img // 注意这里不要烧写原生 boot.img
- $ fastboot flash cache cache.img
- $ fastboot flash system system.img
- $ fastboot flash userdata userdata.img
复制代码 然后恢复跳线至引脚 1 拉高;引脚 2,3,4 拉低,重新上电正常开机,不出意外,此时 Hikey970 可以正常 boot 到 Android Launcher 了。
4. 已知问题和解决方法
4.1 WIFI 无法使用 原因是源码中默认的 wpa_supplicant 配置文件缺失,将附件中的 wifi.tar 通过 adb 推送到 /data/misc/ 下,解压缩覆盖 wifi 目录重启系统即可。如果下次重新 flash 过了 userdata 分区,这个步骤还要重新做一遍。
4.2 蓝牙无法搜索设备 logcat 日志中显示 bluetooth 服务出现 crash,原因是 BT 协议栈的 OSI 模块检测内核支持的 BOOT_ALARM 能力时出错,因为 Hikey970 不支持睡眠唤醒。修改方法: 文件:$AOSP_ROOT/system/bt/osi/src/alarm.cc - --- a/system/bt/osi/src/alarm.cc
- +++ b/system/bt/osi/src/alarm.cc
- @@ -115,11 +115,11 @@ struct alarm_t {
- int64_t TIMER_INTERVAL_FOR_WAKELOCK_IN_MS = 3000;
- static const clockid_t CLOCK_ID = CLOCK_BOOTTIME;
- -#if (KERNEL_MISSING_CLOCK_BOOTTIME_ALARM == TRUE)
- +//#if (KERNEL_MISSING_CLOCK_BOOTTIME_ALARM == TRUE)
- static const clockid_t CLOCK_ID_ALARM = CLOCK_BOOTTIME;
- -#else
- -static const clockid_t CLOCK_ID_ALARM = CLOCK_BOOTTIME_ALARM;
- -#endif
- +//#else
- +//static const clockid_t CLOCK_ID_ALARM = CLOCK_BOOTTIME_ALARM;
- +//#endif
复制代码
4.3 有时候重新烧写 Hikey970 之后开机停在 boot animation 画面 一个可能的原因是 data 分区损坏,或者在错误的 fastboot 下进行了烧写。将 Hikey970 跳线 1,3拉高,2,4拉低,重新上电之后重新烧写 bootloader,并且在 ptable 以及 fastboot (l-loader)烧写完成之后重新上电,随后烧写 boot.img,system.img,userdata.img 恢复。
附件
WIFI 配置目录,下载并覆盖到 /data/misc/wifi
|