fm: Added support for configuring performance parameters
Add apis to configure fm performance related parameters.
CRs-Fixed: 671803
Change-Id: I37565c21a731023e42372be71fb28edc30154672
diff --git a/jni/FmPerformanceParams.cpp b/jni/FmPerformanceParams.cpp
new file mode 100644
index 0000000..bdd0a43
--- /dev/null
+++ b/jni/FmPerformanceParams.cpp
@@ -0,0 +1,422 @@
+/*
+ * Copyright (c) 2014, The Linux Foundation. All rights reserved.
+
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of The Linux Foundation nor
+ * the names of its contributors may be used to endorse or promote
+ * products derived from this software without specific prior written
+ * permission.
+
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "FmPerformanceParams.h"
+#include "FmIoctlsInterface.h"
+
+#include <cstdio>
+#include <linux/videodev2.h>
+#include <utils/Log.h>
+
+signed char FmPerformanceParams :: SetAfRmssiTh
+(
+ UINT fd, unsigned short th
+)
+{
+ signed char ret = FM_FAILURE;
+
+ ret = FmIoctlsInterface::set_control(fd,
+ V4L2_CID_PRV_AF_RMSSI_TH, th);
+
+ return ret;
+}
+
+signed char FmPerformanceParams :: SetAfRmssiSamplesCnt
+(
+ UINT fd, unsigned char cnt
+)
+{
+ signed char ret = FM_FAILURE;
+
+ ret = FmIoctlsInterface::set_control(fd,
+ V4L2_CID_PRV_AF_RMSSI_SAMPLES, cnt);
+
+ return ret;
+}
+
+signed char FmPerformanceParams :: SetGoodChannelRmssiTh
+(
+ UINT fd, signed char th
+)
+{
+ signed char ret = FM_FAILURE;
+
+ ret = FmIoctlsInterface::set_control(fd,
+ V4L2_CID_PRV_GOOD_CH_RMSSI_TH, th);
+
+ return ret;
+}
+
+signed char FmPerformanceParams :: SetSrchAlgoType
+(
+ UINT fd, unsigned char algo
+)
+{
+ signed char ret = FM_FAILURE;
+
+ ret = FmIoctlsInterface::set_control(fd,
+ V4L2_CID_PRV_SRCHALGOTYPE, algo);
+
+ return ret;
+}
+
+signed char FmPerformanceParams :: SetSinrFirstStage
+(
+ UINT fd, signed char th
+)
+{
+ signed char ret = FM_FAILURE;
+
+ ret = FmIoctlsInterface::set_control(fd,
+ V4L2_CID_PRV_SINRFIRSTSTAGE, th);
+
+ return ret;
+}
+
+signed char FmPerformanceParams :: SetRmssiFirstStage
+(
+ UINT fd, signed char th
+)
+{
+ signed char ret = FM_FAILURE;
+
+ ret = FmIoctlsInterface::set_control(fd,
+ V4L2_CID_PRV_RMSSIFIRSTSTAGE, th);
+
+ return ret;
+}
+
+signed char FmPerformanceParams :: SetCf0Th12
+(
+ UINT fd, int th
+)
+{
+ signed char ret = FM_FAILURE;
+
+ ret = FmIoctlsInterface::set_control(fd,
+ V4L2_CID_PRV_CF0TH12, th);
+ return ret;
+}
+
+signed char FmPerformanceParams :: SetSinrSamplesCnt
+(
+ UINT fd, unsigned char cnt
+)
+{
+ signed char ret = FM_FAILURE;
+
+ ret = FmIoctlsInterface::set_control(fd,
+ V4L2_CID_PRV_SINR_SAMPLES, cnt);
+
+ return ret;
+}
+
+signed char FmPerformanceParams :: SetIntfLowTh
+(
+ UINT fd, unsigned char th
+)
+{
+ signed char ret = FM_FAILURE;
+
+ ret = FmIoctlsInterface::set_control(fd,
+ V4L2_CID_PRV_ON_CHANNEL_THRESHOLD, th);
+
+ return ret;
+}
+
+signed char FmPerformanceParams :: SetIntfHighTh
+(
+ UINT fd, unsigned char th
+)
+{
+ signed char ret = FM_FAILURE;
+
+ ret = FmIoctlsInterface::set_control(fd,
+ V4L2_CID_PRV_OFF_CHANNEL_THRESHOLD, th);
+ return ret;
+}
+
+signed char FmPerformanceParams :: SetSinrFinalStage
+(
+ UINT fd, signed char th
+)
+{
+ signed char ret = FM_FAILURE;
+
+ ret = FmIoctlsInterface::set_control(fd,
+ V4L2_CID_PRV_SINR_THRESHOLD, th);
+
+ return ret;
+}
+
+signed char FmPerformanceParams :: GetAfRmssiTh
+(
+ UINT fd, unsigned short &th
+)
+{
+ long int af_rmssi_th;
+ signed char ret = FM_FAILURE;
+
+ ret = FmIoctlsInterface::get_control(fd,
+ V4L2_CID_PRV_AF_RMSSI_TH, af_rmssi_th);
+ if(ret == FM_SUCCESS) {
+ th = af_rmssi_th;
+ }
+ return ret;
+}
+
+signed char FmPerformanceParams :: GetAfRmssiSamplesCnt
+(
+ UINT fd, unsigned char &cnt
+)
+{
+ long int af_samples_cnt;
+ signed char ret = FM_FAILURE;
+
+ ret = FmIoctlsInterface::get_control(fd,
+ V4L2_CID_PRV_AF_RMSSI_SAMPLES, af_samples_cnt);
+ if(ret == FM_SUCCESS) {
+ cnt = af_samples_cnt;
+ }
+ return ret;
+}
+
+signed char FmPerformanceParams :: GetGoodChannelRmssiTh
+(
+ UINT fd, signed char &th
+)
+{
+ long int gd_chan_rmssi_th;
+ signed char ret = FM_FAILURE;
+
+ ret = FmIoctlsInterface::get_control(fd,
+ V4L2_CID_PRV_GOOD_CH_RMSSI_TH, gd_chan_rmssi_th);
+ if(ret == FM_SUCCESS) {
+ th = gd_chan_rmssi_th;
+ }
+ return ret;
+}
+
+signed char FmPerformanceParams :: GetSrchAlgoType
+(
+ UINT fd, unsigned char &algo
+)
+{
+ long int srch_algo_type;
+ signed char ret = FM_FAILURE;
+
+ ret = FmIoctlsInterface::get_control(fd,
+ V4L2_CID_PRV_SRCHALGOTYPE, srch_algo_type);
+ if(ret == FM_SUCCESS) {
+ algo = srch_algo_type;
+ }
+ return ret;
+}
+
+signed char FmPerformanceParams :: GetSinrFirstStage
+(
+ UINT fd, signed char &th
+)
+{
+ long int sinr_first_stage;
+ signed char ret = FM_FAILURE;
+
+ ret = FmIoctlsInterface::get_control(fd,
+ V4L2_CID_PRV_SINRFIRSTSTAGE, sinr_first_stage);
+ if(ret == FM_SUCCESS) {
+ th = sinr_first_stage;
+ }
+ return ret;
+}
+
+signed char FmPerformanceParams :: GetRmssiFirstStage
+(
+ UINT fd, signed char &th
+)
+{
+ long int rmssi_first_stage;
+ signed char ret = FM_FAILURE;
+
+ ret = FmIoctlsInterface::get_control(fd,
+ V4L2_CID_PRV_RMSSIFIRSTSTAGE, rmssi_first_stage);
+ if(ret == FM_SUCCESS) {
+ th = rmssi_first_stage;
+ }
+ return ret;
+}
+
+signed char FmPerformanceParams :: GetCf0Th12
+(
+ UINT fd, int &th
+)
+{
+ long int cf0th12;
+ signed char ret = FM_FAILURE;
+
+ ret = FmIoctlsInterface::get_control(fd,
+ V4L2_CID_PRV_CF0TH12, cf0th12);
+ if(ret == FM_SUCCESS) {
+ th = cf0th12;
+ }
+ return ret;
+}
+
+signed char FmPerformanceParams :: GetSinrSamplesCnt
+(
+ UINT fd, unsigned char &cnt
+)
+{
+ long int sinr_samples_cnt;
+ signed char ret = FM_FAILURE;
+
+ ret = FmIoctlsInterface::get_control(fd,
+ V4L2_CID_PRV_SINR_SAMPLES, sinr_samples_cnt);
+ if(ret == FM_SUCCESS) {
+ cnt = sinr_samples_cnt;
+ }
+ return ret;
+}
+
+signed char FmPerformanceParams :: GetIntfLowTh
+(
+ UINT fd, unsigned char &th
+)
+{
+ long int intf_low_th;
+ signed char ret = FM_FAILURE;
+
+ ret = FmIoctlsInterface::get_control(fd,
+ V4L2_CID_PRV_ON_CHANNEL_THRESHOLD, intf_low_th);
+ if(ret == FM_SUCCESS) {
+ th = intf_low_th;
+ }
+ return ret;
+}
+
+signed char FmPerformanceParams :: GetIntfHighTh
+(
+ UINT fd, unsigned char &th
+)
+{
+ long int intf_high_th;
+ signed char ret = FM_FAILURE;
+
+ ret = FmIoctlsInterface::get_control(fd,
+ V4L2_CID_PRV_OFF_CHANNEL_THRESHOLD, intf_high_th);
+ if(ret == FM_SUCCESS) {
+ th = intf_high_th;
+ }
+ return ret;
+}
+
+signed char FmPerformanceParams :: GetIntfDet
+(
+ UINT fd, unsigned char &th
+)
+{
+ long int int_det;
+ signed char ret = FM_FAILURE;
+
+ ret = FmIoctlsInterface::get_control(fd,
+ V4L2_CID_PRV_INTDET, int_det);
+ if(ret == FM_SUCCESS) {
+ th = int_det;
+ }
+ return ret;
+}
+signed char FmPerformanceParams :: GetSinrFinalStage
+(
+ UINT fd, signed char &th
+)
+{
+ signed char ret = FM_FAILURE;
+ long int sinr;
+
+ ret = FmIoctlsInterface::get_control(fd,
+ V4L2_CID_PRV_SINR_THRESHOLD, sinr);
+
+ if(ret == FM_SUCCESS) {
+ th = sinr;
+ }
+ return ret;
+}
+
+signed char FmPerformanceParams :: SetHybridSrchList
+(
+ UINT fd,
+ unsigned int *freqs,
+ signed char *sinrs,
+ unsigned int n
+)
+{
+ struct v4l2_ext_control ext_ctl;
+ struct v4l2_ext_controls v4l2_ctls;
+ unsigned int freq;
+ signed char sinr;
+ unsigned int size = 0;
+ char *data = NULL;
+ signed char ret = FM_FAILURE;
+
+ if(n <= 0) {
+ return ret;
+ }
+ data = new char[(n * 3 + 3)];
+
+ if(data != NULL) {
+ data[size++] = 0x40;
+ data[size++] = ((n * 3) + 1);
+ data[size++] = n;
+ while((size < (n * 3 + 2)) && (freqs != NULL)
+ && (sinrs != NULL)) {
+ freq = (*freqs - 76000) / 50;
+ data[size++] = (freq & 0xff);
+ data[size++] = ((freq >> 8) & 0xff);
+ data[size++] = *sinrs;
+ freqs++;
+ sinrs++;
+ }
+ if(size == (n * 3 + 3)) {
+ ext_ctl.id = V4L2_CID_PRV_IRIS_WRITE_DEFAULT;
+ ext_ctl.string = data;
+ ext_ctl.size = size;
+ v4l2_ctls.ctrl_class = V4L2_CTRL_CLASS_USER;
+ v4l2_ctls.count = 1;
+ v4l2_ctls.controls = &ext_ctl;
+ ret = FmIoctlsInterface::set_ext_control(fd, &v4l2_ctls);
+ if(ret == FM_SUCCESS) {
+ ALOGE("hybrid srch list sent successfully\n");
+ }else {
+ ALOGE("hybrid srch list setting failed\n");
+ }
+ }
+ }
+
+ delete []data;
+
+ return ret;
+}