usart.c 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. #include <rtdevice.h>
  2. #include "usart.h"
  3. #include <encoding.h>
  4. #include <platform.h>
  5. /**
  6. * @brief set uartdbg buard
  7. *
  8. * @param buard
  9. */
  10. static void usart_init(int buard)
  11. {
  12. GPIO_REG(GPIO_IOF_SEL) &= ~IOF0_UART0_MASK;
  13. GPIO_REG(GPIO_IOF_EN) |= IOF0_UART0_MASK;
  14. UART0_REG(UART_REG_DIV) = get_cpu_freq() / buard - 1;
  15. UART0_REG(UART_REG_TXCTRL) |= UART_TXEN;
  16. }
  17. static void usart_handler(int vector, void *param)
  18. {
  19. rt_hw_serial_isr((struct rt_serial_device*)param, RT_SERIAL_EVENT_RX_IND);
  20. return;
  21. }
  22. static rt_err_t usart_configure(struct rt_serial_device *serial,
  23. struct serial_configure *cfg)
  24. {
  25. GPIO_REG(GPIO_IOF_SEL) &= ~IOF0_UART0_MASK;
  26. GPIO_REG(GPIO_IOF_EN) |= IOF0_UART0_MASK;
  27. UART0_REG(UART_REG_DIV) = get_cpu_freq() / 115200 - 1;
  28. UART0_REG(UART_REG_TXCTRL) |= UART_TXEN;
  29. return RT_EOK;
  30. }
  31. static rt_err_t usart_control(struct rt_serial_device *serial,
  32. int cmd, void *arg)
  33. {
  34. RT_ASSERT(serial != RT_NULL);
  35. switch(cmd){
  36. case RT_DEVICE_CTRL_CLR_INT:
  37. break;
  38. case RT_DEVICE_CTRL_SET_INT:
  39. break;
  40. }
  41. return RT_EOK;
  42. }
  43. static int usart_putc(struct rt_serial_device *serial, char c)
  44. {
  45. while (UART0_REG(UART_REG_TXFIFO) & 0x80000000) ;
  46. UART0_REG(UART_REG_TXFIFO) = c;
  47. return 0;
  48. }
  49. static int usart_getc(struct rt_serial_device *serial)
  50. {
  51. rt_uint8_t val = (rt_uint8_t) UART0_REG(UART_REG_RXFIFO);
  52. return val;
  53. }
  54. static struct rt_uart_ops ops = {
  55. usart_configure,
  56. usart_control,
  57. usart_putc,
  58. usart_getc,
  59. };
  60. static struct rt_serial_device serial = {
  61. .ops = &ops,
  62. .config.baud_rate = BAUD_RATE_115200,
  63. .config.bit_order = BIT_ORDER_LSB,
  64. .config.data_bits = DATA_BITS_8,
  65. .config.parity = PARITY_NONE,
  66. .config.stop_bits = STOP_BITS_1,
  67. .config.invert = NRZ_NORMAL,
  68. .config.bufsz = RT_SERIAL_RB_BUFSZ,
  69. };
  70. void rt_hw_uart_init(void)
  71. {
  72. rt_hw_serial_register(&serial, "dusart", RT_DEVICE_FLAG_STREAM | RT_DEVICE_FLAG_RDWR
  73. | RT_DEVICE_FLAG_INT_RX, RT_NULL);
  74. return;
  75. }