fm_main.h 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397
  1. #ifndef __FM_MAIN_H__
  2. #define __FM_MAIN_H__
  3. #include "fm_typedef.h"
  4. #include "fm_dbg.h"
  5. #include "fm_err.h"
  6. #include "fm_rds.h"
  7. #include "fm_eint.h"
  8. #include "fm_link.h"
  9. #include "fm_interface.h"
  10. #include "fm_stdlib.h"
  11. #include "fm_private.h"
  12. #define FM_NAME "fm"
  13. #define FM_DEVICE_NAME "/dev/fm"
  14. #define FM_VOL_MAX 0x2B /* 43 volume(0-15) */
  15. #define FM_TIMER_TIMEOUT_DEFAULT 1000
  16. #define FM_TIMER_TIMEOUT_MIN 1000
  17. #define FM_TIMER_TIMEOUT_MAX 1000000
  18. /* FM Tx */
  19. #define FM_TX_PWR_LEVEL_MAX 120 /* FM transmitter power level, rang: 85db~120db, default 120db */
  20. #define FM_TX_PWR_CTRL_INVAL_DEFAULT 10
  21. #define FM_TX_PWR_CTRL_INVAL_MIN 5
  22. #define FM_TX_PWR_CTRL_INVAL_MAX 10000
  23. #define FM_TX_VCO_OFF_DEFAULT 5
  24. #define FM_TX_VCO_OFF_MIN 1
  25. #define FM_TX_VCO_OFF_MAX 10000
  26. #define FM_TX_VCO_ON_DEFAULT 100
  27. #define FM_TX_VCO_ON_MIN 10
  28. #define FM_TX_VCO_ON_MAX 10000
  29. #define FM_GPS_RTC_AGE_TH 2
  30. #define FM_GPS_RTC_DRIFT_TH 0
  31. #define FM_GPS_RTC_TIME_DIFF_TH 10
  32. #define FM_GPS_RTC_RETRY_CNT 1
  33. #define FM_GPS_RTC_DRIFT_MAX 5000
  34. enum {
  35. FM_GPS_RTC_INFO_OLD = 0,
  36. FM_GPS_RTC_INFO_NEW = 1,
  37. FM_GPS_RTC_INFO_MAX
  38. };
  39. typedef enum {
  40. FM_OVER_BT_DISABLE = 0,
  41. FM_OVER_BT_ENABLE
  42. } fm_over_bt_enable_state;
  43. #define FM_RDS_ENABLE 0x01 /* 1: enable RDS, 0:disable RDS */
  44. #define FM_RDS_DATA_READY (1 << 0)
  45. /* errno */
  46. #define FM_SUCCESS 0
  47. #define FM_FAILED 1
  48. #define FM_EPARM 2
  49. #define FM_BADSTATUS 3
  50. #define FM_TUNE_FAILED 4
  51. #define FM_SEEK_FAILED 5
  52. #define FM_BUSY 6
  53. #define FM_SCAN_FAILED 7
  54. struct fm_tune_parm {
  55. fm_u8 err;
  56. fm_u8 band;
  57. fm_u8 space;
  58. fm_u8 hilo;
  59. fm_u16 freq; /* IN/OUT parameter */
  60. };
  61. struct fm_seek_parm {
  62. fm_u8 err;
  63. fm_u8 band;
  64. fm_u8 space;
  65. fm_u8 hilo;
  66. fm_u8 seekdir;
  67. fm_u8 seekth;
  68. fm_u16 freq; /* IN/OUT parameter */
  69. };
  70. #ifdef CONFIG_MTK_FM_50KHZ_SUPPORT
  71. struct fm_scan_parm {
  72. fm_u8 err;
  73. fm_u8 band;
  74. fm_u8 space;
  75. fm_u8 hilo;
  76. fm_u16 freq; /* OUT parameter */
  77. fm_u16 ScanTBL[26]; /* need no less than the chip */
  78. fm_u16 ScanTBLSize; /* IN/OUT parameter */
  79. };
  80. #else
  81. struct fm_scan_parm {
  82. fm_u8 err;
  83. fm_u8 band;
  84. fm_u8 space;
  85. fm_u8 hilo;
  86. fm_u16 freq; /* OUT parameter */
  87. fm_u16 ScanTBL[16]; /* need no less than the chip */
  88. fm_u16 ScanTBLSize; /* IN/OUT parameter */
  89. };
  90. #endif
  91. struct fm_cqi {
  92. fm_s32 ch;
  93. fm_s32 rssi;
  94. fm_s32 reserve;
  95. };
  96. struct fm_cqi_req {
  97. fm_u16 ch_num;
  98. fm_s32 buf_size;
  99. fm_s8 *cqi_buf;
  100. };
  101. struct fm_ch_rssi {
  102. fm_u16 freq;
  103. fm_s32 rssi;
  104. };
  105. enum fm_scan_cmd_t {
  106. FM_SCAN_CMD_INIT = 0,
  107. FM_SCAN_CMD_START,
  108. FM_SCAN_CMD_GET_NUM,
  109. FM_SCAN_CMD_GET_CH,
  110. FM_SCAN_CMD_GET_RSSI,
  111. FM_SCAN_CMD_GET_CH_RSSI,
  112. FM_SCAN_CMD_MAX
  113. };
  114. struct fm_scan_t {
  115. enum fm_scan_cmd_t cmd;
  116. fm_s32 ret; /* 0, success; else error code */
  117. fm_u16 lower; /* lower band, Eg, 7600 -> 76.0Mhz */
  118. fm_u16 upper; /* upper band, Eg, 10800 -> 108.0Mhz */
  119. fm_s32 space; /* 5: 50KHz, 10: 100Khz, 20: 200Khz */
  120. fm_s32 num; /* valid channel number */
  121. void *priv;
  122. fm_s32 sr_size; /* scan result buffer size in bytes */
  123. union {
  124. fm_u16 *ch_buf; /* channel buffer */
  125. fm_s32 *rssi_buf; /* rssi buffer */
  126. struct fm_ch_rssi *ch_rssi_buf; /* channel and RSSI buffer */
  127. } sr;
  128. };
  129. struct fm_seek_t {
  130. fm_s32 ret; /* 0, success; else error code */
  131. fm_u16 freq;
  132. fm_u16 lower; /* lower band, Eg, 7600 -> 76.0Mhz */
  133. fm_u16 upper; /* upper band, Eg, 10800 -> 108.0Mhz */
  134. fm_s32 space; /* 5: 50KHz, 10: 100Khz, 20: 200Khz */
  135. fm_s32 dir; /* 0: up; 1: down */
  136. fm_s32 th; /* seek threshold in dbm(Eg, -95dbm) */
  137. void *priv;
  138. };
  139. struct fm_tune_t {
  140. fm_s32 ret; /* 0, success; else error code */
  141. fm_u16 freq;
  142. fm_u16 lower; /* lower band, Eg, 7600 -> 76.0Mhz */
  143. fm_u16 upper; /* upper band, Eg, 10800 -> 108.0Mhz */
  144. fm_s32 space; /* 5: 50KHz, 10: 100Khz, 20: 200Khz */
  145. void *priv;
  146. };
  147. #ifdef CONFIG_MTK_FM_50KHZ_SUPPORT
  148. struct fm_rssi_req {
  149. fm_u16 num;
  150. fm_u16 read_cnt;
  151. struct fm_ch_rssi cr[26 * 16];
  152. };
  153. #else
  154. struct fm_rssi_req {
  155. fm_u16 num;
  156. fm_u16 read_cnt;
  157. struct fm_ch_rssi cr[16 * 16];
  158. };
  159. #endif
  160. struct fm_rds_tx_parm {
  161. fm_u8 err;
  162. fm_u16 pi;
  163. fm_u16 ps[12]; /* 4 ps */
  164. fm_u16 other_rds[87]; /* 0~29 other groups */
  165. fm_u8 other_rds_cnt; /* # of other group */
  166. };
  167. typedef struct fm_rds_tx_req {
  168. unsigned char pty; /* 0~31 integer */
  169. unsigned char rds_rbds; /* 0:RDS, 1:RBDS */
  170. unsigned char dyn_pty; /* 0:static, 1:dynamic */
  171. unsigned short pi_code; /* 2-byte hex */
  172. unsigned char ps_buf[8]; /* hex buf of PS */
  173. unsigned char ps_len; /* length of PS, must be 0 / 8" */
  174. unsigned char af; /* 0~204, 0:not used, 1~204:(87.5+0.1*af)MHz */
  175. unsigned char ah; /* Artificial head, 0:no, 1:yes */
  176. unsigned char stereo; /* 0:mono, 1:stereo */
  177. unsigned char compress; /* Audio compress, 0:no, 1:yes */
  178. unsigned char tp; /* traffic program, 0:no, 1:yes */
  179. unsigned char ta; /* traffic announcement, 0:no, 1:yes */
  180. unsigned char speech; /* 0:music, 1:speech */
  181. } fm_rds_tx_req;
  182. #define TX_SCAN_MAX 10
  183. #define TX_SCAN_MIN 1
  184. struct fm_tx_scan_parm {
  185. fm_u8 err;
  186. fm_u8 band; /* 87.6~108MHz */
  187. fm_u8 space;
  188. fm_u8 hilo;
  189. fm_u16 freq; /* start freq, if less than band min freq, then will use band min freq */
  190. fm_u8 scandir;
  191. fm_u16 ScanTBL[TX_SCAN_MAX]; /* need no less than the chip */
  192. fm_u16 ScanTBLSize; /* IN: desired size, OUT: scan result size */
  193. };
  194. struct fm_gps_rtc_info {
  195. fm_s32 err; /* error number, 0: success, other: err code */
  196. fm_s32 retryCnt; /* GPS mnl can decide retry times */
  197. fm_s32 ageThd; /* GPS 3D fix time diff threshold */
  198. fm_s32 driftThd; /* GPS RTC drift threshold */
  199. struct timeval tvThd; /* time value diff threshold */
  200. fm_s32 age; /* GPS 3D fix time diff */
  201. fm_s32 drift; /* GPS RTC drift */
  202. union {
  203. unsigned long stamp; /* time stamp in jiffies */
  204. struct timeval tv; /* time stamp value in RTC */
  205. };
  206. fm_s32 flag; /* rw flag */
  207. };
  208. typedef struct {
  209. fm_s32 freq;
  210. fm_s32 rssi;
  211. } fm_desense_check_t;
  212. typedef struct {
  213. uint16_t lower; /* lower band, Eg, 7600 -> 76.0Mhz */
  214. uint16_t upper; /* upper band, Eg, 10800 -> 108.0Mhz */
  215. int space; /* 0x1: 50KHz, 0x2: 100Khz, 0x4: 200Khz */
  216. int cycle; /* repeat times */
  217. } fm_full_cqi_log_t;
  218. typedef enum {
  219. FM_RX = 0,
  220. FM_TX = 1
  221. } FM_PWR_T;
  222. struct fm_ctl_parm {
  223. fm_u8 err;
  224. fm_u8 addr;
  225. fm_u16 val;
  226. fm_u16 rw_flag; /* 0:write, 1:read */
  227. };
  228. struct fm_em_parm {
  229. fm_u16 group_idx;
  230. fm_u16 item_idx;
  231. fm_u32 item_value;
  232. };
  233. struct fm_top_rw_parm {
  234. fm_u8 err;
  235. fm_u8 rw_flag; /* 0:write, 1:read */
  236. fm_u16 addr;
  237. fm_u32 val;
  238. };
  239. struct fm_host_rw_parm {
  240. fm_u8 err;
  241. fm_u8 rw_flag; /* 0:write, 1:read */
  242. fm_u32 addr;
  243. fm_u32 val;
  244. };
  245. enum {
  246. FM_SUBSYS_RST_OFF,
  247. FM_SUBSYS_RST_START,
  248. FM_SUBSYS_RST_END,
  249. FM_SUBSYS_RST_MAX
  250. };
  251. enum {
  252. FM_TX_PWR_CTRL_DISABLE,
  253. FM_TX_PWR_CTRL_ENABLE,
  254. FM_TX_PWR_CTRL_MAX
  255. };
  256. enum {
  257. FM_TX_RTC_CTRL_DISABLE,
  258. FM_TX_RTC_CTRL_ENABLE,
  259. FM_TX_RTC_CTRL_MAX
  260. };
  261. enum {
  262. FM_TX_DESENSE_DISABLE,
  263. FM_TX_DESENSE_ENABLE,
  264. FM_TX_DESENSE_MAX
  265. };
  266. struct fm_softmute_tune_t {
  267. fm_s32 rssi; /* RSSI of current channel */
  268. fm_u16 freq; /* current frequency */
  269. fm_bool valid; /* current channel is valid(true) or not(false) */
  270. };
  271. struct fm_search_threshold_t {
  272. fm_s32 th_type; /* 0, RSSI. 1,desense RSSI. 2,SMG. */
  273. fm_s32 th_val; /* threshold value */
  274. fm_s32 reserve;
  275. };
  276. typedef struct {
  277. int which;
  278. bool stat;
  279. } fm_status_t;
  280. /* init and deinit APIs */
  281. extern fm_s32 fm_env_setup(void);
  282. extern fm_s32 fm_env_destroy(void);
  283. extern struct fm *fm_dev_init(fm_u32 arg);
  284. extern fm_s32 fm_dev_destroy(struct fm *fm);
  285. /* fm main basic APIs */
  286. extern enum fm_pwr_state fm_pwr_state_get(struct fm *fmp);
  287. extern enum fm_pwr_state fm_pwr_state_set(struct fm *fmp, enum fm_pwr_state sta);
  288. extern fm_s32 fm_open(struct fm *fmp);
  289. extern fm_s32 fm_close(struct fm *fmp);
  290. extern fm_s32 fm_rds_read(struct fm *fmp, fm_s8 *dst, fm_s32 len);
  291. extern fm_s32 fm_powerup(struct fm *fm, struct fm_tune_parm *parm);
  292. extern fm_s32 fm_powerdown(struct fm *fm, int type);
  293. extern fm_s32 fm_seek(struct fm *fm, struct fm_seek_parm *parm);
  294. extern fm_s32 fm_scan(struct fm *fm, struct fm_scan_parm *parm);
  295. extern fm_s32 fm_cqi_get(struct fm *fm, fm_s32 ch_num, fm_s8 *buf, fm_s32 buf_size);
  296. extern fm_s32 fm_get_hw_info(struct fm *pfm, struct fm_hw_info *req);
  297. extern fm_s32 fm_hwscan_stop(struct fm *fm);
  298. extern fm_s32 fm_ana_switch(struct fm *fm, fm_s32 antenna);
  299. extern fm_s32 fm_setvol(struct fm *fm, fm_u32 vol);
  300. extern fm_s32 fm_getvol(struct fm *fm, fm_u32 *vol);
  301. extern fm_s32 fm_mute(struct fm *fm, fm_u32 bmute);
  302. extern fm_s32 fm_getrssi(struct fm *fm, fm_s32 *rssi);
  303. extern fm_s32 fm_reg_read(struct fm *fm, fm_u8 addr, fm_u16 *val);
  304. extern fm_s32 fm_reg_write(struct fm *fm, fm_u8 addr, fm_u16 val);
  305. extern fm_s32 fm_top_read(struct fm *fm, fm_u16 addr, fm_u32 *val);
  306. extern fm_s32 fm_top_write(struct fm *fm, fm_u16 addr, fm_u32 val);
  307. extern fm_s32 fm_host_read(struct fm *fm, fm_u32 addr, fm_u32 *val);
  308. extern fm_s32 fm_host_write(struct fm *fm, fm_u32 addr, fm_u32 val);
  309. extern fm_s32 fm_chipid_get(struct fm *fm, fm_u16 *chipid);
  310. extern fm_s32 fm_monostereo_get(struct fm *fm, fm_u16 *ms);
  311. extern fm_s32 fm_monostereo_set(struct fm *fm, fm_s32 ms);
  312. extern fm_s32 fm_pamd_get(struct fm *fm, fm_u16 *pamd);
  313. extern fm_s32 fm_caparray_get(struct fm *fm, fm_s32 *ca);
  314. extern fm_s32 fm_em_test(struct fm *fm, fm_u16 group, fm_u16 item, fm_u32 val);
  315. extern fm_s32 fm_rds_onoff(struct fm *fm, fm_u16 rdson_off);
  316. extern fm_s32 fm_rds_good_bc_get(struct fm *fm, fm_u16 *gbc);
  317. extern fm_s32 fm_rds_bad_bc_get(struct fm *fm, fm_u16 *bbc);
  318. extern fm_s32 fm_rds_bler_ratio_get(struct fm *fm, fm_u16 *bbr);
  319. extern fm_s32 fm_rds_group_cnt_get(struct fm *fm, struct rds_group_cnt_t *dst);
  320. extern fm_s32 fm_rds_group_cnt_reset(struct fm *fm);
  321. extern fm_s32 fm_rds_log_get(struct fm *fm, struct rds_rx_t *dst, fm_s32 *dst_len);
  322. extern fm_s32 fm_rds_block_cnt_reset(struct fm *fm);
  323. extern fm_s32 fm_i2s_set(struct fm *fm, fm_s32 onoff, fm_s32 mode, fm_s32 sample);
  324. extern fm_s32 fm_get_i2s_info(struct fm *pfm, struct fm_i2s_info *req);
  325. extern fm_s32 fm_tune(struct fm *fm, struct fm_tune_parm *parm);
  326. extern fm_s32 fm_is_dese_chan(struct fm *pfm, fm_u16 freq);
  327. extern fm_s32 fm_desense_check(struct fm *pfm, fm_u16 freq, fm_s32 rssi);
  328. extern fm_s32 fm_sys_state_get(struct fm *fmp);
  329. extern fm_s32 fm_sys_state_set(struct fm *fmp, fm_s32 sta);
  330. extern fm_s32 fm_set_stat(struct fm *fmp, int which, bool stat);
  331. extern fm_s32 fm_get_stat(struct fm *fmp, int which, bool *stat);
  332. extern fm_s32 fm_subsys_reset(struct fm *fm);
  333. extern fm_s32 fm_scan_new(struct fm *fm, struct fm_scan_t *parm);
  334. extern fm_s32 fm_seek_new(struct fm *fm, struct fm_seek_t *parm);
  335. extern fm_s32 fm_tune_new(struct fm *fm, struct fm_tune_t *parm);
  336. extern fm_s32 fm_cust_config_setup(fm_s8 *filename);
  337. extern fm_s32 fm_cqi_log(void);
  338. extern fm_s32 fm_soft_mute_tune(struct fm *fm, struct fm_softmute_tune_t *parm);
  339. extern fm_s32 fm_pre_search(struct fm *fm);
  340. extern fm_s32 fm_restore_search(struct fm *fm);
  341. extern fm_s32 fm_dump_reg(void);
  342. extern fm_s32 fm_get_gps_rtc_info(struct fm_gps_rtc_info *src);
  343. extern fm_s32 fm_over_bt(struct fm *fm, fm_s32 flag);
  344. extern fm_s32 fm_set_search_th(struct fm *fm, struct fm_search_threshold_t parm);
  345. extern fm_s32 fm_get_aud_info(fm_audio_info_t *data);
  346. /*tx function*/
  347. extern fm_s32 fm_tx_support(struct fm *fm, fm_s32 *support);
  348. extern fm_s32 fm_powerup_tx(struct fm *fm, struct fm_tune_parm *parm);
  349. extern fm_s32 fm_tune_tx(struct fm *fm, struct fm_tune_parm *parm);
  350. extern fm_s32 fm_powerdowntx(struct fm *fm);
  351. extern fm_s32 fm_rds_tx(struct fm *fm, struct fm_rds_tx_parm *parm);
  352. extern fm_s32 fm_rdstx_support(struct fm *fm, fm_s32 *support);
  353. extern fm_s32 fm_rdstx_enable(struct fm *fm, fm_s32 enable);
  354. extern fm_s32 fm_tx_scan(struct fm *fm, struct fm_tx_scan_parm *parm);
  355. fm_s32 fm_full_cqi_logger(fm_full_cqi_log_t *setting);
  356. #endif /* __FM_MAIN_H__ */