diff --git a/helium/radio-helium.h b/helium/radio-helium.h index 430ddbf8d1c5631f733e04e3ecf65a399148e112..9952884024e40e3e2279e4aa97d81826f660e209 100644 --- a/helium/radio-helium.h +++ b/helium/radio-helium.h @@ -159,6 +159,7 @@ typedef void (*rt_plus_cb)(char *rt_plus); typedef void (*ert_cb)(char *ert); typedef void (*disable_cb)(); typedef void (*callback_thread_event)(unsigned int evt); +typedef void (*rds_grp_cntrs_cb)(char *rds_params); typedef struct { size_t size; @@ -177,6 +178,7 @@ typedef struct { rt_plus_cb rt_plus_update_cb; ert_cb ert_update_cb; disable_cb disabled_cb; + rds_grp_cntrs_cb rds_grp_cntrs_rsp_cb; callback_thread_event thread_evt_cb; } fm_vendor_callbacks_t; @@ -387,6 +389,18 @@ struct hci_fm_search_rds_station_req { short srch_pi; } ; +struct hci_fm_rds_grp_cntrs_params { + int totalRdsSBlockErrors; + int totalRdsGroups; + int totalRdsGroup0; + int totalRdsGroup2; + int totalRdsBlockB; + int totalRdsProcessedGroup0; + int totalRdsProcessedGroup2; + int totalRdsGroupFiltered; + int totalRdsChangeFiltered; +} ; + struct hci_fm_search_station_list_req { char srch_list_mode; char srch_list_dir; @@ -623,6 +637,12 @@ struct hci_fm_conf_rsp { struct hci_fm_recv_conf_req recv_conf_rsp; } ; +struct hci_fm_rds_grp_cntrs_rsp { + char status; + struct hci_fm_rds_grp_cntrs_params recv_rds_grp_cntrs_rsp; +} ; + + struct hci_fm_get_trans_conf_rsp { char status; struct hci_fm_trans_conf_req_struct trans_conf_rsp; diff --git a/helium/radio_helium_hal.c b/helium/radio_helium_hal.c index 2a3dc80eeffb370681127c531b518d4ed3f55f2c..0c68972b0215d0357efae9c25ea860061c0d1a95 100644 --- a/helium/radio_helium_hal.c +++ b/helium/radio_helium_hal.c @@ -119,6 +119,23 @@ static void hci_cc_rsp(char *ev_buff) radio_hci_req_complete(status); } +static void hci_cc_rds_grp_cntrs_rsp(char *ev_buff) +{ + char status; + if (ev_buff == NULL) { + ALOGE("%s:%s, buffer is null\n", LOG_TAG, __func__); + return; + } + status = ev_buff[0]; + ALOGE("%s:%s, status =%d\n", LOG_TAG, __func__,status); + if(status < 0) + { + ALOGE("%s:%s, read rds_grp_cntrs failed status=%d\n", LOG_TAG, __func__,status); + } + jni_cb->rds_grp_cntrs_rsp_cb(&ev_buff[1]); +} + + static inline void hci_cmd_complete_event(char *buff) { uint16_t opcode; @@ -169,6 +186,9 @@ static inline void hci_cmd_complete_event(char *buff) case hci_common_cmd_op_pack(HCI_OCF_FM_SET_SPUR_TABLE): hci_cc_rsp(pbuf); break; + case hci_status_param_op_pack(HCI_OCF_FM_READ_GRP_COUNTERS): + hci_cc_rds_grp_cntrs_rsp(pbuf); + break; /* case hci_common_cmd_op_pack(HCI_OCF_FM_GET_SPUR_TABLE): hci_cc_get_spur_tbl(buff); break; @@ -463,7 +483,7 @@ static void hci_ev_rt_plus_tag(char *buff) data = malloc(len); if (data != NULL) { data[0] = len; - ALOGE("%s:%s: data length=%d\n", LOG_TAG, __func__,data[0]); + ALOGI("%s:%s: data length=%d\n", LOG_TAG, __func__,data[0]); data[1] = buff[RDS_PTYPE]; data[2] = buff[RDS_PID_LOWER]; data[3] = buff[RDS_PID_HIGHER]; @@ -948,6 +968,24 @@ static int set_fm_ctrl(int cmd, int val) goto END; } break; + + case HCI_FM_HELIUM_RDS_GRP_COUNTERS: + ALOGD("%s: rds_grp counter read value=%d ", LOG_TAG,val); + ret = hci_fm_get_rds_grpcounters_req(val); + if (ret < 0) { + radio->g_rds_grp_proc_ps = saved_val; + goto END; + } + break; + + case HCI_FM_HELIUM_SET_NOTCH_FILTER: + ALOGD("%s: set notch filter notch=%d ", LOG_TAG,val); + ret = hci_fm_set_notch_filter_req(val); + if (ret < 0) { + goto END; + } + break; + case HCI_FM_HELIUM_RDSD_BUF: radio->rds_grp.rds_buf_size = val; break; diff --git a/helium/radio_helium_hal_cmds.c b/helium/radio_helium_hal_cmds.c index 8e69e4bd5fdf8da184954541c0cc862212ae1340..1d422d137b8a8b5a83f09636dfd21dac36a1a193 100644 --- a/helium/radio_helium_hal_cmds.c +++ b/helium/radio_helium_hal_cmds.c @@ -161,6 +161,34 @@ int hci_fm_set_recv_conf_req (struct hci_fm_recv_conf_req *conf) return send_fm_cmd_pkt(opcode, sizeof((*conf)), conf); } +int hci_fm_get_program_service_req () +{ + uint16_t opcode = 0; + + opcode = hci_opcode_pack(HCI_OGF_FM_RECV_CTRL_CMD_REQ, + HCI_OCF_FM_GET_PROGRAM_SERVICE_REQ); + return send_fm_cmd_pkt(opcode, 0, NULL); +} + +int hci_fm_get_rds_grpcounters_req (int val) +{ + uint16_t opcode = 0; + + opcode = hci_opcode_pack(HCI_OGF_FM_STATUS_PARAMETERS_CMD_REQ, + HCI_OCF_FM_READ_GRP_COUNTERS); + return send_fm_cmd_pkt(opcode, sizeof(val), &val); +} + +int hci_fm_set_notch_filter_req (int val) +{ + uint16_t opcode = 0; + + opcode = hci_opcode_pack(HCI_OGF_FM_RECV_CTRL_CMD_REQ, + HCI_OCF_FM_EN_NOTCH_CTRL); + return send_fm_cmd_pkt(opcode, sizeof(val), &val); +} + + int helium_set_sig_threshold_req(char th) { uint16_t opcode = 0; diff --git a/jni/android_hardware_fm.cpp b/jni/android_hardware_fm.cpp index a410eb618683cfdf94ea3803c8f1862477661cd1..36199f671bab47e4ac9a50eaab70762d514177b1 100644 --- a/jni/android_hardware_fm.cpp +++ b/jni/android_hardware_fm.cpp @@ -101,6 +101,7 @@ typedef void (*rt_plus_cb)(char *rt_plus); typedef void (*ert_cb)(char *ert); typedef void (*disable_cb)(); typedef void (*callback_thread_event)(unsigned int evt); +typedef void (*rds_grp_cntrs_cb)(char *rds_params); static JNIEnv *mCallbackEnv = NULL; @@ -307,6 +308,11 @@ void fm_ert_update_cb(char *ert) mCallbackEnv->DeleteLocalRef(ert_buff); } +void rds_grp_cntrs_rsp_cb(char * evt_buffer) +{ + ALOGE("rds_grp_cntrs_rsp_cb"); +} + void fm_disabled_cb() { ALOGE("DISABLE"); @@ -348,6 +354,7 @@ typedef struct { rt_plus_cb rt_plus_update_cb; ert_cb ert_update_cb; disable_cb disabled_cb; + rds_grp_cntrs_cb rds_grp_cntrs_rsp_cb; callback_thread_event thread_evt_cb; } fm_vendor_callbacks_t; @@ -375,6 +382,7 @@ static fm_vendor_callbacks_t fm_callbacks = { fm_rt_plus_update_cb, fm_ert_update_cb, fm_disabled_cb, + rds_grp_cntrs_rsp_cb, fm_thread_evt_cb }; @@ -1428,7 +1436,6 @@ int register_android_hardware_fm_fmradio(JNIEnv* env) } } // end namespace - jint JNI_OnLoad(JavaVM *jvm, void *reserved) { JNIEnv *e;