sensor关键数据备份流程

来源:互联网 发布:高分辨率数据 编辑:程序博客网 时间:2024/06/16 17:09

由于sensor硬件本身设计缺陷导致核心数据在掉电时导致数据丢失,软件上通过系统备份能降低这种风险,杜绝还是需要厂商更改硬件。

理论上出厂后就备份该文件信息,以后使用过程中,突然掉电的情况发生,也可以及时的将备份文件回写到sensor中,避免失效模式发生。

代码流程如下:

 

核心问题:

备份文件需要一个安全的区域

Qualcomm系统efs文件系统只有在专门工具下才可以清理掉,因此选用该区域作为备份区域。该区域位于moderm端,与应用处理器通信的方式有rpc方式。

        oncRpc方式是qualcomm公司基于smem原理设计的封闭式的通讯方式。

使用方法是:

1Ap中调用proc_comm.h

Int msm_proc_communsigned cmdunsigned *data1,unsigned *data2)函数

Cmd为高通定义的资源。两个参数分别为unsigned类型,表示4byte的数据,总共64bits,是bpap共享的部分,两端可以任意读写。

2Bp中调用smem_pcmod.h

SMEM_PROC_COMM_REGISTER_CMD(cmd,func,inter)函数

注册aprpc调用的cmd命令,在func中执行处理相关参数进行读写。

        本次备份文件7byte,因此需要多次传递才能完成rpc通讯任务,我采用一个参数做传输参数,一个参数作为控制参数的方式完成通讯。

 

3Bp端将传送过来的内存写入efs文件系统:

调用efs_open相关函数可以完成操作。

Bp参考代码

         /**************bma_number control valid*******************************/

         if((read_write_mode<0)||(read_write_mode>=14)){

                   return FALSE;

         }

 

         /**************read mode********************************************/

         if((read_write_mode>=0)&&(read_write_mode<7)){

                   buf[0] =0;

                   file_handle = efs_open(BMA_REG_FILE,O_RDONLY,0777);

                   if(file_handle == -1){

                            *bma_state = 0;

                   }else{

                            memset(buf,0,28);

                            read_size = efs_read(file_handle,buf,28);

                            efs_close(file_handle);

                            if(read_size<=0){

                                     *bma_state = 0;

                            }else{

                                     i = *bma_number;

                                     *bma_state=(buf[i*4+0]<<24)|(buf[i*4+1]<<16)|(buf[i*4+2]<<8)|buf[i*4+3];

                            }

                   }

         }

 

         /**************write mode******************************************/

         if((read_write_mode>=7)&&(read_write_mode<14)){

                   i = read_write_mode-7;

                   bma_buf[i*4+0] = (*bma_state&0xff000000)>>24;

                   bma_buf[i*4+1] = (*bma_state&0x00ff0000)>>16;

                   bma_buf[i*4+2] = (*bma_state&0x0000ff00)>>8;

                   bma_buf[i*4+3] = (*bma_state&0x000000ff);

         }

                  

         if(read_write_mode == 13){

                            file_handle = efs_open(BMA_REG_FILE,O_CREAT|O_RDWR,0777);

                            if(file_handle == -1){

                                    

                            }else{

                                     write_size = efs_write(file_handle,bma_buf,28);

                                     efs_close(file_handle);

                            }       

         }

 

原创粉丝点击