u boot nand flash驅動架構分析一

2021-06-06 21:41:01 字數 2204 閱讀 5535

在移植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,還是...