wm_spi_hal.h 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304
  1. /*****************************************************************************
  2. *
  3. * File Name : wm_spi_hal.h
  4. *
  5. * Description: host spi Driver Module
  6. *
  7. * Copyright (c) 2014 Winner Microelectronics Co., Ltd.
  8. * All rights reserved.
  9. *
  10. * Author : dave
  11. *
  12. * Date : 2014-6-6
  13. *****************************************************************************/
  14. #include "wm_regs.h"
  15. #include "list.h"
  16. #include "wm_hostspi.h"
  17. #include "wm_cpu.h"
  18. static __inline void spi_set_mode(u8 mode);
  19. static __inline void spi_set_mode(u8 mode)
  20. {
  21. u32 reg_val;
  22. reg_val = tls_reg_read32(HR_SPI_SPICFG_REG);
  23. switch (mode) {
  24. case TLS_SPI_MODE_0:
  25. reg_val &= ~(0x03U);
  26. reg_val |= (SPI_SET_CPOL(0) | SPI_SET_CPHA(0));
  27. break;
  28. case TLS_SPI_MODE_1:
  29. reg_val &= ~(0x03U);
  30. reg_val |= (SPI_SET_CPOL(0) | SPI_SET_CPHA(1));
  31. break;
  32. case TLS_SPI_MODE_2:
  33. reg_val &= ~(0x03U);
  34. reg_val |= (SPI_SET_CPOL(1) | SPI_SET_CPHA(0));
  35. break;
  36. case TLS_SPI_MODE_3:
  37. reg_val &= ~(0x03U);
  38. reg_val |= (SPI_SET_CPOL(1) | SPI_SET_CPHA(1));
  39. break;
  40. default:
  41. break;
  42. }
  43. tls_reg_write32(HR_SPI_SPICFG_REG, reg_val);
  44. }
  45. static __inline void spi_set_endian(u8 endian)
  46. {
  47. u32 reg_val;
  48. reg_val = tls_reg_read32(HR_SPI_SPICFG_REG);
  49. if (endian == 0) {
  50. reg_val &= ~(0x01U << 3);
  51. reg_val |= SPI_LITTLE_ENDIAN;
  52. } else if(endian == 1) {
  53. reg_val &= ~(0x01U << 3);
  54. reg_val |= SPI_BIG_ENDIAN;
  55. }
  56. tls_reg_write32(HR_SPI_SPICFG_REG, reg_val);
  57. }
  58. static __inline void spi_set_chipselect_mode(u8 cs_active)
  59. {
  60. u32 reg_val;
  61. reg_val = tls_reg_read32(HR_SPI_CHCFG_REG);
  62. if (cs_active == 0) {
  63. reg_val &= ~(0x01U << 2);
  64. reg_val |= SPI_CS_LOW;
  65. } else if(cs_active == 1) {
  66. reg_val &= ~(0x01U << 2);
  67. reg_val |= SPI_CS_HIGH;
  68. }
  69. tls_reg_write32(HR_SPI_CHCFG_REG, reg_val);
  70. }
  71. static __inline void spi_clear_fifo(void)
  72. {
  73. u32 reg_val;
  74. reg_val = tls_reg_read32(HR_SPI_CHCFG_REG);
  75. reg_val |= SPI_CLEAR_FIFOS;
  76. tls_reg_write32(HR_SPI_CHCFG_REG, reg_val);
  77. }
  78. static __inline void spi_set_rx_channel(u8 on_off)
  79. {
  80. u32 reg_val;
  81. reg_val = tls_reg_read32(HR_SPI_CHCFG_REG);
  82. if (on_off == 0) {
  83. reg_val &= ~(0x01U << 20);
  84. reg_val |= SPI_RX_CHANNEL_OFF;
  85. } else if(on_off == 1) {
  86. reg_val &= ~(0x01U << 20);
  87. reg_val |= SPI_RX_CHANNEL_ON;
  88. }
  89. tls_reg_write32(HR_SPI_CHCFG_REG, reg_val);
  90. }
  91. static __inline void spi_set_tx_channel(u8 on_off)
  92. {
  93. u32 reg_val;
  94. reg_val = tls_reg_read32(HR_SPI_CHCFG_REG);
  95. if (on_off == 0) {
  96. reg_val &= ~(0x01U << 19);
  97. reg_val |= SPI_TX_CHANNEL_OFF;
  98. } else if(on_off == 1) {
  99. reg_val &= ~(0x01U << 19);
  100. reg_val |= SPI_TX_CHANNEL_ON;
  101. }
  102. tls_reg_write32(HR_SPI_CHCFG_REG, reg_val);
  103. }
  104. static __inline void spi_set_sclk_length(u16 sclk_num, u8 invalid_rx_sclk_num)
  105. {
  106. u32 reg_val;
  107. reg_val = tls_reg_read32(HR_SPI_CHCFG_REG);
  108. reg_val &= ~((0xffU << 23) | (0xffff << 3));
  109. reg_val |= SPI_VALID_CLKS_NUM(sclk_num) | SPI_RX_INVALID_BITS(invalid_rx_sclk_num);
  110. tls_reg_write32(HR_SPI_CHCFG_REG, reg_val);
  111. }
  112. static __inline void spi_force_cs_out(u8 enable)
  113. {
  114. u32 reg_val;
  115. reg_val = tls_reg_read32(HR_SPI_CHCFG_REG);
  116. if (enable) {
  117. reg_val |= SPI_FORCE_SPI_CS_OUT;
  118. } else {
  119. reg_val &= ~SPI_FORCE_SPI_CS_OUT;
  120. }
  121. tls_reg_write32(HR_SPI_CHCFG_REG, reg_val);
  122. }
  123. static __inline void spi_sclk_start(void)
  124. {
  125. u32 reg_val;
  126. reg_val = tls_reg_read32(HR_SPI_CHCFG_REG);
  127. reg_val |= SPI_START;
  128. tls_reg_write32(HR_SPI_CHCFG_REG, reg_val);
  129. }
  130. static __inline void spi_set_sclk(u32 fclk)
  131. {
  132. u32 reg_val;
  133. tls_sys_clk sysclk;
  134. tls_sys_clk_get(&sysclk);
  135. reg_val = tls_reg_read32(HR_SPI_CLKCFG_REG);
  136. reg_val &= ~(0xffffU);
  137. reg_val |= sysclk.apbclk*UNIT_MHZ/(fclk*2) - 1;
  138. tls_reg_write32(HR_SPI_CLKCFG_REG, reg_val);
  139. }
  140. static __inline void spi_set_tx_trigger_level(u8 level)
  141. {
  142. u32 reg_val;
  143. reg_val = tls_reg_read32(HR_SPI_MODECFG_REG);
  144. reg_val &= ~(0x07U << 2);
  145. reg_val |= SPI_TX_TRIGGER_LEVEL(level);
  146. tls_reg_write32(HR_SPI_MODECFG_REG, reg_val);
  147. }
  148. static __inline void spi_set_rx_trigger_level(u8 level)
  149. {
  150. u32 reg_val;
  151. reg_val = tls_reg_read32(HR_SPI_MODECFG_REG);
  152. reg_val &= ~(0x07U << 6);
  153. reg_val |= SPI_RX_TRIGGER_LEVEL(level);
  154. tls_reg_write32(HR_SPI_MODECFG_REG, reg_val);
  155. }
  156. static __inline uint8_t spi_get_busy_status(void)
  157. {
  158. u32 reg_val;
  159. reg_val = tls_reg_read32(HR_SPI_STATUS_REG);
  160. return SPI_IS_BUSY(reg_val);
  161. }
  162. static __inline void spi_set_timeout(u32 timeout, u8 enable)
  163. {
  164. u32 reg_val;
  165. reg_val = SPI_TIME_OUT(timeout);
  166. reg_val |= enable ? SPI_TIMER_EN : 0;
  167. tls_reg_write32(HR_SPI_TIMEOUT_REG, reg_val);
  168. }
  169. static __inline void spi_get_status(u8 *busy, u8 *rx_fifo_level, u8 *tx_fifo_level)
  170. {
  171. u32 reg_val;
  172. reg_val = tls_reg_read32(HR_SPI_STATUS_REG);
  173. if (busy) {*busy = SPI_IS_BUSY(reg_val);}
  174. if (rx_fifo_level) {*rx_fifo_level = SPI_GET_RX_FIFO_CNT(reg_val);}
  175. if (tx_fifo_level) {*tx_fifo_level = 32 - SPI_GET_TX_FIFO_CNT(reg_val);}
  176. }
  177. static __inline u32 spi_int_mask(void)
  178. {
  179. u32 reg_val;
  180. reg_val = tls_reg_read32(HR_SPI_INT_MASK_REG);
  181. return reg_val & SPI_INT_MASK_ALL;
  182. }
  183. static __inline void spi_mask_int(u32 mask)
  184. {
  185. u32 reg_val;
  186. reg_val = tls_reg_read32(HR_SPI_INT_MASK_REG);
  187. reg_val |= mask & SPI_INT_MASK_ALL;
  188. tls_reg_write32(HR_SPI_INT_MASK_REG, reg_val);
  189. }
  190. static __inline void spi_unmask_int(u32 mask)
  191. {
  192. u32 reg_val;
  193. reg_val = tls_reg_read32(HR_SPI_INT_MASK_REG);
  194. reg_val &= ~(mask & SPI_INT_MASK_ALL);
  195. tls_reg_write32(HR_SPI_INT_MASK_REG, reg_val);
  196. }
  197. static __inline u32 spi_get_int_status(void)
  198. {
  199. u32 reg_val;
  200. reg_val = tls_reg_read32(HR_SPI_INT_STATUS_REG);
  201. return reg_val;
  202. }
  203. static __inline void spi_clear_int_status(u32 int_srcs)
  204. {
  205. u32 reg_val;
  206. reg_val = tls_reg_read32(HR_SPI_INT_STATUS_REG);
  207. reg_val &= ~(int_srcs & SPI_INT_CLEAR_ALL);
  208. reg_val |= int_srcs & SPI_INT_CLEAR_ALL;
  209. tls_reg_write32(HR_SPI_INT_STATUS_REG, reg_val);
  210. }
  211. static __inline void spi_data_put(u32 data)
  212. {
  213. tls_reg_write32(HR_SPI_TXDATA_REG, data);
  214. }
  215. static __inline u32 spi_data_get(void)
  216. {
  217. return tls_reg_read32(HR_SPI_RXDATA_REG);
  218. }