ipc.c 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300
  1. /*
  2. * Copyright 2016, Yichip Semiconductor(shenzhen office)
  3. * All Rights Reserved.
  4. *
  5. * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Yichip Semiconductor;
  6. * the contents of this file may not be disclosed to third parties, copied
  7. * or duplicated in any form, in whole or in part, without the prior
  8. * written permission of Yichip Semiconductor.
  9. */
  10. /** @file
  11. *
  12. * IPC Application for c51 devices
  13. *
  14. */
  15. #include "ipc.h"
  16. #include "yc11xx.h"
  17. #include <string.h>
  18. #include "yc_drv_common.h"
  19. #define IPC_RX_BUFF_LEN (200)
  20. #define IPC_TX_BUFF_LEN (100)
  21. static tIPCControlBlock ipcCb;
  22. static tIPCHandleCbArray ipcCbArray;
  23. uint8_t ipcReadBuff[IPC_RX_BUFF_LEN];
  24. uint8_t ipcSendBuff[IPC_TX_BUFF_LEN];
  25. uint8_t gIPC_test;
  26. void IpcDefaultCallBack(uint8_t len,uint8_t *dataPtr)
  27. {
  28. gIPC_test++;
  29. return;
  30. }
  31. void IPC_Initialize(tIPCControlBlock *Cb)
  32. {
  33. ipcCb = *Cb;
  34. }
  35. void IPC_init(tIPCHandleCbArray cbArrayPtr)
  36. {
  37. ipcCbArray = cbArrayPtr;
  38. return;
  39. }
  40. static void ipcRx(uint8_t* Dest, uint16_t Len)
  41. {
  42. uint32_t RxPtr = HR_REG_24BIT(reg_map(IPC_RX_READ_PTR));
  43. for (uint16_t i=0; i<Len; i++) {
  44. Dest[i] = HREAD(RxPtr);
  45. if(++RxPtr >= IPC_RX_END)
  46. RxPtr = IPC_RX_HEAD;
  47. }
  48. HWRITE24BIT(IPC_RX_READ_PTR, RxPtr);
  49. }
  50. static void ipcTx(uint8_t* Src, uint8_t Len)
  51. {
  52. int me;
  53. uint32_t TxPtr;
  54. IPC_WaitBufferEnough(Len);
  55. TxPtr = HR_REG_24BIT(reg_map(IPC_TX_WRITE_PTR));
  56. for (uint16_t i=0; i<Len; i++) {
  57. HWRITE(TxPtr, Src[i]);
  58. if(++TxPtr >= IPC_TX_END)
  59. TxPtr = IPC_TX_HEAD;
  60. me=100;
  61. while(me--);
  62. }
  63. HWRITE24BIT(IPC_TX_WRITE_PTR, TxPtr);
  64. }
  65. uint8_t IPC_TxBufferIsEnough(uint8_t Len)
  66. {
  67. uint32_t TxPtr = HR_REG_24BIT(reg_map(IPC_TX_WRITE_PTR));
  68. uint32_t TxReadPtr = HR_REG_24BIT(reg_map(IPC_TX_READ_PTR));
  69. for (uint16_t i=0; i<Len; i++) {
  70. if(++TxPtr >= IPC_TX_END)
  71. TxPtr = IPC_TX_HEAD;
  72. if(TxPtr == TxReadPtr)
  73. return 0;
  74. }
  75. return 1;
  76. }
  77. uint8_t IPC_WaitBufferEnough(uint8_t Len)
  78. {
  79. int m;
  80. while(1){
  81. if(IPC_TxBufferIsEnough(Len))
  82. {
  83. return 1;
  84. }
  85. else
  86. {
  87. m = 1000;
  88. while(m--);
  89. }
  90. }
  91. }
  92. void IPC_TxCommon(uint8_t Type, uint8_t* Dt, uint8_t Len)
  93. {
  94. ipcSendBuff[0] = Type;
  95. if (Len == 0)
  96. return;
  97. if (IPC_MCU_STATE_LMP == HREAD(IPC_MCU_STATE))
  98. {
  99. HWRITE(IPC_MCU_STATE,IPC_MCU_STATE_RUNNING);
  100. }
  101. ipcSendBuff[1] = Len;
  102. memcpy(&ipcSendBuff[2], Dt, Len);
  103. ipcTx(ipcSendBuff, Len + 2);
  104. }
  105. void IPC_TxPacket(IPC_DATA_FORMAT *packet)
  106. {
  107. if (packet->len == 0)
  108. return;
  109. if (IPC_MCU_STATE_LMP == HREAD(IPC_MCU_STATE))
  110. {
  111. HWRITE(IPC_MCU_STATE,IPC_MCU_STATE_RUNNING);
  112. }
  113. ipcTx((unsigned char*)packet, packet->len+ 2);
  114. }
  115. void IPC_TxControlCmd(uint8_t Cmd)
  116. {
  117. #define IPC_CMD_LEN 3
  118. uint8_t cmdBuff[IPC_CMD_LEN] = {IPC_TYPE_CMD,0x01};
  119. if (IPC_MCU_STATE_LMP == HREAD(IPC_MCU_STATE))
  120. {
  121. HWRITE(IPC_MCU_STATE,IPC_MCU_STATE_RUNNING);
  122. }
  123. cmdBuff[IPC_CMD_LEN - 1] = Cmd;
  124. ipcTx(cmdBuff, IPC_CMD_LEN);
  125. }
  126. uint8_t IPC_GetBBDIsconnectReason()
  127. {
  128. return 0;
  129. }
  130. uint8_t IPC_CheckServerConenct()
  131. {
  132. return 0;
  133. }
  134. uint8_t IPC_CheckReconnect()
  135. {
  136. return 0;
  137. }
  138. void IPC_WaitLpm()
  139. {
  140. int dayloop = 10000;
  141. while(dayloop--) hw_delay();
  142. }
  143. void IPC_AbandonLpm()
  144. {
  145. hw_delay();
  146. //HW_REG_8BIT(IPC_M0_BUSY_FALG_ADDR, 0);
  147. }
  148. void IPC_DisableLpm()
  149. {
  150. hw_delay();
  151. //HW_REG_8BIT(IPC_LPM_FLAG_ADDR, 0);
  152. }
  153. void IPC_EnableLpm()
  154. {
  155. hw_delay();
  156. //HW_REG_8BIT(IPC_LPM_FLAG_ADDR, 1);
  157. }
  158. uint8_t IPC_IsTxBuffEmpty()
  159. {
  160. uint32_t TxReadPtr = HR_REG_24BIT(reg_map(IPC_TX_READ_PTR));
  161. uint32_t TxWritePtr = HR_REG_24BIT(reg_map(IPC_TX_WRITE_PTR));
  162. if (TxWritePtr == TxReadPtr)
  163. return 1;
  164. return 0;
  165. }
  166. uint8_t IPC_IsRxBuffEmpty()
  167. {
  168. uint32_t RxReadPtr = HR_REG_24BIT(reg_map(IPC_RX_READ_PTR));
  169. uint32_t RxWritePtr = HR_REG_24BIT(reg_map(IPC_RX_WRITE_PTR));
  170. if (RxReadPtr == RxWritePtr)
  171. return 1;
  172. return 0;
  173. }
  174. uint16_t a2dpLen;
  175. void IPC_HandleRxPacket()
  176. {
  177. uint8_t *pbuff = ipcReadBuff;
  178. if (IPC_IsRxBuffEmpty())
  179. return;
  180. ipcRx(ipcReadBuff, 2);
  181. if(*pbuff > IPC_TYPE_START && *pbuff < IPC_TYPE_NUM)
  182. {
  183. ipcRx(ipcReadBuff+2, *(pbuff+1));
  184. //(*gIPCHandleCb[*pbuff])(*(pbuff+1),pbuff+2);
  185. (*(*ipcCbArray)[*pbuff])(*(pbuff+1),pbuff+2);
  186. }
  187. else
  188. {
  189. while(1);
  190. }
  191. }
  192. /**
  193. void IPC_DealSingleStep()
  194. {
  195. #define IPC_FRAME_HEAD_SIZE 3
  196. uint8_t *pbuff = ipcReadBuff;
  197. if (IPC_IsRxBuffEmpty())
  198. return;
  199. ipcRx(ipcReadBuff, IPC_FRAME_HEAD_SIZE);
  200. if (*pbuff == IPC_CONTROL_EVT) { //event
  201. pbuff += 2;
  202. ipcCb.evtcb(*pbuff);
  203. }
  204. else if (*pbuff == IPC_SPP_DATA) {
  205. pbuff++;
  206. ipcRx(ipcReadBuff+IPC_FRAME_HEAD_SIZE, *pbuff -1);
  207. ipcCb.sppcb(pbuff+1, *pbuff);
  208. }
  209. else if (*pbuff == IPC_BLE_DATA) { //ble data
  210. pbuff++;
  211. ipcRx(ipcReadBuff+IPC_FRAME_HEAD_SIZE, *pbuff -1);
  212. ipcCb.blecb(pbuff+1, *pbuff);
  213. }
  214. else if (*pbuff == IPC_ADV_DATA) { //adv data
  215. pbuff++;
  216. ipcRx(ipcReadBuff+IPC_FRAME_HEAD_SIZE, *pbuff -1);
  217. ipcCb.advcb(pbuff+1, *pbuff);
  218. }
  219. }
  220. void IPC_set_ack_flag()
  221. {
  222. HWRITE(IPC_MCU_PHASE,IPC_MCU_PHASE1_ACK);
  223. HWRITE(IPC_MCU_STATE,IPC_MCU_STATE_RUNNING);
  224. }
  225. void IPC_set_nack_flag()
  226. {
  227. HWRITE(IPC_MCU_PHASE,IPC_MCU_PHASE1_NACK);
  228. HWRITE(IPC_MCU_STATE,IPC_MCU_STATE_RUNNING);
  229. }
  230. void IPC_clear_flag()
  231. {
  232. HWRITE(IPC_MCU_PHASE,IPC_MCU_PHASE_IDLE);
  233. HWRITE(IPC_MCU_STATE,IPC_MCU_STATE_RUNNING);
  234. }
  235. void IPC_wait_ack()
  236. {
  237. int i;
  238. while(1)
  239. {
  240. i = 500;
  241. while(i--);
  242. switch (HREAD(IPC_MCU_PHASE))
  243. {
  244. case IPC_MCU_PHASE2_ACK:
  245. break;
  246. case IPC_MCU_PHASE_IDLE:
  247. return;
  248. }
  249. }
  250. }
  251. **/