高通Android R OTA Radio分区升级定制实践

张开发
2026/4/21 1:31:12 15 分钟阅读

分享文章

高通Android R OTA Radio分区升级定制实践
1. 高通Android R Radio分区升级背景在Android R版本中高通平台对Radio分区的管理机制做了重要调整。Radio分区包含了基带、蓝牙、DSP等关键无线通信模块的固件这些模块的正常工作直接关系到设备的通信能力。我遇到过不少项目因为Radio分区升级失败导致设备变砖的情况后来发现根本原因在于OTA包没有正确集成这些关键镜像。传统QSSIQTI System Software Infrastructure项目会默认处理Radio镜像但很多定制化项目需要走非QSSI路径。这时候就需要手动修改构建脚本确保生成的OTA包能正确包含这些Radio镜像。举个例子某次项目中发现蓝牙功能在OTA后失效排查后发现是BTFM.bin镜像没有被打包进去。2. 关键代码修改实战2.1 add_img_to_target_files.py改造原始代码只能处理标准QSSI项目的镜像打包我们需要增加对非QSSI项目的支持。核心改动在CheckAbOtaImagesNonQssi函数def CheckAbOtaImagesNonQssi(output_zip, ab_partitions): MP_list {} GetMPI_config(MP_list) for partition in ab_partitions: partition_name partition.strip() img_name partition.strip() .img if partition_name in MP_list.keys(): radio_src_img_name MP_list[partition_name] radio_path os.path.join(OPTIONS.input_tmp, RADIO, radio_src_img_name) if os.path.exists(radio_path): images_path os.path.join(OPTIONS.input_tmp, IMAGES, img_name) shutil.copy(radio_path, images_path) continue这个修改实现了读取MPI_config配置文件建立分区映射关系检查RADIO目录下的原始镜像文件将需要的镜像复制到IMAGES目录2.2 分区映射配置文件在device/qcom/mc565x/radio/目录下新增MPI_config文件内容示例#partitionimagename ablabl.elf modemNON-HLOS.bin dspdspso.bin bluetoothBTFM.bin这个配置文件建立了分区名与镜像文件的映射关系。在实际项目中我建议把这类配置文件放在独立的radio目录与设备树代码分离方便后期维护。3. 构建系统集成方案3.1 BoardConfig.mk关键配置需要在设备树的BoardConfig.mk中声明AB分区列表AB_OTA_PARTITIONS ? boot vendor vbmeta dtbo abl -include $(LOCAL_PATH)/radio/radio.mk这里有个坑要注意如果使用动态分区super.img需要确保radio分区不在super分区内。我遇到过因为配置错误导致radio镜像被错误打包进super分区的情况。3.2 radio.mk自动检测逻辑新建radio.mk实现智能检测HAVE_FILE : $(shell test -f $(RADIO_DIR)/NON-HLOS.bin echo yes) ifeq ($(HAVE_FILE),yes) ifeq (,$(filter modem, $(AB_OTA_PARTITIONS))) AB_OTA_PARTITIONS modem endif endif这个脚本会自动检测radio目录下存在的镜像文件并动态添加到AB_OTA_PARTITIONS列表。实测下来这种方案比硬编码分区列表更可靠特别是在多项目共用的设备树中。4. 实际项目中的问题排查4.1 镜像版本兼容性问题在某汽车项目中发现OTA后基带不工作经排查是modem镜像版本与bootloader不兼容。解决方法是在radio.mk中加入版本检查MODEM_VERSION : $(shell strings $(RADIO_DIR)/NON-HLOS.bin | grep -m1 MPSS.*) ifneq ($(MODEM_VERSION), $(EXPECTED_MPSS_VERSION)) $(error Modem version mismatch!) endif4.2 分区大小校验Radio分区通常有严格的大小限制。建议在add_img_to_target_files.py中添加检查def CheckRadioImageSize(img_path, partition_name): max_size OPTIONS.info_dict.get(partition_name _size) actual_size os.path.getsize(img_path) if actual_size max_size: raise RuntimeError(%s image too large (%d %d) % (partition_name, actual_size, max_size))5. 进阶定制技巧5.1 差分升级方案对于经常更新的radio镜像如蓝牙固件可以考虑差分升级def GenerateRadioDelta(original, target, delta): cmd [imgdiff, -z, original, target, delta] subprocess.check_call(cmd)实测发现对modem镜像使用bsdiff算法效果更好压缩率比imgdiff高30%左右。5.2 多radio配置支持在车载等场景可能需要支持多套radio配置。我们的解决方案是在radio目录下创建子目录如radio/eu/、radio/us/构建时通过PRODUCT_REGION参数选择在AndroidProducts.mk中配置ifeq ($(PRODUCT_REGION),eu) PRODUCT_COPY_FILES \ radio/eu/NON-HLOS.bin:$(PRODUCT_OUT)/radio/NON-HLOS.bin endif这套方案在某海外项目中使用成功实现了单系统镜像支持多地区射频配置。

更多文章