MBN debug detail document - pagxir/toy2vpn GitHub Wiki
在高通平台上,有些逻辑上存在多个分支,并且每个分支不存在那个符合3GPP协议一说,而是跟据运营商自己的网络和需求来决定需要在这些逻辑上应该走那一个分支。
为了实现,代码也是可以维护,同时跟运营上的需求一致,因而首先引入了NV机制,手机平台上根据设置分支,当进入这些逻辑的时候来自动根据NV配置来选择符合运营上需求的分支。
在没有采用MBN机制之前,所有的营运上NV值需要在QCN中进行配置。也就是说,NV值是在手机版本烧写已经配置好了,跟SIM卡无关。很明显,如果同一个逻辑上,两个营运商选择了连个不同的分支,那么手机就无法同时满足连个营运上的需求。
mbn的设计目的就是方便解决上面提到的问题。MBN的机制可以允许,手机跟进插入的卡的不同自动加载不同的NV值集合,从而修改NV值跟运营上的需求保持一致。
mbn是二进制文件,用来实现客制化不同的营运商定制不同的NV值等,同时也提供了方便更新手机NV值的OTA机制。
因为mbn是二进制文件,所以提供了用于将xml文件转换为二进制文件的perl脚本,对应的文件存放在项目中的 amss 目录下:
下面的转换命令,可以将存放目录下的 modem_proc/mcfg/mcfg_gen/generic/NA/TMO/mcfg_sw_gen_Commercial.xml
编译为二进制的 mbn 文件:
$ cd ./modem_proc/mcfg/build/
$ perl ./build_mcfgs.pl --force-regenerate --force-rebuild –source-dir=generic/NA/TMO --configs=mcfg_sw:Commercial --xml
为了告诉MBN编译器,我需要需要修改那些NV值才能符合营运上的需求,所以需要修改对应的XML文件,比如 NA/TMO/mcfg_sw_gen_Commercial.xml
, 所以xml文件需要遵循一定的格式。
下面是一个简单的xml-mbn的简单例子:
<?xml version="1.0" encoding="utf-8"?>
<NvData>
<NvConfigurationData carrierIndex="1" version="0x0501050D" type="1"/>
<NvItemData id="71" mcfgAttributes="0x09" mcfgVariant="1">
<Member sizeOf="13" type="uint8">84 77 79 </Member>
</NvItemData>
<NvItemData id="848" mcfgAttributes="0x29" mcfgVariant="1">
<Member sizeOf="1" type="uint8">0 </Member>
<Member sizeOf="1" type="uint16">0 </Member>
</NvItemData>
<NvEfsFile mcfgAttributes="0x09" mcfgVariant="2" targetPath="/sd/rat_acq_order" buildPath="modem_proc/mcfg/mcfg_gen/scripts/data/efs_files/att/Rat_acq_order"/>
<NvEfsItemData mcfgAttributes="0x09" mcfgVariant="2"
fullpathname="/nv/item_files/ims/qp_ims_dpl_config">
<Member sizeOf="1" type="uint16">0 </Member>
<Member sizeOf="1" type="uint16">0 </Member>
<Member sizeOf="1" type="uint8">0 </Member>
<Member sizeOf="1" type="uint8">1 </Member>
<Member sizeOf="1" type="uint16">0 </Member>
<Member sizeOf="1" type="uint32">0 </Member>
<Member sizeOf="1" type="uint8">0 </Member>
<Member sizeOf="1" type="uint8">2 </Member>
</NvEfsItemData>
<NvTrlRecord mcfgAttributes="0x00">
<Member sizeOf="1" type="uint8">0 </Member>
<Member sizeOf="1" type="uint16">2 </Member>
<Member sizeOf="1" type="uint16">256 </Member>
<Member sizeOf="1" type="uint8">1 </Member>
<Member sizeOf="1" type="uint16">4 </Member>
<Member sizeOf="1" type="uint32">83952909 </Member>
<Member sizeOf="1" type="uint8">2 </Member>
<Member sizeOf="1" type="uint16">4 </Member>
<Member sizeOf="1" type="uint16">310 </Member>
<Member sizeOf="1" type="uint16">410 </Member>
<Member sizeOf="1" type="uint8">3 </Member>
<Member sizeOf="1" type="uint16">14 </Member>
<Member sizeOf="14" type="uint8">67 111 109 109 101 114 99 105 97 108 45 84 77 79 </Member>
<Member sizeOf="1" type="uint8">4 </Member>
<Member sizeOf="1" type="uint16">26 </Member>
<Member sizeOf="1" type="uint8">0 </Member>
<Member sizeOf="1" type="uint8">6 </Member>
<Member sizeOf="6" type="uint32">8949024 8944302 8901026 8901160 8901260 8901490 </Member>
<Member sizeOf="1" type="uint8">5 </Member>
<Member sizeOf="1" type="uint16">4 </Member>
<Member sizeOf="1" type="uint32">83952909 </Member>
</NvTrlRecord>
</NvData>
从上面例子的这个结构可以看出,xml-mbn文件由文件头,NV定制数据项(NvItemData, NvEfsFile/NvEfsData), MBN文件尾, 3大部分组成,下面会一步步的对这个结构进行详细的描述:
文件头的样板如下:
<NvConfigurationData carrierIndex="1" version="0x0501050D" type="1"/>
- 一般需要修改的是 version 属性: 0x0501050D
- 这个属性组成形式是 AABBCCDD
- AA: 运营商标识
- BB: OEM(手机厂商本版号)
- CC: 主版本号 (平台标识, 如8909, 8916等)
- DD: 子版本号,软件基线版本标识
如果需要升级MBN版本文件需要,更改OEM部分的版本号,保证这个数值比原来的大,这样OTA机制才会去自动重新发送mbn文件到amss侧。
<NvTrlRecord mcfgAttributes="0x00">
<Member sizeOf="1" type="uint8">0 </Member>
<Member sizeOf="1" type="uint16">2 </Member>
<Member sizeOf="1" type="uint16">256 </Member>
<Member sizeOf="1" type="uint8">1 </Member>
<Member sizeOf="1" type="uint16">4 </Member>
<Member sizeOf="1" type="uint32">83952909 </Member>
<Member sizeOf="1" type="uint8">2 </Member>
<Member sizeOf="1" type="uint16">4 </Member>
<Member sizeOf="1" type="uint16">310 </Member> <!-- MCC -->
<Member sizeOf="1" type="uint16">410 </Member> <!-- MNC -->
<Member sizeOf="1" type="uint8">3 </Member>
<Member sizeOf="1" type="uint16">14 </Member>
<Member sizeOf="14" type="uint8">67 111 109 109 101 114 99 105 97 108 45 84 77 79 </Member> <!-- MBN 的名字: Commercial-TMO -->
<Member sizeOf="1" type="uint8">4 </Member>
<Member sizeOf="1" type="uint16">26 </Member>
<Member sizeOf="1" type="uint8">0 </Member>
<Member sizeOf="1" type="uint8">6 </Member>
<Member sizeOf="6" type="uint32">8949024 8944302 8901026 8901160 8901260 8901490 </Member> <!-- iccid 列表, MBN自动切换需要用到这个列表 -->
<Member sizeOf="1" type="uint8">5 </Member>
<Member sizeOf="1" type="uint16">4 </Member>
<Member sizeOf="1" type="uint32">83952909 </Member>
</NvTrlRecord>
其中数字83952909是文件头提到的版本号,需要保持跟文件头一致,当然了这里使用10进制,而文件头采用了16进制。
也就是 0x0501050D == 83952909
其他的参数请参考对应的xml文件,如果不清楚作用请保留不变。
配置样板:
<NvItemData id="848" mcfgAttributes="0x29" mcfgVariant="1">
<Member sizeOf="1" type="uint8">0 </Member>
<Member sizeOf="1" type="uint16">0 </Member>
</NvItemData>
- tagName固定为: NvItemData
- 属性id 则为: 自己需要定制修改的NV项的Id
- mcfgAttributes属性: 按照XOR运行的属性值
- 对应子节点Member是用来定制NV项的数据:
- sizeOf 数据的条目数量 type表示数据的类型
<NvEfsItemData mcfgAttributes="0x09" mcfgVariant="2"
fullpathname="/nv/item_files/ims/qp_ims_dpl_config">
<Member sizeOf="1" type="uint16">0 </Member>
<Member sizeOf="1" type="uint16">0 </Member>
<Member sizeOf="1" type="uint8">0 </Member>
<Member sizeOf="1" type="uint8">1 </Member>
<Member sizeOf="1" type="uint16">0 </Member>
<Member sizeOf="1" type="uint32">0 </Member>
<Member sizeOf="1" type="uint8">0 </Member>
<Member sizeOf="1" type="uint8">2 </Member>
</NvEfsItemData>
- tagName固定为: NvEfsItemData
- 属性 fullpathname 则为: 自己需要定制修改的EFS项的路径
- mcfgAttributes属性: 按照XOR运行的属性值
- 对应子节点Member是用来定制NV项的数据:
- sizeOf 数据的条目数量 type表示数据的类型