hv_drv_GpioSimSWire.c 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  1. /**
  2. * @file hv_drv_GpioSimSWire.c
  3. * @brief gpio smulitaion single wire driver layer file.
  4. * @details This file provides the following functions: \n
  5. * (1) gpio simulate swire tx/rx \n
  6. * (2) gpio simulate swire init \n
  7. *
  8. * @author HiView SoC Software Team
  9. * @version 1.0.0
  10. * @date 2023-12-16
  11. * @copyright Copyright(c),2023-12, Hiview Software. All rights reserved.
  12. * @par History:
  13. * <table>
  14. * <tr><th>Author <th>Date <th>Change Description
  15. * </table>
  16. */
  17. #include "Common/hv_comm_DataType.h"
  18. #include "Common/Assert/hv_comm_Assert.h"
  19. #include "hv_comm_Define.h"
  20. #include "hv_cal_Gpio.h"
  21. #include "hv_vos_Comm.h"
  22. #include "hv_drv_GpioSimSWire.h"
  23. #define GPIOSIMSWIRE_DELAY 1U
  24. static GpioSimSWire s_stgpiosimswire[SIMSWIRE_ID_MAX] =
  25. {
  26. {INVALID_PARAM_UHCAR8, INVALID_PARAM_UHCAR8, 1, 1, 1},
  27. };
  28. #define SET_SCK_OUT(uiIndex) Hv_Cal_Gpio_SetDirection(s_stgpiosimswire[uiIndex].ucSckPin, GPIO_DIR_OUTPUT)
  29. #define SET_SCK_IN(uiIndex) Hv_Cal_Gpio_SetDirection(s_stgpiosimswire[uiIndex].ucSckPin, GPIO_DIR_INPUT)
  30. #define SET_SDT_OUT(uiIndex) Hv_Cal_Gpio_SetDirection(s_stgpiosimswire[uiIndex].ucSdtPin, GPIO_DIR_OUTPUT)
  31. #define SET_SDT_IN(uiIndex) Hv_Cal_Gpio_SetDirection(s_stgpiosimswire[uiIndex].ucSdtPin, GPIO_DIR_INPUT)
  32. #define SET_SCK_HIGH(uiIndex) Hv_Cal_Gpio_SetPinLevel(s_stgpiosimswire[uiIndex].ucSckPin, GPIO_LEVEL_HIGH)
  33. #define SET_SCK_LOW(uiIndex) Hv_Cal_Gpio_SetPinLevel(s_stgpiosimswire[uiIndex].ucSckPin, GPIO_LEVEL_LOW)
  34. #define SET_SDT_HIGH(uiIndex) Hv_Cal_Gpio_SetPinLevel(s_stgpiosimswire[uiIndex].ucSdtPin, GPIO_LEVEL_HIGH)
  35. #define SET_SDT_LOW(uiIndex) Hv_Cal_Gpio_SetPinLevel(s_stgpiosimswire[uiIndex].ucSdtPin, GPIO_LEVEL_LOW)
  36. #define GET_SDT_LEVEL(uiIndex) Hv_Cal_Gpio_GetPinLevel(s_stgpiosimswire[uiIndex].ucSdtPin)
  37. #define GET_SCK_TWHL(uiIndex) (s_stgpiosimswire[uiIndex].ucTWHL)
  38. #define GET_SDT_SCK_TSU(uiIndex) (s_stgpiosimswire[uiIndex].ucTSU)
  39. #define GET_SDT_SCK_THL(uiIndex) (s_stgpiosimswire[uiIndex].ucTHL)
  40. /* 1nop about 13 ns */
  41. static inline VOID GpioSimSWire_Delay_Nop(UINT32 uiNop)
  42. {
  43. HV_ASSERT_TRUE_VOID(uiNop > 0);
  44. while(uiNop--)
  45. {
  46. asm("nop");
  47. }
  48. return;
  49. }
  50. /** Initialize gpio simulate single wire
  51. * @param pstGpioSimSwire pointer to swire configuration parameters
  52. * @param enBus select sginle wire bus id
  53. * @return SUCCESS/FAILURE
  54. */
  55. Status Hv_Drv_GpioSimSWire_Init(const GpioSimSWire *pstGpioSimSwire)
  56. {
  57. HV_ASSERT_VALID_PTR_RET(pstGpioSimSwire, HV_FAILURE);
  58. HV_ASSERT_TRUE(pstGpioSimSwire->enBus < SIMSWIRE_ID_MAX);
  59. memcpy(&s_stgpiosimswire[pstGpioSimSwire->enBus], pstGpioSimSwire, sizeof(GpioSimSWire));
  60. SET_SCK_OUT(pstGpioSimSwire->enBus);
  61. SET_SDT_OUT(pstGpioSimSwire->enBus);
  62. SET_SCK_LOW(pstGpioSimSwire->enBus);
  63. SET_SDT_LOW(pstGpioSimSwire->enBus);
  64. return HV_SUCCESS;
  65. }
  66. /** Swire start signal
  67. *@SCK and SDT keep low
  68. */
  69. VOID Hv_GpioSimSWire_Start(UINT32 uiIndex)
  70. {
  71. SET_SCK_OUT(uiIndex);
  72. SET_SDT_OUT(uiIndex);
  73. SET_SDT_LOW(uiIndex);
  74. SET_SCK_LOW(uiIndex);
  75. return;
  76. }
  77. /** Swire stop signal
  78. *@SCK and SDT keep Low
  79. */
  80. VOID Hv_GpioSimSWire_Stop(UINT32 uiIndex)
  81. {
  82. SET_SCK_OUT(uiIndex);
  83. SET_SDT_OUT(uiIndex);
  84. SET_SDT_LOW(uiIndex);
  85. SET_SCK_LOW(uiIndex);
  86. return;
  87. }
  88. /** send data 1 byte
  89. *@ Send data bit by bit and MSB first;
  90. *@ When SCK keep high, data is valid;
  91. */
  92. VOID Hv_GpioSimSWire_Send_Bit(UINT32 uiIndex, UCHAR8 ucBit)
  93. {
  94. SET_SDT_OUT(uiIndex);
  95. SET_SCK_LOW(uiIndex);
  96. if (ucBit)
  97. {
  98. SET_SDT_HIGH(uiIndex);
  99. }
  100. else
  101. {
  102. SET_SDT_LOW(uiIndex);
  103. }
  104. GpioSimSWire_Delay_Nop(GET_SDT_SCK_TSU(uiIndex));
  105. SET_SCK_HIGH(uiIndex);
  106. GpioSimSWire_Delay_Nop(GET_SCK_TWHL(uiIndex));
  107. SET_SCK_LOW(uiIndex);
  108. GpioSimSWire_Delay_Nop(GET_SDT_SCK_THL(uiIndex));
  109. SET_SDT_LOW(uiIndex);
  110. return;
  111. }
  112. /** receive 1 bit
  113. *@Pull SCK high, to read SDT data from slave device bit by bit
  114. */
  115. UCHAR8 Hv_GpioSimSWire_Recv_Bit(UINT32 uiIndex)
  116. {
  117. UCHAR8 ucBit = 0x0;
  118. UCHAR8 ucStep = 0;
  119. SET_SDT_IN(uiIndex);
  120. SET_SCK_LOW(uiIndex);
  121. GpioSimSWire_Delay_Nop(GPIOSIMSWIRE_DELAY);
  122. SET_SCK_HIGH(uiIndex);
  123. if (GET_SDT_LEVEL(uiIndex))
  124. {
  125. ucBit = ucBit | 0x01;
  126. }
  127. GpioSimSWire_Delay_Nop(GPIOSIMSWIRE_DELAY);
  128. SET_SCK_LOW(uiIndex);
  129. return ucBit;
  130. }
  131. /** send data 1 byte
  132. *@ Send data bit by bit and MSB first;
  133. *@ When SCK keep high, data is valid;
  134. */
  135. VOID Hv_GpioSimSWire_Send_Byte(UINT32 uiIndex, UCHAR8 ucByte)
  136. {
  137. UCHAR8 ucStep = 0;
  138. SET_SDT_OUT(uiIndex);
  139. SET_SCK_LOW(uiIndex);
  140. for (ucStep = 0;ucStep < 8; ucStep++)
  141. {
  142. if ((ucByte<<ucStep)&0x80)
  143. {
  144. SET_SDT_HIGH(uiIndex);
  145. }
  146. else
  147. {
  148. SET_SDT_LOW(uiIndex);
  149. }
  150. GpioSimSWire_Delay_Nop(GET_SDT_SCK_TSU(uiIndex));
  151. SET_SCK_HIGH(uiIndex);
  152. GpioSimSWire_Delay_Nop(GET_SCK_TWHL(uiIndex));
  153. SET_SCK_LOW(uiIndex);
  154. GpioSimSWire_Delay_Nop(GET_SDT_SCK_THL(uiIndex));
  155. SET_SDT_LOW(uiIndex);
  156. }
  157. }
  158. /** receive 1 byte
  159. *@Pull SCK high, to read SDT data from slave device bit by bit
  160. */
  161. UCHAR8 Hv_GpioSimSWire_Recv_Byte(UINT32 uiIndex)
  162. {
  163. UCHAR8 ucByte = 0x00;
  164. UCHAR8 ucStep = 0;
  165. SET_SDT_IN(uiIndex);
  166. for (ucStep = 0; ucStep < 8; ucStep++)
  167. {
  168. SET_SCK_LOW(uiIndex);
  169. GpioSimSWire_Delay_Nop(GPIOSIMSWIRE_DELAY);
  170. SET_SCK_HIGH(uiIndex);
  171. ucByte = ucByte<<1;
  172. if (GET_SDT_LEVEL(uiIndex))
  173. {
  174. ucByte = ucByte | 0x01;
  175. }
  176. GpioSimSWire_Delay_Nop(GPIOSIMSWIRE_DELAY);
  177. }
  178. SET_SCK_LOW(uiIndex);
  179. return ucByte;
  180. }
  181. /** Send in master mode an amount of data
  182. * @param pucData pointer to data buffer to be transmited
  183. * @param usDataSize amount of data to be sent
  184. * @retval Status SUCESS/FAILURE
  185. */
  186. Status Hv_Drv_GpioSimSWire_SendData(SWireID enBus, UCHAR8 *pucData, UINT32 uiDatasize)
  187. {
  188. HV_ASSERT_TRUE(enBus < SIMSWIRE_ID_MAX);
  189. HV_ASSERT_VALID_PTR_RET(pucData, HV_FAILURE);
  190. UINT32 uiSize = 0;
  191. //Start
  192. Hv_GpioSimSWire_Start(enBus);
  193. //Write Data
  194. for (uiSize = 0; uiSize < uiDatasize; uiSize++)
  195. {
  196. Hv_GpioSimSWire_Send_Byte(enBus, pucData[uiSize]);
  197. }
  198. //Stop
  199. Hv_GpioSimSWire_Stop(enBus);
  200. return HV_SUCCESS;
  201. }
  202. /** Receive in master mode an amount of data
  203. * @param ucDevAddr target device address
  204. * @param pucData pointer to data buffer to be transmited
  205. * @param usDataSize amount of data to be receive
  206. * @retval Status SUCESS/FAILURE
  207. */
  208. Status Hv_Drv_GpioSimSWire_RecvData(SWireID enBus, UCHAR8 *pucData, USHORT16 usDataSize)
  209. {
  210. HV_ASSERT_TRUE(enBus < SIMSWIRE_ID_MAX);
  211. HV_ASSERT_VALID_PTR_RET(pucData, HV_FAILURE);
  212. UINT32 uiSize = 0;
  213. //Start
  214. Hv_GpioSimSWire_Start(enBus);
  215. for (uiSize = 0; uiSize < usDataSize; uiSize++)
  216. {
  217. pucData[uiSize] = Hv_GpioSimSWire_Recv_Byte(enBus);
  218. }
  219. //Stop
  220. Hv_GpioSimSWire_Stop(enBus);
  221. return HV_SUCCESS;
  222. }