问题 :所有机器蓝牙地址都是00:94:4c:00:b0:29,可以写不同的蓝牙地址,重启后可以读出所写地址。在设置界面查看还是缺省地址值。
修改方法验证OK,写号工具写号之后,重启可以见到自己写的内容,MTK 无此问题
/vendor/qcom/proprietary / bt/hci_qcomm_init/bt_nv.cpp
case NV_WRITE_F: //write to file
BTNV_INFO("BT-NV-CMD: Write Command Execution\n");
if (false)//((item != -1) && params_temp[item].writeprotect) // modify ******************************************
{
BTNV_INFO("BT-NV-CMD: NV item %d can be written only once\n",params_temp[item].item);
status = NV_READONLY;
}
else
{
if(item == -1)
{
BTNV_INFO("BT-NV-CMD: NV item %d not found\n",nvitem);
item = numitems;
numitems++;
}
params_temp[item].item = (nv_persist_items_enum_type)nvitem;
params_temp[item].writeprotect = nvItems[nvitem - 1].multi_time_wr;
params_temp[item].nSize = (uint8)nvItems[nvitem -1].size;
if(nvitem == NV_BD_ADDR_I)
{
/* Overridden. Since in case of BD address it can be either
generated or user defined.
If random generated then BD address to be persistent across target
reboots but can be reprogrammed once by the user.
In case of user defined its persistent across target reboots and
can't be reprogrammed again by the user. */
/*modify ******************************00000000000 @{ */
params_temp[item].writeprotect = NV_WRITE_ONCE_DISABLE;/*(bIsRandom) ? NV_WRITE_ONCE_DISABLE:
nvItems[nvitem - 1].multi_time_wr;*/
/***********************************@}*/
params_temp[item].pCmdBuffer[0] = my_nv_item->bd_addr[0];
params_temp[item].pCmdBuffer[1] = my_nv_item->bd_addr[1];
params_temp[item].pCmdBuffer[2] = my_nv_item->bd_addr[2];
params_temp[item].pCmdBuffer[3] = my_nv_item->bd_addr[3];
params_temp[item].pCmdBuffer[4] = my_nv_item->bd_addr[4];
params_temp[item].pCmdBuffer[5] = my_nv_item->bd_addr[5];
BTNV_INFO("BT-NV-CMD: NV_WRITE_F: BD Addr: %02x %02x %02x %02x %02x %02x\n",
params_temp[item].pCmdBuffer[0],params_temp[item].pCmdBuffer[1],
params_temp[item].pCmdBuffer[2],params_temp[item].pCmdBuffer[3],
params_temp[item].pCmdBuffer[4],params_temp[item].pCmdBuffer[5]);
}
else if(nvitem == NV_BT_SOC_REFCLOCK_TYPE_I)
{
params_temp[item].pCmdBuffer[0] = (*my_nv_item).bt_soc_refclock_type;
BTNV_INFO("BT-NV-CMD: NV_WRITE_F: REFCLOCK_TYPE: %02x (0 -> 32MHz, 1-> 19P2MHz)\n",
params_temp[item].pCmdBuffer[0]);
}
else if(nvitem == NV_BT_SOC_CLK_SHARING_TYPE_I){
params_temp[item].pCmdBuffer[0] = (*my_nv_item).bt_soc_clk_sharing_type;
BTNV_INFO("BT-NV-CMD: NV_WRITE_F: CLK_SHARING_TYPE: %02x (0 ->Disable, 1->Enable )\n",
params_temp[item].pCmdBuffer[0]);
}
}
/vendor/qcom/proprietary / bt/hci_qcomm_init/btnvtool.cpp
case 'O':
snprintf(filename, NAME_MAX, "%s/%s", PERSISTENCE_PATH, BT_NV_FILE_NAME);
ret = stat(filename, &sts);
is_exist_addr_random = bt_nv_is_random_addr();
// modify *************************** @{
/*if ((ret == -1 && errno == ENOENT) || (ret == 0 && sts.st_size == 0) ||
(TRUE == is_exist_addr_random) )*/
if (TRUE)
// ******************************@}
{
ALOGE("The file %s doesn't exist or empty or addr is random %d...\n",
filename, is_exist_addr_random);
if(TRUE == is_modem_bt_nv_supported(MODEM_NV_BD_ADDR))
{
int retry = 0;
while (retry < QMI_INIT_MAX_TRY)
{
if (retry > 0)
{
高通写号工具 ProcATE.exe
参考:
Android-7.0 蓝牙MAC获取
http://www.ningshuran.tech/2017/12/15/Android-7.0%20%E8%93%9D%E7%89%99MAC%E8%8E%B7%E5%8F%96/
[Android P] 蓝牙mac地址的读取与修改
https://www.jianshu.com/p/a5ee7a465146