高通QSPR读写NV
需求:通过QSPR自定义SN号显示在设置栏里面
1 QSPR是qcom发布的软件,下图可以看出QSPR是将自定义的SN号写入到NV的2497项里面。
2 在 “设置-关于手机-Model&hardware-Serial number”显示的值是根据“ro.serialno”属性去读取的。想显示的SN号与QSPR写入的值一致。
3 ro.serialno 的值是在BootLoader里面读取硬件信息值赋值给android.serialno,通过uboot传递给kernel的cmdline获取,system里面通过ExportKernelBootProps()函数转换成ro.serialno。
看一下转换的关系:
bootable\bootloader\edk2\QcomModulePkg\Library\BootLib\UpdateCmdLine.c
STATIC CONST CHAR8 *UsbSerialCmdLine = " androidboot.serialno=";
android.serialno赋值的地方:
bootable/bootloader/edk2/QcomModulePkg/Library/BootLib/board.c
通过这个函数获取SN的值:BoardSerialNum (CHAR8 *StrSerialNum, UINT32 Len);
bootable/bootloader/edk2/QcomModulePkg/Library/BootLib/UpdateCmdLine.c
函数调用:
Status = BoardSerialNum (StrSerialNum, sizeof (StrSerialNum));
值传导:
CmdLineLen += AsciiStrLen (UsbSerialCmdLine);
Param.UsbSerialCmdLine = UsbSerialCmdLine;
ro.serialno赋值的地方:
/system/core/init/property_service.cpp
static void ExportKernelBootProps() {
constexpr const char* UNSET = "";
struct {
const char* src_prop;
const char* dst_prop;
const char* default_value;
} prop_map[] = {
// clang-format off
{ "ro.boot.serialno", "ro.serialno", UNSET, },
{ "ro.boot.mode", "ro.bootmode", "unknown", },
{ "ro.boot.baseband", "ro.baseband", "unknown", },
{ "ro.boot.bootloader", "ro.bootloader", "unknown", },
{ "ro.boot.hardware", "ro.hardware", "unknown", },
{ "ro.boot.revision", "ro.revision", "0", },
// clang-format on
};
for (const auto& prop : prop_map) {
std::string value = GetProperty(prop.src_prop, prop.default_value);
if (value != UNSET) InitPropertySet(prop.dst_prop, value);
}
}
整体思路为:读取NV第2497项的值,赋值给ro.serialno这个属性。
给ro.serialno这个属性赋值的地方前面已经阐述清楚,下面要解决的问题是:读取NV的2497项
1 高通读取NV,已经提供了完整的接口函数: vendor/qcom/proprietary/commonsys/fastmmi/libmmi/nv.h
int diag_nv_read(nv_items_enum_type item, /*!< Which NV item to read */unsigned char *data_ptr, /*!< buffer pointer to put the read data */ int len);在系统中,这个函数被编译进libmmi.so这个库里面。需要使用这个函数,个人理解最方便的方式是通过dlopen函数直接调用libmmi库。
下面是一部分示例代码:
#define libmmi64 "/system_ext/lib64/libmmi.so"
char mmiso[128] = libmmi64;
static int nvctrl_read(nv_items_enum_type item, /*!< Which NV item to read */
unsigned char *data_ptr, /*!< buffer pointer to put the read data */
int len) { /*!< size of read buffer */
unsigned char reply_buf[len + 3];
int retry = 0;
int i = 0;
if (nvread) {
do {
memset(reply_buf, 0, sizeof(reply_buf));
nvread(item, reply_buf, sizeof(reply_buf));
if ((reply_buf[0] == DIAG_NV_READ_F)
&& (reply_buf[1] == CHAR_PTR(item)[0])
&& (reply_buf[2] == CHAR_PTR(item)[1])) {
nv_revert_transfer(&reply_buf[3], len);
memcpy(data_ptr, &reply_buf[3], len);
return SUCCESS;
}
usleep(100 * 1000);
} while (++retry < 10);
}
return FAILED;
}
handle = dlopen(mmiso, RTLD_LAZY);
nvread = (nvctrl_t) dlsym(handle, "_Z12diag_nv_read18nv_items_enum_typePhi"/* "diag_nv_read" */);
nvctrl_read(NV_FACTORY_DATA_1_I, nv_read, sizeof(nv_read));
到这里NV的值被读取出来了,但是因为libmmi.so库加载顺序原因,serialno赋值的地方比较靠前,所以把读取NV并通过property_set函数设置属性这一块做成可执行程序,在系统起来后自动运行可执行程序。
说到这里,这个需求大致实现了,后面还遇到自启动可执行文件AVC权限问题,本篇不再赘述
高通QSPR读写NV相关推荐
- 高通平台读写nv总结
一,引言 1. 什么是NV 高通平台的NV,保存了系统运行过程中各个模块可能用到的一些参数值,它是以单个文件的形式保存在EFS中,但用户是不能随意访问的,只能通过QXDM来进 ...
- 高通终端修改nv值后,不重启终端即生效
现象 在PC端使用QXDM修改nv值后,需要重启终端,重新获取EFS值才能生效,在手机侧APP修改nv值后,若还需要重启终端才能生效,将大大的降低app的用户感受,故需要使用一定的方案实现不重启终端即 ...
- 高通qspr是哪几个单词得缩写_PIR是哪几个单词的缩写
展开全部 PIR Parachute Infantry Regiment ***** PIR Prescribed Investor Rate (New Zealand) **** PIR Prote ...
- 高通modem启动过程_高通modem代码中的NV读写
NVRAM非易失性随机访问存储器(Non-Volatile Random Access Memory) ,是指断电后仍能保持数据的一种RAM.在手机中,NVRAM位于flash芯片中. 手机上所谓的N ...
- 高通平台java层操作NV数据的方法
点击打开链接 文档目的 在Android手机生产过程中,有时需要做一些器件测试或者其他压力测试,并且保存测试结果,即使手机恢复出场设置或者重新下载版本也不会擦出这些结果,这个时候就要用到NV来保存.本 ...
- android 高通分区表,高通msm8994平台的NV到底是储存在哪个分区?
网上有人说是Modemst1,modemst2,但是实际上这只是两个缓存分区,fsg是所谓的golden backup,我wipe掉这三个分区,开机用qpst依然能备份出来正常的NV,有没有真的做平台 ...
- E8卡 linux 系统 读写 高通 字库芯片
在E8卡上通过linux的spi驱动读写高通字库芯片. spi是分主从的,字库芯片不会主动通过spi发送数据.只有在linux上发起读操作的时候,字库才会把他的数据发送出来. /* * spi mod ...
- 【高通SIM卡】 单双卡NV配置
[高通SIM卡] 单卡配置 1. GPIO 中断配置 NV702102. 单卡配置: nv 修改: NV# 00453 --> 0 NV# 04398 --> 1 NV# 06907 -- ...
- 高通SDX12:跨子系统数据共享实例分享
高通SDX12:跨子系统数据共享实例分享 1. 实例背景 1.1 问题现象 1.2 初步分析 1.3 客户SDK版本显示SDK版本 svn号 1.4 SDK版本.模组厂商版本均显示SDK版本 svn号 ...
最新文章
- 前端JS: 通过代码-看函数作用域this对象
- 做这行的,一定要会修电脑!
- d630 无线驱动 linux,fedora 8下DELL D630无线网卡驱动的安装
- 电影票房数据查询服务高性能与高可用实践
- 服务器千兆网卡接百兆交换机不通_一文搞懂监控工程中百兆交换机和千兆交换机的区别在哪?...
- codeblocks解决网络方面错误undefined reference to `inet_ntoa@4'|
- ArcGIS矢量数据重分类
- DBSCAN 对点云障碍物聚类
- xgboost时间序列预测matlab,LightGBM和XGBoost实现时间序列预测(2019-04-02)
- 汽车基础软件「众生相」
- 阿里云oss搭建图床以及使用PicGO上传图片到图床
- D* Lite路径规划算法
- 英语语法汇总(1.名词)
- 计算机主板定位孔尺寸,775针主板上四个 CPU散热器固定孔 的孔距 分别是多少...
- 用金蝶kis录入数量初始数据的方法
- macOS下修改iTunes的备份路径至移动硬盘提示Operation not permitted
- unity的异步加载
- 拷贝docker镜像到其他机器部署
- Android_xml背景色的值
- 软件程序员成功的秘诀
热门文章
- 关于迅盘Turbo Memory的ReadyDrive功能被禁用的思考
- pdf解密,pdf,jpg,word格式互相转换
- C 程序设计语言——第四章练习题
- 2022年最新版Spring专项面试突击
- 根据当前日期进行以下方面的处理: 1、取得日期的年份、月份、天、时、分、秒,并转换成大写日期格式 如:2013年8月17日 20时30分20秒 2、根据日期的不同时间段,做问候语: 早上8:00-12
- 为什么你在公司说话没分量,得不到别人的重视?
- 布隆过滤器定义长度为m的数组,插入n个元素,k个哈希函数,已知m和n的值,k的值为多少时,求误判率最低的推导过程?
- MFC实现像素鸟功能和一些改进
- Scroller类源码解析及其应用(一)
- 4月全球“.网址”域名总量排行榜:ZDNS份额仍超99%