在移植nand flash驅動之前,我們要先熟悉u-boot中nand flash驅動架構以及nand flash操作原理。
在u-boot啟動過程中呼叫了nand_init函式,這就是nand flash驅動初始化的入口點。
#if defined(config_cmd_nand)
puts ("nand: ");
nand_init(); /* go init the nand */
#endif
我們看,這個函式被呼叫的前提條件是config_cmd_nand巨集被定義,所以如果你要操作nand flash,這個巨集一定要在配置檔案中被定義,我們先記在這裡。進入nand_init函式中。
void nand_init(void)
printf("%u mib\n", size / 1024);
#ifdef config_sys_nand_select_device
/** select the chip in the board/cpu specific driver
*/board_nand_select_device(nand_info[nand_curr_device].priv, nand_curr_device);
#endif}
乙個for迴圈,這裡又有乙個巨集config_sys_max_nand_device,表示有幾個nand flash裝置,mini2440中只有一片nand flash,所以你需要在配置檔案中定義這個巨集為1。在進入nand_init_chip函式之前我們先將nand_init函式看完,首先計算出nand flash裝置總大小,nand_curr_device表示當前nand flash裝置編號,初始值為-1,由於我們這裡只有乙個nand flash裝置,所以這個值應該用於為0才對。for迴圈結束之後列印出nand flash裝置總的大小。你如果沒有定義config_sys_nand_select_device這個巨集,那麼這個函式也就結束了,nand flash也就初始化完成了。
進入nand_init_chip函式中。
在看這個函式之前,我們要看傳遞給這個函式的三個引數,nand_info、nand_chip和base_address。這三個引數它們都是定義在nand.c中的三個全域性變數,用於儲存nand flash的相關資訊,這就是初始化要的關鍵。nand_info主要和晶元本身相關,比如記錄nand flash的大小等等。nand_chip這個結構主要記錄nand flash它的操作相關,比如read、wirte等等。而base_address是記錄的nand flash主控制器的暫存器基位址。它是這樣定義的。
#ifndef config_sys_nand_base_list
#define config_sys_nand_base_list
#endif
static ulong base_address[config_sys_max_nand_device] = config_sys_nand_base_list;
你如果沒有定義config_sys_nand_base_list,那麼暫存器基位址就是config_sys_nand_base,對於s3c2440呢這個值就為0x4e000000,所以你又需要在配置檔案中定義這個巨集。
static void nand_init_chip(struct mtd_info *mtd, struct nand_chip *nand,
ulong base_addr)
else
mtd->name = null;
} else }
首先將nand flash操作相關指標nand_chip賦值給nand_info中的乙個私有資料指標。
修改nand_chip的讀寫基位址為base_address,也就是0x4e000000。
然後是if語句中的board_nand_init函式,board_nand_init一看就和具體板子相關了。因為我們的處理器是s3c2440和s3c2410接近,而u-boot中又沒有對s3c2440做移植,所以我們只有分析2410的。
int board_nand_init(struct nand_chip *nand)
這個board_nand_init函式首先獲取時鐘電源管理的暫存器基位址,然後開啟nand flash控制器的時鐘使能。
然後設定nand flash控制器的配置暫存器。
又設定nand flash讀寫基位址為0x4e00000c。最後是對nand_chip結構的一些賦值,board_nand_init初始化完成。
U Boot NAND FLASH驅動分析
u boot nand flash 驅動分析 西伯利亞的風 一 初始化函式呼叫關係 初始化函式呼叫關係如圖 1.1所示。1.u boot 啟動過程中呼叫 nand init 初始化nand flash。2.函式nand init 呼叫nand init chip 完成nand flash 初始化。3...
U Boot NAND FLASH驅動分析
一 初始化函式呼叫關係 初始化函式呼叫關係如圖 1.1所示。1.u boot 啟動過程中呼叫 nand init 初始化nand flash。2.函式nand init 呼叫nand init chip 完成nand flash 初始化。3.nand init chip 順序呼叫 board nan...
uboot Nand flash 命令詳解
顯示flash的資訊 dm365 nand info device 0 nand 32mib 3,3v 8 bit,sector size 16 kib dm365 nand device device 0 nand 32mib 3,3v 8 bit 不管是讀取data,使用nand read,還是...