基於rv1108的雙系統的實現方法
背景:
公司實現一個產品的功能實現uav(無人機功能)和drv(行車記錄儀功能)。所以在產品需要實現雙系統(一個無人機系統一個行車記錄儀系統),在開機之前將開關撥到不同的位置,系統啟動時在loader階段就會去檢測開關按鍵的狀態,根據按鍵的狀態,去不同的偏移地址載入不同的kernel,並且啟動相應的rootfs,實現不同的應用。
loader:
此階段需要檢測案件的io管腳的狀態,涉及到基於rv1108的裸機程式的編寫,檢測io口的電平的高低。不同的電平,賦予不同的kernel的載入地址。
dts:
bootargs中的root值不同
nandflash啟動:
kernel_a.img 對應root=rootfs_a
kernel_b.img 對應root=rootfs_b
emmc啟動:
kernel_a.img 對應root=mmcblk0p4
kernel_b.img 對應root=mmcblk0p6
setting.ini分割槽檔案:
此檔案中包含了不同映象的offset,size,name,type,flag,imgfilepath
nandflash啟動:
emmc啟動:
kernel:
rv1108的實現方式是當kernel啟動後會自動檢查分割槽表文件setting.ini檔案的分割槽資訊,對記憶體做出分割槽操作。kernel載入完成後會根據dts檔案中的bootargs引數中的root變數值,當使用的是nandflash啟動時,只需要kernel_a.img對應root=rootfs_a ,kernel_b.img對應root=rootfs_b,即可,kernel啟動後會根據dts中的root的值匹配分割槽檔案setting.ini相同的分割槽名,從而實現不同的kernel掛載不同的rootfs。如果使用emmc啟動的方式,kernel載入啟動後會根據dts中的root的值匹配相對應的分割槽號,從而實現不同的kernel掛載不同的rootfs。
rootfs:
nandflash:
使用bootargs中的root的值通過名字和分割槽表setting.ini中的分割槽name匹配。如:rootfs_a.img存放的分割槽name=rootfs_a,bootargs中的root=rootfs_a即可。
emmc:
在分割槽表setting.ini被kernel識別後,就會按照分割槽表中的順序分割槽為mmcblk0p1,mmcblk0p2,mmcblk0p3,.....mmcblk0pN.等,bootargs中的root的值就為rootfs存放的第幾個分割槽。如:rootfs_a.img存放的分割槽是mmcblk0p4中,bootargs中的root=mmcblk0p4.