一、硬體資訊
-
RV1126/RV1109 系列芯⽚內建硬體解壓縮模組 -- decom,可以極⼤得提升系統啟動速度
-
RV1126/RV1109 內建⼀個 MCU,MCU 在 SoC 上電後就會快速啟動,迅速初始化 Camera 和 ISP,然後儘可能快得儲存前⼏幀影像。
-
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 |
注意: 可以從板級配置檔案中找到對應元件的配置檔名,遇到問題後可以找到相應為配置檔案進行修改,如下圖所示:
-
選擇配置檔案,這裡我使用的是 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.its -
userdata(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機制、增加隨身碟識別功能、usbmount實現USB設定自動掛載》:https://www.cnblogs.com/zhuangquan/p/15541536.html
rv1126 CMA記憶體管理機制:https://www.ebaina.com/articles/140000016960