ls1b_uart.h 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. /*
  2. * Copyright (c) 2006-2018, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2021-02-02 michael5hzg@gmail.com adapt to ls1b
  9. */
  10. // 串口相关头文件
  11. #ifndef __LOONGSON_UART_H
  12. #define __LOONGSON_UART_H
  13. #include "ls1b_public.h"
  14. // 串口各寄存器相对基地址的偏移
  15. #define LS1B_UART_DAT_OFFSET (0)
  16. #define LS1B_UART_IER_OFFSET (1)
  17. #define LS1B_UART_IIR_OFFSET (2)
  18. #define LS1B_UART_FCR_OFFSET (2)
  19. #define LS1B_UART_LCR_OFFSET (3)
  20. #define LS1B_UART_MCR_OFFSET (4)
  21. #define LS1B_UART_LSR_OFFSET (5)
  22. #define LS1B_UART_MSR_OFFSET (6)
  23. #define LS1B_UART_LSB_OFFSET (0) // 分频锁存器1
  24. #define LS1B_UART_MSB_OFFSET (1) // 分频锁存器2
  25. /* interrupt enable register */
  26. #define IER_IRxE 0x1 /* 接收有效数据中断使能 */
  27. #define IER_ITxE 0x2 /* 传输保存寄存器为空中断使能 */
  28. #define IER_ILE 0x4 /* 接收器线路状态中断使能 */
  29. #define IER_IME 0x8 /* Modem状态中断使能 */
  30. /* interrupt identification register */
  31. #define IIR_IMASK 0xf /* mask */
  32. #define IIR_RXTOUT 0xc /* receive timeout */
  33. #define IIR_RLS 0x6 /* receive line status */
  34. #define IIR_RXRDY 0x4 /* receive ready */
  35. #define IIR_TXRDY 0x2 /* transmit ready */
  36. #define IIR_NOPEND 0x1 /* nothing */
  37. #define IIR_MLSC 0x0 /* modem status */
  38. #define IIR_FIFO_MASK 0xc0 /* set if FIFOs are enabled */
  39. /* fifo control register */
  40. #define FIFO_ENABLE 0x01 /* enable fifo */
  41. #define FIFO_RCV_RST 0x02 /* reset receive fifo */
  42. #define FIFO_XMT_RST 0x04 /* reset transmit fifo */
  43. #define FIFO_DMA_MODE 0x08 /* enable dma mode */
  44. #define FIFO_TRIGGER_1 0x00 /* trigger at 1 char */
  45. #define FIFO_TRIGGER_4 0x40 /* trigger at 4 chars */
  46. #define FIFO_TRIGGER_8 0x80 /* trigger at 8 chars */
  47. #define FIFO_TRIGGER_14 0xc0 /* trigger at 14 chars */
  48. // 线路控制寄存器
  49. /* character format control register */
  50. #define CFCR_DLAB 0x80 /* divisor latch */
  51. #define CFCR_SBREAK 0x40 /* send break */
  52. #define CFCR_PZERO 0x30 /* zero parity */
  53. #define CFCR_PONE 0x20 /* one parity */
  54. #define CFCR_PEVEN 0x10 /* even parity */
  55. #define CFCR_PODD 0x00 /* odd parity */
  56. #define CFCR_PENAB 0x08 /* parity enable */
  57. #define CFCR_STOPB 0x04 /* 2 stop bits */
  58. #define CFCR_8BITS 0x03 /* 8 data bits */
  59. #define CFCR_7BITS 0x02 /* 7 data bits */
  60. #define CFCR_6BITS 0x01 /* 6 data bits */
  61. #define CFCR_5BITS 0x00 /* 5 data bits */
  62. /* modem control register */
  63. #define MCR_LOOPBACK 0x10 /* loopback */
  64. #define MCR_IENABLE 0x08 /* output 2 = int enable */
  65. #define MCR_DRS 0x04 /* output 1 = xxx */
  66. #define MCR_RTS 0x02 /* enable RTS */
  67. #define MCR_DTR 0x01 /* enable DTR */
  68. /* line status register */
  69. #define LSR_RCV_FIFO 0x80 /* error in receive fifo */
  70. #define LSR_TSRE 0x40 /* transmitter empty */
  71. #define LSR_TXRDY 0x20 /* transmitter ready */
  72. #define LSR_BI 0x10 /* break detected */
  73. #define LSR_FE 0x08 /* framing error */
  74. #define LSR_PE 0x04 /* parity error */
  75. #define LSR_OE 0x02 /* overrun error */
  76. #define LSR_RXRDY 0x01 /* receiver ready */
  77. #define LSR_RCV_MASK 0x1f
  78. // 串口模块编号
  79. typedef enum
  80. {
  81. LS1B_UART00 = 0, // 全功能串口UART0可以分为两个四线串口UART00和UART01
  82. LS1B_UART01,
  83. LS1B_UART1,
  84. LS1B_UART2,
  85. LS1B_UART3,
  86. LS1B_UART4,
  87. LS1B_UART5,
  88. LS1B_UART6,
  89. LS1B_UART7,
  90. LS1B_UART8,
  91. LS1B_UART9,
  92. LS1B_UART10,
  93. LS1B_UART11
  94. }ls1b_uart_t;
  95. // 串口信息
  96. typedef struct
  97. {
  98. ls1b_uart_t UARTx; // 串口模块编号
  99. unsigned int baudrate; // 波特率
  100. BOOL rx_enable; // 是否需要使用串口接收数据(使能接收中断),发送默认使能
  101. }ls1b_uart_info_t;
  102. /*
  103. * 获取指定串口模块的基地址
  104. * @UARTx 串口编号
  105. * @ret 基地址
  106. */
  107. void *uart_get_base(ls1b_uart_t UARTx);
  108. /*
  109. * 初始化指定的串口模块
  110. * @uart_info_p 串口模块信息
  111. */
  112. void uart_init(ls1b_uart_info_t *uart_info_p);
  113. /*
  114. * 初始化串口2
  115. */
  116. void uart2_init(void);
  117. /*
  118. * 在串口2上打印字符串
  119. * @str 待打印的字符串
  120. */
  121. void uart2_print(const char *str);
  122. /*
  123. * 在调试串口打印字符串
  124. * @str 待打印的字符串
  125. */
  126. void uart_debug_print(const char *str);
  127. /*
  128. * 在调试串口打印一个字符
  129. * @ch 待打印的字符
  130. */
  131. void uart_debug_putc(unsigned char ch);
  132. /*
  133. * 发送一个字节
  134. * @uartx 串口号
  135. * @ch 待发送的字符串
  136. */
  137. void uart_putc(ls1b_uart_t uartx, unsigned char ch);
  138. /*
  139. * 打印一个字符串到指定串口
  140. * @uartx 串口号
  141. * @str 待打印的字符串
  142. */
  143. void uart_print(ls1b_uart_t uartx, const char *str);
  144. #endif