1. 程式人生 > >flash的讀寫和擦除

flash的讀寫和擦除

這兩天在做norflash,sd的讀寫操作,記錄一下。

flash的特性是,寫資料只能將1寫為0,0不能寫為1.擦除資料是將所有資料都寫為1.因此如果想在已經資料的flash上寫入新的資料,則必須先擦除。sdcard則沒有這個特性,就直接可以寫入新的資料。
例:
只列出每個檔案的前4個位元組,file A是flash的原始資料,接著不擦除資料,直接寫入file B, result是寫完後norflash上的資料,轉換成2進位制,一看就明白。
file A: 12 00 00 EA
file B: 7F 45 4C 46
result:12 00 00 42

還有一點,在擦除flash的時候,必須是整塊的擦除。

昨天寫了一邊,一些東西沒有弄明白,今天終於有了個結果,補上。
主要任務是往norflash的mtd0/mtdblock0寫入uboot,但當初不知道為什麼,認為就是用/dev/mtd0,
而用/dev/mtdblock0是不對,今天回去過去再分析下,下面是操作過程;
~# cat /proc/mtd
dev:    size   erasesize  name
mtd0: 00060000 00020000 "bootloader"
mtd1: 00020000 00020000 "env"
mtd2: 00020000 00020000 "target_info"
mtd3: 00020000 00020000 "factory_tuning"
mtd4: 00020000 00020000 "versionup"
mtd5: 00400000 00020000 "opening_image"
mtd6: 00600000 00020000 "m3-1"
mtd7: 00200000 00020000 "reserved1"
mtd8: 00060000 00020000 "apli_private"
mtd9: 00020000 00020000 "DSP_param"
mtd10: 00020000 00020000 "E.C_param"
mtd11: 00080000 00020000 "exception_info"
mtd12: 00100000 00020000 "lastmemory"
mtd13: 00080000 00020000 "reserved2"
mtd14: 00400000 00020000 "kernel"

1. cp u-boot.bin /dev/mtd0                                     kernel提示:沒有任何提示
2. cp u-boot.bin /dev/mtdblock0                             kernel提示:cp: write error: Operation not permitted
3. flash_erase /dev/mtd0 0 0                                  kernel提示:libmtd: error!: "/dev/mtd0" is not a character device
                                                                                                    flash_erase: error!: mtd_get_dev_info failed
4. flash_erase /dev/mtdblock0 0 0                          kernel提示:  和操作3一樣
5. flash_erase /dev/mtd14 0 0                                kernel提示:Erasing 128 Kibyte @ 3e0000 -- 100 % complete
6. flash_erase /dev/mtdblock14 0 0                        kernel提示:和操作3一樣

以下兩個今天補作了下
7. dd if=u.boot.bin of=/dev/mtdblock0                    kernel提示: 287+1 records in
                                                                                                    287+1 records out
8. dd if=u.boot.bin of=/dev/mtd0                            kernel提示: dd: writing '/dev/mtdblock0': Operation not permitted
                                                                                                    1+0 records in
                                                                                                    0+0 records out
9. dd if=u.boot.bin of=/dev/mtdblock0                    kernel提示: 287+1 records in
                                                                                                    287+1 records out
10. dd if=u.boot.bin of=/dev/mtd0                            kernel提示: 287+1 records in
                                                                                                      287+1 records in

mtd0和mtd14的區別是kernel的mtd_patitions中mask_flag不同,mtd0遮蔽的writable,而mtd14則沒有。
在3,4的操作中,都是提示了不是字元裝置,5,6的操作則反應了擦除是由mask_flag決定,而且說明我能操作的
應該是/dev/mtd*,而如何解釋3的報錯【mtd0是字元裝置,mtdblock0是塊裝置】,只能認為是沒有許可權導致
報這樣的錯,當初是這麼說服自己的。
1和2的操作,說明cp不能用在塊裝置上,而cp到/dev/mtd0沒報道,經過檢視還是沒有成功,也更加確定沒有許可權
造成的。
綜合以上有3點讓我確定是用/dev/mtd0
1. 提示不是字元裝置
2. cp /dev/mtd0沒有提示,而/dev/mtdblock0卻提示操作不允許
3. flash_erase /dev/mtd14能成功,而flash_erase /dev/mtdblock14不能成功。
其實以上都是錯誤的,說下我今天得出的結論。

/dev/mtd0和/dev/mtdblock0其實都可以寫入資料,關鍵是方法不一樣,而且/dev/mtd0和/dev/mtdblock0就是對應
統一個地址,讀出資料是一樣。
/dev/mtdblock0:將mask_flag設定為可以,就能用cp和dd進行資料的操作。
/dev/mtd0: 直接用cp和dd是不行的,符合昨天提到的,往flash寫入資料,只能將1寫成0,而不能將0寫成1.因此
在使用之前先要使用flash_erase將分割槽擦除【全為1】,但是使用flash_erase的前提是將mask_flag設定為可以。

今天的實驗操作記錄都放在我的115郵箱,這裡記錄下,以防忘記