drv_uart.c 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  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-03-01 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 <ald_gpio.h>
  16. #include <ald_uart.h>
  17. #ifdef RT_USING_SERIAL
  18. /* es32 uart driver */
  19. struct es32_uart
  20. {
  21. uart_handle_t huart;
  22. IRQn_Type irq;
  23. };
  24. static rt_err_t es32f0x_configure(struct rt_serial_device *serial, struct serial_configure *cfg)
  25. {
  26. gpio_init_t gpio_init_initstructure;
  27. struct es32_uart *uart;
  28. RT_ASSERT(serial != RT_NULL);
  29. RT_ASSERT(cfg != RT_NULL);
  30. uart = (struct es32_uart *)serial->parent.user_data;
  31. /* Initialize tx pin */
  32. gpio_init_initstructure.mode = GPIO_MODE_OUTPUT;
  33. gpio_init_initstructure.odos = GPIO_PUSH_PULL;
  34. gpio_init_initstructure.pupd = GPIO_PUSH_UP;
  35. gpio_init_initstructure.odrv = GPIO_OUT_DRIVE_NORMAL;
  36. gpio_init_initstructure.flt = GPIO_FILTER_DISABLE;
  37. gpio_init_initstructure.type = GPIO_TYPE_TTL;
  38. #ifdef BSP_USING_UART0
  39. gpio_init_initstructure.func = GPIO_FUNC_3;
  40. gpio_init(GPIOB, GPIO_PIN_10, &gpio_init_initstructure);
  41. /* Initialize rx pin ,the same as txpin except mode */
  42. gpio_init_initstructure.mode = GPIO_MODE_INPUT;
  43. gpio_init(GPIOB, GPIO_PIN_11, &gpio_init_initstructure);
  44. #endif
  45. #ifdef BSP_USING_UART1
  46. /* Initialize tx pin */
  47. gpio_init_initstructure.func = GPIO_FUNC_3;
  48. gpio_init(GPIOC, GPIO_PIN_10, &gpio_init_initstructure);
  49. /* Initialize rx pin ,the same as txpin except mode*/
  50. gpio_init_initstructure.mode = GPIO_MODE_INPUT;
  51. gpio_init(GPIOC, GPIO_PIN_11, &gpio_init_initstructure);
  52. #endif
  53. uart->huart.init.mode = UART_MODE_UART;
  54. uart->huart.init.baud = cfg->baud_rate;
  55. uart->huart.init.word_length = (uart_word_length_t)(cfg->data_bits - 5);
  56. uart->huart.init.parity = (uart_parity_t)(cfg->parity == PARITY_EVEN ? UART_PARITY_EVEN : cfg->parity);
  57. uart->huart.init.fctl = UART_HW_FLOW_CTL_DISABLE;
  58. uart_init(&uart->huart);
  59. if (cfg->bit_order == BIT_ORDER_MSB)
  60. {
  61. UART_MSB_FIRST_ENABLE(&uart->huart);
  62. }
  63. else
  64. {
  65. UART_MSB_FIRST_DISABLE(&uart->huart);
  66. }
  67. if (cfg->invert == NRZ_INVERTED)
  68. {
  69. UART_DATA_INV_ENABLE(&uart->huart);
  70. }
  71. else
  72. {
  73. UART_DATA_INV_DISABLE(&uart->huart);
  74. }
  75. /* enable rx int */
  76. uart_interrupt_config(&uart->huart, UART_IT_RXRD, ENABLE);
  77. return RT_EOK;
  78. }
  79. static rt_err_t es32f0x_control(struct rt_serial_device *serial, int cmd, void *arg)
  80. {
  81. struct es32_uart *uart;
  82. RT_ASSERT(serial != RT_NULL);
  83. uart = (struct es32_uart *)serial->parent.user_data;
  84. switch (cmd)
  85. {
  86. case RT_DEVICE_CTRL_CLR_INT:
  87. /* disable rx irq */
  88. NVIC_DisableIRQ(uart->irq);
  89. /* disable interrupt */
  90. uart_interrupt_config(&uart->huart, UART_IT_RXRD, DISABLE);
  91. break;
  92. case RT_DEVICE_CTRL_SET_INT:
  93. /* enable rx irq */
  94. NVIC_EnableIRQ(uart->irq);
  95. /* enable interrupt */
  96. uart_interrupt_config(&uart->huart, UART_IT_RXRD, ENABLE);
  97. break;
  98. }
  99. return RT_EOK;
  100. }
  101. static int es32f0x_putc(struct rt_serial_device *serial, char c)
  102. {
  103. struct es32_uart *uart;
  104. RT_ASSERT(serial != RT_NULL);
  105. uart = (struct es32_uart *)serial->parent.user_data;
  106. while (!(uart->huart.perh->SR & 0x40)) ;
  107. WRITE_REG(uart->huart.perh->TBR, c);
  108. return 1;
  109. }
  110. static int es32f0x_getc(struct rt_serial_device *serial)
  111. {
  112. int ch = -1;
  113. struct es32_uart *uart;
  114. RT_ASSERT(serial != RT_NULL);
  115. uart = (struct es32_uart *)serial->parent.user_data;
  116. if (uart->huart.perh->SR & 0x01)
  117. {
  118. ch = (uint8_t)(uart->huart.perh->RBR & 0xFF);
  119. }
  120. return ch;
  121. }
  122. static const struct rt_uart_ops es32f0x_uart_ops =
  123. {
  124. es32f0x_configure,
  125. es32f0x_control,
  126. es32f0x_putc,
  127. es32f0x_getc,
  128. };
  129. #ifdef BSP_USING_UART0
  130. /* UART0 device driver structure */
  131. struct es32_uart uart0 =
  132. {
  133. {UART0},
  134. UART0_IRQn
  135. };
  136. struct rt_serial_device serial0;
  137. void UART0_Handler(void)
  138. {
  139. /* enter interrupt */
  140. rt_interrupt_enter();
  141. if (UART0->RIF & 0x01)
  142. {
  143. rt_hw_serial_isr(&serial0, RT_SERIAL_EVENT_RX_IND);
  144. }
  145. /* leave interrupt */
  146. rt_interrupt_leave();
  147. }
  148. #endif /* BSP_USING_UART0 */
  149. #ifdef BSP_USING_UART1
  150. /* UART1 device driver structure */
  151. struct es32_uart uart1 =
  152. {
  153. {UART1},
  154. UART1_IRQn
  155. };
  156. struct rt_serial_device serial1;
  157. void UART1_Handler(void)
  158. {
  159. /* enter interrupt */
  160. rt_interrupt_enter();
  161. if (UART1->RIF & 0x01)
  162. {
  163. rt_hw_serial_isr(&serial1, RT_SERIAL_EVENT_RX_IND);
  164. }
  165. /* leave interrupt */
  166. rt_interrupt_leave();
  167. }
  168. #endif /* BSP_USING_UART1 */
  169. int rt_hw_uart_init(void)
  170. {
  171. struct es32_uart *uart;
  172. struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT;
  173. #ifdef BSP_USING_UART0
  174. uart = &uart0;
  175. serial0.ops = &es32f0x_uart_ops;
  176. serial0.config = config;
  177. /* register UART0 device */
  178. rt_hw_serial_register(&serial0, "uart0",
  179. RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX,
  180. uart);
  181. #endif /* BSP_USING_UART0 */
  182. #ifdef BSP_USING_UART1
  183. uart = &uart1;
  184. serial1.ops = &es32f0x_uart_ops;
  185. serial1.config = config;
  186. /* register UART1 device */
  187. rt_hw_serial_register(&serial1, "uart1",
  188. RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX,
  189. uart);
  190. #endif /* BSP_USING_UART1 */
  191. return 0;
  192. }
  193. INIT_BOARD_EXPORT(rt_hw_uart_init);
  194. #endif