1. 程式人生 > >基於rv1108的雙系統的實現方法

基於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.