mb.c 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355
  1. /******************************************************************************
  2. 版权所有: 文件名称: mb.c
  3. 文件名称: mb.c
  4. 文件版本: 01.01
  5. 创建作者: sunxi
  6. 创建日期: 2022-05-17
  7. 功能说明: 邮箱驱动
  8. 其它说明:
  9. 修改记录:
  10. */
  11. #include "bspconfig.h"
  12. #include "bsp.h"
  13. #include "mb.h"
  14. #include <stdio.h>
  15. #include <stdlib.h>
  16. #include <stdint.h>
  17. #include <string.h>
  18. #include <fcntl.h>
  19. #include <unistd.h>
  20. #include <sys/ioctl.h>
  21. #include <sys/mman.h>
  22. #include <pthread.h>
  23. #include <stdbool.h>
  24. #define CO_IOCTL_GET_REG 1
  25. #define CO_IOCTL_SET_REG 2
  26. #define CO_IOCTL_EXECUTE 3
  27. #define CO_IOCTL_GET_DATA 4
  28. #define CO_IOCTL_SET_DATA 5
  29. #define CO_IOCTL_GET_CONFIGS 6
  30. #define CO_IOCTL_SET_PC 7
  31. #ifndef CO_MB_FIFO_SIZE
  32. #define CO_MB_FIFO_SIZE 32//经测试,只能这么大的buf
  33. #endif
  34. struct co_io {
  35. uint8_t meta;
  36. uint16_t metadata;
  37. uint32_t data[CO_MB_FIFO_SIZE - 1];
  38. uint8_t len;
  39. };
  40. struct mb_co {
  41. char *name;
  42. pthread_t thread_id;
  43. int fd_co;
  44. struct co_io coio;
  45. };
  46. static struct mb_co *pmb;
  47. static inline void dmsg_u8(uint8_t *data, int length, char *str)
  48. {
  49. int i, j;
  50. int tmp;
  51. printf("%s:\n", str);
  52. for (i = 0; i < (length / 16); i++)
  53. {
  54. for (j = 0; j < 16; j++)
  55. printf("%02x ", data[i * 16 + j]);
  56. printf("\n");
  57. }
  58. tmp = (length / 16) * 16;
  59. for (i = 0; i < (length % 16); i++)
  60. printf("%02x ", data[tmp + i]);
  61. if (length % 16)
  62. printf("\n");
  63. }
  64. /******************************************************************************
  65. 函数名称: mb_write
  66. 函数版本: 01.01
  67. 创建作者: sunxi
  68. 创建日期: 2022-05-17
  69. 函数说明: 向邮箱写入数据.
  70. 参数说明:
  71. cmd:命令号
  72. data:写入数据
  73. len:写入数据长度,注意: 如果转入2个uint32_t的数据,那么长度为2,不是8.
  74. 返回值: 成功返回0, 失败返回-1
  75. 修改记录:
  76. !!!!!!!!! 注意: 如果转入2个uint32_t的数据,那么长度为2,不是8.
  77. */
  78. int mb_write(uint16_t cmd, uint32_t *data, uint8_t len)
  79. {
  80. return 0;//noted by ygl: 邮箱功能暂时不实现
  81. int i;
  82. int ret;
  83. struct mb_co *co = NULL;
  84. if(pmb == NULL)
  85. return -1;
  86. if(data == NULL)
  87. return -1;
  88. if(len > (CO_MB_FIFO_SIZE - 1))
  89. return -1;
  90. co = pmb;
  91. for (i = 0; i < len; i++)
  92. co->coio.data[i] = data[i];
  93. /*
  94. meta =0时,metadata无效,对方收不到metadata值。
  95. meta =为非0时,metadata置数,对方也收到metadata值。
  96. */
  97. /* ipc message parameters */
  98. co->coio.meta = 1;//noted by sunxi: 与裸核,约定为1
  99. co->coio.metadata = cmd;
  100. co->coio.len = len;
  101. #if 0
  102. for (i = 0; i < co->coio.len; i++)
  103. printf("%04X ", co->coio.data[i]);
  104. printf("\r\n");
  105. #endif
  106. ret = ioctl(co->fd_co, CO_IOCTL_SET_DATA, &co->coio);
  107. if (ret)
  108. printf("send to %s failed, ret = %d\n",co->name, ret);
  109. return 0;
  110. }
  111. /******************************************************************************
  112. 函数名称: mb_notice_time_update
  113. 函数版本: 01.01
  114. 创建作者: sunxi
  115. 创建日期: 2022-05-17
  116. 函数说明: 用邮箱告知时间更新了
  117. 参数说明:
  118. 返回值: 成功返回0, 失败返回-1
  119. 修改记录:
  120. */
  121. int mb_notice_time_update(void)
  122. {
  123. int ret;
  124. uint32_t data[31];
  125. data[0] = MB_CMD_TIME;
  126. data[1] = MB_CMD_TIME;
  127. ret = mb_write(MB_CMD_TIME, data, 2);
  128. if(ret<0)
  129. printf("mb_write fail!!! ret= %d\n", ret);
  130. return ret;
  131. }
  132. /******************************************************************************
  133. 函数名称: mb_notice_freqTr_update
  134. 函数版本: 01.01
  135. 创建作者: sunxi
  136. 创建日期: 2022-05-17
  137. 函数说明: 用邮箱告知频率跟踪更新了
  138. 参数说明:
  139. 返回值: 成功返回0, 失败返回-1
  140. 修改记录:
  141. */
  142. int mb_notice_freqTr_update(void)
  143. {
  144. int ret;
  145. uint32_t data[31];
  146. data[0] = MB_CMD_FREQTR;
  147. data[1] = MB_CMD_FREQTR;
  148. ret = mb_write(MB_CMD_FREQTR, data, 2);
  149. if(ret<0)
  150. printf("mb_write fail!!! ret= %d\n", ret);
  151. return ret;
  152. }
  153. /******************************************************************************
  154. 函数名称: mb_notice_RfV_update
  155. 函数版本: 01.01
  156. 创建作者: sunxi
  157. 创建日期: 2022-05-17
  158. 函数说明: 用邮箱告知AD7616参考电压范围更新了
  159. 参数说明:
  160. no:第n片7616
  161. 返回值: 成功返回0, 失败返回-1
  162. 修改记录:
  163. */
  164. int mb_notice_RfV_update(uint8_t no)
  165. {
  166. int ret;
  167. uint32_t data[31];
  168. data[0] = no;
  169. data[1] = no;
  170. ret = mb_write(MB_CMD_RfV, data, 2);
  171. if(ret<0)
  172. printf("mb_write fail!!! ret= %d\n", ret);
  173. return ret;
  174. }
  175. static int co_mb_open(struct mb_co *co, char *name)
  176. {
  177. int fd_co;
  178. printf("open co mb dev %s\n", name);
  179. fd_co = open(name, O_RDWR);
  180. if (!fd_co) {
  181. printf("open co dev failed\n");
  182. return -1;
  183. }
  184. co->name = name;
  185. co->fd_co = fd_co;
  186. return 0;
  187. }
  188. static void *thread_co_test(void *arg)
  189. {
  190. struct mb_co *co = pmb;
  191. //int i;
  192. int ret;
  193. while (1) {
  194. sleep(1);
  195. #if 0
  196. crc++;
  197. for (i = 0; i < (CO_MB_FIFO_SIZE - 1); i++)
  198. data[i] = i+crc;
  199. ret = mb_write(MB_CMD_TIME, data, 31);
  200. if(ret<0)
  201. printf("send to %s failed, ret = %d\n",co->name, ret);
  202. #endif
  203. ret = mb_notice_time_update();
  204. if(ret<0)
  205. printf("send to %s failed, ret = %d\n",co->name, ret);
  206. }
  207. printf("thread co exit\r\n");
  208. pthread_exit(NULL);
  209. }
  210. //测试代码
  211. void mb_test(void)
  212. {
  213. int ret;
  214. if((ret = pthread_create(&pmb->thread_id, NULL, thread_co_test, pmb)) == 0)
  215. printf("thread co0 create success\r\n");
  216. else
  217. printf("thread co0 create fail ret=%d\r\n", ret);
  218. }
  219. /******************************************************************************
  220. 函数名称: mb_init
  221. 函数版本: 01.01
  222. 创建作者: sunxi
  223. 创建日期: 2022-05-17
  224. 函数说明: mb初始化.
  225. 参数说明:
  226. 返回值: 成功返回0, 失败返回-1
  227. 修改记录:
  228. */
  229. int mb_init(void)
  230. {
  231. // int ret;
  232. pmb = malloc(sizeof(struct mb_co));
  233. memset(pmb, 0, sizeof(struct mb_co));
  234. if(co_mb_open(pmb, "/dev/arv-shmem")) {
  235. printf("open mb error\r\n");
  236. return -1;
  237. }
  238. //mb_test();//sunxi for test
  239. return 0;
  240. }
  241. /******************************************************************************
  242. 函数名称: mb_exit
  243. 函数版本: 01.01
  244. 创建作者: sunxi
  245. 创建日期: 2022-05-17
  246. 函数说明: mb反初始化.
  247. 参数说明:
  248. 返回值: 总是返回0.
  249. 修改记录:
  250. */
  251. int mb_exit(void)
  252. {
  253. if(pmb)
  254. {
  255. if(pmb->fd_co)
  256. close(pmb->fd_co);
  257. }
  258. return 0;
  259. }