diff options
author | Ricardo Cerqueira <cyanogenmod@cerqueira.org> | 2012-02-01 13:27:48 +0300 |
---|---|---|
committer | Gerrit Code Review <gerrit@review.cyanogenmod.com> | 2012-02-01 13:27:48 +0300 |
commit | 5b46273112ff3e5ceb61279cdaa94aaa777dc8fd (patch) | |
tree | e6a8377fb0bac9cff4fa72c95ca6caaabeb77040 | |
parent | cade6b13956d5fbb2a9cbd1c5108ac42a851862b (diff) | |
parent | 5e2af511d4fdd1b8510b7490aa16f54d72cd3fe7 (diff) | |
download | frameworks_base-5b46273112ff3e5ceb61279cdaa94aaa777dc8fd.zip frameworks_base-5b46273112ff3e5ceb61279cdaa94aaa777dc8fd.tar.gz frameworks_base-5b46273112ff3e5ceb61279cdaa94aaa777dc8fd.tar.bz2 |
Merge "Broadcom FM: add support for BCM20xx chipsets, improve seek algorithm" into gingerbread
-rw-r--r-- | core/jni/Android.mk | 4 | ||||
-rw-r--r-- | core/jni/android_hardware_fm_bcm4325.cpp | 73 |
2 files changed, 59 insertions, 18 deletions
diff --git a/core/jni/Android.mk b/core/jni/Android.mk index 08d6f13..6fcee88 100644 --- a/core/jni/Android.mk +++ b/core/jni/Android.mk @@ -158,6 +158,10 @@ ifeq ($(BOARD_HAVE_FM_RADIO),true) ifeq ($(BOARD_FM_DEVICE),si4708) LOCAL_SRC_FILES += android_hardware_fm_si4708.cpp endif + ifeq ($(BOARD_FM_DEVICE),bcm2049) + LOCAL_CFLAGS += -DHAS_BCM20780 + LOCAL_SRC_FILES += android_hardware_fm_bcm4325.cpp + endif ifeq ($(BOARD_FM_DEVICE),bcm4329) LOCAL_SRC_FILES += android_hardware_fm_bcm4325.cpp endif diff --git a/core/jni/android_hardware_fm_bcm4325.cpp b/core/jni/android_hardware_fm_bcm4325.cpp index fa2bb8c..1e010bf 100644 --- a/core/jni/android_hardware_fm_bcm4325.cpp +++ b/core/jni/android_hardware_fm_bcm4325.cpp @@ -192,6 +192,31 @@ int hci_w(int reg, int val) return returnval; } +int hci_w16(int reg, int val1, int val2) +{ + int returnval = 0; + + char s1[100] = "hcitool cmd 0x3f 0x15 "; + char stemp[10] = ""; + char starget[100] = ""; + char *pstarget = starget; + + sprintf(stemp, "0x%x ", reg); + pstarget = strcat(s1, stemp); + + sprintf(stemp, "0x%x ", 0); + pstarget = strcat(pstarget, stemp); + + sprintf(stemp, "0x%x ", val1); + pstarget = strcat(pstarget, stemp); + + sprintf(stemp, "0x%x ", val2); + pstarget = strcat(pstarget, stemp); + + returnval = system(pstarget); + return returnval; +} + int hci_r(int reg) { FILE* returnval; @@ -258,13 +283,20 @@ static jint android_hardware_fmradio_FmReceiverJNI_acquireFdNative if(hci_w(BCM4325_I2C_FM_CTRL, BCM4325_FM_CTRL_MANUAL |BCM4325_FM_CTRL_STEREO) < 0){ return FM_JNI_FAILURE; } - +#ifdef HAS_BCM20780 + if (hci_w16(BCM4325_I2C_FM_AUDIO_CTRL0, + BCM4325_FM_AUDIO_CTRL0_RF_MUTE_ENABLE | + BCM4325_FM_AUDIO_CTRL0_DAC_OUT_LEFT_ON | BCM4325_FM_AUDIO_CTRL0_DAC_OUT_RIGHT_ON | + BCM4325_FM_AUDIO_CTRL0_ROUTE_DAC_ENABLE | BCM4325_FM_AUDIO_CTRL0_DEMPH_75US, 0) < 0) { + return FM_JNI_FAILURE; + } +#else if (hci_w(BCM4325_I2C_FM_AUDIO_CTRL0, BCM4325_FM_AUDIO_CTRL0_DAC_OUT_LEFT_ON | BCM4325_FM_AUDIO_CTRL0_DAC_OUT_RIGHT_ON | BCM4325_FM_AUDIO_CTRL0_ROUTE_DAC_ENABLE | BCM4325_FM_AUDIO_CTRL0_DEMPH_75US) < 0) { return FM_JNI_FAILURE; } - +#endif return FM_JNI_SUCCESS; } @@ -360,24 +392,29 @@ static jint android_hardware_fmradio_FmReceiverJNI_startSearchNative LOGD("Can't seek %s. Already at end of band.",dir?"up":"down"); return FM_JNI_FAILURE; } - else + else { + if ( hci_w(BCM4325_I2C_FM_SEARCH_METHOD, BCM4325_SEARCH_NORMAL) < 0){ + LOGE("fail search method\n"); + return FM_JNI_FAILURE; + } + if ( hci_w(BCM4325_I2C_FM_SEARCH_CTRL1, BCM4325_I2C_FM_AF_FREQ0) < 0){ + LOGE("fail search set SEARCH_CTRL1 reg\n"); + return FM_JNI_FAILURE; + } + if ( hci_w(BCM4325_I2C_FM_MAX_PRESET, 0) < 0 ){ + LOGE("fail search set MAX_PRESET reg\n"); + return FM_JNI_FAILURE; + } + if ( hci_w(BCM4325_I2C_FM_SEARCH_CTRL0, (dir ? BCM4325_FM_SEARCH_CTRL0_UP : BCM4325_FM_SEARCH_CTRL0_DOWN ) | BCM4325_FLAG_STEREO_ACTIVE | BCM4325_FLAG_STEREO_DETECTION ) < 0){ + LOGE("fail search set SEARCH_CTRL0 reg\n"); + return FM_JNI_FAILURE; + } android_hardware_fmradio_FmReceiverJNI_setFreqNative(NULL,NULL,NULL,oldFreq+(dir?100:-100)); - - if ( hci_w(BCM4325_I2C_FM_SEARCH_CTRL0, (dir ? BCM4325_FM_SEARCH_CTRL0_UP : BCM4325_FM_SEARCH_CTRL0_DOWN ) | BCM4325_FLAG_STEREO_ACTIVE | BCM4325_FLAG_STEREO_DETECTION ) < 0){ - LOGE("fail search up/down\n"); - return FM_JNI_FAILURE; - } - - if ( hci_w(BCM4325_I2C_FM_SEARCH_METHOD, BCM4325_SEARCH_NORMAL) < 0){ - LOGE("fail search method\n"); - return FM_JNI_FAILURE; - } - - if ( hci_w(BCM4325_I2C_FM_SEARCH_TUNE_MODE, BCM4325_FM_AUTO_SEARCH_MODE) < 0){ - LOGE("fail tuning\n"); - return FM_JNI_FAILURE; + if ( hci_w(BCM4325_I2C_FM_SEARCH_TUNE_MODE, BCM4325_FM_AUTO_SEARCH_MODE) < 0){ + LOGE("fail tuning\n"); + return FM_JNI_FAILURE; + } } - // before returning wait for tuning to finish and seek to start. // I have seen this go into an infinite loop once, so limit it to 20 iterations (usually takes 1-4). for (int i=0; i < 20 && android_hardware_fmradio_FmReceiverJNI_getFreqNative(NULL,NULL,NULL) == oldFreq+(dir?100:-100); i++){ |