fm_rds.h 6.0 KB

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