u-boot-2014.10移植第20天----新增nand flash命令支援(二)

fulinux發表於2014-12-31

繼前一天移植的情況,執行後發現:

Flash: 2 MiB
NAND:  0 MiB

說明Nand flash沒有移植成功,在檔案drivers/mtd/nand/s3c2440_nand.c 中發現board_nand_init函式中:

nand->select_chip = NULL
選擇晶片函式為NULL,我們在board_nand_init函式上面加上s3c2440_nand_select函式,程式碼如下:

static void s3c2440_nand_select(struct mtd_info *mtd, int chipnr)
{
    struct s3c2440_nand *nand = s3c2440_get_base_nand();


    switch(chipnr){
        case -1: /* 取消選中 */
            nand->nfcont |= (1<<1);
            break;
        case 0: /* 選中 */
            nand->nfcont &= ~(1 << 1);
            break;
        default:
            BUG();
    }


    return;
}

再將board_nand_init函式中的select_chip改為:

nand->select_chip = s3c2440_nand_select;
重新編譯執行:

Flash: 2 MiB
NAND:  64 MiB
tq2440的nand flash的大小是為64M,說明nandflash被成功探測到了。
下面進行讀寫測試:

測試之前先將nand flash擦除一遍:

[TQ2440 #] nand erase 0 4000000

從伺服器上下載test檔案,放在0x31000000地址處。

[TQ2440 #] tftp 31000000 test
檢視0x31000000地址處的內容:

[TQ2440 #] md 31000000               
31000000: 34333231 38373635 0a0a3039 00000000    1234567890......
31000010: 00000000 00000000 00000000 00000000    ................

將0x31000000地址處的內容寫到nand flash的0地址處:

[TQ2440 #] nand write 31000000 0 ff 

NAND write: device 0 offset 0x0, size 0xff
 255 bytes written: OK
[TQ2440 #] 
說明些是成功的。

再將其讀到0x31000000地址處下面讀操作:

[TQ2440 #] nand read 31000000 0 ff

NAND read: device 0 offset 0x0, size 0xff
 255 bytes read: OK
說明讀也是OK的,比較前後讀寫的內容是否一樣:

[TQ2440 #] md 31000000
31000000: 34333231 38373635 0a0a3039 00000000    1234567890......
說明Nand flash移植OK。
下圖為tq2440開發板上的nand flash,頁、塊和裝置之間的關係,以及oob區:


從圖中可以看出一頁的大小為512bytes,oob的大小為16位元組,可以使用nand dump命令檢視。

首先擦除一個塊,因為nand flash只能0不能寫1,所以擦除的操作就是講頁和oob區中的位元組都置為1,如下

[TQ2440 #] nand erase 0 ff
[TQ2440 #] nand dump 0    
Page 00000000 dump:
        ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff
        ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff
        ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff
        ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff
        ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff
        ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff
        ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff
        ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff
        ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff
        ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff
        ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff
        ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff
        ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff
        ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff
        ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff
        ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff
        ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff
        ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff
        ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff
        ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff
        ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff
        ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff
        ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff
        ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff
        ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff
        ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff
        ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff
        ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff
        ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff
        ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff
        ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff
        ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff

OOB:
        ff ff ff ff ff ff ff ff
        ff ff ff ff ff ff ff ff

綠色部分為一頁大小,512bytes,紅色部分為oob區,16bytes。擦除後的第一個頁和oob區的位元組都為ff。

在SDRAM中0x3100 0000起始位置後的10個位元組為0~9的ASCII值,我們將其寫入Nand flash的第一個頁中去。

[TQ2440 #] md 31000000
31000000: 34333231 38373635 0a0a3039 00000000    1234567890......
31000010: 00000000 00000000 00000000 00000000    ................

寫入16個位元組:

[TQ2440 #] nand write 31000000 0 10

[TQ2440 #] nand dump 0             
Page 00000000 dump:
        31 32 33 34 35 36 37 38  39 30 0a 0a 00 00 00 00
        ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff
        ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff
        ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff
        ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff
        ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff
        ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff
        ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff
        ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff
        ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff
        ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff
        ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff
        ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff
        ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff
        ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff
        ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff
        ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff
        ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff
        ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff
        ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff
        ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff
        ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff
        ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff
        ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff
        ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff
        ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff
        ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff
        ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff
        ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff
        ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff
        ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff
        ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff
OOB:
        aa a5 ab ff ff ff ff ff
        ff ff ff ff ff ff ff ff

可以看到第一個頁中已經儲存了0~9的ASCII值,多寫了0a0a不用管。

明天繼續。












相關文章