blob: 9952884024e40e3e2279e4aa97d81826f660e209 [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 sugasi644b4882016-05-04 20:15:31 -0700163
164typedef struct {
165 size_t size;
166
167 enb_result_cb enabled_cb;
168 tune_rsp_cb tune_cb;
169 seek_rsp_cb seek_cmpl_cb;
170 scan_rsp_cb scan_next_cb;
171 srch_list_rsp_cb srch_list_cb;
172 stereo_mode_cb stereo_status_cb;
173 rds_avl_sts_cb rds_avail_status_cb;
174 af_list_cb af_list_update_cb;
175 rt_cb rt_update_cb;
176 ps_cb ps_update_cb;
177 oda_cb oda_update_cb;
178 rt_plus_cb rt_plus_update_cb;
179 ert_cb ert_update_cb;
180 disable_cb disabled_cb;
Satish kumar sugasi84e51de2015-09-30 18:27:43 -0700181 rds_grp_cntrs_cb rds_grp_cntrs_rsp_cb;
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700182 callback_thread_event thread_evt_cb;
183} fm_vendor_callbacks_t;
184
185pthread_mutex_t radio_fm_cmd;
186typedef struct {
187 int (*init)(const fm_vendor_callbacks_t *p_cb);
188 int (*set_fm_ctrl)(int opcode, int val);
189 void (*Get_fm_ctrl) (int opcode, int val);
190} fm_interface_t;
191
192typedef int (*fm_evt_notify_cb)(unsigned char *p_buf);
193
194typedef struct {
195 fm_evt_notify_cb fm_evt_notify;
196} fm_hal_cb;
197
198struct radio_hci_command_hdr {
199 short opcode; /* OCF & OGF */
200 char plen;
201} ;
202
203struct radio_hci_event_hdr {
204 char evt;
205 char plen;
206} ;
207
208struct radio_hci_dev {
209 char name[8];
210 unsigned long flags;
211 short id;
212 char bus;
213 char dev_type;
214 char dev_name[248];
215 char dev_class[3];
216 char features[8];
217 char commands[64];
218 unsigned int data_block_len;
219 unsigned long cmd_last_tx;
220 int req_status;
221 int req_result;
222};
223
224/* Opcode OCF */
225/* HCI recv control commands opcode */
226#define HCI_OCF_FM_ENABLE_RECV_REQ 0x0001
227#define HCI_OCF_FM_DISABLE_RECV_REQ 0x0002
228#define HCI_OCF_FM_GET_RECV_CONF_REQ 0x0003
229#define HCI_OCF_FM_SET_RECV_CONF_REQ 0x0004
230#define HCI_OCF_FM_SET_MUTE_MODE_REQ 0x0005
231#define HCI_OCF_FM_SET_STEREO_MODE_REQ 0x0006
232#define HCI_OCF_FM_SET_ANTENNA 0x0007
233#define HCI_OCF_FM_SET_SIGNAL_THRESHOLD 0x0008
234#define HCI_OCF_FM_GET_SIGNAL_THRESHOLD 0x0009
235#define HCI_OCF_FM_GET_STATION_PARAM_REQ 0x000A
236#define HCI_OCF_FM_GET_PROGRAM_SERVICE_REQ 0x000B
237#define HCI_OCF_FM_GET_RADIO_TEXT_REQ 0x000C
238#define HCI_OCF_FM_GET_AF_LIST_REQ 0x000D
239#define HCI_OCF_FM_SEARCH_STATIONS 0x000E
240#define HCI_OCF_FM_SEARCH_RDS_STATIONS 0x000F
241#define HCI_OCF_FM_SEARCH_STATIONS_LIST 0x0010
242#define HCI_OCF_FM_CANCEL_SEARCH 0x0011
243#define HCI_OCF_FM_RDS_GRP 0x0012
244#define HCI_OCF_FM_RDS_GRP_PROCESS 0x0013
245#define HCI_OCF_FM_EN_WAN_AVD_CTRL 0x0014
246#define HCI_OCF_FM_EN_NOTCH_CTRL 0x0015
247#define HCI_OCF_FM_SET_EVENT_MASK 0x0016
248#define HCI_OCF_FM_SET_CH_DET_THRESHOLD 0x0017
249#define HCI_OCF_FM_GET_CH_DET_THRESHOLD 0x0018
250#define HCI_OCF_FM_SET_BLND_TBL 0x001B
251#define HCI_OCF_FM_GET_BLND_TBL 0x001C
252/* HCI trans control commans opcode*/
253#define HCI_OCF_FM_ENABLE_TRANS_REQ 0x0001
254#define HCI_OCF_FM_DISABLE_TRANS_REQ 0x0002
255#define HCI_OCF_FM_GET_TRANS_CONF_REQ 0x0003
256#define HCI_OCF_FM_SET_TRANS_CONF_REQ 0x0004
257#define HCI_OCF_FM_RDS_RT_REQ 0x0008
258#define HCI_OCF_FM_RDS_PS_REQ 0x0009
259
260
261/* HCI common control commands opcode */
262#define HCI_OCF_FM_TUNE_STATION_REQ 0x0001
263#define HCI_OCF_FM_DEFAULT_DATA_READ 0x0002
264#define HCI_OCF_FM_DEFAULT_DATA_WRITE 0x0003
265#define HCI_OCF_FM_RESET 0x0004
266#define HCI_OCF_FM_GET_FEATURE_LIST 0x0005
267#define HCI_OCF_FM_DO_CALIBRATION 0x0006
268#define HCI_OCF_FM_SET_CALIBRATION 0x0007
269#define HCI_OCF_FM_SET_SPUR_TABLE 0x0008
270#define HCI_OCF_FM_GET_SPUR_TABLE 0x0009
271
272/*HCI Status parameters commands*/
273#define HCI_OCF_FM_READ_GRP_COUNTERS 0x0001
274
275/*HCI Diagnostic commands*/
276#define HCI_OCF_FM_PEEK_DATA 0x0002
277#define HCI_OCF_FM_POKE_DATA 0x0003
278#define HCI_OCF_FM_SSBI_PEEK_REG 0x0004
279#define HCI_OCF_FM_SSBI_POKE_REG 0x0005
280#define HCI_OCF_FM_STATION_DBG_PARAM 0x0007
281#define HCI_FM_SET_INTERNAL_TONE_GENRATOR 0x0008
282
283/* Opcode OGF */
284#define HCI_OGF_FM_RECV_CTRL_CMD_REQ 0x0013
285#define HCI_OGF_FM_TRANS_CTRL_CMD_REQ 0x0014
286#define HCI_OGF_FM_COMMON_CTRL_CMD_REQ 0x0015
287#define HCI_OGF_FM_STATUS_PARAMETERS_CMD_REQ 0x0016
288#define HCI_OGF_FM_TEST_CMD_REQ 0x0017
289#define HCI_OGF_FM_DIAGNOSTIC_CMD_REQ 0x003F
290
291/* Command opcode pack/unpack */
292#define hci_opcode_pack(ogf, ocf) (short) ((ocf & 0x03ff)|(ogf << 10))
293#define hci_opcode_ogf(op) (op >> 10)
294#define hci_opcode_ocf(op) (op & 0x03ff)
295#define hci_recv_ctrl_cmd_op_pack(ocf) \
296 (short) hci_opcode_pack(HCI_OGF_FM_RECV_CTRL_CMD_REQ, ocf)
297#define hci_trans_ctrl_cmd_op_pack(ocf) \
298 (short) hci_opcode_pack(HCI_OGF_FM_TRANS_CTRL_CMD_REQ, ocf)
299#define hci_common_cmd_op_pack(ocf) \
300 (short) hci_opcode_pack(HCI_OGF_FM_COMMON_CTRL_CMD_REQ, ocf)
301#define hci_status_param_op_pack(ocf) \
302 (short) hci_opcode_pack(HCI_OGF_FM_STATUS_PARAMETERS_CMD_REQ, ocf)
303#define hci_diagnostic_cmd_op_pack(ocf) \
304 (short) hci_opcode_pack(HCI_OGF_FM_DIAGNOSTIC_CMD_REQ, ocf)
305
306
307/* HCI commands with no arguments*/
308#define HCI_FM_ENABLE_RECV_CMD 1
309#define HCI_FM_DISABLE_RECV_CMD 2
310#define HCI_FM_GET_RECV_CONF_CMD 3
311#define HCI_FM_GET_STATION_PARAM_CMD 4
312#define HCI_FM_GET_SIGNAL_TH_CMD 5
313#define HCI_FM_GET_PROGRAM_SERVICE_CMD 6
314#define HCI_FM_GET_RADIO_TEXT_CMD 7
315#define HCI_FM_GET_AF_LIST_CMD 8
316#define HCI_FM_CANCEL_SEARCH_CMD 9
317#define HCI_FM_RESET_CMD 10
318#define HCI_FM_GET_FEATURES_CMD 11
319#define HCI_FM_STATION_DBG_PARAM_CMD 12
320#define HCI_FM_ENABLE_TRANS_CMD 13
321#define HCI_FM_DISABLE_TRANS_CMD 14
322#define HCI_FM_GET_TX_CONFIG 15
323#define HCI_FM_GET_DET_CH_TH_CMD 16
324#define HCI_FM_GET_BLND_TBL_CMD 17
325
326/* Defines for FM TX*/
327#define TX_PS_DATA_LENGTH 108
328#define TX_RT_DATA_LENGTH 64
329#define PS_STRING_LEN 9
330
331/* ----- HCI Command request ----- */
332struct hci_fm_recv_conf_req {
333 char emphasis;
334 char ch_spacing;
335 char rds_std;
336 char hlsi;
337 int band_low_limit;
338 int band_high_limit;
339} ;
340
341/* ----- HCI Command request ----- */
342struct hci_fm_trans_conf_req_struct {
343 char emphasis;
344 char rds_std;
345 int band_low_limit;
346 int band_high_limit;
347} ;
348
349
350/* ----- HCI Command request ----- */
351struct hci_fm_tx_ps {
352 char ps_control;
353 short pi;
354 char pty;
355 char ps_repeatcount;
356 char ps_num;
357 char ps_data[TX_PS_DATA_LENGTH];
358} ;
359
360struct hci_fm_tx_rt {
361 char rt_control;
362 short pi;
363 char pty;
364 char rt_len;
365 char rt_data[TX_RT_DATA_LENGTH];
366} ;
367
368struct hci_fm_mute_mode_req {
369 char hard_mute;
370 char soft_mute;
371} ;
372
373struct hci_fm_stereo_mode_req {
374 char stereo_mode;
375 char sig_blend;
376 char intf_blend;
377 char most_switch;
378} ;
379
380struct hci_fm_search_station_req {
381 char srch_mode;
382 char scan_time;
383 char srch_dir;
384} ;
385
386struct hci_fm_search_rds_station_req {
387 struct hci_fm_search_station_req srch_station;
388 char srch_pty;
389 short srch_pi;
390} ;
391
Satish kumar sugasi84e51de2015-09-30 18:27:43 -0700392struct hci_fm_rds_grp_cntrs_params {
393 int totalRdsSBlockErrors;
394 int totalRdsGroups;
395 int totalRdsGroup0;
396 int totalRdsGroup2;
397 int totalRdsBlockB;
398 int totalRdsProcessedGroup0;
399 int totalRdsProcessedGroup2;
400 int totalRdsGroupFiltered;
401 int totalRdsChangeFiltered;
402} ;
403
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700404struct hci_fm_search_station_list_req {
405 char srch_list_mode;
406 char srch_list_dir;
407 int srch_list_max;
408 char srch_pty;
409} ;
410
411struct hci_fm_rds_grp_req {
412 int rds_grp_enable_mask;
413 int rds_buf_size;
414 char en_rds_change_filter;
415} ;
416
417struct hci_fm_en_avd_ctrl_req {
418 char no_freqs;
419 char freq_index;
420 char lo_shft;
421 short freq_min;
422 short freq_max;
423} ;
424
425struct hci_fm_def_data_rd_req {
426 char mode;
427 char length;
428 char param_len;
429 char param;
430} ;
431
432struct hci_fm_def_data_wr_req {
433 char mode;
434 char length;
435 char data[DEFAULT_DATA_SIZE];
436} ;
437
438struct hci_fm_riva_data {
439 char subopcode;
440 int start_addr;
441 char length;
442} ;
443
444struct hci_fm_riva_poke {
445 struct hci_fm_riva_data cmd_params;
446 char data[MAX_RIVA_PEEK_RSP_SIZE];
447} ;
448
449struct hci_fm_ssbi_req {
450 short start_addr;
451 char data;
452} ;
453struct hci_fm_ssbi_peek {
454 short start_address;
455} ;
456
457struct hci_fm_ch_det_threshold {
458 char sinr;
459 char sinr_samples;
460 char low_th;
461 char high_th;
462
463} ;
464
465struct hci_fm_blend_table {
466 char ucBlendType;
467 char ucBlendRampRateUp;
468 char ucBlendDebounceNumSampleUp;
469 char ucBlendDebounceIdxUp;
470 char ucBlendSinrIdxSkipStep;
471 char scBlendSinrHi;
472 char scBlendRmssiHi;
473 char ucBlendIndexHi;
474 char ucBlendIndex[MAX_BLEND_INDEX];
475} ;
476
477/*HCI events*/
478#define HCI_EV_TUNE_STATUS 0x01
479#define HCI_EV_RDS_LOCK_STATUS 0x02
480#define HCI_EV_STEREO_STATUS 0x03
481#define HCI_EV_SERVICE_AVAILABLE 0x04
482#define HCI_EV_SEARCH_PROGRESS 0x05
483#define HCI_EV_SEARCH_RDS_PROGRESS 0x06
484#define HCI_EV_SEARCH_LIST_PROGRESS 0x07
485#define HCI_EV_RDS_RX_DATA 0x08
486#define HCI_EV_PROGRAM_SERVICE 0x09
487#define HCI_EV_RADIO_TEXT 0x0A
488#define HCI_EV_FM_AF_LIST 0x0B
489#define HCI_EV_TX_RDS_GRP_AVBLE 0x0C
490#define HCI_EV_TX_RDS_GRP_COMPL 0x0D
491#define HCI_EV_TX_RDS_CONT_GRP_COMPL 0x0E
492#define HCI_EV_CMD_COMPLETE 0x0F
493#define HCI_EV_CMD_STATUS 0x10
494#define HCI_EV_TUNE_COMPLETE 0x11
495#define HCI_EV_SEARCH_COMPLETE 0x12
496#define HCI_EV_SEARCH_RDS_COMPLETE 0x13
497#define HCI_EV_SEARCH_LIST_COMPLETE 0x14
Satish kumar sugasib0ba3c82016-05-04 20:18:23 -0700498#define HCI_EV_RADIO_TEXT_PLUS_ID 0x18
499#define HCI_EV_RADIO_TEXT_PLUS_TAG 0x19
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700500
501#define HCI_REQ_DONE 0
502#define HCI_REQ_PEND 1
503#define HCI_REQ_CANCELED 2
504#define HCI_REQ_STATUS 3
505
506#define MAX_RAW_RDS_GRPS 21
507
508#define RDSGRP_DATA_OFFSET 0x1
509
510/*RT PLUS*/
511#define DUMMY_CLASS 0
512#define RT_PLUS_LEN_1_TAG 3
513#define RT_ERT_FLAG_BIT 5
514
515/*TAG1*/
516#define TAG1_MSB_OFFSET 3
517#define TAG1_MSB_MASK 7
518#define TAG1_LSB_OFFSET 5
519#define TAG1_POS_MSB_MASK 31
520#define TAG1_POS_MSB_OFFSET 1
521#define TAG1_POS_LSB_OFFSET 7
522#define TAG1_LEN_OFFSET 1
523#define TAG1_LEN_MASK 63
524
525/*TAG2*/
526#define TAG2_MSB_OFFSET 5
527#define TAG2_MSB_MASK 1
528#define TAG2_LSB_OFFSET 3
529#define TAG2_POS_MSB_MASK 7
530#define TAG2_POS_MSB_OFFSET 3
531#define TAG2_POS_LSB_OFFSET 5
532#define TAG2_LEN_MASK 31
533
534#define AGT_MASK 31
535/*Extract 5 left most bits of lsb of 2nd block*/
536#define AGT(x) (x & AGT_MASK)
537/*16 bits of 4th block*/
538#define AID(lsb, msb) ((msb << 8) | (lsb))
539/*Extract 5 right most bits of msb of 2nd block*/
540#define GTC(blk2msb) (blk2msb >> 3)
541
542#define GRP_3A 0x6
543#define RT_PLUS_AID 0x4bd7
544
545/*ERT*/
546#define ERT_AID 0x6552
547#define CARRIAGE_RETURN 0x000D
548#define MAX_ERT_SEGMENT 31
549#define ERT_FORMAT_DIR_BIT 1
550
551#define EXTRACT_BIT(data, bit_pos) ((data & (1 << bit_pos)) >> bit_pos)
552
553struct hci_ev_tune_status {
554 char sub_event;
555 int station_freq;
556 char serv_avble;
557 char rssi;
558 char stereo_prg;
559 char rds_sync_status;
560 char mute_mode;
561 char sinr;
562 char intf_det_th;
563} ;
564
565struct rds_blk_data {
566 char rdsMsb;
567 char rdsLsb;
568 char blockStatus;
569} ;
570
571struct rds_grp_data {
572 struct rds_blk_data rdsBlk[4];
573} ;
574
575struct hci_ev_rds_rx_data {
576 char num_rds_grps;
577 struct rds_grp_data rds_grp_data[MAX_RAW_RDS_GRPS];
578} ;
579
580struct hci_ev_prg_service {
581 short pi_prg_id;
582 char pty_prg_type;
583 char ta_prg_code_type;
584 char ta_ann_code_flag;
585 char ms_switch_code_flag;
586 char dec_id_ctrl_code_flag;
587 char ps_num;
588 char prg_service_name[119];
589} ;
590
591struct hci_ev_radio_text {
592 short pi_prg_id;
593 char pty_prg_type;
594 char ta_prg_code_type;
595 char txt_ab_flag;
596 char radio_txt[64];
597} ;
598
599struct hci_ev_af_list {
600 int tune_freq;
601 short pi_code;
602 char af_size;
603 char af_list[FM_AF_LIST_MAX_SIZE];
604} ;
605
606struct hci_ev_cmd_complete {
607 char num_hci_cmd_pkts;
608 short cmd_opcode;
609} ;
610
611struct hci_ev_cmd_status {
612 char status;
613 char num_hci_cmd_pkts;
614 short status_opcode;
615} ;
616
617struct hci_ev_srch_st {
618 int station_freq;
619 char rds_cap;
620 char pty;
621 short status_opcode;
622} ;
623
624struct hci_ev_rel_freq {
625 char rel_freq_msb;
626 char rel_freq_lsb;
627
628} ;
629struct hci_ev_srch_list_compl {
630 char num_stations_found;
631 struct hci_ev_rel_freq rel_freq[20];
632} ;
633
634/* ----- HCI Event Response ----- */
635struct hci_fm_conf_rsp {
636 char status;
637 struct hci_fm_recv_conf_req recv_conf_rsp;
638} ;
639
Satish kumar sugasi84e51de2015-09-30 18:27:43 -0700640struct hci_fm_rds_grp_cntrs_rsp {
641 char status;
642 struct hci_fm_rds_grp_cntrs_params recv_rds_grp_cntrs_rsp;
643} ;
644
645
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700646struct hci_fm_get_trans_conf_rsp {
647 char status;
648 struct hci_fm_trans_conf_req_struct trans_conf_rsp;
649} ;
650struct hci_fm_sig_threshold_rsp {
651 char status;
652 char sig_threshold;
653} ;
654
655struct hci_fm_station_rsp {
656 struct hci_ev_tune_status station_rsp;
657} ;
658
659struct hci_fm_prgm_srv_rsp {
660 char status;
661 struct hci_ev_prg_service prg_srv;
662} ;
663
664struct hci_fm_radio_txt_rsp {
665 char status;
666 struct hci_ev_radio_text rd_txt;
667} ;
668
669struct hci_fm_af_list_rsp {
670 char status;
671 struct hci_ev_af_list rd_txt;
672} ;
673
674struct hci_fm_data_rd_rsp {
675 char status;
676 char ret_data_len;
677 char data[DEFAULT_DATA_SIZE];
678} ;
679
680struct hci_fm_feature_list_rsp {
681 char status;
682 char feature_mask;
683} ;
684
685struct hci_fm_dbg_param_rsp {
686 char status;
687 char blend;
688 char soft_mute;
689 char inf_blend;
690 char inf_soft_mute;
691 char pilot_pil;
692 char io_verc;
693 char in_det_out;
694} ;
695
696#define CLKSPURID_INDEX0 0
697#define CLKSPURID_INDEX1 5
698#define CLKSPURID_INDEX2 10
699#define CLKSPURID_INDEX3 15
700#define CLKSPURID_INDEX4 20
701#define CLKSPURID_INDEX5 25
702
703#define MAX_SPUR_FREQ_LIMIT 30
704#define CKK_SPUR 0x3B
705#define SPUR_DATA_SIZE 0x4
706#define SPUR_ENTRIES_PER_ID 0x5
707
708#define COMPUTE_SPUR(val) ((((val) - (76000)) / (50)))
709#define GET_FREQ(val, bit) ((bit == 1) ? ((val) >> 8) : ((val) & 0xFF))
710#define GET_SPUR_ENTRY_LEVEL(val) ((val) / (5))
711
712struct hci_fm_spur_data {
713 int freq[MAX_SPUR_FREQ_LIMIT];
714 char rmssi[MAX_SPUR_FREQ_LIMIT];
715 char enable[MAX_SPUR_FREQ_LIMIT];
716} ;
717
718
719/* HCI dev events */
720#define RADIO_HCI_DEV_REG 1
721#define RADIO_HCI_DEV_WRITE 2
722
723#define hci_req_lock(d) mutex_lock(&d->req_lock)
724#define hci_req_unlock(d) mutex_unlock(&d->req_lock)
725
726/* FM RDS */
727#define RDS_PTYPE 2
728#define RDS_PID_LOWER 1
729#define RDS_PID_HIGHER 0
730#define RDS_OFFSET 5
731#define RDS_PS_LENGTH_OFFSET 7
732#define RDS_STRING 8
733#define RDS_PS_DATA_OFFSET 8
734#define RDS_CONFIG_OFFSET 3
735#define RDS_AF_JUMP_OFFSET 4
736#define PI_CODE_OFFSET 4
737#define AF_SIZE_OFFSET 6
738#define AF_LIST_OFFSET 7
739#define RT_A_B_FLAG_OFFSET 4
740/*FM states*/
741
742enum radio_state_t {
743 FM_OFF,
744 FM_RECV,
745 FM_TRANS,
746 FM_RESET,
747 FM_CALIB,
748 FM_TURNING_OFF,
749 FM_RECV_TURNING_ON,
750 FM_TRANS_TURNING_ON,
751 FM_MAX_NO_STATES,
752};
753
754enum emphasis_type {
755 FM_RX_EMP75 = 0x0,
756 FM_RX_EMP50 = 0x1
757};
758
759enum channel_space_type {
760 FM_RX_SPACE_200KHZ = 0x0,
761 FM_RX_SPACE_100KHZ = 0x1,
762 FM_RX_SPACE_50KHZ = 0x2
763};
764
765enum high_low_injection {
766 AUTO_HI_LO_INJECTION = 0x0,
767 LOW_SIDE_INJECTION = 0x1,
768 HIGH_SIDE_INJECTION = 0x2
769};
770
771enum fm_rds_type {
772 FM_RX_RDBS_SYSTEM = 0x0,
773 FM_RX_RDS_SYSTEM = 0x1
774};
775
776enum hlm_region_t {
777 HELIUM_REGION_US,
778 HELIUM_REGION_EU,
779 HELIUM_REGION_JAPAN,
780 HELIUM_REGION_JAPAN_WIDE,
781 HELIUM_REGION_OTHER
782};
783
784/* Search options */
785enum search_t {
786 SEEK,
787 SCAN,
788 SCAN_FOR_STRONG,
789 SCAN_FOR_WEAK,
790 RDS_SEEK_PTY,
791 RDS_SCAN_PTY,
792 RDS_SEEK_PI,
793 RDS_AF_JUMP,
794};
795
796enum spur_entry_levels {
797 ENTRY_0,
798 ENTRY_1,
799 ENTRY_2,
800 ENTRY_3,
801 ENTRY_4,
802 ENTRY_5,
803};
804
805/* Band limits */
806#define REGION_US_EU_BAND_LOW 87500
807#define REGION_US_EU_BAND_HIGH 108000
808#define REGION_JAPAN_STANDARD_BAND_LOW 76000
809#define REGION_JAPAN_STANDARD_BAND_HIGH 90000
810#define REGION_JAPAN_WIDE_BAND_LOW 90000
811#define REGION_JAPAN_WIDE_BAND_HIGH 108000
812
813#define SRCH_MODE 0x07
814#define SRCH_DIR 0x08 /* 0-up 1-down */
815#define SCAN_DWELL 0x70
816#define SRCH_ON 0x80
817
818/* I/O Control */
819#define IOC_HRD_MUTE 0x03
820#define IOC_SFT_MUTE 0x01
821#define IOC_MON_STR 0x01
822#define IOC_SIG_BLND 0x01
823#define IOC_INTF_BLND 0x01
824#define IOC_ANTENNA 0x01
825
826/* RDS Control */
827#define RDS_ON 0x01
828#define RDS_BUF_SZ 100
829
830/* constants */
831#define RDS_BLOCKS_NUM (4)
832#define BYTES_PER_BLOCK (3)
833#define MAX_PS_LENGTH (108)
834#define MAX_RT_LENGTH (64)
835#define RDS_GRP_CNTR_LEN (36)
836#define RX_RT_DATA_LENGTH (63)
837/* Search direction */
838#define SRCH_DIR_UP (0)
839#define SRCH_DIR_DOWN (1)
840
841/*Search RDS stations*/
842#define SEARCH_RDS_STNS_MODE_OFFSET 4
843
844/*Search Station list */
845#define PARAMS_PER_STATION 0x08
846#define STN_NUM_OFFSET 0x01
847#define STN_FREQ_OFFSET 0x02
848#define KHZ_TO_MHZ 1000
849#define GET_MSB(x)((x >> 8) & 0xFF)
850#define GET_LSB(x)((x) & 0xFF)
851
852/* control options */
853#define CTRL_ON (1)
854#define CTRL_OFF (0)
855
856/*Diagnostic commands*/
857
858#define RIVA_PEEK_OPCODE 0x0D
859#define RIVA_POKE_OPCODE 0x0C
860
861#define PEEK_DATA_OFSET 0x1
862#define RIVA_PEEK_PARAM 0x6
863#define RIVA_PEEK_LEN_OFSET 0x6
864#define SSBI_PEEK_LEN 0x01
865/*Calibration data*/
866#define PROCS_CALIB_MODE 1
867#define PROCS_CALIB_SIZE 23
868#define DC_CALIB_MODE 2
869#define DC_CALIB_SIZE 48
870#define RSB_CALIB_MODE 3
871#define RSB_CALIB_SIZE 4
872#define CALIB_DATA_OFSET 2
873#define CALIB_MODE_OFSET 1
874#define MAX_CALIB_SIZE 75
875
876/* Channel validity */
877#define INVALID_CHANNEL (0)
878#define VALID_CHANNEL (1)
879
880struct hci_fm_set_cal_req_proc {
881 char mode;
882 /*Max process calibration data size*/
883 char data[PROCS_CALIB_SIZE];
884} ;
885
886struct hci_fm_set_cal_req_dc {
887 char mode;
888 /*Max DC calibration data size*/
889 char data[DC_CALIB_SIZE];
890} ;
891
892struct hci_cc_do_calibration_rsp {
893 char status;
894 char mode;
895 char data[MAX_CALIB_SIZE];
896} ;
897
898struct hci_fm_set_spur_table_req {
899 char mode;
900 char no_of_freqs_entries;
901 char spur_data[FM_SPUR_TBL_SIZE];
902} ;
903/* Low Power mode*/
904#define SIG_LEVEL_INTR (1 << 0)
905#define RDS_SYNC_INTR (1 << 1)
906#define AUDIO_CTRL_INTR (1 << 2)
907#define AF_JUMP_ENABLE (1 << 4)
908
909int hci_def_data_read(struct hci_fm_def_data_rd_req *arg,
910 struct radio_hci_dev *hdev);
911int hci_def_data_write(struct hci_fm_def_data_wr_req *arg,
912 struct radio_hci_dev *hdev);
913int hci_fm_do_calibration(char *arg, struct radio_hci_dev *hdev);
914int hci_fm_do_calibration(char *arg, struct radio_hci_dev *hdev);
915
916static inline int is_valid_tone(int tone)
917{
918 if ((tone >= MIN_TX_TONE_VAL) &&
919 (tone <= MAX_TX_TONE_VAL))
920 return 1;
921 else
922 return 0;
923}
924
925static inline int is_valid_hard_mute(int hard_mute)
926{
927 if ((hard_mute >= MIN_HARD_MUTE_VAL) &&
928 (hard_mute <= MAX_HARD_MUTE_VAL))
929 return 1;
930 else
931 return 0;
932}
933
934static inline int is_valid_srch_mode(int srch_mode)
935{
936 if ((srch_mode >= MIN_SRCH_MODE) &&
937 (srch_mode <= MAX_SRCH_MODE))
938 return 1;
939 else
940 return 0;
941}
942
943static inline int is_valid_scan_dwell_prd(int scan_dwell_prd)
944{
945 if ((scan_dwell_prd >= MIN_SCAN_DWELL) &&
946 (scan_dwell_prd <= MAX_SCAN_DWELL))
947 return 1;
948 else
949 return 0;
950}
951
952static inline int is_valid_sig_th(int sig_th)
953{
954 if ((sig_th >= MIN_SIG_TH) &&
955 (sig_th <= MAX_SIG_TH))
956 return 1;
957 else
958 return 0;
959}
960
961static inline int is_valid_pty(int pty)
962{
963 if ((pty >= MIN_PTY) &&
964 (pty <= MAX_PTY))
965 return 1;
966 else
967 return 0;
968}
969
970static inline int is_valid_pi(int pi)
971{
972 if ((pi >= MIN_PI) &&
973 (pi <= MAX_PI))
974 return 1;
975 else
976 return 0;
977}
978
979static inline int is_valid_srch_station_cnt(int cnt)
980{
981 if ((cnt >= MIN_SRCH_STATIONS_CNT) &&
982 (cnt <= MAX_SRCH_STATIONS_CNT))
983 return 1;
984 else
985 return 0;
986}
987
988static inline int is_valid_chan_spacing(int spacing)
989{
990 if ((spacing >= MIN_CHAN_SPACING) &&
991 (spacing <= MAX_CHAN_SPACING))
992 return 1;
993 else
994 return 0;
995}
996
997static inline int is_valid_emphasis(int emphasis)
998{
999 if ((emphasis >= MIN_EMPHASIS) &&
1000 (emphasis <= MAX_EMPHASIS))
1001 return 1;
1002 else
1003 return 0;
1004}
1005
1006static inline int is_valid_rds_std(int rds_std)
1007{
1008 if ((rds_std >= MIN_RDS_STD) &&
1009 (rds_std <= MAX_RDS_STD))
1010 return 1;
1011 else
1012 return 0;
1013}
1014
1015static inline int is_valid_antenna(int antenna_type)
1016{
1017 if ((antenna_type >= MIN_ANTENNA_VAL) &&
1018 (antenna_type <= MAX_ANTENNA_VAL))
1019 return 1;
1020 else
1021 return 0;
1022}
1023
1024static inline int is_valid_ps_repeat_cnt(int cnt)
1025{
1026 if ((cnt >= MIN_TX_PS_REPEAT_CNT) &&
1027 (cnt <= MAX_TX_PS_REPEAT_CNT))
1028 return 1;
1029 else
1030 return 0;
1031}
1032
1033static inline int is_valid_soft_mute(int soft_mute)
1034{
1035 if ((soft_mute >= MIN_SOFT_MUTE) &&
1036 (soft_mute <= MAX_SOFT_MUTE))
1037 return 1;
1038 else
1039 return 0;
1040}
1041
1042static inline int is_valid_peek_len(int len)
1043{
1044 if ((len >= MIN_PEEK_ACCESS_LEN) &&
1045 (len <= MAX_PEEK_ACCESS_LEN))
1046 return 1;
1047 else
1048 return 0;
1049}
1050
1051static inline int is_valid_reset_cntr(int cntr)
1052{
1053 if ((cntr >= MIN_RESET_CNTR) &&
1054 (cntr <= MAX_RESET_CNTR))
1055 return 1;
1056 else
1057 return 0;
1058}
1059
1060static inline int is_valid_hlsi(int hlsi)
1061{
1062 if ((hlsi >= MIN_HLSI) &&
1063 (hlsi <= MAX_HLSI))
1064 return 1;
1065 else
1066 return 0;
1067}
1068
1069static inline int is_valid_notch_filter(int filter)
1070{
1071 if ((filter >= MIN_NOTCH_FILTER) &&
1072 (filter <= MAX_NOTCH_FILTER))
1073 return 1;
1074 else
1075 return 0;
1076}
1077
1078static inline int is_valid_intf_det_low_th(int th)
1079{
1080 if ((th >= MIN_INTF_DET_OUT_LW_TH) &&
1081 (th <= MAX_INTF_DET_OUT_LW_TH))
1082 return 1;
1083 else
1084 return 0;
1085}
1086
1087static inline int is_valid_intf_det_hgh_th(int th)
1088{
1089 if ((th >= MIN_INTF_DET_OUT_HG_TH) &&
1090 (th <= MAX_INTF_DET_OUT_HG_TH))
1091 return 1;
1092 else
1093 return 0;
1094}
1095
1096static inline int is_valid_sinr_th(int th)
1097{
1098 if ((th >= MIN_SINR_TH) &&
1099 (th <= MAX_SINR_TH))
1100 return 1;
1101 else
1102 return 0;
1103}
1104
1105static inline int is_valid_sinr_samples(int samples_cnt)
1106{
1107 if ((samples_cnt >= MIN_SINR_SAMPLES) &&
1108 (samples_cnt <= MAX_SINR_SAMPLES))
1109 return 1;
1110 else
1111 return 0;
1112}
1113
1114static inline int is_valid_fm_state(int state)
1115{
1116 if ((state >= 0) && (state < FM_MAX_NO_STATES))
1117 return 1;
1118 else
1119 return 0;
1120}
1121
1122static inline int is_valid_blend_value(int val)
1123{
1124 if ((val >= MIN_BLEND_HI) && (val <= MAX_BLEND_HI))
1125 return 1;
1126 else
1127 return 0;
1128}
1129
1130struct helium_device {
1131 int tune_req;
1132 unsigned int mode;
1133 short pi;
1134 char pty;
1135 char ps_repeatcount;
1136 char prev_trans_rds;
1137 char af_jump_bit;
1138 struct hci_fm_mute_mode_req mute_mode;
1139 struct hci_fm_stereo_mode_req stereo_mode;
1140 struct hci_fm_station_rsp fm_st_rsp;
1141 struct hci_fm_search_station_req srch_st;
1142 struct hci_fm_search_rds_station_req srch_rds;
1143 struct hci_fm_search_station_list_req srch_st_list;
1144 struct hci_fm_recv_conf_req recv_conf;
1145 struct hci_fm_trans_conf_req_struct trans_conf;
1146 struct hci_fm_rds_grp_req rds_grp;
1147 unsigned char g_search_mode;
1148 unsigned char power_mode;
1149 int search_on;
1150 unsigned char spur_table_size;
1151 unsigned char g_scan_time;
1152 unsigned int g_antenna;
1153 unsigned int g_rds_grp_proc_ps;
1154 unsigned char event_mask;
1155 enum hlm_region_t region;
1156 struct hci_fm_dbg_param_rsp st_dbg_param;
1157 struct hci_ev_srch_list_compl srch_st_result;
1158};
1159#endif /* __UAPI_RADIO_HCI_CORE_H */