Nand flash不能片上执行(page读写 NFB_ReadPhysicalPage, NFB_ProgramPhysicalPage, block擦除 NFB_ErasePhysicalBlock),故需要bootloader.
MTK平台关于bootloader的代码,可参考bl_bootarm.s, bl_main.c, bl_init.c
bl_bootarm.s:
1. 中断向量表, reset handler...
2. disable IRQ&FIQ
3. INT_InitEMIInitCode, Initialize the EMI setting related code regions
4. SetPLLEMI, custom_InitDRAM
5. PreserveExtBootloaderHeader, To remove some information before regionInit, or it will be destroyed
6. GenerateRandomSeed
7. InitRegions
8. Init
9. LoadExtBootloader, VerifyExtBootloader
10. ExtBootloader
bl_man.c
ExtBootloader:
1. LoadImageListblock
2. CacheInit
3. BootAndHandOver
1). LoadPrimariMAUI
2). RemapCmd
3). jump_cmd
MTK代码的加载:
1. Extbootloader是由bootloader加载的, 即bl_bootarm.s中LoadExtBootloader
2. First ROM(及少数secu方面的)是由Extbootloader加载的, 即LoadPrimariMAUI
3. Second ROM(及CUST ROM,STUDY PARA, CUST PARA, SECU等)是由First ROM中的Application_Initialize中的NFB_LoadingSecondaryMAUI加载的 (Nand Flash进度条显示的时候)
4. Third ROM及demand paging是调用到才加载进RAM的(两者机制可能不一样, 留待以后研究)
INC_Initialize 初始化nucleus各组件(QUI--Queue, SMI--Semaphore, MBI--mail box, PII--pipe, EVI--event group, PMI--partition memory, DMI--dynamic memory, TMI--timer , IOI--io Driver, ERI--error handling, HII--history, TCI---thread control...)
之后Application_Initialize留给客户
最后TCT_Schedule