10ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel/*
20ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel * Copyright 2012 The Android Open Source Project
30ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel * Copyright (c) 2013, The Linux Foundation. All rights reserved.
40ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel * Not a Contribution.
50ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel *
60ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel *  Licensed under the Apache License, Version 2.0 (the "License");
70ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel *  you may not use this file except in compliance with the License.
80ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel * You may obtain a copy of the License at
90ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel *
100ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel *  http://www.apache.org/licenses/LICENSE-2.0
110ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel *
120ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel *  Unless required by applicable law or agreed to in writing, software
130ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel *  distributed under the License is distributed on an "AS IS" BASIS,
140ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
150ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel *  See the License for the specific language governing permissions and
160ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel *  limitations under the License.
170ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel */
180ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#ifndef HW_ROME_H
190ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define HW_ROME_H
200ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel
210ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel
220ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel/******************************************************************************
230ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel**  Constants & Macros
240ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel******************************************************************************/
250ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define HCI_MAX_CMD_SIZE        260
260ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define HCI_MAX_EVENT_SIZE     260
270ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define PRINT_BUF_SIZE              ((HCI_MAX_CMD_SIZE * 3) + 2)
280ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel
290ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define HCI_CHG_BAUD_CMD_OCF        0x0C
300ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define HCI_VENDOR_CMD_OGF             0x3F
310ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define WRITE_BDADDR_CMD_LEN        14
320ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define WRITE_BAUD_CMD_LEN             6
330ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define MAX_CMD_LEN                    WRITE_BDADDR_CMD_LEN
340ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define GET_VERSION_OCF            0x1E
350ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel
360ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define PS_HDR_LEN                         4
370ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define HCI_VENDOR_CMD_OGF      0x3F
380ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define HCI_PS_CMD_OCF                0x0B
390ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel
400ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define HCI_COMMAND_HDR_SIZE        3
410ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define EVT_CMD_COMPLETE_SIZE       3
420ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define EVT_CMD_STATUS                     0x0F
430ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define EVT_CMD_STATUS_SIZE           4
440ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define HCI_EVENT_HDR_SIZE              2
450ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define HCI_EV_SUCCESS                      0x00
460ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel/* HCI Socket options */
470ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define HCI_DATA_DIR            1
480ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define HCI_FILTER                  2
490ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define HCI_TIME_STAMP        3
500ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel
510ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define P_ID_OFFSET                                     (0)
520ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define HCI_CMD_IND                                   (1)
530ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define EVENTCODE_OFFSET                      (1)
540ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define EVT_PLEN                                             (2)
550ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define PLEN                                                       (3)
560ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define CMD_RSP_OFFSET                             (3)
570ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define RSP_TYPE_OFFSET                            (4)
580ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define BAUDRATE_RSP_STATUS_OFFSET    (4)
590ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define CMD_STATUS_OFFSET                      (5)
600ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define P_ROME_VER_OFFSET                       (4)
610ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define P_BUILD_VER_OFFSET                      (6)
620ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define P_BASE_ADDR_OFFSET                     (8)
630ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define P_ENTRY_ADDR_OFFSET                   (12)
640ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define P_LEN_OFFSET                                   (16)
650ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define P_CRC_OFFSET                                  (20)
660ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define P_CONTROL_OFFSET                          (24)
670ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define PATCH_HDR_LEN                               (28)
680ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define MAX_DATA_PER_SEGMENT                (239)
690ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define VSEVENT_CODE                                 (0xFF)
700ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define HC_VS_MAX_CMD_EVENT                 (0xFF)
710ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define PATCH_PROD_ID_OFFSET                (5)
720ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define PATCH_PATCH_VER_OFFSET            (9)
730ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define PATCH_ROM_BUILD_VER_OFFSET       (11)
740ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define PATCH_SOC_VER_OFFSET             (13)
750ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define MAX_SIZE_PER_TLV_SEGMENT        (243)
760ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel
770ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel/* VS Opcode */
780ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define HCI_PATCH_CMD_OCF                       (0)
790ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define EDL_SET_BAUDRATE_CMD_OCF        (0x48)
800ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define EDL_WIPOWER_VS_CMD_OCF          (0x1f)
810ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define HCI_VS_GET_ADDON_FEATURES_SUPPORT   (0x1d)
820ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel
830ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel/* VS Commands */
840ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define VSC_SET_BAUDRATE_REQ_LEN        (1)
850ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define EDL_PATCH_CMD_LEN	                       (1)
860ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define EDL_PATCH_CMD_REQ_LEN               (1)
870ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define EDL_WIP_QUERY_CHARGING_STATUS_LEN   (0x01)
880ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define EDL_WIP_START_HANDOFF_TO_HOST_LEN   (0x01)
890ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define EDL_PATCH_DLD_REQ_CMD               (0x01)
900ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define EDL_PATCH_RST_REQ_CMD               (0x05)
910ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define EDL_PATCH_SET_REQ_CMD               (0x16)
920ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define EDL_PATCH_ATCH_REQ_CMD            (0x17)
930ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define EDL_PATCH_VER_REQ_CMD               (0x19)
940ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define EDL_GET_BUILD_INFO                  (0x20)
950ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define EDL_PATCH_TLV_REQ_CMD               (0x1E)
960ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define EDL_WIP_QUERY_CHARGING_STATUS_CMD   (0x1D)
970ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define EDL_WIP_START_HANDOFF_TO_HOST_CMD   (0x1E)
980ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel
990ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel/* VS Event */
1000ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define EDL_CMD_REQ_RES_EVT                 (0x00)
1010ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define EDL_CMD_EXE_STATUS_EVT           (0x00)
1020ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define EDL_SET_BAUDRATE_RSP_EVT       (0x92)
1030ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define EDL_PATCH_VER_RES_EVT             (0x19)
1040ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define EDL_TVL_DNLD_RES_EVT                (0x04)
1050ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define EDL_APP_VER_RES_EVT                  (0x02)
1060ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define EDL_WIP_QUERY_CHARGING_STATUS_EVT    (0x18)
1070ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define EDL_WIP_START_HANDOFF_TO_HOST_EVENT  (0x19)
1080ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define HCI_VS_GET_ADDON_FEATURES_EVENT      (0x1B)
1090ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define HCI_VS_GET_BUILD_VER_EVT             (0x05)
1100ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define HCI_VS_STRAY_EVT                (0x17)
1110ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel
1120ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel/* Status Codes of HCI CMD execution*/
1130ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define HCI_CMD_SUCCESS                     (0x0)
1140ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define PATCH_LEN_ERROR                       (0x1)
1150ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define PATCH_VER_ERROR                       (0x2)
1160ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define PATCH_CRC_ERROR                     (0x3)
1170ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define PATCH_NOT_FOUND                      (0x4)
1180ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define TLV_TYPE_ERROR                         (0x10)
1190ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define NVM_ACCESS_CODE                     (0x0B)
1200ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define BAUDRATE_CHANGE_SUCCESS   (1)
1210ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel
1220ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel/* Wipower status codes */
1230ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define WIPOWER_IN_EMBEDDED_MODE 0x01
1240ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define NON_WIPOWER_MODE 0x02
1250ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel
1260ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel/* mask to validate support for wipower */
1270ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define ADDON_FEATURES_EVT_WIPOWER_MASK      (0x01)
1280ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel
1290ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel/* TLV_TYPE */
1300ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define TLV_TYPE_PATCH                  (1)
1310ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define TLV_TYPE_NVM                      (2)
1320ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel
1330ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel/* NVM */
1340ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define MAX_TAG_CMD                 30
1350ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define TAG_END                           0xFF
1360ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define NVM_ACCESS_SET            0x01
1370ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define TAG_NUM_OFFSET             5
1380ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define TAG_NUM_2                       2
1390ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define TAG_BDADDR_OFFSET     7
1400ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel
1410ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel/* NVM Tags specifically used for ROME 1.0 */
1420ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define ROME_1_0_100022_1       0x101000221
1430ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define ROME_1_0_100019           0x101000190
1440ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define ROME_1_0_6002               0x100600200
1450ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel
1460ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel/* Default NVM Version setting for ROME 1.0 */
1470ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define NVM_VERSION                  ROME_1_0_100022_1
1480ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel
1490ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel
1500ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define LSH(val, n)     ((uint32_t)(val) << (n))
1510ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define EXTRACT_BYTE(val, pos)      (char) (((val) >> (8 * (pos))) & 0xFF)
1520ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define CALC_SEG_SIZE(len, max)   ((plen) % (max))?((plen/max)+1) : ((plen) / (max))
1530ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel
1540ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define ROME_FW_PATH                      "/system/etc/firmware/rampatch.img"
1550ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define ROME_RAMPATCH_TLV_PATH            "/system/etc/firmware/rampatch_tlv.img"
1560ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define ROME_NVM_TLV_PATH                 "/system/etc/firmware/nvm_tlv.bin"
1570ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define ROME_RAMPATCH_TLV_1_0_3_PATH      "/system/etc/firmware/rampatch_tlv_1.3.tlv"
1580ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define ROME_NVM_TLV_1_0_3_PATH           "/system/etc/firmware/nvm_tlv_1.3.bin"
1590ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define ROME_RAMPATCH_TLV_2_0_1_PATH      "/system/etc/firmware/rampatch_tlv_2.1.tlv"
1600ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define ROME_NVM_TLV_2_0_1_PATH           "/system/etc/firmware/nvm_tlv_2.1.bin"
1610ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define ROME_RAMPATCH_TLV_3_0_0_PATH      "/bt_firmware/image/btfw30.tlv"
1620ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define ROME_NVM_TLV_3_0_0_PATH           "/bt_firmware/image/btnv30.bin"
1630ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define ROME_RAMPATCH_TLV_3_0_2_PATH      "/bt_firmware/image/btfw32.tlv"
1640ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define ROME_NVM_TLV_3_0_2_PATH           "/bt_firmware/image/btnv32.bin"
1650ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel
1660ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define ROME_3_1_FW_SU  "bprm.cnss.3.1"
1670ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define ROME_3_2_FW_SU  "btfwp.cnss.3.2"
1680ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel
1690ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel/* Rome 3.1 FW SU release has been branched from rome 3.0 SU 224
1700ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel    So, rome 3.1 formula is SU = patch version -(0xE0 = 224) - 0x111 -1
1710ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel*/
1720ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define ROME_3_1_FW_SW_OFFSET   0x01F2
1730ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel
1740ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel/* Rome 3.2 FW SU formula is SU = patch version - 0x111 -1 */
1750ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define ROME_3_2_FW_SW_OFFSET   0x0112
1760ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel
1770ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel/* This header value in rampatch file decides event handling mechanism in the HOST */
1780ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define ROME_SKIP_EVT_NONE     0x00
1790ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define ROME_SKIP_EVT_VSE      0x01
1800ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define ROME_SKIP_EVT_CC       0x02
1810ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define ROME_SKIP_EVT_VSE_CC   0x03
1820ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel
1830ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel/******************************************************************************
1840ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel**  Local type definitions
1850ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel******************************************************************************/
1860ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudeltypedef struct {
1870ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel    unsigned short rom_version;
1880ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel    unsigned short build_version;
1890ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel} __attribute__ ((packed)) patch_version;
1900ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel
1910ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudeltypedef struct {
1920ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel    unsigned int patch_id;
1930ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel    patch_version patch_ver;
1940ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel    unsigned int patch_base_addr;
1950ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel    unsigned int patch_entry_addr;
1960ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel    unsigned short patch_length;
1970ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel    int patch_crc;
1980ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel    unsigned short patch_ctrl;
1990ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel} __attribute__ ((packed)) patch_info;
2000ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel
2010ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudeltypedef struct {
2020ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel    unsigned int  tlv_data_len;
2030ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel    unsigned int  tlv_patch_data_len;
2040ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel    unsigned char sign_ver;
2050ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel    unsigned char sign_algorithm;
2060ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel    unsigned char dwnd_cfg;
2070ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel    unsigned char reserved1;
2080ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel    unsigned short prod_id;
2090ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel    unsigned short build_ver;
2100ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel    unsigned short patch_ver;
2110ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel    unsigned short reserved2;
2120ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel    unsigned int patch_entry_addr;
2130ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel} __attribute__ ((packed)) tlv_patch_hdr;
2140ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel
2150ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudeltypedef struct {
2160ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel    unsigned short tag_id;
2170ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel    unsigned short tag_len;
2180ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel    unsigned int tag_ptr;
2190ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel    unsigned int tag_ex_flag;
2200ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel} __attribute__ ((packed)) tlv_nvm_hdr;
2210ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel
2220ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudeltypedef struct {
2230ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel    unsigned char tlv_type;
2240ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel    unsigned char tlv_length1;
2250ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel    unsigned char tlv_length2;
2260ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel    unsigned char tlv_length3;
2270ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel
2280ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel    union{
2290ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel        tlv_patch_hdr patch;
2300ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel        tlv_nvm_hdr nvm;
2310ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel    }tlv;
2320ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel} __attribute__ ((packed)) tlv_patch_info;
2330ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel
2340ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel
2350ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudelenum{
2360ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel    BAUDRATE_115200     = 0x00,
2370ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel    BAUDRATE_57600      = 0x01,
2380ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel    BAUDRATE_38400      = 0x02,
2390ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel    BAUDRATE_19200      = 0x03,
2400ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel    BAUDRATE_9600       = 0x04,
2410ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel    BAUDRATE_230400     = 0x05,
2420ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel    BAUDRATE_250000     = 0x06,
2430ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel    BAUDRATE_460800     = 0x07,
2440ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel    BAUDRATE_500000     = 0x08,
2450ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel    BAUDRATE_720000     = 0x09,
2460ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel    BAUDRATE_921600     = 0x0A,
2470ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel    BAUDRATE_1000000   = 0x0B,
2480ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel    BAUDRATE_1250000   = 0x0C,
2490ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel    BAUDRATE_2000000   = 0x0D,
2500ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel    BAUDRATE_3000000   = 0x0E,
2510ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel    BAUDRATE_4000000   = 0x0F,
2520ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel    BAUDRATE_1600000   = 0x10,
2530ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel    BAUDRATE_3200000   = 0x11,
2540ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel    BAUDRATE_3500000   = 0x12,
2550ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel    BAUDRATE_AUTO        = 0xFE,
2560ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel    BAUDRATE_Reserved  = 0xFF
2570ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel};
2580ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel
2590ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudelenum{
2600ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel    ROME_PATCH_VER_0100 = 0x0100,
2610ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel    ROME_PATCH_VER_0101 = 0x0101,
2620ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel    ROME_PATCH_VER_0200 = 0x0200,
2630ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel    ROME_PATCH_VER_0300 = 0x0300,
2640ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel    ROME_PATCH_VER_0302 = 0x0302
2650ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel };
2660ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel
2670ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudelenum{
2680ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel    ROME_SOC_ID_00 = 0x00000000,
2690ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel    ROME_SOC_ID_11 = 0x00000011,
2700ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel    ROME_SOC_ID_22 = 0x00000022,
2710ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel    ROME_SOC_ID_44 = 0x00000044
2720ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel};
2730ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel
2740ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudelenum{
2750ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel    ROME_VER_UNKNOWN = 0,
2760ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel    ROME_VER_1_0 = ((ROME_PATCH_VER_0100 << 16 ) | ROME_SOC_ID_00 ),
2770ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel    ROME_VER_1_1 = ((ROME_PATCH_VER_0101 << 16 ) | ROME_SOC_ID_00 ),
2780ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel    ROME_VER_1_3 = ((ROME_PATCH_VER_0200 << 16 ) | ROME_SOC_ID_00 ),
2790ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel    ROME_VER_2_1 = ((ROME_PATCH_VER_0200 << 16 ) | ROME_SOC_ID_11 ),
2800ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel    ROME_VER_3_0 = ((ROME_PATCH_VER_0300 << 16 ) | ROME_SOC_ID_22 ),
2810ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel    ROME_VER_3_2 = ((ROME_PATCH_VER_0302 << 16 ) | ROME_SOC_ID_44 )
2820ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel};
2830ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel
2840ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel//declarations
2850ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudelint rome_soc_init(int fd, char *bdaddr);
2860ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudelint check_embedded_mode(int fd);
2870ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudelint rome_get_addon_feature_list(int fd);
2880ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudelvoid enable_controller_log(int fd, unsigned char req);
2890ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudelvoid cherokee_shutdown_vs_cmd(int fd);
2900ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#endif /* HW_ROME_H */
291