• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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