Chinaunix首页 | 论坛 | 博客
  • 博客访问: 544617
  • 博文数量: 150
  • 博客积分: 5010
  • 博客等级: 大校
  • 技术积分: 1861
  • 用 户 组: 普通用户
  • 注册时间: 2008-03-17 00:19
文章分类

全部博文(150)

文章存档

2011年(1)

2009年(14)

2008年(135)

我的朋友

分类: LINUX

2008-08-06 18:17:23

NVM的重要作用梁老师已经给我讲了,是存取手机重要部分文件的位置。有384k,并且Tavor的有AP和CP两部分。

在TC_Main.c中要检查文件是否被删除了,

//-judge if copying NVM block data to file system
    {
        fd = open("/telephony/tel/NVM/cali_volt.txt", O_RDONLY);
        if(fd== -1)
        {
           TCMD_TRACE("ready to load the volt info from the backnvm \n");
         tc_volt_operation( );
        }
              else
                close(fd);


关键是open函数的返回值。


2



tc_volt_operation( )中要新建文件并用fprintf()函数写文件。LoadBackNVM((char*)temp,length,offset);负责从NVM中把数据读入到temp数组中去。


fp = fopen( "/telephony/tel/NVM/cali_volt.txt", "w" );
  if(fp!=NULL)
  {
    
    LoadBackNVM((char*)temp,length,offset);
    fprintf(fp,"%d %d %d %d",temp[0],temp[1],temp[2],temp[3]);

  }
  else
  {
    TCMD_TRACE("Error operarion the volt fileeeee \n");
  }

  fclose(fp);




3


BOOL LoadBackNVM(char *buf, UINT32 len, long offset)
{


    if(!opBackNVM(buf, len, BACKNVM_OP_LOAD,offset))
    {
        
        TCMD_TRACE("Succeeded in loading to BackNVM");    
     return TRUE;
    }

    TCMD_TRACE("Failed to load BackNVM");

    return FALSE;
}


opBackNVM(buf, len, BACKNVM_OP_LOAD,offset)中的#define BACKNVM_OP_LOAD        1

来知道是要读取NVM中的内容。然后知道NVM在文件系统中是在
#define BACKNVM_FILE        "/dev/block/mtdblock1"        /* ReliableData area */
用户看不见。其中文件是|__length_____|_____data________________|____crc______|的存取结构。length ,crc分别是UINT32占4个字节。


4

读取NVM文件系统部分
也是文件操作

/* open the BackNVM partition */
    if(op == BACKNVM_OP_STORE)
    {
        fd = open(BACKNVM_FILE, O_WRONLY);
        TCMD_TRACE("The store backnvm fd is %d: \n",fd);
    }
    else if(op == BACKNVM_OP_LOAD)
    {
     fd = open(BACKNVM_FILE, O_RDONLY);
        TCMD_TRACE("The write backnvm fd is %d: \n",fd);

    }
    else
    {
        TCMD_TRACE("the wrong opcode \n");
        return 4;
    }

    if(fd <= 0) {
        TCMD_TRACE("Cannot open BackNVM: %s", BACKNVM_FILE);

        return 1;
    }


5如op 是 BACKNVM_OP_LOAD ,先定位文件位置通过lseek()函数,然后通过size_t read(int fd, void *buf ,size_t length )函数读取内容,按照定义的数据格式|__length_____|_____data________________|____crc______|的存取结构。length ,crc分别是UINT32占4个字节。


else //op 是 BACKNVM_OP_LOAD
        {
            TCMD_TRACE("Ready to load the value \n");
            lseek(fd, offset, SEEK_CUR);//重要!!!
            
            if(read(fd, &len, sizeof(UINT32)) != sizeof(UINT32)
                    || len > BACKNVM_SIZE                    
                    || read(fd, buf, len) != len
                    || read(fd, &crc, sizeof(UINT32)) != sizeof(UINT32)) {
                
    TCMD_TRACE("Error on loading %s from BackNVM[%d] \n", p, num);
                             return 3;
                
            }
            lenBackNVM= len;
            TCMD_TRACE("read length=%d ,buf=%s , crc =%d\n", len,buf,crc);
            TCMD_TRACE("Succeeded in loading \n");
            
            //TCMD_TRACE("Succeeded in loading %s from BackNVM[%d] \n", p, num);

        }        


if 中的几个或就是按照NVM定义的数据结构去读文件,并且read()函数使文件读写位置会随读取到的字节移动,从而保证读取的数据是按照定义的数据结构去填充数据。read(fd, &len, sizeof(UINT32));
read(fd, &crc, sizeof(UINT32)是读文件的长度和crc,并且都是4个字节。
========================

心得:关 键是LoadBackNVM((char*)temp,length,offset);中offset中指定了存取数据的位置temp指针和在NVM中的偏移:offset

阅读(1183) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~