高通平台读写nv总结

高通平台读写nv总结

一,引言

      1. 什么是NV
       高通平台的NV,保存了系统运行过程中各个模块可能用到的一些参数值,它是以单个文件的形式保存在EFS中,但用户是不能随意访问的,只能通过QXDM来进行读写。对于60X0平台,NV就有将近5千多项。
      
      2. 为什么要备份恢复NV
      NV值是需要通过校准和终测才能使手机硬件达到最佳工作状态,特别是其中的RF相关的NV项,经过校准及终测后,每台手机的这些NV值基本上都不一样,又加上NV数据是是存储在EFS,而EFS的数据很可能遭到破坏(如:重新烧写版本),这时的NV数据也将被破坏,之前校准和终测后的NV数据也将无法恢复,使得手机将面临重新走校准、终测的生产流程。

      3. 备份恢复的原则      
      备份:首先要确定需要备份的NV有那些项(一般是RF相关的),一旦检测到对NV项的修改,则在EFS中创建一个标志文件,在每次开机时判断这个标志文件是否存在而执行是否做备份。
      恢复:同样在每次开机的时候判断EFS中是否存在恢复标志文件,如果不存在则恢复NV,然后创建这个标志文件,创建成功后,下次开机就会不进行恢复。
      
二,NV的备份

      1. 备份的区域
      由于所需要备份的NV项不是很多(一般就几十项),所以我们可以在FLASH上开辟一块区域专门用于保存NV备份数据。备份区域是以一定的组织格式来存放数据的(如图):
      
      其中每个Item都是以:Item号+内容大小(Byte)+内容   的形式来存放的。比如第10项NV可能有2个值,分别是0x11,0x22,则它在FLASH中存放的形式就是:
      0a 00 00 00  02 00 00 00  11 22 --------(这里Item号、内容大小都是UINT32 类型)。

      2. 备份的时机
      一般一台机器在出厂前,都要通过终测仪进行校准、终测。这个过程就会修改到一些RF相关的NV项,也就是我们需要备份的NV。对于软件上来说,不管是用终测仪,或则高通的QPST,QXDM工具来修改NV项,最后都会调用到写NV的函数:nvdiag_write(),我们可以在这个函数里面创建备份标志文件,在下次系统启动时读取这个文件是否存在来判断是否要做备份。

      3. 备份的方法
      之前说过,高通的NV都是以单个文件的形式存放在EFS中,每个文件的文件名就是NV项的序列号,所以我们可以直接调用EFS的读函数nv_read来读取某个特定的NV项的值。

三,NV的恢复

      1. 恢复的时机
      恢复就是备份的逆过程,即把存放在FLASH中的备份数据恢复到EFS中对应的NV项中去。如果手机出厂以后一旦要进行软件升级,并且同时需要破坏EFS,则就不得不进行NV项的恢复。所以系统在每次开机运行时,都会检查文件系统中是否存在恢复标志文件,如果不存在则进行恢复并创建;反之则不恢复。这就要求我们每次发布的软件版本中打包的EFS不能包含这个标志文件。

      2. 恢复的方法
      进行恢复的时候就要读取备份区域中备份的每项NV,然后同样调用EFS的写函数nv_write把数据写到对于的NV项中。

四,小结
      目前几个项目都是使用这套备份恢复机制,通过反复实验,没有发现什么问题。之前的恢复标志是放在FLASH中,即在升级版本的时候在FLASH中设置一个标志位,在升级完成以后开机,读取这个标志位,如果存在则恢复,恢复成功后清除这个标志。但是在一个手机项目(采用spansion 250M nor+ 128M ram)经常遇到升级完版本开机运行缓慢的BUG,通过跟踪发现是在清除恢复标志的时候出了问题,之后把恢复标志也放到EFS中,这个BUG就没有出现。 现在怀疑是在恢复的时候,对FLASH的一个BANK进行同时读写导致的,有待进一步验证。
<think>我们正在处理用户关于高通NV文件格式解析及使用方法的查询。根据提供的引用材料,我们可以总结以下关键点: 1. 高通NV(Non-Volatile)文件存储了系统运行过程中各个模块的参数值,特别是射频(RF)相关的参数,这些参数经过校准和终测后每台手机都可能不同[^3]。 2. NV数据以单个文件的形式存储在EFS(Embedded File System)中,每个NV项对应一个文件,文件名是NV项的序列号(Item ID)[^3][^4]。 3. 读写NV需要使用高通的工具(如QXDM)或调用特定的接口函数。引用[1]提到了高通读取NV的接口函数位于`vendor/qcom/proprietary/commonsys/fastmmi/libmmi/nv.h`[^1]。 4. 每个NV项在备份时存储的格式为:Item号(UINT32类型,4字节)+内容大小(UINT32类型,4字节)+内容(字节流)。例如,第10项(十六进制0x0A)有两个字节0x11和0x22,则存储为:0A 00 00 00 02 00 00 00 11 22[^4]。 5. 备份和恢复NV的机制:在检测到NV项修改后创建备份标志文件,开机时检查标志文件决定是否备份或恢复。恢复时从备份区域读取数据并写入对应的NV项[^3][^4]。 根据以上信息,我们可以解析高通NV文件的格式并说明使用方法。 ### 高通NV文件格式解析 高通NV文件在EFS中存储时,每个文件对应一个NV项,文件名是NV项的十进制或十六进制形式的Item ID(例如,NV项65633对应的文件路径为`/nv/item_files/modem/mmode/lte_bandpref`[^2])。但注意,这些文件不是直接可读的二进制文件,而是按照特定格式存储的。 备份时,NV数据被组织成特定的二进制格式,存储在FLASH的特定区域。每个备份的NV项包括: - **Item号**:4字节,小端格式(例如,Item号10表示为`0A 00 00 00`)。 - **内容大小**:4字节,小端格式,表示后面内容的字节数(例如,2字节的内容表示为`02 00 00 00`)。 - **内容**:实际的数据,字节数为内容大小指定的长度。 例如,一个完整的NV项备份数据可能如下(十六进制表示): ``` 0A 00 00 00 02 00 00 00 11 22 ``` 表示Item号为10(0x0A),内容大小为2字节,内容为0x11和0x22。 ### 高通NV文件的使用方法 #### 1. 读取NV项 - 通过高通QXDM工具:连接设备,使用NV Browser读取特定Item的NV值。 - 通过编程接口:在代码中调用高通提供的接口函数。例如,引用[1]提到的接口函数在`nv.h`中声明。读取NV项的基本函数是`nv_read`,其原型可能类似于: ```c int nv_read(uint16 item_id, void *data, uint16 size); ``` 其中`item_id`为NV项的ID,`data`为存储读取数据的缓冲区,`size`为缓冲区大小。 #### 2. 写入NV项 - 使用QXDM工具:在NV Browser中修改NV值并写入。 - 编程接口:调用`nv_write`函数。函数原型可能为: ```c int nv_write(uint16 item_id, void *data, uint16 size); ``` 写入后,通常需要重启设备使更改生效。 #### 3. 备份与恢复 - **备份**:在检测到NV项被修改(如在校准或终测过程中)后,创建一个备份标志文件。在下次开机时,系统检查到该标志文件,则读取需要备份的NV项,按照上述格式写入FLASH的备份区域。 - **恢复**:在每次开机时,检查恢复标志文件是否存在。如果不存在(例如升级版本后EFS被破坏),则从备份区域读取备份数据,逐个NV项恢复(调用`nv_write`),然后创建恢复标志文件。 ### 注意事项 - 直接操作EFS中的NV文件需要权限,通常只有高通的工具或具有特定权限的进程才能访问。 - 修改关键NV项(如RF相关)可能导致设备功能异常,务必谨慎操作。 - 备份和恢复机制需要根据具体项目实现,确保在EFS被破坏时能够恢复关键的NV项。 §§相关问题§§ 1. 如何通过QXDM工具读取和修改高通平台NV项? 2. 高通NV备份和恢复机制的具体实现步骤是什么? 3. 如何确定哪些NV项需要备份?</think>### 高通 NV 文件格式解析及使用方法 #### 一、NV 文件基础概念 1. **定义** 高通 NV(Non-Volatile)文件存储设备运行所需的参数值,特别是射频(RF)校准数据。这些参数通过终测仪校准后每台设备均不同,直接影响硬件性能[^3]。 2. **存储位置** - 以独立文件形式存储在嵌入式文件系统(EFS)中,路径如: `/nv/item_files/modem/mmode/lte_bandpref`(示例 NV 65633)[^2] - 用户无法直接访问,需通过专用工具或接口读写。 #### 二、NV 文件格式解析 1. **二进制结构** 每个 NV 项按固定格式存储: ``` | Item ID (4字节) | 数据长度 (4字节) | 数据内容 (N字节) | ``` - **Item ID**:NV 项的唯一标识(如 `0x0A` 表示第 10 项) - **数据长度**:内容所占字节数(UINT32 类型) - **数据内容**:具体参数值(如 `0x11, 0x22`)[^4] 2. **示例解析** 假设第 10 项 NV 值为 `0x11, 0x22`,其二进制存储为: ```hex 0A 00 00 00 02 00 00 00 11 22 └─Item ID─┘ └─Length─┘ └Data┘ ``` #### 三、NV 文件操作方法 1. **读写接口** - 高通提供标准接口函数(声明路径): `vendor/qcom/proprietary/commonsys/fastmmi/libmmi/nv.h`[^1] - 关键函数: ```c nv_read(uint16 item_id, void *data, uint16 size); // 读 NVnv_write(uint16 item_id, void *data, uint16 size); // 写 NV 项 ``` 2. **操作流程** ```mermaid graph LR A[检测NV修改] --> B[创建备份标志文件] B --> C[开机时检查标志] C --> D{标志存在?} D -->|是| E[跳过备份/恢复] D -->|否| F[执行备份或恢复] ``` 3. **备份与恢复机制** - **备份时机**:NV 被修改后(如校准过程) - **恢复时机**:开机时检测到 EFS 无恢复标志文件(如升级后) - **存储位置**:FLASH 专用区域(按 Item ID + 长度 + 数据 格式存储)[^4] #### 四、关键注意事项 1. **校准数据保护** RF 相关 NV 项(如频段偏好)丢失会导致设备需重新校准,必须备份[^3]。 2. **标志文件管理** - 备份标志:触发备份流程 - 恢复标志:存在则跳过恢复(首次开机后创建) - 标志文件建议存储在 EFS 而非 FLASH,避免读写冲突[^4]。 3. **工具依赖** - 必须通过高通工具(QXDM、QPST)或标准接口访问,直接操作 EFS 可能损坏数据
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值