RV1126 快速啟動

2023-12-15 18:00:39

一、硬體資訊

  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

注意: 可以從板級組態檔中找到對應元件的組態檔名,遇到問題後可以找到相應為組態檔進行修改,如下圖所示:

  1. 選擇組態檔,這裡我使用的是 BoardConfig-tb-v13.mk,根據自己的需要,如下圖所示:

    ./build.sh lunch
    

  2. 編譯全部檔案

    ./build.sh
    
  3. 燒寫進行
    這裡可以燒寫所有檔案,也可以直接燒寫 update.img 檔案,如下圖所示:

    注意: 編譯完成後,在紀錄檔中會列印電源晶片的設定電壓,燒寫進行之前必須檢視自己的電源設定是否正常,否則可能會燒壞自己的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 中設定)

    有需要的可以更改相應的 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 檔案,如下圖所示

  2. 打包錯誤
    在檔案 device/rockchip/common/mkfirmware.sh 打包指令碼中,預設打包了 demo 分割區,但是設定後可能沒有 demo 分割區,所以帶打包階段會出現錯誤,只需要遮蔽對應分割區的打包動作即可,如下圖所示

  3. 裝置樹不生效或找不到 rv1126-alientek.dtb 檔案
    這個是因為裝置樹的編譯沒有進行修改,導致快速啟動的裝置樹不起作用。在 build.sh 指令碼中確定了打包 dtb 的變數,所以值需要結合更改 sdk/kernel/scripts/mkmultidtb.py 檔案中的內容即可,更改方式如下圖所示:

    注意: 主要確保自己設定的裝置樹檔案生效,具體可以參考 「檔案教學(非常重要)/【正點原子】ATK-DLRV1126%20系統開發手冊V1.6.pdf」 中的「4.6.5 單個裝置樹編譯」 中的內容即可

  4. 確實驅動
    這個相對比較簡單了,只需要參考 rv1126-alientek.dts 裝置樹檔案,天機自己需要的驅動即可,是在不行,直接全部搬過來也是可以的,如果只是測試的話,可以不用更改問題3 中的裝置樹檔案,直接使用預設的 rv1126-alientek.dtb 也行。

  5. 驅動不載入
    檢查完裝置樹後,發現驅動不載入,出現這個問題不要慌,值需要在驅動檔案中加入下圖中的內容即可,原因見筆記中 4.3 節內容

  6. CMA 記憶體錯誤
    檢視命令 dmesg | grep -i reserve,如下圖所示:

    遇到這個問題,可以結合筆記中 4.2 節內容,修改裝置樹 reserved-memory 節點和組態檔 sdk\kernel\arch\arm\configs\rv1126_defconfig 中的內容,如下圖所示

  7. usb 功能偵錯

    BR2_PACKAGE_THUNDERBOOT_USE_EUDEV=y
    

    更多操作可以參考 《rv1126 —— udev機制、增加U盤識別功能、usbmount實現USB設定自動掛載》

  8. 找不到對應的 .xml ISP組態檔
    遇到這個問題,主要是 rootfs 中的設定錯誤,只需要修改 buildroot/configs/rockchip_rv1126_evb_tb_defconfig 的設定即可,如下圖所示:

  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