usart.c 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  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. UART0_REG(UART_REG_RXCTRL) |= UART_RXEN;
  30. UART0_REG(UART_REG_IE) = UART_IP_RXWM;
  31. return RT_EOK;
  32. }
  33. static rt_err_t usart_control(struct rt_serial_device *serial,
  34. int cmd, void *arg)
  35. {
  36. RT_ASSERT(serial != RT_NULL);
  37. switch(cmd){
  38. case RT_DEVICE_CTRL_CLR_INT:
  39. break;
  40. case RT_DEVICE_CTRL_SET_INT:
  41. break;
  42. }
  43. return RT_EOK;
  44. }
  45. static int usart_putc(struct rt_serial_device *serial, char c)
  46. {
  47. while (UART0_REG(UART_REG_TXFIFO) & 0x80000000) ;
  48. UART0_REG(UART_REG_TXFIFO) = c;
  49. return 0;
  50. }
  51. static int usart_getc(struct rt_serial_device *serial)
  52. {
  53. rt_int32_t val = UART0_REG(UART_REG_RXFIFO);
  54. if (val > 0)
  55. return (rt_uint8_t)val;
  56. else
  57. return -1;
  58. }
  59. static struct rt_uart_ops ops = {
  60. usart_configure,
  61. usart_control,
  62. usart_putc,
  63. usart_getc,
  64. };
  65. static struct rt_serial_device serial = {
  66. .ops = &ops,
  67. .config.baud_rate = BAUD_RATE_115200,
  68. .config.bit_order = BIT_ORDER_LSB,
  69. .config.data_bits = DATA_BITS_8,
  70. .config.parity = PARITY_NONE,
  71. .config.stop_bits = STOP_BITS_1,
  72. .config.invert = NRZ_NORMAL,
  73. .config.bufsz = RT_SERIAL_RB_BUFSZ,
  74. };
  75. void rt_hw_uart_init(void)
  76. {
  77. rt_hw_serial_register(
  78. &serial,
  79. "dusart",
  80. RT_DEVICE_FLAG_STREAM
  81. | RT_DEVICE_FLAG_RDWR
  82. | RT_DEVICE_FLAG_INT_RX, RT_NULL);
  83. rt_hw_interrupt_install(
  84. INT_UART0_BASE,
  85. usart_handler,
  86. (void*)&(serial.parent),
  87. "uart interrupt");
  88. rt_hw_interrupt_unmask(INT_UART0_BASE);
  89. return;
  90. }