SERIAL.H
Upload User: linklycbj
Upload Date: 2009-11-12
Package Size: 447k
Code Size: 6k
Category:

Windows Develop

Development Platform:

WINDOWS

  1. // serial.h -- Interface to CSerialPort class
  2. // Copyright (C) 1995 by Walter Oney
  3. // All rights reserved
  4. #ifndef SERIAL_H
  5. #define SERIAL_H
  6. #include <vpicd.h>
  7. #ifndef VPORT_H
  8. #error "Include vport.h before serial.h"
  9. #endif
  10. ///////////////////////////////////////////////////////////////////////////////
  11. class CSerialPort : public CPort
  12. {
  13. public:
  14. enum SERIALPORTS
  15. {IER = 1 // interrupt enable register
  16. ,IIDR = 2 // interrupt id register (input)
  17. ,FIFOR = 2 // FIFO control register (output)
  18. ,LCR = 3 // line control register
  19. ,MCR = 4 // modem control register
  20. ,LSR = 5 // line status register
  21. ,MSR = 6 // modem status register
  22. };
  23. enum IERBITS
  24. {IER_MS = 0x08 // modem status interrupt enable
  25. ,IER_RLS = 0x04 // line status interrupt enable
  26. ,IER_THRE = 0x02 // transmit holding register empty interrupt enable
  27. ,IER_RDA = 0x01 // receive data available interrupt enable
  28. };
  29. enum IIDRBITS
  30. {FIFO_E2 = 0x80 // FIFO enable 2
  31. ,FIFO_E1 = 0x40 // FIFO enable 1
  32. ,IIDR_MASK = 0x06 // interrupt ID mask
  33. ,IIDR_PEND = 0x01 // interrupt pending
  34. ,IID_MS = 0 // modem status interrupt
  35. ,IID_THRE = 2 // Tx holding register empty interrupt
  36. ,IID_RDA = 4 // Rx data available interrupt
  37. ,IID_RLS = 6 // line status interrupt
  38. };
  39. enum FIFOBITS
  40. {FIFO_TRIG14 = 0xC0 // Rx int after 14 chars
  41. ,FIFO_TRIG08 = 0x80 //  after 8 chars
  42. ,FIFO_TRIG04 = 0x40 //  after 4 chars
  43. ,FIFO_TRIG01 = 0x00 //  after 1 char
  44. ,FIFO_XRESET = 0x04 // Tx reset
  45. ,FIFO_RRESET = 0x02 // Rx reset
  46. ,FIFO_ENABLE = 0x01 // Enable FIFO
  47. };
  48. enum LCRBITS
  49. {LCR_DLAB = 0x80 // divisor latch enable
  50. ,LCR_BREAK = 0x40 // break
  51. ,LCR_SPAR = 0x20
  52. ,LCR_EVEN = 0x10 // even parity
  53. ,LCR_PARITY = 0x08 // honor parity
  54. ,LCR_STOP = 0x04 // stop bits
  55. ,LCR_WORD = 0x03 // word size - 5
  56. };
  57. enum MCRBITS
  58. {MCR_LOOP = 0x10 // loopback
  59. ,MCR_OUT2 = 0x08 // OUT2 signal
  60. ,MCR_OUT1 = 0x04 // OUT1 signal
  61. ,MCR_RTS = 0x02 // request to send
  62. ,MCR_DTR = 0x01 // data terminal ready
  63. };
  64. enum LSRBITS
  65. {LSR_TSHE = 0x40 // transmitter shift registry empty
  66. ,LSR_THRE = 0x20 // transmit holding register empty
  67. ,LSR_BREAK = 0x10 // break detected
  68. ,LSR_FRAME = 0x08 // framing error
  69. ,LSR_PARITY = 0x04 // parity error
  70. ,LSR_OVERRUN = 0x02 // overrun
  71. ,LSR_DATA = 0x01 // receive data available
  72. };
  73. enum MSRBITS
  74. {MSR_DCD = 0x80 // carrier detect
  75. ,MSR_RI = 0x40 // ring indicate
  76. ,MSR_DSR = 0x20 // data set ready
  77. ,MSR_CTS = 0x10 // clear to send
  78. ,MSR_DDCD = 0x08 // delta DCD
  79. ,MSR_DRI = 0x04 // delta RI
  80. ,MSR_DDSR = 0x02 // delta DSR
  81. ,MSR_DCTS = 0x01 // delta CTS
  82. };
  83. // Bits in m_flags (#defined so we can use them in inline assembler):
  84. #define fUseDSR 0x01
  85. #define fNoFIFO 0x02 // no FIFO on serial chip
  86. #define fFIFOchkd 0x04 // we've checked the FIFO
  87. #define fFIFOpre 0x08 // FIFO was enabled when we started
  88. #define fNoTxFifo 0x10 // no transmit FIFO on chip
  89. #define fEOF 0x20 // EOF character received (same as dcb FEof flag)
  90. #define fTxImmed 0x40 // immediate character pending (same as dcb Ftximmed flag)
  91. #define fFIFOForcedOff 0x80 // FIFO forced off
  92. #define fEFlagsMask 0x1F // flags to preserve when initializing flags
  93. // Bits in m_HSFlags (ditto)
  94. #define XOffPending 0x01 // waiting to send Xoff
  95. #define EnqPending 0x01 //   ENQ
  96. #define EtxPending 0x01 //   ETX
  97. #define HHSDropped 0x02 // hand shaking lines dropped
  98. #define XOnPending 0x04 // waiting to send Xon
  99. #define AckPending 0x04 //   ACK
  100. #define XOffReceived 0x08 // Xoff received (must == fXOffHold)
  101. #define EnqSent 0x08 // ENQ sent
  102. #define EtxSent 0x08 // ETX sent
  103. #define XOffSent 0x10 // XOff sent (must == fXOffSent)
  104. #define EnqReceived 0x10 // ENQ received
  105. #define EtxReceived 0x10 // ETX received
  106. #define HHSDown 0x20 // handshaking lines are down
  107. #define BreakSet 0x40 // output break set (must == LCR_BREAK)
  108. #define HHSAlwaysDown 0x80 // handshaking lines always down
  109. #define HSPending (XOffPending | XOnPending)
  110. #define HSReceived (XOffReceived | HHSDown)
  111. #define HSSent (XOffSent | HHSDropped)
  112. #define CannotXmit (HSPending | HSReceived | BreakSet)
  113. // Attributes
  114. HIRQ m_irqhandle; // virtualized IRQ handle
  115. DWORD m_oldmask; // original mask state of our IRQ
  116. DWORD m_TxFifoTrigger; // # bytes to send to chip at once
  117. DWORD m_QOutMod; // output count modulo XonLim since last ENQ
  118. DWORD m_XOffPoint; // point at which we should send Xoff
  119. WORD m_flags; // port flags
  120. BYTE m_HSFlag; // handshaking flag
  121. BYTE m_HHSLines; // DTR/RTS bits for handshaking
  122. BYTE m_OutHHSLines; // lines that must be high to output
  123. BYTE m_ImmedChar; // char to Tx immediately
  124. BYTE m_RxFifoTrigger; // Rx FIFO control bits
  125. BYTE m_LSRShadow; // LSR at last interrupt
  126. BYTE m_ErrorMask; // error bits to preserve from LSR
  127. BYTE m_RxMask; // mask to strip parity bits from received data
  128. BYTE m_MSRTimeout; // MSR lines subject to timeouts
  129. BYTE m_MSRInfinite; // MSR lines NOT subject to timeouts
  130. // Methods
  131. public:
  132. CSerialPort(char *name, DWORD iobase, DWORD irq, DEVNODE devnode);
  133. virtual ~CSerialPort();
  134. static void HwIntProcThunk();
  135. BOOL HwIntProc();
  136. void MaskIRQ(){VPICD_Physically_Mask(m_irqhandle);}
  137. void UnmaskIRQ(){VPICD_Physically_Unmask(m_irqhandle);}
  138. void ForceOut(char ch);
  139. void SendXon();
  140. void WaitXmitEmpty();
  141. BYTE CheckTimeouts(DWORD value);
  142. // Base-class overrides:
  143. virtual BOOL GetProperties(_COMMPROP* pCommProp);
  144. virtual BOOL GetQueueStatus(_COMSTAT* pComstat);
  145. virtual BOOL GetModemStatus(PDWORD pModemStatus);
  146. virtual BOOL Read(PCHAR buf, DWORD cbRequest, PDWORD pRxCount);
  147. virtual BOOL TransmitChar(CHAR ch);
  148. virtual BOOL Write(PCHAR buf, DWORD cbRequest, PDWORD pTxCount);
  149. // Callout functions:
  150. virtual BOOL cextfcn(DWORD lFunc, DWORD InData, PVOID pOutData);
  151. virtual BOOL inicom(int* pError);
  152. virtual BOOL trmcom();
  153. virtual void BeginSetState();
  154. virtual BOOL CheckState(_DCB* pDCB, DWORD ActionMask);
  155. virtual void EndSetState(DWORD ChangedMask);
  156. virtual void Flush(DWORD qType);
  157. virtual DWORD GetProviderSubType();
  158. virtual void KickTx();
  159. };
  160. #endif // SERIAL_H