MT6620: add the new driver JB2 V1.0
[firefly-linux-kernel-4.4.55.git] / drivers / mtk_wcn_combo / drv_fm / inc / fm_rds.h
1 #ifndef __FM_RDS_H__
2 #define __FM_RDS_H__
3 #include "fm_typedef.h"
4
5 //FM_RDS_DATA_CRC_FFOST
6 #define FM_RDS_GDBK_IND_A        (0x08)
7 #define FM_RDS_GDBK_IND_B        (0x04)
8 #define FM_RDS_GDBK_IND_C        (0x02)
9 #define FM_RDS_GDBK_IND_D        (0x01)
10 #define FM_RDS_DCO_FIFO_OFST (0x01E0)
11 #define FM_RDS_READ_DELAY        (0x80)
12
13 #define RDS_RX_BLOCK_PER_GROUP (4)
14 #define RDS_RX_GROUP_SIZE (2*RDS_RX_BLOCK_PER_GROUP)
15 #define MAX_RDS_RX_GROUP_CNT (12)
16 #define RDS_RT_MULTI_REV_TH 100
17
18 typedef struct rds_packet_t {
19     fm_u16 blkA;
20     fm_u16 blkB;
21     fm_u16 blkC;
22     fm_u16 blkD;
23     fm_u16 cbc; //correct bit cnt
24     fm_u16 crc; //crc checksum
25 } rds_packet_t;
26
27 typedef struct rds_rx_t {
28     fm_u16 sin;
29     fm_u16 cos;
30     rds_packet_t data[MAX_RDS_RX_GROUP_CNT];
31 } rds_rx_t;
32
33 typedef enum rds_ps_state_machine_t {
34     RDS_PS_START = 0,
35     RDS_PS_DECISION,
36     RDS_PS_GETLEN,
37     RDS_PS_DISPLAY,
38     RDS_PS_FINISH,
39     RDS_PS_MAX
40 } rds_ps_state_machine_t;
41
42 typedef enum rds_rt_state_machine_t {
43     RDS_RT_START = 0,
44     RDS_RT_DECISION,
45     RDS_RT_GETLEN,
46     RDS_RT_DISPLAY,
47     RDS_RT_FINISH,
48     RDS_RT_MAX
49 } rds_rt_state_machine_t;
50
51
52 enum {
53     RDS_GRP_VER_A = 0,  //group version A
54     RDS_GRP_VER_B
55 };
56
57 typedef enum rds_blk_t {
58     RDS_BLK_A = 0,
59     RDS_BLK_B,
60     RDS_BLK_C,
61     RDS_BLK_D,
62     RDS_BLK_MAX
63 } rds_blk_t;
64
65 //For RDS feature, these strcutures also be defined in "fm.h"
66 typedef struct rds_flag_t {
67     fm_u8 TP;
68     fm_u8 TA;
69     fm_u8 Music;
70     fm_u8 Stereo;
71     fm_u8 Artificial_Head;
72     fm_u8 Compressed;
73     fm_u8 Dynamic_PTY;
74     fm_u8 Text_AB;
75     fm_u32 flag_status;
76 } rds_flag_t;
77
78 typedef struct rds_ct_t {
79     fm_u16 Month;
80     fm_u16 Day;
81     fm_u16 Year;
82     fm_u16 Hour;
83     fm_u16 Minute;
84     fm_u8 Local_Time_offset_signbit;
85     fm_u8 Local_Time_offset_half_hour;
86 } rds_ct_t;
87
88 typedef struct rds_af_t {
89     fm_s16 AF_Num;
90     fm_s16 AF[2][25];  //100KHz
91     fm_u8 Addr_Cnt;
92     fm_u8 isMethod_A;
93     fm_u8 isAFNum_Get;
94 } rds_af_t;
95
96 typedef struct rds_ps_t {
97     fm_u8 PS[4][8];
98     fm_u8 Addr_Cnt;
99 } rds_ps_t;
100
101 typedef struct rds_rt_t {
102     fm_u8 TextData[4][64];
103     fm_u8 GetLength;
104     fm_u8 isRTDisplay;
105     fm_u8 TextLength;
106     fm_u8 isTypeA;
107     fm_u8 BufCnt;
108     fm_u16 Addr_Cnt;
109 } rds_rt_t;
110
111 typedef struct rds_raw_t {
112     fm_s32 dirty; //indicate if the data changed or not
113     fm_s32 len; //the data len form chip
114     fm_u8 data[146];
115 } rds_raw_t;
116
117 typedef struct rds_group_cnt_t {
118     unsigned long total;
119     unsigned long groupA[16]; //RDS groupA counter
120     unsigned long groupB[16]; //RDS groupB counter
121 } rds_group_cnt_t;
122
123 typedef enum rds_group_cnt_op_t {
124     RDS_GROUP_CNT_READ = 0,
125     RDS_GROUP_CNT_WRITE,
126     RDS_GROUP_CNT_RESET,
127     RDS_GROUP_CNT_MAX
128 } rds_group_cnt_op_t;
129
130 typedef struct rds_group_cnt_req_t {
131     fm_s32 err;
132     enum rds_group_cnt_op_t op;
133     struct rds_group_cnt_t gc;
134 } rds_group_cnt_req_t;
135
136 typedef struct rds_t {
137     struct rds_ct_t CT;
138     struct rds_flag_t RDSFlag;
139     fm_u16 PI;
140     fm_u8 Switch_TP;
141     fm_u8 PTY;
142     struct rds_af_t AF_Data;
143     struct rds_af_t AFON_Data;
144     fm_u8 Radio_Page_Code;
145     fm_u16 Program_Item_Number_Code;
146     fm_u8 Extend_Country_Code;
147     fm_u16 Language_Code;
148     struct rds_ps_t PS_Data;
149     fm_u8 PS_ON[8];
150     struct rds_rt_t RT_Data;
151     fm_u16 event_status; //will use RDSFlag_Struct RDSFlag->flag_status to check which event, is that ok?
152     struct rds_group_cnt_t gc;
153 } rds_t;
154
155
156 //Need care the following definition.
157 //valid Rds Flag for notify
158 typedef enum rds_flag_status_t {
159     RDS_FLAG_IS_TP              = 0x0001, // Program is a traffic program
160     RDS_FLAG_IS_TA              = 0x0002, // Program currently broadcasts a traffic ann.
161     RDS_FLAG_IS_MUSIC           = 0x0004, // Program currently broadcasts music
162     RDS_FLAG_IS_STEREO          = 0x0008, // Program is transmitted in stereo
163     RDS_FLAG_IS_ARTIFICIAL_HEAD = 0x0010, // Program is an artificial head recording
164     RDS_FLAG_IS_COMPRESSED      = 0x0020, // Program content is compressed
165     RDS_FLAG_IS_DYNAMIC_PTY     = 0x0040, // Program type can change
166     RDS_FLAG_TEXT_AB            = 0x0080  // If this flag changes state, a new radio text                                        string begins
167 } rds_flag_status_t;
168
169 typedef enum rds_event_status_t {
170     RDS_EVENT_FLAGS          = 0x0001, // One of the RDS flags has changed state
171     RDS_EVENT_PI_CODE        = 0x0002, // The program identification code has changed
172     RDS_EVENT_PTY_CODE       = 0x0004, // The program type code has changed
173     RDS_EVENT_PROGRAMNAME    = 0x0008, // The program name has changed
174     RDS_EVENT_UTCDATETIME    = 0x0010, // A new UTC date/time is available
175     RDS_EVENT_LOCDATETIME    = 0x0020, // A new local date/time is available
176     RDS_EVENT_LAST_RADIOTEXT = 0x0040, // A radio text string was completed
177     RDS_EVENT_AF             = 0x0080, // Current Channel RF signal strength too weak, need do AF switch
178     RDS_EVENT_AF_LIST        = 0x0100, // An alternative frequency list is ready
179     RDS_EVENT_AFON_LIST      = 0x0200, // An alternative frequency list is ready
180     RDS_EVENT_TAON           = 0x0400,  // Other Network traffic announcement start
181     RDS_EVENT_TAON_OFF       = 0x0800, // Other Network traffic announcement finished.
182     RDS_EVENT_RDS            = 0x2000, // RDS Interrupt had arrived durint timer period
183     RDS_EVENT_NO_RDS         = 0x4000, // RDS Interrupt not arrived durint timer period
184     RDS_EVENT_RDS_TIMER      = 0x8000 // Timer for RDS Bler Check. ---- BLER  block error rate
185 } rds_event_status_t;
186
187
188 #define RDS_LOG_SIZE 2
189 struct rds_log_t {
190     struct rds_rx_t rds_log[RDS_LOG_SIZE];
191     fm_s32 log_len[RDS_LOG_SIZE];
192     fm_u32 size;
193     fm_u32 in;
194     fm_u32 out;
195     fm_u32 len;
196     fm_s32(*log_in)(struct rds_log_t *thiz, struct rds_rx_t *new_log, fm_s32 new_len);
197     fm_s32(*log_out)(struct rds_log_t *thiz, struct rds_rx_t *dst, fm_s32 *dst_len);
198 };
199
200 extern fm_s32 rds_parser(rds_t *rds_dst, struct rds_rx_t *rds_raw, fm_s32 rds_size, fm_u16(*getfreq)(void));
201 extern fm_s32 rds_grp_counter_get(struct rds_group_cnt_t *dst, struct rds_group_cnt_t *src);
202 extern fm_s32 rds_grp_counter_reset(struct rds_group_cnt_t *gc);
203 extern fm_s32 rds_log_in(struct rds_log_t *thiz, struct rds_rx_t *new_log, fm_s32 new_len);
204 extern fm_s32 rds_log_out(struct rds_log_t *thiz, struct rds_rx_t *dst, fm_s32 *dst_len);
205
206
207 #define DEFINE_RDSLOG(name) \
208     struct rds_log_t name = { \
209         .size = RDS_LOG_SIZE, \
210         .in = 0, \
211         .out = 0, \
212         .len = 0, \
213         .log_in = rds_log_in, \
214         .log_out = rds_log_out, \
215     }
216
217
218 #endif //__FM_RDS_H__
219