i2c.h 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472
  1. /* Copyright 2018 Canaan Inc.
  2. *
  3. * Licensed under the Apache License, Version 2.0 (the "License");
  4. * you may not use this file except in compliance with the License.
  5. * You may obtain a copy of the License at
  6. *
  7. * http://www.apache.org/licenses/LICENSE-2.0
  8. *
  9. * Unless required by applicable law or agreed to in writing, software
  10. * distributed under the License is distributed on an "AS IS" BASIS,
  11. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. * See the License for the specific language governing permissions and
  13. * limitations under the License.
  14. */
  15. #ifndef _DRIVER_I2C_H
  16. #define _DRIVER_I2C_H
  17. #include <stddef.h>
  18. #include <stdint.h>
  19. #include "dmac.h"
  20. #ifdef __cplusplus
  21. extern "C" {
  22. #endif
  23. #define I2C_MAX_NUM 3
  24. /* clang-format off */
  25. typedef struct _i2c
  26. {
  27. /* I2C Control Register (0x00) */
  28. volatile uint32_t con;
  29. /* I2C Target Address Register (0x04) */
  30. volatile uint32_t tar;
  31. /* I2C Slave Address Register (0x08) */
  32. volatile uint32_t sar;
  33. /* reserved (0x0c) */
  34. volatile uint32_t resv1;
  35. /* I2C Data Buffer and Command Register (0x10) */
  36. volatile uint32_t data_cmd;
  37. /* I2C Standard Speed Clock SCL High Count Register (0x14) */
  38. volatile uint32_t ss_scl_hcnt;
  39. /* I2C Standard Speed Clock SCL Low Count Register (0x18) */
  40. volatile uint32_t ss_scl_lcnt;
  41. /* reserverd (0x1c-0x28) */
  42. volatile uint32_t resv2[4];
  43. /* I2C Interrupt Status Register (0x2c) */
  44. volatile uint32_t intr_stat;
  45. /* I2C Interrupt Mask Register (0x30) */
  46. volatile uint32_t intr_mask;
  47. /* I2C Raw Interrupt Status Register (0x34) */
  48. volatile uint32_t raw_intr_stat;
  49. /* I2C Receive FIFO Threshold Register (0x38) */
  50. volatile uint32_t rx_tl;
  51. /* I2C Transmit FIFO Threshold Register (0x3c) */
  52. volatile uint32_t tx_tl;
  53. /* I2C Clear Combined and Individual Interrupt Register (0x40) */
  54. volatile uint32_t clr_intr;
  55. /* I2C Clear RX_UNDER Interrupt Register (0x44) */
  56. volatile uint32_t clr_rx_under;
  57. /* I2C Clear RX_OVER Interrupt Register (0x48) */
  58. volatile uint32_t clr_rx_over;
  59. /* I2C Clear TX_OVER Interrupt Register (0x4c) */
  60. volatile uint32_t clr_tx_over;
  61. /* I2C Clear RD_REQ Interrupt Register (0x50) */
  62. volatile uint32_t clr_rd_req;
  63. /* I2C Clear TX_ABRT Interrupt Register (0x54) */
  64. volatile uint32_t clr_tx_abrt;
  65. /* I2C Clear RX_DONE Interrupt Register (0x58) */
  66. volatile uint32_t clr_rx_done;
  67. /* I2C Clear ACTIVITY Interrupt Register (0x5c) */
  68. volatile uint32_t clr_activity;
  69. /* I2C Clear STOP_DET Interrupt Register (0x60) */
  70. volatile uint32_t clr_stop_det;
  71. /* I2C Clear START_DET Interrupt Register (0x64) */
  72. volatile uint32_t clr_start_det;
  73. /* I2C Clear GEN_CALL Interrupt Register (0x68) */
  74. volatile uint32_t clr_gen_call;
  75. /* I2C Enable Register (0x6c) */
  76. volatile uint32_t enable;
  77. /* I2C Status Register (0x70) */
  78. volatile uint32_t status;
  79. /* I2C Transmit FIFO Level Register (0x74) */
  80. volatile uint32_t txflr;
  81. /* I2C Receive FIFO Level Register (0x78) */
  82. volatile uint32_t rxflr;
  83. /* I2C SDA Hold Time Length Register (0x7c) */
  84. volatile uint32_t sda_hold;
  85. /* I2C Transmit Abort Source Register (0x80) */
  86. volatile uint32_t tx_abrt_source;
  87. /* reserved (0x84) */
  88. volatile uint32_t resv3;
  89. /* I2C DMA Control Register (0x88) */
  90. volatile uint32_t dma_cr;
  91. /* I2C DMA Transmit Data Level Register (0x8c) */
  92. volatile uint32_t dma_tdlr;
  93. /* I2C DMA Receive Data Level Register (0x90) */
  94. volatile uint32_t dma_rdlr;
  95. /* I2C SDA Setup Register (0x94) */
  96. volatile uint32_t sda_setup;
  97. /* I2C ACK General Call Register (0x98) */
  98. volatile uint32_t general_call;
  99. /* I2C Enable Status Register (0x9c) */
  100. volatile uint32_t enable_status;
  101. /* I2C SS, FS or FM+ spike suppression limit (0xa0) */
  102. volatile uint32_t fs_spklen;
  103. /* reserved (0xa4-0xf0) */
  104. volatile uint32_t resv4[20];
  105. /* I2C Component Parameter Register 1 (0xf4) */
  106. volatile uint32_t comp_param_1;
  107. /* I2C Component Version Register (0xf8) */
  108. volatile uint32_t comp_version;
  109. /* I2C Component Type Register (0xfc) */
  110. volatile uint32_t comp_type;
  111. } __attribute__((packed, aligned(4))) i2c_t;
  112. /* I2C Control Register*/
  113. #define I2C_CON_MASTER_MODE 0x00000001U
  114. #define I2C_CON_SPEED_MASK 0x00000006U
  115. #define I2C_CON_SPEED(x) ((x) << 1)
  116. #define I2C_CON_10BITADDR_SLAVE 0x00000008U
  117. #define I2C_CON_RESTART_EN 0x00000020U
  118. #define I2C_CON_SLAVE_DISABLE 0x00000040U
  119. #define I2C_CON_STOP_DET_IFADDRESSED 0x00000080U
  120. #define I2C_CON_TX_EMPTY_CTRL 0x00000100U
  121. /* I2C Target Address Register*/
  122. #define I2C_TAR_ADDRESS_MASK 0x000003FFU
  123. #define I2C_TAR_ADDRESS(x) ((x) << 0)
  124. #define I2C_TAR_GC_OR_START 0x00000400U
  125. #define I2C_TAR_SPECIAL 0x00000800U
  126. #define I2C_TAR_10BITADDR_MASTER 0x00001000U
  127. /* I2C Slave Address Register*/
  128. #define I2C_SAR_ADDRESS_MASK 0x000003FFU
  129. #define I2C_SAR_ADDRESS(x) ((x) << 0)
  130. /* I2C Rx/Tx Data Buffer and Command Register*/
  131. #define I2C_DATA_CMD_CMD 0x00000100U
  132. #define I2C_DATA_CMD_DATA_MASK 0x000000FFU
  133. #define I2C_DATA_CMD_DATA(x) ((x) << 0)
  134. /* Standard Speed I2C Clock SCL High Count Register*/
  135. #define I2C_SS_SCL_HCNT_COUNT_MASK 0x0000FFFFU
  136. #define I2C_SS_SCL_HCNT_COUNT(x) ((x) << 0)
  137. /* Standard Speed I2C Clock SCL Low Count Register*/
  138. #define I2C_SS_SCL_LCNT_COUNT_MASK 0x0000FFFFU
  139. #define I2C_SS_SCL_LCNT_COUNT(x) ((x) << 0)
  140. /* I2C Interrupt Status Register*/
  141. #define I2C_INTR_STAT_RX_UNDER 0x00000001U
  142. #define I2C_INTR_STAT_RX_OVER 0x00000002U
  143. #define I2C_INTR_STAT_RX_FULL 0x00000004U
  144. #define I2C_INTR_STAT_TX_OVER 0x00000008U
  145. #define I2C_INTR_STAT_TX_EMPTY 0x00000010U
  146. #define I2C_INTR_STAT_RD_REQ 0x00000020U
  147. #define I2C_INTR_STAT_TX_ABRT 0x00000040U
  148. #define I2C_INTR_STAT_RX_DONE 0x00000080U
  149. #define I2C_INTR_STAT_ACTIVITY 0x00000100U
  150. #define I2C_INTR_STAT_STOP_DET 0x00000200U
  151. #define I2C_INTR_STAT_START_DET 0x00000400U
  152. #define I2C_INTR_STAT_GEN_CALL 0x00000800U
  153. /* I2C Interrupt Mask Register*/
  154. #define I2C_INTR_MASK_RX_UNDER 0x00000001U
  155. #define I2C_INTR_MASK_RX_OVER 0x00000002U
  156. #define I2C_INTR_MASK_RX_FULL 0x00000004U
  157. #define I2C_INTR_MASK_TX_OVER 0x00000008U
  158. #define I2C_INTR_MASK_TX_EMPTY 0x00000010U
  159. #define I2C_INTR_MASK_RD_REQ 0x00000020U
  160. #define I2C_INTR_MASK_TX_ABRT 0x00000040U
  161. #define I2C_INTR_MASK_RX_DONE 0x00000080U
  162. #define I2C_INTR_MASK_ACTIVITY 0x00000100U
  163. #define I2C_INTR_MASK_STOP_DET 0x00000200U
  164. #define I2C_INTR_MASK_START_DET 0x00000400U
  165. #define I2C_INTR_MASK_GEN_CALL 0x00000800U
  166. /* I2C Raw Interrupt Status Register*/
  167. #define I2C_RAW_INTR_MASK_RX_UNDER 0x00000001U
  168. #define I2C_RAW_INTR_MASK_RX_OVER 0x00000002U
  169. #define I2C_RAW_INTR_MASK_RX_FULL 0x00000004U
  170. #define I2C_RAW_INTR_MASK_TX_OVER 0x00000008U
  171. #define I2C_RAW_INTR_MASK_TX_EMPTY 0x00000010U
  172. #define I2C_RAW_INTR_MASK_RD_REQ 0x00000020U
  173. #define I2C_RAW_INTR_MASK_TX_ABRT 0x00000040U
  174. #define I2C_RAW_INTR_MASK_RX_DONE 0x00000080U
  175. #define I2C_RAW_INTR_MASK_ACTIVITY 0x00000100U
  176. #define I2C_RAW_INTR_MASK_STOP_DET 0x00000200U
  177. #define I2C_RAW_INTR_MASK_START_DET 0x00000400U
  178. #define I2C_RAW_INTR_MASK_GEN_CALL 0x00000800U
  179. /* I2C Receive FIFO Threshold Register*/
  180. #define I2C_RX_TL_VALUE_MASK 0x00000007U
  181. #define I2C_RX_TL_VALUE(x) ((x) << 0)
  182. /* I2C Transmit FIFO Threshold Register*/
  183. #define I2C_TX_TL_VALUE_MASK 0x00000007U
  184. #define I2C_TX_TL_VALUE(x) ((x) << 0)
  185. /* Clear Combined and Individual Interrupt Register*/
  186. #define I2C_CLR_INTR_CLR 0x00000001U
  187. /* Clear RX_UNDER Interrupt Register*/
  188. #define I2C_CLR_RX_UNDER_CLR 0x00000001U
  189. /* Clear RX_OVER Interrupt Register*/
  190. #define I2C_CLR_RX_OVER_CLR 0x00000001U
  191. /* Clear TX_OVER Interrupt Register*/
  192. #define I2C_CLR_TX_OVER_CLR 0x00000001U
  193. /* Clear RD_REQ Interrupt Register*/
  194. #define I2C_CLR_RD_REQ_CLR 0x00000001U
  195. /* Clear TX_ABRT Interrupt Register*/
  196. #define I2C_CLR_TX_ABRT_CLR 0x00000001U
  197. /* Clear RX_DONE Interrupt Register*/
  198. #define I2C_CLR_RX_DONE_CLR 0x00000001U
  199. /* Clear ACTIVITY Interrupt Register*/
  200. #define I2C_CLR_ACTIVITY_CLR 0x00000001U
  201. /* Clear STOP_DET Interrupt Register*/
  202. #define I2C_CLR_STOP_DET_CLR 0x00000001U
  203. /* Clear START_DET Interrupt Register*/
  204. #define I2C_CLR_START_DET_CLR 0x00000001U
  205. /* Clear GEN_CALL Interrupt Register*/
  206. #define I2C_CLR_GEN_CALL_CLR 0x00000001U
  207. /* I2C Enable Register*/
  208. #define I2C_ENABLE_ENABLE 0x00000001U
  209. #define I2C_ENABLE_ABORT 0x00000002U
  210. #define I2C_ENABLE_TX_CMD_BLOCK 0x00000004U
  211. /* I2C Status Register*/
  212. #define I2C_STATUS_ACTIVITY 0x00000001U
  213. #define I2C_STATUS_TFNF 0x00000002U
  214. #define I2C_STATUS_TFE 0x00000004U
  215. #define I2C_STATUS_RFNE 0x00000008U
  216. #define I2C_STATUS_RFF 0x00000010U
  217. #define I2C_STATUS_MST_ACTIVITY 0x00000020U
  218. #define I2C_STATUS_SLV_ACTIVITY 0x00000040U
  219. /* I2C Transmit FIFO Level Register*/
  220. #define I2C_TXFLR_VALUE_MASK 0x00000007U
  221. #define I2C_TXFLR_VALUE(x) ((x) << 0)
  222. /* I2C Receive FIFO Level Register*/
  223. #define I2C_RXFLR_VALUE_MASK 0x00000007U
  224. #define I2C_RXFLR_VALUE(x) ((x) << 0)
  225. /* I2C SDA Hold Time Length Register*/
  226. #define I2C_SDA_HOLD_TX_MASK 0x0000FFFFU
  227. #define I2C_SDA_HOLD_TX(x) ((x) << 0)
  228. #define I2C_SDA_HOLD_RX_MASK 0x00FF0000U
  229. #define I2C_SDA_HOLD_RX(x) ((x) << 16)
  230. /* I2C Transmit Abort Source Register*/
  231. #define I2C_TX_ABRT_SOURCE_7B_ADDR_NOACK 0x00000001U
  232. #define I2C_TX_ABRT_SOURCE_10B_ADDR1_NOACK 0x00000002U
  233. #define I2C_TX_ABRT_SOURCE_10B_ADDR2_NOACK 0x00000004U
  234. #define I2C_TX_ABRT_SOURCE_TXDATA_NOACK 0x00000008U
  235. #define I2C_TX_ABRT_SOURCE_GCALL_NOACK 0x00000010U
  236. #define I2C_TX_ABRT_SOURCE_GCALL_READ 0x00000020U
  237. #define I2C_TX_ABRT_SOURCE_HS_ACKDET 0x00000040U
  238. #define I2C_TX_ABRT_SOURCE_SBYTE_ACKDET 0x00000080U
  239. #define I2C_TX_ABRT_SOURCE_HS_NORSTRT 0x00000100U
  240. #define I2C_TX_ABRT_SOURCE_SBYTE_NORSTRT 0x00000200U
  241. #define I2C_TX_ABRT_SOURCE_10B_RD_NORSTRT 0x00000400U
  242. #define I2C_TX_ABRT_SOURCE_MASTER_DIS 0x00000800U
  243. #define I2C_TX_ABRT_SOURCE_MST_ARBLOST 0x00001000U
  244. #define I2C_TX_ABRT_SOURCE_SLVFLUSH_TXFIFO 0x00002000U
  245. #define I2C_TX_ABRT_SOURCE_SLV_ARBLOST 0x00004000U
  246. #define I2C_TX_ABRT_SOURCE_SLVRD_INTX 0x00008000U
  247. #define I2C_TX_ABRT_SOURCE_USER_ABRT 0x00010000U
  248. /* DMA Control Register*/
  249. #define I2C_DMA_CR_RDMAE 0x00000001U
  250. #define I2C_DMA_CR_TDMAE 0x00000002U
  251. /* DMA Transmit Data Level Register*/
  252. #define I2C_DMA_TDLR_VALUE_MASK 0x00000007U
  253. #define I2C_DMA_TDLR_VALUE(x) ((x) << 0)
  254. /* DMA Receive Data Level Register*/
  255. #define I2C_DMA_RDLR_VALUE_MASK 0x00000007U
  256. #define I2C_DMA_RDLR_VALUE(x) ((x) << 0)
  257. /* I2C SDA Setup Register*/
  258. #define I2C_SDA_SETUP_VALUE_MASK 0x000000FFU
  259. #define I2C_SDA_SETUP_VALUE(x) ((x) << 0)
  260. /* I2C ACK General Call Register*/
  261. #define I2C_ACK_GENERAL_CALL_ENABLE 0x00000001U
  262. /* I2C Enable Status Register*/
  263. #define I2C_ENABLE_STATUS_IC_ENABLE 0x00000001U
  264. #define I2C_ENABLE_STATUS_SLV_DIS_BUSY 0x00000002U
  265. #define I2C_ENABLE_STATUS_SLV_RX_DATA_LOST 0x00000004U
  266. /* I2C SS, FS or FM+ spike suppression limit*/
  267. #define I2C_FS_SPKLEN_VALUE_MASK 0x000000FFU
  268. #define I2C_FS_SPKLEN_VALUE(x) ((x) << 0)
  269. /* Component Parameter Register 1*/
  270. #define I2C_COMP_PARAM1_APB_DATA_WIDTH 0x00000003U
  271. #define I2C_COMP_PARAM1_MAX_SPEED_MODE 0x0000000CU
  272. #define I2C_COMP_PARAM1_HC_COUNT_VALUES 0x00000010U
  273. #define I2C_COMP_PARAM1_INTR_IO 0x00000020U
  274. #define I2C_COMP_PARAM1_HAS_DMA 0x00000040U
  275. #define I2C_COMP_PARAM1_ENCODED_PARAMS 0x00000080U
  276. #define I2C_COMP_PARAM1_RX_BUFFER_DEPTH 0x0000FF00U
  277. #define I2C_COMP_PARAM1_TX_BUFFER_DEPTH 0x00FF0000U
  278. /* I2C Component Version Register*/
  279. #define I2C_COMP_VERSION_VALUE 0xFFFFFFFFU
  280. /* I2C Component Type Register*/
  281. #define I2C_COMP_TYPE_VALUE 0xFFFFFFFFU
  282. /* clang-format on */
  283. extern volatile i2c_t *const i2c[3];
  284. typedef enum _i2c_device_number
  285. {
  286. I2C_DEVICE_0,
  287. I2C_DEVICE_1,
  288. I2C_DEVICE_2,
  289. I2C_DEVICE_MAX,
  290. } i2c_device_number_t;
  291. typedef enum _i2c_bus_speed_mode
  292. {
  293. I2C_BS_STANDARD,
  294. I2C_BS_FAST,
  295. I2C_BS_HIGHSPEED
  296. } i2c_bus_speed_mode_t;
  297. typedef enum _i2c_event
  298. {
  299. I2C_EV_START,
  300. I2C_EV_RESTART,
  301. I2C_EV_STOP
  302. } i2c_event_t;
  303. typedef struct _i2c_slave_handler
  304. {
  305. void (*on_receive)(uint32_t data);
  306. uint32_t (*on_transmit)();
  307. void (*on_event)(i2c_event_t event);
  308. } i2c_slave_handler_t;
  309. typedef enum _i2c_transfer_mode
  310. {
  311. I2C_SEND,
  312. I2C_RECEIVE,
  313. } i2c_transfer_mode_t;
  314. typedef struct _i2c_data_t
  315. {
  316. dmac_channel_number_t tx_channel;
  317. dmac_channel_number_t rx_channel;
  318. uint32_t *tx_buf;
  319. size_t tx_len;
  320. uint32_t *rx_buf;
  321. size_t rx_len;
  322. i2c_transfer_mode_t transfer_mode;
  323. } i2c_data_t;
  324. /**
  325. * @brief Set i2c params
  326. *
  327. * @param[in] i2c_num i2c number
  328. * @param[in] slave_address i2c slave device address
  329. * @param[in] address_width address width 7bit or 10bit
  330. * @param[in] i2c_clk i2c clk rate
  331. */
  332. void i2c_init(i2c_device_number_t i2c_num, uint32_t slave_address, uint32_t address_width,
  333. uint32_t i2c_clk);
  334. /**
  335. * @brief I2c send data
  336. *
  337. * @param[in] i2c_num i2c number
  338. * @param[in] send_buf send data
  339. * @param[in] send_buf_len send data length
  340. *
  341. * @return result
  342. * - 0 Success
  343. * - Other Fail
  344. */
  345. int i2c_send_data(i2c_device_number_t i2c_num, const uint8_t *send_buf, size_t send_buf_len);
  346. /**
  347. * @brief Init i2c as slave mode.
  348. *
  349. * @param[in] i2c_num i2c number
  350. * @param[in] slave_address i2c slave device address
  351. * @param[in] address_width address width 7bit or 10bit
  352. * @param[in] handler Handle of i2c slave interrupt function.
  353. */
  354. void i2c_init_as_slave(i2c_device_number_t i2c_num, uint32_t slave_address, uint32_t address_width,
  355. const i2c_slave_handler_t *handler);
  356. /**
  357. * @brief I2c send data by dma
  358. *
  359. * @param[in] dma_channel_num dma channel
  360. * @param[in] i2c_num i2c number
  361. * @param[in] send_buf send data
  362. * @param[in] send_buf_len send data length
  363. *
  364. * @return result
  365. * - 0 Success
  366. * - Other Fail
  367. */
  368. void i2c_send_data_dma(dmac_channel_number_t dma_channel_num, i2c_device_number_t i2c_num, const uint8_t *send_buf,
  369. size_t send_buf_len);
  370. /**
  371. * @brief I2c receive data
  372. *
  373. * @param[in] i2c_num i2c number
  374. * @param[in] send_buf send data address
  375. * @param[in] send_buf_len length of send buf
  376. * @param[in] receive_buf receive buf address
  377. * @param[in] receive_buf_len length of receive buf
  378. *
  379. * @return result
  380. * - 0 Success
  381. * - Other Fail
  382. */
  383. int i2c_recv_data(i2c_device_number_t i2c_num, const uint8_t *send_buf, size_t send_buf_len, uint8_t *receive_buf,
  384. size_t receive_buf_len);
  385. /**
  386. * @brief I2c receive data by dma
  387. *
  388. * @param[in] dma_send_channel_num send dma channel
  389. * @param[in] dma_receive_channel_num receive dma channel
  390. * @param[in] i2c_num i2c number
  391. * @param[in] send_buf send data address
  392. * @param[in] send_buf_len length of send buf
  393. * @param[in] receive_buf receive buf address
  394. * @param[in] receive_buf_len length of receive buf
  395. *
  396. * @return result
  397. * - 0 Success
  398. * - Other Fail
  399. */
  400. void i2c_recv_data_dma(dmac_channel_number_t dma_send_channel_num, dmac_channel_number_t dma_receive_channel_num,
  401. i2c_device_number_t i2c_num, const uint8_t *send_buf, size_t send_buf_len,
  402. uint8_t *receive_buf, size_t receive_buf_len);
  403. /**
  404. * @brief I2c handle transfer data operations
  405. *
  406. * @param[in] i2c_num i2c number
  407. * @param[in] data i2c data information
  408. * @param[in] cb i2c dma callback
  409. *
  410. */
  411. void i2c_handle_data_dma(i2c_device_number_t i2c_num, i2c_data_t data, plic_interrupt_t *cb);
  412. #ifdef __cplusplus
  413. }
  414. #endif
  415. #endif /* _DRIVER_I2C_H */