FM: Slimbus sequence changes made independent of the chipset.
Make Slimbus sequence generic on cherokee builds with N
AND O release
Change-Id: I477c3e80def5efa6c17dd043245963646398b6e7
diff --git a/fmapp2/src/com/caf/fmradio/FMRadioService.java b/fmapp2/src/com/caf/fmradio/FMRadioService.java
index ab78098..6f0c3a6 100644
--- a/fmapp2/src/com/caf/fmradio/FMRadioService.java
+++ b/fmapp2/src/com/caf/fmradio/FMRadioService.java
@@ -100,6 +100,8 @@
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.os.IBinder.DeathRecipient;
+import android.content.SharedPreferences;
+import android.content.SharedPreferences.Editor;
/**
@@ -126,6 +128,8 @@
private BroadcastReceiver mRecordTimeoutListener = null;
private BroadcastReceiver mDelayedServiceStopListener = null;
private BroadcastReceiver mAudioBecomeNoisyListener = null;
+ private SharedPreferences mPref = null;
+ private Editor mEditor = null;
private boolean mOverA2DP = false;
private BroadcastReceiver mFmMediaButtonListener;
private BroadcastReceiver mAirplaneModeChanged;
@@ -229,9 +233,9 @@
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 FW_TIMEOUT = 200;
private static final int DISABLE_SLIMBUS_DATA_PORT = 0;
private static final int ENABLE_SLIMBUS_DATA_PORT = 1;
- private static final int ENABLE_SLIMBUS_CLOCK_DATA = 2;
private static Object mNotchFilterLock = new Object();
@@ -246,6 +250,8 @@
super.onCreate();
mFmA2dpDisabled = SystemProperties.getBoolean("vendor.fm.a2dp.conc.disabled",false);
+ mPref = getApplicationContext().getSharedPreferences("SlimbusPref", MODE_PRIVATE);
+ mEditor = mPref.edit();
mPrefs = new FmSharedPreferences(this);
mCallbacks = null;
TelephonyManager tmgr = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
@@ -943,7 +949,7 @@
if (isFmOn()) {
setLowPowerMode(false);
startFM();
- if (mReceiver.isCherokeeChip())
+ if (mReceiver.isCherokeeChip() && (mPref.getBoolean("SLIMBUS_SEQ", true)))
mReceiver.EnableSlimbus(ENABLE_SLIMBUS_DATA_PORT);
}
}
@@ -1665,12 +1671,13 @@
Log.v(LOGTAG, "Focus Loss/TLoss - Disabling speaker");
AudioSystem.setForceUse(AudioSystem.FOR_MEDIA, AudioSystem.FORCE_NONE);
}
- if (mReceiver != null)
+ if (mReceiver != null && (mReceiver.isCherokeeChip()))
mReceiver.EnableSlimbus(ENABLE_SLIMBUS_DATA_PORT);
if (true == mPlaybackInProgress) {
stopFM();
}
- if (mReceiver != null)
+
+ if ((mReceiver != null) && mReceiver.isCherokeeChip() && (mPref.getBoolean("SLIMBUS_SEQ", true)))
mReceiver.EnableSlimbus(DISABLE_SLIMBUS_DATA_PORT);
mStoppedOnFocusLoss = true;
break;
@@ -1687,7 +1694,8 @@
}
//intentional fall through.
- mReceiver.EnableSlimbus(DISABLE_SLIMBUS_DATA_PORT);
+ if (mReceiver.isCherokeeChip() && (mPref.getBoolean("SLIMBUS_SEQ", true)))
+ mReceiver.EnableSlimbus(DISABLE_SLIMBUS_DATA_PORT);
if (true == isFmRecordingOn())
stopRecording();
@@ -1711,8 +1719,8 @@
if(false == mPlaybackInProgress)
startFM();
-
- mReceiver.EnableSlimbus(ENABLE_SLIMBUS_DATA_PORT);
+ if (mReceiver.isCherokeeChip() && (mPref.getBoolean("SLIMBUS_SEQ", true)))
+ mReceiver.EnableSlimbus(ENABLE_SLIMBUS_DATA_PORT);
mSession.setActive(true);
break;
default:
@@ -2253,6 +2261,28 @@
return status;
}
+ private boolean waitForFWEvent() {
+ boolean status = false;
+
+ synchronized (mEventWaitLock) {
+ Log.d(LOGTAG, "waiting for FW event");
+ try {
+ if (mEventReceived == false)
+ mEventWaitLock.wait(FW_TIMEOUT);
+ if (mEventReceived == true) {
+ status = true;
+ }
+ } catch (IllegalMonitorStateException e) {
+ Log.e(LOGTAG, "Exception caught while waiting for event");
+ e.printStackTrace();
+ } catch (InterruptedException ex) {
+ Log.e(LOGTAG, "Exception caught while waiting for event");
+ ex.printStackTrace();
+ }
+ }
+ return status;
+ }
+
private boolean fmTurnOnSequence () {
boolean bStatus = false;
// This sets up the FM radio device
@@ -2268,6 +2298,9 @@
mEventReceived = false;
bStatus = mReceiver.enable(FmSharedPreferences.getFMConfiguration(), this);
+ if (mReceiver.isCherokeeChip()) {
+ bStatus = waitForEvent();
+ }
if (isSpeakerEnabled()) {
setAudioPath(false);
} else {
@@ -2331,6 +2364,16 @@
return bStatus;
}
+ private boolean checkForFwResponse(){
+ Log.d(LOGTAG, "checkForFwResponse");
+ boolean bStatus = false;
+ // Send command to enable FM core
+ mEventReceived = false;
+ mReceiver.EnableSlimbus(ENABLE_SLIMBUS_DATA_PORT);
+ bStatus = waitForFWEvent();
+ return bStatus;
+ }
+
/*
* Turn ON FM: Powers up FM hardware, and initializes the FM module
* .
@@ -2338,17 +2381,6 @@
*/
private boolean fmTurnOnSequenceCherokee () {
boolean bStatus = false;
-
- // Send command to power up SB slave block
- mEventReceived = false;
- mReceiver.EnableSlimbus(ENABLE_SLIMBUS_CLOCK_DATA);
- bStatus = waitForEvent();
-
- // Send command to enable FM core
- mEventReceived = false;
- mReceiver.EnableSlimbus(ENABLE_SLIMBUS_DATA_PORT);
- bStatus = waitForEvent();
-
AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
if ((audioManager != null) & (false == mPlaybackInProgress)) {
Log.d(LOGTAG, "mAudioManager.setFmRadioOn = true \n" );
@@ -2456,10 +2488,21 @@
else
{
if (mReceiver.isCherokeeChip()) {
- bStatus = fmTurnOnSequenceCherokee();
- } else {
+ if ((mPref.getBoolean("SLIMBUS_SEQ", true)) ) {
+ bStatus = checkForFwResponse();
+ if (bStatus) {
+ bStatus = fmTurnOnSequenceCherokee();
+ } else {
+ mEditor.putBoolean("SLIMBUS_SEQ", false);
+ mEditor.commit();
+ bStatus = fmTurnOnSequence();
+ }
+ } else {
+ bStatus = fmTurnOnSequence();
+ }
+ } else {
bStatus = fmTurnOnSequence();
- }
+ }
/* reset SSR flag */
mIsSSRInProgressFromActivity = false;
}
@@ -4092,7 +4135,7 @@
private void requestFocus() {
Log.d(LOGTAG, "++requestFocus");
- if (mReceiver.isCherokeeChip()) {
+ if (mReceiver.isCherokeeChip() && (mPref.getBoolean("SLIMBUS_SEQ", true))) {
requestFocusImplCherokee();
} else {
requestFocusImpl();
diff --git a/helium/radio_helium_hal.c b/helium/radio_helium_hal.c
index 7d04cb4..2fd849a 100644
--- a/helium/radio_helium_hal.c
+++ b/helium/radio_helium_hal.c
@@ -57,6 +57,7 @@
static uint32_t station_param_mask_flag;
static uint32_t station_dbg_param_mask_flag;
uint64_t flag;
+static int slimbus_flag = 0;
struct fm_hal_t *hal = NULL;
#define LOG_TAG "radio_helium"
@@ -79,6 +80,8 @@
return;
}
rsp = (struct hci_fm_conf_rsp *)ev_rsp;
+ if (!slimbus_flag)
+ hal->jni_cb->thread_evt_cb(0);
radio_hci_req_complete(rsp->status);
hal->jni_cb->enabled_cb();
if (rsp->status == FM_HC_STATUS_SUCCESS)
@@ -412,7 +415,8 @@
static void hci_cc_enable_slimbus_rsp(char *ev_buff)
{
- ALOGV("%s status %d", __func__, ev_buff[0]);
+ ALOGD("%s status %d", __func__, ev_buff[0]);
+ slimbus_flag = 1;
hal->jni_cb->thread_evt_cb(0);
hal->jni_cb->enable_slimbus_cb(ev_buff[0]);
}
diff --git a/jni/android_hardware_fm.cpp b/jni/android_hardware_fm.cpp
index 06d03ce..7895e4c 100644
--- a/jni/android_hardware_fm.cpp
+++ b/jni/android_hardware_fm.cpp
@@ -87,6 +87,7 @@
char *FM_LIBRARY_NAME = "fm_helium.so";
char *FM_LIBRARY_SYMBOL_NAME = "FM_HELIUM_LIB_INTERFACE";
void *lib_handle;
+static int slimbus_flag = 0;
typedef void (*enb_result_cb)();
typedef void (*tune_rsp_cb)(int Freq);
@@ -167,10 +168,19 @@
void fm_enabled_cb() {
ALOGD("Entered %s", __func__);
- if (!checkCallbackThread())
- return;
+ if (slimbus_flag) {
+ if (!checkCallbackThread())
+ return;
- mCallbackEnv->CallVoidMethod(mCallbacksObj, method_enableCallback);
+ mCallbackEnv->CallVoidMethod(mCallbacksObj, method_enableCallback);
+ } else {
+ if (mCallbackEnv != NULL) {
+ ALOGE("javaObjectRef creating");
+ jobject javaObjectRef = mCallbackEnv->NewObject(javaClassRef, method_enableCallback);
+ mCallbacksObj = javaObjectRef;
+ ALOGE("javaObjectRef = %p mCallbackobject =%p \n",javaObjectRef,mCallbacksObj);
+ }
+ }
ALOGD("exit %s", __func__);
}
@@ -541,6 +551,7 @@
return;
mCallbackEnv->CallVoidMethod(mCallbacksObj, method_enableSlimbusCallback, status);
+ slimbus_flag = 1;
ALOGV("--fm_enable_slimbus_cb");
}