⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 uart.h

📁 串口驱动程序
💻 H
字号:
// uart.h - include file for class Uart
//=============================================================================
//
// Compuware Corporation
// NuMega Lab
// 9 Townsend West
// Nashua, NH 03060  USA
//
// Copyright (c) 1998 Compuware Corporation. All Rights Reserved.
// Unpublished - rights reserved under the Copyright laws of the
// United States.
//
//=============================================================================

#include "serdev.h"
#include "shareint.h"
#include <serial.h>
	
class Uart : public SerialDevice
{
	SAFE_DESTRUCTORS
public:

	// Construction
	Uart(
		ULONG Unit,
		INTERFACE_TYPE BusType,
		ULONG BusNumber,
		ULONGLONG PortBase,
		ULONG PortLength,
		ULONG IrqLevel,
		ULONG IrqVector
		);	

	// Destruction

	~Uart(void);

	// helper function for the ctor
	void SetUpInputQueue(void);

	// Dispatchers	

	virtual NTSTATUS Create(KIrp);
	virtual NTSTATUS Close(KIrp);

	LIST_ENTRY	m_ListEntry; 	// for shared interrupt list

	ULONG	m_Unit;

protected:
	// Read

	virtual BOOLEAN SynchronizeReceiverAccess(
		PKSYNCHRONIZE_ROUTINE func,
		PVOID context
		);
	virtual ULONG CopyReceivedData(PUCHAR buffer, ULONG count);

	// Write
	virtual VOID StartWrite(PUCHAR buffer, ULONG count);
	virtual BOOLEAN SynchronizeTransmitterAccess(
						PKSYNCHRONIZE_ROUTINE func,
						PVOID context
						);

	// Event wait support
	virtual BOOLEAN SynchronizeEventAccess(
		PKSYNCHRONIZE_ROUTINE func,
		PVOID context
		);

	// Serial IOCTL Interface
#if NTVERSION > 351
	virtual VOID IoctlGetStatistics(SERIALPERF_STATS& Stats);
	virtual VOID IoctlClearStatistics(void);
#endif
	virtual VOID IoctlGetProperties(SERIAL_COMMPROP& Properties);
	virtual ULONG IoctlGetModemStatus(void);
	virtual VOID IoctlGetCommStatus(SERIAL_STATUS& Status);
	virtual VOID IoctlReset(void);
	virtual VOID IoctlPurge(ULONG PurgeMask);
	virtual VOID IoctlSetBaudRate(SERIAL_BAUD_RATE& BaudRate);
	virtual NTSTATUS IoctlSetHandFlow(SERIAL_HANDFLOW& HandFlow);
	virtual VOID IoctlGetLineControl(SERIAL_LINE_CONTROL& LineControl);
	virtual NTSTATUS IoctlSetLineControl(SERIAL_LINE_CONTROL& LineControl);
	virtual VOID IoctlSetDTR(BOOLEAN On);
	virtual VOID IoctlSetRTS(BOOLEAN On);
	virtual NTSTATUS IoctlSetQueueSize(SERIAL_QUEUE_SIZE& QueueSizes);

	// Hardware Interface functions

	DEVMEMBER_SYNCHCRITSECTION	(Uart, Reset)
	DEVMEMBER_SYNCHCRITSECTION	(Uart, SetBaudRate)
	DEVMEMBER_SYNCHCRITSECTION	(Uart, SetLineControl)
	DEVMEMBER_SYNCHCRITSECTION	(Uart, GetStatistics)
	DEVMEMBER_SYNCHCRITSECTION	(Uart, GetModemStatus)
	DEVMEMBER_SYNCHCRITSECTION	(Uart, ClearStatistics)
	DEVMEMBER_SYNCHCRITSECTION	(Uart, EnableInterrupts)
	DEVMEMBER_SYNCHCRITSECTION	(Uart, DisableInterrupts)
	DEVMEMBER_SYNCHCRITSECTION	(Uart, SetDTR)
	DEVMEMBER_SYNCHCRITSECTION	(Uart, ClearDTR)
	DEVMEMBER_SYNCHCRITSECTION	(Uart, SetRTS)
	DEVMEMBER_SYNCHCRITSECTION	(Uart, ClearRTS)
	DEVMEMBER_SYNCHCRITSECTION	(Uart, SetTransmitHold)
	DEVMEMBER_SYNCHCRITSECTION	(Uart, SynchStartWrite)

	static BOOLEAN MasterIsr(PKINTERRUPT Interrupt, PVOID ServiceContext);
	VOID SetTransmitHoldMask(void);
	BOOLEAN Isr(void);

	// Mapped I/O addresses

	KIoRange	m_IoSpace;
	KIoRegister m_PortRxData;
	KIoRegister m_PortTxData;
	KIoRegister m_PortIntrEnable;
	KIoRegister m_PortIntrIdent;
	KIoRegister m_PortFifoControl;
	KIoRegister m_PortLineControl;
	KIoRegister m_PortModemControl;
	KIoRegister m_PortLineStatus;
	KIoRegister m_PortModemStatus;
	KIoRegister m_PortDivisorLatchLsb;
	KIoRegister m_PortDivisorLatchMsb;

	// The interrupt for this Uart

	SharedInterrupt* m_Interrupt;

	// Buffer for data received when no read is active

	KInterruptSafeFifo<UCHAR>* m_ReceiveDataQueue;

	UCHAR	m_TransmitHold;	
	UCHAR	m_TransmitHoldMask;

	ULONG	m_80pcThreshold;
	BOOLEAN m_FifoPresent;
	UCHAR	m_RxFifoTrigger;
	UCHAR	m_LineStatus;
	UCHAR	m_ModemStatus;

	NTSTATUS InitializeInterrupt(
		INTERFACE_TYPE BusType,
		ULONG BusNumber,
		ULONG IrqLevel,
		ULONG IrqVector
		);

	BOOLEAN Synch(
		PKSYNCHRONIZE_ROUTINE SynchRoutine,
		PVOID context=NULL
		)
	{
		if (m_Interrupt && (PKINTERRUPT)*m_Interrupt->m_Interrupt)
			return SynchronizeInterrupt(
				m_Interrupt->m_Interrupt, 
				SynchRoutine,
				context
				);
		else
		{
			if (context == NULL)
				context = this;
			return SynchRoutine(context);
		}
	}
};

//  Constants

#define RECEIVE_BUFFER_SIZE	4096

////////////////////////////////////////////////////////////////////
// Defaults

#define DEFAULT_BAUD_RATE		1200
#define DEFAULT_LINE_CONTROL	\
	(SERIAL_DATA_LENGTH_7 | SERIAL_1_STOP | SERIAL_EVEN_PARITY)
#define DEFAULT_MODEM_CONTROL	\
	(SERIAL_MCR_DTR | SERIAL_MCR_RTS | SERIAL_MCR_OUT2)
#define DEFAULT_FIFO_CONTROL 	SERIAL_FCR_DISABLE

#define DEFAULT_HANDSHAKE 	SERIAL_DTR_CONTROL
#define DEFAULT_FLOWREPLACE	SERIAL_RTS_CONTROL

////////////////////////////////////////////////////////////////////

#define SUPPORTED_EVENTS ((ULONG)( \
	SERIAL_EV_RXCHAR   | \
	SERIAL_EV_RXFLAG   | \
	SERIAL_EV_TXEMPTY  | \
	SERIAL_EV_CTS	   | \
	SERIAL_EV_DSR      | \
	SERIAL_EV_RXFLAG   | \
	SERIAL_EV_RING	   | \
	SERIAL_EV_ERR      | \
	SERIAL_EV_RX80FULL | \
	SERIAL_EV_RLSD	   ))

#define SERIAL_LSR_ERRORS (SERIAL_LSR_PE|SERIAL_LSR_FE|SERIAL_LSR_OE)

#define SERIAL_IIR_MASK ( \
	SERIAL_IIR_CTI|	\
	SERIAL_IIR_RLS|	\
	SERIAL_IIR_RDA|	\
	SERIAL_IIR_THR|	\
	SERIAL_IIR_MS)

#define MAX_READ_PER_INTR 32

#define SERIAL_FCR_RESET_ENABLE 0x87

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -