前面我們已經(jīng)完成了存儲布局和加載器的設(shè)計與源碼實現(xiàn)。現(xiàn)在我們就來實踐,測試從SPIFLASH加載鏡像到SDRAM中運(yùn)行。當(dāng)然調(diào)試時也可以直接通過xmodem傳輸鏡像到SDRAM中直接運(yùn)行。
代碼見:https://github.com/qinyunti/stm32f429-boot.git
整個流程示意如下
調(diào)試時我們可以直接通過SHELL的XMODEM傳輸設(shè)備樹和內(nèi)核鏡像到SDRAM中,然后使用SHELL的BOOT命令直接跳到內(nèi)核運(yùn)行,適合調(diào)試時使用,這種方式由于是手動加載到SDRAM運(yùn)行,掉電不保存。
發(fā)布后可以通過SHELL的XMODEM傳輸HEAD信息,設(shè)備樹和內(nèi)核鏡像到SPIFLASH,然后啟動時LOAD程序加載SPIFLASH的內(nèi)容到SDRAM中運(yùn)行。

由于SDRAM中加載DTB和KERNEL需要一定空間,所以真正運(yùn)行使用的RAM就沒有64MB這么多了,運(yùn)行使用的SDRAM還是從0x90000000開始,但是只分配48MB。我們這里從后面16MB,劃分給DTB和內(nèi)核,DTB從0x93000000開始占用32KB,即0x8000,然后內(nèi)核鏡像從0x93008000開始占用16MB-32KB。
所以這里需要修改設(shè)備樹的memory從0x90000000開始,大小為0x3000000。

為了加快xmodem速度,串口波特率也修改為1000000設(shè)備樹修改如下

Boot代碼中修改如下

之前內(nèi)核鏡像運(yùn)行in地址為0x0800C000,現(xiàn)在改為0x93008000
Boot options --->
(0x93008000) XIP Kernel Physical Location

重新構(gòu)建
make ARCH=arm CROSS_COMPILE=arm-none-eabi-
導(dǎo)出到win下
cp arch/arm/boot/dts/st/stm32f429-disco.dtb /mnt/d/stm32f429-disco-sdram.dtb
cp arch/arm/boot/xipImage /mnt/d/xipImage-sdram.bin
Boot的shell中添加boot命令,用于直接手動跳轉(zhuǎn)到指定處運(yùn)行。
shell_func.c中申明
static void bootfunc(uint8_t* param);g_shell_cmd_list_ast中添加
{ (uint8_t*)"boot", bootfunc, (uint8_t*)"boot dtbaddr[hex] kernel[hex]"}, 實現(xiàn)如下
static void bootfunc(uint8_t* param){uint32_t dtbaddr;uint32_t kerneladdr;if(2 == sscanf((const char*)param, "%*s %lx %lx", &dtbaddr, &kerneladdr))char* p =(char*)param;while(1){ /* 跳過%*s部分 */if((*p > 'z') || (*p < 'a')){break;}else{p++;}}long tmp;xatoi(&p, &tmp);dtbaddr = tmp;xatoi(&p, &tmp);kerneladdr = tmp;{start_kernel(dtbaddr, kerneladdr);}}
先導(dǎo)入stm32f429-disco-sdram.dtb到0x93000000
rxmem 0x93000000 19604

然后導(dǎo)入xipImage-sdram.bin到0x93008000
rxmem 0x93008000 1935164

然后輸入
boot 0x93000000 0x93008000
運(yùn)行

先手動準(zhǔn)備HEAD文件內(nèi)容如下

設(shè)備樹從SPIFLASH的0x200加載到SDRAM的0x93000000
內(nèi)核從SPIFLASH的0x8200加載到SDRAM的0x93008000

導(dǎo)入HEAD
rxspiflash 0 54

然后導(dǎo)入dtb
先rxmem導(dǎo)入到sdram然后再restore寫入到spiflash
rxmem 0x90000000 19604
restorespiflash 0x90000000 0x200 19604
也可以直接
rxspiflash 0x200 19604

再導(dǎo)入內(nèi)核鏡像
先rxmem導(dǎo)入到sdram然后再restore寫入到spiflash
rxmem 0x90000000 1935164
restorespiflash 0x90000000 0x8200 1935164
也可以直接
rxspiflash 0x8200 1935164

然后重啟運(yùn)行

以上完善了BOOT的功能,實現(xiàn)了LOAD。 可以通過boot的shell下載鏡像到SPIFLASH,然后從SPIFLASH加載啟動運(yùn)行,此時鏡像就不受限于片內(nèi)2MB FLASH空間了,內(nèi)核可以更大,可以添加更多的驅(qū)動。
同時BOO的shell還添加了更多實用的命令,比如mem的導(dǎo)入導(dǎo)出,spiflash的導(dǎo)入導(dǎo)出,傳輸鏡像到sdram手動boot等,基本覆蓋了常用的需求,后面還可以不斷添加以方便調(diào)試維護(hù)等。