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 中,快速啟動的基本流程如下
在 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) 分割區
說明:根據需要,自己可以單獨開⼀個可讀寫的分割區,新增分割區可以檢視相關部落格,我後面也會有相關的筆記記錄
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校驗
};
};
設定
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 中提供的資料,這裡我就附上了
快速開機的核心啟動過程,為了充分利⽤多核優勢,並⾏運⾏相同 level 的 initcall。功能需要 ONFIG_INITCALL_ASYNC=y ,在 arch/arm/configs/rv1126-tb.config 中已經預設開啟
注意: 開啟多核後,camera 驅動需要提前到 device_initcall(⼀般通過 module_i2c_driver 註冊),而不要使⽤
device_initcall_sync。因為沒有其它驅動在 device_initcall_sync 這個時刻初始化,⽆法並⾏。
# 設定自己需要的元件
make menuconfig
# 設定完成,把.config 儲存為 defconfig
make ARCH=arm savedefconfig
# 更新修改好的組態檔到對應的 defconfig 檔案,否則不生效,如
cp defconfig arch/arm/configs/alientek_rv1126_defconfig
設定工具包
這個就不過多介紹了,需要的可以參考我之前的筆記【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)>; // 壓縮源地址和⼤小,可以依據實際⼤小進⾏更改
};
我使用的攝像頭不需要 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
本文來自部落格園,作者:澆築菜鳥,轉載請註明原文連結:https://www.cnblogs.com/jzcn/p/17902925.html
如本部落格的內容侵犯了你的權益,請與以下地址聯絡,本人獲知後,馬上刪除。同時本人深表歉意,並致以崇高的謝意! [email protected]