add MTK-combo-module,continue with commit 17f39ed917874e77e80411f33faba1b7ee8138c8
[firefly-linux-kernel-4.4.55.git] / drivers / mtk_wcn_combo / drv_fm / public / mt6620_fm.h
diff --git a/drivers/mtk_wcn_combo/drv_fm/public/mt6620_fm.h b/drivers/mtk_wcn_combo/drv_fm/public/mt6620_fm.h
new file mode 100755 (executable)
index 0000000..4b76d84
--- /dev/null
@@ -0,0 +1,597 @@
+/* Copyright Statement:
+ *
+ * This software/firmware and related documentation ("MediaTek Software") are
+ * protected under relevant copyright laws. The information contained herein
+ * is confidential and proprietary to MediaTek Inc. and/or its licensors.
+ * Without the prior written permission of MediaTek inc. and/or its licensors,
+ * any reproduction, modification, use or disclosure of MediaTek Software,
+ * and information contained herein, in whole or in part, shall be strictly prohibited.
+ *
+ * MediaTek Inc. (C) 2010. All rights reserved.
+ *
+ * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON
+ * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+ * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+ * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+ * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH
+ * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES
+ * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES
+ * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK
+ * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND
+ * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+ * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+ * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO
+ * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+ *
+ * The following software/firmware and/or related documentation ("MediaTek Software")
+ * have been modified by MediaTek Inc. All revisions are subject to any receiver's
+ * applicable license agreements with MediaTek Inc.
+ */
+
+#ifndef __MT6620_FM_H__
+#define __MT6620_FM_H__
+
+#include <linux/cdev.h>
+#include <linux/wait.h>
+#include <linux/workqueue.h>
+#include "fm.h"
+
+#ifndef TRUE
+#define TRUE 1
+#endif
+
+#ifndef FALSE
+#define FALSE 0
+#endif
+
+#define RDS_RX_BLOCK_PER_GROUP (4)
+#define RDS_RX_GROUP_SIZE (2*RDS_RX_BLOCK_PER_GROUP)
+#define MAX_RDS_RX_GROUP_CNT (12)
+#define FM_RDS_ENABLE        0x01 // 1: enable RDS, 0:disable RDS
+
+
+/******************DBG level added by DDB************************/
+#define D_BASE  4
+#define D_IOCTL (1 << (D_BASE+0))
+#define D_RX    (1 << (D_BASE+1))
+#define D_TIMER (1 << (D_BASE+2))
+#define D_BLKC (1 << (D_BASE+3))
+#define D_G0   (1 << (D_BASE+4))
+#define D_G1   (1 << (D_BASE+5))
+#define D_G2   (1 << (D_BASE+6))
+#define D_G3   (1 << (D_BASE+7))
+#define D_G4   (1 << (D_BASE+8))
+#define D_G14  (1 << (D_BASE+9))
+#define D_RAW  (1 << (D_BASE+10))
+#define D_RDS  (1 << (D_BASE+11))
+#define D_INIT (1 << (D_BASE+12))
+#define D_MAIN (1 << (D_BASE+13))
+#define D_CMD  (1 << (D_BASE+14))
+#define D_ALL  0xfffffff0
+
+#define L0 0x00000000 // EMERG, system will crush 
+#define L1 0x00000001 // ALERT, need action in time
+#define L2 0x00000002 // CRIT, important HW or SW operation failed 
+#define L3 0x00000003 // ERR, normal HW or SW ERR 
+#define L4 0x00000004 // WARNING, importan path or somewhere may occurs err
+#define L5 0x00000005 // NOTICE, normal case 
+#define L6 0x00000006 // INFO, print info if need 
+#define L7 0x00000007 // DEBUG, for debug info
+
+#define FM_EMERG    L0
+#define FM_ALERT    L1
+#define FM_CRIT     L2
+#define FM_ERR      L3
+#define FM_WARNING  L4
+#define FM_NOTICE   L5
+#define FM_INFO     L6
+#define FM_DEBUG    L7
+
+extern uint32_t g_dbg_level;
+
+#if 0
+#define WCN_DBG(flag, fmt, args...) \
+       do { \
+               if ((((flag)&0x0000000f)<=(g_dbg_level&0x0000000f)) && ((flag)&0xfffffff0)& g_dbg_level) { \
+                       printk(KERN_ALERT "[" #flag "]" fmt, ## args); \
+               } \
+       } while(0)
+#endif
+
+//#define FM_USE_XLOG
+
+#ifdef FM_USE_XLOG
+#include <linux/xlog.h>
+#define FM_DRV_LOG_TAG "FM_DRV"
+
+#define FM_LOG_DBG(flag, fmt, args...) \
+       do{ \
+               if((FM_DEBUG <= (g_dbg_level&0x0000000f)) && ((flag)&0xfffffff0)& g_dbg_level) { \
+            xlog_printk(ANDROID_LOG_INFO, FM_DRV_LOG_TAG, "[" #flag "]" fmt, ## args); \
+               } \
+       } while(0)
+
+#define FM_LOG_INF(flag, fmt, args...) \
+    do{ \
+        if((FM_INFO <= (g_dbg_level&0x0000000f)) && ((flag)&0xfffffff0)& g_dbg_level) { \
+            xlog_printk(ANDROID_LOG_INFO, FM_DRV_LOG_TAG, "[" #flag "]" fmt, ## args); \
+        } \
+    } while(0)
+
+#define FM_LOG_NTC(flag, fmt, args...) \
+    do{ \
+        if((FM_NOTICE <= (g_dbg_level&0x0000000f)) && ((flag)&0xfffffff0)& g_dbg_level) { \
+            xlog_printk(ANDROID_LOG_WARN, FM_DRV_LOG_TAG, "[" #flag "]" fmt, ## args); \
+        } \
+    } while(0)
+
+#define FM_LOG_WAR(flag, fmt, args...) \
+    do{ \
+        if((FM_WARNING <= (g_dbg_level&0x0000000f)) && ((flag)&0xfffffff0)& g_dbg_level) { \
+            xlog_printk(ANDROID_LOG_WARN, FM_DRV_LOG_TAG, "[" #flag "]" fmt, ## args); \
+        } \
+    } while(0)
+
+#define FM_LOG_ERR(flag, fmt, args...) \
+    do{ \
+        if((FM_ERR <= (g_dbg_level&0x0000000f)) && ((flag)&0xfffffff0)& g_dbg_level) { \
+            xlog_printk(ANDROID_LOG_ERROR, FM_DRV_LOG_TAG, "[" #flag "]" fmt, ## args); \
+        } \
+    } while(0)
+
+#define FM_LOG_CRT(flag, fmt, args...) \
+    do{ \
+        if((FM_CRIT <= (g_dbg_level&0x0000000f)) && ((flag)&0xfffffff0)& g_dbg_level) { \
+            xlog_printk(ANDROID_LOG_FATAL, FM_DRV_LOG_TAG, "[" #flag "]" fmt, ## args); \
+        } \
+    } while(0)
+
+#define FM_LOG_ALT(flag, fmt, args...) \
+    do{ \
+        if((FM_ALERT <= (g_dbg_level&0x0000000f)) && ((flag)&0xfffffff0)& g_dbg_level) { \
+            xlog_printk(ANDROID_LOG_FATAL, FM_DRV_LOG_TAG, "[" #flag "]" fmt, ## args); \
+        } \
+    } while(0)
+
+#define FM_LOG_EMG(flag, fmt, args...) \
+    do{ \
+        if((FM_EMERG <= (g_dbg_level&0x0000000f)) && ((flag)&0xfffffff0)& g_dbg_level) { \
+            xlog_printk(ANDROID_LOG_FATAL, FM_DRV_LOG_TAG, "[" #flag "]" fmt, ## args); \
+        } \
+    } while(0)
+
+#else
+
+#define FM_LOG_DBG(flag, fmt, args...) \
+            do{ \
+                if((FM_DEBUG <= (g_dbg_level&0x0000000f)) && ((flag)&0xfffffff0)& g_dbg_level) { \
+                    printk(KERN_DEBUG "[" #flag "]" fmt, ## args); \
+                } \
+            } while(0)
+        
+#define FM_LOG_INF(flag, fmt, args...) \
+            do{ \
+                if((FM_INFO <= (g_dbg_level&0x0000000f)) && ((flag)&0xfffffff0)& g_dbg_level) { \
+                    printk(KERN_INFO "[" #flag "]" fmt, ## args); \
+                } \
+            } while(0)
+        
+#define FM_LOG_NTC(flag, fmt, args...) \
+            do{ \
+                if((FM_NOTICE <= (g_dbg_level&0x0000000f)) && ((flag)&0xfffffff0)& g_dbg_level) { \
+                    printk(KERN_NOTICE "[" #flag "]" fmt, ## args); \
+                } \
+            } while(0)
+        
+#define FM_LOG_WAR(flag, fmt, args...) \
+            do{ \
+                if((FM_WARNING <= (g_dbg_level&0x0000000f)) && ((flag)&0xfffffff0)& g_dbg_level) { \
+                    printk(KERN_WARNING "[" #flag "]" fmt, ## args); \
+                } \
+            } while(0)
+        
+#define FM_LOG_ERR(flag, fmt, args...) \
+            do{ \
+                if((FM_ERR <= (g_dbg_level&0x0000000f)) && ((flag)&0xfffffff0)& g_dbg_level) { \
+                    printk(KERN_ERR "[" #flag "]" fmt, ## args); \
+                } \
+            } while(0)
+        
+#define FM_LOG_CRT(flag, fmt, args...) \
+            do{ \
+                if((FM_CRIT <= (g_dbg_level&0x0000000f)) && ((flag)&0xfffffff0)& g_dbg_level) { \
+                    printk(KERN_CRIT "[" #flag "]" fmt, ## args); \
+                } \
+            } while(0)
+        
+#define FM_LOG_ALT(flag, fmt, args...) \
+            do{ \
+                if((FM_ALERT <= (g_dbg_level&0x0000000f)) && ((flag)&0xfffffff0)& g_dbg_level) { \
+                    printk(KERN_ALERT "[" #flag "]" fmt, ## args); \
+                } \
+            } while(0)
+        
+#define FM_LOG_EMG(flag, fmt, args...) \
+            do{ \
+                if((FM_EMERG <= (g_dbg_level&0x0000000f)) && ((flag)&0xfffffff0)& g_dbg_level) { \
+                    printk(KERN_EMERG "[" #flag "]" fmt, ## args); \
+                } \
+            } while(0)
+#endif
+
+#define BITn(n) (uint16_t)(1<<(n))
+#define MASK(n) (uint16_t)(~(1<<(n)))
+
+#define FM_COM_ASSERT(n) {\
+    if(!(n)){\
+            FM_LOG_ERR(D_ALL, "%s(), %d\n", __func__, __LINE__);\
+            return -EFAULT;\
+        }\
+    }
+
+
+typedef enum
+{
+       FM_TX_NOT_SUPPORT = 0,
+       FM_TX_SUPPORT
+}fm_tx_support_flag;
+
+typedef enum
+{
+       FM_RDS_TX_NOT_SUPPORT = 0,
+       FM_RDS_TX_SUPPORT
+}fm_rds_tx_support_flag;
+
+typedef enum
+{
+       FM_RDS_TX_DISENABLE = 0,
+       FM_RDS_TX_ENABLE
+}fm_rds_tx_enable_state;
+
+typedef enum
+{
+       FM_OVER_BT_DISABLE = 0,
+       FM_OVER_BT_ENABLE
+}fm_over_bt_enable_state;
+
+typedef enum
+{
+       FM_LONG_ANA = 0,
+       FM_SHORT_ANA
+}fm_antenna_type;
+
+typedef struct
+{
+    uint16_t blkA;
+    uint16_t blkB;
+    uint16_t blkC;
+    uint16_t blkD;
+    uint16_t cbc; //correct bit cnt
+    uint16_t crc; //crc checksum
+}rds_packet_struct;
+
+struct rds_rx
+{
+    uint16_t sin;
+    uint16_t cos;
+    rds_packet_struct data[MAX_RDS_RX_GROUP_CNT];
+};
+
+typedef enum fm_pwr_status{
+    FM_PWR_OFF = 0,
+    FM_PWR_RX_ON = 1,
+    FM_PWR_TX_ON = 2,
+    FM_PWR_MAX
+}fm_pwr_status;
+
+struct fm {
+    volatile uint ref;
+    volatile bool chipon;  //MT6620 chip power state
+    volatile fm_pwr_status powerup;      //FM module power state
+    atomic_t tx_support; //FM Tx support flag, 1: support, 0: not support
+    int tx_pwr;
+    atomic_t rds_tx_support; //FM RDS Tx support flag, 1: support, 0: not support
+    atomic_t rds_tx_enable; //FM RDS Tx enable state, 1:enable RDS Tx function,  0:disable 
+    atomic_t over_bt_enable; //FM over BT enable state, 1:enable,  0:disable
+    uint16_t chip_id;
+    uint16_t device_id;
+    dev_t dev_t;
+    uint16_t min_freq; // KHz
+    uint16_t max_freq; // KHz
+    uint8_t band;      // TODO
+    struct class *cls;
+    struct device *dev;
+    struct cdev cdev;
+    wait_queue_head_t read_wait;
+    volatile bool RDS_Data_ready;
+    RDSData_Struct *pstRDSData; 
+    struct rds_group_cnt rds_gc;
+    struct workqueue_struct *fm_workqueue;    /* fm rx  handling */
+    struct workqueue_struct *fm_timer_workqueue;    /* fm rds reset handling */
+    struct work_struct fm_rds_reset_work;
+    struct work_struct fm_tx_power_ctrl_work;
+    struct work_struct fm_tx_rtc_ctrl_work;
+    struct work_struct fm_tx_desense_wifi_work;
+    struct work_struct fm_rst_recover_work;
+    struct work_struct fm_subsys_recover_work;
+    struct work_struct fm_rx_work;
+};
+
+struct fm_rx_cxt{
+    int audioPath; //I2S or Analog
+    int vol;
+    int mute;
+    int rdsOn;
+    int ana; //long/short antenna
+    int ViaBt; //FM over bt controller
+};
+
+struct fm_tx_cxt{
+    int audioPath; //I2S or Analog
+    int rdsTxOn;
+    uint16_t pi;
+    uint16_t ps[12]; // 4 ps
+    uint16_t other_rds[87];  // 0~29 other groups
+    uint8_t other_rds_cnt; // # of other group
+};
+
+struct fm_context{
+    volatile int ref;
+    volatile bool chipon;
+    fm_pwr_status powerup;
+    volatile int16_t freq;
+    struct fm_rx_cxt rxcxt;
+    struct fm_tx_cxt txcxt;
+};
+
+struct fm_config{
+    struct proc_dir_entry *proc;
+    uint32_t vcoon;
+    uint32_t vcooff;
+    uint32_t timer;
+    uint32_t txpwrctl;
+    uint32_t rdsrst;
+};
+
+typedef struct fm_timer_sys{
+    volatile uint32_t    count;
+    volatile uint8_t     onoff; 
+    volatile uint8_t     rds_reset_en;
+    volatile uint8_t     tx_pwr_ctrl_en;
+    volatile uint8_t     tx_rtc_ctrl_en;
+    volatile uint8_t     tx_desense_en;
+}fm_timer_sys;
+
+enum{
+    FM_TIMER_SYS_OFF,
+    FM_TIMER_SYS_ON,
+    FM_TIMER_SYS_MAX
+};
+
+enum{
+    FM_RDS_RST_DISABLE,
+    FM_RDS_RST_ENABLE,
+    FM_RDS_RST_MAX
+};
+
+enum{
+    FM_TX_PWR_CTRL_DISABLE,
+    FM_TX_PWR_CTRL_ENABLE,
+    FM_TX_PWR_CTRL_MAX
+};
+
+enum{
+    FM_TX_RTC_CTRL_DISABLE,
+    FM_TX_RTC_CTRL_ENABLE,
+    FM_TX_RTC_CTRL_MAX
+};
+
+enum{
+    FM_TX_DESENSE_DISABLE,
+    FM_TX_DESENSE_ENABLE,
+    FM_TX_DESENSE_MAX
+};
+
+enum{
+    FM_WHOLECHIP_RST_OFF,
+    FM_WHOLECHIP_RST_START,
+    FM_WHOLECHIP_RST_END,
+    FM_WHOLECHIP_RST_MAX
+};
+
+enum{
+    FM_SUBSYS_RST_OFF,
+    FM_SUBSYS_RST_START,
+    FM_SUBSYS_RST_END,
+    FM_SUBSYS_RST_MAX
+};
+
+#define FM_TIMER_TIMEOUT_DEFAULT 1000
+#define FM_TIMER_TIMEOUT_MIN 1000
+#define FM_TIMER_TIMEOUT_MAX 1000000
+
+#define FM_RDS_RST_INVAL_DEFAULT 5
+#define FM_RDS_RST_INVAL_MIN 5
+#define FM_RDS_RST_INVAL_MAX 10000
+
+#define FM_TX_PWR_CTRL_INVAL_DEFAULT 10
+#define FM_TX_PWR_CTRL_INVAL_MIN 5
+#define FM_TX_PWR_CTRL_INVAL_MAX 10000
+
+#define FM_TX_VCO_OFF_DEFAULT 5
+#define FM_TX_VCO_OFF_MIN 1
+#define FM_TX_VCO_OFF_MAX 10000
+
+#define FM_TX_VCO_ON_DEFAULT 100
+#define FM_TX_VCO_ON_MIN 10
+#define FM_TX_VCO_ON_MAX 10000
+
+#define FM_TX_RTC_CTRL_INTERVAL 10
+
+#define FM_GPS_RTC_AGE_TH       2
+#define FM_GPS_RTC_DRIFT_TH     0
+#define FM_GPS_RTC_TIME_DIFF_TH 10
+#define FM_GPS_RTC_RETRY_CNT    1
+#define FM_GPS_RTC_DRIFT_MAX 5000
+enum{
+    FM_GPS_RTC_INFO_OLD = 0,
+    FM_GPS_RTC_INFO_NEW = 1,
+    FM_GPS_RTC_INFO_MAX
+};
+// MUST sync with FM f/w definitions (eg. sys_fm_6620.h)
+/* FM opcode */
+#define FM_STP_TEST_OPCODE      (0x00)
+#define FSPI_ENABLE_OPCODE      (0x01)
+#define FSPI_MUX_SEL_OPCODE     (0x02)
+#define FSPI_READ_OPCODE        (0x03)
+#define FSPI_WRITE_OPCODE       (0x04)
+#define FI2C_READ_OPCODE        (0x05)
+#define FI2C_WRITE_OPCODE       (0x06)
+#define FM_ENABLE_OPCODE        (0x07)
+#define FM_RESET_OPCODE         (0x08)
+#define FM_TUNE_OPCODE          (0x09)
+#define FM_SEEK_OPCODE          (0x0a)
+#define FM_SCAN_OPCODE          (0x0b)
+#define RDS_RX_ENABLE_OPCODE    (0x0c)
+#define RDS_RX_DATA_OPCODE      (0x0d)
+#define FM_RAMPDOWN_OPCODE      (0x0e)
+#define FM_MCUCLK_SEL_OPCODE    (0x0f)
+#define FM_MODEMCLK_SEL_OPCODE  (0x10)
+#define RDS_TX_OPCODE           (0x11)
+#define FM_MAX_OPCODE           (0x12)
+
+#define FM_COM_CMD_BASE 0
+typedef enum{
+    FM_COM_CMD_TEST = FM_COM_CMD_BASE + 0,
+    FM_COM_CMD_SEEK,
+    FM_COM_CMD_SCAN,
+    FM_COM_CMD_MAX
+}fm_com_cmd_t;
+
+#define SW_RETRY_CNT            (2)
+#define SW_RETRY_CNT_MAX        (5)
+#define SW_WAIT_TIMEOUT_MAX     (100)
+typedef enum 
+{
+    ERR_SUCCESS = 1000,
+    ERR_INVALID_BUF,
+    ERR_INVALID_PARA,
+    ERR_STP,
+    ERR_GET_MUTEX,
+    ERR_FW_NORES,
+    ERR_RDS_CRC,
+    ERR_WHOLECHIP_RST,
+    ERR_SUBSYS_RST,
+    ERR_MAX    
+}fm_drv_error_t;
+
+// FM operation timeout define for error handle
+#define TEST_TIMEOUT            (3)
+#define FSPI_EN_TIMEOUT         (3)
+#define FSPI_MUXSEL_TIMEOUT     (3)
+#define FSPI_RD_TIMEOUT         (3)
+#define FSPI_WR_TIMEOUT         (3)
+#define I2C_RD_TIMEOUT          (3)
+#define I2C_WR_TIMEOUT          (3)
+#define EN_TIMEOUT              (5)
+#define RST_TIMEOUT             (3)
+#define TUNE_TIMEOUT            (3)
+#define SEEK_TIMEOUT            (10)
+#define SCAN_TIMEOUT            (15) //usualy scan will cost 10 seconds 
+#define RDS_RX_EN_TIMEOUT       (3)
+#define RDS_DATA_TIMEOUT        (100)
+#define RAMPDOWN_TIMEOUT        (3)
+#define MCUCLK_TIMEOUT          (3)
+#define MODEMCLK_TIMEOUT        (3)
+#define RDS_TX_TIMEOUT          (3)
+#define POWERON_TIMEOUT         (3)
+#define POWEROFF_TIMEOUT        (3)
+#define SEEK_DONE_TIMEOUT       (3)
+#define SCAN_DONE_TIMEOUT       (3)
+
+
+/* FM basic-operation's opcode */
+#define FM_BOP_BASE             (0x80)
+#define FM_WRITE_BASIC_OP       (FM_BOP_BASE + 0x00)
+#define FM_UDELAY_BASIC_OP      (FM_BOP_BASE + 0x01)
+#define FM_RD_UNTIL_BASIC_OP    (FM_BOP_BASE + 0x02)
+#define FM_MODIFY_BASIC_OP      (FM_BOP_BASE + 0x03)
+#define FM_MSLEEP_BASIC_OP      (FM_BOP_BASE + 0x04)
+#define FM_MAX_BASIC_OP         (FM_BOP_BASE + 0x05)
+
+/* FM BOP's size */
+#define FM_WRITE_BASIC_OP_SIZE      (3)
+#define FM_UDELAY_BASIC_OP_SIZE     (4)
+#define FM_RD_UNTIL_BASIC_OP_SIZE   (5)
+#define FM_MODIFY_BASIC_OP_SIZE     (5)
+#define FM_MSLEEP_BASIC_OP_SIZE     (4)
+
+#define RX_BUF_SIZE 128
+#define TX_BUF_SIZE 1024
+
+typedef enum
+{
+    FM_TASK_RX_PARSER_PKT_TYPE = 0,
+    FM_TASK_RX_PARSER_OPCODE,
+    FM_TASK_RX_PARSER_PKT_LEN_1,
+    FM_TASK_RX_PARSER_PKT_LEN_2,
+    FM_TASK_RX_PARSER_PKT_PAYLOAD,
+    FM_TASK_RX_PARSER_BUFFER_CONGESTION
+} fm_task_parser_state;
+
+#define FM_ADDR_RSSI    (0xE8) //D9~D0 10bits
+#define FM_ADDR_PAMD    (0xE9) //D7~D0 8bits
+#define FM_ADDR_MR     (0xF2)  //D8~D0 9bits
+
+#define FM_TXSCAN_RSSI_TH      (-250)
+#define FM_TXSCAN_PAMD_TH      (-20)
+#define FM_TXSCAN_MR_TH                (-38)
+
+#define SCAN_UP        (0)
+#define SCAN_DOWN      (1)
+
+#define MT6620_SCANTBL_SIZE  16 //16*uinit16_t
+
+#define FM_TASK_COMMAND_PKT_TYPE    0x01
+#define FM_TASK_EVENT_PKT_TYPE      0x04
+
+#define MT6620_FM_SEEK_UP       0x0
+#define MT6620_FM_SEEK_DOWN     0x01
+#define MT6620_FM_SCAN_UP       0x0
+#define MT6620_FM_SCAN_DOWN     0x01
+#define MT6620_FM_SPACE_INVALID 0x0
+#define MT6620_FM_SPACE_50K     0x01
+#define MT6620_FM_SPACE_100K    0x02
+#define MT6620_FM_SPACE_200K    0x04 
+
+#define FLAG_TEST           (1 << 0)
+#define FLAG_FSPI_EN        (1 << 1)
+#define FLAG_FSPI_MUXSEL    (1 << 2)
+#define FLAG_FSPI_RD        (1 << 3)
+#define FLAG_FSPI_WR        (1 << 4)
+#define FLAG_I2C_RD         (1 << 5)
+#define FLAG_I2C_WR         (1 << 6)
+#define FLAG_EN             (1 << 7)
+#define FLAG_RST            (1 << 8)
+#define FLAG_TUNE           (1 << 9)
+#define FLAG_SEEK           (1 << 10)
+#define FLAG_SCAN           (1 << 11)
+#define FLAG_RDS_RX_EN      (1 << 12)
+#define FLAG_RDS_DATA       (1 << 13)
+#define FLAG_RAMPDOWN       (1 << 14)
+#define FLAG_MCUCLK         (1 << 15)
+#define FLAG_MODEMCLK       (1 << 16)
+#define FLAG_RDS_TX         (1 << 17)
+#define FLAG_OP_MAX         (1 << 18)
+#define FLAG_POWERON        (1 << 19)
+#define FLAG_POWEROFF       (1 << 20)
+#define FLAG_SEEK_DONE      (1 << 21)
+#define FLAG_SCAN_DONE      (1 << 22)
+#define FLAG_TERMINATE      (1 << 31)
+
+#endif //__MT6620_FM_H__