7

RV1126 快速启动 - 浇筑菜鸟

 6 months ago
source link: https://www.cnblogs.com/jzcn/p/17902925.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

一、硬件信息

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

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

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

    存储介质类型 读取速度 是否⽀持快速启动
    eMMC 120MB/S
    SPI Nor Flash 30MB/S
    SPI Nand Flash 10.8MB/S

二、配置快速启动的流程

刚开始做快速启动的时候,我就走了一个弯路,以为只要将 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 下,如下所示

配置名 说明
BoardConfig-tb-v12.mk ⽤来编译 RV1126 DDR3 EVB V12 板⼦的板级配置,存储使⽤ eMMC
BoardConfig-tb-v13.mk ⽤来编译 RV1126 DDR3 EVB V13 板⼦的板级配置,存储使⽤ eMMC
BoardConfig-spi-nor-tb-v13.mk ⽤来编译 RV1126 DDR3 EVB V13 板⼦的板级配置,存储使⽤ SPI Nor
BoardConfig-dualcam-tb-v13.mk ⽤来编译 RV1126 DDR3 EVB V13 板⼦的板级配置,存储使⽤ eMMC,⽀持双⽬
BoardConfig-battery-ipc.mk ⽤来编译电池IPC LPDDR3 Demo Board的板级配置,存储使⽤ eMMC

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

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

    ./build.sh lunch
    2406897-20231215142206719-1937658609.png
  2. 编译全部文件

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

    2406897-20231215142458386-1671809024.png

    注意: 编译完成后,在日志中会打印电源芯片的配置电压,烧写进行之前必须查看自己的电源配置是否正常,否则可能会烧坏自己的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 中配置)

    2406897-20231215151754925-1837458648.png

    2406897-20231215144218406-703588395.png

    有需要的可以更改相应的 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 保存为 defconfigmake 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 文件,如下图所示
    2406897-20231215145507737-1567258529.png

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

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

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

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

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

    2406897-20231215164453864-455561745.png

    2406897-20231215163511298-1552572781.png

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

    2406897-20231215163646852-42162804.png
    2406897-20231215164003815-893142940.png
  7. usb 功能调试

    BR2_PACKAGE_THUNDERBOOT_USE_EUDEV=y

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

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

    2406897-20231215170006861-1042925522.png

  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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK