drv_uart.c 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. /*
  2. * Copyright (c) 2006-2020, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2020-08-06 whik first version
  9. */
  10. #include <rthw.h>
  11. #include <rtthread.h>
  12. #include <rtdevice.h>
  13. #include "drv_uart.h"
  14. struct sf2_uart
  15. {
  16. mss_uart_instance_t *uart;
  17. IRQn_Type irq;
  18. };
  19. struct sf2_uart uart0=
  20. {
  21. &g_mss_uart0,
  22. UART0_IRQn,
  23. };
  24. struct rt_serial_device serial0;
  25. void uart0_rx_handler(mss_uart_instance_t *this_uart)
  26. {
  27. /* enter interrupt */
  28. rt_interrupt_enter();
  29. rt_hw_serial_isr(&serial0, RT_SERIAL_EVENT_RX_IND);
  30. /* leave interrupt */
  31. rt_interrupt_leave();
  32. }
  33. struct sf2_uart uart1=
  34. {
  35. &g_mss_uart1,
  36. UART1_IRQn,
  37. };
  38. struct rt_serial_device serial1;
  39. void uart1_rx_handler(mss_uart_instance_t *this_uart)
  40. {
  41. /* enter interrupt */
  42. rt_interrupt_enter();
  43. rt_hw_serial_isr(&serial1, RT_SERIAL_EVENT_RX_IND);
  44. /* leave interrupt */
  45. rt_interrupt_leave();
  46. }
  47. static rt_err_t sf2_uart_configure(struct rt_serial_device *serial,
  48. struct serial_configure *cfg)
  49. {
  50. uint32_t baudRate;
  51. uint8_t datBits, parity, stopBits;
  52. uint8_t config;
  53. struct sf2_uart *uart;
  54. RT_ASSERT(serial != RT_NULL);
  55. RT_ASSERT(cfg != RT_NULL);
  56. uart = (struct sf2_uart *)serial->parent.user_data;
  57. switch(cfg->data_bits)
  58. {
  59. case DATA_BITS_5: datBits = MSS_UART_DATA_5_BITS; break;
  60. case DATA_BITS_6: datBits = MSS_UART_DATA_6_BITS; break;
  61. case DATA_BITS_7: datBits = MSS_UART_DATA_7_BITS; break;
  62. case DATA_BITS_8: datBits = MSS_UART_DATA_8_BITS; break;
  63. default: datBits = MSS_UART_DATA_8_BITS; break;
  64. }
  65. switch(cfg->parity)
  66. {
  67. case PARITY_NONE: parity = MSS_UART_NO_PARITY; break;
  68. case PARITY_EVEN: parity = MSS_UART_EVEN_PARITY; break;
  69. case PARITY_ODD : parity = MSS_UART_ODD_PARITY; break;
  70. default : parity = MSS_UART_NO_PARITY; break;
  71. }
  72. switch(cfg->stop_bits)
  73. {
  74. case STOP_BITS_1: stopBits = MSS_UART_ONE_STOP_BIT; break;
  75. case STOP_BITS_2: stopBits = MSS_UART_TWO_STOP_BITS; break;
  76. case STOP_BITS_3: stopBits = MSS_UART_ONEHALF_STOP_BIT; break;
  77. default : stopBits = MSS_UART_ONE_STOP_BIT;
  78. }
  79. baudRate = cfg->baud_rate;
  80. config = datBits | parity | stopBits;
  81. MSS_UART_init(uart->uart, baudRate, config);
  82. if(uart->uart == &g_mss_uart0)
  83. MSS_UART_set_rx_handler(uart->uart, uart0_rx_handler, MSS_UART_FIFO_SINGLE_BYTE);
  84. else
  85. MSS_UART_set_rx_handler(uart->uart, uart1_rx_handler, MSS_UART_FIFO_SINGLE_BYTE);
  86. return RT_EOK;
  87. }
  88. static rt_err_t sf2_uart_control(struct rt_serial_device *serial,
  89. int cmd, void *arg)
  90. {
  91. struct sf2_uart* uart;
  92. RT_ASSERT(serial != RT_NULL);
  93. uart = (struct sf2_uart*)serial->parent.user_data;
  94. switch (cmd)
  95. {
  96. case RT_DEVICE_CTRL_CLR_INT:
  97. NVIC_DisableIRQ(uart->irq);
  98. break;
  99. case RT_DEVICE_CTRL_SET_INT:
  100. NVIC_EnableIRQ(uart->irq);
  101. break;
  102. }
  103. return RT_EOK;
  104. }
  105. static int sf2_uart_putc(struct rt_serial_device *serial, char c)
  106. {
  107. struct sf2_uart* uart;
  108. uint32_t tx_ready;
  109. RT_ASSERT(serial != RT_NULL);
  110. uart = (struct sf2_uart*)serial->parent.user_data;
  111. do {
  112. tx_ready = uart->uart->hw_reg->LSR & 0x20u;
  113. } while(!tx_ready);
  114. uart->uart->hw_reg->THR = c;
  115. return 1;
  116. }
  117. static int sf2_uart_getc(struct rt_serial_device *serial)
  118. {
  119. int ch = -1;
  120. uint8_t err_status;
  121. struct sf2_uart* uart;
  122. RT_ASSERT(serial != RT_NULL);
  123. uart = (struct sf2_uart*)serial->parent.user_data;
  124. err_status = MSS_UART_get_rx_status(uart->uart);
  125. if(MSS_UART_NO_ERROR == err_status)
  126. MSS_UART_get_rx(uart->uart, (uint8_t *)&ch, 1);
  127. return ch;
  128. }
  129. static const struct rt_uart_ops sf2_uart_ops =
  130. {
  131. sf2_uart_configure,
  132. sf2_uart_control,
  133. sf2_uart_putc,
  134. sf2_uart_getc,
  135. };
  136. int rt_hw_uart_init(void)
  137. {
  138. rt_err_t result = RT_EOK;
  139. struct sf2_uart* uart;
  140. struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT;
  141. #ifdef BSP_USING_UART0
  142. uart = &uart0;
  143. serial0.ops = &sf2_uart_ops;
  144. /* default config: 115200, 8, no, 1 */
  145. serial0.config = config;
  146. result = rt_hw_serial_register(&serial0, "uart0", RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX, uart);
  147. RT_ASSERT(result == RT_EOK);
  148. #endif
  149. #ifdef BSP_USING_UART1
  150. uart = &uart1;
  151. serial1.ops = &sf2_uart_ops;
  152. /* default config: 115200, 8, no, 1 */
  153. serial1.config = config;
  154. result = rt_hw_serial_register(&serial1, "uart1", RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX, uart);
  155. RT_ASSERT(result == RT_EOK);
  156. #endif
  157. return result;
  158. }
  159. INIT_BOARD_EXPORT(rt_hw_uart_init);