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
阅读(1172) | 评论(0) | 转发(0) |