C++程序  |  242行  |  6.39 KB

/*
 * Copyright (C) 2014 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef __FMR_H__
#define __FMR_H__

#include <jni.h>
#include <utils/Log.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <termios.h>
#include <pthread.h>
#include <signal.h>
#include <errno.h>
#include <dlfcn.h>

#include "fm.h"

#undef FM_LIB_USE_XLOG

#ifdef FM_LIB_USE_XLOG
#include <cutils/xlog.h>
#undef LOGV
#define LOGV(...) XLOGV(__VA_ARGS__)
#undef LOGD
#define LOGD(...) XLOGD(__VA_ARGS__)
#undef LOGI
#define LOGI(...) XLOGI(__VA_ARGS__)
#undef LOGW
#define LOGW(...) XLOGW(__VA_ARGS__)
#undef LOGE
#define LOGE(...) XLOGE(__VA_ARGS__)
#else
#undef LOGV
#define LOGV(...) ALOGV(__VA_ARGS__)
#undef LOGD
#define LOGD(...) ALOGD(__VA_ARGS__)
#undef LOGI
#define LOGI(...) ALOGI(__VA_ARGS__)
#undef LOGW
#define LOGW(...) ALOGW(__VA_ARGS__)
#undef LOGE
#define LOGE(...) ALOGE(__VA_ARGS__)
#endif

#define CUST_LIB_NAME "libfmcust.so"
#define FM_DEV_NAME "/dev/fm"

#define FM_RDS_PS_LEN 8

struct fm_fake_channel
{
    int freq;
    int rssi_th;
    int reserve;
};

struct fm_fake_channel_t
{
    int size;
    struct fm_fake_channel *chan;
};

struct CUST_cfg_ds
{
    int16_t chip;
    int32_t band;
    int32_t low_band;
    int32_t high_band;
    int32_t seek_space;
    int32_t max_scan_num;
    int32_t seek_lev;
    int32_t scan_sort;
    int32_t short_ana_sup;
    int32_t rssi_th_l2;
    struct fm_fake_channel_t *fake_chan;
};

struct fm_cbk_tbl {
    //Basic functions.
    int (*open_dev)(const char *pname, int *fd);
    int (*close_dev)(int fd);
    int (*pwr_up)(int fd, int band, int freq);
    int (*pwr_down)(int fd, int type);
    int (*seek)(int fd, int *freq, int band, int dir, int lev);
    int (*scan)(int fd, uint16_t *tbl, int *num, int band, int sort);
    int (*stop_scan)(int fd);
    int (*tune)(int fd, int freq, int band);
    int (*set_mute)(int fd, int mute);
    int (*is_rdsrx_support)(int fd, int *supt);
    int (*turn_on_off_rds)(int fd, int onoff);
    int (*get_chip_id)(int fd, int *chipid);
    //FOR RDS RX.
    int (*read_rds_data)(int fd, RDSData_Struct *rds, uint16_t *rds_status);
    int (*get_ps)(int fd, RDSData_Struct *rds, uint8_t **ps, int *ps_len);
    int (*get_rt)(int fd, RDSData_Struct *rds, uint8_t **rt, int *rt_len);
    int (*active_af)(int fd, RDSData_Struct *rds, int band, uint16_t cur_freq, uint16_t *ret_freq);
    //FM long/short antenna switch
    int (*ana_switch)(int fd, int antenna);
    int (*soft_mute_tune)(int fd, fm_softmute_tune_t *para);
    int (*desense_check)(int fd, int freq, int rssi);
    int (*pre_search)(int fd);
    int (*restore_search)(int fd);
};

typedef int (*CUST_func_type)(struct CUST_cfg_ds *);
typedef void (*init_func_type)(struct fm_cbk_tbl *);

struct fmr_ds {
    int fd;
    int err;
    uint16_t cur_freq;
    uint16_t backup_freq;
    void *priv;
    void *custom_handler;
    struct CUST_cfg_ds cfg_data;
    struct fm_cbk_tbl tbl;
    CUST_func_type get_cfg;
    void *init_handler;
    init_func_type init_func;
    RDSData_Struct rds;
    struct fm_hw_info hw_info;
    fm_bool scan_stop;
};

enum fmr_err_em {
    ERR_SUCCESS = 1000, // kernel error begin at here
    ERR_INVALID_BUF,
    ERR_INVALID_PARA,
    ERR_STP,
    ERR_GET_MUTEX,
    ERR_FW_NORES,
    ERR_RDS_CRC,
    ERR_INVALID_FD, //  native error begin at here
    ERR_UNSUPPORT_CHIP,
    ERR_LD_LIB,
    ERR_FIND_CUST_FNUC,
    ERR_UNINIT,
    ERR_NO_MORE_IDX,
    ERR_RDS_NO_DATA,
    ERR_UNSUPT_SHORTANA,
    ERR_MAX
};

enum fmr_rds_onoff {
    FMR_RDS_ON,
    FMR_RDS_OFF,
    FMR_MAX
};

typedef enum {
    FM_LONG_ANA = 0,
    FM_SHORT_ANA
} fm_antenna_type;


#define CQI_CH_NUM_MAX 255
#define CQI_CH_NUM_MIN 0


/****************** Function declaration ******************/
//fmr_err.cpp
char *FMR_strerr();
void FMR_seterr(int err);

//fmr_core.cpp
int FMR_init(void);
int FMR_get_cfgs(int idx);
int FMR_open_dev(int idx);
int FMR_close_dev(int idx);
int FMR_pwr_up(int idx, int freq);
int FMR_pwr_down(int idx, int type);
int FMR_seek(int idx, int start_freq, int dir, int *ret_freq);
int FMR_scan(int idx, uint16_t *tbl, int *num);
int FMR_stop_scan(int idx);
int FMR_tune(int idx, int freq);
int FMR_set_mute(int idx, int mute);
int FMR_is_rdsrx_support(int idx, int *supt);
int FMR_turn_on_off_rds(int idx, int onoff);
int FMR_get_chip_id(int idx, int *chipid);
int FMR_read_rds_data(int idx, uint16_t *rds_status);
int FMR_get_ps(int idx, uint8_t **ps, int *ps_len);
int FMR_get_rssi(int idx, int *rssi);
int FMR_get_rt(int idx, uint8_t **rt, int *rt_len);
int FMR_active_af(int idx, uint16_t *ret_freq);

int FMR_ana_switch(int idx, int antenna);
int FMR_Pre_Search(int idx);
int FMR_Restore_Search(int idx);

//common part
int COM_open_dev(const char *pname, int *fd);
int COM_close_dev(int fd);
int COM_pwr_up(int fd, int band, int freq);
int COM_pwr_down(int fd, int type);
int COM_seek(int fd, int *freq, int band, int dir, int lev);
int COM_Soft_Mute_Tune(int fd, fm_softmute_tune_t *para);

int COM_stop_scan(int fd);
int COM_tune(int fd, int freq, int band);
int COM_set_mute(int fd, int mute);
int COM_is_rdsrx_support(int fd, int *supt);
int COM_turn_on_off_rds(int fd, int onoff);
int COM_get_chip_id(int fd, int *chipid);
int COM_read_rds_data(int fd, RDSData_Struct *rds, uint16_t *rds_status);
int COM_get_ps(int fd, RDSData_Struct *rds, uint8_t **ps, int *ps_len);
int COM_get_rt(int fd, RDSData_Struct *rds, uint8_t **rt, int *rt_len);
int COM_active_af(int fd, RDSData_Struct *rds, int band, uint16_t cur_freq, uint16_t *ret_freq);

int COM_ana_switch(int fd, int antenna);
int COM_desense_check(int fd, int freq, int rssi);
int COM_pre_search(int fd);
int COM_restore_search(int fd);
void FM_interface_init(struct fm_cbk_tbl *cbk_tbl);

#define FMR_ASSERT(a) { \
    if ((a) == NULL) { \
        LOGE("%s,invalid buf\n", __func__);\
        return -ERR_INVALID_BUF; \
    } \
}
#endif