void start_armboot (void) { .......... #if defined(CONFIG_CMD_NAND) puts ("NAND "); nand_init(); /* go init the NAND */ #endif
.................... /* main_loop() can return to retry autoboot, if so just run it again. */ for (;;) { main_loop (); }
1).CONFIG_CMD_NAND后,就会调用nand_init()初始化函数。该函数位于drivers/mtd/nand/nand.c中,
void nand_init(void) { int i; unsigned int size = 0; for (i = 0; i < CONFIG_SYS_MAX_NAND_DEVICE; i++) { nand_init_chip(&nand_info[i], &nand_chip[i], base_address[i]); size += nand_info[i].size / 1024; if (nand_curr_device == -1) nand_curr_device = i; } printf("NAND: %u MiB\n", size / 1024);
2) 在nand_init()函数中调用同一个文件中的nand_init_chip()函数。
static void nand_init_chip(struct mtd_info *mtd, struct nand_chip *nand, ulong base_addr) {
......... int maxchips = CONFIG_SYS_NAND_MAX_CHIPS; nand->IO_ADDR_R = nand->IO_ADDR_W = (void __iomem *)base_addr; if (board_nand_init(nand) == 0) { if (nand_scan(mtd, maxchips) == 0) { ........
3)而在nand_init_chip()函数中调用,我们自己写的board_nand_init()函数,该函数在我们要改写的文件s3c2410_nand.c中,
4)然后,调用drivers/mtd/nand/nand_base.c文件中2900行附近的nand_scan()函数。
5)在nand_scan()函数调用,同一个文件中2628行附近的nand_scan_ident()函数
,nand_scan_ident()函数调用nand_get_flash_type()函数,得到NandFlash芯片的厂家ID,和芯片ID,
6)最后调用函数同一个文件中2684行附近的nand_scan_tail(),函数,进行,芯片中各个函数,操作的初始化。NandFlash的初始化,驱动也就完成了。
我们所要做的工作就是写其中的一个函数board_nand_init(),函数。在改写这个函数之前,我们应该,先配置好,各个变量。
|