drv_uart.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444
  1. /*
  2. * Copyright (C) 2018 Shanghai Eastsoft Microelectronics Co., Ltd.
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2019-07-12 wangyq the first version
  9. */
  10. #include <rthw.h>
  11. #include <rtthread.h>
  12. #include <rtdevice.h>
  13. #include "board.h"
  14. #include "drv_uart.h"
  15. #include <lib_gpio.h>
  16. #include <lib_uart.h>
  17. #ifdef RT_USING_SERIAL
  18. /* es8p uart driver */
  19. struct es8p_uart
  20. {
  21. UART_TypeDef *huart;
  22. IRQn_Type irq;
  23. };
  24. static rt_err_t es8px_configure(struct rt_serial_device *serial, struct serial_configure *cfg)
  25. {
  26. GPIO_InitStruType gpio_initstruct;
  27. UART_InitStruType uart_initstruct;
  28. struct es8p_uart *uart;
  29. RT_ASSERT(serial != RT_NULL);
  30. RT_ASSERT(cfg != RT_NULL);
  31. uart = (struct es8p_uart *)serial->parent.user_data;
  32. gpio_initstruct.GPIO_Signal = GPIO_Pin_Signal_Digital;
  33. gpio_initstruct.GPIO_OD = GPIO_ODE_Output_Disable;
  34. gpio_initstruct.GPIO_PUEN = GPIO_PUE_Input_Enable;
  35. gpio_initstruct.GPIO_PDEN = GPIO_PDE_Input_Disable;
  36. gpio_initstruct.GPIO_DS = GPIO_DS_Output_Normal;
  37. #ifdef BSP_USING_UART0
  38. gpio_initstruct.GPIO_Func = GPIO_Func_2;
  39. /* Initialize rx pin */
  40. gpio_initstruct.GPIO_Direction = GPIO_Dir_In;
  41. GPIO_Init(GPIOB, GPIO_Pin_0, &gpio_initstruct);
  42. /* Initialize tx pin ,the same as rx pin except mode */
  43. gpio_initstruct.GPIO_Direction = GPIO_Dir_Out;
  44. GPIO_Init(GPIOB, GPIO_Pin_1, &gpio_initstruct);
  45. #endif
  46. #ifdef BSP_USING_UART1
  47. gpio_initstruct.GPIO_Func = GPIO_Func_1;
  48. /* Initialize rx pin */
  49. gpio_initstruct.GPIO_Direction = GPIO_Dir_In;
  50. GPIO_Init(GPIOA, GPIO_Pin_18, &gpio_initstruct);
  51. /* Initialize tx pin ,the same as rx pin except mode */
  52. gpio_initstruct.GPIO_Direction = GPIO_Dir_Out;
  53. GPIO_Init(GPIOA, GPIO_Pin_17, &gpio_initstruct);
  54. #endif
  55. #ifdef BSP_USING_UART2
  56. gpio_initstruct.GPIO_Func = GPIO_Func_2;
  57. /* Initialize rx pin */
  58. gpio_initstruct.GPIO_Direction = GPIO_Dir_In;
  59. GPIO_Init(GPIOA, GPIO_Pin_4, &gpio_initstruct);
  60. /* Initialize tx pin ,the same as rx pin except mode */
  61. gpio_initstruct.GPIO_Direction = GPIO_Dir_Out;
  62. GPIO_Init(GPIOA, GPIO_Pin_5, &gpio_initstruct);
  63. #endif
  64. #ifdef BSP_USING_UART3
  65. gpio_initstruct.GPIO_Func = GPIO_Func_2;
  66. /* Initialize rx pin */
  67. gpio_initstruct.GPIO_Direction = GPIO_Dir_In;
  68. GPIO_Init(GPIOA, GPIO_Pin_30, &gpio_initstruct);
  69. /* Initialize tx pin ,the same as rx pin except mode */
  70. gpio_initstruct.GPIO_Direction = GPIO_Dir_Out;
  71. GPIO_Init(GPIOA, GPIO_Pin_29, &gpio_initstruct);
  72. #endif
  73. #ifdef BSP_USING_UART4
  74. gpio_initstruct.GPIO_Func = GPIO_Func_1;
  75. /* Initialize rx pin */
  76. gpio_initstruct.GPIO_Direction = GPIO_Dir_In;
  77. GPIO_Init(GPIOB, GPIO_Pin_10, &gpio_initstruct);
  78. /* Initialize tx pin ,the same as rx pin except mode */
  79. gpio_initstruct.GPIO_Direction = GPIO_Dir_Out;
  80. GPIO_Init(GPIOB, GPIO_Pin_11, &gpio_initstruct);
  81. #endif
  82. #ifdef BSP_USING_UART5
  83. gpio_initstruct.GPIO_Func = GPIO_Func_1;
  84. /* Initialize rx pin */
  85. gpio_initstruct.GPIO_Direction = GPIO_Dir_In;
  86. GPIO_Init(GPIOB, GPIO_Pin_12, &gpio_initstruct);
  87. /* Initialize tx pin ,the same as rx pin except mode */
  88. gpio_initstruct.GPIO_Direction = GPIO_Dir_Out;
  89. GPIO_Init(GPIOB, GPIO_Pin_13, &gpio_initstruct);
  90. #endif
  91. uart_initstruct.UART_ClockSet = UART_Clock_1;
  92. uart_initstruct.UART_BaudRate = cfg->baud_rate;
  93. uart_initstruct.UART_RxPolar = UART_Polar_Normal;
  94. uart_initstruct.UART_TxPolar = UART_Polar_Normal;
  95. if (cfg->data_bits == DATA_BITS_7)
  96. {
  97. uart_initstruct.UART_RxMode = UART_DataMode_7;
  98. uart_initstruct.UART_TxMode = UART_DataMode_7;
  99. if (cfg->parity == PARITY_EVEN)
  100. {
  101. uart_initstruct.UART_RxMode = UART_DataMode_7Even;
  102. uart_initstruct.UART_TxMode = UART_DataMode_7Even;
  103. }
  104. else if (cfg->parity == PARITY_ODD)
  105. {
  106. uart_initstruct.UART_RxMode = UART_DataMode_7Odd;
  107. uart_initstruct.UART_TxMode = UART_DataMode_7Odd;
  108. }
  109. }
  110. else if (cfg->data_bits == DATA_BITS_8)
  111. {
  112. uart_initstruct.UART_RxMode = UART_DataMode_8;
  113. uart_initstruct.UART_TxMode = UART_DataMode_8;
  114. if (cfg->parity == PARITY_EVEN)
  115. {
  116. uart_initstruct.UART_RxMode = UART_DataMode_8Even;
  117. uart_initstruct.UART_TxMode = UART_DataMode_8Even;
  118. }
  119. else if (cfg->parity == PARITY_ODD)
  120. {
  121. uart_initstruct.UART_RxMode = UART_DataMode_8Odd;
  122. uart_initstruct.UART_TxMode = UART_DataMode_8Odd;
  123. }
  124. }
  125. else if (cfg->data_bits == DATA_BITS_9)
  126. {
  127. uart_initstruct.UART_RxMode = UART_DataMode_9;
  128. uart_initstruct.UART_TxMode = UART_DataMode_9;
  129. }
  130. if (cfg->bit_order == BIT_ORDER_MSB)
  131. {
  132. return RT_EINVAL;
  133. }
  134. if (cfg->invert == NRZ_INVERTED)
  135. {
  136. uart_initstruct.UART_RxPolar = UART_Polar_Opposite;
  137. uart_initstruct.UART_TxPolar = UART_Polar_Opposite;
  138. }
  139. /* config uart function */
  140. UART_Init(uart->huart, &uart_initstruct);
  141. /* enable rx and tx */
  142. uart->huart->CON.RXEN = 1;
  143. uart->huart->CON.TXEN = 1;
  144. NVIC_SetPriority(uart->irq, 1);
  145. return RT_EOK;
  146. }
  147. static rt_err_t es8px_control(struct rt_serial_device *serial, int cmd, void *arg)
  148. {
  149. struct es8p_uart *uart;
  150. RT_ASSERT(serial != RT_NULL);
  151. uart = (struct es8p_uart *)serial->parent.user_data;
  152. switch (cmd)
  153. {
  154. case RT_DEVICE_CTRL_CLR_INT:
  155. /* disable rx irq */
  156. NVIC_DisableIRQ(uart->irq);
  157. /* disable interrupt */
  158. UART_ITConfig(uart->huart, UART_IT_RB, DISABLE);
  159. break;
  160. case RT_DEVICE_CTRL_SET_INT:
  161. /* enable rx irq */
  162. NVIC_EnableIRQ(uart->irq);
  163. /* enable interrupt */
  164. UART_ITConfig(uart->huart, UART_IT_RB, ENABLE);
  165. break;
  166. }
  167. return RT_EOK;
  168. }
  169. static int es8px_putc(struct rt_serial_device *serial, char c)
  170. {
  171. struct es8p_uart *uart;
  172. RT_ASSERT(serial != RT_NULL);
  173. uart = (struct es8p_uart *)serial->parent.user_data;
  174. while (UART_GetFlagStatus(uart->huart, UART_FLAG_TB) == RESET) ;
  175. UART_SendByte(uart->huart, c);
  176. return 1;
  177. }
  178. static int es8px_getc(struct rt_serial_device *serial)
  179. {
  180. int ch = -1;
  181. struct es8p_uart *uart;
  182. RT_ASSERT(serial != RT_NULL);
  183. uart = (struct es8p_uart *)serial->parent.user_data;
  184. if (UART_GetFlagStatus(uart->huart, UART_FLAG_RB))
  185. {
  186. ch = UART_RecByte(uart->huart);
  187. }
  188. return ch;
  189. }
  190. static const struct rt_uart_ops es8px_uart_ops =
  191. {
  192. es8px_configure,
  193. es8px_control,
  194. es8px_putc,
  195. es8px_getc,
  196. };
  197. #ifdef BSP_USING_UART0
  198. /* UART0 device driver structure */
  199. struct es8p_uart uart0 =
  200. {
  201. UART0,
  202. UART0_IRQn
  203. };
  204. struct rt_serial_device serial0;
  205. void UART0_IRQHandler(void)
  206. {
  207. /* enter interrupt */
  208. rt_interrupt_enter();
  209. if (UART0->IF.RBIF)
  210. {
  211. rt_hw_serial_isr(&serial0, RT_SERIAL_EVENT_RX_IND);
  212. }
  213. /* leave interrupt */
  214. rt_interrupt_leave();
  215. }
  216. #endif /* BSP_USING_UART0 */
  217. #ifdef BSP_USING_UART1
  218. /* UART1 device driver structure */
  219. struct es8p_uart uart1 =
  220. {
  221. UART1,
  222. UART1_IRQn
  223. };
  224. struct rt_serial_device serial1;
  225. void UART1_IRQHandler(void)
  226. {
  227. /* enter interrupt */
  228. rt_interrupt_enter();
  229. if (UART1->IF.RBIF)
  230. {
  231. rt_hw_serial_isr(&serial1, RT_SERIAL_EVENT_RX_IND);
  232. }
  233. /* leave interrupt */
  234. rt_interrupt_leave();
  235. }
  236. #endif /* BSP_USING_UART1 */
  237. #ifdef BSP_USING_UART2
  238. /* UART1 device driver structure */
  239. struct es8p_uart uart2 =
  240. {
  241. UART2,
  242. UART2_IRQn
  243. };
  244. struct rt_serial_device serial2;
  245. void UART2_IRQHandler(void)
  246. {
  247. /* enter interrupt */
  248. rt_interrupt_enter();
  249. if (UART2->IF.RBIF)
  250. {
  251. rt_hw_serial_isr(&serial2, RT_SERIAL_EVENT_RX_IND);
  252. }
  253. /* leave interrupt */
  254. rt_interrupt_leave();
  255. }
  256. #endif /* BSP_USING_UART2 */
  257. #ifdef BSP_USING_UART3
  258. /* UART3 device driver structure */
  259. struct es8p_uart uart3 =
  260. {
  261. UART3,
  262. UART3_IRQn
  263. };
  264. struct rt_serial_device serial3;
  265. void UART3_IRQHandler(void)
  266. {
  267. /* enter interrupt */
  268. rt_interrupt_enter();
  269. if (UART3->IF.RBIF)
  270. {
  271. rt_hw_serial_isr(&serial3, RT_SERIAL_EVENT_RX_IND);
  272. }
  273. /* leave interrupt */
  274. rt_interrupt_leave();
  275. }
  276. #endif /* BSP_USING_UART3 */
  277. #ifdef BSP_USING_UART4
  278. /* UART4 device driver structure */
  279. struct es8p_uart uart4 =
  280. {
  281. UART4,
  282. UART4_IRQn
  283. };
  284. struct rt_serial_device serial4;
  285. void UART4_IRQHandler(void)
  286. {
  287. /* enter interrupt */
  288. rt_interrupt_enter();
  289. if (UART4->IF.RBIF)
  290. {
  291. rt_hw_serial_isr(&serial4, RT_SERIAL_EVENT_RX_IND);
  292. }
  293. /* leave interrupt */
  294. rt_interrupt_leave();
  295. }
  296. #endif /* BSP_USING_UART4 */
  297. #ifdef BSP_USING_UART5
  298. /* UART5 device driver structure */
  299. struct es8p_uart uart5 =
  300. {
  301. UART5,
  302. UART5_IRQn
  303. };
  304. struct rt_serial_device serial5;
  305. void UART5_IRQHandler(void)
  306. {
  307. /* enter interrupt */
  308. rt_interrupt_enter();
  309. if (UART5->IF.RBIF)
  310. {
  311. rt_hw_serial_isr(&serial5, RT_SERIAL_EVENT_RX_IND);
  312. }
  313. /* leave interrupt */
  314. rt_interrupt_leave();
  315. }
  316. #endif /* BSP_USING_UART5 */
  317. int rt_hw_uart_init(void)
  318. {
  319. struct es8p_uart *uart;
  320. struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT;
  321. #ifdef BSP_USING_UART0
  322. uart = &uart0;
  323. serial0.ops = &es8px_uart_ops;
  324. serial0.config = config;
  325. /* register UART0 device */
  326. rt_hw_serial_register(&serial0, "uart0",
  327. RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX, uart);
  328. #endif /* BSP_USING_UART0 */
  329. #ifdef BSP_USING_UART1
  330. uart = &uart1;
  331. serial1.ops = &es8px_uart_ops;
  332. serial1.config = config;
  333. /* register UART1 device */
  334. rt_hw_serial_register(&serial1, "uart1",
  335. RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX, uart);
  336. #endif /* BSP_USING_UART1 */
  337. #ifdef BSP_USING_UART2
  338. uart = &uart2;
  339. serial2.ops = &es8px_uart_ops;
  340. serial2.config = config;
  341. /* register UART2 device */
  342. rt_hw_serial_register(&serial2, "uart2",
  343. RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX, uart);
  344. #endif /* BSP_USING_UART2 */
  345. #ifdef BSP_USING_UART3
  346. uart = &uart3;
  347. serial3.ops = &es8px_uart_ops;
  348. serial3.config = config;
  349. /* register UART3 device */
  350. rt_hw_serial_register(&serial3, "uart3",
  351. RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX, uart);
  352. #endif /* BSP_USING_UART3 */
  353. #ifdef BSP_USING_UART4
  354. uart = &uart4;
  355. serial4.ops = &es8px_uart_ops;
  356. serial4.config = config;
  357. /* register UART4 device */
  358. rt_hw_serial_register(&serial4, "uart4",
  359. RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX, uart);
  360. #endif /* BSP_USING_UART4 */
  361. #ifdef BSP_USING_UART5
  362. uart = &uart5;
  363. serial5.ops = &es8px_uart_ops;
  364. serial5.config = config;
  365. /* register UART5 device */
  366. rt_hw_serial_register(&serial5, "uart5",
  367. RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX, uart);
  368. #endif /* BSP_USING_UART5 */
  369. return 0;
  370. }
  371. INIT_BOARD_EXPORT(rt_hw_uart_init);
  372. #endif