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

JZ2440學習筆記

Chili

2015.5

第二部分,移植uboot2015支持JZ2440的nor flash
5,修改uboot支持nor flash
繼續跟着韋老師手冊或者視頻所講的uboot啓動流程走,我們發現nor 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)中的flash_init()中進行,層層深入發現uboot判斷如果用戶定義了board_flash_get_legacy函數則採用flash_detect_legacy函數進行nor flash檢測,否則用標準CFI接口進行檢測,我們分別說明。

圖 1 

5.1 legacy檢測nor flash方式
Legacy檢測方式是通過AMD和Intel的標準指令進行nor flash的ID讀取,隨後將讀取的ID跟 u-boot-2015.04-rc4\u-boot-2015.04-rc4-my2440\drivers\mtd\Jedec_flash.c中的jedec_table定義的器件ID進行對比,從而獲取器件信息,以及該器件對應的讀寫控制指令集。

圖 2 

看JZ2440v2電路圖,我們發現採用的nor flash器件爲MX29LV800BBTC(實際採用的nor flash器件應該不是這個,可能是第一版本的,沒有更新過來,發現原因下面來講)
因爲我們在jedec_table中發現其實有定義該器件的信息,但是爲何uboot讀不到呢,當我把uboot的Debug打開,打印出調試信息時,發現uboot檢測nor flash ID爲0x2249,對應於Jedec_flash.c宏定義的AM29LV160DB,那麼實際開發板上的nor flash型號應該是這個,害我糾結半天,查看jedec_table中並沒有器件定義。因此修改如下:
book@book-desktop:~/uboot/u-boot-2015.04-rc4$ vim drivers/mtd/jedec_flash.c 
在jedec_table中添加以下結構,這是拷貝jedec_table後面的MX29LV800BBTC結構信息並進行修改的(注意不要在條件編譯裏面定義,否則可能還是未定義,建議放在table的第一個元素出,便於查看)
{
.mfr_id = (u16)MX_MANUFACT,
.dev_id = AM29LV160DB,
.name = "AM29LV160DB",
.uaddr = {
[0] = MTD_UADDR_0x0555_0x02AA
},
.DevSize = SIZE_2MiB,
.CmdSet = CFI_CMDSET_AMD_LEGACY,
.NumEraseRegions= 4,
.regions = {
ERASEINFO(0x10000, 15),
ERASEINFO(0x08000, 1),
ERASEINFO(0x02000, 2),
ERASEINFO(0x04000, 1),
}
},

圖 3 

保存更改,再次make
book@book-desktop:~/uboot/u-boot-2015.04-rc4$make
編譯成功,將生成uboot.bin燒寫進開發板,重啓,打印如下:


圖 4 

由打印信息可知,現在nor flash可以識別了,但是flash大小和扇區數量不對啊,注意採用legacy獲取nor flash信息參數的來源,這些參數都是根據我們添加進jedec_table表的器件信息算出來的,但由於我這個器件信息是在原來1M的MX29LV800BBTC基礎上修改了一個器件ID得來的,因此uboot實際計算出來的信息就跟MX29LV800BBTC一模一樣了。這種老的方式需要自己實現定義器件信息,因此不是很靈活,本次也只是讓讀者知道這個原理,legacy檢測nor flash方式也就介紹到這裏,下面介紹一種更加靈活的,也是uboot或者說nor flash今後支持的方向,標準的檢測方式:CFI方式。
5.2 CFI接口檢測方式
CFI大家可自行百度瞭解,簡單說就是nor flash的一種通用接口規範,大家都按照這種規範來生產flash器件,這樣就可以實現一種軟件可以適用於各個不同廠家的flash,進而實現了軟件的複用性,設計上更改flash器件而不需要更改驅動程序,極大的方便了flash驅動的維護工作。
首先根據AM29LV160DB手冊(要學會看手冊哦,那些都是些比較簡單的英語,多看幾遍把主要的單詞記下,以後翻來覆去就是那麼幾個專業詞彙)更改支持的最大扇區數
book@book-desktop:~/uboot/u-boot-2015.04-rc4$ vim include/configs/smdk2410.h 
修改如下:

圖 5 

修改函數返回值,使uboot採用CFI方式進行nor flash檢測:
book@book-desktop:~/uboot/u-boot-2015.04-rc4$ vim board/samsung/smdk2410/smdk2410.c 
如圖所示,將返回值改爲0即採用CFI方式,return 1就是legacy方式,具體可查看源代碼,二種方式只能取其一哦。

圖 6

保存,make again!!
book@book-desktop:~/uboot/u-boot-2015.04-rc4$ make
編譯成功,燒寫進nor flash,啓動,打印如下:

圖 7

flash大小,扇區都正確,ok,nor flash驅動移植成功。


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

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