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 * first version 9 */ 10 // 串口相关头文件 11 12 13 #ifndef __OPENLOONGSON_UART_H 14 #define __OPENLOONGSON_UART_H 15 16 17 #include "ls1c_public.h" 18 19 20 // 串口各寄存器相对基地址的偏移 21 #define LS1C_UART_DAT_OFFSET (0) 22 #define LS1C_UART_IER_OFFSET (1) 23 #define LS1C_UART_IIR_OFFSET (2) 24 #define LS1C_UART_FCR_OFFSET (2) 25 #define LS1C_UART_LCR_OFFSET (3) 26 #define LS1C_UART_MCR_OFFSET (4) 27 #define LS1C_UART_LSR_OFFSET (5) 28 #define LS1C_UART_MSR_OFFSET (6) 29 30 #define LS1C_UART_LSB_OFFSET (0) // 分频锁存器1 31 #define LS1C_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 LS1C_UART00 = 0, // 全功能串口UART0可以分为两个四线串口UART00和UART01 97 LS1C_UART01, 98 LS1C_UART1, 99 LS1C_UART2, 100 LS1C_UART3, 101 LS1C_UART4, 102 LS1C_UART5, 103 LS1C_UART6, 104 LS1C_UART7, 105 LS1C_UART8, 106 LS1C_UART9, 107 LS1C_UART10, 108 LS1C_UART11 109 }ls1c_uart_t; 110 111 112 // 串口信息 113 typedef struct 114 { 115 ls1c_uart_t UARTx; // 串口模块编号 116 unsigned int baudrate; // 波特率 117 BOOL rx_enable; // 是否需要使用串口接收数据(使能接收中断),发送默认使能 118 }ls1c_uart_info_t; 119 120 121 122 /* 123 * 获取指定串口模块的基地址 124 * @UARTx 串口编号 125 * @ret 基地址 126 */ 127 void *uart_get_base(ls1c_uart_t UARTx); 128 129 130 /* 131 * 初始化指定的串口模块 132 * @uart_info_p 串口模块信息 133 */ 134 void uart_init(ls1c_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 * @IRQn 中断号 167 * @ret 串口号 168 */ 169 ls1c_uart_t uart_irqn_to_uartx(int IRQn); 170 171 172 /* 173 * 发送一个字节 174 * @uartx 串口号 175 * @ch 待发送的字符串 176 */ 177 void uart_putc(ls1c_uart_t uartx, unsigned char ch); 178 179 180 /* 181 * 打印一个字符串到指定串口 182 * @uartx 串口号 183 * @str 待打印的字符串 184 */ 185 void uart_print(ls1c_uart_t uartx, const char *str); 186 187 188 #endif 189 190