第六章 Android SDK开发本章向用户介绍如何对RK3568 Android SDK进行开发包括u-boot开发、Linux内核开发、Android系统开发、Android应用开发虽然本SDK目前适用于正点原子ATK-DLRK3568开发板但是用户可以基于本SDK进行二次开发、定制以适配自己的Android产品基于本SDK可以有效实现系统定制和应用移植开发帮助用户快速开发、提高开发效率6.1 U-Boot开发U-Boot源码在/u-boot目录如下所示图6.1.1 U-Boot源码目录RK提供了一份文档详细向用户介绍了Rockchip平台U-Boot所涉及到的知识点、技术点包括Rockchip平台U-Boot基础简介、U-Boot架构、U-Boot启动流程、U-Boot系统模块、驱动模块、Kernel-DTB、AB系统、AVB安全启动、TPL、SPL、U-Boot快捷键等等内容非常多对U-BootRockchip平台U-Boot不太熟悉的用户建议一定要去看看该文档的路径为/RKDocs/common/u-boot/Rockchip_Developer_Guide_UBoot_Nextdev_CN.pdf。同样ATK-DLRK3568开发板资料包中也有提供路径为开发板光盘A盘-基础资料08、RK官方文档Androidcommonu-bootRockchip_Developer_Guide_UBoot_Nextdev_CN.pdf。6.1.1 U-Boot的设备树U-Boot中RK3568平台使用的设备树文件是/arch/arm/dts/rk3568-evb.dts该设备树文件包含了rk3568.dtsi和rk3568-u-boot.dtsi包含关系如下rk3568-evb.dtsrk3568.dtsirk3568-u-boot.dtsi原生的U-Boot只支持U-Boot自己的DTBRK平台在原生U-Boot基础上增加了kernel DTB机制的支持即U-Boot会使用kernel DTB去初始化外设。这样设计的目的主要是为了兼容外设板级差异譬如power、clock、display等。U-Boot设备树负责初始化存储、调试串口等基础外设而kernel设备树初始化存储、调试串口之外的外设譬如LCD显示、千兆网等。执行U-Boot代码时先用U-Boot的设备树完成存储、调试串口的初始化操作然后从存储上加载kernel的设备树并转而使用这份设备树继续初始化其余外设。所以用户一般不需要去修改U-Boot的设备树文件除非更换调试串口。6.1.2 U-Boot编译U-Boot源码目录下提供了一个编译脚本make.sh可以直接使用该脚本编译U-Boot源码譬如在U-Boot源码目录下执行如下命令编译U-Boot./make.sh rk3568图6.1.2.1 编译U-Boot源码(1)图6.1.2.2 编译U-Boot源码(2)编译完成后将会生成uboot.img和rk356x_spl_loader_v1.13.112.bin两个镜像文件。如下所示图6.1.2.3 U-Boot编译后生成的镜像当然除了这两个镜像之外还生成了很多的.bin镜像譬如bl31_xxx.bin、tee.bin、u-boot.bin、u-boot-dtb.bin、u-boot-nodtb.bin等等这些镜像都是中间产物最终烧录到开发板只有uboot.img和rk356x_spl_loader_v1.13.112.bin接下来讲一下这两个镜像文件。uboot.img镜像前面提到过uboot.img是由多个镜像合并而成包括u-boot镜像、u-boot dtb以及trust镜像ARM Trusted Firmware OP-TEE。uboot.img是一种FITflattened image tree格式镜像支持任意多个image打包和校验。使用file命令查看uboot.img如下所示FIT使用itsimage source file文件来描述image的信息最后通过mkimage工具生成itbflattened image tree blob镜像那么这个itb镜像其实就是uboot.img镜像uboot.img镜像通常含有多份itb镜像如下所示uboot.img uboot.itb * NN一般是2这种设计也是为了避免如果第一份镜像启动失败、还可以尝试使用第二份镜像启动。U-Boot编译成功后U-Boot源码目录下会生成很多.bin镜像以及.dtb镜像图6.1.2.4 U-Boot目录下的bin镜像整理一下如下表所示表6.1.2.1 目录镜像介绍uboot.img镜像最终由u-boot-nodtb.bin、u-boot.dtb、bl31_0x00040000.bin、bl31_0x00068000.bin、bl31_0x0006a000.bin、bl31_0xfdcc1000.bin、bl31_0xfdcce000.bin、bl31_0xfdcd0000.bin、tee.bin这些镜像合并而成。uboot.img是FIT格式镜像使用its文件来描述image的信息最终通过/tools/mkimage工具生成itb镜像its文件和生成的itb镜像都在/fit目录下图6.1.2.5 fit目录下的文件u-boot.its文件语法规则与设备树DTS的语法规则相同非常灵活u-boot.its文件中描述了有哪些镜像会参与合并成uboot.itb以及这些镜像的路径等信息/dts-v1/;/{descriptionFIT Image with ATF/OP-TEE/U-Boot/MCU;#address-cells1;images{uboot{descriptionU-Boot;data/incbin/(u-boot-nodtb.bin);typestandalone;archarm64;osU-Boot;compressionnone;load0x00a00000;hash{algosha256;};};atf-1{descriptionARM Trusted Firmware;data/incbin/(./bl31_0x00040000.bin);typefirmware;archarm64;osarm-trusted-firmware;compressionnone;load0x00040000;hash{algosha256;};};atf-2{descriptionARM Trusted Firmware;data/incbin/(./bl31_0xfdcc1000.bin);typefirmware;archarm64;osarm-trusted-firmware;compressionnone;load0xfdcc1000;hash{algosha256;};};atf-3{descriptionARM Trusted Firmware;data/incbin/(./bl31_0x0006a000.bin);typefirmware;archarm64;osarm-trusted-firmware;compressionnone;load0x0006a000;hash{algosha256;};};atf-4{descriptionARM Trusted Firmware;data/incbin/(./bl31_0xfdcd0000.bin);typefirmware;archarm64;osarm-trusted-firmware;compressionnone;load0xfdcd0000;hash{algosha256;};};atf-5{descriptionARM Trusted Firmware;data/incbin/(./bl31_0xfdcce000.bin);typefirmware;archarm64;osarm-trusted-firmware;compressionnone;load0xfdcce000;hash{algosha256;};};atf-6{descriptionARM Trusted Firmware;data/incbin/(./bl31_0x00068000.bin);typefirmware;archarm64;osarm-trusted-firmware;compressionnone;load0x00068000;hash{algosha256;};};optee{descriptionOP-TEE;data/incbin/(tee.bin);typefirmware;archarm64;osop-tee;compressionnone;load0x8400000;hash{algosha256;};};fdt{descriptionU-Boot dtb;data/incbin/(./u-boot.dtb);typeflat_dt;archarm64;compressionnone;hash{algosha256;};};};configurations{defaultconf;conf{descriptionrk3568-evb;rollback-index0x0;firmwareatf-1;loadablesuboot,atf-2,atf-3,atf-4,atf-5,atf-6,optee;fdtfdt;signature{algosha256,rsa2048;key-name-hintdev;sign-imagesfdt,firmware,loadables;};};};};由此可知its文件的语法规则与DTS是完全相同的并无差别详情可以参考U-Boot/doc/uImage.FIT/目录下的文档。 对于ARM Trusted Firmware以及OP-TEE它们是闭源的RK只提供了二进制镜像文件并没提供源码。ARM Trusted Firmware固件对应U-Boot/bl31.elf、OP-TEE固件对应U-Boot/tee.bin如下所示图6.1.2.6 ATF固件和OP-TEE固件编译U-Boot源码之前这两个镜像是不存在的编译之后才会出现实际上来自于/rkbin/bin/rk35/rk3568_bl31_v1.34.elf和/rkbin/bin/rk35/rk3568_bl32_v2.08.bin这两个镜像文件。打包uboot.itb的过程中会将/rkbin/bin/rk35/rk3568_bl31_v1.34.elf拷贝到/bl31.elf将/rkbin/bin/rk35/rk3568_bl32_v2.08.bin拷贝到/tee.bin。bl31.elf固件并不是直接打包进uboot.itb而是将bl31.elf分解成多个bl31_xxx.bin文件最终将这些bl31_xxx.bin镜像打包进uboot.itb。图6.1.2.7 bl31_xxx.bin固件2. rk356x_spl_loader_v1.13.112.bin镜像再来讲一下rk356x_spl_loader_v1.13.112.bin这个镜像文件就是前面给大家介绍的MiniLoaderAll.bin镜像由rk356x_spl_loader_v1.13.112.bin重命名而来。前面给大家讲过MiniLoaderAll.bin是运行在RK3568平台U-Boot之前的一段Loader代码也就是比U-Boot更早阶段的Loader。MiniLoaderAll.bin由两部分构成TPL(Tiny Program Loader) SPL(Secondary Program Loader)构成。TPL运行在SRAM中片内内存由rk3568芯片内部所固化的Maskrom代码引导启动其作用是负责完成DRAM的初始化工作、并启动SPLSPL运行在DDRSPL的作用是负责完成系统的lowlevel初始化、完成uboot.img的加载和引导工作。TPL、SPL分别有两种实现方案开源版本和闭源版本。闭源版本RK向用户提供了tpl和spl的二进制镜像文件不提供其对应的源码其所在路径如下/rkbin/bin/rk35/rk3568_ddr_1560MHz_v1.13.bin --------------- tpl/rkbin/bin/rk35/rk356x_spl_v1.12.bin ------------------------------- spl/rkbin/bin目录下存放了很多RK提供的二进制文件这些二进制文件都是不开源的所以只有二进制文件。开源版本tpl和spl镜像也可以通过u-boot源码编译出来既然是U-Boot源码的一部分自然是开源的。使用“./make.sh rk3568”命令编译完U-Boot源码后除了会生成u-boot镜像之外还会编译生成spl以及tpl镜像spl镜像位于/spl目录下图6.1.2.8 spl目录下的文件该目录下也存在很多镜像文件镜像 说明u-boot-spl elf格式的spl镜像u-boot-spl.bin spl镜像包含spl dtbu-boot-spl.dtb spl dtbu-boot-spl-dtb.bin spl镜像包含spl dtb与u-boot-spl.bin是一样的u-boot-spl-nodtb.bin spl镜像不包含spl dtb表6.1.2.2 spl目录镜像介绍tpl镜像位于/tpl目录下图6.1.2.9 tpl目录下的文件在RK的文档中将RK提供的闭源TPL镜像/rkbin/bin/rk35/rk3568_ddr_1560MHz_v1.13.bin称为ddr bin将闭源SPL镜像/rkbin/bin/rk35/rk356x_spl_v1.12.bin称为miniloader。rk356x_spl_loader_v1.13.112.bin镜像文件是由/tools/boot_merger工具制作而成该工具由RK提供。使用boot_merger工具制作rk356x_spl_loader_v1.13.112.bin镜像时需要提供一个.ini文件.ini文件用于描述image的信息在/rkbin/RKBOOT/目录下有很多.ini文件如下图所示图6.1.2.10 .ini文件对于RK3568平台来说它默认使用的是RK3568MINIALL.ini。文件内容如下[CHIP_NAME]NAMERK3568[VERSION]MAJOR1MINOR1[CODE471_OPTION]NUM1Path1bin/rk35/rk3568_ddr_1560MHz_v1.13.binSleep1[CODE472_OPTION]NUM1Path1bin/rk35/rk356x_usbplug_v1.14.bin[LOADER_OPTION]NUM2LOADER1FlashDataLOADER2FlashBootFlashDatabin/rk35/rk3568_ddr_1560MHz_v1.13.binFlashBootbin/rk35/rk356x_spl_v1.12.bin[OUTPUT]PATHrk356x_spl_loader_v1.13.112.bin[SYSTEM]NEWIDBtrue[FLAG]471_RC4_OFFtrueRC4_OFFtrueFlashData指定了tpl镜像的路径FlashBoot指定了spl镜像的路径。所以默认情况下执行“./make.sh rk3568”命令生成的rk356x_spl_loader_v1.13.112.bin使用的是RK闭源的ddr bin/rkbin/bin/rk35/rk3568_ddr_1560MHz_v1.13.bin和RK闭源的miniloader/rkbin/bin/rk35/rk356x_spl_v1.12.bin。除了使用RK闭源的miniloader之外还可以使用U-Boot编译出来的开源spl注意不能用U-Boot编译出来的tpl镜像我测试过直接启动不了估计是U-Boot TPL部分代码支持不够完善执行如下命令可以用U-Boot生成的spl镜像/spl/u-boot-spl.bin替换RK闭源的miniloader去制作rk356x_spl_loader_v1.13.112.bin./make.sh --spl图6.1.2.11 使用开源SPL生成MiniLoaderAll.bin默认情况 MiniLoaderAll.bin 闭源ddr bin 闭源miniloader执行“./make.sh --spl”后MiniLoaderAll.bin 闭源ddr bin 开源SPL。make.sh脚本还支持很多其它的参数执行“./make.sh -h”可以查看它的使用帮助信息大家自己去捣鼓。图6.1.2.12 make.sh脚本帮助信息3. 镜像启动顺序这里讲一下RK3568平台镜像的启动顺序。涉及到Trust目前Rockchip的64位SoC平台上使用的是ARM Trusted Firmware OP-TEE的组合来实现Trust32位SoC平台上使用的是OP-TEE。ARM Trusted Firmware的体系架构里将整个系统分成四种安全等级分别为EL0、EL1、EL2、EL3。将整个安全启动的流程阶段定义为BL1、BL2、BL31、BL32、BL33其中ARM Trusted Firmware自身的源代码里提供了BL1、BL2、BL31的功能。Rockchip平台仅使用了其中的BL31的功能对于BL1和BL2RK有自己的一套实现方案。所以在Rockchip平台上我们一般也可以“默认”ARM Trusted Firmware指的就是BL31而BL32使用的则是OP-TEE。如果把上述这种阶段定义映射到Rockchip平台各级固件上对应关系为MaskromRK芯片内部固化的引导代码BL1、MiniLoaderAll.binBL2、TrustBL31ARM Trusted Firmware BL32OP-TEE、U-BootBL33。所以Linux系统的镜像启动顺序为Maskrom MiniLoaderAll.bin uboot.img boot.img Android还可以进行细分Maskrom TPL(ddr bin) SPL(miniloader) Trust(ATF OP-TEE) u-boot kernel Android这个启动流程通过打印信息就可以分析出来以下就是ATK-DLRK3568开发板上电启动时的打印信息执行ddr bin对开发板的DDR进行初始化DDR Version V1.13 20220218Inddrconfig:15DDR4, 324MHzBW32 Col10 Bk4 BG2 CS0 Row16 CS1 Die BW16 Size2048MBtdqss: cs0 dqs0: 24ps, dqs1: -48ps, dqs2: -96ps, dqs3: -96ps,change to: 324MHzclk skew:0x87PHY drv:clk:37,ca:37,DQ:37,odt:0vrefinner:50%, vrefout:50%dram drv:34,odt:0change to: 528MHzclk skew:0x87PHY drv:clk:37,ca:37,DQ:37,odt:139vrefinner:50%, vrefout:61%dram drv:34,odt:120change to: 780MHzclk skew:0x87PHY drv:clk:37,ca:37,DQ:37,odt:139vrefinner:50%, vrefout:61%dram drv:34,odt:120change to: 1560MHz(final freq)clk skew:0x87PHY drv:clk:37,ca:37,DQ:37,odt:139vrefinner:50%, vrefout:61%dram drv:34,odt:120cs 0:the read training result:DQS0:0x32, DQS1:0x2c, DQS2:0x27, DQS3:0x30,min : 0xf 0xe 0xd 0x8 0x3 0x2 0x5 0x5 , 0x7 0x5 0x1 0x3 0x5 0x7 0x9 0x9 ,0x5 0x8 0x9 0x7 0x5 0x3 0x2 0x5 , 0xa 0x6 0x5 0x2 0x7 0xb 0x7 0x9 ,mid :0x28 0x27 0x27 0x21 0x1b 0x1b 0x1e 0x1c ,0x1f 0x1d 0x19 0x1c 0x1e 0x1f 0x21 0x1e ,0x1d 0x20 0x20 0x1e 0x1d 0x1c 0x1a 0x1d ,0x23 0x1e 0x1e 0x1a 0x20 0x23 0x20 0x21 ,max :0x41 0x41 0x41 0x3b 0x34 0x35 0x37 0x34 ,0x38 0x36 0x32 0x36 0x37 0x37 0x39 0x34 ,0x36 0x39 0x37 0x36 0x36 0x35 0x33 0x35 ,0x3c 0x37 0x38 0x32 0x39 0x3c 0x39 0x39 ,range:0x32 0x33 0x34 0x33 0x31 0x33 0x32 0x2f ,0x31 0x31 0x31 0x33 0x32 0x30 0x30 0x2b ,0x31 0x31 0x2e 0x2f 0x31 0x32 0x31 0x30 ,0x32 0x31 0x33 0x30 0x32 0x31 0x32 0x30 ,the write training result:DQS0:0x8b, DQS1:0x7e, DQS2:0x74, DQS3:0x74,min :0x76 0x76 0x7c 0x77 0x6b 0x6d 0x6f 0x6f 0x78 ,0x6d 0x6e 0x69 0x6e 0x6c 0x6e 0x74 0x6d 0x69 ,0x67 0x63 0x6a 0x69 0x64 0x5e 0x65 0x64 0x60 ,0x63 0x5e 0x63 0x5d 0x63 0x5f 0x61 0x67 0x61 ,mid :0x8f 0x8e 0x93 0x8e 0x81 0x83 0x85 0x87 0x91 ,0x84 0x85 0x7d 0x84 0x83 0x85 0x88 0x84 0x7e ,0x7c 0x7d 0x7f 0x7d 0x7a 0x76 0x78 0x7a 0x78 ,0x79 0x74 0x78 0x71 0x79 0x78 0x78 0x7c 0x79 ,max :0xa9 0xa7 0xab 0xa6 0x97 0x9a 0x9c 0xa0 0xaa ,0x9c 0x9c 0x92 0x9b 0x9b 0x9c 0x9c 0x9c 0x93 ,0x91 0x97 0x94 0x91 0x91 0x8e 0x8c 0x91 0x90 ,0x90 0x8b 0x8e 0x86 0x8f 0x91 0x90 0x91 0x91 ,range:0x33 0x31 0x2f 0x2f 0x2c 0x2d 0x2d 0x31 0x32 ,0x2f 0x2e 0x29 0x2d 0x2f 0x2e 0x28 0x2f 0x2a ,0x2a 0x34 0x2a 0x28 0x2d 0x30 0x27 0x2d 0x30 ,0x2d 0x2d 0x2b 0x29 0x2c 0x32 0x2f 0x2a 0x30 ,outddr bin结束开始运行SPL(miniloader)代码U-Boot SPL board initU-Boot SPL 2017.09-gaaca6ffec1-211203 #zzz (Dec 03 2021 - 18:42:16)unknown raw ID phNunrecognized JEDEC id bytes: 00, 00, 00Trying to boot from MMC2MMC error: The cmd index is 1, ret is -110Card did not respond to voltage select!mmc_init: -95, time 10spl: mmc init failed with error: -95Trying to boot from MMC1SPL: A/B-slot: _a, successful: 0, tries-remain: 7Trying fit image at 0x4000 sectorVerified-boot: 0Checking atf-1 0x00040000 … sha256(6204b6f381…) OKChecking uboot 0x00a00000 … sha256(08dca575f2…) OKChecking fdt 0x00b35800 … sha256(56cff76c01…) OKChecking atf-2 0xfdcc1000 … sha256(5563d929da…) OKChecking atf-3 0x0006a000 … sha256(b04372ab0f…) OKChecking atf-4 0xfdcd0000 … sha256(b46eaa95b8…) OKChecking atf-5 0xfdcce000 … sha256(2f8839c803…) OKChecking atf-6 0x00068000 … sha256(6e9d32ba23…) OKChecking optee 0x08400000 … sha256(66bbd17352…) OKJumping to U-Boot(0x00a00000) via ARM Trusted Firmware(0x00040000)Total: 236.326 msSPL结束(MiniLoaderAll.bin结束)跳转到了ATF和OP-TEEINFO: Preloader serial: 2NOTICE: BL31: v2.3():v2.3-365-gae7c295ca:derrick.huangNOTICE: BL31: Built : 15:37:13, May 17 2022INFO: GICv3 without legacy support detected.INFO: ARM GICv3 driver initialized in EL3INFO: pmu v1 is valid 220114INFO: dfs DDR fsp_param[0].freq_mhz 1560MHzINFO: dfs DDR fsp_param[1].freq_mhz 324MHzINFO: dfs DDR fsp_param[2].freq_mhz 528MHzINFO: dfs DDR fsp_param[3].freq_mhz 780MHzINFO: Using opteed sec cpu_context!INFO: boot cpu mask: 0INFO: BL31: Initializing runtime servicesINFO: BL31: Initializing BL32I/TC:I/TC: OP-TEE version: 3.13.0-641-g4167319d3 #hisping.lin (gcc version 10.2.1 20201103 (GNU Toolchain for the A-profile Architecture 10.2-2020.11 (arm-10.16))) #8 Wed Mar 16 15:14:56 CST 2022 aarch64I/TC: Primary CPU initializingI/TC: Primary CPU switching to normal world bootINFO: BL31: Preparing for EL3 exit to normal worldINFO: Entry point address 0xa00000INFO: SPSR 0x3c9进入到U-Boot开始执行U-Boot代码U-Boot 2017.09-gc2d9f80c05-220621 #tgg (Apr 10 2023 - 11:31:38 0800)Model: Rockchip RK3568 Evaluation BoardPreSerial: 2, raw, 0xfe660000DRAM: 2 GiBSysmem: initRelocation Offset: 7d343000Relocation fdt: 7b9f84e0 - 7b9fece0CR: M/C/IUsing default environmentdwmmcfe2b0000: 1, dwmmcfe2c0000: 2, sdhcife310000: 0Bootdev(atags): mmc 0MMC0: HS200, 200MhzPartType: EFIDM: v1boot mode: None…………图6.1.2.13 TPL(ddr bin)运行过程图6.1.2.14 SPL运行过程图6.1.2.15 Trust运行过程图6.1.2.16 U-Boot运行过程6.1.3 U-Boot的配置如果用户想要自己配置U-Boot可以在U-Boot源码目录下执行如下命令对其进行配置make rk3568_defconfig //选择配置文件make menuconfig //打开图形化配置界面运行结果如下所示图6.1.3.1 menuconfig图形化配置通过menuconfig图形化界面、用户可自行对U-Boot进行配置配置完成后运行以下命令保存配置make savedefconfig //把配置信息保存到defconfig文件中cp defconfig configs/rk3568_defconfig //用defconfig文件替换rk3568_defconfig保存配置后我们可以直接在U-Boot源码目录下执行make.sh脚本编译U-Boot源码也可以回到SDK根目录下执行build.sh脚本进行编译./make.sh rk3568 //在U-Boot源码目录下执行make.sh脚本编译cd …/ ./build.sh -U //在SDK根目录下执行build.sh脚本编译6.1.4 defconfig配置文件U-Boot中RK3568平台使用的defconfig配置文件为/configs/rk3568_defconfig开发者基本不用去改动它其实对于整个U-Boot来说如果你的产品没什么特殊的需求基本不用去动U-Boot源码。如果不使用make.sh脚本直接通过make命令配置U-Boot、然后编译U-Boot可以这样做make rk3568_defconfig -j24make PYTHONpython2 CROSS_COMPILE/prebuilts/gcc/linux-x86/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu- all --jobs24表示SDK的目录根据你自己的实际路径修改编译内核、编译U-Boot用的都是这个交叉编译器/prebuilts/gcc/linux-x86/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-。图6.1.4.1 配置U-Boot图6.1.4.2 编译U-Boot编译完成之后并没有生成uboot.img和rk356x_spl_loader_v1.13.112.bin因为这两个镜像属于pack打包镜像需要通过专门的工具或脚本才能生成make.sh脚本中已经添加了打包操作所以使用make.sh脚本编译后会生成uboot.img和rk356x_spl_loader_v1.13.112.bin。当然我们可以执行如下命令去打包生成这两个镜像./scripts/fit.sh --ini-loader …/rkbin/RKBOOT/RK3568MINIALL.ini --chip RK3568图6.1.4.3 执行打包操作(1)图6.1.4.4 执行打包操作(2)执行成功便会生成这两个镜像文件图6.1.4.5 uboot.img和MiniLoaderAll.binscripts/fit.sh脚本会调用tools/mkimage工具生成uboot.img、调用tools/boot_merger工具生成rk356x_spl_loader_v1.13.112.bin。还支持多种其它的用法大家可以自己去摸索。如果需要清理U-Boot源码工程执行“make distclean”命令进行清理make distclean图6.1.4.6 清理U-Boot6.1.5 快捷键RK平台U-Boot支持通过串口组合键触发一些事件用于烧写、调试等操作。RK U-Boot运行后不会出现启动倒计时启动内核的倒计时它会直接启动内核跳过倒计时。当然可以通过串口组合键“Ctrl C”打断它启动内核、从而进入U-Boot命令行模式。RK U-Boot支持如下串口组合键开机时长按Ctrl C进入U-Boot命令行模式。Ctrl D进入Loader烧写模式除了2.9.1小节中介绍的进入Loader模式的方法之外这也是一种进入Loader烧写模式的方法。Ctrl B进入Maskrom烧写模式除了2.9.1小节中介绍的进入Maskrom模式的方法之外这也是一种进入Maskrom烧写模式的方法。Ctrl F进入fastboot模式。Ctrl M打印bidram/system的信息。Ctrl I使能内核initcall_debug。Ctrl P打印cmdline信息。Ctrl SStarting kernel…之后进入U-Boot命令行。大家可以自己测试下这里不多说。6.1.6 HW-ID DTBRK平台U-Boot支持检测GPIO或者ADC的硬件状态实现动态加载不同的kernel DTB也就是说它可以根据GPIO或者ADC的硬件状态从多份Kernel DTB文件中找到与当前硬件状态匹配的DTB进行加载譬如说某个固定的ADC值、固定的某GPIO电平RK将这种功能称为HW-ID DTB。譬如正点原子ATK-DLRK3568开发板的MIPI屏接口支持5.5寸720p MIPI屏正点原子5.5寸MIPI屏、同样也支持5.5寸1080p MIPI屏正点原子5.5寸MIPI屏但是这两种屏的时序参数以及初始化参数都是不同的两种MIPI屏就需要两个DTS文件分别进行配置所以会导致出现这样一个情况使用720p MIPI屏时需要烧录720p MIPI屏对应的DTB使用1080p MIPI屏时需要烧录1080p MIPI屏对应的DTB。显得非常麻烦此时可以通过HW-ID DTB来解决这种麻烦首先我们需要将720p MIPI屏的DTB文件和1080p MIPI屏的DTB文件全打包进同一个resource.img镜像中U-Boot引导内核时会检测硬件状态ADC或GPIO从resource.img镜像中找出与当期硬件状态某个固定的ADC值或某个GPIO的电平相匹配的DTB、并加载。硬件设计参考目前支持检测ADC和GPIO两种硬件状态。正点原子ATK-DLRK3568开发板MIPI屏接口处有设计一个SARADC_VIN2_LCD_ID引脚图6.1.6.1 MIPI屏接口