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