drv_uart.c 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318
  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. * 2022/12/25 flyingcys 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. struct device_uart
  16. {
  17. struct rt_serial_device serial;
  18. uint8_t port;
  19. uint8_t tx_pin;
  20. uint8_t rx_pin;
  21. };
  22. static void _uart_rx_irq(void *param)
  23. {
  24. struct device_uart *uart = (struct device_uart *)param;;
  25. struct rt_serial_device *serial = &uart->serial;
  26. rt_hw_serial_isr(serial, RT_SERIAL_EVENT_RX_IND);
  27. }
  28. static int uart_signal_get(uint8_t pin)
  29. {
  30. //TODO no magic number is allowed here
  31. if (pin >= 12 && pin <=23) {
  32. return (pin + 6) % 12;
  33. } else if (pin >= 36 && pin <=45) {
  34. return (pin + 6) % 12;
  35. }
  36. return (pin % 12);
  37. }
  38. static int uart_func_get(uint8_t id, GLB_UART_SIG_FUN_Type uartfunc)
  39. {
  40. switch (id) {
  41. case 0:
  42. return uartfunc;
  43. case 1:
  44. return (GLB_UART_SIG_FUN_UART1_RTS - GLB_UART_SIG_FUN_UART0_RTS) * 1 + uartfunc;
  45. case 2:
  46. return (GLB_UART_SIG_FUN_UART1_RTS - GLB_UART_SIG_FUN_UART0_RTS) * 1 + uartfunc;
  47. default:
  48. /*empty here*/
  49. //TODO should assert here?
  50. return uartfunc;
  51. }
  52. }
  53. static void uart_gpio_demo(uint8_t id, uint8_t tx_pin, uint8_t rx_pin, uint8_t cts_pin, uint8_t rts_pin)
  54. {
  55. GLB_GPIO_Cfg_Type gpio_cfg;
  56. uint8_t uart_func, uart_sig;
  57. //FIXME SWAP set is NOT put here
  58. GLB_UART_Sig_Swap_Set(GLB_UART_SIG_SWAP_GRP_GPIO12_GPIO23, 1);
  59. GLB_UART_Sig_Swap_Set(GLB_UART_SIG_SWAP_GRP_GPIO36_GPIO45, 1);
  60. //common GPIO cfg
  61. gpio_cfg.drive = 0;
  62. gpio_cfg.smtCtrl = 1;
  63. gpio_cfg.gpioMode = GPIO_MODE_AF;
  64. gpio_cfg.pullType = GPIO_PULL_UP;
  65. gpio_cfg.gpioFun = GPIO_FUN_UART;
  66. //cfg for UART Tx
  67. gpio_cfg.gpioPin = GLB_GPIO_PIN_0 + tx_pin;
  68. uart_func = uart_func_get(id, GLB_UART_SIG_FUN_UART0_TXD);
  69. uart_sig = uart_signal_get(gpio_cfg.gpioPin);
  70. GLB_UART_Fun_Sel((GLB_UART_SIG_Type)uart_sig, (GLB_UART_SIG_FUN_Type)uart_func);
  71. GLB_UART_Fun_Sel((GLB_UART_SIG_Type)uart_func, (GLB_UART_SIG_FUN_Type)uart_sig);
  72. GLB_GPIO_Init(&gpio_cfg);
  73. //cfg for UART Rx
  74. gpio_cfg.gpioPin = GLB_GPIO_PIN_0 + rx_pin;
  75. uart_func = uart_func_get(id, GLB_UART_SIG_FUN_UART0_RXD);
  76. uart_sig = uart_signal_get(gpio_cfg.gpioPin);
  77. GLB_UART_Fun_Sel((GLB_UART_SIG_Type)uart_sig, (GLB_UART_SIG_FUN_Type)uart_func);
  78. GLB_UART_Fun_Sel((GLB_UART_SIG_Type)uart_func, (GLB_UART_SIG_FUN_Type)uart_sig);
  79. GLB_GPIO_Init(&gpio_cfg);
  80. //Enable UART clock
  81. GLB_Set_UART_CLK(1, 0, 0);
  82. }
  83. static rt_err_t _uart_configure(struct rt_serial_device *serial, struct serial_configure *cfg)
  84. {
  85. struct device_uart *uart;
  86. uint8_t id;
  87. RT_ASSERT(serial != RT_NULL);
  88. RT_ASSERT(cfg != RT_NULL);
  89. uart = serial->parent.user_data;
  90. RT_ASSERT(uart != RT_NULL);
  91. id = uart->port;
  92. UART_CFG_Type uart_cfg = {
  93. 80*1000*1000, /*UART clock from XTAL*/
  94. 2000000, /* baudrate */
  95. UART_DATABITS_8, /* data bits */
  96. UART_STOPBITS_1, /* stop bits */
  97. UART_PARITY_NONE, /* parity */
  98. DISABLE, /* Disable auto flow control */
  99. DISABLE, /* Disable rx input de-glitch function */
  100. DISABLE, /* Disable RTS output SW control mode */
  101. DISABLE, /* Disable tx output SW control mode */
  102. DISABLE, /* Disable tx lin mode */
  103. DISABLE, /* Disable rx lin mode */
  104. 0, /* Tx break bit count for lin mode */
  105. UART_LSB_FIRST, /* UART each data byte is send out LSB-first */
  106. };
  107. UART_FifoCfg_Type fifoCfg = {
  108. 16, /* TX FIFO threshold */
  109. 16, /* RX FIFO threshold */
  110. DISABLE, /* Disable tx dma req/ack interface */
  111. DISABLE /* Disable rx dma req/ack interface */
  112. };
  113. /* init debug uart gpio first */
  114. uart_gpio_demo(id, uart->tx_pin, uart->rx_pin, 0xff, 0xff);
  115. /* disable all interrupt */
  116. UART_IntMask(id, UART_INT_ALL, MASK);
  117. /* disable uart before config */
  118. UART_Disable(id, UART_TXRX);
  119. uart_cfg.baudRate = cfg->baud_rate;
  120. switch (cfg->data_bits)
  121. {
  122. case DATA_BITS_5:
  123. uart_cfg.dataBits = UART_DATABITS_5;
  124. break;
  125. case DATA_BITS_6:
  126. uart_cfg.dataBits = UART_DATABITS_6;
  127. break;
  128. case DATA_BITS_7:
  129. uart_cfg.dataBits = UART_DATABITS_7;
  130. break;
  131. case DATA_BITS_8:
  132. uart_cfg.dataBits = UART_DATABITS_8;
  133. break;
  134. default:
  135. uart_cfg.dataBits = UART_DATABITS_8;
  136. break;
  137. }
  138. switch (cfg->stop_bits)
  139. {
  140. case STOP_BITS_1:
  141. uart_cfg.stopBits = UART_STOPBITS_1;
  142. break;
  143. case STOP_BITS_2:
  144. uart_cfg.stopBits = UART_STOPBITS_2;
  145. break;
  146. default:
  147. uart_cfg.stopBits = UART_STOPBITS_1;
  148. break;
  149. }
  150. switch (cfg->parity)
  151. {
  152. case PARITY_NONE:
  153. uart_cfg.parity = UART_PARITY_NONE;
  154. break;
  155. case PARITY_ODD:
  156. uart_cfg.parity = UART_PARITY_ODD;
  157. break;
  158. case PARITY_EVEN:
  159. uart_cfg.parity = UART_PARITY_EVEN;
  160. break;
  161. default:
  162. uart_cfg.parity = UART_PARITY_NONE;
  163. break;
  164. }
  165. /* uart init with configuration */
  166. UART_Init(id, &uart_cfg);
  167. /* UART fifo configuration */
  168. UART_FifoConfig(id, &fifoCfg);
  169. /* Enable tx free run mode */
  170. UART_TxFreeRun(id, ENABLE);
  171. /* Set rx time-out value */
  172. UART_SetRxTimeoutValue(id, UART_DEFAULT_RTO_TIMEOUT);
  173. /* enable uart */
  174. UART_AutoBaudDetection(id, 0);
  175. UART_Enable(id, UART_TXRX);
  176. return RT_EOK;
  177. }
  178. static rt_err_t _uart_control(struct rt_serial_device *serial, int cmd, void *arg)
  179. {
  180. struct device_uart *uart;
  181. RT_ASSERT(serial != RT_NULL);
  182. uart = serial->parent.user_data;
  183. RT_ASSERT(uart != RT_NULL);
  184. switch (cmd)
  185. {
  186. /* disable interrupt */
  187. case RT_DEVICE_CTRL_CLR_INT:
  188. bl_uart_int_disable(uart->port);
  189. bl_uart_int_rx_notify_unregister(uart->port, _uart_rx_irq, uart);
  190. break;
  191. /* enable interrupt */
  192. case RT_DEVICE_CTRL_SET_INT:
  193. bl_uart_int_rx_notify_register(uart->port, _uart_rx_irq, uart);
  194. bl_uart_int_enable(uart->port);
  195. break;
  196. }
  197. return RT_EOK;
  198. }
  199. static int _uart_putc(struct rt_serial_device *serial, char c)
  200. {
  201. struct device_uart *uart;
  202. RT_ASSERT(serial != RT_NULL);
  203. uart = serial->parent.user_data;
  204. RT_ASSERT(uart != RT_NULL);
  205. bl_uart_data_send(uart->port, c);
  206. return 1;
  207. }
  208. static int _uart_getc(struct rt_serial_device *serial)
  209. {
  210. int ch = -1;
  211. struct device_uart *uart;
  212. RT_ASSERT(serial != RT_NULL);
  213. uart = serial->parent.user_data;
  214. RT_ASSERT(uart != RT_NULL);
  215. ch = bl_uart_data_recv(uart->port);
  216. return ch;
  217. }
  218. static const struct rt_uart_ops _uart_ops =
  219. {
  220. .configure = _uart_configure,
  221. .control = _uart_control,
  222. .putc = _uart_putc,
  223. .getc = _uart_getc,
  224. .dma_transmit = RT_NULL
  225. };
  226. /*
  227. * UART Initiation
  228. */
  229. int rt_hw_uart_init(void)
  230. {
  231. rt_err_t result = 0;
  232. struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT;
  233. struct rt_serial_device *serial;
  234. struct device_uart *uart;
  235. #ifdef BSP_USING_UART0
  236. static struct device_uart uart0;
  237. serial = &uart0.serial;
  238. uart = &uart0;
  239. serial->ops = &_uart_ops;
  240. serial->config = config;
  241. serial->config.baud_rate = 2000000;
  242. uart->port = 0;
  243. uart->tx_pin = BSP_UART0_TXD_PIN;
  244. uart->rx_pin = BSP_UART0_RXD_PIN;
  245. /* register USART device */
  246. result = rt_hw_serial_register(serial,
  247. "uart0",
  248. RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX,
  249. uart);
  250. RT_ASSERT(result == RT_EOK);
  251. #endif
  252. return 0;
  253. }