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