/****************************************************************************** * * $Workfile: uartlib.h $ * * $Author: Moti $ * * $Revision: 23 $ * * $Modtime: 3/15/02 12:28p $ * * Description: Contains public UART Library definitions and prototypes. * ******************************************************************************/ #if !defined(UARTLIB_H) /* UARTLIB.H */ #define UARTLIB_H /* UART object structure prototype */ typedef struct _UART_OBJECT *PUART_OBJECT; /* UART_CONFIG.FrameConfig */ #define UC_FCFG_DATALEN_MASK ((DWORD)(0x0000000F)) /* Data Length mask for bits 0:3 */ #define UC_FCFG_DATALEN_5 ((DWORD)(0x00<<0)) /* Bits 0:3 - Sets Data Word Length to 5 Bits. */ #define UC_FCFG_DATALEN_6 ((DWORD)(0x01<<0)) /* Bits 0:3 - Sets Data Word Length to 6 Bits. */ #define UC_FCFG_DATALEN_7 ((DWORD)(0x02<<0)) /* Bits 0:3 - Sets Data Word Length to 7 Bits. */ #define UC_FCFG_DATALEN_8 ((DWORD)(0x03<<0)) /* Bits 0:3 - Sets Data Word Length to 8 Bits. */ #define UC_FCFG_STOPBITS_MASK ((DWORD)(0x000000F0)) /* Stop Bits mask for bits 4:7 */ #define UC_FCFG_STOPBITS_1 ((DWORD)(0x00<<4)) /* Bits 4:7 - 1 Stop Bit. */ #define UC_FCFG_STOPBITS_1_5 ((DWORD)(0x01<<4)) /* Bits 4:7 - 1.5 Stop Bits. */ #define UC_FCFG_STOPBITS_2 ((DWORD)(0x02<<4)) /* Bits 4:7 - 2 Stop Bits. */ #define UC_FCFG_PARITY_MASK ((DWORD)(0x00000F00)) /* Parity Bits mask for bits 8:11 */ #define UC_FCFG_NO_PARITY ((DWORD)(0x00<<8)) /* Bits 8:11 - No Parity. */ #define UC_FCFG_ODD_PARITY ((DWORD)(0x01<<8)) /* Bits 8:11 - Odd Parity. */ #define UC_FCFG_EVEN_PARITY ((DWORD)(0x02<<8)) /* Bits 8:11 - Even Parity. */ #define UC_FCFG_MARK_PARITY ((DWORD)(0x03<<8)) /* Bits 8:11 - High Parity - Mark (Forced to 1). */ #define UC_FCFG_SPACE_PARITY ((DWORD)(0x04<<8)) /* Bits 8:11 - Low Parity - Space (Forced to 0). */ /* UART_CONFIG.InterruptEnable */ #define UC_IE_NO_INTS ((DWORD)(0x00)) /* No Interrupts - Interrupts Disabled. */ #define UC_IE_RX_STAT_INT ((DWORD)(0x01)) /* Bit 0 - Receive Status Interrupt. */ #define UC_IE_RX_INT ((DWORD)(0x02)) /* Bit 1 - Receive Data Available Interrupt. */ #define UC_IE_TX_INT ((DWORD)(0x04)) /* Bit 2 - Transmit Interrupt. */ #define UC_IE_TX_EMPTY_INT ((DWORD)(0x08)) /* Bit 3 - Transmit Empty Interrupt. */ #define UC_IE_MODEM_STAT_INT ((DWORD)(0x10)) /* Bit 4 - Modem Status Interrupt. */ /* UART_CONFIG.FlowControl */ #define UC_FLWC_RTS_FLOW_MASK ((DWORD)(0x0000000F)) #define UC_FLWC_NO_RTS_FLOW ((DWORD)(0x00<<0)) /* No RTS Handshaking */ #define UC_FLWC_RTS_HS ((DWORD)(0x01<<0)) /* RTS Handshaking */ #define UC_FLWC_RTS_TOGGLE ((DWORD)(0x02<<0)) /* RTS is raised when there is data to send and whilst being sent. */ #define UC_FLWC_CTS_FLOW_MASK ((DWORD)(0x000000F0)) #define UC_FLWC_NO_CTS_FLOW ((DWORD)(0x00<<4)) /* No CTS Handshaking */ #define UC_FLWC_CTS_HS ((DWORD)(0x01<<4)) /* CTS Handshaking */ #define UC_FLWC_DSR_FLOW_MASK ((DWORD)(0x00000F00)) #define UC_FLWC_NO_DSR_FLOW ((DWORD)(0x00<<8)) /* No DSR Handshaking */ #define UC_FLWC_DSR_HS ((DWORD)(0x01<<8)) /* DSR Handshaking */ #define UC_FLWC_DTR_FLOW_MASK ((DWORD)(0x0000F000)) #define UC_FLWC_NO_DTR_FLOW ((DWORD)(0x00<<12)) /* No DTR Handshaking */ #define UC_FLWC_DTR_HS ((DWORD)(0x01<<12)) /* DTR Handshaking */ #define UC_FLWC_DSR_IP_SENSITIVE ((DWORD)(0x02<<12)) /* DSR input sensitivity. */ #define UC_FLWC_TX_XON_XOFF_FLOW_MASK ((DWORD)(0x000F0000)) /* Transmit XON/XOFF flow control. */ #define UC_FLWC_TX_NO_XON_XOFF_FLOW ((DWORD)(0x00<<16)) /* No transmit XON/XOFF in-band flow control. */ #define UC_FLWC_TX_XON_XOFF_FLOW ((DWORD)(0x01<<16)) /* Transmit XON/XOFF in-band flow control. */ #define UC_FLWC_TX_XONANY_XOFF_FLOW ((DWORD)(0x02<<16)) /* Transmit XON Any/XOFF in-band flow control. */ /* 10.11.1999 ARG - ESIL 0928 */ /* Definition for Rx XON-ANY/XOFF flow control removed as not a feature of UART */ #define UC_FLWC_RX_XON_XOFF_FLOW_MASK ((DWORD)(0x00F00000)) /* Receive XON/XOFF flow control. */ #define UC_FLWC_RX_NO_XON_XOFF_FLOW ((DWORD)(0x00<<20)) /* No receive XON/XOFF in-band flow control. */ #define UC_FLWC_RX_XON_XOFF_FLOW ((DWORD)(0x01<<20)) /* Receive XON/XOFF in-band flow control. */ #define UC_FLWC_DISABLE_TXRX_MASK ((DWORD)(0xF0000000)) #define UC_FLWC_DISABLE_TX ((DWORD)(0x01<<28)) /* Disable Tx. */ #define UC_FLWC_DISABLE_RX ((DWORD)(0x02<<28)) /* Disable Rx. */ #define UC_FLWC_DISABLE_TXRX ((DWORD)(0x03<<28)) /* Disable Tx & Rx. */ /* UART_CONFIG.SpecialMode */ #define UC_SM_LOOPBACK_MODE ((DWORD)(0x01)) /* Place UART into internal loopback mode */ #define UC_SM_LOW_POWER_MODE ((DWORD)(0x02)) /* Place UART into low power mode */ #define UC_SM_TX_BREAK ((DWORD)(0x04)) /* Send break character */ #define UC_SM_DETECT_SPECIAL_CHAR ((DWORD)(0x08)) /* Detect special character */ #define UC_SM_DO_NULL_STRIPPING ((DWORD)(0x10)) /* Strip all NULLs from receive data */ /* Config Structure Masks */ #define UC_FRAME_CONFIG_MASK ((DWORD)(0x01)) #define UC_INT_ENABLE_MASK ((DWORD)(0x02)) #define UC_FLOW_CTRL_MASK ((DWORD)(0x04)) #define UC_FC_THRESHOLD_SETTING_MASK ((DWORD)(0x08)) #define UC_SPECIAL_CHARS_MASK ((DWORD)(0x10)) #define UC_TX_BAUD_RATE_MASK ((DWORD)(0x20)) #define UC_RX_BAUD_RATE_MASK ((DWORD)(0x40)) #define UC_SPECIAL_MODE_MASK ((DWORD)(0x80)) #define UC_ALL_MASK ((DWORD)(0xFFFF)) /* Configure UART Struct. */ typedef struct _UART_CONFIG { /* UC_FRAME_CONFIG_MASK */ DWORD FrameConfig; /* Parity/Stop/Data */ /* UC_INT_ENABLE_MASK */ DWORD InterruptEnable; /* Enable/Disable Interrupts */ /* UC_FLOW_CTRL_MASK */ DWORD FlowControl; /* Receive & Transmit Flow Control Settings & Enable Tx & Rx. */ /* UC_SPECIAL_CHARS_MASK */ DWORD XON; /* XON Special Character for XON/XOFF flow control. */ DWORD XOFF; /* XOFF Special Character for XON/XOFF flow control. */ DWORD SpecialCharDetect; /* Special Character to detect */ /* UC_FC_THRESHOLD_SETTING_MASK */ DWORD HiFlowCtrlThreshold; /* High Flow control threshold level */ DWORD LoFlowCtrlThreshold; /* Low Flow control threshold level */ /* UC_TX_BAUD_RATE_MASK */ DWORD TxBaud; /* Transmit baud rate. */ /* UC_RX_BAUD_RATE_MASK */ DWORD RxBaud; /* Receive baud rate. */ /* UC_SPECIAL_MODE_MASK */ DWORD SpecialMode; /* Special Mode */ } UART_CONFIG, *PUART_CONFIG; /* Buffer Control Operations */ #define UL_BC_OP_FLUSH 0x01 #define UL_BC_OP_SET 0x02 #define UL_BC_OP_GET 0x03 #define UL_BC_FIFO ((DWORD)(0x01)) #define UL_BC_BUFFER ((DWORD)(0x02)) #define UL_BC_IN ((DWORD)(0x04)) #define UL_BC_OUT ((DWORD)(0x08)) /* Set UART Buffer Sizes Struct. */ typedef struct _SET_BUFFER_SIZES { PBYTE pINBuffer; /* Pointer to allocated IN buffer */ DWORD INBufferSize; /* IN buffer size */ DWORD TxFIFOSize; /* Tx FIFO size */ DWORD RxFIFOSize; /* Rx FIFO size */ BYTE TxFIFOTrigLevel; /* Tx FIFO interrupt trigger level. */ BYTE RxFIFOTrigLevel; /* Rx FIFO interrupt trigger level. */ } SET_BUFFER_SIZES, *PSET_BUFFER_SIZES; /* Get UART Buffer State Struct. */ typedef struct _GET_BUFFER_STATE { DWORD BytesInOUTBuffer; /* Bytes in OUT buffer */ DWORD BytesInINBuffer; /* Bytes in IN buffer */ DWORD BytesInTxFIFO; /* Bytes in TX FIFO */ DWORD BytesInRxFIFO; /* Bytes in RX FIFO */ } GET_BUFFER_STATE, *PGET_BUFFER_STATE; /* Modem Control Operations */ #define UL_MC_OP_SET 0x01 #define UL_MC_OP_BIT_SET 0x02 #define UL_MC_OP_BIT_CLEAR 0x03 #define UL_MC_OP_STATUS 0x04 /* Modem Control Signals */ #define UL_MC_RTS ((DWORD)0x00000001) /* O Read/Write */ #define UL_MC_DTR ((DWORD)0x00000002) /* O Read/Write */ #define UL_MC_DCD ((DWORD)0x00000004) /* I Read Only */ #define UL_MC_RI ((DWORD)0x00000008) /* I Read Only */ #define UL_MC_DSR ((DWORD)0x00000010) /* I Read Only */ #define UL_MC_CTS ((DWORD)0x00000020) /* I Read Only */ #define UL_MC_DELTA_DCD ((DWORD)0x00010000) /* I Read Only */ #define UL_MC_TRAILING_RI_EDGE ((DWORD)0x00020000) /* I Read Only */ #define UL_MC_DELTA_DSR ((DWORD)0x00040000) /* I Read Only */ #define UL_MC_DELTA_CTS ((DWORD)0x00080000) /* I Read Only */ #define UL_MC_INPUT_SIGNALS_CHANGED (UL_MC_DELTA_DCD | UL_MC_TRAILING_RI_EDGE | UL_MC_DELTA_DSR | UL_MC_DELTA_CTS) /* UART Information Struct. */ typedef struct _UART_INFO { DWORD MaxTxFIFOSize; DWORD MaxRxFIFOSize; BOOLEAN PowerManagement; BOOLEAN IndependentRxBaud; DWORD UART_SubType; DWORD UART_Rev; } UART_INFO, *PUART_INFO; /* UART Interrupts Pending */ #define UL_IP_RX_STAT ((DWORD)0x1<<0) #define UL_IP_RX ((DWORD)0x1<<1) #define UL_IP_RXTO ((DWORD)0x1<<2) #define UL_IP_TX ((DWORD)0x1<<3) #define UL_IP_TX_EMPTY ((DWORD)0x1<<4) #define UL_IP_MODEM ((DWORD)0x1<<5) /* GetUartStatus operations */ #define UL_GS_OP_HOLDING_REASONS 0x1 #define UL_GS_OP_LINESTATUS 0x2 /* These are the reasons that the device could be holding. */ /* UART Status */ #define UL_TX_WAITING_FOR_CTS ((DWORD)0x00000001) #define UL_TX_WAITING_FOR_DSR ((DWORD)0x00000002) #define UL_TX_WAITING_FOR_DCD ((DWORD)0x00000004) #define UL_TX_WAITING_FOR_XON ((DWORD)0x00000008) #define UL_TX_WAITING_XOFF_SENT ((DWORD)0x00000010) #define UL_TX_WAITING_ON_BREAK ((DWORD)0x00000020) #define UL_RX_WAITING_FOR_DSR ((DWORD)0x00010000) /* UART Status Errors */ #define UL_US_OVERRUN_ERROR ((DWORD)0x00000001) /* Buffer Overrun Error */ #define UL_US_PARITY_ERROR ((DWORD)0x00000002) /* Parity Error */ #define UL_US_FRAMING_ERROR ((DWORD)0x00000004) /* Framing Error. */ #define UL_US_BREAK_ERROR ((DWORD)0x00000008) /* Break Interrupt. */ #define UL_US_DATA_ERROR ((DWORD)0x00000010) /* Error In Receive FIFO. */ /* Receive Status */ #define UL_RS_SPECIAL_CHAR_DETECTED ((DWORD)0x00000020) /* Detected special char. */ #define UL_RS_BUFFER_OVERRUN ((DWORD)0x00000040) /* IN Buffer Overrun */ /* Immediate Byte Operations */ #define UL_IM_OP_WRITE 0x1 #define UL_IM_OP_CANCEL 0x2 #define UL_IM_OP_STATUS 0x3 #define UL_IM_NO_BYTE_TO_SEND 0x0 /* Byte Does not need to be sent */ #define UL_IM_BYTE_TO_SEND 0x1 /* Byte needs to be sent */ /* Init UART Struct. */ typedef struct _INIT_UART { DWORD UartNumber; /* UART Number. */ PVOID BaseAddress; /* UART Base Address. */ DWORD RegisterStride; /* UART Register Stride */ DWORD ClockFreq; /* UART Clock Frequency in Hz */ } INIT_UART, *PINIT_UART; typedef int ULSTATUS; /* General UART Library status codes */ #define UL_STATUS_SUCCESS 0 #define UL_STATUS_UNSUCCESSFUL -1 #define UL_STATUS_INSUFFICIENT_RESOURCES -2 #define UL_STATUS_INVALID_PARAMETER -3 #define UL_STATUS_SAME_BASE_ADDRESS -4 #define UL_STATUS_TOO_MANY_UARTS_FOR_CHIP -5 // UL_GetUartObject Operations #define UL_OP_GET_NEXT_UART 0x1 #define UL_OP_GET_PREVIOUS_UART 0x2 #define UL_LIB_16C65X_UART 1 #define UL_LIB_16C95X_UART 2 typedef struct _UART_LIB { ULSTATUS (*UL_InitUart_XXXX)(PINIT_UART pInitUart, PUART_OBJECT pFirstUart, PUART_OBJECT *ppUart); void (*UL_DeInitUart_XXXX)(PUART_OBJECT pUart); void (*UL_ResetUart_XXXX)(PUART_OBJECT pUart); ULSTATUS (*UL_VerifyUart_XXXX)(PUART_OBJECT pUart); ULSTATUS (*UL_SetConfig_XXXX)(PUART_OBJECT pUart, PUART_CONFIG pNewUartConfig, DWORD ConfigMask); ULSTATUS (*UL_BufferControl_XXXX)(PUART_OBJECT pUart, PVOID pBufferControl, int Operation, DWORD Flags); ULSTATUS (*UL_ModemControl_XXXX)(PUART_OBJECT pUart, PDWORD pModemSignals, int Operation); DWORD (*UL_IntsPending_XXXX)(PUART_OBJECT *ppUart); void (*UL_GetUartInfo_XXXX)(PUART_OBJECT pUart, PUART_INFO pUartInfo); int (*UL_OutputData_XXXX)(PUART_OBJECT pUart); int (*UL_InputData_XXXX)(PUART_OBJECT pUart, PDWORD pRxStatus); int (*UL_ReadData_XXXX)(PUART_OBJECT pUart, PBYTE pDest, int Size); ULSTATUS (*UL_WriteData_XXXX)(PUART_OBJECT pUart, PBYTE pData, int Size); ULSTATUS (*UL_ImmediateByte_XXXX)(PUART_OBJECT pUart, PBYTE pData, int Operation); ULSTATUS (*UL_GetStatus_XXXX)(PUART_OBJECT pUart, PDWORD pReturnData, int Operation); void (*UL_DumpUartRegs_XXXX)(PUART_OBJECT pUart); void (*UL_SetAppBackPtr_XXXX)(PUART_OBJECT pUart, PVOID pAppBackPtr); PVOID (*UL_GetAppBackPtr_XXXX)(PUART_OBJECT pUart); void (*UL_GetConfig_XXXX)(PUART_OBJECT pUart, PUART_CONFIG pUartConfig); PUART_OBJECT (*UL_GetUartObject_XXXX)(PUART_OBJECT pUart, int Operation); } UART_LIB, *PUART_LIB; /* Prototypes - functions should not be called directly */ void UL_SetAppBackPtr(PUART_OBJECT pUart, PVOID pAppBackPtr); PVOID UL_GetAppBackPtr(PUART_OBJECT pUart); void UL_GetConfig(PUART_OBJECT pUart, PUART_CONFIG pUartConfig); PUART_OBJECT UL_GetUartObject(PUART_OBJECT pUart, int Operation); ULSTATUS UL_InitUartLibrary(PUART_LIB pUartLib, int Library); void UL_DeInitUartLibrary(PUART_LIB pUartLib); /* End of prototypes. */ #endif /* End of UARTLIB.H */