fm: add support for FMStats for cherokee

Add support for FMStats app for cherokee platform.

Change-Id: Ia63a69697554ebc28a22e86d450fade6b4427a67
diff --git a/helium/radio-helium.h b/helium/radio-helium.h
index 98452d8..05fc309 100644
--- a/helium/radio-helium.h
+++ b/helium/radio-helium.h
@@ -104,38 +104,41 @@
 #define FM_TX_PHY_CFG_LEN    0x10
 #define FM_TX_PWR_GAIN_OFFSET 14
 /**RDS CONFIG MODE**/
-#define FM_RDS_CNFG_MODE	0x0f
-#define FM_RDS_CNFG_LEN		0x10
-#define AF_RMSSI_TH_LSB_OFFSET	10
-#define AF_RMSSI_TH_MSB_OFFSET	11
-#define AF_RMSSI_SAMPLES_OFFSET	15
+#define FM_RDS_CNFG_MODE    0x0f
+#define FM_RDS_CNFG_LEN     0x10
+#define AF_RMSSI_TH_OFFSET  1
+#define AF_RMSSI_SAMPLES_OFFSET 2
 /**RX CONFIG MODE**/
-#define FM_RX_CONFG_MODE	0x15
-#define FM_RX_CNFG_LEN		0x20
-#define GD_CH_RMSSI_TH_OFFSET	12
-#define MAX_GD_CH_RMSSI_TH	127
-#define SRCH_ALGO_TYPE_OFFSET  25
-#define SINRFIRSTSTAGE_OFFSET  26
-#define RMSSIFIRSTSTAGE_OFFSET 27
-#define CF0TH12_BYTE1_OFFSET   8
-#define CF0TH12_BYTE2_OFFSET   9
-#define CF0TH12_BYTE3_OFFSET   10
-#define CF0TH12_BYTE4_OFFSET   11
-#define MAX_SINR_FIRSTSTAGE	127
-#define MAX_RMSSI_FIRSTSTAGE	127
+#define FM_RX_CONFG_MODE    0x15
+#define FM_RX_CNFG_LEN      0x15
+#define GD_CH_RMSSI_TH_OFFSET   0x03
+#define MAX_GD_CH_RMSSI_TH  0x7F
+#define SRCH_ALGO_TYPE_OFFSET  0x00
+#define SINRFIRSTSTAGE_OFFSET  0x01
+#define RMSSIFIRSTSTAGE_OFFSET 0x02
+#define CF0TH12_BYTE1_OFFSET   0x03
+#define CF0TH12_BYTE2_OFFSET   0x04
+#define MAX_SINR_FIRSTSTAGE 0x7F
+#define MAX_RMSSI_FIRSTSTAGE    0x7F
 #define RDS_PS0_XFR_MODE 0x01
-#define RDS_PS0_LEN 6
-#define RX_REPEATE_BYTE_OFFSET 5
-#define FM_SPUR_TBL_SIZE 240
-#define SPUR_DATA_LEN 16
-#define ENTRIES_EACH_CMD 15
-#define SPUR_DATA_INDEX 2
-#define FM_AF_LIST_MAX_SIZE   200
+#define RDS_PS0_LEN 0x06
+#define RX_REPEATE_BYTE_OFFSET 0x05
+#define FM_SPUR_TBL_SIZE 0xF0
+#define SPUR_DATA_LEN 0x10
+#define ENTRIES_EACH_CMD 0x0F
+#define SPUR_DATA_INDEX 0x02
+#define FM_AF_LIST_MAX_SIZE   0xC8
 #define AF_LIST_MAX     (FM_AF_LIST_MAX_SIZE / 4) /* Each AF frequency consist
-							of sizeof(int) bytes */
-#define MAX_BLEND_INDEX 49
+                            of sizeof(int) bytes */
+#define MAX_BLEND_INDEX 0x31
+
+#define FM_SRCH_CONFG_MODE  0x41
+#define FM_AFJUMP_CONFG_MODE 0x42
+#define FM_SRCH_CNFG_LEN    0x08
+#define FM_AFJUMP_CNFG_LEN  0x06
+
 /* HCI timeouts */
-#define RADIO_HCI_TIMEOUT	(10000)	/* 10 seconds */
+#define RADIO_HCI_TIMEOUT   (10000) /* 10 seconds */
 
 typedef enum {
     ASSOCIATE_JVM,
@@ -164,6 +167,15 @@
 typedef void (*fm_ssbi_peek_cb)(char *ssbi_peek_rsp);
 typedef void (*fm_ch_det_th_cb)(char *ch_det_rsp);
 typedef void (*fm_ecc_evt_cb)(char *ecc_rsp);
+typedef void (*fm_sig_thr_cb) (int val, int status);
+typedef void (*fm_get_ch_det_thrs_cb) (int val, int status);
+typedef void (*fm_def_data_rd_cb) (int val, int status);
+typedef void (*fm_get_blnd_cb) (int val, int status);
+typedef void (*fm_set_ch_det_thrs_cb) (int status);
+typedef void (*fm_def_data_wrt_cb) (int status);
+typedef void (*fm_set_blnd_cb) (int status);
+typedef void (*fm_get_stn_prm_cb) (int val, int status);
+typedef void (*fm_get_stn_dbg_prm_cb) (int val, int status);
 
 typedef struct {
     size_t  size;
@@ -188,6 +200,15 @@
     fm_ch_det_th_cb fm_ch_det_th_rsp_cb;
     fm_ecc_evt_cb	ext_country_code_cb;
     callback_thread_event thread_evt_cb;
+    fm_sig_thr_cb fm_get_sig_thres_cb;
+    fm_get_ch_det_thrs_cb fm_get_ch_det_thr_cb;
+    fm_def_data_rd_cb fm_def_data_read_cb;
+    fm_get_blnd_cb fm_get_blend_cb;
+    fm_set_ch_det_thrs_cb fm_set_ch_det_thr_cb;
+    fm_def_data_wrt_cb fm_def_data_write_cb;
+    fm_set_blnd_cb fm_set_blend_cb;
+    fm_get_stn_prm_cb fm_get_station_param_cb;
+    fm_get_stn_dbg_prm_cb fm_get_station_debug_param_cb;
 } fm_vendor_callbacks_t;
 
 pthread_mutex_t radio_fm_cmd;
@@ -304,11 +325,11 @@
      (short) hci_opcode_pack(HCI_OGF_FM_RECV_CTRL_CMD_REQ, ocf)
 #define hci_trans_ctrl_cmd_op_pack(ocf) \
      (short) hci_opcode_pack(HCI_OGF_FM_TRANS_CTRL_CMD_REQ, ocf)
-#define hci_common_cmd_op_pack(ocf)	\
+#define hci_common_cmd_op_pack(ocf) \
      (short) hci_opcode_pack(HCI_OGF_FM_COMMON_CTRL_CMD_REQ, ocf)
-#define hci_status_param_op_pack(ocf)	\
+#define hci_status_param_op_pack(ocf)   \
      (short) hci_opcode_pack(HCI_OGF_FM_STATUS_PARAMETERS_CMD_REQ, ocf)
-#define hci_diagnostic_cmd_op_pack(ocf)	\
+#define hci_diagnostic_cmd_op_pack(ocf) \
      (short) hci_opcode_pack(HCI_OGF_FM_DIAGNOSTIC_CMD_REQ, ocf)
 
 
@@ -342,15 +363,15 @@
     char  ch_spacing;
     char  rds_std;
     char  hlsi;
-    int	  band_low_limit;
-    int	  band_high_limit;
+    int   band_low_limit;
+    int   band_high_limit;
 } ;
 
 /* ----- HCI Command request ----- */
 struct hci_fm_trans_conf_req_struct {
     char  emphasis;
     char  rds_std;
-    int	  band_low_limit;
+    int   band_low_limit;
     int   band_high_limit;
 } ;
 
@@ -467,21 +488,27 @@
     char sinr_samples;
     char low_th;
     char high_th;
-
 } ;
 
 struct hci_fm_blend_table {
-    char ucBlendType;
-    char ucBlendRampRateUp;
-    char ucBlendDebounceNumSampleUp;
-    char ucBlendDebounceIdxUp;
-    char ucBlendSinrIdxSkipStep;
-    char scBlendSinrHi;
-    char scBlendRmssiHi;
-    char ucBlendIndexHi;
-    char ucBlendIndex[MAX_BLEND_INDEX];
+    char BlendType;
+    char BlendRampRateUp;
+    char BlendDebounceNumSampleUp;
+    char BlendDebounceIdxUp;
+    char BlendSinrIdxSkipStep;
+    char BlendSinrHi;
+    char BlendRmssiHi;
+    char BlendIndexHi;
+    char BlendIndex[MAX_BLEND_INDEX];
 } ;
 
+struct hci_fm_def_data_rd {
+    char mode;
+    char length;
+    char param_len;
+    char param;
+};
+
 /*HCI events*/
 #define HCI_EV_TUNE_STATUS              0x01
 #define HCI_EV_RDS_LOCK_STATUS          0x02
@@ -521,22 +548,22 @@
 /*RT PLUS*/
 #define DUMMY_CLASS             0
 #define RT_PLUS_LEN_1_TAG       3
-#define RT_ERT_FLAG_BIT	        5
+#define RT_ERT_FLAG_BIT         5
 
 /*TAG1*/
-#define TAG1_MSB_OFFSET	        3
-#define TAG1_MSB_MASK	        7
-#define TAG1_LSB_OFFSET	        5
+#define TAG1_MSB_OFFSET         3
+#define TAG1_MSB_MASK           7
+#define TAG1_LSB_OFFSET         5
 #define TAG1_POS_MSB_MASK       31
 #define TAG1_POS_MSB_OFFSET     1
 #define TAG1_POS_LSB_OFFSET     7
-#define TAG1_LEN_OFFSET	        1
+#define TAG1_LEN_OFFSET         1
 #define TAG1_LEN_MASK           63
 
 /*TAG2*/
-#define TAG2_MSB_OFFSET	        5
+#define TAG2_MSB_OFFSET         5
 #define TAG2_MSB_MASK           1
-#define TAG2_LSB_OFFSET	        3
+#define TAG2_LSB_OFFSET         3
 #define TAG2_POS_MSB_MASK       7
 #define TAG2_POS_MSB_OFFSET     3
 #define TAG2_POS_LSB_OFFSET     5
@@ -544,7 +571,7 @@
 
 #define AGT_MASK                31
 /*Extract 5 left most bits of lsb of 2nd block*/
-#define AGT(x) 	             (x & AGT_MASK)
+#define AGT(x)               (x & AGT_MASK)
 /*16 bits of 4th block*/
 #define AID(lsb, msb)        ((msb << 8) | (lsb))
 /*Extract 5 right most bits of msb of 2nd block*/
@@ -554,9 +581,9 @@
 #define RT_PLUS_AID          0x4bd7
 
 /*ERT*/
-#define ERT_AID	             0x6552
-#define CARRIAGE_RETURN	     0x000D
-#define MAX_ERT_SEGMENT	     31
+#define ERT_AID              0x6552
+#define CARRIAGE_RETURN      0x000D
+#define MAX_ERT_SEGMENT      31
 #define ERT_FORMAT_DIR_BIT   1
 
 #define EXTRACT_BIT(data, bit_pos) ((data & (1 << bit_pos)) >> bit_pos)
@@ -683,8 +710,7 @@
 } ;
 
 struct hci_fm_data_rd_rsp {
-    char    status;
-    char    ret_data_len;
+    char    data_len;
     char    data[DEFAULT_DATA_SIZE];
 } ;
 
@@ -694,7 +720,6 @@
 } ;
 
 struct hci_fm_dbg_param_rsp {
-    char    status;
     char    blend;
     char    soft_mute;
     char    inf_blend;
@@ -704,35 +729,35 @@
     char    in_det_out;
 } ;
 
-#define CLKSPURID_INDEX0	0
-#define CLKSPURID_INDEX1	5
-#define CLKSPURID_INDEX2	10
-#define CLKSPURID_INDEX3	15
-#define CLKSPURID_INDEX4	20
-#define CLKSPURID_INDEX5	25
+#define CLKSPURID_INDEX0    0
+#define CLKSPURID_INDEX1    5
+#define CLKSPURID_INDEX2    10
+#define CLKSPURID_INDEX3    15
+#define CLKSPURID_INDEX4    20
+#define CLKSPURID_INDEX5    25
 
-#define MAX_SPUR_FREQ_LIMIT	30
-#define CKK_SPUR		0x3B
-#define SPUR_DATA_SIZE		0x4
-#define SPUR_ENTRIES_PER_ID	0x5
+#define MAX_SPUR_FREQ_LIMIT 30
+#define CKK_SPUR        0x3B
+#define SPUR_DATA_SIZE      0x4
+#define SPUR_ENTRIES_PER_ID 0x5
 
 #define COMPUTE_SPUR(val)         ((((val) - (76000)) / (50)))
 #define GET_FREQ(val, bit)        ((bit == 1) ? ((val) >> 8) : ((val) & 0xFF))
 #define GET_SPUR_ENTRY_LEVEL(val) ((val) / (5))
 
 struct hci_fm_spur_data {
-    int	  freq[MAX_SPUR_FREQ_LIMIT];
+    int   freq[MAX_SPUR_FREQ_LIMIT];
     char  rmssi[MAX_SPUR_FREQ_LIMIT];
     char  enable[MAX_SPUR_FREQ_LIMIT];
 } ;
 
 
 /* HCI dev events */
-#define RADIO_HCI_DEV_REG			1
-#define RADIO_HCI_DEV_WRITE			2
+#define RADIO_HCI_DEV_REG           1
+#define RADIO_HCI_DEV_WRITE         2
 
-#define hci_req_lock(d)		mutex_lock(&d->req_lock)
-#define hci_req_unlock(d)	mutex_unlock(&d->req_lock)
+#define hci_req_lock(d)     mutex_lock(&d->req_lock)
+#define hci_req_unlock(d)   mutex_unlock(&d->req_lock)
 
 /* FM RDS */
 #define RDS_PTYPE 2
@@ -824,7 +849,7 @@
 #define SRCH_MODE       0x07
 #define SRCH_DIR        0x08 /* 0-up 1-down */
 #define SCAN_DWELL      0x70
-#define SRCH_ON	        0x80
+#define SRCH_ON         0x80
 
 /* I/O Control */
 #define IOC_HRD_MUTE    0x03
@@ -835,12 +860,12 @@
 #define IOC_ANTENNA     0x01
 
 /* RDS Control */
-#define RDS_ON	    0x01
+#define RDS_ON      0x01
 #define RDS_BUF_SZ  100
 
 /* constants */
-#define  RDS_BLOCKS_NUM	(4)
-#define BYTES_PER_BLOCK	(3)
+#define  RDS_BLOCKS_NUM (4)
+#define BYTES_PER_BLOCK (3)
 #define MAX_PS_LENGTH   (108)
 #define MAX_RT_LENGTH   (64)
 #define RDS_GRP_CNTR_LEN (36)
@@ -861,7 +886,7 @@
 #define GET_LSB(x)((x) & 0xFF)
 
 /* control options */
-#define CTRL_ON	    (1)
+#define CTRL_ON     (1)
 #define CTRL_OFF    (0)
 
 /*Diagnostic commands*/
@@ -885,7 +910,7 @@
 #define MAX_CALIB_SIZE 75
 
 /* Channel validity */
-#define INVALID_CHANNEL	    (0)
+#define INVALID_CHANNEL     (0)
 #define VALID_CHANNEL       (1)
 
 struct hci_fm_set_cal_req_proc {
@@ -1170,7 +1195,44 @@
     struct hci_fm_ssbi_req    ssbi_data_accs;
     struct hci_fm_ssbi_peek   ssbi_peek_reg;
     struct hci_fm_ch_det_threshold ch_det_threshold;
+    struct hci_fm_data_rd_rsp def_data;
+    struct hci_fm_blend_table blend_tbl;
 };
+
+#define set_bit(flag, bit_pos)      ((flag) |= (1 << (bit_pos)))
+#define clear_bit(flag, bit_pos)    ((flag) &= (~(1 << (bit_pos))))
+#define test_bit(flag, bit_pos)     ((flag) & (1 << (bit_pos)))
+#define clear_all_bit(flag)         ((flag) &= (~0xFFFFFFFF))
+#define CMD_CHDET_SINR_TH           (1)
+#define CMD_CHDET_SINR_SAMPLE       (2)
+#define CMD_CHDET_INTF_TH_LOW       (3)
+#define CMD_CHDET_INTF_TH_HIGH      (4)
+
+#define CMD_DEFRD_AF_RMSSI_TH       (1)
+#define CMD_DEFRD_AF_RMSSI_SAMPLE   (2)
+#define CMD_DEFRD_GD_CH_RMSSI_TH    (3)
+#define CMD_DEFRD_SEARCH_ALGO       (4)
+#define CMD_DEFRD_SINR_FIRST_STAGE  (5)
+#define CMD_DEFRD_RMSSI_FIRST_STAGE (6)
+#define CMD_DEFRD_CF0TH12           (7)
+#define CMD_DEFRD_TUNE_POWER        (8)
+#define CMD_DEFRD_REPEATCOUNT       (9)
+
+#define CMD_STNPARAM_RSSI           (1)
+#define CMD_STNPARAM_SINR           (2)
+#define CMD_STNPARAM_INTF_DET_TH    (3)
+
+#define CMD_STNDBGPARAM_BLEND       (1)
+#define CMD_STNDBGPARAM_SOFTMUTE    (2)
+#define CMD_STNDBGPARAM_INFBLEND    (3)
+#define CMD_STNDBGPARAM_INFSOFTMUTE (4)
+#define CMD_STNDBGPARAM_PILOTPLL    (5)
+#define CMD_STNDBGPARAM_IOVERC      (6)
+#define CMD_STNDBGPARAM_INFDETOUT   (7)
+
+#define CMD_BLENDTBL_SINR_HI        (1)
+#define CMD_BLENDTBL_RMSSI_HI       (2)
+
 int hci_fm_disable_recv_req();
 int helium_search_list(struct hci_fm_search_station_list_req *s_list);
 int helium_search_rds_stations(struct hci_fm_search_rds_station_req *rds_srch);
@@ -1194,6 +1256,11 @@
 int hci_ssbi_peek_reg(struct hci_fm_ssbi_peek *data);
 int hci_fm_get_ch_det_th();
 int set_ch_det_thresholds_req(struct hci_fm_ch_det_threshold *ch_det_th);
-
+int hci_fm_default_data_read_req(struct hci_fm_def_data_rd_req *def_data_rd);
+int hci_fm_get_blend_req();
+int hci_fm_set_blend_tbl_req(struct hci_fm_blend_table *blnd_tbl);
+int hci_fm_default_data_write_req(struct hci_fm_def_data_wr_req * data_wrt);
+int hci_fm_get_station_dbg_param_req();
+int hci_fm_get_station_cmd_param_req();
 
 #endif /* __UAPI_RADIO_HCI_CORE_H */