问题描述
有些时候为了应对不同市场的需求做了不同的硬件设计,但是又希望使用同一套软件镜像自动适应。
此FAQ即是解决单双卡兼容的问题,即同一包软件根据不同的硬件ID自动套用单卡或者双卡的设定。
解决方案
首先前提条件是硬件上做了可以区分不同设计的方案,常规的做法有:
- 透过GPIO电平的方式区分,1个GPIO有3种状态,高,低,悬空,2个GPIO就可以区分出9种不同的硬件。
- 透过ADC读取不同的电压值,更换不同的分压电阻就可以设定任意多种不同的硬件设计。
区分出不同的硬件版本后可以实现并调用下面的函数来设定支援SIM卡的数量。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
int set_ro_boot_sim_count(void * fdt, unsigned int sim_count) { int nodeoffset; char value[2]; nodeoffset = fdt_path_offset(fdt, "/firmware/android"); if(nodeoffset < 0) { printf("ERROR: Can not find /firmware/android device tree node!\n"); return -1; } if(sim_count > 2 && sim_count <= 0) { printf("ERROR: can not support %d sim.\n", sim_count); return -2; } snprintf(value, 1, "%d", sim_count); fdt_setprop_string(fdt, nodeoffset, "opt_sim_count", value); // the below code is for the version newer than Android O. E.g. P version if(sim_count == 1) { fdt_setprop_string(fdt, nodeoffset, "product.hardware.sku", "ss"); } else if(sim_count == 2) { fdt_setprop_string(fdt, nodeoffset, "product.hardware.sku", "dsds"); } // end of P version return 0; } |
调用的方法可以参考如下的代码,第6行。
1 2 3 4 5 6 7 8 9 10 11 12 |
extern int *target_fdt_firmware(void *fdt, char *serialno)__attribute__((weak)); if (target_fdt_firmware) { target_fdt_firmware(fdt, sn_buf); } set_ro_boot_sim_count(fdt, 2); /* This depends on target_fdt_firmware, must after target_fdt_firmware */ extern int update_md_opt_to_fdt_firmware(void *fdt)__attribute__((weak)); if (update_md_opt_to_fdt_firmware) { update_md_opt_to_fdt_firmware(fdt); } |
目前仅支持 android O 之後的版本。
第一段代码的5、9等行小于大于号等没有显示出来qaq