ameba-gcc-sample-rtos/sdk/component/soc/realtek/8195a/fwlib/hal_log_uart.h
2016-06-26 15:38:00 +09:00

150 lines
5.7 KiB
C

/*
* Routines to access hardware
*
* Copyright (c) 2013 Realtek Semiconductor Corp.
*
* This module is a confidential and proprietary property of RealTek and
* possession or use of this module requires written permission of RealTek.
*/
#ifndef _HAL_LOG_UART_H_
#define _HAL_LOG_UART_H_
#include "hal_diag.h"
#define LOG_UART_WAIT_FOREVER 0xffffffff
// Define Line Control Register Bits
typedef enum {
LCR_DLS_5B = 0, // Data Length: 5 bits
LCR_DLS_6B = BIT(0), // Data Length: 6 bits
LCR_DLS_7B = BIT(1), // Data Length: 7 bits
LCR_DLS_8B = (BIT(1)|BIT(0)), // Data Length: 7 bits
LCR_STOP_1B = 0, // Number of stop bits: 1
LCR_STOP_2B = BIT(2), // Number of stop bits: 1.5(data len=5) or 2
LCR_PARITY_NONE = 0, // Parity Enable: 0
LCR_PARITY_ODD = BIT(3), // Parity Enable: 1, Even Parity: 0
LCR_PARITY_EVEN = (BIT(4)|BIT(3)), // Parity Enable: 1, Even Parity: 1
LCR_BC = BIT(6), // Break Control Bit
LCR_DLAB = BIT(7) // Divisor Latch Access Bit
} LOG_UART_LINE_CTRL;
// define Log UART Interrupt Indication ID
/*
IIR[3:0]:
0000 = modem status
0001 = no interrupt pending
0010 = THR empty
0100 = received data available
0110 = receiver line status
0111 = busy detect
1100 = character timeout
*/
typedef enum {
IIR_MODEM_STATUS = 0, //Clear to send or data set ready or ring indicator or data carrier detect.
IIR_NO_PENDING = 1,
IIR_THR_EMPTY = 2, // TX FIFO level lower than threshold or FIFO empty
IIR_RX_RDY = 4, // RX data ready
IIR_RX_LINE_STATUS = 6, // Overrun/parity/framing errors or break interrupt
IIR_BUSY = 7,
IIR_CHAR_TIMEOUT = 12 // timeout: Rx dara ready but no read
} LOG_UART_INT_ID;
// Define Interrupt Enable Bit
typedef enum {
IER_ERBFI = BIT(0), // Enable Received Data Available Interrupt
IER_ETBEI = BIT(1), // Enable Transmit Holding Register Empty Interrupt
IER_ELSI = BIT(2), // Enable Receiver Line Status Interrupt
IER_EDSSI = BIT(3), // Enable Modem Status Interrupt
IER_PTIME = BIT(7) // Programmable THRE Interrupt Mode Enable
} LOG_UART_INT_EN;
// Define Line Status Bit
typedef enum {
LSR_DR = BIT(0), // Data Ready bit
LSR_OE = BIT(1), // Overrun error bit
LSR_PE = BIT(2), // Parity Error bit
LSR_FE = BIT(3), // Framing Error bit
LSR_BI = BIT(4), // Break Interrupt bit
LSR_THRE = BIT(5), // Transmit Holding Register Empty bit(IER_PTIME=0)
LSR_FIFOF = BIT(5), // Transmit FIFO Full bit(IER_PTIME=1)
LSR_TEMT = BIT(6), // Transmitter Empty bit
LSR_RFE = BIT(7) // Receiver FIFO Error bit
} LOG_UART_LINE_STATUS;
enum {
LOG_UART_RST_TX_FIFO = 0x01,
LOG_UART_RST_RX_FIFO = 0x02
};
#define LOG_UART_TX_FIFO_DEPTH 16
#define LOG_UART_RX_FIFO_DEPTH 16
// Define FIFO Control Register Bits
typedef enum {
FCR_FIFO_EN = BIT(0), // FIFO Enable.
FCR_RST_RX = BIT(1), // RCVR FIFO Reset, self clear
FCR_RST_TX = BIT(2), // XMIT FIFO Reset, self clear
FCR_TX_TRIG_EMP = 0, // TX Empty Trigger: FIFO empty
FCR_TX_TRIG_2CH = BIT(4), // TX Empty Trigger: 2 characters in the FIFO
FCR_TX_TRIG_QF = BIT(5), // TX Empty Trigger: FIFO 1/4 full
FCR_TX_TRIG_HF = (BIT(5)|BIT(4)), // TX Empty Trigger: FIFO 1/2 full
FCR_TX_TRIG_MASK = (BIT(5)|BIT(4)), // TX Empty Trigger Bit Mask
FCR_RX_TRIG_1CH = 0, // RCVR Trigger: 1 character in the FIFO
FCR_RX_TRIG_QF = BIT(6), // RCVR Trigger: FIFO 1/4 full
FCR_RX_TRIG_HF = BIT(7), // RCVR Trigger: FIFO 1/2 full
FCR_RX_TRIG_AF = (BIT(7)|BIT(6)), // RCVR Trigger: FIFO 2 less than full
FCR_RX_TRIG_MASK = (BIT(7)|BIT(6)) // RCVR Trigger bits Mask
} LOG_UART_FIFO_CTRL;
typedef struct _HAL_LOG_UART_ADAPTER_ {
u32 BaudRate;
u32 FIFOControl;
u32 IntEnReg;
u8 Parity;
u8 Stop;
u8 DataLength;
u8 LineStatus;
volatile u32 TxCount; // how many byte to TX
volatile u32 RxCount; // how many bytes to RX
volatile u8 *pTxBuf;
volatile u8 *pRxBuf;
u8 *pTxStartAddr;
u8 *pRxStartAddr;
IRQ_HANDLE IrqHandle;
VOID (*LineStatusCallback)(VOID *para, u8 status); // User Line Status interrupt callback
VOID (*TxCompCallback)(VOID *para); // User Tx complete callback
VOID (*RxCompCallback)(VOID *para); // User Rx complete callback
VOID *LineStatusCbPara; // the argument for LineStatusCallback
VOID *TxCompCbPara; // the argument for TxCompCallback
VOID *RxCompCbPara; // the argument for RxCompCallback
void (*api_irq_handler)(u32 id, LOG_UART_INT_ID event);
u32 api_irq_id;
}HAL_LOG_UART_ADAPTER, *PHAL_LOG_UART_ADAPTER;
VOID HalLogUartIrqHandle(VOID * Data);
VOID HalLogUartSetBaudRate(HAL_LOG_UART_ADAPTER *pUartAdapter);
VOID HalLogUartSetLineCtrl(HAL_LOG_UART_ADAPTER *pUartAdapter);
VOID HalLogUartSetIntEn(HAL_LOG_UART_ADAPTER *pUartAdapter);
u32 HalLogUartInitSetting(HAL_LOG_UART_ADAPTER *pUartAdapter);
u32 HalLogUartRecv(HAL_LOG_UART_ADAPTER *pUartAdapter,
u8 *pRxData, u32 Length, u32 TimeoutMS);
u32 HalLogUartSend(HAL_LOG_UART_ADAPTER *pUartAdapter,
u8 *pTxData, u32 Length, u32 TimeoutMS);
HAL_Status HalLogUartIntSend(HAL_LOG_UART_ADAPTER *pUartAdapter,
u8 *pTxData, u32 Length);
HAL_Status HalLogUartIntRecv(HAL_LOG_UART_ADAPTER *pUartAdapter,
u8 *pRxData, u32 Length);
VOID HalLogUartAbortIntSend(HAL_LOG_UART_ADAPTER *pUartAdapter);
VOID HalLogUartAbortIntRecv(HAL_LOG_UART_ADAPTER *pUartAdapter);
HAL_Status HalLogUartRstFIFO(HAL_LOG_UART_ADAPTER *pUartAdapter, u8 RstCtrl);
VOID HalLogUartEnable(HAL_LOG_UART_ADAPTER *pUartAdapter);
VOID HalLogUartDisable(HAL_LOG_UART_ADAPTER *pUartAdapter);
#endif