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