Reset slimbus port on AUDIOFOCUS LOSS
On Audio focus loss, slave device, FM, keeps on sending packets to
master device, audio manager, even master is disconnected to slave
and slave's buffer overflowed after some time. Due to this, on Audio
focus gain, slave don't send packets to master. Hence no audio for
FM. Reset slimbus data port to overcome this situation.
CRs-Fixed: 1082673
Change-Id: I8317c6e82fe4844970e84e929e2c6328284c6ca9
diff --git a/fmapp2/src/com/caf/fmradio/FMRadioService.java b/fmapp2/src/com/caf/fmradio/FMRadioService.java
index 5744d96..7f6775b 100644
--- a/fmapp2/src/com/caf/fmradio/FMRadioService.java
+++ b/fmapp2/src/com/caf/fmradio/FMRadioService.java
@@ -219,6 +219,7 @@
private static final int FM_OFF_FROM_APPLICATION = 1;
private static final int FM_OFF_FROM_ANTENNA = 2;
private static final int RADIO_TIMEOUT = 1500;
+ private static final int RESET_SLIMBUS_DATA_PORT = 1;
private static Object mNotchFilterLock = new Object();
@@ -1596,6 +1597,7 @@
switch (msg.arg1) {
case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT:
Log.v(LOGTAG, "AudioFocus: received AUDIOFOCUS_LOSS_TRANSIENT");
+ mReceiver.EnableSlimbus(RESET_SLIMBUS_DATA_PORT);
if (true == isFmRecordingOn())
stopRecording();
case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK:
@@ -1608,6 +1610,8 @@
case AudioManager.AUDIOFOCUS_LOSS:
Log.v(LOGTAG, "AudioFocus: received AUDIOFOCUS_LOSS");
//intentional fall through.
+ mReceiver.EnableSlimbus(RESET_SLIMBUS_DATA_PORT);
+
if (mSpeakerPhoneOn) {
mSpeakerDisableHandler.removeCallbacks(mSpeakerDisableTask);
mSpeakerDisableHandler.postDelayed(mSpeakerDisableTask, 0);
diff --git a/helium/radio-helium-commands.h b/helium/radio-helium-commands.h
index c5dfba9..46ed651 100644
--- a/helium/radio-helium-commands.h
+++ b/helium/radio-helium-commands.h
@@ -115,5 +115,8 @@
HCI_FM_HELIUM_AUDIO_MODE,
HCI_FM_HELIUM_RMSSI,
HCI_FM_HELIUM_AUDIO_MUTE,
+
+ /*FM VSC command to enable/disable slimbus data port*/
+ HCI_FM_HELIUM_AUDIO = 0x00980940,
};
#endif /* __RADIO_CHEROKEE_COMMANDS_H */
diff --git a/helium/radio-helium.h b/helium/radio-helium.h
index 070dafa..200e006 100644
--- a/helium/radio-helium.h
+++ b/helium/radio-helium.h
@@ -245,6 +245,7 @@
#define HCI_OCF_FM_RDS_RT_REQ 0x0008
#define HCI_OCF_FM_RDS_PS_REQ 0x0009
+#define HCI_OCF_FM_ENABLE_SLIMBUS (0x000E)
/* HCI common control commands opcode */
#define HCI_OCF_FM_TUNE_STATION_REQ 0x0001
@@ -1231,6 +1232,7 @@
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();
+int hci_fm_enable_slimbus(uint8_t enable);
struct fm_hal_t {
struct radio_helium_device *radio;
diff --git a/helium/radio_helium_hal.c b/helium/radio_helium_hal.c
index 742f051..8672513 100644
--- a/helium/radio_helium_hal.c
+++ b/helium/radio_helium_hal.c
@@ -1604,6 +1604,10 @@
ALOGI("%s: command sent sucessfully", __func__, val);
}
break;
+ case HCI_FM_HELIUM_AUDIO:
+ ALOGE("%s slimbus port", val ? "enable" : "disable");
+ ret = hci_fm_enable_slimbus(val);
+ break;
default:
ALOGE("%s:%s: Not a valid FM CMD!!", LOG_TAG, __func__);
ret = 0;
diff --git a/helium/radio_helium_hal_cmds.c b/helium/radio_helium_hal_cmds.c
index 520ec12..b783c53 100644
--- a/helium/radio_helium_hal_cmds.c
+++ b/helium/radio_helium_hal_cmds.c
@@ -461,3 +461,13 @@
HCI_OCF_FM_LOW_PASS_FILTER_CTRL);
return send_fm_cmd_pkt(opcode, sizeof(enable_lpf), &enable_lpf);
}
+int hci_fm_enable_slimbus(uint8_t val) {
+ ALOGE("%s", __func__);
+ uint16_t opcode = 0;
+
+ opcode = hci_opcode_pack(HCI_OGF_FM_DIAGNOSTIC_CMD_REQ,
+ HCI_OCF_FM_ENABLE_SLIMBUS);
+
+ ALOGE("%s:val = %d, uint8 val = %d", __func__, val, (uint8_t)val);
+ return send_fm_cmd_pkt(opcode , sizeof(val), &val);
+}
diff --git a/jni/FmConst.h b/jni/FmConst.h
index 26eb616..e37160f 100644
--- a/jni/FmConst.h
+++ b/jni/FmConst.h
@@ -153,6 +153,8 @@
V4L2_CID_PRV_IRIS_LOWER_BAND,
V4L2_CID_PRV_IRIS_AUDIO_MODE,
V4L2_CID_PRV_IRIS_RMSSI,
+
+ V4L2_CID_PRV_ENABLE_SLIMBUS = 0x00980940,
};
#endif
diff --git a/jni/android_hardware_fm.cpp b/jni/android_hardware_fm.cpp
index b5b0a5e..0599002 100644
--- a/jni/android_hardware_fm.cpp
+++ b/jni/android_hardware_fm.cpp
@@ -1498,6 +1498,15 @@
return FM_JNI_SUCCESS;
}
+static jint android_hardware_fmradio_FmReceiverJNI_enableSlimbusNative
+ (JNIEnv * env, jobject thiz, jint fd, jint val)
+{
+ ALOGD("%s: val = %d\n", __func__, val);
+ int err = JNI_ERR;
+ err = vendor_interface->set_fm_ctrl(V4L2_CID_PRV_ENABLE_SLIMBUS, val);
+ return err;
+}
+
static void classInitNative(JNIEnv* env, jclass clazz) {
ALOGI("ClassInit native called \n");
@@ -1644,6 +1653,8 @@
(void*)android_hardware_fmradio_FmReceiverJNI_setSpurDataNative},
{ "configurePerformanceParams", "(I)V",
(void*)android_hardware_fmradio_FmReceiverJNI_configurePerformanceParams},
+ { "enableSlimbus", "(II)I",
+ (void*)android_hardware_fmradio_FmReceiverJNI_enableSlimbusNative},
};
int register_android_hardware_fm_fmradio(JNIEnv* env)
diff --git a/qcom/fmradio/FmReceiver.java b/qcom/fmradio/FmReceiver.java
index af7191a..b15d512 100644
--- a/qcom/fmradio/FmReceiver.java
+++ b/qcom/fmradio/FmReceiver.java
@@ -2974,7 +2974,7 @@
case TelephonyManager.NETWORK_TYPE_UMTS:
if ((mEnableLpfUmts & RatConf) == mEnableLpfUmts ) {
Log.v (TAG, "set LPF for net_type: " + Integer.toString(net_type));
- Log.v (TAG, "enable:" + enable);
+ Log.v (TAG, "enable:" + enable);
mControl.enableLPF(sFd, enable);
}
break;
@@ -3079,4 +3079,8 @@
break;
}
}
+ public void EnableSlimbus(int enable) {
+ Log.d(TAG, "EnableSlimbus :enable =" + enable);
+ mControl.enableSlimbus(sFd, enable);
+ }
}
diff --git a/qcom/fmradio/FmReceiverJNI.java b/qcom/fmradio/FmReceiverJNI.java
index c5835ff..d9fa79a 100644
--- a/qcom/fmradio/FmReceiverJNI.java
+++ b/qcom/fmradio/FmReceiverJNI.java
@@ -547,4 +547,5 @@
*/
static native int setSpurDataNative(int fd, short buff[], int len);
static native void configurePerformanceParams(int fd);
+ static native int enableSlimbus(int fd, int val);
}
diff --git a/qcom/fmradio/FmRxControls.java b/qcom/fmradio/FmRxControls.java
index 7b9fb7c..a3eba2a 100644
--- a/qcom/fmradio/FmRxControls.java
+++ b/qcom/fmradio/FmRxControls.java
@@ -786,4 +786,13 @@
return true;
}
}
+ public boolean enableSlimbus(int fd, int enable) {
+ int ret;
+ Log.d(TAG, "enableSlimbus : enable = " + enable);
+ ret = FmReceiverJNI.enableSlimbus(fd, enable);
+ if (ret == 0)
+ return true;
+ else
+ return false;
+ }
}