blob: 98452d800d4b02005fd9dff9b886e917c4128f64 [file] [log] [blame]
Satish kumar sugasi644b4882016-05-04 20:15:31 -07001/*
2Copyright (c) 2015, The Linux Foundation. All rights reserved.
3
4Redistribution and use in source and binary forms, with or without
5modification, are permitted provided that the following conditions are
6met:
7 * Redistributions of source code must retain the above copyright
8 notice, this list of conditions and the following disclaimer.
9 * Redistributions in binary form must reproduce the above
10 copyright notice, this list of conditions and the following
11 disclaimer in the documentation and/or other materials provided
12 with the distribution.
13 * Neither the name of The Linux Foundation nor the names of its
14 contributors may be used to endorse or promote products derived
15 from this software without specific prior written permission.
16
17THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
18WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
19MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
20ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
21BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
24BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
25WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
26OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
27IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28*/
29
30#ifndef __UAPI_RADIO_HCI_CORE_H
31#define __UAPI_RADIO_HCI_CORE_H
32
33#pragma pack(1)
34
35#include <stdbool.h>
36
37pthread_mutex_t fm_hal;
38#define MIN_TX_TONE_VAL 0x00
39#define MAX_TX_TONE_VAL 0x07
40#define MIN_HARD_MUTE_VAL 0x00
41#define MAX_HARD_MUTE_VAL 0x03
42#define MIN_SRCH_MODE 0x00
43#define MAX_SRCH_MODE 0x09
44#define MIN_SCAN_DWELL 0x00
45#define MAX_SCAN_DWELL 0x0F
46#define MIN_SIG_TH 0x00
47#define MAX_SIG_TH 0x03
48#define MIN_PTY 0X00
49#define MAX_PTY 0x1F
50#define MIN_PI 0x0000
51#define MAX_PI 0xFFFF
52#define MIN_SRCH_STATIONS_CNT 0x00
53#define MAX_SRCH_STATIONS_CNT 0x14
54#define MIN_CHAN_SPACING 0x00
55#define MAX_CHAN_SPACING 0x02
56#define MIN_EMPHASIS 0x00
57#define MAX_EMPHASIS 0x01
58#define MIN_RDS_STD 0x00
59#define MAX_RDS_STD 0x02
60#define MIN_ANTENNA_VAL 0x00
61#define MAX_ANTENNA_VAL 0x01
62#define MIN_TX_PS_REPEAT_CNT 0x01
63#define MAX_TX_PS_REPEAT_CNT 0x0F
64#define MIN_SOFT_MUTE 0x00
65#define MAX_SOFT_MUTE 0x01
66#define MIN_PEEK_ACCESS_LEN 0x01
67#define MAX_PEEK_ACCESS_LEN 0xF9
68#define MIN_RESET_CNTR 0x00
69#define MAX_RESET_CNTR 0x01
70#define MIN_HLSI 0x00
71#define MAX_HLSI 0x02
72#define MIN_NOTCH_FILTER 0x00
73#define MAX_NOTCH_FILTER 0x02
74#define MIN_INTF_DET_OUT_LW_TH 0x00
75#define MAX_INTF_DET_OUT_LW_TH 0xFF
76#define MIN_INTF_DET_OUT_HG_TH 0x00
77#define MAX_INTF_DET_OUT_HG_TH 0xFF
78#define MIN_SINR_TH -128
79#define MAX_SINR_TH 127
80#define MIN_SINR_SAMPLES 0x01
81#define MAX_SINR_SAMPLES 0xFF
82#define MIN_BLEND_HI -128
83#define MAX_BLEND_HI 127
84
85
86/* ---- HCI Packet structures ---- */
87#define RADIO_HCI_COMMAND_HDR_SIZE sizeof(struct radio_hci_command_hdr)
88#define RADIO_HCI_EVENT_HDR_SIZE sizeof(struct radio_hci_event_hdr)
89
90/* HCI data types */
91#define RADIO_HCI_COMMAND_PKT 0x11
92#define RADIO_HCI_EVENT_PKT 0x14
93/*HCI reponce packets*/
94#define MAX_RIVA_PEEK_RSP_SIZE 251
95/* default data access */
96#define DEFAULT_DATA_OFFSET 2
97#define DEFAULT_DATA_SIZE 249
98/* Power levels are 0-7, but SOC will expect values from 0-255
99 * So the each level step size will be 255/7 = 36 */
100#define FM_TX_PWR_LVL_STEP_SIZE 36
101#define FM_TX_PWR_LVL_0 0 /* Lowest power lvl that can be set for Tx */
102#define FM_TX_PWR_LVL_MAX 7 /* Max power lvl for Tx */
103#define FM_TX_PHY_CFG_MODE 0x3c
104#define FM_TX_PHY_CFG_LEN 0x10
105#define FM_TX_PWR_GAIN_OFFSET 14
106/**RDS CONFIG MODE**/
107#define FM_RDS_CNFG_MODE 0x0f
108#define FM_RDS_CNFG_LEN 0x10
109#define AF_RMSSI_TH_LSB_OFFSET 10
110#define AF_RMSSI_TH_MSB_OFFSET 11
111#define AF_RMSSI_SAMPLES_OFFSET 15
112/**RX CONFIG MODE**/
113#define FM_RX_CONFG_MODE 0x15
114#define FM_RX_CNFG_LEN 0x20
115#define GD_CH_RMSSI_TH_OFFSET 12
116#define MAX_GD_CH_RMSSI_TH 127
117#define SRCH_ALGO_TYPE_OFFSET 25
118#define SINRFIRSTSTAGE_OFFSET 26
119#define RMSSIFIRSTSTAGE_OFFSET 27
120#define CF0TH12_BYTE1_OFFSET 8
121#define CF0TH12_BYTE2_OFFSET 9
122#define CF0TH12_BYTE3_OFFSET 10
123#define CF0TH12_BYTE4_OFFSET 11
124#define MAX_SINR_FIRSTSTAGE 127
125#define MAX_RMSSI_FIRSTSTAGE 127
126#define RDS_PS0_XFR_MODE 0x01
127#define RDS_PS0_LEN 6
128#define RX_REPEATE_BYTE_OFFSET 5
129#define FM_SPUR_TBL_SIZE 240
130#define SPUR_DATA_LEN 16
131#define ENTRIES_EACH_CMD 15
132#define SPUR_DATA_INDEX 2
133#define FM_AF_LIST_MAX_SIZE 200
134#define AF_LIST_MAX (FM_AF_LIST_MAX_SIZE / 4) /* Each AF frequency consist
135 of sizeof(int) bytes */
136#define MAX_BLEND_INDEX 49
137/* HCI timeouts */
138#define RADIO_HCI_TIMEOUT (10000) /* 10 seconds */
139
140typedef enum {
141 ASSOCIATE_JVM,
142 DISASSOCIATE_JVM
143} bt_cb_thread_evt;
144
145#define TUNE_PARAM 16
146#define SIZE_ARRAY(x) (sizeof(x) / sizeof((x)[0]))
147typedef void (*enb_result_cb)();
148typedef void (*tune_rsp_cb)(int Freq);
149typedef void (*seek_rsp_cb)(int Freq);
150typedef void (*scan_rsp_cb)();
151typedef void (*srch_list_rsp_cb)(uint16_t *scan_tbl);
152typedef void (*stereo_mode_cb)(bool status);
153typedef void (*rds_avl_sts_cb)(bool status);
154typedef void (*af_list_cb)(uint16_t *af_list);
155typedef void (*rt_cb)(char *rt);
156typedef void (*ps_cb)(char *ps);
157typedef void (*oda_cb)();
158typedef void (*rt_plus_cb)(char *rt_plus);
159typedef void (*ert_cb)(char *ert);
160typedef void (*disable_cb)();
161typedef void (*callback_thread_event)(unsigned int evt);
Satish kumar sugasi84e51de2015-09-30 18:27:43 -0700162typedef void (*rds_grp_cntrs_cb)(char *rds_params);
Satish kumar sugasi88832b92015-12-21 18:52:29 -0800163typedef void (*fm_peek_cb)(char *peek_rsp);
164typedef void (*fm_ssbi_peek_cb)(char *ssbi_peek_rsp);
165typedef void (*fm_ch_det_th_cb)(char *ch_det_rsp);
Satish kumar sugasid8731b72016-01-27 14:45:45 -0800166typedef void (*fm_ecc_evt_cb)(char *ecc_rsp);
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700167
168typedef struct {
169 size_t size;
170
171 enb_result_cb enabled_cb;
172 tune_rsp_cb tune_cb;
173 seek_rsp_cb seek_cmpl_cb;
174 scan_rsp_cb scan_next_cb;
175 srch_list_rsp_cb srch_list_cb;
176 stereo_mode_cb stereo_status_cb;
177 rds_avl_sts_cb rds_avail_status_cb;
178 af_list_cb af_list_update_cb;
179 rt_cb rt_update_cb;
180 ps_cb ps_update_cb;
181 oda_cb oda_update_cb;
182 rt_plus_cb rt_plus_update_cb;
183 ert_cb ert_update_cb;
184 disable_cb disabled_cb;
Satish kumar sugasi84e51de2015-09-30 18:27:43 -0700185 rds_grp_cntrs_cb rds_grp_cntrs_rsp_cb;
Satish kumar sugasi88832b92015-12-21 18:52:29 -0800186 fm_peek_cb fm_peek_rsp_cb;
187 fm_ssbi_peek_cb fm_ssbi_peek_rsp_cb;
188 fm_ch_det_th_cb fm_ch_det_th_rsp_cb;
Satish kumar sugasid8731b72016-01-27 14:45:45 -0800189 fm_ecc_evt_cb ext_country_code_cb;
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700190 callback_thread_event thread_evt_cb;
191} fm_vendor_callbacks_t;
192
193pthread_mutex_t radio_fm_cmd;
194typedef struct {
195 int (*init)(const fm_vendor_callbacks_t *p_cb);
196 int (*set_fm_ctrl)(int opcode, int val);
197 void (*Get_fm_ctrl) (int opcode, int val);
198} fm_interface_t;
199
200typedef int (*fm_evt_notify_cb)(unsigned char *p_buf);
201
202typedef struct {
203 fm_evt_notify_cb fm_evt_notify;
204} fm_hal_cb;
205
206struct radio_hci_command_hdr {
207 short opcode; /* OCF & OGF */
208 char plen;
209} ;
210
211struct radio_hci_event_hdr {
212 char evt;
213 char plen;
214} ;
215
216struct radio_hci_dev {
217 char name[8];
218 unsigned long flags;
219 short id;
220 char bus;
221 char dev_type;
222 char dev_name[248];
223 char dev_class[3];
224 char features[8];
225 char commands[64];
226 unsigned int data_block_len;
227 unsigned long cmd_last_tx;
228 int req_status;
229 int req_result;
230};
231
232/* Opcode OCF */
233/* HCI recv control commands opcode */
234#define HCI_OCF_FM_ENABLE_RECV_REQ 0x0001
235#define HCI_OCF_FM_DISABLE_RECV_REQ 0x0002
236#define HCI_OCF_FM_GET_RECV_CONF_REQ 0x0003
237#define HCI_OCF_FM_SET_RECV_CONF_REQ 0x0004
238#define HCI_OCF_FM_SET_MUTE_MODE_REQ 0x0005
239#define HCI_OCF_FM_SET_STEREO_MODE_REQ 0x0006
240#define HCI_OCF_FM_SET_ANTENNA 0x0007
241#define HCI_OCF_FM_SET_SIGNAL_THRESHOLD 0x0008
242#define HCI_OCF_FM_GET_SIGNAL_THRESHOLD 0x0009
243#define HCI_OCF_FM_GET_STATION_PARAM_REQ 0x000A
244#define HCI_OCF_FM_GET_PROGRAM_SERVICE_REQ 0x000B
245#define HCI_OCF_FM_GET_RADIO_TEXT_REQ 0x000C
246#define HCI_OCF_FM_GET_AF_LIST_REQ 0x000D
247#define HCI_OCF_FM_SEARCH_STATIONS 0x000E
248#define HCI_OCF_FM_SEARCH_RDS_STATIONS 0x000F
249#define HCI_OCF_FM_SEARCH_STATIONS_LIST 0x0010
250#define HCI_OCF_FM_CANCEL_SEARCH 0x0011
251#define HCI_OCF_FM_RDS_GRP 0x0012
252#define HCI_OCF_FM_RDS_GRP_PROCESS 0x0013
253#define HCI_OCF_FM_EN_WAN_AVD_CTRL 0x0014
254#define HCI_OCF_FM_EN_NOTCH_CTRL 0x0015
255#define HCI_OCF_FM_SET_EVENT_MASK 0x0016
256#define HCI_OCF_FM_SET_CH_DET_THRESHOLD 0x0017
257#define HCI_OCF_FM_GET_CH_DET_THRESHOLD 0x0018
258#define HCI_OCF_FM_SET_BLND_TBL 0x001B
259#define HCI_OCF_FM_GET_BLND_TBL 0x001C
260/* HCI trans control commans opcode*/
261#define HCI_OCF_FM_ENABLE_TRANS_REQ 0x0001
262#define HCI_OCF_FM_DISABLE_TRANS_REQ 0x0002
263#define HCI_OCF_FM_GET_TRANS_CONF_REQ 0x0003
264#define HCI_OCF_FM_SET_TRANS_CONF_REQ 0x0004
265#define HCI_OCF_FM_RDS_RT_REQ 0x0008
266#define HCI_OCF_FM_RDS_PS_REQ 0x0009
267
268
269/* HCI common control commands opcode */
270#define HCI_OCF_FM_TUNE_STATION_REQ 0x0001
271#define HCI_OCF_FM_DEFAULT_DATA_READ 0x0002
272#define HCI_OCF_FM_DEFAULT_DATA_WRITE 0x0003
273#define HCI_OCF_FM_RESET 0x0004
274#define HCI_OCF_FM_GET_FEATURE_LIST 0x0005
275#define HCI_OCF_FM_DO_CALIBRATION 0x0006
276#define HCI_OCF_FM_SET_CALIBRATION 0x0007
277#define HCI_OCF_FM_SET_SPUR_TABLE 0x0008
278#define HCI_OCF_FM_GET_SPUR_TABLE 0x0009
279
280/*HCI Status parameters commands*/
281#define HCI_OCF_FM_READ_GRP_COUNTERS 0x0001
282
283/*HCI Diagnostic commands*/
284#define HCI_OCF_FM_PEEK_DATA 0x0002
285#define HCI_OCF_FM_POKE_DATA 0x0003
286#define HCI_OCF_FM_SSBI_PEEK_REG 0x0004
287#define HCI_OCF_FM_SSBI_POKE_REG 0x0005
288#define HCI_OCF_FM_STATION_DBG_PARAM 0x0007
289#define HCI_FM_SET_INTERNAL_TONE_GENRATOR 0x0008
290
291/* Opcode OGF */
292#define HCI_OGF_FM_RECV_CTRL_CMD_REQ 0x0013
293#define HCI_OGF_FM_TRANS_CTRL_CMD_REQ 0x0014
294#define HCI_OGF_FM_COMMON_CTRL_CMD_REQ 0x0015
295#define HCI_OGF_FM_STATUS_PARAMETERS_CMD_REQ 0x0016
296#define HCI_OGF_FM_TEST_CMD_REQ 0x0017
297#define HCI_OGF_FM_DIAGNOSTIC_CMD_REQ 0x003F
298
299/* Command opcode pack/unpack */
300#define hci_opcode_pack(ogf, ocf) (short) ((ocf & 0x03ff)|(ogf << 10))
301#define hci_opcode_ogf(op) (op >> 10)
302#define hci_opcode_ocf(op) (op & 0x03ff)
303#define hci_recv_ctrl_cmd_op_pack(ocf) \
304 (short) hci_opcode_pack(HCI_OGF_FM_RECV_CTRL_CMD_REQ, ocf)
305#define hci_trans_ctrl_cmd_op_pack(ocf) \
306 (short) hci_opcode_pack(HCI_OGF_FM_TRANS_CTRL_CMD_REQ, ocf)
307#define hci_common_cmd_op_pack(ocf) \
308 (short) hci_opcode_pack(HCI_OGF_FM_COMMON_CTRL_CMD_REQ, ocf)
309#define hci_status_param_op_pack(ocf) \
310 (short) hci_opcode_pack(HCI_OGF_FM_STATUS_PARAMETERS_CMD_REQ, ocf)
311#define hci_diagnostic_cmd_op_pack(ocf) \
312 (short) hci_opcode_pack(HCI_OGF_FM_DIAGNOSTIC_CMD_REQ, ocf)
313
314
315/* HCI commands with no arguments*/
316#define HCI_FM_ENABLE_RECV_CMD 1
317#define HCI_FM_DISABLE_RECV_CMD 2
318#define HCI_FM_GET_RECV_CONF_CMD 3
319#define HCI_FM_GET_STATION_PARAM_CMD 4
320#define HCI_FM_GET_SIGNAL_TH_CMD 5
321#define HCI_FM_GET_PROGRAM_SERVICE_CMD 6
322#define HCI_FM_GET_RADIO_TEXT_CMD 7
323#define HCI_FM_GET_AF_LIST_CMD 8
324#define HCI_FM_CANCEL_SEARCH_CMD 9
325#define HCI_FM_RESET_CMD 10
326#define HCI_FM_GET_FEATURES_CMD 11
327#define HCI_FM_STATION_DBG_PARAM_CMD 12
328#define HCI_FM_ENABLE_TRANS_CMD 13
329#define HCI_FM_DISABLE_TRANS_CMD 14
330#define HCI_FM_GET_TX_CONFIG 15
331#define HCI_FM_GET_DET_CH_TH_CMD 16
332#define HCI_FM_GET_BLND_TBL_CMD 17
333
334/* Defines for FM TX*/
335#define TX_PS_DATA_LENGTH 108
336#define TX_RT_DATA_LENGTH 64
337#define PS_STRING_LEN 9
338
339/* ----- HCI Command request ----- */
340struct hci_fm_recv_conf_req {
341 char emphasis;
342 char ch_spacing;
343 char rds_std;
344 char hlsi;
345 int band_low_limit;
346 int band_high_limit;
347} ;
348
349/* ----- HCI Command request ----- */
350struct hci_fm_trans_conf_req_struct {
351 char emphasis;
352 char rds_std;
353 int band_low_limit;
354 int band_high_limit;
355} ;
356
357
358/* ----- HCI Command request ----- */
359struct hci_fm_tx_ps {
360 char ps_control;
361 short pi;
362 char pty;
363 char ps_repeatcount;
364 char ps_num;
365 char ps_data[TX_PS_DATA_LENGTH];
366} ;
367
368struct hci_fm_tx_rt {
369 char rt_control;
370 short pi;
371 char pty;
372 char rt_len;
373 char rt_data[TX_RT_DATA_LENGTH];
374} ;
375
376struct hci_fm_mute_mode_req {
377 char hard_mute;
378 char soft_mute;
379} ;
380
381struct hci_fm_stereo_mode_req {
382 char stereo_mode;
383 char sig_blend;
384 char intf_blend;
385 char most_switch;
386} ;
387
388struct hci_fm_search_station_req {
389 char srch_mode;
390 char scan_time;
391 char srch_dir;
392} ;
393
394struct hci_fm_search_rds_station_req {
395 struct hci_fm_search_station_req srch_station;
396 char srch_pty;
397 short srch_pi;
398} ;
399
Satish kumar sugasi84e51de2015-09-30 18:27:43 -0700400struct hci_fm_rds_grp_cntrs_params {
401 int totalRdsSBlockErrors;
402 int totalRdsGroups;
403 int totalRdsGroup0;
404 int totalRdsGroup2;
405 int totalRdsBlockB;
406 int totalRdsProcessedGroup0;
407 int totalRdsProcessedGroup2;
408 int totalRdsGroupFiltered;
409 int totalRdsChangeFiltered;
410} ;
411
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700412struct hci_fm_search_station_list_req {
413 char srch_list_mode;
414 char srch_list_dir;
415 int srch_list_max;
416 char srch_pty;
417} ;
418
419struct hci_fm_rds_grp_req {
420 int rds_grp_enable_mask;
421 int rds_buf_size;
422 char en_rds_change_filter;
423} ;
424
425struct hci_fm_en_avd_ctrl_req {
426 char no_freqs;
427 char freq_index;
428 char lo_shft;
429 short freq_min;
430 short freq_max;
431} ;
432
433struct hci_fm_def_data_rd_req {
434 char mode;
435 char length;
436 char param_len;
437 char param;
438} ;
439
440struct hci_fm_def_data_wr_req {
441 char mode;
442 char length;
443 char data[DEFAULT_DATA_SIZE];
444} ;
445
446struct hci_fm_riva_data {
447 char subopcode;
448 int start_addr;
449 char length;
450} ;
451
452struct hci_fm_riva_poke {
453 struct hci_fm_riva_data cmd_params;
454 char data[MAX_RIVA_PEEK_RSP_SIZE];
455} ;
456
457struct hci_fm_ssbi_req {
458 short start_addr;
459 char data;
460} ;
461struct hci_fm_ssbi_peek {
462 short start_address;
463} ;
464
465struct hci_fm_ch_det_threshold {
466 char sinr;
467 char sinr_samples;
468 char low_th;
469 char high_th;
470
471} ;
472
473struct hci_fm_blend_table {
474 char ucBlendType;
475 char ucBlendRampRateUp;
476 char ucBlendDebounceNumSampleUp;
477 char ucBlendDebounceIdxUp;
478 char ucBlendSinrIdxSkipStep;
479 char scBlendSinrHi;
480 char scBlendRmssiHi;
481 char ucBlendIndexHi;
482 char ucBlendIndex[MAX_BLEND_INDEX];
483} ;
484
485/*HCI events*/
486#define HCI_EV_TUNE_STATUS 0x01
487#define HCI_EV_RDS_LOCK_STATUS 0x02
488#define HCI_EV_STEREO_STATUS 0x03
489#define HCI_EV_SERVICE_AVAILABLE 0x04
490#define HCI_EV_SEARCH_PROGRESS 0x05
491#define HCI_EV_SEARCH_RDS_PROGRESS 0x06
492#define HCI_EV_SEARCH_LIST_PROGRESS 0x07
493#define HCI_EV_RDS_RX_DATA 0x08
494#define HCI_EV_PROGRAM_SERVICE 0x09
495#define HCI_EV_RADIO_TEXT 0x0A
496#define HCI_EV_FM_AF_LIST 0x0B
497#define HCI_EV_TX_RDS_GRP_AVBLE 0x0C
498#define HCI_EV_TX_RDS_GRP_COMPL 0x0D
499#define HCI_EV_TX_RDS_CONT_GRP_COMPL 0x0E
500#define HCI_EV_CMD_COMPLETE 0x0F
501#define HCI_EV_CMD_STATUS 0x10
502#define HCI_EV_TUNE_COMPLETE 0x11
503#define HCI_EV_SEARCH_COMPLETE 0x12
504#define HCI_EV_SEARCH_RDS_COMPLETE 0x13
505#define HCI_EV_SEARCH_LIST_COMPLETE 0x14
Satish kumar sugasid8731b72016-01-27 14:45:45 -0800506
507#define HCI_EV_EXT_COUNTRY_CODE 0x17
Satish kumar sugasib0ba3c82016-05-04 20:18:23 -0700508#define HCI_EV_RADIO_TEXT_PLUS_ID 0x18
509#define HCI_EV_RADIO_TEXT_PLUS_TAG 0x19
Satish kumar sugasi8a34ad32015-10-19 18:09:49 -0700510#define HCI_EV_HW_ERR_EVENT 0x1A
511
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700512#define HCI_REQ_DONE 0
513#define HCI_REQ_PEND 1
514#define HCI_REQ_CANCELED 2
515#define HCI_REQ_STATUS 3
516
517#define MAX_RAW_RDS_GRPS 21
518
519#define RDSGRP_DATA_OFFSET 0x1
520
521/*RT PLUS*/
522#define DUMMY_CLASS 0
523#define RT_PLUS_LEN_1_TAG 3
524#define RT_ERT_FLAG_BIT 5
525
526/*TAG1*/
527#define TAG1_MSB_OFFSET 3
528#define TAG1_MSB_MASK 7
529#define TAG1_LSB_OFFSET 5
530#define TAG1_POS_MSB_MASK 31
531#define TAG1_POS_MSB_OFFSET 1
532#define TAG1_POS_LSB_OFFSET 7
533#define TAG1_LEN_OFFSET 1
534#define TAG1_LEN_MASK 63
535
536/*TAG2*/
537#define TAG2_MSB_OFFSET 5
538#define TAG2_MSB_MASK 1
539#define TAG2_LSB_OFFSET 3
540#define TAG2_POS_MSB_MASK 7
541#define TAG2_POS_MSB_OFFSET 3
542#define TAG2_POS_LSB_OFFSET 5
543#define TAG2_LEN_MASK 31
544
545#define AGT_MASK 31
546/*Extract 5 left most bits of lsb of 2nd block*/
547#define AGT(x) (x & AGT_MASK)
548/*16 bits of 4th block*/
549#define AID(lsb, msb) ((msb << 8) | (lsb))
550/*Extract 5 right most bits of msb of 2nd block*/
551#define GTC(blk2msb) (blk2msb >> 3)
552
553#define GRP_3A 0x6
554#define RT_PLUS_AID 0x4bd7
555
556/*ERT*/
557#define ERT_AID 0x6552
558#define CARRIAGE_RETURN 0x000D
559#define MAX_ERT_SEGMENT 31
560#define ERT_FORMAT_DIR_BIT 1
561
562#define EXTRACT_BIT(data, bit_pos) ((data & (1 << bit_pos)) >> bit_pos)
563
564struct hci_ev_tune_status {
565 char sub_event;
566 int station_freq;
567 char serv_avble;
568 char rssi;
569 char stereo_prg;
570 char rds_sync_status;
571 char mute_mode;
572 char sinr;
573 char intf_det_th;
574} ;
575
576struct rds_blk_data {
577 char rdsMsb;
578 char rdsLsb;
579 char blockStatus;
580} ;
581
582struct rds_grp_data {
583 struct rds_blk_data rdsBlk[4];
584} ;
585
586struct hci_ev_rds_rx_data {
587 char num_rds_grps;
588 struct rds_grp_data rds_grp_data[MAX_RAW_RDS_GRPS];
589} ;
590
591struct hci_ev_prg_service {
592 short pi_prg_id;
593 char pty_prg_type;
594 char ta_prg_code_type;
595 char ta_ann_code_flag;
596 char ms_switch_code_flag;
597 char dec_id_ctrl_code_flag;
598 char ps_num;
599 char prg_service_name[119];
600} ;
601
602struct hci_ev_radio_text {
603 short pi_prg_id;
604 char pty_prg_type;
605 char ta_prg_code_type;
606 char txt_ab_flag;
607 char radio_txt[64];
608} ;
609
610struct hci_ev_af_list {
611 int tune_freq;
612 short pi_code;
613 char af_size;
614 char af_list[FM_AF_LIST_MAX_SIZE];
615} ;
616
617struct hci_ev_cmd_complete {
618 char num_hci_cmd_pkts;
619 short cmd_opcode;
620} ;
621
622struct hci_ev_cmd_status {
623 char status;
624 char num_hci_cmd_pkts;
625 short status_opcode;
626} ;
627
628struct hci_ev_srch_st {
629 int station_freq;
630 char rds_cap;
631 char pty;
632 short status_opcode;
633} ;
634
635struct hci_ev_rel_freq {
636 char rel_freq_msb;
637 char rel_freq_lsb;
638
639} ;
640struct hci_ev_srch_list_compl {
641 char num_stations_found;
642 struct hci_ev_rel_freq rel_freq[20];
643} ;
644
645/* ----- HCI Event Response ----- */
646struct hci_fm_conf_rsp {
647 char status;
648 struct hci_fm_recv_conf_req recv_conf_rsp;
649} ;
650
Satish kumar sugasi84e51de2015-09-30 18:27:43 -0700651struct hci_fm_rds_grp_cntrs_rsp {
652 char status;
653 struct hci_fm_rds_grp_cntrs_params recv_rds_grp_cntrs_rsp;
654} ;
655
656
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700657struct hci_fm_get_trans_conf_rsp {
658 char status;
659 struct hci_fm_trans_conf_req_struct trans_conf_rsp;
660} ;
661struct hci_fm_sig_threshold_rsp {
662 char status;
663 char sig_threshold;
664} ;
665
666struct hci_fm_station_rsp {
667 struct hci_ev_tune_status station_rsp;
668} ;
669
670struct hci_fm_prgm_srv_rsp {
671 char status;
672 struct hci_ev_prg_service prg_srv;
673} ;
674
675struct hci_fm_radio_txt_rsp {
676 char status;
677 struct hci_ev_radio_text rd_txt;
678} ;
679
680struct hci_fm_af_list_rsp {
681 char status;
682 struct hci_ev_af_list rd_txt;
683} ;
684
685struct hci_fm_data_rd_rsp {
686 char status;
687 char ret_data_len;
688 char data[DEFAULT_DATA_SIZE];
689} ;
690
691struct hci_fm_feature_list_rsp {
692 char status;
693 char feature_mask;
694} ;
695
696struct hci_fm_dbg_param_rsp {
697 char status;
698 char blend;
699 char soft_mute;
700 char inf_blend;
701 char inf_soft_mute;
702 char pilot_pil;
703 char io_verc;
704 char in_det_out;
705} ;
706
707#define CLKSPURID_INDEX0 0
708#define CLKSPURID_INDEX1 5
709#define CLKSPURID_INDEX2 10
710#define CLKSPURID_INDEX3 15
711#define CLKSPURID_INDEX4 20
712#define CLKSPURID_INDEX5 25
713
714#define MAX_SPUR_FREQ_LIMIT 30
715#define CKK_SPUR 0x3B
716#define SPUR_DATA_SIZE 0x4
717#define SPUR_ENTRIES_PER_ID 0x5
718
719#define COMPUTE_SPUR(val) ((((val) - (76000)) / (50)))
720#define GET_FREQ(val, bit) ((bit == 1) ? ((val) >> 8) : ((val) & 0xFF))
721#define GET_SPUR_ENTRY_LEVEL(val) ((val) / (5))
722
723struct hci_fm_spur_data {
724 int freq[MAX_SPUR_FREQ_LIMIT];
725 char rmssi[MAX_SPUR_FREQ_LIMIT];
726 char enable[MAX_SPUR_FREQ_LIMIT];
727} ;
728
729
730/* HCI dev events */
731#define RADIO_HCI_DEV_REG 1
732#define RADIO_HCI_DEV_WRITE 2
733
734#define hci_req_lock(d) mutex_lock(&d->req_lock)
735#define hci_req_unlock(d) mutex_unlock(&d->req_lock)
736
737/* FM RDS */
738#define RDS_PTYPE 2
739#define RDS_PID_LOWER 1
740#define RDS_PID_HIGHER 0
741#define RDS_OFFSET 5
742#define RDS_PS_LENGTH_OFFSET 7
743#define RDS_STRING 8
744#define RDS_PS_DATA_OFFSET 8
745#define RDS_CONFIG_OFFSET 3
746#define RDS_AF_JUMP_OFFSET 4
747#define PI_CODE_OFFSET 4
748#define AF_SIZE_OFFSET 6
749#define AF_LIST_OFFSET 7
750#define RT_A_B_FLAG_OFFSET 4
751/*FM states*/
752
753enum radio_state_t {
754 FM_OFF,
755 FM_RECV,
756 FM_TRANS,
757 FM_RESET,
758 FM_CALIB,
759 FM_TURNING_OFF,
760 FM_RECV_TURNING_ON,
761 FM_TRANS_TURNING_ON,
762 FM_MAX_NO_STATES,
763};
764
765enum emphasis_type {
766 FM_RX_EMP75 = 0x0,
767 FM_RX_EMP50 = 0x1
768};
769
770enum channel_space_type {
771 FM_RX_SPACE_200KHZ = 0x0,
772 FM_RX_SPACE_100KHZ = 0x1,
773 FM_RX_SPACE_50KHZ = 0x2
774};
775
776enum high_low_injection {
777 AUTO_HI_LO_INJECTION = 0x0,
778 LOW_SIDE_INJECTION = 0x1,
779 HIGH_SIDE_INJECTION = 0x2
780};
781
782enum fm_rds_type {
783 FM_RX_RDBS_SYSTEM = 0x0,
784 FM_RX_RDS_SYSTEM = 0x1
785};
786
787enum hlm_region_t {
788 HELIUM_REGION_US,
789 HELIUM_REGION_EU,
790 HELIUM_REGION_JAPAN,
791 HELIUM_REGION_JAPAN_WIDE,
792 HELIUM_REGION_OTHER
793};
794
795/* Search options */
796enum search_t {
797 SEEK,
798 SCAN,
799 SCAN_FOR_STRONG,
800 SCAN_FOR_WEAK,
801 RDS_SEEK_PTY,
802 RDS_SCAN_PTY,
803 RDS_SEEK_PI,
804 RDS_AF_JUMP,
805};
806
807enum spur_entry_levels {
808 ENTRY_0,
809 ENTRY_1,
810 ENTRY_2,
811 ENTRY_3,
812 ENTRY_4,
813 ENTRY_5,
814};
815
816/* Band limits */
817#define REGION_US_EU_BAND_LOW 87500
818#define REGION_US_EU_BAND_HIGH 108000
819#define REGION_JAPAN_STANDARD_BAND_LOW 76000
820#define REGION_JAPAN_STANDARD_BAND_HIGH 90000
821#define REGION_JAPAN_WIDE_BAND_LOW 90000
822#define REGION_JAPAN_WIDE_BAND_HIGH 108000
823
824#define SRCH_MODE 0x07
825#define SRCH_DIR 0x08 /* 0-up 1-down */
826#define SCAN_DWELL 0x70
827#define SRCH_ON 0x80
828
829/* I/O Control */
830#define IOC_HRD_MUTE 0x03
831#define IOC_SFT_MUTE 0x01
832#define IOC_MON_STR 0x01
833#define IOC_SIG_BLND 0x01
834#define IOC_INTF_BLND 0x01
835#define IOC_ANTENNA 0x01
836
837/* RDS Control */
838#define RDS_ON 0x01
839#define RDS_BUF_SZ 100
840
841/* constants */
842#define RDS_BLOCKS_NUM (4)
843#define BYTES_PER_BLOCK (3)
844#define MAX_PS_LENGTH (108)
845#define MAX_RT_LENGTH (64)
846#define RDS_GRP_CNTR_LEN (36)
847#define RX_RT_DATA_LENGTH (63)
848/* Search direction */
849#define SRCH_DIR_UP (0)
850#define SRCH_DIR_DOWN (1)
851
852/*Search RDS stations*/
853#define SEARCH_RDS_STNS_MODE_OFFSET 4
854
855/*Search Station list */
856#define PARAMS_PER_STATION 0x08
857#define STN_NUM_OFFSET 0x01
858#define STN_FREQ_OFFSET 0x02
859#define KHZ_TO_MHZ 1000
860#define GET_MSB(x)((x >> 8) & 0xFF)
861#define GET_LSB(x)((x) & 0xFF)
862
863/* control options */
864#define CTRL_ON (1)
865#define CTRL_OFF (0)
866
867/*Diagnostic commands*/
868
869#define RIVA_PEEK_OPCODE 0x0D
870#define RIVA_POKE_OPCODE 0x0C
871
872#define PEEK_DATA_OFSET 0x1
873#define RIVA_PEEK_PARAM 0x6
874#define RIVA_PEEK_LEN_OFSET 0x6
875#define SSBI_PEEK_LEN 0x01
876/*Calibration data*/
877#define PROCS_CALIB_MODE 1
878#define PROCS_CALIB_SIZE 23
879#define DC_CALIB_MODE 2
880#define DC_CALIB_SIZE 48
881#define RSB_CALIB_MODE 3
882#define RSB_CALIB_SIZE 4
883#define CALIB_DATA_OFSET 2
884#define CALIB_MODE_OFSET 1
885#define MAX_CALIB_SIZE 75
886
887/* Channel validity */
888#define INVALID_CHANNEL (0)
889#define VALID_CHANNEL (1)
890
891struct hci_fm_set_cal_req_proc {
892 char mode;
893 /*Max process calibration data size*/
894 char data[PROCS_CALIB_SIZE];
895} ;
896
897struct hci_fm_set_cal_req_dc {
898 char mode;
899 /*Max DC calibration data size*/
900 char data[DC_CALIB_SIZE];
901} ;
902
903struct hci_cc_do_calibration_rsp {
904 char status;
905 char mode;
906 char data[MAX_CALIB_SIZE];
907} ;
908
909struct hci_fm_set_spur_table_req {
910 char mode;
911 char no_of_freqs_entries;
912 char spur_data[FM_SPUR_TBL_SIZE];
913} ;
914/* Low Power mode*/
915#define SIG_LEVEL_INTR (1 << 0)
916#define RDS_SYNC_INTR (1 << 1)
917#define AUDIO_CTRL_INTR (1 << 2)
918#define AF_JUMP_ENABLE (1 << 4)
919
920int hci_def_data_read(struct hci_fm_def_data_rd_req *arg,
921 struct radio_hci_dev *hdev);
922int hci_def_data_write(struct hci_fm_def_data_wr_req *arg,
923 struct radio_hci_dev *hdev);
924int hci_fm_do_calibration(char *arg, struct radio_hci_dev *hdev);
925int hci_fm_do_calibration(char *arg, struct radio_hci_dev *hdev);
926
927static inline int is_valid_tone(int tone)
928{
929 if ((tone >= MIN_TX_TONE_VAL) &&
930 (tone <= MAX_TX_TONE_VAL))
931 return 1;
932 else
933 return 0;
934}
935
936static inline int is_valid_hard_mute(int hard_mute)
937{
938 if ((hard_mute >= MIN_HARD_MUTE_VAL) &&
939 (hard_mute <= MAX_HARD_MUTE_VAL))
940 return 1;
941 else
942 return 0;
943}
944
945static inline int is_valid_srch_mode(int srch_mode)
946{
947 if ((srch_mode >= MIN_SRCH_MODE) &&
948 (srch_mode <= MAX_SRCH_MODE))
949 return 1;
950 else
951 return 0;
952}
953
954static inline int is_valid_scan_dwell_prd(int scan_dwell_prd)
955{
956 if ((scan_dwell_prd >= MIN_SCAN_DWELL) &&
957 (scan_dwell_prd <= MAX_SCAN_DWELL))
958 return 1;
959 else
960 return 0;
961}
962
963static inline int is_valid_sig_th(int sig_th)
964{
965 if ((sig_th >= MIN_SIG_TH) &&
966 (sig_th <= MAX_SIG_TH))
967 return 1;
968 else
969 return 0;
970}
971
972static inline int is_valid_pty(int pty)
973{
974 if ((pty >= MIN_PTY) &&
975 (pty <= MAX_PTY))
976 return 1;
977 else
978 return 0;
979}
980
981static inline int is_valid_pi(int pi)
982{
983 if ((pi >= MIN_PI) &&
984 (pi <= MAX_PI))
985 return 1;
986 else
987 return 0;
988}
989
990static inline int is_valid_srch_station_cnt(int cnt)
991{
992 if ((cnt >= MIN_SRCH_STATIONS_CNT) &&
993 (cnt <= MAX_SRCH_STATIONS_CNT))
994 return 1;
995 else
996 return 0;
997}
998
999static inline int is_valid_chan_spacing(int spacing)
1000{
1001 if ((spacing >= MIN_CHAN_SPACING) &&
1002 (spacing <= MAX_CHAN_SPACING))
1003 return 1;
1004 else
1005 return 0;
1006}
1007
1008static inline int is_valid_emphasis(int emphasis)
1009{
1010 if ((emphasis >= MIN_EMPHASIS) &&
1011 (emphasis <= MAX_EMPHASIS))
1012 return 1;
1013 else
1014 return 0;
1015}
1016
1017static inline int is_valid_rds_std(int rds_std)
1018{
1019 if ((rds_std >= MIN_RDS_STD) &&
1020 (rds_std <= MAX_RDS_STD))
1021 return 1;
1022 else
1023 return 0;
1024}
1025
1026static inline int is_valid_antenna(int antenna_type)
1027{
1028 if ((antenna_type >= MIN_ANTENNA_VAL) &&
1029 (antenna_type <= MAX_ANTENNA_VAL))
1030 return 1;
1031 else
1032 return 0;
1033}
1034
1035static inline int is_valid_ps_repeat_cnt(int cnt)
1036{
1037 if ((cnt >= MIN_TX_PS_REPEAT_CNT) &&
1038 (cnt <= MAX_TX_PS_REPEAT_CNT))
1039 return 1;
1040 else
1041 return 0;
1042}
1043
1044static inline int is_valid_soft_mute(int soft_mute)
1045{
1046 if ((soft_mute >= MIN_SOFT_MUTE) &&
1047 (soft_mute <= MAX_SOFT_MUTE))
1048 return 1;
1049 else
1050 return 0;
1051}
1052
1053static inline int is_valid_peek_len(int len)
1054{
1055 if ((len >= MIN_PEEK_ACCESS_LEN) &&
1056 (len <= MAX_PEEK_ACCESS_LEN))
1057 return 1;
1058 else
1059 return 0;
1060}
1061
1062static inline int is_valid_reset_cntr(int cntr)
1063{
1064 if ((cntr >= MIN_RESET_CNTR) &&
1065 (cntr <= MAX_RESET_CNTR))
1066 return 1;
1067 else
1068 return 0;
1069}
1070
1071static inline int is_valid_hlsi(int hlsi)
1072{
1073 if ((hlsi >= MIN_HLSI) &&
1074 (hlsi <= MAX_HLSI))
1075 return 1;
1076 else
1077 return 0;
1078}
1079
1080static inline int is_valid_notch_filter(int filter)
1081{
1082 if ((filter >= MIN_NOTCH_FILTER) &&
1083 (filter <= MAX_NOTCH_FILTER))
1084 return 1;
1085 else
1086 return 0;
1087}
1088
1089static inline int is_valid_intf_det_low_th(int th)
1090{
1091 if ((th >= MIN_INTF_DET_OUT_LW_TH) &&
1092 (th <= MAX_INTF_DET_OUT_LW_TH))
1093 return 1;
1094 else
1095 return 0;
1096}
1097
1098static inline int is_valid_intf_det_hgh_th(int th)
1099{
1100 if ((th >= MIN_INTF_DET_OUT_HG_TH) &&
1101 (th <= MAX_INTF_DET_OUT_HG_TH))
1102 return 1;
1103 else
1104 return 0;
1105}
1106
1107static inline int is_valid_sinr_th(int th)
1108{
1109 if ((th >= MIN_SINR_TH) &&
1110 (th <= MAX_SINR_TH))
1111 return 1;
1112 else
1113 return 0;
1114}
1115
1116static inline int is_valid_sinr_samples(int samples_cnt)
1117{
1118 if ((samples_cnt >= MIN_SINR_SAMPLES) &&
1119 (samples_cnt <= MAX_SINR_SAMPLES))
1120 return 1;
1121 else
1122 return 0;
1123}
1124
1125static inline int is_valid_fm_state(int state)
1126{
1127 if ((state >= 0) && (state < FM_MAX_NO_STATES))
1128 return 1;
1129 else
1130 return 0;
1131}
1132
1133static inline int is_valid_blend_value(int val)
1134{
1135 if ((val >= MIN_BLEND_HI) && (val <= MAX_BLEND_HI))
1136 return 1;
1137 else
1138 return 0;
1139}
1140
1141struct helium_device {
1142 int tune_req;
1143 unsigned int mode;
1144 short pi;
1145 char pty;
1146 char ps_repeatcount;
1147 char prev_trans_rds;
1148 char af_jump_bit;
1149 struct hci_fm_mute_mode_req mute_mode;
1150 struct hci_fm_stereo_mode_req stereo_mode;
1151 struct hci_fm_station_rsp fm_st_rsp;
1152 struct hci_fm_search_station_req srch_st;
1153 struct hci_fm_search_rds_station_req srch_rds;
1154 struct hci_fm_search_station_list_req srch_st_list;
1155 struct hci_fm_recv_conf_req recv_conf;
1156 struct hci_fm_trans_conf_req_struct trans_conf;
1157 struct hci_fm_rds_grp_req rds_grp;
1158 unsigned char g_search_mode;
1159 unsigned char power_mode;
1160 int search_on;
1161 unsigned char spur_table_size;
1162 unsigned char g_scan_time;
1163 unsigned int g_antenna;
1164 unsigned int g_rds_grp_proc_ps;
1165 unsigned char event_mask;
1166 enum hlm_region_t region;
1167 struct hci_fm_dbg_param_rsp st_dbg_param;
1168 struct hci_ev_srch_list_compl srch_st_result;
Satish kumar sugasi88832b92015-12-21 18:52:29 -08001169 struct hci_fm_riva_poke riva_data_req;
1170 struct hci_fm_ssbi_req ssbi_data_accs;
1171 struct hci_fm_ssbi_peek ssbi_peek_reg;
1172 struct hci_fm_ch_det_threshold ch_det_threshold;
Satish kumar sugasi644b4882016-05-04 20:15:31 -07001173};
Satish kumar sugasi88832b92015-12-21 18:52:29 -08001174int hci_fm_disable_recv_req();
1175int helium_search_list(struct hci_fm_search_station_list_req *s_list);
1176int helium_search_rds_stations(struct hci_fm_search_rds_station_req *rds_srch);
1177int helium_search_stations(struct hci_fm_search_station_req *srch);
1178int helium_cancel_search_req();
1179int hci_fm_set_recv_conf_req (struct hci_fm_recv_conf_req *conf);
1180int hci_fm_get_program_service_req ();
1181int hci_fm_get_rds_grpcounters_req (int val);
1182int hci_fm_set_notch_filter_req (int val);
1183int helium_set_sig_threshold_req(char th);
1184int helium_rds_grp_mask_req(struct hci_fm_rds_grp_req *rds_grp_msk);
1185int helium_rds_grp_process_req(int rds_grp);
1186int helium_set_event_mask_req(char e_mask);
1187int helium_set_antenna_req(char ant);
1188int helium_set_fm_mute_mode_req(struct hci_fm_mute_mode_req *mute);
1189int hci_fm_tune_station_req(int param);
1190int hci_set_fm_stereo_mode_req(struct hci_fm_stereo_mode_req *param);
1191int hci_peek_data(struct hci_fm_riva_data *data);
1192int hci_poke_data(struct hci_fm_riva_poke *data);
1193int hci_ssbi_poke_reg(struct hci_fm_ssbi_req *data);
1194int hci_ssbi_peek_reg(struct hci_fm_ssbi_peek *data);
1195int hci_fm_get_ch_det_th();
1196int set_ch_det_thresholds_req(struct hci_fm_ch_det_threshold *ch_det_th);
1197
1198
Satish kumar sugasi644b4882016-05-04 20:15:31 -07001199#endif /* __UAPI_RADIO_HCI_CORE_H */