Gaviar (小志掌機)
移植tina-linux bootloader
參考資訊:
1. opensbi
BOOT0、OpenSBI的UART腳位配置
U-Boot的UART腳位配置
U-Boot的MicroSD腳位配置
由於是Boot Loader移植,司徒有必要解說一下Boot Loader的用途是什麼,從下圖可以知道,最簡單的Boot Loader就是初始化RAM、關閉中斷、關閉Cache後,將Linux Kernel載入RAM,然後執行Linux Kernel,這就是Boot Loader的主要工作~
但是RISC-V的Boot Loader其實稍微複雜一點點,如下圖所示,主要有三個部份組成Boot Loader:LOADER(BOOT0)、OpenSBI、BOOTLAODER(U-Boot)
相較於ARM,RISC-V多了一個OpenSBI,那OpenSBI是什麼呢?其實OpenSBI主要用來做權限轉移,從低權限切到高權限執行硬體的相關操作,雖然這部份可以實作在Kernel中,不過RISC-V看來有想要抽象化硬體的概念,一旦將硬體抽象化,代表將來只要實作OpenSBI,就可以達到兼容執行在不同廠家的晶片上,不過司徒也是剛接觸RISC-V,既然大家都這樣使用,那就只好跟隨大家~
司徒畫了一張F133的啟動流程,用來對照一下
步驟1. 上電後,F133開始跑
步驟2. F133將晶片內部的BROM載入到SRAM,然後從SRAM開始跑
步驟3. BROM接著開始尋找可以使用的媒介,小志掌機只有MicroSD,因此,BROM會從MicroSD的8KB位址載入程式到SRAM執行
步驟4. F133第一個執行的程式是BOOT0
步驟5. BOOT0主要用來初始化RAM並且執行OpenSBI
步驟6. OpenSBI執行後,會載入U-Boot並且將控制權交給U-Boot
步驟7. U-Boot會從MicroSD載入Linux Kernel、Device Tree到RAM,接著執行Linux Kernel
步驟8. Linux Kernel會依據BOOTCMD載入rootfs並且將控制權交給init程式,init是Linux作業系統的第一個執行程式
由於BOOT0是第一個執行的程式,司徒額外畫了一個執行流程圖
雖然Boot Loader流程大致清楚,不過,司徒還是需要說一下,一開始提到的UART配置修改,究竟這些修改是設定到哪邊去呢?其實位於lichee/brandy-2.0/spl/nboot/main/boot0_head.c
const boot0_file_head_t BT0_head = { { /* jump_instruction*/ JUMP_INSTRUCTION, BOOT0_MAGIC, STAMP_VALUE, #ifdef ALIGN_SIZE_8K 0x2000, #else 0x4000, #endif sizeof(boot_file_head_t), BOOT_PUB_HEAD_VERSION, CONFIG_BOOT0_RET_ADDR, CONFIG_BOOT0_RUN_ADDR, 0, { /*brom modify: nand-4bytes sdmmc-2bytes*/ 0, 0, 0, 0, '4', '.', '0', 0 }, }, { /*__u32 prvt_head_size;*/ 0, /*char prvt_head_vsn[4];*/ 1, 0,/* power_mode */ {0},/* reserver[2] */ /*unsigned int dram_para[32] ;*/ {0}, /*__s32 uart_port;*/ 0, /*normal_gpio_cfg uart_ctrl[2];*/ { {6, 2, 4, 1, 1, 0, {0} },/*PB8: 4--RX*/ {6, 4, 4, 1, 1, 0, {0} },/*PB9: 4--TX*/ }, /*__s32 enable_jtag;*/ 0, /*normal_gpio_cfg jtag_gpio[5];*/ {{0}, {0}, {0}, {0}, {0} },
Tina-Linux使用Patch方式,將配置的數值更新到boot0_header,雖然作法粗暴,不過卻是最簡單的配置替換作法,缺點就是不好獨立拆開使用