drv_spi.h 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428
  1. /*
  2. * File : drv_spi.h
  3. * This file is part of RT-Thread RTOS
  4. * COPYRIGHT (C) 2017, RT-Thread Development Team
  5. *
  6. * This program is free software; you can redistribute it and/or modify
  7. * it under the terms of the GNU General Public License as published by
  8. * the Free Software Foundation; either version 2 of the License, or
  9. * (at your option) any later version.
  10. *
  11. * This program is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. * GNU General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU General Public License along
  17. * with this program; if not, write to the Free Software Foundation, Inc.,
  18. * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  19. *
  20. * Change Logs:
  21. * Date Author Notes
  22. * 2018-02-08 RT-Thread the first version
  23. */
  24. #ifndef __DRV_SPI_H__
  25. #define __DRV_SPI_H__
  26. #ifdef __cplusplus
  27. extern "C" {
  28. #endif
  29. /********************** private ************************************/
  30. #define SPI0_BASE_ADDR (0x01C05000)
  31. #define SPI1_BASE_ADDR (0x01C06000)
  32. /**
  33. * @brief Serial Peripheral Interface
  34. */
  35. typedef struct
  36. {
  37. volatile rt_uint32_t VER; /* SPI Version number Register, Address offset: 0x00 */
  38. volatile rt_uint32_t CTRL; /* SPI Global Control Register, Address offset: 0x04 */
  39. volatile rt_uint32_t TCTRL; /* SPI Transfer Control Register, Address offset: 0x08 */
  40. volatile rt_uint32_t RESERVED1[1]; /* Reserved, 0x0C */
  41. volatile rt_uint32_t IER; /* SPI Interrupt Control Register, Address offset: 0x10 */
  42. volatile rt_uint32_t STA; /* SPI Interrupt Status Register, Address offset: 0x14 */
  43. volatile rt_uint32_t FCTL; /* SPI FIFO Control Register, Address offset: 0x18 */
  44. volatile rt_uint32_t FST; /* SPI FIFO Status Register, Address offset: 0x1C */
  45. volatile rt_uint32_t WAIT; /* SPI Wait Clock Counter Register, Address offset: 0x20 */
  46. volatile rt_uint32_t CCTR; /* SPI Clock Rate Control Register, Address offset: 0x24 */
  47. volatile rt_uint32_t RESERVED2[2]; /* Reserved, 0x28-0x2C */
  48. volatile rt_uint32_t BC; /* SPI Master mode Burst Control Register, Address offset: 0x30 */
  49. volatile rt_uint32_t TC; /* SPI Master mode Transmit Counter Register, Address offset: 0x34 */
  50. volatile rt_uint32_t BCC; /* SPI Burst Control Register, Address offset: 0x38 */
  51. volatile rt_uint32_t RESERVED3[19]; /* Reserved, 0x3C-0x84 */
  52. volatile rt_uint32_t NDMA_MODE_CTRL; /* SPI Nomal DMA Mode Control Regist Address offset: 0x88 */
  53. volatile rt_uint32_t RESERVED4[93]; /* Reserved, 0x8C-0x1FC */
  54. volatile rt_uint32_t TXD; /* SPI TX Date Register, Address offset: 0x200 */
  55. volatile rt_uint32_t RESERVED5[63]; /* Reserved, 0x204-0x2FC */
  56. volatile rt_uint32_t RXD; /* SPI RX Date Register, Address offset: 0x300 */
  57. } SPI_T;
  58. /*
  59. * @brief SPI Global Control Register
  60. */
  61. #define SPI_CTRL_RST_SHIFT (31)
  62. #define SPI_CTRL_RST_MASK (0x1U << SPI_CTRL_RST_SHIFT)
  63. #define SPI_CTRL_TP_EN_SHIFT (7)
  64. #define SPI_CTRL_TP_EN_MASK (0x1U << SPI_CTRL_TP_EN_SHIFT)
  65. #define SPI_CTRL_MODE_SHIFT (1)
  66. #define SPI_CTRL_MODE_MASK (0x1U << SPI_CTRL_MODE_SHIFT)
  67. typedef enum
  68. {
  69. SPI_CTRL_MODE_SLAVE = 0 << SPI_CTRL_MODE_SHIFT,
  70. SPI_CTRL_MODE_MASTER = 1 << SPI_CTRL_MODE_SHIFT
  71. } SPI_CTRL_Mode;
  72. #define SPI_CTRL_EN_SHIFT (0)
  73. #define SPI_CTRL_EN_MASK (0x1U << SPI_CTRL_EN_SHIFT)
  74. typedef enum
  75. {
  76. SPI_CTRL_EN_DISABLE = 0 << SPI_CTRL_EN_SHIFT,
  77. SPI_CTRL_EN_ENABLE = 1 << SPI_CTRL_EN_SHIFT
  78. } SPI_CTRL_En;
  79. /*
  80. * @brief SPI Transfer Control Register
  81. */
  82. #define SPI_TCTRL_XCH_SHIFT (31)
  83. #define SPI_TCTRL_XCH_MASK (0x1U << SPI_TCTRL_XCH_SHIFT)
  84. typedef enum
  85. {
  86. SPI_TCTRL_XCH_IDLE = 0 << SPI_TCTRL_XCH_SHIFT,
  87. SPI_TCTRL_XCH_START = 1 << SPI_TCTRL_XCH_SHIFT
  88. } SPI_TCTRL_Xch;
  89. #define SPI_TCTRL_SDDM_SHIFT (14)
  90. #define SPI_TCTRL_SDDM_MASK (0x0U << SPI_TCTRL_SDDM_SHIFT)
  91. typedef enum
  92. {
  93. SPI_TCTRL_SDDM_SEND_NODELAY = 0 << SPI_TCTRL_SDDM_SHIFT,
  94. SPI_TCTRL_SDDM_SEND_DELAY = 1 << SPI_TCTRL_SDDM_SHIFT
  95. } SPI_TCTRL_Sddm;
  96. #define SPI_TCTRL_SDM_SHIFT (13)
  97. #define SPI_TCTRL_SDM_MASK (0x1U << SPI_TCTRL_SDM_SHIFT)
  98. typedef enum
  99. {
  100. SPI_TCTRL_SDM_SAMPLE_NODELAY = 1 << SPI_TCTRL_SDM_SHIFT,
  101. SPI_TCTRL_SDM_SAMPLE_DELAY = 0 << SPI_TCTRL_SDM_SHIFT
  102. } SPI_TCTRL_Sdm;
  103. #define SPI_TCTRL_FBS_SHIFT (12)
  104. #define SPI_TCTRL_FBS_MASK (0x1U << SPI_TCTRL_FBS_SHIFT)
  105. typedef enum
  106. {
  107. SPI_TCTRL_FBS_MSB = 0 << SPI_TCTRL_FBS_SHIFT,
  108. SPI_TCTRL_FBS_LSB = 1 << SPI_TCTRL_FBS_SHIFT
  109. } SPI_TCTRL_Fbs;
  110. #define SPI_TCTRL_SDC_SHIFT (11)
  111. #define SPI_TCTRL_SDC_MASK (0x1U << SPI_TCTRL_SDC_SHIFT)
  112. #define SPI_TCTRL_RPSM_SHIFT (10)
  113. #define SPI_TCTRL_RPSM_MASK (0x1U << SPI_TCTRL_RPSM_SHIFT)
  114. #define SPI_TCTRL_DDB_SHIFT (9)
  115. #define SPI_TCTRL_DDB_MASK (0x1U << SPI_TCTRL_DDB_SHIFT)
  116. #define SPI_TCTRL_DHB_SHIFT (8)
  117. #define SPI_TCTRL_DHB_MASK (0x1U << SPI_TCTRL_DHB_SHIFT)
  118. typedef enum
  119. {
  120. SPI_TCTRL_DHB_FULL_DUPLEX = 0 << SPI_TCTRL_DHB_SHIFT,
  121. SPI_TCTRL_DHB_HALF_DUPLEX = 1 << SPI_TCTRL_DHB_SHIFT
  122. } SPI_TCTRL_DHB_Duplex;
  123. #define SPI_TCTRL_SS_LEVEL_SHIFT (7)
  124. #define SPI_TCTRL_SS_LEVEL_MASK (0x1U << SPI_TCTRL_SS_LEVEL_SHIFT)
  125. #define SPI_TCTRL_SS_OWNER_SHIFT (6)
  126. #define SPI_TCTRL_SS_OWNER_MASK (0x1U << SPI_TCTRL_SS_OWNER_SHIFT)
  127. typedef enum
  128. {
  129. SPI_TCTRL_SS_OWNER_CONTROLLER = 0 << SPI_TCTRL_SS_OWNER_SHIFT,
  130. SPI_TCTRL_SS_OWNER_SOFTWARE = 1 << SPI_TCTRL_SS_OWNER_SHIFT
  131. } SPI_TCTRL_SS_OWNER;
  132. #define SPI_TCTRL_SS_SEL_SHIFT (4)
  133. #define SPI_TCTRL_SS_SEL_MASK (0x3U << SPI_TCTRL_SS_SEL_SHIFT)
  134. typedef enum
  135. {
  136. SPI_TCTRL_SS_SEL_SS0 = 0 << SPI_TCTRL_SS_SEL_SHIFT,
  137. SPI_TCTRL_SS_SEL_SS1 = 1 << SPI_TCTRL_SS_SEL_SHIFT,
  138. SPI_TCTRL_SS_SEL_SS2 = 2 << SPI_TCTRL_SS_SEL_SHIFT,
  139. SPI_TCTRL_SS_SEL_SS3 = 3 << SPI_TCTRL_SS_SEL_SHIFT
  140. } SPI_TCTRL_SS_Sel;
  141. #define SPI_TCTRL_SS_CTL_SHIFT (3)
  142. #define SPI_TCTRL_SS_CTL_MASK (0x1U << SPI_TCTRL_SS_CTL_SHIFT)
  143. #define SPI_TCTRL_SPOL_SHIFT (2)
  144. #define SPI_TCTRL_SPOL_MASK (0x1U << SPI_TCTRL_SPOL_SHIFT)
  145. #define SPI_TCTRL_CPOL_SHIFT (1)
  146. #define SPI_TCTRL_CPOL_MASK (0x1U << SPI_TCTRL_CPOL_SHIFT)
  147. typedef enum
  148. {
  149. SPI_TCTRL_CPOL_HIGH = 0 << SPI_TCTRL_CPOL_SHIFT,
  150. SPI_TCTRL_CPOL_LOW = 1 << SPI_TCTRL_CPOL_SHIFT
  151. } SPI_TCTRL_Cpol;
  152. #define SPI_TCTRL_CPHA_SHIFT (0)
  153. #define SPI_TCTRL_CPHA_MASK (0x1U << SPI_TCTRL_CPHA_SHIFT)
  154. typedef enum
  155. {
  156. SPI_TCTRL_CPHA_PHASE0 = 0 << SPI_TCTRL_CPHA_SHIFT,
  157. SPI_TCTRL_CPHA_PHASE1 = 1 << SPI_TCTRL_CPHA_SHIFT
  158. } SPI_TCTRL_Cpha;
  159. typedef enum
  160. {
  161. SPI_SCLK_Mode0 = 0 << SPI_TCTRL_CPHA_SHIFT,
  162. SPI_SCLK_Mode1 = 1 << SPI_TCTRL_CPHA_SHIFT,
  163. SPI_SCLK_Mode2 = 2 << SPI_TCTRL_CPHA_SHIFT,
  164. SPI_SCLK_Mode3 = 3 << SPI_TCTRL_CPHA_SHIFT
  165. } SPI_SCLK_Mode;
  166. /*
  167. * @brief SPI Interrupt Control Register
  168. */
  169. #define SPI_IER_SS_INT_EN_SHIFT (13)
  170. #define SPI_IER_SS_INT_EN_MASK (0x1U << SPI_IER_SS_INT_EN_SHIFT)
  171. #define SPI_IER_TC_INT_EN_SHIFT (12)
  172. #define SPI_IER_TC_INT_EN_MASK (0x1U << SPI_IER_TC_INT_EN_SHIFT)
  173. #define SPI_IER_TF_UDR_INT_EN_SHIFT (11)
  174. #define SPI_IER_TF_UDR_INT_EN_MASK (0x1U << SPI_IER_TF_UDR_INT_EN_SHIFT)
  175. #define SPI_IER_TF_OVF_INT_EN_SHIFT (10)
  176. #define SPI_IER_TF_OVF_INT_EN_MASK (0x1U << SPI_IER_TF_OVF_INT_EN_SHIFT)
  177. #define SPI_IER_RF_UDR_INT_EN_SHIFT (9)
  178. #define SPI_IER_RF_UDR_INT_EN_MASK (0x1U << SPI_IER_RF_UDR_INT_EN_SHIFT)
  179. #define SPI_IER_RF_OVF_INT_EN_SHIFT (8)
  180. #define SPI_IER_RF_OVF_INT_EN_MASK (0x1U << SPI_IER_RF_OVF_INT_EN_SHIFT)
  181. #define SPI_IER_TF_FUL_INT_EN_SHIFT (6)
  182. #define SPI_IER_TF_FUL_INT_EN_MASK (0x1U << SPI_IER_TF_FUL_INT_EN_SHIFT)
  183. #define SPI_IER_TX_EMP_INT_EN_SHIFT (5)
  184. #define SPI_IER_TX_EMP_INT_EN_MASK (0x1U << SPI_IER_TX_EMP_INT_EN_SHIFT)
  185. #define SPI_IER_TX_ERQ_INT_EN_SHIFT (4)
  186. #define SPI_IER_TX_ERQ_INT_EN_MASK (0x1U << SPI_IER_TX_ERQ_INT_EN_SHIFT)
  187. #define SPI_IER_RF_FUL_INT_EN_SHIFT (2)
  188. #define SPI_IER_RF_FUL_INT_EN_MASK (0x1U << SPI_IER_RF_FUL_INT_EN_SHIFT)
  189. #define SPI_IER_RX_EMP_INT_EN_SHIFT (1)
  190. #define SPI_IER_RX_EMP_INT_EN_MASK (0x1U << SPI_IER_RX_EMP_INT_EN_SHIFT)
  191. #define SPI_IER_RF_RDY_INT_EN_SHIFT (0)
  192. #define SPI_IER_RF_RDY_INT_EN_MASK (0x1U << SPI_IER_RF_RDY_INT_EN_SHIFT)
  193. /*
  194. * @brief SPI Interrupt Status Register
  195. */
  196. #define SPI_STA_SSI_SHIFT (13)
  197. #define SPI_STA_SSI_MASK (0x1U << SPI_STA_SSI_SHIFT)
  198. #define SPI_STA_TC_SHIFT (12)
  199. #define SPI_STA_TC_MASK (0x1U << SPI_STA_TC_SHIFT)
  200. #define SPI_STA_TF_UDF_SHIFT (11)
  201. #define SPI_STA_TF_UDF_MASK (0x1U << SPI_STA_TF_UDF_SHIFT)
  202. #define SPI_STA_TF_OVF_SHIFT (10)
  203. #define SPI_STA_TF_OVF_MASK (0x1U << SPI_STA_TF_OVF_SHIFT)
  204. #define SPI_STA_RX_UDF_SHIFT (9)
  205. #define SPI_STA_RX_UDF_MASK (0x1U << SPI_STA_RX_UDF_SHIFT)
  206. #define SPI_STA_RX_OVF_SHIFT (8)
  207. #define SPI_STA_RX_OVF_MASK (0x1U << SPI_STA_RX_OVF_SHIFT)
  208. #define SPI_STA_TX_FULL_SHIFT (6)
  209. #define SPI_STA_TX_FULL_MASK (0x1U << SPI_STA_TX_FULL_SHIFT)
  210. #define SPI_STA_TX_EMP_SHIFT (5)
  211. #define SPI_STA_TX_EMP_MASK (0x1U << SPI_STA_TX_EMP_SHIFT)
  212. #define SPI_STA_TX_READY_SHIFT (4)
  213. #define SPI_STA_TX_READY_MASK (0x1U << SPI_STA_TX_READY_SHIFT)
  214. #define SPI_STA_RX_FULL_SHIFT (2)
  215. #define SPI_STA_RX_FULL_MASK (0x1U << SPI_STA_RX_FULL_SHIFT)
  216. #define SPI_STA_RX_EMP_SHIFT (1)
  217. #define SPI_STA_RX_EMP_MASK (0x1U << SPI_STA_RX_EMP_SHIFT)
  218. #define SPI_STA_RX_RDY_SHIFT (0)
  219. #define SPI_STA_RX_RDY_MASK (0x1U << SPI_STA_RX_RDY_SHIFT)
  220. /*
  221. * @brief SPI FIFO Control Register
  222. */
  223. #define SPI_FCTL_TF_RST_SHIFT (31)
  224. #define SPI_FCTL_TF_RST_MASK (0x1U << SPI_FCTL_TF_RST_SHIFT)
  225. #define SPI_FCTL_TF_TEST_EN_SHIFT (30)
  226. #define SPI_FCTL_TF_TEST_EN_MASK (0x1U << SPI_FCTL_TF_TEST_EN_SHIFT)
  227. #define SPI_FCTL_TF_DRQ_EN_SHIFT (24)
  228. #define SPI_FCTL_TF_DRQ_EN_MASK (0x1U << SPI_FCTL_TF_DRQ_EN_SHIFT)
  229. #define SPI_FCTL_TF_DRQ_EN_BIT HAL_BIT(24)
  230. #define SPI_FCTL_TX_TRIG_LEVEL_SHIFT (16)
  231. #define SPI_FCTL_TX_TRIG_LEVEL_MASK (0xFFU << SPI_FCTL_TX_TRIG_LEVEL_SHIFT)
  232. #define SPI_FCTL_RF_RST_SHIFT (15)
  233. #define SPI_FCTL_RF_RST_MASK (0x1U << SPI_FCTL_RF_RST_SHIFT)
  234. #define SPI_FCTL_RF_TEST_SHIFT (14)
  235. #define SPI_FCTL_RF_TEST_MASK (0x1U << SPI_FCTL_RF_TEST_SHIFT)
  236. #define SPI_FCTL_RF_DRQ_EN_SHIFT (8)
  237. #define SPI_FCTL_RF_DRQ_EN_MASK (0x1U << SPI_FCTL_RF_DRQ_EN_SHIFT)
  238. #define SPI_FCTL_RX_TRIG_LEVEL_SHIFT (0)
  239. #define SPI_FCTL_RX_TRIG_LEVEL_MASK (0xFFU << SPI_FCTL_RX_TRIG_LEVEL_SHIFT)
  240. /*
  241. * @brief SPI FIFO Status Registe
  242. */
  243. #define SPI_FST_TB_WR_SHIFT (31)
  244. #define SPI_FST_TB_WR_MASK (0x1U << SPI_FST_TB_WR_SHIFT)
  245. #define SPI_FST_TB_CNT_SHIFT (28)
  246. #define SPI_FST_TB_CNT_MASK (0x7U << SPI_FST_TB_CNT_SHIFT)
  247. #define SPI_FST_TF_CNT_SHIFT (16)
  248. #define SPI_FST_TF_CNT_MASK (0xFFU << SPI_FST_TF_CNT_SHIFT)
  249. #define SPI_FST_RB_WR_SHIFT (15)
  250. #define SPI_FST_RB_WR_MASK (0x1U << SPI_FST_RB_WR_SHIFT)
  251. #define SPI_FST_RB_CNT_SHIFT (12)
  252. #define SPI_FST_RB_CNT_MASK (0x7U << SPI_FST_RB_CNT_SHIFT)
  253. #define SPI_FST_RF_CNT_SHIFT (0)
  254. #define SPI_FST_RF_CNT_MASK (0xFFU << SPI_FST_RF_CNT_SHIFT)
  255. /*
  256. * @brief SPI Wait Clock Counter Register
  257. */
  258. #define SPI_WAIT_SWC_SHIFT (16)
  259. #define SPI_WAIT_SWC_MASK (0xFU << SPI_WAIT_SWC_SHIFT)
  260. #define SPI_WAIT_WCC_SHIFT (0)
  261. #define SPI_WAIT_WCC_MASK (0xFFFFU << SPI_WAIT_WCC_SHIFT)
  262. /*
  263. * @brief SPI Clock Rate Control Register
  264. */
  265. #define SPI_CCTR_DRS_SHIFT (12)
  266. #define SPI_CCTR_DRS_MASK (0x1U << SPI_CCTR_DRS_SHIFT)
  267. typedef enum
  268. {
  269. SPI_CCTR_DRS_type_divRate1 = 0 << SPI_CCTR_DRS_SHIFT,
  270. SPI_CCTR_DRS_type_divRate2 = 1 << SPI_CCTR_DRS_SHIFT
  271. } SPI_CCTR_DRS_type;
  272. #define SPI_CCTR_CDR1_SHIFT (8)
  273. #define SPI_CCTR_CDR1_MASK (0xFU << SPI_CCTR_CDR1_SHIFT)
  274. #define SPI_CCTR_CDR2_SHIFT (0)
  275. #define SPI_CCTR_CDR2_MASK (0xFFU << SPI_CCTR_CDR2_SHIFT)
  276. /*
  277. * @brief SPI Master mode Burst Control Register
  278. */
  279. #define SPI_BC_MBC_SHIFT (0)
  280. #define SPI_BC_MBC_MASK (0xFFFFFFU << SPI_BC_MBC_SHIFT)
  281. /*
  282. * @brief SPI Master mode Transmit Counter Register
  283. */
  284. #define SPI_TC_MWTC_SHIFT (0)
  285. #define SPI_TC_MWTC_MASK (0xFFFFFFU << SPI_TC_MWTC_SHIFT)
  286. /*
  287. * @brief SPI Burst Control Register
  288. */
  289. #define SPI_BCC_DRM_SHIFT (28)
  290. #define SPI_BCC_DRM_MASK (0x1U << SPI_BCC_DRM_SHIFT)
  291. #define SPI_BCC_DBC_SHIFT (24)
  292. #define SPI_BCC_DBC_MASK (0xFU << SPI_BCC_DBC_SHIFT)
  293. #define SPI_BCC_STC_SHIFT (0)
  294. #define SPI_BCC_STC_MASK (0xFFFFFFU << SPI_BCC_STC_SHIFT)
  295. /*
  296. * @brief SPI Nomal DMA Mode Control Regist
  297. */
  298. #define SPI_NDMA_MODE_CTRL_SHIFT (0)
  299. #define SPI_NDMA_MODE_CTRL_MASK (0xFFU << SPI_NDMA_MODE_CTRL_SHIFT)
  300. /*
  301. * @brief SPI TX Date Register
  302. */
  303. #define SPI_TXD_SHIFT (0)
  304. #define SPI_TXD_MASK (0xFFFFFFFFU << SPI_TXD_SHIFT)
  305. /*
  306. * @brief SPI RX Date Register
  307. */
  308. #define SPI_RXD_SHIFT (0)
  309. #define SPI_RXD_MASK (0xFFFFFFFFU << SPI_RXD_SHIFT)
  310. /* other */
  311. #define SPI_FIFO_SIZE (64)
  312. #define SPI_MAX_WAIT_MS (2000)
  313. #define SPI_SOURCE_CLK (24 * 1000 * 1000)
  314. /* io ops */
  315. #define HAL_BIT(pos) (1U << (pos))
  316. #define HAL_SET_BIT(reg, mask) ((reg) |= (mask))
  317. #define HAL_CLR_BIT(reg, mask) ((reg) &= ~(mask))
  318. #define HAL_GET_BIT(reg, mask) ((reg) & (mask))
  319. #define HAL_GET_BIT_VAL(reg, shift, vmask) (((reg) >> (shift)) & (vmask))
  320. #define HAL_MODIFY_REG(reg, clr_mask, set_mask) \
  321. ((reg) = (((reg) & (~(clr_mask))) | (set_mask)))
  322. /* access LSBs of a 32-bit register (little endian only) */
  323. #define HAL_REG_32BIT(reg_addr) (*((volatile rt_uint32_t *)(reg_addr)))
  324. #define HAL_REG_16BIT(reg_addr) (*((volatile rt_uint16_t *)(reg_addr)))
  325. #define HAL_REG_8BIT(reg_addr) (*((volatile rt_uint8_t *)(reg_addr)))
  326. #define HAL_WAIT_FOREVER OS_WAIT_FOREVER
  327. #define HAL_ARRAY_SIZE(a) (sizeof((a)) / sizeof((a)[0]))
  328. struct tina_spi
  329. {
  330. SPI_T *spi;
  331. unsigned int spi_gate;
  332. struct rt_spi_bus *spi_bus;
  333. };
  334. struct tina_spi_cs
  335. {
  336. SPI_TCTRL_SS_Sel cs;
  337. };
  338. /* public function */
  339. rt_err_t r6_spi_bus_register(SPI_T *spi, const char *spi_bus_name);
  340. #ifdef __cplusplus
  341. }
  342. #endif
  343. #endif //