一、硬件信息
RV1126/RV1109 系列芯⽚内置硬件解压缩模块 -- decom,可以极⼤得提升系统启动速度
RV1126/RV1109 内置⼀个 MCU,MCU 在 SoC 上电后就会快速启动,迅速初始化 Camera 和 ISP,然后尽可能快得保存前⼏帧图像。
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 下,如下所示
注意: 可以从板级配置文件中找到对应组件的配置文件名,遇到问题后可以找到相应为配置文件进行修改,如下图所示:
选择配置文件,这里我使用的是 BoardConfig-tb-v13.mk,根据自己的需要,如下图所示:
./build.sh lunch
编译全部文件
./build.sh
烧写进行
这里可以烧写所有文件,也可以直接烧写 update.img 文件,如下图所示:注意: 编译完成后,在日志中会打印电源芯片的配置电压,烧写进行之前必须查看自己的电源配置是否正常,否则可能会烧坏自己的MCU,不了解板子电压的,请咨询相关人事
注意: 准确来说,做完这一步,快速启动已经实现了,但是从上面的启动流程来看,有很多步奏都没操作过,做出来的系统不肯定不是自己需要的,并且板级配置文件还是官方提供的,所以不同的板子可能会遇到不同的问题,下面流程便是更改启动流程中所以的文件和遇到的一些错误。
四、快速启动机制
在了解快速启动机制之前,先看看快速启动的分区。在快速启动中固件的镜像分区和常规IPC固件不⼀样,分区配置可以参考 SDK 中 device/rockchip/rv1126_rv1109 ⽬录下的⽂件,不只到自己的分区文件是那个,上面内容中有说明,回到笔记第三大点查看,快速启动⼀般分为了 Uboot、boot、userdata(oem)
uboot 分区
说明:uboot分区实际打包了 MCU 镜像和 Trust 镜像,他们会被 SPL 加载;
配置文件: rkbin/RKTRUST/RV1126TOS_TB.ini(在 sdk\u-boot\configs\rv1126-emmc-tb.config 中配置)有需要的可以更改相应的 bin 文件,文件在 rkbin/rv11/ 目录下,如果没有自己需要的文件可以找官方人员。
boot 分区
说明:采⽤fit格式打包,其中包含了dtb、内核镜像和rootfs镜像,rootfs镜像⼀般采⽤ramdisk,它们被
SPL预加载,并采⽤decom硬件解压缩。
配置⽂件: device/rockchip/rv1126_rv1109/boot-tb.itsuserdata(oem) 分区
说明:根据需要,自己可以单独开⼀个可读写的分区,新增分区可以查看相关博客,我后面也会有相关的笔记记录
4.1 SPL快速启动机制
U-Boot SPL 下⽀持 fit 格式的快速开机,同时⽀持按键进⼊loader模式和低电检测
配置
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 文件中有相应的配置
预加载功能
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 内核快速启动机制
配置
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 中有相应的配置
设备树配置
为了快速开机,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
配置工具包
这个就不过多介绍了,需要的可以参考我之前的笔记【Buildroot】工具包使用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
五、常见错误
内存配置不对
在加载阶段可能会出现硬件配置错误,需要更改对应的 .bin 文件,比如 正点的 RV1126 开发板的内存使用的是 ddr4 所以需要更改 sdk/rkbin/RKBOOT/RV1126MINIALL_EMMC_TB.ini 文件,如下图所示打包错误
在文件 device/rockchip/common/mkfirmware.sh 打包脚本中,默认打包了 demo 分区,但是配置后可能没有 demo 分区,所以带打包阶段会出现错误,只需要屏蔽对应分区的打包动作即可,如下图所示设备树不生效或找不到 rv1126-alientek.dtb 文件
这个是因为设备树的编译没有进行修改,导致快速启动的设备树不起作用。在 build.sh 脚本中确定了打包 dtb 的变量,所以值需要结合更改 sdk/kernel/scripts/mkmultidtb.py 文件中的内容即可,更改方式如下图所示:
注意: 主要确保自己配置的设备树文件生效,具体可以参考 “文档教程(非常重要)/【正点原子】ATK-DLRV1126%20系统开发手册V1.6.pdf” 中的“4.6.5 单个设备树编译” 中的内容即可确实驱动
这个相对比较简单了,只需要参考 rv1126-alientek.dts 设备树文件,天机自己需要的驱动即可,是在不行,直接全部搬过来也是可以的,如果只是测试的话,可以不用更改问题3 中的设备树文件,直接使用默认的 rv1126-alientek.dtb 也行。驱动不加载
检查完设备树后,发现驱动不加载,出现这个问题不要慌,值需要在驱动文件中加入下图中的内容即可,原因见笔记中 4.3 节内容CMA 内存错误
查看命令dmesg | grep -i reserve
,如下图所示:遇到这个问题,可以结合笔记中 4.2 节内容,修改设备树 reserved-memory 节点和配置文件 sdk\kernel\arch\arm\configs\rv1126_defconfig 中的内容,如下图所示
usb 功能调试
BR2_PACKAGE_THUNDERBOOT_USE_EUDEV=y
找不到对应的 .xml ISP配置文件
遇到这个问题,主要是 rootfs 中的配置错误,只需要修改 buildroot/configs/rockchip_rv1126_evb_tb_defconfig 的配置即可,如下图所示:rootfs 工具包和库文件的配置
默认配置配置使用的是 mediaserver 测试应用,此应用跑起来后,会正常打开对应摄像头的图像,主要做一个演示。如果需要添加自己的应用,只需要裁剪 rootfs 即可,可以参考笔记中 4.5 节的内容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