uboot-2009.11之nand_init()分析

下面對nand flash的初始化代碼nand_init()進行分析:
1.
若是定義(CONFIG_COMMANDS & CFG_CMD_NAND)沒定義(CFG_NAND_LEGACY) start_armboot()調用driver/nand/nand.c中的nand_init(),不然若是定義(CONFIG_COMMANDS & CFG_CMD_NAND)而且有定義了CFG_NAND_LEGACY,則調用本身定義的nand_init()。在我當前的情景中是使用driver/nand/mtd/nand.c中的nand_init()
2.nand_init()
調用本文件中的nand_init_chip()nand進行初始化。
3.nand_init_chip()
首先調用board_nand_init()
4.board_nand_init()
是須要本身添加的函數,這個函數的主要功能是對struct nand_chip結構體的函數指針賦值,讓它們指向本身爲nand驅動編寫的一些函數,對未賦值的指針,uboot會在後面爲其賦上通用nand驅動函數指針。
5.nand_init_chip()
接着調用nand_scan().
6.nand_scan()
定義在drivers/nand/mtd/nand_base.c文件中。它首先對struct nand_chip結構體中在board_nand_init()函數中未賦值的指針賦上通用nand驅動函數指針。

7.
通用nand驅動函數nand_select_chip()賦值給struct nand_chip結構體的函數指針用於打開或關閉nand芯片,爲打開,1爲關閉。在這個函數中會調用nand_chip結構體中的hwcontrol函數指針,這個指針指向的函數是須要本身編寫的。這個函數指針在board_nand_init()函數中被賦值。主要做用是向nand flash發送一些nand flash開啓與關閉命令。
8.nand_scan()
剩餘部分初始化nand_chipmtd_info結構體。
9.nand_scan()
最後在返回時調用drivers/nand/mtd/nand_bbt.c文件中的nand_default_bbt()
10.nand_default_bby()
選擇一個壞塊描述表,返回時調用本文件中的nand_scan_bbt()
11.nand_scan_bbt()
尋找創建一個壞塊描述表。
12.
最後返回到nand_init(),這樣nand驅動的初始化完成了。函數

下面對命令nand read addr ofs size的執行流程進行分析:
1.nand read addr ofs size命令的做用是從nand flash地址的偏移量ofs處讀取長度爲size字節的數據存儲到內存地址addr處。
2.common/main.c
文件中的main_loop()主要執行read_line()讀取命令行。
3.read_line()
讀取到命令行後會調用common/main.c文件中的run_command()
4.run_command()
調用common/command.c文件中的find_cmd().u_boot_cmd段中尋找該命令的cmd_tbl_t結構,找到後返回該結構。該命令的結構是經過定義在include/command.h中的宏定義U_BOOT_CMD登記進.u_boot_cmd段中的。
5.run_command()
找到該命令的cmd_tbl_t結構後則執行該命令對應的函數。對於本情景是nand命令對應的函數do_nand()
6.do_nand()
有兩個版本,一個是定義了CFG_NAND_LEGACY。另外一個是未定義CFG_NAND_LEGACY。這兩個版本都定義在common/cmd_nand.c文件中。對於本情景使用未定義CFG_NAND_LEGACYdo_nand()函數。要使用do_nand()還必須定義宏CONFIG_COMMANDS&CFG_CMD_NAND。(若未定義CFG_NAND_LEGACY則在這個情景中的do_nand()函數調用的函數都定義在drivers/nand_legacy/nand_legacy.c文件中)。
7.
對於咱們的情景do_nand()會調用定義在include/nand.h文件中的nand_read_skip_bad()(定義在nand_util.c)
8. nand_read_skip_bad()
則調用include/nand.hnand_read()(定義在nand_base.c)
9.nand_read()
函數最終會調用nand_chip結構中的cmdfunc指針,經過這個指針指向的函數向nand flash芯片發送命令。最終完成整個命令的執行。oop

相關文章
相關標籤/搜索