drv_hard_i2c.c 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727
  1. /*
  2. * Copyright (c) 2006-2023, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2024-02-17 Dyyt587 first version
  9. */
  10. #include <rtthread.h>
  11. #include <rthw.h>
  12. #include <board.h>
  13. #include "drv_hard_i2c.h"
  14. #include "drv_config.h"
  15. #include <string.h>
  16. /* not fully support for I2C4 */
  17. #if defined(BSP_USING_HARD_I2C1) || defined(BSP_USING_HARD_I2C2) || defined(BSP_USING_HARD_I2C3)
  18. //#define DRV_DEBUG
  19. #define LOG_TAG "drv.i2c.hw"
  20. #include <drv_log.h>
  21. enum
  22. {
  23. #ifdef BSP_USING_HARD_I2C1
  24. I2C1_INDEX,
  25. #endif /* BSP_USING_HARD_I2C1 */
  26. #ifdef BSP_USING_HARD_I2C2
  27. I2C2_INDEX,
  28. #endif /* BSP_USING_HARD_I2C2 */
  29. #ifdef BSP_USING_HARD_I2C3
  30. I2C3_INDEX,
  31. #endif /* BSP_USING_HARD_I2C3 */
  32. };
  33. static struct stm32_i2c_config i2c_config[] =
  34. {
  35. #ifdef BSP_USING_HARD_I2C1
  36. I2C1_BUS_CONFIG,
  37. #endif /* BSP_USING_HARD_I2C1 */
  38. #ifdef BSP_USING_HARD_I2C2
  39. I2C2_BUS_CONFIG,
  40. #endif /* BSP_USING_HARD_I2C2 */
  41. #ifdef BSP_USING_HARD_I2C3
  42. I2C3_BUS_CONFIG,
  43. #endif /* BSP_USING_HARD_I2C3 */
  44. };
  45. static struct stm32_i2c i2c_objs[sizeof(i2c_config) / sizeof(i2c_config[0])] = {0};
  46. static rt_err_t stm32_i2c_init(struct stm32_i2c *i2c_drv)
  47. {
  48. RT_ASSERT(i2c_drv != RT_NULL);
  49. I2C_HandleTypeDef *i2c_handle = &i2c_drv->handle;
  50. rt_memset(i2c_handle, 0, sizeof(I2C_HandleTypeDef));
  51. struct stm32_i2c_config *cfg = i2c_drv->config;
  52. i2c_handle->Instance = cfg->Instance;
  53. i2c_handle->Init.Timing = cfg->timing;
  54. i2c_handle->Init.OwnAddress1 = 0;
  55. i2c_handle->Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
  56. i2c_handle->Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
  57. i2c_handle->Init.OwnAddress2 = 0;
  58. i2c_handle->Init.OwnAddress2Masks = I2C_OA2_NOMASK;
  59. i2c_handle->Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
  60. i2c_handle->Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
  61. if (HAL_I2C_DeInit(i2c_handle) != HAL_OK)
  62. {
  63. return -RT_EFAULT;
  64. }
  65. if (HAL_I2C_Init(i2c_handle) != HAL_OK)
  66. {
  67. return -RT_EFAULT;
  68. }
  69. /* Configure Analogue filter */
  70. if (HAL_I2CEx_ConfigAnalogFilter(i2c_handle, I2C_ANALOGFILTER_ENABLE) != HAL_OK)
  71. {
  72. return -RT_EFAULT;
  73. }
  74. /* Configure Digital filter */
  75. if (HAL_I2CEx_ConfigDigitalFilter(i2c_handle, 0) != HAL_OK)
  76. {
  77. return -RT_EFAULT;
  78. }
  79. /* I2C2 DMA Init */
  80. if (i2c_drv->i2c_dma_flag & I2C_USING_RX_DMA_FLAG)
  81. {
  82. HAL_DMA_Init(&i2c_drv->dma.handle_rx);
  83. __HAL_LINKDMA(&i2c_drv->handle, hdmarx, i2c_drv->dma.handle_rx);
  84. /* NVIC configuration for DMA transfer complete interrupt */
  85. HAL_NVIC_SetPriority(i2c_drv->config->dma_rx->dma_irq, 0, 0);
  86. HAL_NVIC_EnableIRQ(i2c_drv->config->dma_rx->dma_irq);
  87. }
  88. if (i2c_drv->i2c_dma_flag & I2C_USING_TX_DMA_FLAG)
  89. {
  90. HAL_DMA_Init(&i2c_drv->dma.handle_tx);
  91. __HAL_LINKDMA(&i2c_drv->handle, hdmatx, i2c_drv->dma.handle_tx);
  92. /* NVIC configuration for DMA transfer complete interrupt */
  93. HAL_NVIC_SetPriority(i2c_drv->config->dma_tx->dma_irq, 1, 0);
  94. HAL_NVIC_EnableIRQ(i2c_drv->config->dma_tx->dma_irq);
  95. }
  96. if (i2c_drv->i2c_dma_flag & I2C_USING_TX_DMA_FLAG || i2c_drv->i2c_dma_flag & I2C_USING_RX_DMA_FLAG)
  97. {
  98. HAL_NVIC_SetPriority(i2c_drv->config->evirq_type, 2, 0);
  99. HAL_NVIC_EnableIRQ(i2c_drv->config->evirq_type);
  100. }
  101. return RT_EOK;
  102. }
  103. static rt_err_t stm32_i2c_configure(struct rt_i2c_bus_device *bus)
  104. {
  105. int ret = -RT_ERROR;
  106. RT_ASSERT(RT_NULL != bus);
  107. struct stm32_i2c *i2c_drv = rt_container_of(bus, struct stm32_i2c, i2c_bus);
  108. return stm32_i2c_init(i2c_drv);
  109. }
  110. /**
  111. * @brief Hardware I2C driver transfer
  112. *
  113. * @param bus Device bus
  114. * @param msgs Data to be transferred
  115. * @param num Number of data
  116. * @return rt_ssize_t Transfer status
  117. */
  118. static rt_ssize_t stm32_i2c_master_xfer(struct rt_i2c_bus_device *bus,
  119. struct rt_i2c_msg msgs[],
  120. rt_uint32_t num)
  121. {
  122. /* for stm32 dma may more stability */
  123. #define DMA_TRANS_MIN_LEN 2 /* only buffer length >= DMA_TRANS_MIN_LEN will use DMA mode */
  124. #define TRANS_TIMEOUT_PERSEC 8 /* per ms will trans nums bytes */
  125. rt_int32_t i, ret;
  126. struct rt_i2c_msg *msg = msgs;
  127. struct rt_i2c_msg *next_msg = 0;
  128. struct stm32_i2c *i2c_obj;
  129. uint32_t mode = 0;
  130. uint8_t next_flag = 0;
  131. struct rt_completion *completion;
  132. rt_uint32_t timeout;
  133. if (num == 0)
  134. {
  135. return 0;
  136. }
  137. RT_ASSERT((msgs != RT_NULL) && (bus != RT_NULL));
  138. i2c_obj = rt_container_of(bus, struct stm32_i2c, i2c_bus);
  139. completion = &i2c_obj->completion;
  140. I2C_HandleTypeDef *handle = &i2c_obj->handle;
  141. LOG_D("xfer start %d mags", num);
  142. for (i = 0; i < (num - 1); i++)
  143. {
  144. mode = 0;
  145. msg = &msgs[i];
  146. LOG_D("xfer msgs[%d] addr=0x%2x buf=0x%x len= 0x%x flags= 0x%x", i, msg->addr, msg->buf, msg->len, msg->flags);
  147. next_msg = &msgs[i + 1];
  148. next_flag = next_msg->flags;
  149. timeout = msg->len/TRANS_TIMEOUT_PERSEC + 1;
  150. if (next_flag & RT_I2C_NO_START)
  151. {
  152. if ((next_flag & RT_I2C_RD) == (msg->flags & RT_I2C_RD))
  153. { /* The same mode, can use no start */
  154. mode = I2C_FIRST_AND_NEXT_FRAME;
  155. }
  156. else
  157. {
  158. /* Not allowed to use no start, sending address is required when changing direction, user setting error */
  159. LOG_W("user set flags error msg[%d] flags RT_I2C_NO_START has canceled", i + 1);
  160. mode = I2C_LAST_FRAME_NO_STOP;
  161. }
  162. }
  163. else
  164. {
  165. mode = I2C_LAST_FRAME_NO_STOP;
  166. }
  167. if (msg->flags & RT_I2C_RD)
  168. {
  169. LOG_D("xfer rec msgs[%d] hal mode = %s", i, mode == I2C_FIRST_AND_NEXT_FRAME ? "I2C_FIRST_AND_NEXT_FRAME" : mode == I2C_LAST_FRAME_NO_STOP ? "I2C_FIRST_FRAME/I2C_LAST_FRAME_NO_STOP"
  170. : mode == I2C_LAST_FRAME ? "I2C_LAST_FRAME"
  171. : "nuknown mode");
  172. if ((i2c_obj->i2c_dma_flag & I2C_USING_RX_DMA_FLAG) && (msg->len >= DMA_TRANS_MIN_LEN))
  173. {
  174. ret = HAL_I2C_Master_Seq_Receive_DMA(handle, (msg->addr<<1) , msg->buf, msg->len, mode);
  175. }
  176. else
  177. {
  178. ret = HAL_I2C_Master_Seq_Receive_IT(handle, (msg->addr<<1) , msg->buf, msg->len, mode);
  179. }
  180. if (ret != RT_EOK)
  181. {
  182. LOG_E("[%s:%d]I2C Read error(%d)!\n", __func__, __LINE__, ret);
  183. goto out;
  184. }
  185. if (rt_completion_wait(completion, timeout) != RT_EOK)
  186. {
  187. LOG_D("receive time out");
  188. goto out;
  189. }
  190. }
  191. else
  192. {
  193. LOG_D("xfer trans msgs[%d] hal mode = %s", i, mode == I2C_FIRST_AND_NEXT_FRAME ? "I2C_FIRST_AND_NEXT_FRAME" : mode == I2C_LAST_FRAME_NO_STOP ? "I2C_FIRST_FRAME/I2C_LAST_FRAME_NO_STOP"
  194. : mode == I2C_LAST_FRAME ? "I2C_LAST_FRAME"
  195. : "nuknown mode");
  196. if ((i2c_obj->i2c_dma_flag & I2C_USING_TX_DMA_FLAG) && (msg->len >= DMA_TRANS_MIN_LEN))
  197. {
  198. ret = HAL_I2C_Master_Seq_Transmit_DMA(handle, (msg->addr<<1) , msg->buf, msg->len, mode);
  199. }
  200. else
  201. {
  202. ret = HAL_I2C_Master_Seq_Transmit_IT(handle, (msg->addr<<1) , msg->buf, msg->len, mode);
  203. }
  204. if (ret != RT_EOK)
  205. {
  206. LOG_D("[%s:%d]I2C Write error(%d)!\n", __func__, __LINE__, ret);
  207. goto out;
  208. }
  209. if (rt_completion_wait(completion, timeout) != RT_EOK)
  210. {
  211. LOG_D("transmit time out");
  212. goto out;
  213. }
  214. }
  215. LOG_D("xfer next msgs[%d] addr=0x%2x buf= 0x%x len= 0x%x flags = 0x%x\r\n", i + 1, next_msg->addr, next_msg->buf, next_msg->len, next_msg->flags);
  216. }
  217. /* last msg */
  218. msg = &msgs[i];
  219. timeout = msg->len/TRANS_TIMEOUT_PERSEC+1;
  220. if (msg->flags & RT_I2C_NO_STOP)
  221. mode = I2C_LAST_FRAME_NO_STOP;
  222. else
  223. mode = I2C_LAST_FRAME;
  224. LOG_D("xfer last msgs[%d] addr=0x%2x buf= 0x%x len= 0x%x flags = 0x%x", i, msg->addr, msg->buf, msg->len, msg->flags);
  225. if (msg->flags & RT_I2C_RD)
  226. {
  227. LOG_D("xfer rec msgs[%d] hal mode=%s", i, mode == I2C_FIRST_AND_NEXT_FRAME ? "I2C_FIRST_AND_NEXT_FRAME" : mode == I2C_LAST_FRAME_NO_STOP ? "I2C_FIRST_FRAME/I2C_LAST_FRAME_NO_STOP"
  228. : mode == I2C_LAST_FRAME ? "I2C_LAST_FRAME"
  229. : "nuknown mode");
  230. if ((i2c_obj->i2c_dma_flag & I2C_USING_RX_DMA_FLAG) && (msg->len >= DMA_TRANS_MIN_LEN))
  231. {
  232. ret = HAL_I2C_Master_Seq_Receive_DMA(handle, (msg->addr<<1) , msg->buf, msg->len, mode);
  233. }
  234. else
  235. {
  236. ret = HAL_I2C_Master_Seq_Receive_IT(handle,(msg->addr<<1) , msg->buf, msg->len, mode);
  237. }
  238. if (ret != RT_EOK)
  239. {
  240. LOG_D("[%s:%d]I2C Read error(%d)!\n", __func__, __LINE__, ret);
  241. goto out;
  242. }
  243. if (rt_completion_wait(completion, timeout) != RT_EOK)
  244. {
  245. LOG_D("receive time out");
  246. goto out;
  247. }
  248. }
  249. else
  250. {
  251. LOG_D("xfer trans msgs[%d] hal mode = %s", i, mode == I2C_FIRST_AND_NEXT_FRAME ? "I2C_FIRST_AND_NEXT_FRAME" : mode == I2C_LAST_FRAME ? "I2C_LAST_FRAME"
  252. : mode == I2C_LAST_FRAME_NO_STOP ? "I2C_FIRST_FRAME/I2C_LAST_FRAME_NO_STOP"
  253. : "nuknown mode");
  254. if ((i2c_obj->i2c_dma_flag & I2C_USING_TX_DMA_FLAG) && (msg->len >= DMA_TRANS_MIN_LEN))
  255. {
  256. ret = HAL_I2C_Master_Seq_Transmit_DMA(handle, (msg->addr<<1) , msg->buf, msg->len, mode);
  257. }
  258. else
  259. {
  260. ret = HAL_I2C_Master_Seq_Transmit_IT(handle, (msg->addr<<1) , msg->buf, msg->len, mode);
  261. }
  262. if (ret != RT_EOK)
  263. {
  264. LOG_D("[%s:%d]I2C Write error(%d)!\n", __func__, __LINE__, ret);
  265. goto out;
  266. }
  267. if (rt_completion_wait(completion, timeout) != RT_EOK)
  268. {
  269. LOG_D("transmit time out");
  270. goto out;
  271. }
  272. }
  273. ret = num;
  274. LOG_D("xfer end %d mags\r\n", num);
  275. return ret;
  276. out:
  277. if (handle->ErrorCode == HAL_I2C_ERROR_AF)
  278. {
  279. LOG_D("I2C NACK Error now stoped");
  280. /* Send stop signal to prevent bus lock-up */
  281. handle->Instance->CR1 |= I2C_IT_STOPI;
  282. }
  283. if (handle->ErrorCode == HAL_I2C_ERROR_BERR)
  284. {
  285. LOG_D("I2C BUS Error now stoped");
  286. handle->Instance->CR1 |= I2C_IT_STOPI;
  287. ret=i-1;
  288. return ret;
  289. }
  290. static const struct rt_i2c_bus_device_ops stm32_i2c_ops =
  291. {
  292. .master_xfer = stm32_i2c_master_xfer,
  293. RT_NULL,
  294. RT_NULL
  295. };
  296. int RT_hw_i2c_bus_init(void)
  297. {
  298. int ret = -RT_ERROR;
  299. rt_size_t obj_num = sizeof(i2c_objs) / sizeof(i2c_objs[0]);
  300. for (int i = 0; i < obj_num; i++)
  301. {
  302. i2c_objs[i].i2c_bus.ops = &stm32_i2c_ops;
  303. i2c_objs[i].config = &i2c_config[i];
  304. i2c_objs[i].i2c_bus.timeout = i2c_config[i].timeout;
  305. if (i2c_objs[i].i2c_dma_flag & I2C_USING_TX_DMA_FLAG)
  306. {
  307. i2c_objs[i].dma.handle_tx.Instance = i2c_config[i].dma_tx->Instance;
  308. #if defined(SOC_SERIES_STM32F2) || defined(SOC_SERIES_STM32F4) || defined(SOC_SERIES_STM32F7)
  309. i2c_objs[i].dma.handle_tx.Init.Channel = i2c_config[i].dma_tx->channel;
  310. #elif defined(SOC_SERIES_STM32L4) || defined(SOC_SERIES_STM32G0) || defined(SOC_SERIES_STM32MP1) || defined(SOC_SERIES_STM32WB) || defined(SOC_SERIES_STM32H7)
  311. i2c_objs[i].dma.handle_tx.Init.Request = i2c_config[i].dma_tx->request;
  312. #endif /* defined(SOC_SERIES_STM32F2) || defined(SOC_SERIES_STM32F4) || defined(SOC_SERIES_STM32F7) */
  313. #ifndef SOC_SERIES_STM32U5
  314. i2c_objs[i].dma.handle_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
  315. i2c_objs[i].dma.handle_tx.Init.PeriphInc = DMA_PINC_DISABLE;
  316. i2c_objs[i].dma.handle_tx.Init.MemInc = DMA_MINC_ENABLE;
  317. i2c_objs[i].dma.handle_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
  318. i2c_objs[i].dma.handle_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
  319. i2c_objs[i].dma.handle_tx.Init.Mode = DMA_NORMAL;
  320. i2c_objs[i].dma.handle_tx.Init.Priority = DMA_PRIORITY_LOW;
  321. #endif
  322. #if defined(SOC_SERIES_STM32F2) || defined(SOC_SERIES_STM32F4) || defined(SOC_SERIES_STM32F7) || defined(SOC_SERIES_STM32MP1) || defined(SOC_SERIES_STM32H7)
  323. i2c_objs[i].dma.handle_tx.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
  324. i2c_objs[i].dma.handle_tx.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL;
  325. i2c_objs[i].dma.handle_tx.Init.MemBurst = DMA_MBURST_INC4;
  326. i2c_objs[i].dma.handle_tx.Init.PeriphBurst = DMA_PBURST_INC4;
  327. #endif /* defined(SOC_SERIES_STM32F2) || defined(SOC_SERIES_STM32F4) || defined(SOC_SERIES_STM32F7) || defined(SOC_SERIES_STM32MP1) || defined(SOC_SERIES_STM32H7) */
  328. }
  329. if ((i2c_objs[i].i2c_dma_flag & I2C_USING_RX_DMA_FLAG))
  330. {
  331. i2c_objs[i].dma.handle_rx.Instance = i2c_config[i].dma_rx->Instance;
  332. #if defined(SOC_SERIES_STM32F2) || defined(SOC_SERIES_STM32F4) || defined(SOC_SERIES_STM32F7)
  333. i2c_objs[i].dma.handle_rx.Init.Channel = i2c_config[i].dma_rx->channel;
  334. #elif defined(SOC_SERIES_STM32L4) || defined(SOC_SERIES_STM32G0) || defined(SOC_SERIES_STM32MP1) || defined(SOC_SERIES_STM32WB) || defined(SOC_SERIES_STM32H7)
  335. i2c_objs[i].dma.handle_rx.Init.Request = i2c_config[i].dma_rx->request;
  336. #endif /* defined(SOC_SERIES_STM32F2) || defined(SOC_SERIES_STM32F4) || defined(SOC_SERIES_STM32F7) */
  337. #ifndef SOC_SERIES_STM32U5
  338. i2c_objs[i].dma.handle_rx.Init.Direction = DMA_PERIPH_TO_MEMORY;
  339. i2c_objs[i].dma.handle_rx.Init.PeriphInc = DMA_PINC_DISABLE;
  340. i2c_objs[i].dma.handle_rx.Init.MemInc = DMA_MINC_ENABLE;
  341. i2c_objs[i].dma.handle_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
  342. i2c_objs[i].dma.handle_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
  343. i2c_objs[i].dma.handle_rx.Init.Mode = DMA_NORMAL;
  344. i2c_objs[i].dma.handle_rx.Init.Priority = DMA_PRIORITY_LOW;
  345. #endif /* SOC_SERIES_STM32U5 */
  346. #if defined(SOC_SERIES_STM32F2) || defined(SOC_SERIES_STM32F4) || defined(SOC_SERIES_STM32F7) || defined(SOC_SERIES_STM32MP1) || defined(SOC_SERIES_STM32H7)
  347. i2c_objs[i].dma.handle_rx.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
  348. i2c_objs[i].dma.handle_tx.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL;
  349. i2c_objs[i].dma.handle_tx.Init.MemBurst = DMA_MBURST_INC4;
  350. i2c_objs[i].dma.handle_tx.Init.PeriphBurst = DMA_PBURST_INC4;
  351. }
  352. #endif /* defined(SOC_SERIES_STM32F2) || defined(SOC_SERIES_STM32F4) || defined(SOC_SERIES_STM32F7) || defined(SOC_SERIES_STM32MP1) || defined(SOC_SERIES_STM32H7) */
  353. {
  354. rt_uint32_t tmpreg = 0x00U;
  355. #if defined(SOC_SERIES_STM32F1) || defined(SOC_SERIES_STM32G0) || defined(SOC_SERIES_STM32F0)
  356. /* enable DMA clock && Delay after an RCC peripheral clock enabling*/
  357. SET_BIT(RCC->AHBENR, i2c_config[i].dma_tx->dma_rcc);
  358. tmpreg = READ_BIT(RCC->AHBENR, i2c_config[i].dma_tx->dma_rcc);
  359. #elif defined(SOC_SERIES_STM32F2) || defined(SOC_SERIES_STM32F4) || defined(SOC_SERIES_STM32F7) || defined(SOC_SERIES_STM32L4) || defined(SOC_SERIES_STM32WB) || defined(SOC_SERIES_STM32H7)
  360. SET_BIT(RCC->AHB1ENR, i2c_config[i].dma_tx->dma_rcc);
  361. /* Delay after an RCC peripheral clock enabling */
  362. tmpreg = READ_BIT(RCC->AHB1ENR, i2c_config[i].dma_tx->dma_rcc);
  363. #elif defined(SOC_SERIES_STM32MP1)
  364. __HAL_RCC_DMAMUX_CLK_ENABLE();
  365. SET_BIT(RCC->MP_AHB2ENSETR, i2c_config[i].dma_tx->dma_rcc);
  366. tmpreg = READ_BIT(RCC->MP_AHB2ENSETR, i2c_config[i].dma_tx->dma_rcc);
  367. #endif /* defined(SOC_SERIES_STM32F1) || defined(SOC_SERIES_STM32G0) || defined(SOC_SERIES_STM32F0) */
  368. UNUSED(tmpreg); /* To avoid compiler warnings */
  369. }
  370. rt_completion_init(&i2c_objs[i].completion);
  371. stm32_i2c_configure(&i2c_objs[i].i2c_bus);
  372. ret = rt_i2c_bus_device_register(&i2c_objs[i].i2c_bus, i2c_objs[i].config->name);
  373. RT_ASSERT(ret == RT_EOK);
  374. LOG_D("%s bus init done", i2c_config[i].name);
  375. }
  376. return ret;
  377. }
  378. static void stm32_get_dma_info(void)
  379. {
  380. #ifdef BSP_I2C1_RX_USING_DMA
  381. i2c_objs[I2C1_INDEX].i2c_dma_flag |= I2C_USING_RX_DMA_FLAG;
  382. static struct dma_config I2C1_dma_rx = I2C1_RX_DMA_CONFIG;
  383. i2c_config[I2C1_INDEX].dma_rx = &I2C1_dma_rx;
  384. #endif /* BSP_I2C1_RX_USING_DMA */
  385. #ifdef BSP_I2C1_TX_USING_DMA
  386. i2c_objs[I2C1_INDEX].i2c_dma_flag |= I2C_USING_TX_DMA_FLAG;
  387. static struct dma_config I2C1_dma_tx = I2C1_TX_DMA_CONFIG;
  388. i2c_config[I2C1_INDEX].dma_tx = &I2C1_dma_tx;
  389. #endif /* BSP_I2C1_TX_USING_DMA */
  390. #ifdef BSP_I2C2_RX_USING_DMA
  391. i2c_objs[I2C2_INDEX].i2c_dma_flag |= I2C_USING_RX_DMA_FLAG;
  392. static struct dma_config I2C2_dma_rx = I2C2_RX_DMA_CONFIG;
  393. i2c_config[I2C2_INDEX].dma_rx = &I2C2_dma_rx;
  394. #endif /* BSP_I2C2_RX_USING_DMA */
  395. #ifdef BSP_I2C2_TX_USING_DMA
  396. i2c_objs[I2C2_INDEX].i2c_dma_flag |= I2C_USING_TX_DMA_FLAG;
  397. static struct dma_config I2C2_dma_tx = I2C2_TX_DMA_CONFIG;
  398. i2c_config[I2C2_INDEX].dma_tx = &I2C2_dma_tx;
  399. #endif /* BSP_I2C2_TX_USING_DMA */
  400. #ifdef BSP_I2C3_RX_USING_DMA
  401. i2c_objs[I2C3_INDEX].i2c_dma_flag |= I2C_USING_RX_DMA_FLAG;
  402. static struct dma_config I2C3_dma_rx = I2C3_RX_DMA_CONFIG;
  403. i2c_config[I2C3_INDEX].dma_rx = &I2C3_dma_rx;
  404. #endif /* BSP_I2C3_RX_USING_DMA */
  405. #ifdef BSP_I2C3_TX_USING_DMA
  406. i2c_objs[I2C3_INDEX].i2c_dma_flag |= I2C_USING_TX_DMA_FLAG;
  407. static struct dma_config I2C3_dma_tx = I2C3_TX_DMA_CONFIG;
  408. i2c_config[I2C3_INDEX].dma_tx = &I2C3_dma_tx;
  409. #endif /* BSP_I2C3_TX_USING_DMA */
  410. }
  411. void HAL_I2C_MasterTxCpltCallback(I2C_HandleTypeDef *hi2c)
  412. {
  413. struct stm32_i2c *i2c_drv = rt_container_of(hi2c, struct stm32_i2c, handle);
  414. rt_completion_done(&i2c_drv->completion);
  415. }
  416. void HAL_I2C_MasterRxCpltCallback(I2C_HandleTypeDef *hi2c)
  417. {
  418. struct stm32_i2c *i2c_drv = rt_container_of(hi2c, struct stm32_i2c, handle);
  419. rt_completion_done(&i2c_drv->completion);
  420. }
  421. void HAL_I2C_ErrorCallback(I2C_HandleTypeDef *hi2c)
  422. {
  423. /* Send stop signal to prevent bus lock-up */
  424. if (hi2c->ErrorCode == HAL_I2C_ERROR_AF)
  425. {
  426. LOG_D("I2C NACK Error now stoped");
  427. hi2c->Instance->CR1 |= I2C_IT_STOPI;
  428. }
  429. if (hi2c->ErrorCode == HAL_I2C_ERROR_BERR)
  430. {
  431. LOG_D("I2C BUS Error now stoped");
  432. hi2c->Instance->CR1 |= I2C_IT_STOPI;
  433. }
  434. }
  435. #ifdef BSP_USING_HARD_I2C1
  436. /**
  437. * @brief This function handles I2C2 event interrupt.
  438. */
  439. void I2C1_EV_IRQHandler(void)
  440. {
  441. /* USER CODE BEGIN I2C2_EV_IRQn 0 */
  442. /* enter interrupt */
  443. rt_interrupt_enter();
  444. /* USER CODE END I2C2_EV_IRQn 0 */
  445. HAL_I2C_EV_IRQHandler(&i2c_objs[I2C1_INDEX].handle);
  446. /* USER CODE BEGIN I2C2_EV_IRQn 1 */
  447. /* leave interrupt */
  448. rt_interrupt_leave();
  449. /* USER CODE END I2C2_EV_IRQn 1 */
  450. }
  451. /**
  452. * @brief This function handles I2C2 error interrupt.
  453. */
  454. void I2C1_ER_IRQHandler(void)
  455. {
  456. /* USER CODE BEGIN I2C2_ER_IRQn 0 */
  457. /* enter interrupt */
  458. rt_interrupt_enter();
  459. /* USER CODE END I2C2_ER_IRQn 0 */
  460. HAL_I2C_ER_IRQHandler(&i2c_objs[I2C1_INDEX].handle);
  461. /* USER CODE BEGIN I2C2_ER_IRQn 1 */
  462. /* leave interrupt */
  463. rt_interrupt_leave();
  464. /* USER CODE END I2C2_ER_IRQn 1 */
  465. }
  466. #endif /* BSP_USING_HARD_I2C1 */
  467. #ifdef BSP_USING_HARD_I2C2
  468. /**
  469. * @brief This function handles I2C2 event interrupt.
  470. */
  471. void I2C2_EV_IRQHandler(void)
  472. {
  473. /* USER CODE BEGIN I2C2_EV_IRQn 0 */
  474. /* enter interrupt */
  475. rt_interrupt_enter();
  476. /* USER CODE END I2C2_EV_IRQn 0 */
  477. HAL_I2C_EV_IRQHandler(&i2c_objs[I2C2_INDEX].handle);
  478. /* USER CODE BEGIN I2C2_EV_IRQn 1 */
  479. /* leave interrupt */
  480. rt_interrupt_leave();
  481. /* USER CODE END I2C2_EV_IRQn 1 */
  482. }
  483. /**
  484. * @brief This function handles I2C2 error interrupt.
  485. */
  486. void I2C2_ER_IRQHandler(void)
  487. {
  488. /* USER CODE BEGIN I2C2_ER_IRQn 0 */
  489. /* enter interrupt */
  490. rt_interrupt_enter();
  491. /* USER CODE END I2C2_ER_IRQn 0 */
  492. HAL_I2C_ER_IRQHandler(&i2c_objs[I2C2_INDEX].handle);
  493. /* USER CODE BEGIN I2C2_ER_IRQn 1 */
  494. /* leave interrupt */
  495. rt_interrupt_leave();
  496. /* USER CODE END I2C2_ER_IRQn 1 */
  497. }
  498. #endif /* BSP_USING_HARD_I2C2 */
  499. #ifdef BSP_USING_HARD_I2C3
  500. /**
  501. * @brief This function handles I2C2 event interrupt.
  502. */
  503. void I2C3_EV_IRQHandler(void)
  504. {
  505. /* USER CODE BEGIN I2C2_EV_IRQn 0 */
  506. /* enter interrupt */
  507. rt_interrupt_enter();
  508. /* USER CODE END I2C2_EV_IRQn 0 */
  509. HAL_I2C_EV_IRQHandler(&i2c_objs[I2C3_INDEX].handle);
  510. /* USER CODE BEGIN I2C2_EV_IRQn 1 */
  511. /* leave interrupt */
  512. rt_interrupt_leave();
  513. /* USER CODE END I2C2_EV_IRQn 1 */
  514. }
  515. /**
  516. * @brief This function handles I2C2 error interrupt.
  517. */
  518. void I2C3_ER_IRQHandler(void)
  519. {
  520. /* USER CODE BEGIN I2C2_ER_IRQn 0 */
  521. /* enter interrupt */
  522. rt_interrupt_enter();
  523. /* USER CODE END I2C2_ER_IRQn 0 */
  524. HAL_I2C_ER_IRQHandler(&i2c_objs[I2C3_INDEX].handle);
  525. /* USER CODE BEGIN I2C2_ER_IRQn 1 */
  526. /* leave interrupt */
  527. rt_interrupt_leave();
  528. /* USER CODE END I2C2_ER_IRQn 1 */
  529. }
  530. #endif /* BSP_USING_HARD_I2C3 */
  531. #if defined(BSP_USING_HARD_I2C1) && defined(BSP_I2C1_RX_USING_DMA)
  532. /**
  533. * @brief This function handles DMA Rx interrupt request.
  534. * @param None
  535. * @retval None
  536. */
  537. void I2C1_DMA_RX_IRQHandler(void)
  538. {
  539. /* enter interrupt */
  540. rt_interrupt_enter();
  541. HAL_DMA_IRQHandler(&i2c_objs[I2C1_INDEX].dma.handle_rx);
  542. /* leave interrupt */
  543. rt_interrupt_leave();
  544. }
  545. #endif /* defined(BSP_USING_HARD_I2C1) && defined(BSP_I2C1_RX_USING_DMA) */
  546. #if defined(BSP_USING_HARD_I2C1) && defined(BSP_I2C1_TX_USING_DMA)
  547. /**
  548. * @brief This function handles DMA Rx interrupt request.
  549. * @param None
  550. * @retval None
  551. */
  552. void I2C1_DMA_TX_IRQHandler(void)
  553. {
  554. /* enter interrupt */
  555. rt_interrupt_enter();
  556. HAL_DMA_IRQHandler(&i2c_objs[I2C1_INDEX].dma.handle_tx);
  557. /* leave interrupt */
  558. rt_interrupt_leave();
  559. }
  560. #endif /* defined(BSP_USING_HARD_I2C1) && defined(BSP_I2C1_TX_USING_DMA) */
  561. #if defined(BSP_USING_HARD_I2C2) && defined(BSP_I2C2_RX_USING_DMA)
  562. /**
  563. * @brief This function handles DMA Rx interrupt request.
  564. * @param None
  565. * @retval None
  566. */
  567. void I2C2_DMA_RX_IRQHandler(void)
  568. {
  569. /* enter interrupt */
  570. rt_interrupt_enter();
  571. HAL_DMA_IRQHandler(&i2c_objs[I2C2_INDEX].dma.handle_rx);
  572. /* leave interrupt */
  573. rt_interrupt_leave();
  574. }
  575. #endif /* defined(BSP_USING_HARD_I2C2) && defined(BSP_I2C2_RX_USING_DMA) */
  576. #if defined(BSP_USING_HARD_I2C2) && defined(BSP_I2C2_TX_USING_DMA)
  577. /**
  578. * @brief This function handles DMA Rx interrupt request.
  579. * @param None
  580. * @retval None
  581. */
  582. void I2C2_DMA_TX_IRQHandler(void)
  583. {
  584. /* enter interrupt */
  585. rt_interrupt_enter();
  586. HAL_DMA_IRQHandler(&i2c_objs[I2C2_INDEX].dma.handle_tx);
  587. /* leave interrupt */
  588. rt_interrupt_leave();
  589. }
  590. #endif /* defined(BSP_USING_HARD_I2C2) && defined(BSP_I2C2_TX_USING_DMA) */
  591. #if defined(BSP_USING_HARD_I2C3) && defined(BSP_I2C3_RX_USING_DMA)
  592. /**
  593. * @brief This function handles DMA Rx interrupt request.
  594. * @param None
  595. * @retval None
  596. */
  597. void I2C3_DMA_RX_IRQHandler(void)
  598. {
  599. /* enter interrupt */
  600. rt_interrupt_enter();
  601. HAL_DMA_IRQHandler(&i2c_objs[I2C3_INDEX].dma.handle_rx);
  602. /* leave interrupt */
  603. rt_interrupt_leave();
  604. }
  605. #endif /* defined(BSP_USING_HARD_I2C3) && defined(BSP_I2C3_RX_USING_DMA) */
  606. #if defined(BSP_USING_HARD_I2C3) && defined(BSP_I2C3_TX_USING_DMA)
  607. /**
  608. * @brief This function handles DMA Rx interrupt request.
  609. * @param None
  610. * @retval None
  611. */
  612. void I2C3_DMA_TX_IRQHandler(void)
  613. {
  614. /* enter interrupt */
  615. rt_interrupt_enter();
  616. HAL_DMA_IRQHandler(&i2c_objs[I2C3_INDEX].dma.handle_tx);
  617. /* leave interrupt */
  618. rt_interrupt_leave();
  619. }
  620. #endif /* defined(BSP_USING_HARD_I2C3) && defined(BSP_I2C3_TX_USING_DMA) */
  621. #if defined(BSP_USING_I2C4) && defined(BSP_I2C4_RX_USING_DMA)
  622. /**
  623. * @brief This function handles DMA Rx interrupt request.
  624. * @param None
  625. * @retval None
  626. */
  627. void I2C4_DMA_RX_IRQHandler(void)
  628. {
  629. /* enter interrupt */
  630. rt_interrupt_enter();
  631. HAL_DMA_IRQHandler(&i2c_objs[I2C4_INDEX].dma.handle_rx);
  632. /* leave interrupt */
  633. rt_interrupt_leave();
  634. }
  635. #endif /* defined(BSP_USING_I2C4) && defined(BSP_I2C4_RX_USING_DMA) */
  636. #if defined(BSP_USING_I2C4) && defined(BSP_I2C4_TX_USING_DMA)
  637. /**
  638. * @brief This function handles DMA Rx interrupt request.
  639. * @param None
  640. * @retval None
  641. */
  642. void I2C4_DMA_TX_IRQHandler(void)
  643. {
  644. /* enter interrupt */
  645. rt_interrupt_enter();
  646. HAL_DMA_IRQHandler(&i2c_objs[I2C4_INDEX].dma.handle_tx);
  647. /* leave interrupt */
  648. rt_interrupt_leave();
  649. }
  650. #endif /* defined(BSP_USING_I2C4) && defined(BSP_I2C4_TX_USING_DMA) */
  651. int rt_hw_hw_i2c_init(void)
  652. {
  653. stm32_get_dma_info();
  654. return RT_hw_i2c_bus_init();
  655. }
  656. INIT_CORE_EXPORT(rt_hw_hw_i2c_init);
  657. #endif /* defined(BSP_USING_HARD_I2C1) || defined(BSP_USING_HARD_I2C2) || defined(BSP_USING_HARD_I2C3) */