Home | History | Annotate | Download | only in fmr
      1 /*
      2  * Copyright (C) 2014 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 #ifndef __FMR_H__
     18 #define __FMR_H__
     19 
     20 #include <jni.h>
     21 #include <utils/Log.h>
     22 #include <stdio.h>
     23 #include <stdlib.h>
     24 #include <sys/ioctl.h>
     25 #include <sys/types.h>
     26 #include <sys/stat.h>
     27 #include <fcntl.h>
     28 #include <unistd.h>
     29 #include <termios.h>
     30 #include <pthread.h>
     31 #include <signal.h>
     32 #include <errno.h>
     33 #include <dlfcn.h>
     34 
     35 #include "fm.h"
     36 
     37 #undef FM_LIB_USE_XLOG
     38 
     39 #ifdef FM_LIB_USE_XLOG
     40 #include <cutils/xlog.h>
     41 #undef LOGV
     42 #define LOGV(...) XLOGV(__VA_ARGS__)
     43 #undef LOGD
     44 #define LOGD(...) XLOGD(__VA_ARGS__)
     45 #undef LOGI
     46 #define LOGI(...) XLOGI(__VA_ARGS__)
     47 #undef LOGW
     48 #define LOGW(...) XLOGW(__VA_ARGS__)
     49 #undef LOGE
     50 #define LOGE(...) XLOGE(__VA_ARGS__)
     51 #else
     52 #undef LOGV
     53 #define LOGV(...) ALOGV(__VA_ARGS__)
     54 #undef LOGD
     55 #define LOGD(...) ALOGD(__VA_ARGS__)
     56 #undef LOGI
     57 #define LOGI(...) ALOGI(__VA_ARGS__)
     58 #undef LOGW
     59 #define LOGW(...) ALOGW(__VA_ARGS__)
     60 #undef LOGE
     61 #define LOGE(...) ALOGE(__VA_ARGS__)
     62 #endif
     63 
     64 #define CUST_LIB_NAME "libfmcust.so"
     65 #define FM_DEV_NAME "/dev/fm"
     66 
     67 #define FM_RDS_PS_LEN 8
     68 
     69 struct fm_fake_channel
     70 {
     71     int freq;
     72     int rssi_th;
     73     int reserve;
     74 };
     75 
     76 struct fm_fake_channel_t
     77 {
     78     int size;
     79     struct fm_fake_channel *chan;
     80 };
     81 
     82 struct CUST_cfg_ds
     83 {
     84     int16_t chip;
     85     int32_t band;
     86     int32_t low_band;
     87     int32_t high_band;
     88     int32_t seek_space;
     89     int32_t max_scan_num;
     90     int32_t seek_lev;
     91     int32_t scan_sort;
     92     int32_t short_ana_sup;
     93     int32_t rssi_th_l2;
     94     struct fm_fake_channel_t *fake_chan;
     95 };
     96 
     97 struct fm_cbk_tbl {
     98     //Basic functions.
     99     int (*open_dev)(const char *pname, int *fd);
    100     int (*close_dev)(int fd);
    101     int (*pwr_up)(int fd, int band, int freq);
    102     int (*pwr_down)(int fd, int type);
    103     int (*seek)(int fd, int *freq, int band, int dir, int lev);
    104     int (*scan)(int fd, uint16_t *tbl, int *num, int band, int sort);
    105     int (*stop_scan)(int fd);
    106     int (*tune)(int fd, int freq, int band);
    107     int (*set_mute)(int fd, int mute);
    108     int (*is_rdsrx_support)(int fd, int *supt);
    109     int (*turn_on_off_rds)(int fd, int onoff);
    110     int (*get_chip_id)(int fd, int *chipid);
    111     //FOR RDS RX.
    112     int (*read_rds_data)(int fd, RDSData_Struct *rds, uint16_t *rds_status);
    113     int (*get_ps)(int fd, RDSData_Struct *rds, uint8_t **ps, int *ps_len);
    114     int (*get_rt)(int fd, RDSData_Struct *rds, uint8_t **rt, int *rt_len);
    115     int (*active_af)(int fd, RDSData_Struct *rds, int band, uint16_t cur_freq, uint16_t *ret_freq);
    116     //FM long/short antenna switch
    117     int (*ana_switch)(int fd, int antenna);
    118     int (*soft_mute_tune)(int fd, fm_softmute_tune_t *para);
    119     int (*desense_check)(int fd, int freq, int rssi);
    120     int (*pre_search)(int fd);
    121     int (*restore_search)(int fd);
    122 };
    123 
    124 typedef int (*CUST_func_type)(struct CUST_cfg_ds *);
    125 typedef void (*init_func_type)(struct fm_cbk_tbl *);
    126 
    127 struct fmr_ds {
    128     int fd;
    129     int err;
    130     uint16_t cur_freq;
    131     uint16_t backup_freq;
    132     void *priv;
    133     void *custom_handler;
    134     struct CUST_cfg_ds cfg_data;
    135     struct fm_cbk_tbl tbl;
    136     CUST_func_type get_cfg;
    137     void *init_handler;
    138     init_func_type init_func;
    139     RDSData_Struct rds;
    140     struct fm_hw_info hw_info;
    141     fm_bool scan_stop;
    142 };
    143 
    144 enum fmr_err_em {
    145     ERR_SUCCESS = 1000, // kernel error begin at here
    146     ERR_INVALID_BUF,
    147     ERR_INVALID_PARA,
    148     ERR_STP,
    149     ERR_GET_MUTEX,
    150     ERR_FW_NORES,
    151     ERR_RDS_CRC,
    152     ERR_INVALID_FD, //  native error begin at here
    153     ERR_UNSUPPORT_CHIP,
    154     ERR_LD_LIB,
    155     ERR_FIND_CUST_FNUC,
    156     ERR_UNINIT,
    157     ERR_NO_MORE_IDX,
    158     ERR_RDS_NO_DATA,
    159     ERR_UNSUPT_SHORTANA,
    160     ERR_MAX
    161 };
    162 
    163 enum fmr_rds_onoff {
    164     FMR_RDS_ON,
    165     FMR_RDS_OFF,
    166     FMR_MAX
    167 };
    168 
    169 typedef enum {
    170     FM_LONG_ANA = 0,
    171     FM_SHORT_ANA
    172 } fm_antenna_type;
    173 
    174 
    175 #define CQI_CH_NUM_MAX 255
    176 #define CQI_CH_NUM_MIN 0
    177 
    178 
    179 /****************** Function declaration ******************/
    180 //fmr_err.cpp
    181 char *FMR_strerr();
    182 void FMR_seterr(int err);
    183 
    184 //fmr_core.cpp
    185 int FMR_init(void);
    186 int FMR_get_cfgs(int idx);
    187 int FMR_open_dev(int idx);
    188 int FMR_close_dev(int idx);
    189 int FMR_pwr_up(int idx, int freq);
    190 int FMR_pwr_down(int idx, int type);
    191 int FMR_seek(int idx, int start_freq, int dir, int *ret_freq);
    192 int FMR_scan(int idx, uint16_t *tbl, int *num);
    193 int FMR_stop_scan(int idx);
    194 int FMR_tune(int idx, int freq);
    195 int FMR_set_mute(int idx, int mute);
    196 int FMR_is_rdsrx_support(int idx, int *supt);
    197 int FMR_turn_on_off_rds(int idx, int onoff);
    198 int FMR_get_chip_id(int idx, int *chipid);
    199 int FMR_read_rds_data(int idx, uint16_t *rds_status);
    200 int FMR_get_ps(int idx, uint8_t **ps, int *ps_len);
    201 int FMR_get_rssi(int idx, int *rssi);
    202 int FMR_get_rt(int idx, uint8_t **rt, int *rt_len);
    203 int FMR_active_af(int idx, uint16_t *ret_freq);
    204 
    205 int FMR_ana_switch(int idx, int antenna);
    206 int FMR_Pre_Search(int idx);
    207 int FMR_Restore_Search(int idx);
    208 
    209 //common part
    210 int COM_open_dev(const char *pname, int *fd);
    211 int COM_close_dev(int fd);
    212 int COM_pwr_up(int fd, int band, int freq);
    213 int COM_pwr_down(int fd, int type);
    214 int COM_seek(int fd, int *freq, int band, int dir, int lev);
    215 int COM_Soft_Mute_Tune(int fd, fm_softmute_tune_t *para);
    216 
    217 int COM_stop_scan(int fd);
    218 int COM_tune(int fd, int freq, int band);
    219 int COM_set_mute(int fd, int mute);
    220 int COM_is_rdsrx_support(int fd, int *supt);
    221 int COM_turn_on_off_rds(int fd, int onoff);
    222 int COM_get_chip_id(int fd, int *chipid);
    223 int COM_read_rds_data(int fd, RDSData_Struct *rds, uint16_t *rds_status);
    224 int COM_get_ps(int fd, RDSData_Struct *rds, uint8_t **ps, int *ps_len);
    225 int COM_get_rt(int fd, RDSData_Struct *rds, uint8_t **rt, int *rt_len);
    226 int COM_active_af(int fd, RDSData_Struct *rds, int band, uint16_t cur_freq, uint16_t *ret_freq);
    227 
    228 int COM_ana_switch(int fd, int antenna);
    229 int COM_desense_check(int fd, int freq, int rssi);
    230 int COM_pre_search(int fd);
    231 int COM_restore_search(int fd);
    232 void FM_interface_init(struct fm_cbk_tbl *cbk_tbl);
    233 
    234 #define FMR_ASSERT(a) { \
    235     if ((a) == NULL) { \
    236         LOGE("%s,invalid buf\n", __func__);\
    237         return -ERR_INVALID_BUF; \
    238     } \
    239 }
    240 #endif
    241 
    242