fm_link.h 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  1. #ifndef __FM_LINK_H__
  2. #define __FM_LINK_H__
  3. #include "fm_typedef.h"
  4. #include "fm_rds.h"
  5. typedef enum {
  6. FM_TASK_RX_PARSER_PKT_TYPE = 0,
  7. FM_TASK_RX_PARSER_OPCODE,
  8. FM_TASK_RX_PARSER_PKT_LEN_1,
  9. FM_TASK_RX_PARSER_PKT_LEN_2,
  10. FM_TASK_RX_PARSER_PKT_PAYLOAD,
  11. FM_TASK_RX_PARSER_BUFFER_CONGESTION
  12. } fm_task_parser_state;
  13. enum {
  14. FM_TASK_COMMAND_PKT_TYPE = 0x01,
  15. FM_TASK_EVENT_PKT_TYPE = 0x04
  16. };
  17. enum {
  18. FM_STP_TEST_OPCODE = 0x00,
  19. FSPI_ENABLE_OPCODE = 0x01,
  20. FSPI_MUX_SEL_OPCODE = 0x02,
  21. FSPI_READ_OPCODE = 0x03,
  22. FSPI_WRITE_OPCODE = 0x04,
  23. FI2C_READ_OPCODE = 0x05,
  24. FI2C_WRITE_OPCODE = 0x06,
  25. FM_ENABLE_OPCODE = 0x07,
  26. FM_RESET_OPCODE = 0x08,
  27. FM_TUNE_OPCODE = 0x09,
  28. FM_SEEK_OPCODE = 0x0a,
  29. FM_SCAN_OPCODE = 0x0b,
  30. RDS_RX_ENABLE_OPCODE = 0x0c,
  31. RDS_RX_DATA_OPCODE = 0x0d,
  32. FM_RAMPDOWN_OPCODE = 0x0e,
  33. FM_MCUCLK_SEL_OPCODE = 0x0f,
  34. FM_MODEMCLK_SEL_OPCODE = 0x10,
  35. RDS_TX_OPCODE = 0x11,
  36. FM_PATCH_DOWNLOAD_OPCODE = 0x12,
  37. FM_COEFF_DOWNLOAD_OPCODE = 0x13,
  38. FM_HWCOEFF_DOWNLOAD_OPCODE = 0x14,
  39. FM_ROM_DOWNLOAD_OPCODE = 0x15,
  40. FM_SOFT_MUTE_TUNE_OPCODE = 0x17,
  41. FM_HOST_READ_OPCODE = 0x18, /* mcu register read */
  42. FM_HOST_WRITE_OPCODE = 0x19,
  43. CSPI_WRITE_OPCODE = 0x20,
  44. CSPI_READ_OPCODE = 0x21, /* common SPI read */
  45. };
  46. enum {
  47. FLAG_TEST = (1 << FM_STP_TEST_OPCODE),
  48. FLAG_FSPI_EN = (1 << FSPI_ENABLE_OPCODE),
  49. FLAG_FSPI_MUXSEL = (1 << FSPI_MUX_SEL_OPCODE),
  50. FLAG_FSPI_RD = (1 << FSPI_READ_OPCODE),
  51. FLAG_FSPI_WR = (1 << FSPI_WRITE_OPCODE),
  52. FLAG_I2C_RD = (1 << FI2C_READ_OPCODE),
  53. FLAG_I2C_WR = (1 << FI2C_WRITE_OPCODE),
  54. FLAG_EN = (1 << FM_ENABLE_OPCODE),
  55. FLAG_RST = (1 << FM_RESET_OPCODE),
  56. FLAG_TUNE = (1 << FM_TUNE_OPCODE),
  57. FLAG_SEEK = (1 << FM_SEEK_OPCODE),
  58. FLAG_SCAN = (1 << FM_SCAN_OPCODE),
  59. FLAG_RDS_RX_EN = (1 << RDS_RX_ENABLE_OPCODE),
  60. FLAG_RDS_DATA = (1 << RDS_RX_DATA_OPCODE),
  61. FLAG_RAMPDOWN = (1 << FM_RAMPDOWN_OPCODE),
  62. FLAG_MCUCLK = (1 << FM_MCUCLK_SEL_OPCODE),
  63. FLAG_MODEMCLK = (1 << FM_MODEMCLK_SEL_OPCODE),
  64. FLAG_RDS_TX = (1 << RDS_TX_OPCODE),
  65. FLAG_PATCH = (1 << FM_PATCH_DOWNLOAD_OPCODE),
  66. FLAG_COEFF = (1 << FM_COEFF_DOWNLOAD_OPCODE),
  67. FLAG_HWCOEFF = (1 << FM_HWCOEFF_DOWNLOAD_OPCODE),
  68. FLAG_ROM = (1 << FM_ROM_DOWNLOAD_OPCODE),
  69. FLAG_CSPI_READ = (1 << 22), /* 22 */
  70. FLAG_SM_TUNE = (1 << FM_SOFT_MUTE_TUNE_OPCODE), /* 23 */
  71. FLAG_HOST_READ = (1 << FM_HOST_READ_OPCODE), /* 24 */
  72. FLAG_HOST_WRITE = (1 << FM_HOST_WRITE_OPCODE), /* 25 */
  73. FLAG_CSPI_WRITE = (1 << 26), /* 26 */
  74. FLAG_CQI_DONE = (1 << 27),
  75. FLAG_TUNE_DONE = (1 << 28),
  76. FLAG_SEEK_DONE = (1 << 29),
  77. FLAG_SCAN_DONE = (1 << 30),
  78. FLAG_TERMINATE = (1 << 31)
  79. };
  80. #define FM_SCANTBL_SIZE 16
  81. #define FM_CQI_BUF_SIZE 96
  82. struct fm_res_ctx {
  83. fm_u16 fspi_rd;
  84. fm_u16 seek_result;
  85. fm_u16 scan_result[FM_SCANTBL_SIZE];
  86. fm_s8 cqi[FM_CQI_BUF_SIZE];
  87. struct rds_rx_t rds_rx_result;
  88. fm_u32 cspi_rd; /* common spi read data */
  89. };
  90. #define FM_TRACE_ENABLE
  91. #define FM_TRACE_FIFO_SIZE 200
  92. #define FM_TRACE_PKT_SIZE 60
  93. struct fm_trace_t {
  94. fm_s32 type;
  95. fm_s32 opcode;
  96. fm_s32 len;
  97. fm_u8 pkt[FM_TRACE_PKT_SIZE]; /* full packet */
  98. unsigned long time;
  99. fm_s32 tid;
  100. };
  101. struct fm_trace_fifo_t {
  102. fm_s8 name[20 + 1];
  103. struct fm_trace_t trace[FM_TRACE_FIFO_SIZE];
  104. fm_u32 size;
  105. fm_u32 in;
  106. fm_u32 out;
  107. fm_u32 len;
  108. fm_s32 (*trace_in)(struct fm_trace_fifo_t *thiz, struct fm_trace_t *new_tra);
  109. fm_s32 (*trace_out)(struct fm_trace_fifo_t *thiz, struct fm_trace_t *dst_tra);
  110. fm_bool (*is_full)(struct fm_trace_fifo_t *thiz);
  111. fm_bool (*is_empty)(struct fm_trace_fifo_t *thiz);
  112. };
  113. #define FM_TRACE_IN(fifop, tracep) \
  114. ({ \
  115. fm_s32 __ret = (fm_s32)0; \
  116. if (fifop && (fifop)->trace_in) { \
  117. __ret = (fifop)->trace_in(fifop, tracep); \
  118. } \
  119. __ret; \
  120. })
  121. #define FM_TRACE_OUT(fifop, tracep) \
  122. ({ \
  123. fm_s32 __ret = (fm_s32)0; \
  124. if (fifop && (fifop)->trace_out) { \
  125. __ret = (fifop)->trace_out(fifop, tracep); \
  126. } \
  127. __ret; \
  128. })
  129. #define FM_TRACE_FULL(fifop) \
  130. ({ \
  131. fm_bool __ret = (fm_bool)fm_false; \
  132. if (fifop && (fifop)->is_full) { \
  133. __ret = (fifop)->is_full(fifop); \
  134. } \
  135. __ret; \
  136. })
  137. #define FM_TRACE_EMPTY(fifop) \
  138. ({ \
  139. fm_bool __ret = (fm_bool)fm_false; \
  140. if (fifop && (fifop)->is_empty) { \
  141. __ret = (fifop)->is_empty(fifop); \
  142. } \
  143. __ret; \
  144. })
  145. #if (defined(MT6620_FM) || defined(MT6628_FM) || defined(MT6627_FM) || defined(MT6580_FM) || defined(MT6630_FM))
  146. #include "fm_utils.h"
  147. #define RX_BUF_SIZE 256
  148. #define TX_BUF_SIZE 1024
  149. #define SW_RETRY_CNT (1)
  150. #define SW_RETRY_CNT_MAX (5)
  151. #define SW_WAIT_TIMEOUT_MAX (100)
  152. /* FM operation timeout define for error handle */
  153. #define TEST_TIMEOUT (3)
  154. #define FSPI_EN_TIMEOUT (3)
  155. #define FSPI_MUXSEL_TIMEOUT (3)
  156. #define FSPI_RD_TIMEOUT (3)
  157. #define FSPI_WR_TIMEOUT (3)
  158. #define I2C_RD_TIMEOUT (3)
  159. #define I2C_WR_TIMEOUT (3)
  160. #define EN_TIMEOUT (3)
  161. #define RST_TIMEOUT (3)
  162. #define TUNE_TIMEOUT (3)
  163. #define SM_TUNE_TIMEOUT (6)
  164. #define SEEK_TIMEOUT (15)
  165. #define SCAN_TIMEOUT (15) /* usually scan will cost 10 seconds */
  166. #define RDS_RX_EN_TIMEOUT (3)
  167. #define RDS_DATA_TIMEOUT (100)
  168. #define RAMPDOWN_TIMEOUT (3)
  169. #define MCUCLK_TIMEOUT (3)
  170. #define MODEMCLK_TIMEOUT (3)
  171. #define RDS_TX_TIMEOUT (3)
  172. #define PATCH_TIMEOUT (3)
  173. #define COEFF_TIMEOUT (3)
  174. #define HWCOEFF_TIMEOUT (3)
  175. #define ROM_TIMEOUT (3)
  176. struct fm_link_event {
  177. struct fm_flag_event *ln_event;
  178. struct fm_res_ctx result; /* seek/scan/read/RDS */
  179. };
  180. #endif
  181. /*
  182. * FM data and ctrl link APIs: platform related and bus related
  183. */
  184. extern fm_s32 fm_link_setup(void *data);
  185. extern fm_s32 fm_link_release(void);
  186. extern fm_s32 fm_cmd_tx(fm_u8 *buf, fm_u16 len, fm_s32 mask, fm_s32 cnt, fm_s32 timeout,
  187. fm_s32 (*callback)(struct fm_res_ctx *result));
  188. extern fm_s32 fm_event_parser(fm_s32 (*rds_parser)(struct rds_rx_t *, fm_s32));
  189. extern fm_s32 fm_ctrl_rx(fm_u8 addr, fm_u16 *val);
  190. extern fm_s32 fm_ctrl_tx(fm_u8 addr, fm_u16 val);
  191. extern fm_s32 fm_force_active_event(fm_u32 mask);
  192. extern fm_bool fm_wait_stc_done(fm_u32 sec);
  193. extern struct fm_trace_fifo_t *fm_trace_fifo_create(const fm_s8 *name);
  194. extern fm_s32 fm_trace_fifo_release(struct fm_trace_fifo_t *fifo);
  195. extern fm_s32 fm_print_cmd_fifo(void);
  196. extern fm_s32 fm_print_evt_fifo(void);
  197. #endif /* __FM_LINK_H__ */