1/*
2 * Copyright 2012 The Android Open Source Project
3 * Copyright (c) 2013, The Linux Foundation. All rights reserved.
4 * Not a Contribution.
5 *
6 *  Licensed under the Apache License, Version 2.0 (the "License");
7 *  you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
9 *
10 *  http://www.apache.org/licenses/LICENSE-2.0
11 *
12 *  Unless required by applicable law or agreed to in writing, software
13 *  distributed under the License is distributed on an "AS IS" BASIS,
14 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 *  See the License for the specific language governing permissions and
16 *  limitations under the License.
17 */
18#ifndef HW_ROME_H
19#define HW_ROME_H
20
21/******************************************************************************
22**  Constants & Macros
23******************************************************************************/
24#define HCI_MAX_CMD_SIZE        260
25#define HCI_MAX_EVENT_SIZE     260
26#define PRINT_BUF_SIZE              ((HCI_MAX_CMD_SIZE * 3) + 2)
27
28#define HCI_CHG_BAUD_CMD_OCF        0x0C
29#define HCI_VENDOR_CMD_OGF             0x3F
30#define WRITE_BDADDR_CMD_LEN        14
31#define WRITE_BAUD_CMD_LEN             6
32#define MAX_CMD_LEN                    WRITE_BDADDR_CMD_LEN
33#define GET_VERSION_OCF            0x1E
34
35#define PS_HDR_LEN                         4
36#define HCI_VENDOR_CMD_OGF      0x3F
37#define HCI_PS_CMD_OCF                0x0B
38
39#define HCI_COMMAND_HDR_SIZE        3
40#define EVT_CMD_COMPLETE_SIZE       3
41#define EVT_CMD_STATUS                     0x0F
42#define EVT_CMD_STATUS_SIZE           4
43#define HCI_EVENT_HDR_SIZE              2
44#define HCI_EV_SUCCESS                      0x00
45/* HCI Socket options */
46#define HCI_DATA_DIR            1
47#define HCI_FILTER                  2
48#define HCI_TIME_STAMP        3
49
50#define P_ID_OFFSET                                     (0)
51#define HCI_CMD_IND                                   (1)
52#define EVENTCODE_OFFSET                      (1)
53#define EVT_PLEN                                             (2)
54#define PLEN                                                       (3)
55#define CMD_RSP_OFFSET                             (3)
56#define RSP_TYPE_OFFSET                            (4)
57#define BAUDRATE_RSP_STATUS_OFFSET    (4)
58#define CMD_STATUS_OFFSET                      (5)
59#define P_ROME_VER_OFFSET                       (4)
60#define P_BUILD_VER_OFFSET                      (6)
61#define P_BASE_ADDR_OFFSET                     (8)
62#define P_ENTRY_ADDR_OFFSET                   (12)
63#define P_LEN_OFFSET                                   (16)
64#define P_CRC_OFFSET                                  (20)
65#define P_CONTROL_OFFSET                          (24)
66#define PATCH_HDR_LEN                               (28)
67#define MAX_DATA_PER_SEGMENT                (239)
68#define VSEVENT_CODE                                 (0xFF)
69#define HC_VS_MAX_CMD_EVENT                 (0xFF)
70#define PATCH_PROD_ID_OFFSET                (5)
71#define PATCH_PATCH_VER_OFFSET            (9)
72#define PATCH_ROM_BUILD_VER_OFFSET       (11)
73#define PATCH_SOC_VER_OFFSET             (13)
74#define MAX_SIZE_PER_TLV_SEGMENT        (243)
75
76/* VS Opcode */
77#define HCI_PATCH_CMD_OCF                       (0)
78#define EDL_SET_BAUDRATE_CMD_OCF        (0x48)
79#define EDL_WIPOWER_VS_CMD_OCF          (0x1f)
80#define HCI_VS_GET_ADDON_FEATURES_SUPPORT   (0x1d)
81
82/* VS Commands */
83#define VSC_SET_BAUDRATE_REQ_LEN        (1)
84#define EDL_PATCH_CMD_LEN	                       (1)
85#define EDL_PATCH_CMD_REQ_LEN               (1)
86#define EDL_WIP_QUERY_CHARGING_STATUS_LEN   (0x01)
87#define EDL_WIP_START_HANDOFF_TO_HOST_LEN   (0x01)
88#define EDL_PATCH_DLD_REQ_CMD               (0x01)
89#define EDL_PATCH_RST_REQ_CMD               (0x05)
90#define EDL_PATCH_SET_REQ_CMD               (0x16)
91#define EDL_PATCH_ATCH_REQ_CMD            (0x17)
92#define EDL_PATCH_VER_REQ_CMD               (0x19)
93#define EDL_GET_BUILD_INFO                  (0x20)
94#define EDL_PATCH_TLV_REQ_CMD               (0x1E)
95#define EDL_WIP_QUERY_CHARGING_STATUS_CMD   (0x1D)
96#define EDL_WIP_START_HANDOFF_TO_HOST_CMD   (0x1E)
97
98/* VS Event */
99#define EDL_CMD_REQ_RES_EVT                 (0x00)
100#define EDL_CMD_EXE_STATUS_EVT           (0x00)
101#define EDL_SET_BAUDRATE_RSP_EVT       (0x92)
102#define EDL_PATCH_VER_RES_EVT             (0x19)
103#define EDL_TVL_DNLD_RES_EVT                (0x04)
104#define EDL_APP_VER_RES_EVT                  (0x02)
105#define EDL_WIP_QUERY_CHARGING_STATUS_EVT    (0x18)
106#define EDL_WIP_START_HANDOFF_TO_HOST_EVENT  (0x19)
107#define HCI_VS_GET_ADDON_FEATURES_EVENT      (0x1B)
108#define HCI_VS_GET_BUILD_VER_EVT             (0x05)
109#define HCI_VS_STRAY_EVT                (0x17)
110
111/* Status Codes of HCI CMD execution*/
112#define HCI_CMD_SUCCESS                     (0x0)
113#define PATCH_LEN_ERROR                       (0x1)
114#define PATCH_VER_ERROR                       (0x2)
115#define PATCH_CRC_ERROR                     (0x3)
116#define PATCH_NOT_FOUND                      (0x4)
117#define TLV_TYPE_ERROR                         (0x10)
118#define NVM_ACCESS_CODE                     (0x0B)
119#define BAUDRATE_CHANGE_SUCCESS   (1)
120
121/* Wipower status codes */
122#define WIPOWER_IN_EMBEDDED_MODE 0x01
123#define NON_WIPOWER_MODE 0x02
124
125/* mask to validate support for wipower */
126#define ADDON_FEATURES_EVT_WIPOWER_MASK      (0x01)
127
128/* TLV_TYPE */
129#define TLV_TYPE_PATCH                  (1)
130#define TLV_TYPE_NVM                      (2)
131
132/* NVM */
133#define MAX_TAG_CMD                 30
134#define TAG_END                           0xFF
135#define NVM_ACCESS_SET            0x01
136#define TAG_NUM_OFFSET             5
137#define TAG_NUM_2                       2
138#define TAG_BDADDR_OFFSET     7
139
140/* NVM Tags specifically used for ROME 1.0 */
141#define ROME_1_0_100022_1       0x101000221
142#define ROME_1_0_100019           0x101000190
143#define ROME_1_0_6002               0x100600200
144
145/* Default NVM Version setting for ROME 1.0 */
146#define NVM_VERSION                  ROME_1_0_100022_1
147
148
149#define LSH(val, n)     ((uint32_t)(val) << (n))
150#define EXTRACT_BYTE(val, pos)      (char) (((val) >> (8 * (pos))) & 0xFF)
151#define CALC_SEG_SIZE(len, max)   ((plen) % (max))?((plen/max)+1) : ((plen) / (max))
152
153#define ROME_FW_PATH        "/system/etc/firmware/rampatch.img"
154#define ROME_RAMPATCH_TLV_PATH      "/system/etc/firmware/rampatch_tlv.img"
155#define ROME_NVM_TLV_PATH         "/system/etc/firmware/nvm_tlv.bin"
156#define ROME_RAMPATCH_TLV_1_0_3_PATH    "/system/etc/firmware/rampatch_tlv_1.3.tlv"
157#define ROME_NVM_TLV_1_0_3_PATH         "/system/etc/firmware/nvm_tlv_1.3.bin"
158#define ROME_RAMPATCH_TLV_2_0_1_PATH    "/system/etc/firmware/rampatch_tlv_2.1.tlv"
159#define ROME_NVM_TLV_2_0_1_PATH         "/system/etc/firmware/nvm_tlv_2.1.bin"
160#define ROME_RAMPATCH_TLV_3_0_0_PATH    "/bt_firmware/image/btfw30.tlv"
161#define ROME_NVM_TLV_3_0_0_PATH         "/bt_firmware/image/btnv30.bin"
162#define ROME_RAMPATCH_TLV_3_0_2_PATH    "/bt_firmware/image/btfw32.tlv"
163#define ROME_NVM_TLV_3_0_2_PATH         "/bt_firmware/image/btnv32.bin"
164//#define ROME_RAMPATCH_TLV_3_0_0_PATH    "/system/etc/firmware/rampatch_tlv_3.0.tlv"
165//#define ROME_NVM_TLV_3_0_0_PATH         "/system/etc/firmware/nvm_tlv_3.0.bin"
166//#define ROME_RAMPATCH_TLV_3_0_2_PATH    "/system/etc/firmware/rampatch_tlv_3.2.tlv"
167//#define ROME_NVM_TLV_3_0_2_PATH         "/system/etc/firmware/nvm_tlv_3.2.bin"
168
169#define ROME_3_1_FW_SU  "bprm.cnss.3.1"
170#define ROME_3_2_FW_SU  "btfwp.cnss.3.2"
171
172/* Rome 3.1 FW SU release has been branched from rome 3.0 SU 224
173    So, rome 3.1 formula is SU = patch version -(0xE0 = 224) - 0x111 -1
174*/
175#define ROME_3_1_FW_SW_OFFSET   0x01F2
176
177/* Rome 3.2 FW SU formula is SU = patch version - 0x111 -1 */
178#define ROME_3_2_FW_SW_OFFSET   0x0112
179
180/* This header value in rampatch file decides event handling mechanism in the HOST */
181#define ROME_SKIP_EVT_NONE     0x00
182#define ROME_SKIP_EVT_VSE      0x01
183#define ROME_SKIP_EVT_CC       0x02
184#define ROME_SKIP_EVT_VSE_CC   0x03
185
186/******************************************************************************
187**  Local type definitions
188******************************************************************************/
189typedef struct {
190    unsigned short rom_version;
191    unsigned short build_version;
192} __attribute__ ((packed)) patch_version;
193
194typedef struct {
195    unsigned int patch_id;
196    patch_version patch_ver;
197    unsigned int patch_base_addr;
198    unsigned int patch_entry_addr;
199    unsigned short patch_length;
200    int patch_crc;
201    unsigned short patch_ctrl;
202} __attribute__ ((packed)) patch_info;
203
204typedef struct {
205    unsigned int  tlv_data_len;
206    unsigned int  tlv_patch_data_len;
207    unsigned char sign_ver;
208    unsigned char sign_algorithm;
209    unsigned char dwnd_cfg;
210    unsigned char reserved1;
211    unsigned short prod_id;
212    unsigned short build_ver;
213    unsigned short patch_ver;
214    unsigned short reserved2;
215    unsigned int patch_entry_addr;
216} __attribute__ ((packed)) tlv_patch_hdr;
217
218typedef struct {
219    unsigned short tag_id;
220    unsigned short tag_len;
221    unsigned int tag_ptr;
222    unsigned int tag_ex_flag;
223} __attribute__ ((packed)) tlv_nvm_hdr;
224
225typedef struct {
226    unsigned char tlv_type;
227    unsigned char tlv_length1;
228    unsigned char tlv_length2;
229    unsigned char tlv_length3;
230
231    union{
232        tlv_patch_hdr patch;
233        tlv_nvm_hdr nvm;
234    }tlv;
235} __attribute__ ((packed)) tlv_patch_info;
236
237
238enum{
239    BAUDRATE_115200     = 0x00,
240    BAUDRATE_57600       = 0x01,
241    BAUDRATE_38400       = 0x02,
242    BAUDRATE_19200       = 0x03,
243    BAUDRATE_9600         = 0x04,
244    BAUDRATE_230400     = 0x05,
245    BAUDRATE_250000     = 0x06,
246    BAUDRATE_460800     = 0x07,
247    BAUDRATE_500000     = 0x08,
248    BAUDRATE_720000     = 0x09,
249    BAUDRATE_921600     = 0x0A,
250    BAUDRATE_1000000   = 0x0B,
251    BAUDRATE_1250000   = 0x0C,
252    BAUDRATE_2000000   = 0x0D,
253    BAUDRATE_3000000   = 0x0E,
254    BAUDRATE_4000000   = 0x0F,
255    BAUDRATE_1600000   = 0x10,
256    BAUDRATE_3200000   = 0x11,
257    BAUDRATE_3500000   = 0x12,
258    BAUDRATE_AUTO        = 0xFE,
259    BAUDRATE_Reserved  = 0xFF
260};
261
262enum{
263    ROME_PATCH_VER_0100 = 0x0100,
264    ROME_PATCH_VER_0101 = 0x0101,
265    ROME_PATCH_VER_0200 = 0x0200,
266    ROME_PATCH_VER_0300 = 0x0300,
267    ROME_PATCH_VER_0302 = 0x0302
268 };
269
270enum{
271    ROME_SOC_ID_00 = 0x00000000,
272    ROME_SOC_ID_11 = 0x00000011,
273    ROME_SOC_ID_22 = 0x00000022,
274    ROME_SOC_ID_44 = 0x00000044
275};
276
277enum{
278    ROME_VER_UNKNOWN = 0,
279    ROME_VER_1_0 = ((ROME_PATCH_VER_0100 << 16 ) | ROME_SOC_ID_00 ),
280    ROME_VER_1_1 = ((ROME_PATCH_VER_0101 << 16 ) | ROME_SOC_ID_00 ),
281    ROME_VER_1_3 = ((ROME_PATCH_VER_0200 << 16 ) | ROME_SOC_ID_00 ),
282    ROME_VER_2_1 = ((ROME_PATCH_VER_0200 << 16 ) | ROME_SOC_ID_11 ),
283    ROME_VER_3_0 = ((ROME_PATCH_VER_0300 << 16 ) | ROME_SOC_ID_22 ),
284    ROME_VER_3_2 = ((ROME_PATCH_VER_0302 << 16 ) | ROME_SOC_ID_44 )
285};
286#endif /* HW_ROME_H */
287