• «
  • 1
  • 2
  • »
  • Pages: 1/2     Go
主题 : l求助:linux系统下,nand断电无法保存数据! 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 3507
精华: 0
发帖: 27
金钱: 170 两
威望: 57 点
综合积分: 54 分
注册时间: 2009-01-14
最后登录: 2017-09-13
楼主  发表于: 2009-08-26 17:03

 l求助:linux系统下,nand断电无法保存数据!

mini2440开发板,采用开发板自带的linux-2.6.13操作系统。nand型号k9f1208,根据需要我将nand分为4个区,具体如下:

     creating 4 MTD partitions on "NAND 64MiB 3,3V 8-bit":
          0x00000000-0x00050000 : "bootloader"
          0x00050000-0x00250000 : "kernel"
          0x00250000-0x03e50000 : "yaffs"
          0x03e50000-0x04000000 : "param"

第4个分区(mtdblock3)用于保存网络参数。
现在有2个问题:
     1:nand write后不断电,立即nand read,则读写没问题。但是断电后,重新读取nand,发现数据没有保存成功。
     2:nand write,系统reboot后,再断电重新读nand,则此时数据保存成功。
也即:nand写完后,系统断电重启则无法保存。nand写完后,先软件reboot系统,然后断电重启系统,则可以保存。我在开发板和我们自己的板子上也试过,现象是一致的。我想贵公司开发板提供的mtd驱动部分可能有bug。

     我的程序如下:
NANDflash_fd = open("/dev/mtdblock/3",O_RDWR);
lseek(NANDflash_fd,0,SEEK_SET);
lseek(NANDflash_fd,10,SEEK_SET);
write(NANDflash_fd,&GPS_UTC_LEAPS,sizeof(GPS_UTC_LEAPS));

       这个问题应该是开放板的共性,希望版主能帮助解决!谢谢!


*無鈳取玳
级别: 论坛版主
UID: 27
精华: 12
发帖: 5398
金钱: 40120 两
威望: 17929 点
综合积分: 11036 分
注册时间: 2008-01-16
最后登录: 2014-11-22
1楼  发表于: 2009-08-26 17:46
有意思,试试在open()上加上O_SYNC?

这是open的manpage中的描述:
O_SYNC The file is opened for synchronous I/O.  Any write(2)s on the resulting file descriptor  will  block  the  calling
              process until the data has been physically written to the underlying hardware.  But see NOTES below.
"If you have an apple and I have an apple and we exchange apples, then you and I will
still each have one apple. But if you have an idea and I have an idea and we exchange
these ideas, then each of us will have two ideas."
*無鈳取玳
级别: 论坛版主
UID: 27
精华: 12
发帖: 5398
金钱: 40120 两
威望: 17929 点
综合积分: 11036 分
注册时间: 2008-01-16
最后登录: 2014-11-22
2楼  发表于: 2009-08-26 17:52
另外,mtdblockX是block设备,也就是说,主要是通过它之上的文件系统工作的,很少有人直接读写它。事实上,MTD层专门为直接读写提供了一个字符设备接口(/dev/mtdX)。mtdutils里的nandread/nandwrite命令就是通过这个设备实现的
"If you have an apple and I have an apple and we exchange apples, then you and I will
still each have one apple. But if you have an idea and I have an idea and we exchange
these ideas, then each of us will have two ideas."
级别: 新手上路
UID: 3507
精华: 0
发帖: 27
金钱: 170 两
威望: 57 点
综合积分: 54 分
注册时间: 2009-01-14
最后登录: 2017-09-13
3楼  发表于: 2009-08-27 10:29
在open函数中加了O_SYNC属性,问题依旧!
*無鈳取玳
级别: 论坛版主
UID: 27
精华: 12
发帖: 5398
金钱: 40120 两
威望: 17929 点
综合积分: 11036 分
注册时间: 2008-01-16
最后登录: 2014-11-22
4楼  发表于: 2009-08-27 11:13
引用第2楼kasim于2009-08-26 17:52发表的  :
另外,mtdblockX是block设备,也就是说,主要是通过它之上的文件系统工作的,很少有人直接读写它。事实上,MTD层专门为直接读写提供了一个字符设备接口(/dev/mtdX)。mtdutils里的nandread/nandwrite命令就是通过这个设备实现的

老大,看不懂中文吗?
"If you have an apple and I have an apple and we exchange apples, then you and I will
still each have one apple. But if you have an idea and I have an idea and we exchange
these ideas, then each of us will have two ideas."
这个阶段正是我事业的上升期,我怎么能走得开呢?
级别: 精灵王
UID: 3197
精华: 3
发帖: 770
金钱: 6995 两
威望: 5398 点
综合积分: 1600 分
注册时间: 2008-12-30
最后登录: 2010-12-31
5楼  发表于: 2009-08-27 11:44
好好的MTD被LZ这样糟蹋使用了,好好理解一下Linux吧,别老拿单片机的思想解决问题。
保持参数佷容易,不就创建一个文件吧,如果打算编程实现就用标准的文件操作函数fopen,
懒惰一些可以touch一个,也可以拿优盘随便复制一个,拿Linux当什么了?
级别: 新手上路
UID: 3507
精华: 0
发帖: 27
金钱: 170 两
威望: 57 点
综合积分: 54 分
注册时间: 2009-01-14
最后登录: 2017-09-13
6楼  发表于: 2009-08-27 11:57
但是我的/dev/目录下怎么没有你说的dev/mtdX设备呢?
另外我保存的数据是要放在nand的额外地址,不能影响kernel和bootloader。就算采用你说的dev/mtdX设备,如何把他定位到mtdblock3?
还有正如你说那样,我采用的这种用法很少见,但是不代表不能用啊,况且系统软件reboot后还是可以保存。若只针对我这种用法的话,问题的原因到底是什么?
我是个新手,这些问题还搞不明白,请高手指点!
这个阶段正是我事业的上升期,我怎么能走得开呢?
级别: 精灵王
UID: 3197
精华: 3
发帖: 770
金钱: 6995 两
威望: 5398 点
综合积分: 1600 分
注册时间: 2008-12-30
最后登录: 2010-12-31
7楼  发表于: 2009-08-27 12:16
Linux系统中,块设备都是挂在一个目录上使用的(就是通常所说的mount),然后直接在里面创建读写文件就行了,如果你想独辟蹊径,创新使用,那这种非标准的用法,只能自己慢慢摸索了。个人认为从各方面来讲,这样做意义不大。而且,谁也搞不清你在做什么。这就好比,本来一颗好好的IC,管脚都是常用兼容的,但你却把它剖开,挖出晶体,打算自己做个什么封装之类的使用。
*無鈳取玳
级别: 论坛版主
UID: 27
精华: 12
发帖: 5398
金钱: 40120 两
威望: 17929 点
综合积分: 11036 分
注册时间: 2008-01-16
最后登录: 2014-11-22
8楼  发表于: 2009-08-27 12:39
但是我的/dev/目录下怎么没有你说的dev/mtdX设备呢?
另外我保存的数据是要放在nand的额外地址,不能影响kernel和bootloader。就算采用你说的dev/mtdX设备,如何把他定位到mtdblock3?

1. 确保你的内核配置中enable了MTD CHAR的支持;
2. 这里的mtdX和mtdblockX是一一对应的(X=0,1,2,3...), 底下的NAND Flash是相同的,不同的是提供给内核上层的接口。

我想你还是先去看看mtdutils里的nandwrite是如何实现的吧。
"If you have an apple and I have an apple and we exchange apples, then you and I will
still each have one apple. But if you have an idea and I have an idea and we exchange
these ideas, then each of us will have two ideas."
级别: 新手上路
UID: 3507
精华: 0
发帖: 27
金钱: 170 两
威望: 57 点
综合积分: 54 分
注册时间: 2009-01-14
最后登录: 2017-09-13
9楼  发表于: 2009-08-27 13:27

 回 7楼(26672624) 的帖子

谢谢你的回复和解释。以文件的形式存储参数是可行的,刚才已做实验验证,掉电可以保存数据。
  • «
  • 1
  • 2
  • »
  • Pages: 1/2     Go