2025-12-17 15:55:25 +08:00

218 lines
9.7 KiB
C

#ifndef __SERIAL_H
#define __SERIAL_H
#include "base.h"
typedef enum {
DRVUART_PORT0=0,
DRVUART_PORT1=1,
DRVUART_PORT2=2,
DRVUART_PORT3=3,
} DRVUART_PORT;
#define UART_CLOCK (30000000UL) //kneron
extern u32 UART_PORT[4];
/*
#define UART_FTUART010_0_PA_BASE 0xC1400000UL //UART_u0
#define UART_FTUART010_1_PA_BASE 0xC1500000UL //UART_u1
#define UART_FTUART010_2_PA_BASE 0xC1600000UL //UART_u1_1
#define UART_FTUART010_3_PA_BASE 0xC1700000UL //UART_u1_2
*/
#define SERIAL_THR 0x00 /* Transmitter Holding Register(Write).*/
#define SERIAL_RBR 0x00 /* Receive Buffer register (Read).*/
#define SERIAL_IER 0x04 /* Interrupt Enable register.*/
#define SERIAL_IIR 0x08 /* Interrupt Identification register(Read).*/
#define SERIAL_FCR 0x08 /* FIFO control register(Write).*/
#define SERIAL_LCR 0x0C /* Line Control register.*/
#define SERIAL_MCR 0x10 /* Modem Control Register.*/
#define SERIAL_LSR 0x14 /* Line status register(Read) .*/
#define SERIAL_MSR 0x18 /* Modem Status register (Read).*/
#define SERIAL_SPR 0x1C /* Scratch pad register */
#define SERIAL_DLL 0x0 /* Divisor Register LSB */
#define SERIAL_DLM 0x4 /* Divisor Register MSB */
#define SERIAL_PSR 0x8 /* Prescale Divison Factor */
#define SERIAL_MDR 0x20
#define SERIAL_ACR 0x24
#define SERIAL_TXLENL 0x28
#define SERIAL_TXLENH 0x2C
#define SERIAL_MRXLENL 0x30
#define SERIAL_MRXLENH 0x34
#define SERIAL_PLR 0x38
#define SERIAL_FMIIR_PIO 0x3C
#define SERIAL_FEATURE 0x68
/* IER Register */
#define SERIAL_IER_DR 0x1 /* Data ready Enable */
#define SERIAL_IER_TE 0x2 /* THR Empty Enable */
#define SERIAL_IER_RLS 0x4 /* Receive Line Status Enable */
#define SERIAL_IER_MS 0x8 /* Modem Staus Enable */
/* IIR Register */
#define SERIAL_IIR_NONE 0x1 /* No interrupt pending */
#define SERIAL_IIR_RLS 0x6 /* Receive Line Status */
#define SERIAL_IIR_DR 0x4 /* Receive Data Ready */
#define SERIAL_IIR_TIMEOUT 0xc /* Receive Time Out */
#define SERIAL_IIR_TE 0x2 /* THR Empty */
#define SERIAL_IIR_MODEM 0x0 /* Modem Status */
/* FCR Register */
#define SERIAL_FCR_FE 0x1 /* FIFO Enable */
#define SERIAL_FCR_RXFR 0x2 /* Rx FIFO Reset */
#define SERIAL_FCR_TXFR 0x4 /* Tx FIFO Reset */
/* LCR Register */
#define SERIAL_LCR_LEN5 0x0
#define SERIAL_LCR_LEN6 0x1
#define SERIAL_LCR_LEN7 0x2
#define SERIAL_LCR_LEN8 0x3
#define SERIAL_LCR_STOP 0x4
#define SERIAL_LCR_EVEN 0x18 /* Even Parity */
#define SERIAL_LCR_ODD 0x8 /* Odd Parity */
#define SERIAL_LCR_PE 0x8 /* Parity Enable */
#define SERIAL_LCR_SETBREAK 0x40 /* Set Break condition */
#define SERIAL_LCR_STICKPARITY 0x20 /* Stick Parity Enable */
#define SERIAL_LCR_DLAB 0x80 /* Divisor Latch Access Bit */
/* LSR Register */
#define SERIAL_LSR_DR 0x1 /* Data Ready */
#define SERIAL_LSR_OE 0x2 /* Overrun Error */
#define SERIAL_LSR_PE 0x4 /* Parity Error */
#define SERIAL_LSR_FE 0x8 /* Framing Error */
#define SERIAL_LSR_BI 0x10 /* Break Interrupt */
#define SERIAL_LSR_THRE 0x20 /* THR Empty */
#define SERIAL_LSR_TE 0x40 /* Transmitte Empty */
#define SERIAL_LSR_DE 0x80 /* FIFO Data Error */
/* MCR Register */
#define SERIAL_MCR_DTR 0x1 /* Data Terminal Ready */
#define SERIAL_MCR_RTS 0x2 /* Request to Send */
#define SERIAL_MCR_OUT1 0x4 /* output 1 */
#define SERIAL_MCR_OUT2 0x8 /* output2 or global interrupt enable */
#define SERIAL_MCR_LPBK 0x10 /* loopback mode */
/* MSR Register */
#define SERIAL_MSR_DELTACTS 0x1 /* Delta CTS */
#define SERIAL_MSR_DELTADSR 0x2 /* Delta DSR */
#define SERIAL_MSR_TERI 0x4 /* Trailing Edge RI */
#define SERIAL_MSR_DELTACD 0x8 /* Delta CD */
#define SERIAL_MSR_CTS 0x10 /* Clear To Send */
#define SERIAL_MSR_DSR 0x20 /* Data Set Ready */
#define SERIAL_MSR_RI 0x40 /* Ring Indicator */
#define SERIAL_MSR_DCD 0x80 /* Data Carrier Detect */
/* MDR register */
#define SERIAL_MDR_MODE_SEL 0x03
#define SERIAL_MDR_UART 0x0
#define SERIAL_MDR_SIR 0x1
#define SERIAL_MDR_FIR 0x2
/* ACR register */
#define SERIAL_ACR_TXENABLE 0x1
#define SERIAL_ACR_RXENABLE 0x2
#define SERIAL_ACR_SET_EOT 0x4
#define BAUD_921600 (UART_CLOCK / 14745600)
#define BAUD_460800 (UART_CLOCK / 7372800)
#define BAUD_115200 (UART_CLOCK / 1843200)
#define BAUD_57600 (UART_CLOCK / 921600)
#define BAUD_38400 (UART_CLOCK / 614400)
#define BAUD_19200 (UART_CLOCK / 307200)
#define BAUD_14400 (UART_CLOCK / 230400)
#define BAUD_9600 (UART_CLOCK / 153600)
#define BAUD_4800 (UART_CLOCK / 76800)
#define BAUD_2400 (UART_CLOCK / 38400)
#define BAUD_1200 (UART_CLOCK / 19200)
#define DEBUG_CONSOLE DRVUART_PORT0
#define DEFAULT_CONSOLE_BAUD BAUD_115200
#ifndef PARITY_NONE
#define PARITY_NONE 0
#endif
#ifndef PARITY_ODD
#define PARITY_ODD 1
#endif
#ifndef PARITY_EVEN
#define PARITY_EVEN 2
#endif
#ifndef PARITY_MARK
#define PARITY_MARK 3
#endif
#ifndef PARITY_SPACE
#define PARITY_SPACE 4
#endif
#ifndef ON
#define ON 1
#endif
#ifndef OFF
#define OFF 0
#endif
#define BACKSP_KEY 0x08
#define RETURN_KEY 0x0D
#define DELETE_KEY 0x7F
#define BELL 0x07
/* -------------------------------------------------------------------------------
* API
* -------------------------------------------------------------------------------
*/
extern void fLib_SetSerialMode(DRVUART_PORT port_no, u32 mode);
extern void fLib_EnableIRMode(DRVUART_PORT port_no, u32 TxEnable, u32 RxEnable);
extern void fLib_SerialInit (DRVUART_PORT port_no, u32 baudrate, u32 parity,u32 num,u32 len, u32 interruptMode);
extern void fLib_SetSerialLoopback(DRVUART_PORT port_no, u32 onoff);
extern void fLib_SetSerialFifoCtrl(DRVUART_PORT port_no, u32 level_tx, u32 level_rx, u32 resettx, u32 resetrx); //V1.20//ADA10022002
extern void fLib_DisableSerialFifo(DRVUART_PORT port_no);
extern void fLib_SetSerialInt(DRVUART_PORT port_no, u32 IntMask);
extern char fLib_GetSerialChar(DRVUART_PORT port_no);
extern void fLib_PutSerialChar(DRVUART_PORT port_no, char Ch);
extern void fLib_PutSerialStr(DRVUART_PORT port_no, char *Str);
extern void fLib_Modem_waitcall(DRVUART_PORT port_no);
extern void fLib_Modem_call(DRVUART_PORT port_no, char *tel);
extern int fLib_Modem_getchar(DRVUART_PORT port_no,int TIMEOUT);
extern bool fLib_Modem_putchar(DRVUART_PORT port_no, s8 Ch);
extern void fLib_EnableSerialInt(DRVUART_PORT port_no, u32 mode);
extern void fLib_DisableSerialInt(DRVUART_PORT port_no, u32 mode);
extern u32 fLib_ReadSerialIER(DRVUART_PORT port_no);
extern u32 fLib_SerialIntIdentification(DRVUART_PORT port_no);
extern void fLib_SetSerialLineBreak(DRVUART_PORT port_no);
extern void fLib_SerialRequestToSend(DRVUART_PORT port_no);
extern void fLib_SerialStopToSend(DRVUART_PORT port_no);
extern void fLib_SerialDataTerminalReady(DRVUART_PORT port_no);
extern void fLib_SerialDataTerminalNotReady(DRVUART_PORT port_no);
extern u32 fLib_ReadSerialLineStatus(DRVUART_PORT port_no);
extern u32 fLib_ReadSerialModemStatus(DRVUART_PORT port_no);
extern u32 GetUartStatus(DRVUART_PORT port_no);
extern u32 IsThrEmpty(u32 status);
extern u32 IsDataReady(u32 status);
extern void CheckRxStatus(DRVUART_PORT port_no);
extern void CheckTxStatus(DRVUART_PORT port_no);
extern u32 fLib_kbhit(DRVUART_PORT port_no);
extern char fLib_getch(DRVUART_PORT port_no);
extern char fLib_getchar(DRVUART_PORT port_no);
extern char fLib_getchar_timeout(DRVUART_PORT port_no, unsigned long timeout);
extern void fLib_putchar(DRVUART_PORT port_no, char Ch);
extern void fLib_putc(DRVUART_PORT port_no, char Ch);
extern void fLib_putstr(DRVUART_PORT port_no, char *str);
extern void fLib_printf(const char *f, ...); /* variable arguments */
extern int fLib_gets(DRVUART_PORT port_no, char *buf);
extern void fLib_DebugPrintChar(DRVUART_PORT port_no, char ch);
extern void fLib_DebugPrintString(DRVUART_PORT port_no, char *str);
extern char fLib_DebugGetChar(DRVUART_PORT port_no);
extern u32 fLib_DebugGetUserCommand(DRVUART_PORT port_no, u8 * buffer, u32 Len);
extern void Seg7_Show(u32 value);
#endif // __SERIAL_H