drv_uart.c 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. /*
  2. * Copyright (c) 2006-2021, YICHIP Technology Co.,Ltd.
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2021-09-09 WSY first version
  9. */
  10. #include <rtthread.h>
  11. #include <rtdevice.h>
  12. #include <board.h>
  13. struct yc3121_uart
  14. {
  15. UART_TypeDef uart;
  16. IRQn_Type irq;
  17. };
  18. static rt_err_t yc3121_uart_configure(struct rt_serial_device *serial,
  19. struct serial_configure *cfg)
  20. {
  21. struct yc3121_uart *uart;
  22. UART_InitTypeDef UART_initStruct;
  23. RT_ASSERT(serial != RT_NULL);
  24. RT_ASSERT(cfg != RT_NULL);
  25. uart = (struct yc3121_uart *)serial->parent.user_data;
  26. NVIC_DisableIRQ(uart->irq);
  27. UART_initStruct.BaudRate = cfg->baud_rate;
  28. UART_initStruct.FlowCtrl = FlowCtrl_None ;
  29. UART_initStruct.Mode = Mode_duplex;
  30. switch (cfg->data_bits)
  31. {
  32. case DATA_BITS_9:
  33. UART_initStruct.DataBits = Databits_9b;
  34. break;
  35. default:
  36. UART_initStruct.DataBits = Databits_8b;
  37. break;
  38. }
  39. switch (cfg->stop_bits)
  40. {
  41. case STOP_BITS_2:
  42. UART_initStruct.StopBits = StopBits_2;
  43. break;
  44. default:
  45. UART_initStruct.StopBits = StopBits_1;
  46. break;
  47. }
  48. switch (cfg->parity)
  49. {
  50. case PARITY_ODD:
  51. UART_initStruct.Parity = Parity_Odd;
  52. break;
  53. case PARITY_EVEN:
  54. UART_initStruct.Parity = Parity_Even;
  55. break;
  56. default:
  57. UART_initStruct.Parity = Parity_None;
  58. break;
  59. }
  60. UART_Init(uart->uart, &UART_initStruct);
  61. return RT_EOK;
  62. }
  63. static rt_err_t yc3121_uart_control(struct rt_serial_device *serial,
  64. int cmd, void *arg)
  65. {
  66. struct yc3121_uart *uart;
  67. RT_ASSERT(serial != RT_NULL);
  68. uart = (struct yc3121_uart *)serial->parent.user_data;
  69. switch (cmd)
  70. {
  71. case RT_DEVICE_CTRL_CLR_INT:
  72. /* disable rx irq */
  73. UART_SetRxITNum(uart->uart, 0);
  74. NVIC_DisableIRQ(uart->irq);
  75. break;
  76. case RT_DEVICE_CTRL_SET_INT:
  77. /* enable rx irq */
  78. UART_SetRxITNum(uart->uart, 1);
  79. UART_ITConfig(uart->uart, UART_IT_RX, ENABLE);
  80. NVIC_EnableIRQ(uart->irq);
  81. break;
  82. }
  83. return RT_EOK;
  84. }
  85. static int yc3121_uart_putc(struct rt_serial_device *serial, char c)
  86. {
  87. struct yc3121_uart *uart;
  88. RT_ASSERT(serial != RT_NULL);
  89. uart = (struct yc3121_uart *)serial->parent.user_data;
  90. while (UART_IsUARTBusy(uart->uart));
  91. UART_SendData(uart->uart, c);
  92. return 1;
  93. }
  94. static int yc3121_uart_getc(struct rt_serial_device *serial)
  95. {
  96. int ch;
  97. struct yc3121_uart *uart;
  98. RT_ASSERT(serial != RT_NULL);
  99. uart = (struct yc3121_uart *)serial->parent.user_data;
  100. ch = -1;
  101. if (UART_ReceiveDataLen(uart->uart) != 0)
  102. {
  103. ch = UART_ReceiveData(uart->uart);
  104. }
  105. return ch;
  106. }
  107. static const struct rt_uart_ops yc3121_uart_ops =
  108. {
  109. yc3121_uart_configure,
  110. yc3121_uart_control,
  111. yc3121_uart_putc,
  112. yc3121_uart_getc,
  113. };
  114. #if defined(BSP_USING_UART0)
  115. /* UART0 device driver structure */
  116. static struct yc3121_uart uart0;
  117. static struct rt_serial_device serial0;
  118. void UART0_IRQHandler(void)
  119. {
  120. /* enter interrupt */
  121. rt_interrupt_enter();
  122. /* UART in mode Receiver */
  123. if (UART_GetITIdentity(uart0.uart) == UART_IT_RX)
  124. {
  125. rt_hw_serial_isr(&serial0, RT_SERIAL_EVENT_RX_IND);
  126. }
  127. /* leave interrupt */
  128. rt_interrupt_leave();
  129. }
  130. #endif /* BSP_USING_UART0 */
  131. #if defined(BSP_USING_UART1)
  132. /* UART1 device driver structure */
  133. static struct yc3121_uart uart1;
  134. static struct rt_serial_device serial1;
  135. void UART1_IRQHandler(void)
  136. {
  137. /* enter interrupt */
  138. rt_interrupt_enter();
  139. /* UART in mode Receiver */
  140. if (UART_GetITIdentity(uart1.uart) == UART_IT_RX)
  141. {
  142. rt_hw_serial_isr(&serial1, RT_SERIAL_EVENT_RX_IND);
  143. }
  144. /* leave interrupt */
  145. rt_interrupt_leave();
  146. }
  147. #endif /* BSP_USING_UART1 */
  148. int rt_hw_uart_init(void)
  149. {
  150. struct yc3121_uart *uart;
  151. struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT;
  152. #ifdef BSP_USING_UART0
  153. GPIO_CONFIG(1) = UART0_TXD;
  154. GPIO_CONFIG(0) = UART0_RXD;
  155. uart = &uart0;
  156. uart->uart = UART0;
  157. uart->irq = UART0_IRQn;
  158. serial0.ops = &yc3121_uart_ops;
  159. serial0.config = config;
  160. /* register UART0 device */
  161. rt_hw_serial_register(&serial0, RT_CONSOLE_DEVICE_NAME,
  162. RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX,
  163. uart);
  164. #endif /* BSP_USING_UART0 */
  165. #ifdef BSP_USING_UART1
  166. GPIO_CONFIG(1) = UART1_TXD;
  167. GPIO_CONFIG(0) = UART1_RXD;
  168. uart = &uart1;
  169. uart->uart = UART1;
  170. uart->irq = UART1_IRQn;
  171. serial1.ops = &yc3121_uart_ops;
  172. serial1.config = config;
  173. /* register UART1 device */
  174. rt_hw_serial_register(&serial1, "uart1",
  175. RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX,
  176. uart);
  177. #endif /* BSP_USING_UART1 */
  178. return 0;
  179. }