iis服务器助手广告广告
返回顶部
首页 > 资讯 > 移动开发 >Rockchip Android13 GKI开发指南
  • 734
分享到

Rockchip Android13 GKI开发指南

androidGKIEDLAROCKCHIPkernel 2023-09-20 09:09:22 734人浏览 泡泡鱼
摘要

Rockchip Android13 GKI开发指南 文章目录 Rockchip Android13 GKI开发指南@[toc]1 GKI介绍1.1 什么是GKI1.2 什么产品需要使用

Rockchip Android13 GKI开发指南

文章目录

1 GKI介绍

1.1 什么是GKI

GKI:Generic Kernel Image 通用内核映像。
Android13 GMS和EDLA认证的一个难点是Google强制要求要支持GKI。GKI通用内核映像,是google为了解决内核碎片化的问题,而设计的通过提供统一核心内核并将SoC和板级驱动从核心内核移至可加载模块中。核心内核为驱动模块提供了稳定的内核模块接口,模块驱动和核心内核可以独立进行更新。内核接口可以通过upstream的方式进行扩展。 Soc和板级厂商在驱动开发时需要使用已经定义的内核接口,如果要新加核心内核接口需要提交给google,这个周期会比较长,所以要提前做好开发准备。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ulf1Pvdd-1687675851348)(D:\work\AndroidSDK\客户培训\GKI开发\gki框图.png)]

1.2 什么产品需要使用GKI

  • 使用Android13且需要过GMS认证和EDLA认证的产品
  • 使用Android12 的RK3588和RK3588S的需要过GMS认证和EDLA认证的产品
  • 不过GMS认证和EDLA认证的产品不强制要求使用GKI

1.3 GKI和非GKI的差别

  • 通用内核boot.img

    GKI非GKI
    由google定期发布boot.img,代码不能自己修改由RK提供内核源码编译,可以自由修改
  • 驱动模块

    GKI非GKI
    以KO的形式加载,调用的内核接口必需是google发布的boot.img里面包含的内嵌在boot中,由RK提供内核源码编译,可以自由修改和添加内核接口
  • kernel代码

    GKI非GKI
    RK发布的kernel源码仅用于编译驱动模块的KORK发布的kernel源码用于完整的内核和模块驱动的编译,模块以.o的形式内嵌编译
  • uboot支持head4

  • 分区差异
    GKI增加vendor_boot、init_boot、resource分区

  • 启用AB分区

2 Rockchip Android13 GKI的适配情况

kernel版本是5.10

芯片是否完成适配
RK3588/RK3588S已适配
RK3568/RK3566已适配
RK3326/RK3326S已适配
PX30/PX30S已适配
RK3399正在适配

3 Google upstream kernel下载及编译

Google的boot.img是定期发布,时间间隔比较长。 我们可以下载google的upstream的kernel源码自己编译boot.img进行验证和debug。

Google Upstream kernel下载链接:

repo init -u https://android.googlesource.com/kernel/manifest -b common-android13-5.10

需要链接google服务器下载

编译

tools/bazel run --config=fast //common:kernel_aarch64_dist -- --dist_dir=./out

生成boot.img

out/boot.img

4 Rockchip SDK中GKI相关目录介绍

  • kernel KO文件路径
mkcombinedroot/vendor_ramdisk/lib/modules/
  • Google boot.img路径
mkcombinedroot/prebuilts/boot-5.10.img
  • KO文件加载顺序配置文件
mkcombinedroot$ tree res/res/├── board│   ├── px30-mini-evb-ddr3-v11-avb.load│   ├── rk3326-863-lp3-v10-rkisp1.load│   ├── rk3326-evb-lp3-v10-avb.load│   ├── rk3399-evb-ind-lpddr4-android-avb.load│   ├── rk3399-evb-ind-lpddr4-v13-android-avb.load│   ├── rk3562-evb1-lp4x-v10.load│   ├── rk3562-rk817-tablet-v10.load│   ├── rk3566-evb2-lp4x-v10.load│   ├── rk3566-rk817-tablet.load│   ├── rk3568-evb1-ddr4-v10.load│   ├── rk3588-evb1-lp4-v10.load│   ├── rk3588-evb7-lp4-v10.load│   └── rk3588s-tablet-v10.load├── bootconfig├── debug_list.load├── file_contexts.bin├── ramdisk_modules.load├── recovery_gki.mk├── soc│   ├── rk3326│   │   └── vendor_ramdisk_modules.load│   ├── rk3399│   │   └── vendor_ramdisk_modules.load│   ├── rk3562│   │   └── vendor_ramdisk_modules.load│   ├── rk356x│   │   ├── vendor_ramdisk_modules.load│   └── rk3588│       ├── vendor_ramdisk_modules.load├── vendor_gki.mk├── vendor_image_info.txt├── vendor_modules.load├── vendor_ramdisk_gki.mk

其中:
res/soc/ 下面的是芯片平台相关的ko加载
res/board/下面是板级相关的ko加载

  • GPU mali库的路径
    GPU的mali库是单独编译在vendor.img中,源文件路径在
RK3588:vendor/rockchip/common/gpu/MaliG610/lib/modules/bifrost_kbase.koRK356X/RK3562:vendor/rockchip/common/gpu/MaliG52/lib/modules/bifrost_kbase.koRK3326/RK3326-S:PX30/PX30-S:vendor/rockchip/common/gpu/MaliTDVx/lib/modules/mali_kbase.koRK3399:vendor/rockchip/common/gpu/MaliT860/lib/modules/mali_kbase.ko

5 Rockchip GKI编译

5.1 代码修改

GKI需要打开AB系统才能使用,具体代码修改如下:

  1. uboot需要打开AB配置
~/a2_Android13_sdk/u-boot$ git diffdiff --git a/configs/rk3568_defconfig b/configs/rk3568_defconfigindex fbd9820acc..e23e438792 100644--- a/configs/rk3588_defconfig+++ b/configs/rk3588_defconfig@@ -207,6 +207,7 @@ CONFIG_RSA_N_SIZE=0x200CONFIG_RSA_E_SIZE=0x10CONFIG_RSA_C_SIZE=0x20CONFIG_SHA512=yCONFIG_LZ4=yCONFIG_LZMA=yCONFIG_SPL_GZIP=y@@ -220,3 +221,4 @@ CONFIG_RK_AVB_LIBAVB_USER=yCONFIG_OPTEE_CLIENT=yCONFIG_OPTEE_V2=yCONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITioN=y+CONFIG_ANDROID_AB=y
  1. 增加板级的KO load文件
    Rockchip的GKI框架里面加载KO的load文件有区分芯片平台驱动和板级驱动,所以在开发新产品的时候需要增加板级驱动的KO load文件,load文件以device下面产品目录中定义PRODUCT_KERNEL_DTS的dts的名字命名,并且保存在mkcombinedroot/res/board/下面,如:
wlq@sys2_206:~/a0_Android13_gki$ tree mkcombinedroot/res/board/mkcombinedroot/res/board/├── px30-mini-evb-ddr3-v11-avb.load├── rk3326-863-lp3-v10-rkisp1.load├── rk3326-evb-lp3-v10-avb.load├── rk3399-evb-ind-lpddr4-android-avb.load├── rk3399-evb-ind-lpddr4-v13-android-avb.load├── rk3562-evb1-lp4x-v10.load├── rk3562-rk817-tablet-v10.load├── rk3566-evb2-lp4x-v10.load├── rk3566-rk817-tablet.load├── rk3568-evb1-ddr4-v10.load├── rk3588-evb1-lp4-v10.load├── rk3588-evb7-lp4-v10.load└── rk3588s-tablet-v10.load

板级的KO load文件里面放的是板级的驱动模块,如:触摸屏、camera、sensor等芯片平台以为的驱动模块,如:

wlq@sys2_206:~/a0_Android13_gki$ cat mkcombinedroot/res/board/rk3588-evb1-lp4-v10.loadcw2015_battery.koimx415.koov50c40.koov13855.kogt1x-ts.kosnd-soc-es8323.ko
  1. Android的device产品目录下配置GKI选项
~/a2_Android13_sdk/device/rockchip/rk3588$ git diffdiff --git a/rk3588_t/BoardConfig.mk b/rk3588_t/BoardConfig.mkold mode 100644new mode 100755index 50da541..06da5f3--- a/rk3588_t/BoardConfig.mk+++ b/rk3588_t/BoardConfig.mk@@ -15,10 +15,21 @@ # include device/rockchip/rk3588/BoardConfig.mk BUILD_WITH_GO_OPT := false+BOARD_BUILD_GKI := true-# AB image definition-BOARD_USES_AB_IMAGE := false-BOARD_ROCKCHIP_VIRTUAL_AB_ENABLE := false+ifeq ($(strip $(BOARD_BUILD_GKI)), true)+    #for gki+    # AB image definition+    BOARD_USES_AB_IMAGE := true+    BOARD_ROCKCHIP_VIRTUAL_AB_ENABLE := true+    PRODUCT_KERNEL_CONFIG := gki_defconfig rockchip_gki.config+else+    BOARD_ROCKCHIP_VIRTUAL_AB_ENABLE := false+    BOARD_USES_AB_IMAGE := false+    PRODUCT_KERNEL_CONFIG := rockchip_defconfig android-13.config+endif BOARD_GRAVITY_SENSOR_SUPPORT := true BOARD_COMPASS_SENSOR_SUPPORT := true@@ -26,14 +37,21 @@ BOARD_SENSOR_COMPASS_AK8963-64 := true BOARD_GYROSCOPE_SENSOR_SUPPORT := true BOARD_PROXIMITY_SENSOR_SUPPORT := true BOARD_LIGHT_SENSOR_SUPPORT := true ifeq ($(strip $(BOARD_USES_AB_IMAGE)), true)     include device/rockchip/common/BoardConfig_AB.mk     TARGET_RECOVERY_FSTAB := device/rockchip/rk3588/rk3588_t/recovery.fstab_AB endif-+ifeq ($(strip $(BOARD_BUILD_GKI)), true)+    #for gki+    BOARD_SUPER_PARTITION_SIZE := 4294967296+    BOARD_ROCKCHIP_DYNAMIC_PARTITIONS_SIZE := $(shell expr $(BOARD_SUPER_PARTITION_SIZE) - 4194304)+endif PRODUCT_UBOOT_CONFIG := rk3588 PRODUCT_KERNEL_DTS := rk3588-evb1-lp4-v10 BOARD_GSENSOR_MXC6655XA_SUPPORT := true BOARD_CAMERA_SUPPORT_EXT := true

5.2 编译

完整编译方式与非GKI的一样

source  build/envsetup.shlunch rk3588_t-userdebug./build.sh -ACUKup

注意:这里编译的kernel只是为了编译出resource.img,kernel源码部分都是使用mkcombinedroot/vendor_ramdisk/lib/modules/下的ko文件直接打包成vendor_boot.img。内核部分使用的是google发布的boot.img,具体路径在mkcombinedroot/prebuilts/boot-5.10.img

编译完可以直接烧写 rockdev/Image-rk3588_t/update.img

在调试阶段也支持单独编译vendor_boot.img
编译命令:

make installclean;make vendorbootimage -j12

编译完可以直接烧写

out/target/product/rk3588_t/vendor_boot.img

5.3 固件烧写

固件烧写分2中方式:

  • 完整包update.img
    固件路径
rockdev/Image-rk3588_t/update.img

在这里插入图片描述

可以通过瑞芯微开发工具烧写

  • 散包烧写
    首先导入配置文件,方法是在工具 空白处右键-导入配置-选择导入txt文件-选择parameter.txt
    在这里插入图片描述
    然后依次选择rockdev/Image-rk3588_t/下对应的img文件进行烧写,分区A和B导入的固件是同一个
rockdev/Image-rk3588_t├── baseparameter.img├── boot.img├── dtbo.img├── init_boot.img├── MiniLoaderAll.bin├── misc.img├── parameter.txt├── resource.img├── super.img├── uboot.img├── update.img├── vbmeta.img└── vendor_boot.img

在这里插入图片描述

6 KO编译及修改

6.1 添加新的模块驱动的方法

  1. 将驱动代码放到kernel-5.10对应的目录下,这里以新加触摸屏驱动gt1x为例进行说明。
    将gt1x的驱动放在drivers/input/touchscreen/下面,并添加对应的MakefileKconfig,这里按kernel的标准方式进行操作;
  2. 增加一个自己的config文件, 在arch/arm64/configs/下新建一个xxx_gki.config,并将CONFIG_TOUCHSCREEN_GT1X=m (m表示编译为ko)添加到xxx_gki.config中;
  3. 将ko文件名添加到板级的load文件中, load文件在SDK的mkcombinedroot/res/board目录下,如下

|.load文件名称| 对应分区 | makefile解析 |加载时间|
| - | - | - |
| vendor_ramdisk_modules.load | vendor_boot | vendor_ramdisk_gki.mk |ramdisk init阶段|
| vendor_modules.load | vendor | vendor_gki.mk |android启动时|
| recovery_modules.load | recovery | recovery_gki.mk |recovery阶段|

这里以RK3588-EVB1的板级配置为例进行说明:
触摸屏驱动要在init阶段加载所以加到rk3588-evb1-lp4-v10.load

echo "gt1x-ts.ko" >> res/board/rk3588-evb1-lp4-v10.load

注意 1:.load文件关乎驱动的加载顺序,请不要修改原有顺序,仅在需要时添加自己的驱动名称,否则可能会导致系统无法启动!!!

注意 2:如果使用A/B系统,请务必保证vendor_ramdisk_modules.loadrecovery_modules.load文件内容一致,否则会导致无法启动!代码默认使用软链接将二者链接起来,请不要自己修改!!!

注意 3:如果是在android启动的时候加载的ko可以放在vendor_modules.load中,但需要注意:vendor下的ko不会被系统主动加载!如果仅需要在开机阶段自动加载,可以使用Rockchip提供的默认加载脚本init.insmod.sh,该脚本会自动加载device/rockchip/common/rootdir/init.insmod.cfg配置中的所有ko。

  1. 编译
    进到kernel-5.10目录下进行ko文件编译

配置clang编译链(编译链版本请参考build.sh中的配置)

export PATH=../prebuilts/clang/host/linux-x86/clang-r450784d/bin:$PATH
make CROSS_COMPILE=aarch64-linux-gnu- LLVM=1 LLVM_IAS=1 ARCH=arm64 gki_defconfig rockchip_gki.config xxx_gki.config && make CROSS_COMPILE=aarch64-linux-gnu- LLVM=1 LLVM_IAS=1 ARCH=arm64 rk3588s-evb8-lp4x-v10.img -j32
  1. 编译kernel后将编译生产的gt1x-ts.ko文件拷贝到mkcombinedroot/vendor_ramdisk/lib/modules/下面
llvm-objcopy --strip-debug  drivers/input/touchscreen/gt1x/gt1x-ts.ko ../mkcombinedroot/vendor_ramdisk/lib/modules/gt1x-ts.ko

注意:这里拷贝KO文件需要用

llvm-objcopy --strip-debug

将调试信息剥离从而减小KO文件的大小,减少开机KO的加载时间。使用llvm-objcopy需要先lunch配置android环境。
6. 编译vendor_boot.img
在工程根目录下编译vendor_boot.img,命令如下。 这一步是将KO文件打包到vendor_boot.img,在降vendor_boot.img烧写到机器中。

make installclean;make vendorbootimage -j12

单独烧写vendor_boot.img,编译完的vendor_boot.img路径如下:

out/target/product/rk3588_t/vendor_boot.img
  1. 验证
  • 烧写out/target/product/rk3588_t/vendor_boot.img文件到机器中开机验证

  • 如果是放在vendor分区的ko可以在系统起来后直接push到机器内的vendor分区中,手动挂载进行验证

  • 如果有涉及到dts的修改,需要烧写kernel-5.10下的resource.img

附:AOSP定义的各类ko加载阶段

Boot modeStorageDisplayKeypadBatteryPMICTPNFC/Wi-Fi/BTSensorsCamera
RecoveryYYYYYNNNN
ChargerYYYYYNNNN
AndroidYYYYYYYYY

6.2 调试ko方法

  1. 在kernel-5.10目录下修改对应ko的驱动源码

  2. 使用如下命令进行ko编译

  • 配置clang编译链(编译链版本请参考build.sh中的配置)
    export PATH=../prebuilts/clang/host/linux-x86/clang-r450784d/bin:$PATH
  • 编译ko
    make CROSS_COMPILE=aarch64-linux-gnu- LLVM=1 LLVM_IAS=1 ARCH=arm64 gki_defconfig rockchip_gki.config xxx_gki.config && make CROSS_COMPILE=aarch64-linux-gnu- LLVM=1 LLVM_IAS=1 ARCH=arm64 rk3588s-evb8-lp4x-v10.img -j32
  1. 拷贝KO文件到mkcombinedroot/vendor_ramdisk/lib/modules/
llvm-objcopy --strip-debug  drivers/xxx.ko ../mkcombinedroot/vendor_ramdisk/lib/modules/xxx.ko
  1. 编译vendor_boot.img
    在工程根目录下编译vendor_boot.img,命令如下。 这一步是将KO文件打包到vendor_boot.img,在降vendor_boot.img烧写到机器中。
 make installclean;make vendorbootimage -j12
  1. 验证
    - 烧写out/target/product/rk3588_t/vendor_boot.img文件到机器中开机验证
    - 如果是放在vendor分区的ko可以在系统起来后直接push到机器内的vendor分区中,手动挂载进行验证
    - 如果有涉及到dts的修改,需要烧写kernel-5.10下的resource.img

  2. 调试完成后,将vendor_ramdisk/lib/modules的ko文件(被脚本自动拷贝)进行提交

有关打包工具的详细说明,请参考:mkcombinedroot/README

注意:kernel编译ko的时候如果有修改了config,则编译中间会卡住很长一段时间,这是在做编译优化,根据编译服务器硬件配置不同优化的速度也不同,即卡住的时间也不同。 所以这个卡住是正常现象。

7 开机log确认

7.1 uboot阶段

内容header版本
vendor_ramdisk(v-ramdisk)V3+
bootconfigV4+
## Booting Android Image at 0x003ff000 ...Kernel: 0x00400000 - 0x03088ffc (45604 KiB)v-ramdisk:  0x0a200000 - 0x0a6944c8 (4690 KiB)ramdisk:    0x0a6944c8 - 0x0a7e54df (1349 KiB)bootconfig: 0x0a7e54df - 0x0a7e559c (1 KiB)bootparams: 0x0a7e559c - 0x0a7e759c

7.2 Android阶段

GKI版本: Linux version 5.10.117-android13-9-00037-gbc08447eb7bd

[    0.000000][    T0] Booting Linux on physical CPU 0x0000000000 [0x412fd050][    0.000000][    T0] Linux version 5.10.117-android12-9-00037-gbc08447eb7bd (build-user@build-host) (Android (7284624, based on r416183b) clang version 12.0.5 (Https://android.googlesource.com/toolchain/llvm-project c935d99d7cf2016289302412d708641d52d2f7ee), LLD 12.0.5 (/buildbot/src/android/llvm-toolchain/out/llvm-project/lld c935d99d7cf2016289302412d708641d52d2f7ee)) #1 SMP PREEMPT Thu Aug 25 15:24:20 UTC 2022

Kernel command line: Header V4中不能存在androidboot.xxx这一类的命令行参数,这类参数全部在bootconfig中。此类参数可以通过cat /proc/bootconfig确认。

[    0.000000][    T0] Kernel command line: stack_depot_disable=on kasan.stacktrace=off kvm-arm.mode=protected cgroup_disable=pressure cgroup.memory=nokmem storagemedia=emmc console=ttyFIQ0 firmware_class.path=/vendor/etc/firmware init=/init rootwait ro loop.max_part=7 bootconfig buildvariant=userdebug earlycon=uart8250,mmio32,0xfeb50000 irqchip.gicv3_pseudo_nmi=0 

7.3 KO加载

开始加载ko,可以看到log:

[    1.034730][    T1] Run /init as init process[    1.036190][    T1] init: init first stage started![    1.040534][    T1] init: Loading module /lib/modules/io-domain.ko with args ''[    1.042038][    T1] init: Loaded kernel module /lib/modules/io-domain.ko

7.4 KO加载报错

使用了未导出的符号,报错重启:

[    0.805736][    T1] cryptodev: Unknown symbol crypto_ahash_final (err -2)[    0.806383][    T1] cryptodev: Unknown symbol sg_nents (err -2)[    0.806972][    T1] cryptodev: Unknown symbol crypto_alloc_akcipher (err -2)[    0.819768][    T1] Kernel panic - not syncing: Attempted to kill init! exitcode=0x00007f00

注: 正常不会出现此问题,参考 名词解释阶段——ABI进行处理

7.5 bootcmdline解析出错

错误log

Failed to parse bootconfig: Value is redefined at 416.

现象:无法开机或者开机进到recovery
原因:cmdline中的字段重复了,导致解析cmdline出错,可以在开机到uboot的时候在串口按住crtl+p就会打印所有的cmdline信息,从打印的cmdline信息中检查哪个字段重复了,然后去代码里面找对应的定义的位置删除对应的字段即可。一般吧cmdline是在device和kernel的dts中定义,可以在这两个目录下搜索该重复的字段即可。

7.6 Mali KO加载失败

Mali KO加载失败表现为无法开机界面显示卡在’Rockchip kernel’的logo,loGCat可以看到surfaceflinger crash。

04-27 22:45:27.653   366   366 F DEBUG   : *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***04-27 22:45:27.653   366   366 F DEBUG   : Build fingerprint: 'rockchip/rk3562_t/rk3562_t:13/TQ2A.230305.008.F1/eng.wlq.20230427.101925:userdebug/release-keys'04-27 22:45:27.653   366   366 F DEBUG   : Revision: '0'04-27 22:45:27.653   366   366 F DEBUG   : ABI: 'arm64'04-27 22:45:27.653   366   366 F DEBUG   : Timestamp: 2023-04-27 22:45:27.509738048+000004-27 22:45:27.653   366   366 F DEBUG   : Process uptime: 2s04-27 22:45:27.653   366   366 F DEBUG   : Cmdline: /system/bin/surfaceflinger04-27 22:45:27.653   366   366 F DEBUG   : pid: 335, tid: 360, name: surfaceflinger  >>> /system/bin/surfaceflinger <<<04-27 22:45:27.653   366   366 F DEBUG   : uid: 100004-27 22:45:27.653   366   366 F DEBUG   : tagged_addr_ctrl: 0000000000000001 (PR_TAGGED_ADDR_ENABLE)04-27 22:45:27.653   366   366 F DEBUG   : signal 6 (SIGABRT), code -1 (SI_QUEUE), fault addr --------04-27 22:45:27.653   366   366 F DEBUG   : Abort message: 'no suitable EGLConfig found, giving up'04-27 22:45:27.653   366   366 F DEBUG   :     x0  0000000000000000  x1  0000000000000168  x2  0000000000000006  x3  000000710899d34004-27 22:45:27.654   366   366 F DEBUG   :     x4  7568661f2b636d74  x5  7568661f2b636d74  x6  7568661f2b636d74  x7  7f7f7f7f7f7f7f7f04-27 22:45:27.654   366   366 F DEBUG   :     x8  00000000000000f0  x9  000000739bcbda00  x10 0000000000000001  x11 000000739bcff6a004-27 22:45:27.654   366   366 F DEBUG   :     x12 000000710899d310  x13 0000000000000027  x14 000000710899d4e0  x15 00000000197b1a4f04-27 22:45:27.654   366   366 F DEBUG   :     x16 000000739bd6dd58  x17 000000739bd48770  x18 0000007108812000  x19 00000000000000ac04-27 22:45:27.654   366   366 F DEBUG   :     x20 00000000000000b2  x21 000000000000014f  x22 0000000000000168  x23 00000000ffffffff04-27 22:45:27.654   366   366 F DEBUG   :     x24 b4000071bbca60b0  x25 000000710899dcb0  x26 000000710899dff8  x27 00000000000fe00004-27 22:45:27.654   366   366 F DEBUG   :     x28 000000710899daf0  x29 000000710899d3c004-27 22:45:27.654   366   366 F DEBUG   :     lr  000000739bcef3f4  sp  00000071089ndroid.runtime/lib64/bionic/libc.so (__pthread_start(void*)+208) (BuildId: e2429c64ab29f2d0ffc5a8f42c0c1b80)04-27 22:45:27.655   366   366 F DEBUG   :       #09 pc 0000000000054c50  /apex/com.android.runtime/lib64/bionic/libc.so (__start_thread+64) (BuildId: e2429c64ab29f2d0ffc5a8f42c0c1b80)

这个是因为GPU的ko不匹配,需要重新编译GPU的ko文件,并拷贝到vendor/rockchip/common/gpu下面对应的目录中,具体编译方法如下:
修改device下面的产品目录中kernel config配置:PRODUCT_KERNEL_CONFIG := gki_defconfig rockchip_gki.config增加对应芯片的gpu配置,具体如下

RK3588:PRODUCT_KERNEL_CONFIG := gki_defconfig rockchip_gki.configRK356X/RK3562:PRODUCT_KERNEL_CONFIG := gki_defconfig rockchip_gki.config rk356x.configRK3326/RK3326-S:PX30/PX30-S:PRODUCT_KERNEL_CONFIG := gki_defconfig rockchip_gki.config rk3326.configRK3399:PRODUCT_KERNEL_CONFIG := gki_defconfig rockchip_gki.config rk3399.configrk3399.config需要按如下修改:wlq@sys2_206:~/a0_Android13_gki/mkcombinedroot$ git diff configs/diff --git a/configs/rk3399.config b/configs/rk3399.configold mode 100644new mode 100755index 0d66674..a003ba5--- a/configs/rk3399.config+++ b/configs/rk3399.config@@ -1,4 +1,11 @@-CONFIG_MALI_MIDGARD=y+CONFIG_MALI_MIDGARD=m+CONFIG_MALI_PLATFORM_THIRDPARTY_NAME="rk"+CONFIG_MALI_PLATFORM_THIRDPARTY=y+CONFIG_MALI_DEBUG=y+CONFIG_MALI_DEVFREQ=y+CONFIG_MALI_DT=y+CONFIG_MALI_EXPERT=y+CONFIG_MALI_SHARED_INTERRUPTS=y

然后执行./build.sh -CK 编译kernel
编译完成后拷贝对应的mali ko到vendor下面,具体路径可以看上面的章节。

7.7 编译kernel报错

编译错误log:

BTF     .btf.vmlinux.bin.oSegmentation fault (core dumped)LD      .tmp_vmlinux.kallsyms1KSYMS   .tmp_vmlinux.kallsyms1.SAS      .tmp_vmlinux.kallsyms1.SLD      .tmp_vmlinux.kallsyms2KSYMS   .tmp_vmlinux.kallsyms2.SAS      .tmp_vmlinux.kallsyms2.SLD      vmlinuxBTFIDS  vmlinuxFAILED: load BTF from vmlinux: Unknown error -22Makefile:1293: recipe for target 'vmlinux' failedmake[1]: *** [vmlinux] Error 255arch/arm64/Makefile:214: recipe for target 'rk3588-evb1-lp4-v10.img' failedmake: *** [rk3588-evb1-lp4-v10.img] Error 2failed to build some targets (21 seconds)

解决方法:

  • 下载最新版本pahole
    git clone https://git.kernel.org/pub/scm/devel/pahole/pahole.git
  • 编译pahole

安装编译依赖库
sudo apt-get install cmake
sudo apt-get install libdw-dev

如果之前有安装过pahole,需要先卸载
sudo apt-get --purge remove dwarves

  • 开始编译

ahole目录下执行
mkdir build
cd build/
cmake -D__LIB=lib -DBUILD_SHARED_LIBS=OFF .. 配置静态编译
sudo make install

pahole --version 查看版本确认是否安装成功

错误log:

  LD      .tmp_vmlinux.kallsyms2  KSYMS   .tmp_vmlinux.kallsyms2.S  AS      .tmp_vmlinux.kallsyms2.S  LD      vmlinux  BTFIDS  vmlinuxFAILED: load BTF from vmlinux: Unknown error -22Makefile:1293: recipe for target 'vmlinux' failedmake[1]: *** [vmlinux] Error 255arch/arm64/Makefile:214: recipe for target 'rk3562-evb1-lp4x-v10.img' failed

解决方法:

diff --git a/scripts/link-vmlinux.sh b/scripts/link-vmlinux.shindex 2631ab4ce9fd..04a58483569c 100755--- a/scripts/link-vmlinux.sh+++ b/scripts/link-vmlinux.sh@@ -28,7 +28,7 @@ # System.map is generated to document addresses of all kernel symbols # Error out on error-set -e+#set -e

以上是临时解决方案,最终的方案是升级ubantu版本到20.04及之上版本

8 调试技巧

8.1 打印更多KO加载的log

修改ratelimit的值,可以打印更多init的log,方便查问题,init信息太少会把ko加载的报错信息隐藏掉。

@sys2206:~/a0_Android13_gki/u-boot$ git diffdiff --git a/arch/arm/Mach-rockchip/boot_rkimg.c b/arch/arm/mach-rockchip/boot_rkimg.cindex 3e133fbc72..6fb530c864 100644--- a/arch/arm/mach-rockchip/boot_rkimg.c+++ b/arch/arm/mach-rockchip/boot_rkimg.c@@ -229,7 +229,7 @@ static int get_bootdev_type(void)     boot_media, boot_media);                else                        snprintf(boot_options, sizeof(boot_options),-    "storagemedia=%s androidboot.storagemedia=%s "+    "printk.devkmsg=on storagemedia=%s androidboot.storagemedia=%s "     "androidboot.mode=normal ",     boot_media, boot_media); #endif

8.2 在RK的kernel打包中编译GKI使用的boot.img

先按正常编译步骤编译kernel,生成arch/arm64/boot/Image
用如下命令打包boot.img
mkbootimg --kernel arch/arm64/boot/Image --header_version 4 --output …/mkcombinedroot/prebuilts/boot-5.10.img

8.3 查看google发布的内核接口

标准的内核接口定义在android目录下:

:~/a5_google_kenrel/common$ tree aandroid/ arch/wlq@sys2_206:~/a5_google_kenrel/common$ tree android/android/├── abi_gki_aarch64├── abi_gki_aarch64_core├── abi_gki_aarch64_db845c├── abi_gki_aarch64_exynos├── abi_gki_aarch64_fips140├── abi_gki_aarch64_galaxy├── abi_gki_aarch64_generic├── abi_gki_aarch64_hikey960├── abi_gki_aarch64_rockchip├── abi_gki_aarch64_type_visibility├── abi_gki_aarch64_virtual_device├── abi_gki_aarch64.xml├── abi_gki_modules_exports├── abi_gki_modules_protected├── gki_aarch64_fips140_modules├── gki_aarch64_modules└── gki_system_dlkm_modules

8.4 kernel编译慢卡在LTO优化

kernel在编译的时候会进行LTO优化,这个耗时会很长,如果是做临时调试可以改用LTO thin,可以减少耗时,具体修改如下:

--- a/arch/arm64/configs/gki_defconfig+++ b/arch/arm64/configs/gki_defconfig@@ -97,7 +97,7 @@ CONFIG_CRYPTO_AES_ARM64_CE_BLK=y CONFIG_KPROBES=y CONFIG_JUMP_LABEL=y CONFIG_SHADOW_CALL_STACK=y-CONFIG_LTO_CLANG_FULL=y+CONFIG_LTO_CLANG_THIN=y CONFIG_CFI_CLANG=y CONFIG_MODULES=y CONFIG_MODULE_UNLOAD=y

注意,这个修改仅做临时调试用,正式编译时需要还原修改在编译对应KO。

9 如何提交内核接口到upstream

如果需要添加新的内核接口,可以生成对应的patch,再将patch通过瑞芯微的redmine系统提交个瑞芯微审核然后再统一提交给google

diff --git a/android/abi_gki_aarch64_rockchip b/android/abi_gki_aarch64_rockchipindex 85bd8bc134cf..3344cf064e06 100644--- a/android/abi_gki_aarch64_rockchip+++ b/android/abi_gki_aarch64_rockchip@@ -2144,6 +2144,15 @@   mmc_pwrseq_reGISter   mmc_pwrseq_unregister+# required by r8168.ko+  pci_set_mwi+  pci_clear_mwi+  proc_get_parent_data+  skb_checksum_help+  __skb_gso_segment+  remove_proc_subtree+  pci_choose_state+ # required by reboot-mode.ko   devres_release   kernel_kobj

10 目前已知的GKI和非GKI的差异

1,GKI的版本dts里面不能同时配置多个camera

非GKI的kernel可以同时兼容多个camera,如兼容ov5695、gc8034等。

2,GKI的版本同一个I2C下不能注册相同地址的设备

非GKI的同一个I2C地址下可以注册地址一样的设备

来源地址:https://blog.csdn.net/weixin_43245753/article/details/129308364

--结束END--

本文标题: Rockchip Android13 GKI开发指南

本文链接: https://www.lsjlt.com/news/412314.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Rockchip Android13 GKI开发指南
    Rockchip Android13 GKI开发指南 文章目录 Rockchip Android13 GKI开发指南@[toc]1 GKI介绍1.1 什么是GKI1.2 什么产品需要使用...
    99+
    2023-09-20
    android GKI EDLA ROCKCHIP kernel
  • Magisk模块开发指南
    BusyBox Magisk整合了功能完整的BusyBox二进制文件(包括对SELinux的完整支持)。执行文件位于/data/adb/magisk/busybox。Magisk的BusyBox支持...
    99+
    2023-09-10
    android adb
  • Djangoapp开发的简便指南
    Djangoapp开发的简便指南(附代码示例) 引言:Django是一个流行的Python Web框架,它提供了快速而灵活的方式来开发高质量的Web应用程序。使用Django,我们可以...
    99+
    2024-02-23
    开发 django 简便
  • PHP MQTT客户端开发指南
    MQTT(Message Queuing Telemetry Transport)是一种轻量级的消息传输协议,通常用于物联网设备之间的通信。PHP是一种常用的服务器端编程语言,可以用来...
    99+
    2024-04-02
  • 基于PHP的SaaS开发指南
    基于PHP的SaaS开发指南 随着云计算和软件即服务(SaaS)的兴起,越来越多的开发者开始关注如何基于PHP语言开发SaaS应用程序。本文将提供一份基于PHP的SaaS开发指南,包括...
    99+
    2024-03-07
    开发 saas php
  • pycharm+robot开发及配置指南
    习惯了用pycharm写代码,突然让我用ride写,着实恶心,这才有了这篇教程。 pycharm配置 安装依赖插件:robot#patch 配置启动指令: robot的配置 依赖库...
    99+
    2024-04-02
  • PHP中的ERP系统开发指南
    随着现代企业的发展,ERP系统的重要性也越来越凸显出来。ERP系统可以帮助企业集成和管理计划、客户关系、供应链、人力资源等方面的数据和业务流程。PHP作为一种流行的编程语言,也可以用于开发ERP系统。在本文中,我们将分享一些PHP中的ERP...
    99+
    2023-05-21
    指南 PHP ERP系统开发
  • C# 上位机开发新手指南
    C#是一种面向对象的编程语言,广泛应用于上位机和桌面应用程序开发。下面是C#上位机开发的新手指南:1、学习C#基础知识:首先,需要掌握C#语言的基本语法和面向对象的编程概念,包括类、对象、继承、多态、接口等。可以从一些入门级的C#教程开始学...
    99+
    2023-10-27
    上位机 上位机开发
  • PHP云原生应用开发指南
    非常抱歉,由于您没有提供文章标题,我无法为您生成一篇高质量的文章。请您提供文章标题,我将尽快为您生成一篇优质的文章。...
    99+
    2024-05-16
  • C#上位机开发完整指南
    C#上位机开发完整指南可以分为以下几个步骤:1、准备开发环境:首先,需要安装一个适合C#开发的IDE,例如Visual Studio。同时,确保计算机上安装了.NET Framework或.NET Core SDK。2、创建项目:打开Vi...
    99+
    2023-10-27
    C#开发环境 上位机开发 上位机
  • 揭秘AMD:JavaScript模块化开发指南
    AMD(Asynchronous Module Definition)规范是一种定义和加载JavaScript模块的标准。通过使用AMD,您可以将应用程序分解为独立模块,从而增强代码的可重用性、可维护性和可测试性。 AMD的语法: AMD...
    99+
    2024-02-18
    AMD JavaScript模块化 模块化开发
  • SpringBoot自定义注解开发指南
    目录一、Java注解(Annotation)1、JDK基本注解2、JDK元注解二、自定义注解开发1、含义2、演示三、完成切面日志操作四、完成前端响应反应总结一、Java注解(Anno...
    99+
    2024-04-02
  • python 开发环境(PyCharm)搭建指南
    Python 的下载并安装 参考:Python基础教程——搭建Python编程环境 下载 Python Python 下载地址:官网 (1)点击【Downloads】>>>点击【Windows】>>>...
    99+
    2023-08-31
    python pycharm 开发语言
  • PHP中的CMS系统开发指南
    随着互联网的发展,网站已经成为人们获取信息和交流的重要方式。而为了更好地管理和维护网站内容,CMS (Content Management System) 系统应运而生。作为一种常用的建站工具,CMS 系统提供了一种简单、快捷、高效的方式来...
    99+
    2023-05-21
    PHP 开发指南 CMS系统
  • PHP与REST API安全开发指南
    rest api安全开发包括以下最佳实践:使用https加密通信,通过jwt验证授权,防止csrf攻击,通过pdo转义和参数化输入以防止sql注入,并使用异常处理来安全地处理错误。 P...
    99+
    2024-05-12
    php rest mysql sql语句 加密通信 数据访问 防止sql注入
  • PHP中的CRM系统开发指南
    随着互联网的发展,越来越多的企业开始意识到客户关系管理(CRM)的重要性,而在CRM系统的开发中,PHP一直是最受欢迎的开发语言之一。本文将为您介绍PHP中的CRM系统开发指南,让您能够更快速、高效地开发出适合自己企业的CRM系统。确定CR...
    99+
    2023-05-21
    PHP CRM系统 开发指南
  • PyCharm远程开发实用指南:提高开发效率
    PyCharm是一款功能强大的Python集成开发环境(IDE),广泛用于Python开发者进行代码编写、调试和项目管理。在实际的开发过程中,大多数开发者都会面临不同的问题,比如如何提...
    99+
    2024-02-23
    效率 pycharm 远程开发
  • 《Odoo开发指南》精选分享—第1章-开
      在进入Odoo开发之前,我们需要建立我们的开发环境,并学习它的基本管理任务。 在本章中,我们将学习如何设置工作环境,在这里我们将构建我们的Odoo应用程序。我们将学习如何设置Debian或Ubuntu系统来托管开发服务器实例,...
    99+
    2023-01-30
    指南 Odoo
  • PHP中的论坛网站开发指南
    随着互联网的发展,论坛网站成为了人们交流、分享、学习的重要平台之一。而在论坛网站的开发中,PHP是一种常用的编程语言。本文将介绍PHP中论坛网站开发的指南,包括论坛功能的实现、用户管理、数据库设计等方面。一、论坛功能的实现1.1 用户注册与...
    99+
    2023-05-21
    PHP 开发指南 论坛网站
  • PHP中的财务系统开发指南
    随着互联网时代的到来,许多企业开始转型发展,把业务扩展到互联网上,更好地满足用户需求。而财务系统作为一个至关重要的业务系统,也必须要跟随这个趋势进行升级和改造。本文将会为大家介绍PHP中的财务系统开发指南。一、财务系统开发的基本流程数据库设...
    99+
    2023-05-22
    PHP 开发指南 财务系统
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作