U Boot NAND FLASH驅動分析

2021-06-05 14:28:29 字數 3847 閱讀 4243

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_nand_init()

和nand_scan()

實現nand flash

初始化工作。

4.其中

board_nand_init()

實現s3c2440 nand flash

5.nand_scan()

主要實現

nand flash

各種引數設定(比如自動識別

nand flash

的大小、每一頁的大小、資料寬度等資訊),設定對

nand flash

的片選、讀寫函式以及

nand flash

的控制命令。(次底層)

圖1.1u-boot中nand flash初始化函式呼叫關係.jpg(26.69 k)

2012-4-7 8:34:25

圖1.1 nand flash

初始化函式呼叫

二、 讀資料函式呼叫關係

nand flash

讀資料函式呼叫關係如圖

2.1所示。

圖2.1讀函式呼叫關係.jpg(35.77 k)

2012-4-7 8:34:25

圖2.1

讀資料函式呼叫關係

呼叫到最後,使用的是乙個巨集

readb

,讀取nand_chip->io_addr_r

位址處的資料,就完成了讀資料的過程。

以上所有的函式在

u-boot

中都已經寫好,不需要我們去做。移植時,只需要根據開發板所用的晶元型號,指定

nand_chip->io_addr_r

所對應的位址就行。這就與具體使用到的處理器的

nand flash

控制器相關了。對於

s3c2440

來說,nand_chip->io_addr_r

對應的就是

nand flash

控制器的資料暫存器

nfdata

,位址為

0x4e000010。

三、關鍵資料結構

涉及到的資料結構:

struct nand_chip

、struct mtd_info

、struct nand_flash_dev

。static void nand_init_chip(struct mtd_info *mtd, struct nand_chip *nand, ulong base_addr)

函式中struct mtd_info *mtd

:定義了乙個

mtd_info

結構體指標

mtd。對於

mtd_info

眾多的成員,

u-boot

中nand flash

只用到了其中的乙個成員

void* priv

;用於儲存裝置相關的結構體

nand_chip

的位址。

每乙個nand flash

裝置對應乙個

mtd_info

結構體和乙個

nand_chip

結構體。

mtd_info

結構體中的

*priv

指向裝置對應的

nand_chip

結構體。如圖

3.1所示。

圖3.1關鍵資料結構.jpg(28.87 k)

2012-4-7 8:34:25

圖3.1 u-boot

中nand flash

資料結構

控制nand flash

時,通過結構體

mtd_info

的*priv

成員找到對應的結構體

nand_chip

,然後呼叫讀寫、片選等函式,最終實現對

nand

flash

的控制。

struct nand_flash_dev ;

結構nand_flash_dev

的內容比較少,其各項含義為:

name

:nand flash

的廠家名字

id:  

nand flash的id

pagesize

:一頁的大小,單位為位元組

byte

chipsize

:整個nand flash

的大小,單位為

mberasesize

:最小擦除大小單位為位元組

byte

options

:選項。具體作用不清楚,求高人解答。

四、u-boot

是如何獲知外接

nand flash

的容量大小的

u-boot

先讀取外接

nand flash的id

,根據id

在struct nand_flash_dev nand_flash_ids

定義的陣列中找到匹配的項,這樣就確定

nand flash

的大小了。

struct nand_flash_dev nand_flash_ids = , ,

……};

比如對於

jz2440

開發板上的用的

k9f2g08u0m

為例,其自身id為

0xda

,在nand_flash_ids

中找到資料:

其大小為

256,單位為

mb,這樣就確定了

nand flash

的大小。這裡只分析原理,具體**請分析

u-boot。五、

總結沒有弄清楚

u-boot

中nand flash

結構之前,感覺很複雜,分析清楚之後,就感覺很簡單。做移植的,不僅僅要知道怎麼做能實現功能,還要知道其原理,這就需要我們多看原始碼,多讀晶元手冊,還要勤於思考,這樣才能不斷進步,掌握核心內容。如有什麼不正確的地方,懇請大家指出,大家互相學習,共同進步!

宣告:本文為個人原創,邊移植邊寫,完全來自實踐。本文首先發表在百問網(

www.100ask.net

第1

期共33

linux

安裝開始,講解了

sdram

、nand flash

、lcd

等硬體操作,

u-boot

的移植、核心移植、簡單字元驅動的編寫,非常詳盡。

《嵌入式

linux

嵌入式linux

應用開發完全手冊光碟裡的驅動和例子

源**.rar

詳情

嵌入式linux

應用開發完全手冊

.pdf

詳情

easy了!

**店鋪上

全套都有了!!!

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

u boot nand flash驅動架構分析一

在移植nand flash驅動之前,我們要先熟悉u boot中nand flash驅動架構以及nand flash操作原理。在u boot啟動過程中呼叫了nand init函式,這就是nand flash驅動初始化的入口點。if defined config cmd nand puts nand n...