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