JZ2440學習筆記,第三部分,移植uboot2015支持JZ2440的nand flash

JZ2440學習筆記

Chili

2015.5

第三部分,移植uboot2015支持JZ2440的nand flash
6,修改uboot支持nand flash 
與nor flash的初始化類似,nand flash初始化在文件u-boot-2015.04-rc4\u-boot-2015.04-rc4-my2440\arch\arm\lib\Board.c 中的函數void board_init_r(gd_t *id, ulong dest_addr)中的nand_init()中進行,用sourceInsight一路跟蹤代碼,發現最後調用了S3c2410_nand.c (u-boot-2015.04-rc4\u-boot-2015.04-rc4-my2440\drivers\mtd\nand)對nand進行初始化,那麼本次我們就需要修改此文件。
6.1 修改S3c2410_nand.c 寄存器偏移宏定義
book@book-desktop:~/uboot/u-boot-2015.04-rc4$ vim drivers/mtd/nand/s3c2410_nand.c 
因爲,S3C2440和2410的nand控制器有些區別,時序設置需要多設置一個寄存器,而且寄存器偏移不一致,因此添加如下圖所示的宏定義,添加:
#define S3C2440_ADDR_NALE 12
#define S3C2440_ADDR_NCLE 8
#define S3C2440_NFCONT_nFCE        (1<<1)

圖 1

6.2修改board_nand_init函數設置時序
由於2440的nand控制寄存器與2410有區別,所以要做修改:
tacls = 0;
twrph0 = 4;
twrph1 = 2;
...
writel(((tacls<<12) | (twrph0<<8)|(twrph1<<4)), &nand_reg->nfconf);
writel((1<<0)|(0<<1)|(1<<4), &nand_reg->nfcont);

圖 2

6.3修改s3c24x0_hwcontrol函數
Uboot的nand驅動最重要的就是這個函數了,它實現了nand讀寫的最底層控制,此處修改不當直接導致nand驅動不起來,因此需要特別注意。修改如下:
#if defined(CONFIG_S3C2410)
                 if (ctrl & NAND_NCE)
                         writel(readl(&nand->nfconf) & ~S3C2410_NFCONF_nFCE,
                                 &nand->nfconf);
                  else
                         writel(readl(&nand->nfconf) | S3C2410_NFCONF_nFCE,
                               &nand->nfconf);
  #elif defined(CONFIG_S3C2440)
                 if (ctrl & NAND_NCE)/* modified by chili, 2440*/
                          writel(readl(&nand->nfcont) & ~S3C2440_NFCONT_nFCE,
                                 &nand->nfcont);
                  else
                          writel(readl(&nand->nfcont) | S3C2440_NFCONT_nFCE,
                                 &nand->nfcont);
#endif


圖 3
6.4編譯燒寫
book@book-desktop:~/uboot/u-boot-2015.04-rc4$ make
編譯成功,燒寫啓動,打印如下,說明nand驅動成功。至此就可以使用nand命令進行操作flash了


圖 4
6.5 解決nand write失敗
經過上面一番更改,我們已經可以使用uboot自帶的一些nand操作指令了,下面我們就來測試下效果如何,nand命令網上非常多資料,這種東西就可自行百度瞭解,其實百度上的都是別人看uboot後發上去的,那我們都可以自己看uboot幫助信息的,直接:
SMDK2410 # nand

圖 5

幫助信息,說的很清楚哦,也別啥事都想到百度,自己可以想想想,解決看看。
先試試擦除,再nand dump 看下flash內數據:
SMDK2410 # nand erase 100000 100000
SMDK2410 # nand dump 100000
顯示如下說明erase成功:

圖 6

我們準備將內存30000000數據燒寫進nand中,事先先看看內存中的數據是什麼,等下好對比:
SMDK2410 # md 30000000

圖 7

萬事具備,開始燒寫nand:
SMDK2410 # nand write 300000 100000 100000
SMDK2410 # nand dump 100000

圖 8


咦?明明顯示寫入成功,爲何數據還是FF,這說明數據壓根都沒寫進去啊,多寫幾次還是如此,怎麼回事啊?難道uboot有問題?放心這一般不可能,一定是你自己底層驅動寫的有問題。先讓我們理一理我們幹了什麼,忘了的童孩可以把6.1-6.3節重新複習遍:
6.1 設置S3C2440寄存器偏移和片選宏。
分析:可以讀,但是寫不進去,這裏應該沒問題,否則絕對無法讀取數據的。
6.2 設置nand操作時序。
分析:還是那個原理,讀數據都可以,說明讀時序沒問題,那麼是不是寫時序有問題?有可能,去檢查設置時序和韋老師給的uboot1.6中nand 操作時序,發現一致,說明時序肯定也沒問題。
6.3 修改s3c24x0_hwcontrol底層命令控制函數
剛說這個函數很重要,是上層操作nand函數的最底層函數,ok,我們仔細看看,是不是哪裏疏忽了:

圖 9


在最後,添加IO_W的默認寄存器指向。

圖 10

保存編譯燒寫,啓動,測試:
SMDK2410 # nand erase 100000 100000
SMDK2410 # nand dump 100000
SMDK2410 # nand write 30000000 100000 100000
SMDK2410 # nand dump 100000
擦除後數據:


圖 11


Ok,寫入成功!至此,nand flash驅動工作完全正常!


轉載:http://bbs.csdn.net/topics/391037138

發佈了17 篇原創文章 · 獲贊 17 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章