common_spi.h 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318
  1. /*
  2. * Copyright (c) 2019-2025 Allwinner Technology Co., Ltd. ALL rights reserved.
  3. *
  4. * Allwinner is a trademark of Allwinner Technology Co.,Ltd., registered in
  5. * the the People's Republic of China and other countries.
  6. * All Allwinner Technology Co.,Ltd. trademarks are used with permission.
  7. *
  8. * DISCLAIMER
  9. * THIRD PARTY LICENCES MAY BE REQUIRED TO IMPLEMENT THE SOLUTION/PRODUCT.
  10. * IF YOU NEED TO INTEGRATE THIRD PARTY’S TECHNOLOGY (SONY, DTS, DOLBY, AVS OR MPEGLA, ETC.)
  11. * IN ALLWINNERS’SDK OR PRODUCTS, YOU SHALL BE SOLELY RESPONSIBLE TO OBTAIN
  12. * ALL APPROPRIATELY REQUIRED THIRD PARTY LICENCES.
  13. * ALLWINNER SHALL HAVE NO WARRANTY, INDEMNITY OR OTHER OBLIGATIONS WITH RESPECT TO MATTERS
  14. * COVERED UNDER ANY REQUIRED THIRD PARTY LICENSE.
  15. * YOU ARE SOLELY RESPONSIBLE FOR YOUR USAGE OF THIRD PARTY’S TECHNOLOGY.
  16. *
  17. *
  18. * THIS SOFTWARE IS PROVIDED BY ALLWINNER"AS IS" AND TO THE MAXIMUM EXTENT
  19. * PERMITTED BY LAW, ALLWINNER EXPRESSLY DISCLAIMS ALL WARRANTIES OF ANY KIND,
  20. * WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING WITHOUT LIMITATION REGARDING
  21. * THE TITLE, NON-INFRINGEMENT, ACCURACY, CONDITION, COMPLETENESS, PERFORMANCE
  22. * OR MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  23. * IN NO EVENT SHALL ALLWINNER BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  24. * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
  25. * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  26. * LOSS OF USE, DATA, OR PROFITS, OR BUSINESS INTERRUPTION)
  27. * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
  28. * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  29. * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
  30. * OF THE POSSIBILITY OF SUCH DAMAGE.
  31. */
  32. #ifndef __COMMON_SPI_I_H__
  33. #define __COMMON_SPI_I_H__
  34. #ifdef __cplusplus
  35. extern "C" {
  36. #endif
  37. #define SUNXI_SPI_REG_SIZE 0x1000 /* controler reg sized */
  38. #define HEXADECIMAL (0x10)
  39. #define REG_INTERVAL (0x04)
  40. #define REG_CL (0x0c)
  41. #define SPI_FIFO_DEPTH (128)
  42. #define MAX_FIFU 64
  43. #define BULK_DATA_BOUNDARY 64 /* can modify to adapt the application */
  44. #define SPI_MAX_FREQUENCY 100000000 /* spi controller just support 100Mhz */
  45. #define SPI_HIGH_FREQUENCY 60000000 /* sample mode threshold frequency */
  46. #define SPI_LOW_FREQUENCY 24000000 /* sample mode threshold frequency */
  47. #define SPI_MOD_CLK 50000000 /* sample mode frequency */
  48. /* SPI Registers offsets from peripheral base address */
  49. #define SPI_VER_REG (0x00) /* version number register */
  50. #define SPI_GC_REG (0x04) /* global control register */
  51. #define SPI_TC_REG (0x08) /* transfer control register */
  52. #define SPI_INT_CTL_REG (0x10) /* interrupt control register */
  53. #define SPI_INT_STA_REG (0x14) /* interrupt status register */
  54. #define SPI_FIFO_CTL_REG (0x18) /* fifo control register */
  55. #define SPI_FIFO_STA_REG (0x1C) /* fifo status register */
  56. #define SPI_WAIT_CNT_REG (0x20) /* wait clock counter register */
  57. #define SPI_CLK_CTL_REG \
  58. (0x24) /* clock rate control register. better not to use it */
  59. #define SPI_BURST_CNT_REG (0x30) /* burst counter register */
  60. #define SPI_TRANSMIT_CNT_REG (0x34) /* transmit counter register */
  61. #define SPI_BCC_REG (0x38) /* burst control counter register */
  62. #define SPI_DMA_CTL_REG (0x88) /* DMA control register, only for 1639 */
  63. #define SPI_TXDATA_REG (0x200) /* tx data register */
  64. #define SPI_RXDATA_REG (0x300) /* rx data register */
  65. /* SPI Global Control Register Bit Fields & Masks,default value:0x0000_0080 */
  66. #define SPI_GC_EN \
  67. (0x1 \
  68. << 0) /* SPI module enable control 1:enable; 0:disable; default:0 */
  69. #define SPI_GC_MODE \
  70. (0x1 << 1) /* SPI function mode select 1:master; 0:slave; default:0 */
  71. #define SPI_GC_TP_EN \
  72. (0x1 << 7) /* SPI transmit stop enable 1:stop transmit data when \
  73. RXFIFO is full; 0:ignore RXFIFO status; default:1 */
  74. #define SPI_GC_SRST \
  75. (0x1 << 31) /* soft reset, write 1 will clear SPI control, auto \
  76. clear to 0 */
  77. /* SPI Transfer Control Register Bit Fields & Masks,default value:0x0000_0087 */
  78. #define SPI_TC_PHA \
  79. (0x1 << 0) /* SPI Clock/Data phase control,0: phase0,1: \
  80. phase1;default:1 */
  81. #define SPI_TC_POL \
  82. (0x1 << 1) /* SPI Clock polarity control,0:low level idle,1:high \
  83. level idle;default:1 */
  84. #define SPI_TC_SPOL \
  85. (0x1 << 2) /* SPI Chip select signal polarity control,default: 1,low \
  86. effective like this:~~|_____~~ */
  87. #define SPI_TC_SSCTL \
  88. (0x1 \
  89. << 3) /* SPI chip select control,default 0:SPI_SSx remains asserted \
  90. between SPI bursts,1:negate SPI_SSx between SPI bursts */
  91. #define SPI_TC_SS_MASK \
  92. (0x3 << 4) /* SPI chip \
  93. select:00-SPI_SS0;01-SPI_SS1;10-SPI_SS2;11-SPI_SS3*/
  94. #define SPI_TC_SS_OWNER \
  95. (0x1 << 6) /* SS output mode select default is 0:automatic output \
  96. SS;1:manual output SS */
  97. #define SPI_TC_SS_LEVEL \
  98. (0x1 << 7) /* defautl is 1:set SS to high;0:set SS to low */
  99. #define SPI_TC_DHB \
  100. (0x1 \
  101. << 8) /* Discard Hash Burst,default 0:receiving all spi burst in BC \
  102. period 1:discard unused,fectch WTC bursts */
  103. #define SPI_TC_DDB \
  104. (0x1 << 9) /* Dummy burst Type,default 0: dummy spi burst is \
  105. zero;1:dummy spi burst is one */
  106. #define SPI_TC_RPSM \
  107. (0x1 << 10) /* select mode for high speed write,0:normal write \
  108. mode,1:rapids write mode,default 0 */
  109. #define SPI_TC_SDM \
  110. (0x1 << 13) /* master sample data mode, 1: normal sample \
  111. mode;0:delay sample mode. */
  112. #define SPI_TC_SDC \
  113. (0x1 << 11) /* master sample data control, 1: delay--high speed \
  114. operation;0:no delay. */
  115. #define SPI_TC_FBS \
  116. (0x1 << 12) /* LSB/MSB transfer first select 0:MSB,1:LSB,default \
  117. 0:MSB first */
  118. #define SPI_TC_XCH \
  119. (0x1 \
  120. << 31) /* Exchange burst default 0:idle,1:start exchange;when BC is \
  121. zero,this bit cleared by SPI controller*/
  122. #define SPI_TC_SS_BIT_POS (4)
  123. /* SPI Interrupt Control Register Bit Fields & Masks,default value:0x0000_0000
  124. */
  125. #define SPI_INTEN_RX_RDY \
  126. (0x1 << 0) /* rxFIFO Ready Interrupt Enable,---used for immediately \
  127. received,0:disable;1:enable */
  128. #define SPI_INTEN_RX_EMP \
  129. (0x1 << 1) /* rxFIFO Empty Interrupt Enable ---used for IRQ received \
  130. */
  131. #define SPI_INTEN_RX_FULL \
  132. (0x1 << 2) /* rxFIFO Full Interrupt Enable ---seldom used */
  133. #define SPI_INTEN_TX_ERQ \
  134. (0x1 << 4) /* txFIFO Empty Request Interrupt Enable ---seldom used */
  135. #define SPI_INTEN_TX_EMP \
  136. (0x1 << 5) /* txFIFO Empty Interrupt Enable ---used for IRQ tx */
  137. #define SPI_INTEN_TX_FULL \
  138. (0x1 << 6) /* txFIFO Full Interrupt Enable ---seldom used */
  139. #define SPI_INTEN_RX_OVF \
  140. (0x1 \
  141. << 8) /* rxFIFO Overflow Interrupt Enable ---used for error detect */
  142. #define SPI_INTEN_RX_UDR \
  143. (0x1 \
  144. << 9) /* rxFIFO Underrun Interrupt Enable ---used for error detect */
  145. #define SPI_INTEN_TX_OVF \
  146. (0x1 << 10) /* txFIFO Overflow Interrupt Enable ---used for error \
  147. detect */
  148. #define SPI_INTEN_TX_UDR \
  149. (0x1 << 11) /* txFIFO Underrun Interrupt Enable ---not happened */
  150. #define SPI_INTEN_TC \
  151. (0x1 << 12) /* Transfer Completed Interrupt Enable ---used */
  152. #define SPI_INTEN_SSI \
  153. (0x1 << 13) /* SSI interrupt Enable,chip select from valid state to \
  154. invalid state,for slave used only */
  155. #define SPI_INTEN_ERR \
  156. (SPI_INTEN_TX_OVF | SPI_INTEN_RX_UDR | \
  157. SPI_INTEN_RX_OVF) /* NO txFIFO underrun */
  158. #define SPI_INTEN_MASK (0x77 | (0x3f << 8))
  159. /* SPI Interrupt Status Register Bit Fields & Masks,default value:0x0000_0022 */
  160. #define SPI_INT_STA_RX_RDY \
  161. (0x1 << 0) /* rxFIFO ready, 0:RX_WL < RX_TRIG_LEVEL,1:RX_WL >= \
  162. RX_TRIG_LEVEL */
  163. #define SPI_INT_STA_RX_EMP \
  164. (0x1 << 1) /* rxFIFO empty, this bit is set when rxFIFO is empty */
  165. #define SPI_INT_STA_RX_FULL \
  166. (0x1 << 2) /* rxFIFO full, this bit is set when rxFIFO is full */
  167. #define SPI_INT_STA_TX_RDY \
  168. (0x1 << 4) /* txFIFO ready, 0:TX_WL > TX_TRIG_LEVEL,1:TX_WL <= \
  169. TX_TRIG_LEVEL */
  170. #define SPI_INT_STA_TX_EMP \
  171. (0x1 << 5) /* txFIFO empty, this bit is set when txFIFO is empty */
  172. #define SPI_INT_STA_TX_FULL \
  173. (0x1 << 6) /* txFIFO full, this bit is set when txFIFO is full */
  174. #define SPI_INT_STA_RX_OVF \
  175. (0x1 << 8) /* rxFIFO overflow, when set rxFIFO has overflowed */
  176. #define SPI_INT_STA_RX_UDR \
  177. (0x1 << 9) /* rxFIFO underrun, when set rxFIFO has underrun */
  178. #define SPI_INT_STA_TX_OVF \
  179. (0x1 << 10) /* txFIFO overflow, when set txFIFO has overflowed */
  180. #define SPI_INT_STA_TX_UDR \
  181. (0x1 << 11) /* fxFIFO underrun, when set txFIFO has underrun */
  182. #define SPI_INT_STA_TC (0x1 << 12) /* Transfer Completed */
  183. #define SPI_INT_STA_SSI \
  184. (0x1 << 13) /* SS invalid interrupt, when set SS has changed from \
  185. valid to invalid */
  186. #define SPI_INT_STA_ERR \
  187. (SPI_INT_STA_TX_OVF | SPI_INT_STA_RX_UDR | \
  188. SPI_INT_STA_RX_OVF) /* NO txFIFO underrun */
  189. #define SPI_INT_STA_MASK (0x77 | (0x3f << 8))
  190. /* SPI FIFO Control Register Bit Fields & Masks,default value:0x0040_0001 */
  191. #define SPI_FIFO_CTL_RX_LEVEL \
  192. (0xFF << 0) /* rxFIFO reday request trigger level,default 0x1 */
  193. #define SPI_FIFO_CTL_RX_DRQEN \
  194. (0x1 << 8) /* rxFIFO DMA request enable,1:enable,0:disable */
  195. #define SPI_FIFO_CTL_RX_TESTEN \
  196. (0x1 << 14) /* rxFIFO test mode enable,1:enable,0:disable */
  197. #define SPI_FIFO_CTL_RX_RST \
  198. (0x1 << 15) /* rxFIFO reset, write 1, auto clear to 0 */
  199. #define SPI_FIFO_CTL_TX_LEVEL \
  200. (0xFF << 16) /* txFIFO empty request trigger level,default 0x40 */
  201. #define SPI_FIFO_CTL_TX_DRQEN \
  202. (0x1 << 24) /* txFIFO DMA request enable,1:enable,0:disable */
  203. #define SPI_FIFO_CTL_TX_TESTEN \
  204. (0x1 << 30) /* txFIFO test mode enable,1:enable,0:disable */
  205. #define SPI_FIFO_CTL_TX_RST \
  206. (0x1 << 31) /* txFIFO reset, write 1, auto clear to 0 */
  207. #define SPI_FIFO_CTL_DRQEN_MASK (SPI_FIFO_CTL_TX_DRQEN | SPI_FIFO_CTL_RX_DRQEN)
  208. /* SPI FIFO Status Register Bit Fields & Masks,default value:0x0000_0000 */
  209. #define SPI_FIFO_STA_RX_CNT \
  210. (0xFF << 0) /* rxFIFO counter,how many bytes in rxFIFO */
  211. #define SPI_FIFO_STA_RB_CNT \
  212. (0x7 << 12) /* rxFIFO read buffer counter,how many bytes in rxFIFO \
  213. read buffer */
  214. #define SPI_FIFO_STA_RB_WR (0x1 << 15) /* rxFIFO read buffer write enable */
  215. #define SPI_FIFO_STA_TX_CNT \
  216. (0xFF << 16) /* txFIFO counter,how many bytes in txFIFO */
  217. #define SPI_FIFO_STA_TB_CNT \
  218. (0x7 << 28) /* txFIFO write buffer counter,how many bytes in txFIFO \
  219. write buffer */
  220. #define SPI_FIFO_STA_TB_WR (0x1 << 31) /* txFIFO write buffer write enable */
  221. #define SPI_RXCNT_BIT_POS (0)
  222. #define SPI_TXCNT_BIT_POS (16)
  223. /* SPI Wait Clock Register Bit Fields & Masks,default value:0x0000_0000 */
  224. #define SPI_WAIT_WCC_MASK \
  225. (0xFFFF << 0) /* used only in master mode: Wait Between Transactions \
  226. */
  227. #define SPI_WAIT_SWC_MASK \
  228. (0xF << 16) /* used only in master mode: Wait before start dual data \
  229. transfer in dual SPI mode */
  230. /* SPI Clock Control Register Bit Fields & Masks,default:0x0000_0002 */
  231. #define SPI_CLK_CTL_CDR2 \
  232. (0xFF << 0) /* Clock Divide Rate 2,master mode only : SPI_CLK = \
  233. AHB_CLK/(2*(n+1)) */
  234. #define SPI_CLK_CTL_CDR1 \
  235. (0xF << 8) /* Clock Divide Rate 1,master mode only : SPI_CLK = \
  236. AHB_CLK/2^n */
  237. #define SPI_CLK_CTL_DRS \
  238. (0x1 << 12) /* Divide rate select,default,0:rate 1;1:rate 2 */
  239. #define SPI_CLK_SCOPE (SPI_CLK_CTL_CDR2 + 1)
  240. /* SPI Master Burst Counter Register Bit Fields & Masks,default:0x0000_0000 */
  241. /* master mode: when SMC = 1,BC specifies total burst number, Max length is
  242. * 16Mbytes */
  243. #define SPI_BC_CNT_MASK \
  244. (0xFFFFFF << 0) /* Total Burst Counter, tx length + rx length ,SMC=1 \
  245. */
  246. /* SPI Master Transmit Counter reigster default:0x0000_0000 */
  247. #define SPI_TC_CNT_MASK \
  248. (0xFFFFFF \
  249. << 0) /* Write Transmit Counter, tx length, NOT rx length!!! */
  250. /* SPI Master Burst Control Counter reigster Bit Fields &
  251. * Masks,default:0x0000_0000 */
  252. #define SPI_BCC_STC_MASK \
  253. (0xFFFFFF << 0) /* master single mode transmit counter */
  254. #define SPI_BCC_DBC_MASK (0xF << 24) /* master dummy burst counter */
  255. #define SPI_BCC_DUAL_MODE (0x1 << 28) /* master dual mode RX enable */
  256. #define SPI_BCC_QUAD_MODE (0x1 << 29) /* master quad mode RX enable */
  257. #define SPI_PHA_ACTIVE_ (0x01)
  258. #define SPI_POL_ACTIVE_ (0x02)
  259. #define SPI_MODE_0_ACTIVE_ (0 | 0)
  260. #define SPI_MODE_1_ACTIVE_ (0 | SPI_PHA_ACTIVE_)
  261. #define SPI_MODE_2_ACTIVE_ (SPI_POL_ACTIVE_ | 0)
  262. #define SPI_MODE_3_ACTIVE_ (SPI_POL_ACTIVE_ | SPI_PHA_ACTIVE_)
  263. #define SPI_CS_HIGH_ACTIVE_ (0x04)
  264. #define SPI_LSB_FIRST_ACTIVE_ (0x08)
  265. #define SPI_DUMMY_ONE_ACTIVE_ (0x10)
  266. #define SPI_RECEIVE_ALL_ACTIVE_ (0x20)
  267. #define SUNXI_SPI_DRQ_RX(ch) (DRQSRC_SPI0_RX + ch)
  268. #define SUNXI_SPI_DRQ_TX(ch) (DRQDST_SPI0_TX + ch)
  269. #define SPIM_BUSY (1)
  270. #define SPIM_IDLE (0)
  271. #define spim_set_idle(master_port) \
  272. do { \
  273. g_spi_master_status[master_port] = SPIM_IDLE; \
  274. } while (0)
  275. #define SPI_MASTER_MB_LSB_FIRST (0x1UL << 3)
  276. #define SPI_MASTER_MB_MSB_FIRST (0x0UL << 3)
  277. #define SPI_MASTER_CPOL_0 (0x0UL << 4)
  278. #define SPI_MASTER_CPOL_1 (0x1UL << 4)
  279. #define SPI_MASTER_CPHA_0 (0x0UL << 5)
  280. #define SPI_MASTER_CPHA_1 (0x1UL << 5)
  281. #define SPI_MASTER_INT_DISABLE (0x0UL << 9)
  282. #define SPI_MASTER_INT_ENABLE (0x1UL << 9)
  283. #define SPI_MASTER_HALF_DUPLEX (0x0UL << 10)
  284. #define SPI_MASTER_FULL_DUPLEX (0x1UL << 10)
  285. #define SPI_MASTER_SLAVE_SEL_0 (0x0UL << 29)
  286. #define SPI_MASTER_SLAVE_SEL_1 (0x1UL << 29)
  287. #ifdef __cplusplus
  288. }
  289. #endif
  290. #endif /* __COMMON_SPI_I_H__ */