Hikey 970 编译烧写 AOSP 9.0 (亲测整理)
本帖最后由 风火轮用户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
覆盖配置了,wifi还是没有搞定呢 WiFi覆盖之后要去Setting里手动开启的,开启的时候会运行 wpa_supplicant,它会去这个目录里找配置文件。 感谢分享 linaro-gcc具体怎么配置的 风火轮用户20640 发表于 2020-3-31 10:11
linaro-gcc具体怎么配置的
下载 linaro gcc 的 package,解压缩,然后编译的时候把 CROSS_COMPILE 指向它的目录就行了。 楼主,请问需要升级kernel到比较新的版本,从原生kernel中升级可行吗?步骤是什么呢 楼主,请问开发板是在哪里购买呢?
页:
[1]