Bluetooth: Fix proper rome chipset version check
Rome chipset version now can be checked with patch version
and SOC version combination. Also, rome 3.0 version support
has been added. Now host support all rome chipset versions
properly. Some compiler warnings have been fixed.
Change-Id: I80905af7ac978e8870a385f0d817608190d6e24a
diff --git a/libbt-vendor/include/hw_rome.h b/libbt-vendor/include/hw_rome.h
index bd0893f..30dc802 100644
--- a/libbt-vendor/include/hw_rome.h
+++ b/libbt-vendor/include/hw_rome.h
@@ -67,9 +67,9 @@
#define VSEVENT_CODE (0xFF)
#define HC_VS_MAX_CMD_EVENT (0xFF)
#define PATCH_PROD_ID_OFFSET (5)
-#define PATCH_CURR_FW_VER_OFFSET (9)
-#define PATCH_CHIPSET_VER_OFFSET (11)
-#define PATCH_SOC_ID_OFFSET (13)
+#define PATCH_PATCH_VER_OFFSET (9)
+#define PATCH_ROM_BUILD_VER_OFFSET (11)
+#define PATCH_SOC_VER_OFFSET (13)
#define MAX_SIZE_PER_TLV_SEGMENT (243)
/* VS Opcode */
@@ -138,6 +138,9 @@
#define ROME_NVM_TLV_1_0_3_PATH "/system/etc/firmware/nvm_tlv_1.3.bin"
#define ROME_RAMPATCH_TLV_2_0_1_PATH "/system/etc/firmware/rampatch_tlv_2.1.tlv"
#define ROME_NVM_TLV_2_0_1_PATH "/system/etc/firmware/nvm_tlv_2.1.bin"
+#define ROME_RAMPATCH_TLV_3_0_0_PATH "/system/etc/firmware/rampatch_tlv_3.0.tlv"
+#define ROME_NVM_TLV_3_0_0_PATH "/system/etc/firmware/nvm_tlv_3.0.bin"
+
/******************************************************************************
** Local type definitions
@@ -162,8 +165,8 @@
unsigned char sign_algorithm;
unsigned short reserved1;
unsigned short prod_id;
- unsigned short build_ver;
unsigned short patch_ver;
+ unsigned short build_ver;
unsigned short reserved2;
unsigned int patch_entry_addr;
} __attribute__ ((packed)) tlv_patch_hdr;
@@ -212,10 +215,24 @@
};
enum{
+ ROME_PATCH_VER_0100 = 0x0100,
+ ROME_PATCH_VER_0101 = 0x0101,
+ ROME_PATCH_VER_0200 = 0x0200,
+ ROME_PATCH_VER_0300 = 0x0300
+ };
+
+enum{
+ ROME_SOC_ID_00 = 0x00000000,
+ ROME_SOC_ID_11 = 0x00000011,
+ ROME_SOC_ID_22 = 0x00000022,
+};
+
+enum{
ROME_VER_UNKNOWN = 0,
- ROME_VER_1_0 = 0x0100,
- ROME_VER_1_1 = 0x0101,
- ROME_VER_1_3 = 0x0200,
- ROME_VER_2_1 = 0X0201
+ ROME_VER_1_0 = ((ROME_PATCH_VER_0100 << 16 ) | ROME_SOC_ID_00 ),
+ ROME_VER_1_1 = ((ROME_PATCH_VER_0101 << 16 ) | ROME_SOC_ID_00 ),
+ ROME_VER_1_3 = ((ROME_PATCH_VER_0200 << 16 ) | ROME_SOC_ID_00 ),
+ ROME_VER_2_1 = ((ROME_PATCH_VER_0200 << 16 ) | ROME_SOC_ID_11 ),
+ ROME_VER_3_0 = ((ROME_PATCH_VER_0300 << 16 ) | ROME_SOC_ID_22 )
};
#endif /* HW_ROME_H */
diff --git a/libbt-vendor/src/hw_rome.c b/libbt-vendor/src/hw_rome.c
index c787abc..bae3fb9 100644
--- a/libbt-vendor/src/hw_rome.c
+++ b/libbt-vendor/src/hw_rome.c
@@ -64,7 +64,7 @@
unsigned char *phdr_buffer;
unsigned char *pdata_buffer = NULL;
patch_info rampatch_patch_info;
-unsigned short rome_ver = ROME_VER_UNKNOWN;
+int rome_ver = ROME_VER_UNKNOWN;
unsigned char gTlv_type;
char *rampatch_file_path;
char *nvm_file_path;
@@ -77,6 +77,120 @@
/*****************************************************************************
** Functions
*****************************************************************************/
+
+int get_vs_hci_event(unsigned char *rsp)
+{
+ int err = 0, i, soc_id =0;
+ unsigned char paramlen = 0;
+
+ if( (rsp[EVENTCODE_OFFSET] == VSEVENT_CODE) || (rsp[EVENTCODE_OFFSET] == EVT_CMD_COMPLETE))
+ ALOGI("%s: Received HCI-Vendor Specific event", __FUNCTION__);
+ else {
+ ALOGI("%s: Failed to receive HCI-Vendor Specific event", __FUNCTION__);
+ err = -EIO;
+ goto failed;
+ }
+
+ ALOGI("%s: Parameter Length: 0x%x", __FUNCTION__, paramlen = rsp[PLEN]);
+ ALOGI("%s: Command response: 0x%x", __FUNCTION__, rsp[CMD_RSP_OFFSET]);
+ ALOGI("%s: Response type : 0x%x", __FUNCTION__, rsp[RSP_TYPE_OFFSET]);
+
+ /* Check the status of the operation */
+ switch ( rsp[CMD_RSP_OFFSET] )
+ {
+ case EDL_CMD_REQ_RES_EVT:
+ ALOGI("%s: Command Request Response", __FUNCTION__);
+ switch(rsp[RSP_TYPE_OFFSET])
+ {
+ case EDL_PATCH_VER_RES_EVT:
+ case EDL_APP_VER_RES_EVT:
+ ALOGI("\t Current Product ID\t\t: 0x%08x",
+ (unsigned int)(rsp[PATCH_PROD_ID_OFFSET +3] << 24 |
+ rsp[PATCH_PROD_ID_OFFSET+2] << 16 |
+ rsp[PATCH_PROD_ID_OFFSET+1] << 8 |
+ rsp[PATCH_PROD_ID_OFFSET] ));
+
+ /* Patch Version indicates FW patch version */
+ ALOGI("\t Current Patch Version\t\t: 0x%04x",
+ (unsigned short)(rsp[PATCH_PATCH_VER_OFFSET + 1] << 8 |
+ rsp[PATCH_PATCH_VER_OFFSET] ));
+
+ /* ROM Build Version indicates ROM build version like 1.0/1.1/2.0 */
+ ALOGI("\t Current ROM Build Version\t: 0x%04x", rome_ver =
+ (int)(rsp[PATCH_ROM_BUILD_VER_OFFSET + 1] << 8 |
+ rsp[PATCH_ROM_BUILD_VER_OFFSET] ));
+
+ /* In case rome 1.0/1.1, there is no SOC ID version available */
+ if (paramlen - 10)
+ {
+ ALOGI("\t Current SOC Version\t\t: 0x%08x", soc_id =
+ (unsigned int)(rsp[PATCH_SOC_VER_OFFSET +3] << 24 |
+ rsp[PATCH_SOC_VER_OFFSET+2] << 16 |
+ rsp[PATCH_SOC_VER_OFFSET+1] << 8 |
+ rsp[PATCH_SOC_VER_OFFSET] ));
+ }
+
+ /* Rome Chipset Version can be decided by Patch version and SOC version,
+ Upper 2 bytes will be used for Patch version and Lower 2 bytes will be
+ used for SOC as combination for BT host driver */
+ rome_ver = (rome_ver << 16) | (soc_id & 0x0000ffff);
+ break;
+ case EDL_TVL_DNLD_RES_EVT:
+ case EDL_CMD_EXE_STATUS_EVT:
+ switch (err = rsp[CMD_STATUS_OFFSET])
+ {
+ case HCI_CMD_SUCCESS:
+ ALOGI("%s: Download Packet successfully!", __FUNCTION__);
+ break;
+ case PATCH_LEN_ERROR:
+ ALOGI("%s: Invalid patch length argument passed for EDL PATCH "
+ "SET REQ cmd", __FUNCTION__);
+ break;
+ case PATCH_VER_ERROR:
+ ALOGI("%s: Invalid patch version argument passed for EDL PATCH "
+ "SET REQ cmd", __FUNCTION__);
+ break;
+ case PATCH_CRC_ERROR:
+ ALOGI("%s: CRC check of patch failed!!!", __FUNCTION__);
+ break;
+ case PATCH_NOT_FOUND:
+ ALOGI("%s: Invalid patch data!!!", __FUNCTION__);
+ break;
+ case TLV_TYPE_ERROR:
+ ALOGI("%s: TLV Type Error !!!", __FUNCTION__);
+ break;
+ default:
+ ALOGI("%s: Undefined error (0x%x)", __FUNCTION__, err);
+ break;
+ }
+ break;
+ }
+ break;
+
+ case NVM_ACCESS_CODE:
+ ALOGI("%s: NVM Access Code!!!", __FUNCTION__);
+ err = HCI_CMD_SUCCESS;
+ break;
+ case EDL_SET_BAUDRATE_RSP_EVT:
+ /* Rome 1.1 has bug with the response, so it should ignore it. */
+ if (rsp[BAUDRATE_RSP_STATUS_OFFSET] != BAUDRATE_CHANGE_SUCCESS)
+ {
+ ALOGE("%s: Set Baudrate request failed - 0x%x", __FUNCTION__,
+ rsp[CMD_STATUS_OFFSET]);
+ err = -1;
+ }
+ break;
+ default:
+ ALOGE("%s: Not a valid status!!!", __FUNCTION__);
+ err = -1;
+ break;
+ }
+
+failed:
+ return err;
+}
+
+
/*
* Read an VS HCI event from the given file descriptor.
*/
@@ -158,106 +272,6 @@
return ret;
}
-int get_vs_hci_event(unsigned char *rsp)
-{
- int err = 0, i, soc_id;
-
- if( (rsp[EVENTCODE_OFFSET] == VSEVENT_CODE) || (rsp[EVENTCODE_OFFSET] == EVT_CMD_COMPLETE))
- ALOGI("%s: Received HCI-Vendor Specific event", __FUNCTION__);
- else {
- ALOGI("%s: Failed to receive HCI-Vendor Specific event", __FUNCTION__);
- err = -EIO;
- goto failed;
- }
-
- ALOGI("%s: Command response: 0x%x", __FUNCTION__, rsp[CMD_RSP_OFFSET]);
- ALOGI("%s: Response type : 0x%x", __FUNCTION__, rsp[RSP_TYPE_OFFSET]);
-
- /* Check the status of the operation */
- switch ( rsp[CMD_RSP_OFFSET] )
- {
- case EDL_CMD_REQ_RES_EVT:
- ALOGI("%s: Command Request Response", __FUNCTION__);
- switch(rsp[RSP_TYPE_OFFSET])
- {
- case EDL_PATCH_VER_RES_EVT:
- case EDL_APP_VER_RES_EVT:
- ALOGI("\t Product ID: 0x%08x",
- (unsigned int)(rsp[PATCH_PROD_ID_OFFSET +3] << 24 |
- rsp[PATCH_PROD_ID_OFFSET+2] << 16 |
- rsp[PATCH_PROD_ID_OFFSET+1] << 8 |
- rsp[PATCH_PROD_ID_OFFSET] ));
- ALOGI("\t Current FW Version: 0x%04x",
- (unsigned short)(rsp[PATCH_CURR_FW_VER_OFFSET + 1] << 8 |
- rsp[PATCH_CURR_FW_VER_OFFSET] ));
- ALOGI("\t Chipset Version: 0x%04x", rome_ver =
- (unsigned short)(rsp[PATCH_CHIPSET_VER_OFFSET + 1] << 8 |
- rsp[PATCH_CHIPSET_VER_OFFSET] ));
- ALOGI("\t Current SOC ID Version: 0x%08x", soc_id =
- (unsigned int)(rsp[PATCH_PROD_ID_OFFSET +3] << 24 |
- rsp[PATCH_SOC_ID_OFFSET+1] << 8 |
- rsp[PATCH_SOC_ID_OFFSET+2] << 16 |
- rsp[PATCH_SOC_ID_OFFSET] ));
- if(rome_ver == ROME_VER_1_3 && soc_id == 0x11)
- {
- rome_ver = ROME_VER_2_1;
- }
- break;
- case EDL_TVL_DNLD_RES_EVT:
- case EDL_CMD_EXE_STATUS_EVT:
- switch (err = rsp[CMD_STATUS_OFFSET])
- {
- case HCI_CMD_SUCCESS:
- ALOGI("%s: Download Packet successfully!", __FUNCTION__);
- break;
- case PATCH_LEN_ERROR:
- ALOGI("%s: Invalid patch length argument passed for EDL PATCH "
- "SET REQ cmd", __FUNCTION__);
- break;
- case PATCH_VER_ERROR:
- ALOGI("%s: Invalid patch version argument passed for EDL PATCH "
- "SET REQ cmd", __FUNCTION__);
- break;
- case PATCH_CRC_ERROR:
- ALOGI("%s: CRC check of patch failed!!!", __FUNCTION__);
- break;
- case PATCH_NOT_FOUND:
- ALOGI("%s: Invalid patch data!!!", __FUNCTION__);
- break;
- case TLV_TYPE_ERROR:
- ALOGI("%s: TLV Type Error !!!", __FUNCTION__);
- break;
- default:
- ALOGI("%s: Undefined error (0x%x)", __FUNCTION__, err);
- break;
- }
- break;
- }
- break;
-
- case NVM_ACCESS_CODE:
- ALOGI("%s: NVM Access Code!!!", __FUNCTION__);
- err = HCI_CMD_SUCCESS;
- break;
- case EDL_SET_BAUDRATE_RSP_EVT:
- /* Rome 1.1 has bug with the response, so it should ignore it. */
- if (rsp[BAUDRATE_RSP_STATUS_OFFSET] != BAUDRATE_CHANGE_SUCCESS)
- {
- ALOGE("%s: Set Baudrate request failed - 0x%x", __FUNCTION__,
- rsp[CMD_STATUS_OFFSET]);
- err = -1;
- }
- break;
- default:
- ALOGE("%s: Not a valid status!!!", __FUNCTION__);
- err = -1;
- break;
- }
-
-failed:
- return err;
-}
-
void frame_hci_cmd_pkt(
unsigned char *cmd,
int edl_cmd, unsigned int p_base_addr,
@@ -685,7 +699,7 @@
fclose (pFile);
if (readSize != fileSize) {
- ALOGE("Read file size(%d) not matched with actual file size (%d bytes)",readSize,fileSize);
+ ALOGE("Read file size(%d) not matched with actual file size (%ld bytes)",readSize,fileSize);
return -1;
}
@@ -703,9 +717,9 @@
ALOGI("Signing Format Version\t : 0x%x", ptlv_header->tlv.patch.sign_ver);
ALOGI("Signature Algorithm\t\t : 0x%x", ptlv_header->tlv.patch.sign_algorithm);
ALOGI("Reserved\t\t\t : 0x%x", ptlv_header->tlv.patch.reserved1);
- ALOGI("Product ID\t\t\t : 0x%x\n", ptlv_header->tlv.patch.prod_id);
- ALOGI("Rom Build Version\t\t : 0x%x\n", ptlv_header->tlv.patch.build_ver);
- ALOGI("Patch Version\t\t : 0x%x\n", ptlv_header->tlv.patch.patch_ver);
+ ALOGI("Product ID\t\t\t : 0x%04x\n", ptlv_header->tlv.patch.prod_id);
+ ALOGI("Patch Version\t\t : 0x%04x\n", ptlv_header->tlv.patch.patch_ver);
+ ALOGI("Rom Build Version\t\t : 0x%04x\n", ptlv_header->tlv.patch.build_ver);
ALOGI("Reserved\t\t\t : 0x%x\n", ptlv_header->tlv.patch.reserved2);
ALOGI("Patch Entry Address\t\t : 0x%x\n", (ptlv_header->tlv.patch.patch_entry_addr));
ALOGI("====================================================");
@@ -741,7 +755,7 @@
}
for(i =0;(i<nvm_ptr->tag_len && (i*3 + 2) <PRINT_BUF_SIZE);i++)
- snprintf(data_buf, PRINT_BUF_SIZE, "%s%.02x ", data_buf, *(nvm_byte_ptr + i));
+ snprintf((char *) data_buf, PRINT_BUF_SIZE, "%s%.02x ", (char *)data_buf, *(nvm_byte_ptr + i));
ALOGI("TAG Data\t\t\t : %s", data_buf);
@@ -815,7 +829,7 @@
command complete event */
wait_cc_evt = ((rome_ver >= ROME_VER_1_1) && (gTlv_type == TLV_TYPE_PATCH )
&& !remain_size && ((i+1) == total_segment))? FALSE: TRUE;
- if(err = rome_tlv_dnld_segment(fd, i, MAX_SIZE_PER_TLV_SEGMENT, wait_cc_evt ) < 0)
+ if((err = rome_tlv_dnld_segment(fd, i, MAX_SIZE_PER_TLV_SEGMENT, wait_cc_evt )) < 0)
goto error;
}
@@ -1098,7 +1112,7 @@
};
#endif
- ALOGI("%s: Start sending NVM Tags (ver: 0x%x)", __FUNCTION__, NVM_VERSION);
+ ALOGI("%s: Start sending NVM Tags (ver: 0x%x)", __FUNCTION__, (unsigned int) NVM_VERSION);
for (i=0; (i < MAX_TAG_CMD) && (cmds[i][0] != TAG_END); i++)
{
@@ -1317,7 +1331,7 @@
goto error;
}
- ALOGI("%s: Rome Version (0x%04x)", __FUNCTION__, rome_ver);
+ ALOGI("%s: Rome Version (0x%08x)", __FUNCTION__, rome_ver);
switch (rome_ver){
case ROME_VER_1_0:
@@ -1377,6 +1391,11 @@
case ROME_VER_2_1:
rampatch_file_path = ROME_RAMPATCH_TLV_2_0_1_PATH;
nvm_file_path = ROME_NVM_TLV_2_0_1_PATH;
+ goto download;
+ case ROME_VER_3_0:
+ rampatch_file_path = ROME_RAMPATCH_TLV_3_0_0_PATH;
+ nvm_file_path = ROME_NVM_TLV_3_0_0_PATH;
+
download:
/* Change baud rate 115.2 kbps to 3Mbps*/
err = rome_set_baudrate_req(fd);