需求:通过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相关推荐

  1. 高通平台读写nv总结

    一,引言       1. 什么是NV        高通平台的NV,保存了系统运行过程中各个模块可能用到的一些参数值,它是以单个文件的形式保存在EFS中,但用户是不能随意访问的,只能通过QXDM来进 ...

  2. 高通终端修改nv值后,不重启终端即生效

    现象 在PC端使用QXDM修改nv值后,需要重启终端,重新获取EFS值才能生效,在手机侧APP修改nv值后,若还需要重启终端才能生效,将大大的降低app的用户感受,故需要使用一定的方案实现不重启终端即 ...

  3. 高通qspr是哪几个单词得缩写_PIR是哪几个单词的缩写

    展开全部 PIR Parachute Infantry Regiment ***** PIR Prescribed Investor Rate (New Zealand) **** PIR Prote ...

  4. 高通modem启动过程_高通modem代码中的NV读写

    NVRAM非易失性随机访问存储器(Non-Volatile Random Access Memory) ,是指断电后仍能保持数据的一种RAM.在手机中,NVRAM位于flash芯片中. 手机上所谓的N ...

  5. 高通平台java层操作NV数据的方法

    点击打开链接 文档目的 在Android手机生产过程中,有时需要做一些器件测试或者其他压力测试,并且保存测试结果,即使手机恢复出场设置或者重新下载版本也不会擦出这些结果,这个时候就要用到NV来保存.本 ...

  6. android 高通分区表,高通msm8994平台的NV到底是储存在哪个分区?

    网上有人说是Modemst1,modemst2,但是实际上这只是两个缓存分区,fsg是所谓的golden backup,我wipe掉这三个分区,开机用qpst依然能备份出来正常的NV,有没有真的做平台 ...

  7. E8卡 linux 系统 读写 高通 字库芯片

    在E8卡上通过linux的spi驱动读写高通字库芯片. spi是分主从的,字库芯片不会主动通过spi发送数据.只有在linux上发起读操作的时候,字库才会把他的数据发送出来. /* * spi mod ...

  8. 【高通SIM卡】 单双卡NV配置

    [高通SIM卡] 单卡配置 1. GPIO 中断配置 NV702102. 单卡配置: nv 修改: NV# 00453 --> 0 NV# 04398 --> 1 NV# 06907 -- ...

  9. 高通SDX12:跨子系统数据共享实例分享

    高通SDX12:跨子系统数据共享实例分享 1. 实例背景 1.1 问题现象 1.2 初步分析 1.3 客户SDK版本显示SDK版本 svn号 1.4 SDK版本.模组厂商版本均显示SDK版本 svn号 ...

最新文章

  1. 前端JS: 通过代码-看函数作用域this对象
  2. 做这行的,一定要会修电脑!
  3. d630 无线驱动 linux,fedora 8下DELL D630无线网卡驱动的安装
  4. 电影票房数据查询服务高性能与高可用实践
  5. 服务器千兆网卡接百兆交换机不通_一文搞懂监控工程中百兆交换机和千兆交换机的区别在哪?...
  6. codeblocks解决网络方面错误undefined reference to `inet_ntoa@4'|
  7. ArcGIS矢量数据重分类
  8. DBSCAN 对点云障碍物聚类
  9. xgboost时间序列预测matlab,LightGBM和XGBoost实现时间序列预测(2019-04-02)
  10. 汽车基础软件「众生相」
  11. 阿里云oss搭建图床以及使用PicGO上传图片到图床
  12. D* Lite路径规划算法
  13. 英语语法汇总(1.名词)
  14. 计算机主板定位孔尺寸,775针主板上四个 CPU散热器固定孔 的孔距 分别是多少...
  15. 用金蝶kis录入数量初始数据的方法
  16. macOS下修改iTunes的备份路径至移动硬盘提示Operation not permitted
  17. unity的异步加载
  18. 拷贝docker镜像到其他机器部署
  19. Android_xml背景色的值
  20. 软件程序员成功的秘诀

热门文章

  1. 关于迅盘Turbo Memory的ReadyDrive功能被禁用的思考
  2. pdf解密,pdf,jpg,word格式互相转换
  3. C 程序设计语言——第四章练习题
  4. 2022年最新版Spring专项面试突击
  5. 根据当前日期进行以下方面的处理: 1、取得日期的年份、月份、天、时、分、秒,并转换成大写日期格式 如:2013年8月17日 20时30分20秒 2、根据日期的不同时间段,做问候语: 早上8:00-12
  6. 为什么你在公司说话没分量,得不到别人的重视?
  7. 布隆过滤器定义长度为m的数组,插入n个元素,k个哈希函数,已知m和n的值,k的值为多少时,求误判率最低的推导过程?
  8. MFC实现像素鸟功能和一些改进
  9. Scroller类源码解析及其应用(一)
  10. 4月全球“.网址”域名总量排行榜:ZDNS份额仍超99%