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邮箱,这里记录下,以防忘记

你可能感兴趣的:(flash的读写和擦除)