fm_utils.h 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304
  1. #ifndef __FM_UTILS_H__
  2. #define __FM_UTILS_H__
  3. #include "fm_typedef.h"
  4. /**
  5. * Base structure of fm object
  6. */
  7. #define FM_NAME_MAX 20
  8. struct fm_object {
  9. fm_s8 name[FM_NAME_MAX + 1]; /* name of fm object */
  10. fm_u8 type; /* type of fm object */
  11. fm_u8 flag; /* flag of fm object */
  12. fm_s32 ref;
  13. void *priv;
  14. };
  15. /*
  16. * FM FIFO
  17. */
  18. struct fm_fifo {
  19. struct fm_object obj;
  20. fm_s32 size;
  21. fm_s32 in;
  22. fm_s32 out;
  23. fm_s32 len;
  24. fm_s32 item_size;
  25. fm_s32 (*input)(struct fm_fifo *thiz, void *item);
  26. fm_s32 (*output)(struct fm_fifo *thiz, void *item);
  27. fm_bool (*is_full)(struct fm_fifo *thiz);
  28. fm_bool (*is_empty)(struct fm_fifo *thiz);
  29. fm_s32 (*get_total_len)(struct fm_fifo *thiz);
  30. fm_s32 (*get_valid_len)(struct fm_fifo *thiz);
  31. fm_s32 (*reset)(struct fm_fifo *thiz);
  32. };
  33. extern struct fm_fifo *fm_fifo_init(struct fm_fifo *fifo, void *buf, const fm_s8 *name,
  34. fm_s32 item_size, fm_s32 item_num);
  35. extern struct fm_fifo *fm_fifo_create(const fm_s8 *name, fm_s32 item_size, fm_s32 item_num);
  36. extern fm_s32 fm_fifo_release(struct fm_fifo *fifo);
  37. #define FM_FIFO_INPUT(fifop, item) \
  38. ({ \
  39. fm_s32 __ret = (fm_s32)0; \
  40. if (fifop && (fifop)->input) { \
  41. __ret = (fifop)->input(fifop, item); \
  42. } \
  43. __ret; \
  44. })
  45. #define FM_FIFO_OUTPUT(fifop, item) \
  46. ({ \
  47. fm_s32 __ret = (fm_s32)0; \
  48. if (fifop && (fifop)->output) { \
  49. __ret = (fifop)->output(fifop, item); \
  50. } \
  51. __ret; \
  52. })
  53. #define FM_FIFO_IS_FULL(fifop) \
  54. ({ \
  55. fm_bool __ret = fm_false; \
  56. if (fifop && (fifop)->is_full) { \
  57. __ret = (fifop)->is_full(fifop); \
  58. } \
  59. __ret; \
  60. })
  61. #define FM_FIFO_IS_EMPTY(fifop) \
  62. ({ \
  63. fm_bool __ret = fm_false; \
  64. if (fifop && (fifop)->is_empty) { \
  65. __ret = (fifop)->is_empty(fifop); \
  66. } \
  67. __ret; \
  68. })
  69. #define FM_FIFO_RESET(fifop) \
  70. ({ \
  71. fm_s32 __ret = (fm_s32)0; \
  72. if (fifop && (fifop)->reset) { \
  73. __ret = (fifop)->reset(fifop); \
  74. } \
  75. __ret; \
  76. })
  77. #define FM_FIFO_GET_TOTAL_LEN(fifop) \
  78. ({ \
  79. fm_s32 __ret = (fm_s32)0; \
  80. if (fifop && (fifop)->get_total_len) { \
  81. __ret = (fifop)->get_total_len(fifop); \
  82. } \
  83. __ret; \
  84. })
  85. #define FM_FIFO_GET_VALID_LEN(fifop) \
  86. ({ \
  87. fm_s32 __ret = (fm_s32)0; \
  88. if (fifop && (fifop)->get_valid_len) { \
  89. __ret = (fifop)->get_valid_len(fifop); \
  90. } \
  91. __ret; \
  92. })
  93. /*
  94. * FM asynchronous information mechanism
  95. */
  96. struct fm_flag_event {
  97. fm_s32 ref;
  98. fm_s8 name[FM_NAME_MAX + 1];
  99. void *priv;
  100. volatile fm_u32 flag;
  101. /* flag methods */
  102. fm_u32 (*send)(struct fm_flag_event *thiz, fm_u32 mask);
  103. fm_s32 (*wait)(struct fm_flag_event *thiz, fm_u32 mask);
  104. long (*wait_timeout)(struct fm_flag_event *thiz, fm_u32 mask, long timeout);
  105. fm_u32 (*clr)(struct fm_flag_event *thiz, fm_u32 mask);
  106. fm_u32 (*get)(struct fm_flag_event *thiz);
  107. fm_u32 (*rst)(struct fm_flag_event *thiz);
  108. };
  109. extern struct fm_flag_event *fm_flag_event_create(const fm_s8 *name);
  110. extern fm_s32 fm_flag_event_get(struct fm_flag_event *thiz);
  111. extern fm_s32 fm_flag_event_put(struct fm_flag_event *thiz);
  112. #define FM_EVENT_SEND(eventp, mask) \
  113. ({ \
  114. fm_u32 __ret = (fm_u32)0; \
  115. if (eventp && (eventp)->send) { \
  116. __ret = (eventp)->send(eventp, mask); \
  117. } \
  118. __ret; \
  119. })
  120. #define FM_EVENT_WAIT(eventp, mask) \
  121. ({ \
  122. fm_s32 __ret = (fm_s32)0; \
  123. if (eventp && (eventp)->wait) { \
  124. __ret = (eventp)->wait(eventp, mask); \
  125. } \
  126. __ret; \
  127. })
  128. #define FM_EVENT_WAIT_TIMEOUT(eventp, mask, timeout) \
  129. ({ \
  130. long __ret = (long)0; \
  131. if (eventp && (eventp)->wait_timeout) { \
  132. __ret = (eventp)->wait_timeout(eventp, mask, timeout); \
  133. } \
  134. __ret; \
  135. })
  136. #define FM_EVENT_GET(eventp) \
  137. ({ \
  138. fm_u32 __ret = (fm_u32)0; \
  139. if (eventp && (eventp)->get) { \
  140. __ret = (eventp)->get(eventp); \
  141. } \
  142. __ret; \
  143. })
  144. #define FM_EVENT_RESET(eventp) \
  145. ({ \
  146. fm_u32 __ret = (fm_u32)0; \
  147. if (eventp && (eventp)->rst) { \
  148. __ret = (eventp)->rst(eventp); \
  149. } \
  150. __ret; \
  151. })
  152. #define FM_EVENT_CLR(eventp, mask) \
  153. ({ \
  154. fm_u32 __ret = (fm_u32)0; \
  155. if (eventp && (eventp)->clr) { \
  156. __ret = (eventp)->clr(eventp, mask); \
  157. } \
  158. __ret; \
  159. })
  160. /*
  161. * FM lock mechanism
  162. */
  163. struct fm_lock {
  164. fm_s8 name[FM_NAME_MAX + 1];
  165. fm_s32 ref;
  166. void *priv;
  167. /* lock methods */
  168. fm_s32 (*lock)(struct fm_lock *thiz);
  169. fm_s32 (*trylock)(struct fm_lock *thiz, fm_s32 retryCnt);
  170. fm_s32 (*unlock)(struct fm_lock *thiz);
  171. };
  172. extern struct fm_lock *fm_lock_create(const fm_s8 *name);
  173. extern fm_s32 fm_lock_get(struct fm_lock *thiz);
  174. extern fm_s32 fm_lock_put(struct fm_lock *thiz);
  175. extern struct fm_lock *fm_spin_lock_create(const fm_s8 *name);
  176. extern fm_s32 fm_spin_lock_get(struct fm_lock *thiz);
  177. extern fm_s32 fm_spin_lock_put(struct fm_lock *thiz);
  178. #define FM_LOCK(a) \
  179. ({ \
  180. fm_s32 __ret = (fm_s32)0; \
  181. if (a && (a)->lock) { \
  182. __ret = (a)->lock(a); \
  183. } \
  184. __ret; \
  185. })
  186. #define FM_UNLOCK(a) \
  187. { \
  188. if ((a)->unlock) { \
  189. (a)->unlock(a); \
  190. } \
  191. }
  192. /*
  193. * FM timer mechanism
  194. */
  195. enum fm_timer_ctrl {
  196. FM_TIMER_CTRL_GET_TIME = 0,
  197. FM_TIMER_CTRL_SET_TIME = 1,
  198. FM_TIMER_CTRL_MAX
  199. };
  200. #define FM_TIMER_FLAG_ACTIVATED (1<<0)
  201. struct fm_timer {
  202. fm_s32 ref;
  203. fm_s8 name[FM_NAME_MAX + 1];
  204. void *priv; /* platform detail impliment */
  205. fm_s32 flag; /* timer active/inactive */
  206. void (*timeout_func)(unsigned long data); /* timeout function */
  207. unsigned long data; /* timeout function's parameter */
  208. signed long timeout_ms; /* timeout tick */
  209. /* Tx parameters */
  210. volatile fm_u32 count;
  211. volatile fm_u8 tx_pwr_ctrl_en;
  212. volatile fm_u8 tx_rtc_ctrl_en;
  213. volatile fm_u8 tx_desense_en;
  214. /* timer methods */
  215. fm_s32 (*init)(struct fm_timer *thiz, void (*timeout) (unsigned long data),
  216. unsigned long data, signed long time, fm_s32 flag);
  217. fm_s32 (*start)(struct fm_timer *thiz);
  218. fm_s32 (*update)(struct fm_timer *thiz);
  219. fm_s32 (*stop)(struct fm_timer *thiz);
  220. fm_s32 (*control)(struct fm_timer *thiz, enum fm_timer_ctrl cmd, void *arg);
  221. };
  222. extern struct fm_timer *fm_timer_create(const fm_s8 *name);
  223. extern fm_s32 fm_timer_get(struct fm_timer *thiz);
  224. extern fm_s32 fm_timer_put(struct fm_timer *thiz);
  225. /*
  226. * FM work thread mechanism
  227. */
  228. struct fm_work {
  229. fm_s32 ref;
  230. fm_s8 name[FM_NAME_MAX + 1];
  231. void *priv;
  232. void (*work_func)(unsigned long data);
  233. unsigned long data;
  234. /* work methods */
  235. fm_s32 (*init)(struct fm_work *thiz, void (*work_func) (unsigned long data), unsigned long data);
  236. };
  237. extern struct fm_work *fm_work_create(const fm_s8 *name);
  238. extern fm_s32 fm_work_get(struct fm_work *thiz);
  239. extern fm_s32 fm_work_put(struct fm_work *thiz);
  240. struct fm_workthread {
  241. fm_s32 ref;
  242. fm_s8 name[FM_NAME_MAX + 1];
  243. void *priv;
  244. /* workthread methods */
  245. fm_s32 (*add_work)(struct fm_workthread *thiz, struct fm_work *work);
  246. };
  247. extern struct fm_workthread *fm_workthread_create(const fm_s8 *name);
  248. extern fm_s32 fm_workthread_get(struct fm_workthread *thiz);
  249. extern fm_s32 fm_workthread_put(struct fm_workthread *thiz);
  250. #endif /* __FM_UTILS_H__ */