一、
初始化函式呼叫關係
初始化函式呼叫關係如圖
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.1 nand flash
初始化函式呼叫
二、讀資料函式呼叫關係
nand flash
讀資料函式呼叫關係如圖
2.1所示。
圖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 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
結構之前,感覺很複雜,分析清楚之後,就感覺很簡單。做移植的,不僅僅要知道怎麼做能實現功能,還要知道其原理,這就需要我們多看原始碼,多讀晶元手冊,還要勤於思考,這樣才能不斷進步,掌握核心內容。如有什麼不正確的地方,懇請大家指出,大家互相學習,共同進步!
(u-boot nand flash移植請看:u-boot nand flash移植
宣告:本文為個人原創,邊移植邊寫,完全來自實踐。本文首先發表在百問網(
www.100ask.net
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...
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...