一、硬件信息

  1. RV1126/RV1109 系列芯⽚内置硬件解压缩模块 -- decom,可以极⼤得提升系统启动速度

  2. RV1126/RV1109 内置⼀个 MCU,MCU 在 SoC 上电后就会快速启动,迅速初始化 Camera 和 ISP,然后尽可能快得保存前⼏帧图像。

  3. RV1126 支持快速启动的存储介质

二、配置快速启动的流程

刚开始做快速启动的时候,我就走了一个弯路,以为只要将 uboot、kernel、rootfs中不要的组件裁剪后,便能加快开启的速度,实现快速启动的效果,把不用的组件裁剪后,发现开机速度并没有明显的加快。

后来查看资料才发现,快速启动没有跑 uboot,其中 kernel、rootfs以及MCU的系统均通过SPL加载,并且 kernel 和 rootfs 都是尽可能裁剪后的组件。在 RV1126 中,快速启动的基本流程如下

  • 内核和rootfs通过SPL加载,裁剪掉uboot;
  • 内核和rootfs通过硬件解压缩;
  • MCU协助初始化ISP/Camera;
  • 驱动并⾏初始化;
  • 内核裁剪;
  • rootfs裁剪;
  • 算法模型预加载;
  • ⽤⼾态主进程并⾏初始化;
  • Wi-Fi⽹络连接优化;

三、快速启动配置

在 RV1126 提供的 SDK 包已经是比较完善的了,对于快速启动,提供了对应的配置文件,只需要编译一下即可得到快速快速启动的固件,下来后便实现了快速启动。

RV1126 提供了一些快速启动的配置文件,路径在 sdk/device/rockchip/rv1126_rv1109 下,如下所示

注意: 可以从板级配置文件中找到对应组件的配置文件名,遇到问题后可以找到相应为配置文件进行修改,如下图所示:
RV1126 快速启动-LMLPHP

  1. 选择配置文件,这里我使用的是 BoardConfig-tb-v13.mk,根据自己的需要,如下图所示:

    ./build.sh lunch
    

    RV1126 快速启动-LMLPHP

  2. 编译全部文件

    ./build.sh
    
  3. 烧写进行
    这里可以烧写所有文件,也可以直接烧写 update.img 文件,如下图所示:
    RV1126 快速启动-LMLPHP

    注意: 编译完成后,在日志中会打印电源芯片的配置电压,烧写进行之前必须查看自己的电源配置是否正常,否则可能会烧坏自己的MCU,不了解板子电压的,请咨询相关人事

注意: 准确来说,做完这一步,快速启动已经实现了,但是从上面的启动流程来看,有很多步奏都没操作过,做出来的系统不肯定不是自己需要的,并且板级配置文件还是官方提供的,所以不同的板子可能会遇到不同的问题,下面流程便是更改启动流程中所以的文件和遇到的一些错误。

四、快速启动机制

在了解快速启动机制之前,先看看快速启动的分区。在快速启动中固件的镜像分区和常规IPC固件不⼀样,分区配置可以参考 SDK 中 device/rockchip/rv1126_rv1109 ⽬录下的⽂件,不只到自己的分区文件是那个,上面内容中有说明,回到笔记第三大点查看,快速启动⼀般分为了 Uboot、boot、userdata(oem)

  1. uboot 分区
    说明:uboot分区实际打包了 MCU 镜像和 Trust 镜像,他们会被 SPL 加载;
    配置文件: rkbin/RKTRUST/RV1126TOS_TB.ini(在 sdk\u-boot\configs\rv1126-emmc-tb.config 中配置)
    RV1126 快速启动-LMLPHP

    RV1126 快速启动-LMLPHP

    有需要的可以更改相应的 bin 文件,文件在 rkbin/rv11/ 目录下,如果没有自己需要的文件可以找官方人员。

  2. boot 分区
    说明:采⽤fit格式打包,其中包含了dtb、内核镜像和rootfs镜像,rootfs镜像⼀般采⽤ramdisk,它们被
    SPL预加载,并采⽤decom硬件解压缩。
    配置⽂件: device/rockchip/rv1126_rv1109/boot-tb.its

  3. userdata(oem) 分区
    说明:根据需要,自己可以单独开⼀个可读写的分区,新增分区可以查看相关博客,我后面也会有相关的笔记记录

4.1 SPL快速启动机制

U-Boot SPL 下⽀持 fit 格式的快速开机,同时⽀持按键进⼊loader模式和低电检测

  1. 配置

    CONFIG_SPL_KERNEL_BOOT=y // 开启快速开机功能
    CONFIG_SPL_BLK_READ_PREPARE=y // 开启预加载功能
    CONFIG_SPL_MISC_DECOMPRESS=y // 开启解压功能
    CONFIG_SPL_ROCKCHIP_HW_DECOMPRESS=y
    

    注意: 在文件 sdk\u-boot\configs\rv1126-emmc-tb.config 和 sdk\u-boot\configs\rv1126_defconfig 文件中有相应的配置

  2. 预加载功能
    U-Boot SPL ⽀持预加载功能,使能预加载功能后,可以在执⾏其他程序的同时加载固件。⽬前主要⽤来预加载ramdisk。device/rockchip/rv1126_rv1109/boot-tb.its 配置文件如下

    ramdisk {
    data = /incbin/("./images-tb/ramdisk.gz");
    compression = "gzip"; // 压缩格式
    type = "ramdisk";
    arch = "arm";
    os = "linux";
    preload = <1>; // 预加载标志
    comp = <0x5800000>; // 加载地址
    load = <0x2800000>; // 解压地址
    decomp-async; // 异步解压
    hash {
    algo = "sha256";
    uboot-ignore = <1>; // 不做hash校验
    };
    };
    

4.2 内核快速启动机制

  1. 配置

    CONFIG_ROCKCHIP_THUNDER_BOOT=y // 开启快速开机功能
    CONFIG_ROCKCHIP_THUNDER_BOOT_MMC=y // 开启⽀持eMMC快速开机优化功能
    CONFIG_ROCKCHIP_THUNDER_BOOT_SFC=y // 开启⽀持SPI Nor快速开机优化功能
    CONFIG_VIDEO_ROCKCHIP_THUNDER_BOOT_ISP=y // 开启⽀持ISP快速开机优化功能
    

    注意: 在文件 sdk\kernel\arch\arm\configs\rv1126-tb.config 中有相应的配置

  2. 设备树配置
    为了快速开机,SPL 不会依据实际的硬件参数修改 kernel dtb 的参数,所以有些参数需要⾃⼰配置,具体需要配置的参数有 “Memory” 和 “ramdisk解压前后⼤小”

    详见 kernel/arch/arm/boot/dts/rv1126-thunder-boot.dtsi

    memory: memory {
        device_type = "memory";
        reg = <0x00000000 0x20000000>;     // 离线帧预留内存,给MCU抓拍使⽤,根据需要分配,不需要MCU快速抓拍功能,建议删除
    };
    reserved-memory {
        trust@0 {
            reg = <0x00000000 0x00200000>;     // trust 空间
            no-map;
        };
        trust@200000 {
            reg = <0x00200000 0x00008000>;
        };
        ramoops@210000 {
            compatible = "ramoops";
            reg = <0x00210000 0x000f0000>;
            record-size = <0x20000>;
            console-size = <0x20000>;
            ftrace-size = <0x00000>;
            pmsg-size = <0x50000>;
        };
        rtos@300000 {
            reg = <0x00300000 0x00100000>;     // 预留给⽤⼾端使⽤,没有使⽤可以删掉
            no-map;
        };
        ramdisk_r: ramdisk@2800000 {
            reg = <0x02800000 (48 * 0x00100000)>;     // 解压源地址和⼤小,可以依据实际⼤小进⾏更改
        };
        ramdisk_c: ramdisk@5800000 {
            reg = <0x05800000 (20 * 0x00100000)>;     // 压缩源地址和⼤小,可以依据实际⼤小进⾏更改
        };
    };
    

    注意: 设备树文件中 eMMC 和 SPI Nor 的配置不同,请参考 RV1126 SDK 中提供的资料,这里我就附上了

4.3 驱动并⾏加载机制

快速开机的内核启动过程,为了充分利⽤多核优势,并⾏运⾏相同 level 的 initcall。功能需要 ONFIG_INITCALL_ASYNC=y ,在 arch/arm/configs/rv1126-tb.config 中已经默认开启

注意: 开启多核后,camera 驱动需要提前到 device_initcall(⼀般通过 module_i2c_driver 注册),而不要使⽤
device_initcall_sync。因为没有其它驱动在 device_initcall_sync 这个时刻初始化,⽆法并⾏。

4.4 精简版 kernel

# 配置自己需要的组件 
make menuconfig

# 配置完成,把.config 保存为 defconfig
make ARCH=arm savedefconfig

# 更新修改好的配置文件到对应的 defconfig 文件,否则不生效,如
cp defconfig arch/arm/configs/alientek_rv1126_defconfig

4.5 精简版 rootfs

  1. 配置工具包
    这个就不过多介绍了,需要的可以参考我之前的笔记【Buildroot】工具包使用

  2. busybox配置
    配置文件在 buildroot/board/rockchip/common/tinyrootfs/busybox.config

注意: 配置完成后注意修改此内存⼤小,rootfs压缩后最⼤⽀持的⼤小20MB,解压后的⼤小为48MB,可以使用用命令 ls -al 查看 rootfs 压缩文件前后的大小,配置文件在 kernel/arch/arm/boot/dts/rv1126-thunder-boot.dtsi ,配置方式如下

ramdisk_r: ramdisk@2800000 {
    reg = <0x02800000 (48 * 0x00100000)>; // 解压源地址和⼤小,可以依据实际⼤小进⾏更改
};

ramdisk_c: ramdisk@5800000 {
  reg = <0x05800000 (20 * 0x00100000)>; // 压缩源地址和⼤小,可以依据实际⼤小进⾏更改
};

4.6 快速抓拍

我使用的摄像头不需要 ISP 功能,所以将 ISP 功能给关了,这里就没有进行测试,需要的小伙伴可以自行尝试,教程见 RV1126参考资料/RV1126_RV1109/Fastboot/Rockchip_Developer_Guide_RV1126_RV1109_Battery_Product_CN.pdf

五、常见错误

  1. 内存配置不对
    在加载阶段可能会出现硬件配置错误,需要更改对应的 .bin 文件,比如 正点的 RV1126 开发板的内存使用的是 ddr4 所以需要更改 sdk/rkbin/RKBOOT/RV1126MINIALL_EMMC_TB.ini 文件,如下图所示
    RV1126 快速启动-LMLPHP

  2. 打包错误
    在文件 device/rockchip/common/mkfirmware.sh 打包脚本中,默认打包了 demo 分区,但是配置后可能没有 demo 分区,所以带打包阶段会出现错误,只需要屏蔽对应分区的打包动作即可,如下图所示
    RV1126 快速启动-LMLPHP

  3. 设备树不生效或找不到 rv1126-alientek.dtb 文件
    这个是因为设备树的编译没有进行修改,导致快速启动的设备树不起作用。在 build.sh 脚本中确定了打包 dtb 的变量,所以值需要结合更改 sdk/kernel/scripts/mkmultidtb.py 文件中的内容即可,更改方式如下图所示:
    RV1126 快速启动-LMLPHP
    注意: 主要确保自己配置的设备树文件生效,具体可以参考 “文档教程(非常重要)/【正点原子】ATK-DLRV1126%20系统开发手册V1.6.pdf” 中的“4.6.5 单个设备树编译” 中的内容即可

  4. 确实驱动
    这个相对比较简单了,只需要参考 rv1126-alientek.dts 设备树文件,天机自己需要的驱动即可,是在不行,直接全部搬过来也是可以的,如果只是测试的话,可以不用更改问题3 中的设备树文件,直接使用默认的 rv1126-alientek.dtb 也行。

  5. 驱动不加载
    检查完设备树后,发现驱动不加载,出现这个问题不要慌,值需要在驱动文件中加入下图中的内容即可,原因见笔记中 4.3 节内容
    RV1126 快速启动-LMLPHP

  6. CMA 内存错误
    查看命令 dmesg | grep -i reserve,如下图所示:
    RV1126 快速启动-LMLPHP

    RV1126 快速启动-LMLPHP

    遇到这个问题,可以结合笔记中 4.2 节内容,修改设备树 reserved-memory 节点和配置文件 sdk\kernel\arch\arm\configs\rv1126_defconfig 中的内容,如下图所示

    RV1126 快速启动-LMLPHP

    RV1126 快速启动-LMLPHP

  7. usb 功能调试

    BR2_PACKAGE_THUNDERBOOT_USE_EUDEV=y
    

    更多操作可以参考 《rv1126 —— udev机制、增加U盘识别功能、usbmount实现USB设置自动挂载》

  8. 找不到对应的 .xml ISP配置文件
    遇到这个问题,主要是 rootfs 中的配置错误,只需要修改 buildroot/configs/rockchip_rv1126_evb_tb_defconfig 的配置即可,如下图所示:
    RV1126 快速启动-LMLPHP

    RV1126 快速启动-LMLPHP

  9. rootfs 工具包和库文件的配置
    默认配置配置使用的是 mediaserver 测试应用,此应用跑起来后,会正常打开对应摄像头的图像,主要做一个演示。如果需要添加自己的应用,只需要裁剪 rootfs 即可,可以参考笔记中 4.5 节的内容

  10. adb 连接消失问题
    在 VM 虚拟中,连接 ADB 后,图标直接消失了。
    有大佬说要插设备后,从 USB 设备弹窗的形式连接就可以成功,但是我的 VM 已经默认选择了,就不会出现弹窗,至于怎么操作至今没找到。

参考资料

基于 alientek rv1126 快速启动调试那的写坑:https://www.cnblogs.com/Austin7/p/17879654.html
《rv1126 —— udev机制、增加U盘识别功能、usbmount实现USB设置自动挂载》:https://www.cnblogs.com/zhuangquan/p/15541536.html
rv1126 CMA内存管理机制:https://www.ebaina.com/articles/140000016960

12-15 17:05