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,雖然作法粗暴,不過卻是最簡單的配置替換作法,缺點就是不好獨立拆開使用