12c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang/*
22c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang * Copyright (C) 2014 The Android Open Source Project
32c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang *
42c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang * Licensed under the Apache License, Version 2.0 (the "License");
52c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang * you may not use this file except in compliance with the License.
62c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang * You may obtain a copy of the License at
72c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang *
82c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang *      http://www.apache.org/licenses/LICENSE-2.0
92c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang *
102c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang * Unless required by applicable law or agreed to in writing, software
112c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang * distributed under the License is distributed on an "AS IS" BASIS,
122c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
132c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang * See the License for the specific language governing permissions and
142c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang * limitations under the License.
152c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang */
162c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang
172c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang#ifndef __FM_H__
182c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang#define __FM_H__
192c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang
202c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang#include <linux/ioctl.h>
212c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang#include <linux/time.h>
222c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang
232c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huangtypedef signed char fm_s8;
242c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huangtypedef signed short fm_s16;
252c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huangtypedef signed int fm_s32;
262c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huangtypedef signed long long fm_s64;
272c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huangtypedef unsigned char fm_u8;
282c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huangtypedef unsigned short fm_u16;
292c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huangtypedef unsigned int fm_u32;
302c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huangtypedef unsigned long long fm_u64;
312c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huangtypedef enum fm_bool {
322c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    fm_false = 0,
332c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    fm_true  = 1
342c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang} fm_bool;
352c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang
362c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang// scan sort algorithm
372c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huangenum {
382c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    FM_SCAN_SORT_NON = 0,
392c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    FM_SCAN_SORT_UP,
402c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    FM_SCAN_SORT_DOWN,
412c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    FM_SCAN_SORT_MAX
422c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang};
432c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang
442c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang// scan methods
452c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huangenum {
462c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    FM_SCAN_SEL_HW = 0, // select hardware scan, advantage: fast
472c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    FM_SCAN_SEL_SW, // select software scan, advantage: more accurate
482c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    FM_SCAN_SEL_MAX
492c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang};
502c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang
512c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang//*****************************************************************************************
522c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang//***********************************FM config for customer *******************************
532c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang//*****************************************************************************************
542c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang#define FMR_RSSI_TH_LONG    0x0301 // FM radio long antenna RSSI threshold(11.375dBuV)
552c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang#define FMR_RSSI_TH_SHORT   0x02E0 // FM radio short antenna RSSI threshold(-1dBuV)
562c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang#define FMR_CQI_TH          0x00E9 // FM radio Channel quality indicator threshold(0x0000~0x00FF)
572c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang#define FMR_SEEK_SPACE      1 // FM radio seek space,1:100KHZ; 2:200KHZ
582c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang#define FMR_SCAN_CH_SIZE    40 // FM radio scan max channel size
592c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang#define FMR_BAND            1 // FM radio band, 1:87.5MHz~108.0MHz; 2:76.0MHz~90.0MHz;
602c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang                              // 3:76.0MHz~108.0MHz; 4:special
612c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang#define FMR_BAND_FREQ_L     875 // FM radio special band low freq(Default 87.5MHz)
622c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang#define FMR_BAND_FREQ_H     1080 // FM radio special band high freq(Default 108.0MHz)
632c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang#define FM_SCAN_SORT_SELECT FM_SCAN_SORT_NON
642c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang#define FM_SCAN_SELECT      FM_SCAN_SEL_HW
652c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang#define FM_SCAN_SOFT_MUTE_GAIN_TH  3 // soft-mute threshold when software scan, rang: 0~3,
662c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang                                     // 0 means better audio quality but less channel
672c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang#define FM_CHIP_DESE_RSSI_TH (-102) // rang: -102 ~ -72
682c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang
692c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang//*****************************************************************************************
702c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang//***********************************FM config for engineer *******************************
712c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang//*****************************************************************************************
722c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang#define FMR_MR_TH           0x01BD // FM radio MR threshold
732c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang#define ADDR_SCAN_TH        0xE0 // scan thrshold register
742c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang#define ADDR_CQI_TH         0xE1 // scan CQI register
752c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang//*****************************************************************************************
762c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang
772c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang#define FM_NAME             "fm"
782c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang#define FM_DEVICE_NAME      "/dev/fm"
792c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang
802c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang// errno
812c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang#define FM_SUCCESS      0
822c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang#define FM_FAILED       1
832c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang#define FM_EPARM        2
842c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang#define FM_BADSTATUS    3
852c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang#define FM_TUNE_FAILED  4
862c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang#define FM_SEEK_FAILED  5
872c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang#define FM_BUSY         6
882c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang#define FM_SCAN_FAILED  7
892c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang
902c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang// band
912c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang#define FM_BAND_UNKNOWN 0
922c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang#define FM_BAND_UE      1 // US/Europe band  87.5MHz ~ 108MHz (DEFAULT)
932c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang#define FM_BAND_JAPAN   2 // Japan band      76MHz   ~ 90MHz
942c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang#define FM_BAND_JAPANW  3 // Japan wideband  76MHZ   ~ 108MHz
952c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang#define FM_BAND_SPECIAL 4 // special   band  between 76MHZ   and  108MHz
962c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang#define FM_BAND_DEFAULT FM_BAND_UE
972c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang
982c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang#define FM_UE_FREQ_MIN  875
992c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang#define FM_UE_FREQ_MAX  1080
1002c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang#define FM_JP_FREQ_MIN  760
1012c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang#define FM_JP_FREQ_MAX  1080
1022c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang#define FM_FREQ_MIN  FMR_BAND_FREQ_L
1032c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang#define FM_FREQ_MAX  FMR_BAND_FREQ_H
1042c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang#define FM_RAIDO_BAND FM_BAND_UE
1052c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang
1062c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang// space
1072c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang#define FM_SPACE_UNKNOWN    0
1082c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang#define FM_SPACE_100K       1
1092c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang#define FM_SPACE_200K       2
1102c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang#define FM_SPACE_50K        5
1112c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang#define FM_SPACE_DEFAULT    FM_SPACE_100K
1122c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang
1132c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang#define FM_SEEK_SPACE FMR_SEEK_SPACE
1142c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang
1152c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang// max scan channel num
1162c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang#define FM_MAX_CHL_SIZE FMR_SCAN_CH_SIZE
1172c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang// auto HiLo
1182c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang#define FM_AUTO_HILO_OFF    0
1192c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang#define FM_AUTO_HILO_ON     1
1202c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang
1212c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang// seek direction
1222c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang#define FM_SEEK_UP          0
1232c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang#define FM_SEEK_DOWN        1
1242c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang
1252c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang// seek threshold
1262c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang#define FM_SEEKTH_LEVEL_DEFAULT 4
1272c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang
1282c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huangstruct fm_tune_parm {
1292c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    uint8_t err;
1302c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    uint8_t band;
1312c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    uint8_t space;
1322c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    uint8_t hilo;
1332c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    uint16_t freq;
1342c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang};
1352c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang
1362c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huangstruct fm_seek_parm {
1372c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    uint8_t err;
1382c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    uint8_t band;
1392c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    uint8_t space;
1402c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    uint8_t hilo;
1412c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    uint8_t seekdir;
1422c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    uint8_t seekth;
1432c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    uint16_t freq;
1442c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang};
1452c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang
1462c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huangstruct fm_scan_parm {
1472c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    uint8_t  err;
1482c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    uint8_t  band;
1492c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    uint8_t  space;
1502c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    uint8_t  hilo;
1512c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    uint16_t freq;
1522c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    uint16_t ScanTBL[16];
1532c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    uint16_t ScanTBLSize;
1542c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang};
1552c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang
1562c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huangstruct fm_ch_rssi {
1572c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    uint16_t freq;
1582c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    int rssi;
1592c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang};
1602c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang
1612c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huangenum fm_scan_cmd_t {
1622c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    FM_SCAN_CMD_INIT = 0,
1632c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    FM_SCAN_CMD_START,
1642c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    FM_SCAN_CMD_GET_NUM,
1652c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    FM_SCAN_CMD_GET_CH,
1662c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    FM_SCAN_CMD_GET_RSSI,
1672c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    FM_SCAN_CMD_GET_CH_RSSI,
1682c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    FM_SCAN_CMD_MAX
1692c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang};
1702c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang
1712c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huangstruct fm_scan_t {
1722c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    enum fm_scan_cmd_t cmd;
1732c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    int ret; // 0, success; else error code
1742c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    uint16_t lower; // lower band, Eg, 7600 -> 76.0Mhz
1752c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    uint16_t upper; // upper band, Eg, 10800 -> 108.0Mhz
1762c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    int space; // 5: 50KHz, 10: 100Khz, 20: 200Khz
1772c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    int num; // valid channel number
1782c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    void *priv;
1792c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    int sr_size; // scan result buffer size in bytes
1802c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    union {
1812c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang        uint16_t *ch_buf; // channel buffer
1822c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang        int *rssi_buf; // rssi buffer
1832c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang        struct fm_ch_rssi *ch_rssi_buf; //channel and RSSI buffer
1842c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    } sr;
1852c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang};
1862c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang
1872c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huangstruct fm_seek_t {
1882c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    int ret; // 0, success; else error code
1892c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    uint16_t freq;
1902c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    uint16_t lower; // lower band, Eg, 7600 -> 76.0Mhz
1912c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    uint16_t upper; // upper band, Eg, 10800 -> 108.0Mhz
1922c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    int space; // 5: 50KHz, 10: 100Khz, 20: 200Khz
1932c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    int dir; // 0: up; 1: down
1942c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    int th; // seek threshold in dbm(Eg, -95dbm)
1952c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    void *priv;
1962c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang};
1972c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang
1982c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huangstruct fm_tune_t {
1992c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    int ret; // 0, success; else error code
2002c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    uint16_t freq;
2012c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    uint16_t lower; // lower band, Eg, 7600 -> 76.0Mhz
2022c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    uint16_t upper; // upper band, Eg, 10800 -> 108.0Mhz
2032c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    int space; // 5: 50KHz, 10: 100Khz, 20: 200Khz
2042c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    void *priv;
2052c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang};
2062c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang
2072c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huangstruct fm_softmute_tune_t {
2082c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    fm_s32 rssi; // RSSI of current channel
2092c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    fm_u16 freq; // current frequency
2102c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    fm_bool valid; // current channel is valid(true) or not(false)
2112c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang};
2122c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang
2132c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huangstruct fm_rssi_req {
2142c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    uint16_t num;
2152c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    uint16_t read_cnt;
2162c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    struct fm_ch_rssi cr[16*16];
2172c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang};
2182c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang
2192c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huangstruct fm_hw_info {
2202c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    int chip_id;
2212c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    int eco_ver;
2222c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    int rom_ver;
2232c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    int patch_ver;
2242c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    int reserve;
2252c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang};
2262c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang
2272c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huangstruct fm_search_threshold_t {
2282c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    fm_s32 th_type;// 0, RSSI. 1,desense RSSI. 2,SMG.
2292c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    fm_s32 th_val; //threshold value
2302c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    fm_s32 reserve;
2312c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang};
2322c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang
2332c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang#define NEED_DEF_RDS 1
2342c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang
2352c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang#if NEED_DEF_RDS
2362c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang//For RDS feature
2372c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huangtypedef struct {
2382c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    uint8_t TP;
2392c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    uint8_t TA;
2402c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    uint8_t Music;
2412c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    uint8_t Stereo;
2422c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    uint8_t Artificial_Head;
2432c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    uint8_t Compressed;
2442c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    uint8_t Dynamic_PTY;
2452c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    uint8_t Text_AB;
2462c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    uint32_t flag_status;
2472c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang} RDSFlag_Struct;
2482c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang
2492c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huangtypedef struct {
2502c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    uint16_t Month;
2512c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    uint16_t Day;
2522c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    uint16_t Year;
2532c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    uint16_t Hour;
2542c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    uint16_t Minute;
2552c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    uint8_t Local_Time_offset_signbit;
2562c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    uint8_t Local_Time_offset_half_hour;
2572c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang} CT_Struct;
2582c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang
2592c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huangtypedef struct {
2602c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    int16_t AF_Num;
2612c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    int16_t AF[2][25];
2622c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    uint8_t Addr_Cnt;
2632c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    uint8_t isMethod_A;
2642c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    uint8_t isAFNum_Get;
2652c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang} AF_Info;
2662c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang
2672c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huangtypedef struct {
2682c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    uint8_t PS[4][8];
2692c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    uint8_t Addr_Cnt;
2702c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang} PS_Info;
2712c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang
2722c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huangtypedef struct {
2732c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    uint8_t TextData[4][64];
2742c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    uint8_t GetLength;
2752c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    uint8_t isRTDisplay;
2762c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    uint8_t TextLength;
2772c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    uint8_t isTypeA;
2782c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    uint8_t BufCnt;
2792c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    uint16_t Addr_Cnt;
2802c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang} RT_Info;
2812c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang
2822c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huangstruct rds_raw_data {
2832c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    int dirty; // indicate if the data changed or not
2842c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    int len; // the data len form chip
2852c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    uint8_t data[146];
2862c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang};
2872c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang
2882c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huangstruct rds_group_cnt {
2892c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    unsigned long total;
2902c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    unsigned long groupA[16]; // RDS groupA counter
2912c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    unsigned long groupB[16]; // RDS groupB counter
2922c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang};
2932c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang
2942c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huangenum rds_group_cnt_opcode {
2952c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    RDS_GROUP_CNT_READ = 0,
2962c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    RDS_GROUP_CNT_WRITE,
2972c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    RDS_GROUP_CNT_RESET,
2982c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    RDS_GROUP_CNT_MAX
2992c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang};
3002c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang
3012c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huangstruct rds_group_cnt_req {
3022c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    int err;
3032c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    enum rds_group_cnt_opcode op;
3042c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    struct rds_group_cnt gc;
3052c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang};
3062c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang
3072c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huangtypedef struct {
3082c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    CT_Struct CT;
3092c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    RDSFlag_Struct RDSFlag;
3102c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    uint16_t PI;
3112c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    uint8_t Switch_TP;
3122c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    uint8_t PTY;
3132c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    AF_Info AF_Data;
3142c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    AF_Info AFON_Data;
3152c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    uint8_t Radio_Page_Code;
3162c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    uint16_t Program_Item_Number_Code;
3172c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    uint8_t Extend_Country_Code;
3182c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    uint16_t Language_Code;
3192c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    PS_Info PS_Data;
3202c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    uint8_t PS_ON[8];
3212c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    RT_Info RT_Data;
3222c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    uint16_t event_status;
3232c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    struct rds_group_cnt gc;
3242c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang} RDSData_Struct;
3252c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang
3262c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang//valid Rds Flag for notify
3272c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huangtypedef enum {
3282c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    RDS_FLAG_IS_TP              = 0x0001, // Program is a traffic program
3292c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    RDS_FLAG_IS_TA              = 0x0002, // Program currently broadcasts a traffic ann.
3302c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    RDS_FLAG_IS_MUSIC           = 0x0004, // Program currently broadcasts music
3312c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    RDS_FLAG_IS_STEREO          = 0x0008, // Program is transmitted in stereo
3322c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    RDS_FLAG_IS_ARTIFICIAL_HEAD = 0x0010, // Program is an artificial head recording
3332c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    RDS_FLAG_IS_COMPRESSED      = 0x0020, // Program content is compressed
3342c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    RDS_FLAG_IS_DYNAMIC_PTY     = 0x0040, // Program type can change
3352c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    RDS_FLAG_TEXT_AB            = 0x0080  // If this flag changes state, a new radio text string begins
3362c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang} RdsFlag;
3372c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang
3382c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huangtypedef enum {
3392c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    RDS_EVENT_FLAGS          = 0x0001, // One of the RDS flags has changed state
3402c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    RDS_EVENT_PI_CODE        = 0x0002, // The program identification code has changed
3412c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    RDS_EVENT_PTY_CODE       = 0x0004, // The program type code has changed
3422c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    RDS_EVENT_PROGRAMNAME    = 0x0008, // The program name has changed
3432c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    RDS_EVENT_UTCDATETIME    = 0x0010, // A new UTC date/time is available
3442c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    RDS_EVENT_LOCDATETIME    = 0x0020, // A new local date/time is available
3452c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    RDS_EVENT_LAST_RADIOTEXT = 0x0040, // A radio text string was completed
3462c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    RDS_EVENT_AF             = 0x0080, // Current Channel RF signal strength too weak, need do AF switch
3472c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    RDS_EVENT_AF_LIST        = 0x0100, // An alternative frequency list is ready
3482c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    RDS_EVENT_AFON_LIST      = 0x0200, // An alternative frequency list is ready
3492c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    RDS_EVENT_TAON           = 0x0400,  // Other Network traffic announcement start
3502c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    RDS_EVENT_TAON_OFF       = 0x0800, // Other Network traffic announcement finished.
3512c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    RDS_EVENT_RDS            = 0x2000, // RDS Interrupt had arrived durint timer period
3522c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    RDS_EVENT_NO_RDS         = 0x4000, // RDS Interrupt not arrived durint timer period
3532c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    RDS_EVENT_RDS_TIMER      = 0x8000 // Timer for RDS Bler Check. ---- BLER  block error rate
3542c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang} RdsEvent;
3552c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang#endif
3562c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang
3572c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huangtypedef enum {
3582c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    FM_I2S_ON = 0,
3592c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    FM_I2S_OFF,
3602c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    FM_I2S_STATE_ERR
3612c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang} fm_i2s_state_e;
3622c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang
3632c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huangtypedef enum {
3642c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    FM_I2S_MASTER = 0,
3652c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    FM_I2S_SLAVE,
3662c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    FM_I2S_MODE_ERR
3672c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang} fm_i2s_mode_e;
3682c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang
3692c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huangtypedef enum {
3702c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    FM_I2S_32K = 0,
3712c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    FM_I2S_44K,
3722c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    FM_I2S_48K,
3732c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    FM_I2S_SR_ERR
3742c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang} fm_i2s_sample_e;
3752c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang
3762c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huangstruct fm_i2s_setting {
3772c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    int onoff;
3782c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    int mode;
3792c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    int sample;
3802c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang};
3812c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang
3822c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huangtypedef enum {
3832c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    FM_RX = 0,
3842c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    FM_TX = 1
3852c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang} FM_PWR_T;
3862c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang
3872c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huangtypedef struct fm_i2s_info {
3882c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    int status; /* 0:FM_I2S_ON, 1:FM_I2S_OFF,2:error */
3892c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    int mode; /* 0:FM_I2S_MASTER, 1:FM_I2S_SLAVE,2:error */
3902c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    int rate; /* 0:FM_I2S_32K:32000,1:FM_I2S_44K:44100,2:FM_I2S_48K:48000,3:error */
3912c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang} fm_i2s_info_t;
3922c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang
3932c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huangtypedef enum {
3942c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    FM_AUD_ANALOG = 0,
3952c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    FM_AUD_I2S = 1,
3962c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    FM_AUD_MRGIF = 2,
3972c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    FM_AUD_ERR
3982c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang} fm_audio_path_e;
3992c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang
4002c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huangtypedef enum {
4012c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    FM_I2S_PAD_CONN = 0,
4022c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    FM_I2S_PAD_IO = 1,
4032c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    FM_I2S_PAD_ERR
4042c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang} fm_i2s_pad_sel_e;
4052c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang
4062c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huangtypedef struct fm_audio_info {
4072c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    fm_audio_path_e aud_path;
4082c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    fm_i2s_info_t i2s_info;
4092c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    fm_i2s_pad_sel_e i2s_pad;
4102c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang} fm_audio_info_t;
4112c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang
4122c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huangstruct fm_cqi {
4132c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    int ch;
4142c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    int rssi;
4152c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    int reserve;
4162c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang};
4172c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang
4182c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huangstruct fm_cqi_req {
4192c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    uint16_t ch_num;
4202c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    int buf_size;
4212c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    char *cqi_buf;
4222c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang};
4232c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang
4242c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huangtypedef struct {
4252c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    int freq;
4262c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    int rssi;
4272c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang} fm_desense_check_t;
4282c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang
4292c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huangtypedef struct {
4302c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    uint16_t lower; // lower band, Eg, 7600 -> 76.0Mhz
4312c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    uint16_t upper; // upper band, Eg, 10800 -> 108.0Mhz
4322c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    int space; // 0x1: 50KHz, 0x2: 100Khz, 0x4: 200Khz
4332c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    int cycle; // repeat times
4342c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang} fm_full_cqi_log_t;
4352c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang
4362c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang// ********** ***********FM IOCTL define start *******************************
4372c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang#define FM_IOC_MAGIC        0xf5
4382c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang
4392c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang#define FM_IOCTL_POWERUP       _IOWR(FM_IOC_MAGIC, 0, struct fm_tune_parm*)
4402c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang#define FM_IOCTL_POWERDOWN     _IOWR(FM_IOC_MAGIC, 1, int32_t*)
4412c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang#define FM_IOCTL_TUNE          _IOWR(FM_IOC_MAGIC, 2, struct fm_tune_parm*)
4422c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang#define FM_IOCTL_SEEK          _IOWR(FM_IOC_MAGIC, 3, struct fm_seek_parm*)
4432c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang#define FM_IOCTL_SETVOL        _IOWR(FM_IOC_MAGIC, 4, uint32_t*)
4442c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang#define FM_IOCTL_GETVOL        _IOWR(FM_IOC_MAGIC, 5, uint32_t*)
4452c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang#define FM_IOCTL_MUTE          _IOWR(FM_IOC_MAGIC, 6, uint32_t*)
4462c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang#define FM_IOCTL_GETRSSI       _IOWR(FM_IOC_MAGIC, 7, int32_t*)
4472c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang#define FM_IOCTL_SCAN          _IOWR(FM_IOC_MAGIC, 8, struct fm_scan_parm*)
4482c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang#define FM_IOCTL_STOP_SCAN     _IO(FM_IOC_MAGIC,   9)
4492c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang
4502c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang//IOCTL and struct for test
4512c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang#define FM_IOCTL_GETCHIPID     _IOWR(FM_IOC_MAGIC, 10, uint16_t*)
4522c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang#define FM_IOCTL_EM_TEST       _IOWR(FM_IOC_MAGIC, 11, struct fm_em_parm*)
4532c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang#define FM_IOCTL_RW_REG        _IOWR(FM_IOC_MAGIC, 12, struct fm_ctl_parm*)
4542c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang#define FM_IOCTL_GETMONOSTERO  _IOWR(FM_IOC_MAGIC, 13, uint16_t*)
4552c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang#define FM_IOCTL_GETCURPAMD    _IOWR(FM_IOC_MAGIC, 14, uint16_t*)
4562c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang#define FM_IOCTL_GETGOODBCNT   _IOWR(FM_IOC_MAGIC, 15, uint16_t*)
4572c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang#define FM_IOCTL_GETBADBNT     _IOWR(FM_IOC_MAGIC, 16, uint16_t*)
4582c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang#define FM_IOCTL_GETBLERRATIO  _IOWR(FM_IOC_MAGIC, 17, uint16_t*)
4592c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang
4602c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang//IOCTL for RDS
4612c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang#define FM_IOCTL_RDS_ONOFF     _IOWR(FM_IOC_MAGIC, 18, uint16_t*)
4622c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang#define FM_IOCTL_RDS_SUPPORT   _IOWR(FM_IOC_MAGIC, 19, int32_t*)
4632c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang
4642c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang#define FM_IOCTL_RDS_SIM_DATA  _IOWR(FM_IOC_MAGIC, 23, uint32_t*)
4652c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang#define FM_IOCTL_IS_FM_POWERED_UP  _IOWR(FM_IOC_MAGIC, 24, uint32_t*)
4662c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang
4672c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang//IOCTL for FM over BT
4682c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang#define FM_IOCTL_OVER_BT_ENABLE  _IOWR(FM_IOC_MAGIC, 29, int32_t*)
4692c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang
4702c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang//IOCTL for FM ANTENNA SWITCH
4712c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang#define FM_IOCTL_ANA_SWITCH     _IOWR(FM_IOC_MAGIC, 30, int32_t*)
4722c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang#define FM_IOCTL_GETCAPARRAY      _IOWR(FM_IOC_MAGIC, 31, int32_t*)
4732c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang
4742c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang//IOCTL for FM I2S Setting
4752c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang#define FM_IOCTL_I2S_SETTING  _IOWR(FM_IOC_MAGIC, 33, struct fm_i2s_setting*)
4762c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang
4772c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang#define FM_IOCTL_RDS_GROUPCNT   _IOWR(FM_IOC_MAGIC, 34, struct rds_group_cnt_req*)
4782c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang#define FM_IOCTL_RDS_GET_LOG    _IOWR(FM_IOC_MAGIC, 35, struct rds_raw_data*)
4792c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang
4802c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang#define FM_IOCTL_SCAN_GETRSSI   _IOWR(FM_IOC_MAGIC, 36, struct fm_rssi_req*)
4812c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang#define FM_IOCTL_SETMONOSTERO   _IOWR(FM_IOC_MAGIC, 37, int32_t)
4822c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang#define FM_IOCTL_RDS_BC_RST     _IOWR(FM_IOC_MAGIC, 38, int32_t*)
4832c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang#define FM_IOCTL_CQI_GET     _IOWR(FM_IOC_MAGIC, 39, struct fm_cqi_req*)
4842c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang#define FM_IOCTL_GET_HW_INFO    _IOWR(FM_IOC_MAGIC, 40, struct fm_hw_info*)
4852c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang#define FM_IOCTL_GET_I2S_INFO   _IOWR(FM_IOC_MAGIC, 41, fm_i2s_info_t*)
4862c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang#define FM_IOCTL_IS_DESE_CHAN   _IOWR(FM_IOC_MAGIC, 42, int32_t*)
4872c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang#define FM_IOCTL_TOP_RDWR _IOWR(FM_IOC_MAGIC, 43, struct fm_top_rw_parm*)
4882c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang#define FM_IOCTL_HOST_RDWR  _IOWR(FM_IOC_MAGIC, 44, struct fm_host_rw_parm*)
4892c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang
4902c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang#define FM_IOCTL_PRE_SEARCH _IOWR(FM_IOC_MAGIC, 45,int32_t)
4912c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang#define FM_IOCTL_RESTORE_SEARCH _IOWR(FM_IOC_MAGIC, 46,int32_t)
4922c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang
4932c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang#define FM_IOCTL_SET_SEARCH_THRESHOLD   _IOWR(FM_IOC_MAGIC, 47, fm_search_threshold_t*)
4942c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang
4952c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang#define FM_IOCTL_GET_AUDIO_INFO _IOWR(FM_IOC_MAGIC, 48, fm_audio_info_t*)
4962c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang
4972c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang#define FM_IOCTL_SCAN_NEW       _IOWR(FM_IOC_MAGIC, 60, struct fm_scan_t*)
4982c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang#define FM_IOCTL_SEEK_NEW       _IOWR(FM_IOC_MAGIC, 61, struct fm_seek_t*)
4992c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang#define FM_IOCTL_TUNE_NEW       _IOWR(FM_IOC_MAGIC, 62, struct fm_tune_t*)
5002c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang
5012c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang#define FM_IOCTL_SOFT_MUTE_TUNE _IOWR(FM_IOC_MAGIC, 63, struct fm_softmute_tune_t*)/*for soft mute tune*/
5022c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang#define FM_IOCTL_DESENSE_CHECK   _IOWR(FM_IOC_MAGIC, 64, fm_desense_check_t*)
5032c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang
5042c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang//IOCTL for EM
5052c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang#define FM_IOCTL_FULL_CQI_LOG _IOWR(FM_IOC_MAGIC, 70, fm_full_cqi_log_t *)
5062c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang
5072c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang#define FM_IOCTL_DUMP_REG   _IO(FM_IOC_MAGIC, 0xFF)
5082c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang
5092c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang// ********** ***********FM IOCTL define end *******************************
5102c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang
5112c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huangenum group_idx {
5122c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    mono = 0,
5132c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    stereo,
5142c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    RSSI_threshold,
5152c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    HCC_Enable,
5162c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    PAMD_threshold,
5172c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    Softmute_Enable,
5182c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    De_emphasis,
5192c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    HL_Side,
5202c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    Demod_BW,
5212c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    Dynamic_Limiter,
5222c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    Softmute_Rate,
5232c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    AFC_Enable,
5242c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    Softmute_Level,
5252c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    Analog_Volume,
5262c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    GROUP_TOTAL_NUMS
5272c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang};
5282c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang
5292c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huangenum item_idx {
5302c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    Sblend_OFF = 0,
5312c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    Sblend_ON,
5322c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    ITEM_TOTAL_NUMS
5332c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang};
5342c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang
5352c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huangstruct fm_ctl_parm {
5362c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    uint8_t err;
5372c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    uint8_t addr;
5382c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    uint16_t val;
5392c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    uint16_t rw_flag; // 0:write, 1:read
5402c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang};
5412c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang
5422c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huangstruct fm_em_parm {
5432c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    uint16_t group_idx;
5442c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    uint16_t item_idx;
5452c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang    uint32_t item_value;
5462c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang};
5472c3f08c49eed3d8d3218a3189708f2696dfc2ce6Benson Huang#endif // __FM_H__
548