BLOB(1)
分析一下这个的引导过程
初试化函数
typedef void(*initfunc_t)(void);
typedef struct {
u32 magic;
initfunc_t callback;
int level;
} initlist_t;
#define __init __attribute__((used, __section__(".initlist")))
#define __initlist(fn, lvl) \
static initlist_t __init_##fn __init = { \
magic: INIT_MAGIC, \
callback: fn, \
level: lvl }
所有的init函数都放在initlist段中
所有的退出函数都放在exitlist 段中
static struct nand_info monahans_nand;
XllpFlashDfcInitNOGPIO
根据当前平台使用的flash类型,来初始化 DFC
DFC的类型有如下一些
typedef enum {
XLLP_DFC_FLASH_NULL = 0 ,
XLLP_DFC_FLASH_Samsung512MbX16 = 1,
XLLP_DFC_FLASH_Micron1GbX8 = 2,
XLLP_DFC_FLASH_Micron1GbX16= 3,
XLLP_DFC_FLASH_STM1GbX16= 4,
XLLP_DFC_FLASH_STM2GbX16= 5,
XLLP_DFC_FLASH_STM70nm1GbX16= 6,
XLLP_DFC_FLASH_Toshiba2GbX16= 7,
XLLP_DFC_FLASH_END,
}XLLP_DFC_FLASH_TYPE;
接下来通过flash的类型来获取flash的信息
Zylonite board(Samsung K9K1216Q0C)
定义了7种flash芯片
static XLLP_DFC_FLASH_TYPE_INFO typeInfo[] = {
{ XLLP_DFC_FLASH_Samsung512MbX16, &samsung512MbX16},
{ XLLP_DFC_FLASH_Micron1GbX8, µn1GbX8},
{ XLLP_DFC_FLASH_Micron1GbX16,µn1GbX16},
{ XLLP_DFC_FLASH_STM1GbX16,&stm1GbX16},
{ XLLP_DFC_FLASH_STM2GbX16,&stm2GbX16},
{ XLLP_DFC_FLASH_STM70nm1GbX16,&stm70nm1GbX16},
{ XLLP_DFC_FLASH_Toshiba2GbX16,&toshiba2GbX16},
{ XLLP_DFC_FLASH_NULL, NULL},
};
这样就获取了flash芯片的信息
然后对其设置计时信息
XllpFlashDfcSetDMA
设置DMA
XllpFlashDfcSetECC
设置ECC
XllpFlashDfcSetSpare
完成了对flash的各种设置
XllpFlashDfcReadID 读取厂商ID和设备 ID
scan_nand 开始扫描