📄 ser16552.c
字号:
ULONG BaudRate // @parm ULONG representing decimal baud rate.
)
{
BOOL fRet;
PSER16550_INFO pHWHead = (PSER16550_INFO)pHead;
RETAILMSG(QYDEBUG,
(TEXT("+SL_SetbaudRate 0x%X, 0x%X,0x%x\r\n"), pHead, BaudRate,pHWHead->pData));
try {
// Enter critical section before calling function, since
// we can't make sys calls inside SetBaudRate
EnterCriticalSection(&(pHWHead->RegCritSec));
fRet = SetBaudRateq(pHead, BaudRate);
LeaveCriticalSection(&(pHWHead->RegCritSec));
}except (GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ?
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
return( FALSE );
}
if ( fRet ) {
pHWHead->dcb.BaudRate = BaudRate;
RETAILMSG(QYDEBUG,
(TEXT("-SL_SetbaudRate 0x%X (%d Baud)\r\n"),
pHead, BaudRate));
return( TRUE );
} else {
DEBUGMSG (ZONE_FUNCTION | ZONE_ERROR,
(TEXT("-SL_SetbaudRate - Error setting %d, failing to %d\r\n"),
BaudRate, pHWHead->dcb.BaudRate) );
return( FALSE );
}
}
BOOL
SL_SetByteSizeq(
PVOID pHead, // @parm PVOID returned by HWInit
ULONG ByteSize // @parm ULONG ByteSize field from DCB.
)
{
PSER16550_INFO pHWHead = (PSER16550_INFO)pHead;
UINT8 lcr;
BOOL bRet;
RETAILMSG(QYDEBUG,
(TEXT("+SL_SetByteSize 0x%X, x%X\r\n"), pHead, ByteSize));
bRet = TRUE;
EnterCriticalSection(&(pHWHead->RegCritSec));
try {
lcr = INB(pHWHead, pLCR);
RETAILMSG(QYDEBUG,(TEXT("SER16550 Register LCR=0x%x\r\n"),INB(pHWHead, pLCR)));
lcr &= ~SERIAL_DATA_MASK;
RETAILMSG(QYDEBUG,(TEXT("SERIAL3 DATA LENGTH =%d\r\n "),ByteSize));
switch ( ByteSize ) {
case 5:
lcr |= SERIAL_5_DATA;
break;
case 6:
lcr |= SERIAL_6_DATA;
break;
case 7:
lcr |= SERIAL_7_DATA;
break;
case 8:
lcr |= SERIAL_8_DATA;
break;
default:
bRet = FALSE;
break;
}
if (bRet) {
OUTB(pHWHead, pLCR, lcr);
RETAILMSG(QYDEBUG,(TEXT("SER16550 Register LCR=0x%x\r\n"),lcr));
}
}
except (GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ?
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
bRet = FALSE;
}
LeaveCriticalSection(&(pHWHead->RegCritSec));
RETAILMSG(QYDEBUG,
(TEXT("-SL_SetByteSize 0x%X\r\n"), pHead));
return(bRet);
}
VOID
SL_ClearDTRq(
PVOID pHead // @parm PVOID returned by HWinit.
)
{
PSER16550_INFO pHWHead = (PSER16550_INFO)pHead;
RETAILMSG(QYDEBUG, (TEXT("+SL_ClearDTR, 0x%X\r\n"), pHead));
EnterCriticalSection(&(pHWHead->RegCritSec));
try {
unsigned char byte;
byte = INB(((PSER16550_INFO)pHead), pMCR);
OUTB(((PSER16550_INFO)pHead), pMCR, byte & ~SERIAL_MCR_DTR);
}
except (GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ?
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
// Just exit
}
LeaveCriticalSection(&(pHWHead->RegCritSec));
RETAILMSG(QYDEBUG, (TEXT("-SL_ClearDTR, 0x%X\r\n"), pHead));
}
VOID
SL_SetDTRq(
PVOID pHead // @parm PVOID returned by HWinit.
)
{
PSER16550_INFO pHWHead = (PSER16550_INFO)pHead;
RETAILMSG(QYDEBUG, (TEXT("+SL_SetDTR, 0x%X\r\n"), pHead));
EnterCriticalSection(&(pHWHead->RegCritSec));
try {
unsigned char byte;
byte = INB(((PSER16550_INFO)pHead), pMCR);
OUTB(((PSER16550_INFO)pHead), pMCR, byte |SERIAL_MCR_DTR);
}
except (GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ?
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
// Just exit
}
LeaveCriticalSection(&(pHWHead->RegCritSec));
RETAILMSG(QYDEBUG, (TEXT("-SL_SetDTR, 0x%X\r\n"), pHead));
}
VOID
SL_ClearRTSq(
PVOID pHead // @parm PVOID returned by HWinit.
)
{
PSER16550_INFO pHWHead = (PSER16550_INFO)pHead;
RETAILMSG(QYDEBUG, (TEXT("+SL_ClearRTS, 0x%X\r\n"), pHead));
EnterCriticalSection(&(pHWHead->RegCritSec));
try {
unsigned char byte;
byte = INB(((PSER16550_INFO)pHead), pMCR);
OUTB(((PSER16550_INFO)pHead), pMCR, byte & ~SERIAL_MCR_RTS);
}
except (GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ?
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
// Just exit
}
LeaveCriticalSection(&(pHWHead->RegCritSec));
RETAILMSG(QYDEBUG, (TEXT("-SL_ClearRTS, 0x%X\r\n"), pHead));
}
VOID
SL_SetRTSq(
PVOID pHead // @parm PVOID returned by HWinit.
)
{
PSER16550_INFO pHWHead = (PSER16550_INFO)pHead;
RETAILMSG(QYDEBUG, (TEXT("+SL_SetRTS, 0x%X\r\n"), pHead));
EnterCriticalSection(&(pHWHead->RegCritSec));
try {
unsigned char byte;
byte = INB(((PSER16550_INFO)pHead), pMCR);
OUTB(((PSER16550_INFO)pHead), pMCR, byte | SERIAL_MCR_RTS);
}
except (GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ?
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
// Just exit
}
LeaveCriticalSection(&(pHWHead->RegCritSec));
RETAILMSG(QYDEBUG, (TEXT("-SL_SetRTS, 0x%X\r\n"), pHead));
}
VOID
SL_GetModemStatusq(
PVOID pHead, // @parm PVOID returned by HWInit.
PULONG pModemStatus // @parm PULONG passed in by user.
)
{
PSER16550_INFO pHWHead = (PSER16550_INFO)pHead;
ULONG ubModemStatus;
RETAILMSG(QYDEBUG,(TEXT("SL_GetModemStatusq start\r\n")));
RETAILMSG(QYDEBUG,
(TEXT("+SL_GetModemStatus 0x%X\r\n"), pHead));
ReadMSRq( pHWHead );
ubModemStatus = pHWHead->MSR;
if ( ubModemStatus & SERIAL_MSR_CTS )
*pModemStatus |= MS_CTS_ON;
if ( ubModemStatus & SERIAL_MSR_DSR )
*pModemStatus |= MS_DSR_ON;
if ( ubModemStatus & SERIAL_MSR_RI )
*pModemStatus |= MS_RING_ON;
if ( ubModemStatus & SERIAL_MSR_DCD )
*pModemStatus |= MS_RLSD_ON;
DEBUGMSG (ZONE_FUNCTION | ZONE_EVENTS,
(TEXT("-SL_GetModemStatus 0x%X (stat x%X) \r\n"), pHead, *pModemStatus));
RETAILMSG(QYDEBUG,(TEXT("SL_GetModemStatusq end\r\n")));
return;
}
VOID
SL_OtherIntrq(
PVOID pHead // Hardware Head
)
{
PSER16550_INFO pHWHead = (PSER16550_INFO)pHead;
RETAILMSG(QYDEBUG,
(TEXT("+SL_OtherIntr 0x%X\r\n"), pHead));
//RETAILMSG(QYDEBUG,(TEXT("SL_OtherIntrq start\r\n")));
ReadMSRq( pHWHead );
EnterCriticalSection(&(pHWHead->RegCritSec));
try {
// If we are currently flowed off via CTS or DSR, then
// we better signal the TX thread when one of them changes
// so that TX can resume sending.
if ( pHWHead->DSRFlowOff && (pHWHead->MSR & SERIAL_MSR_DSR) ) {
DEBUGMSG (ZONE_WRITE|ZONE_FLOW,
(TEXT("PutBytes, flowed on via DSR\n") ) );
pHWHead->DSRFlowOff = FALSE;
// DSR is set, so go ahead and resume sending
OUTB(pHWHead, pIER, IER_NORMAL_INTS | SERIAL_IER_THR); // Enable xmit intr.//0x0f
RETAILMSG(QYDEBUG,(TEXT("SL_OtherIntrq::SER16550 Register IER(0x0f) =0X%x\r\n"),INB(pHWHead,pIER)));
// Then simulate a TX intr to get things moving
pHWHead->AddTXIntr = TRUE;
}
if ( pHWHead->CTSFlowOff && (pHWHead->MSR & SERIAL_MSR_CTS) ) {
DEBUGMSG (ZONE_WRITE|ZONE_FLOW,
(TEXT("PutBytes, flowed on via CTS\n") ) );
pHWHead->CTSFlowOff = FALSE;
// CTS is set, so go ahead and resume sending
OUTB(pHWHead, pIER, IER_NORMAL_INTS | SERIAL_IER_THR); // Enable xmit intr.
RETAILMSG(QYDEBUG,(TEXT("SL_OtherIntrq::SER16550 Register IER(0x0f) =0X%x\r\n"),INB(pHWHead,pIER)));
// Then simulate a TX intr to get things moving
pHWHead->AddTXIntr = TRUE;
}
}
except (GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ?
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
// Just exit
}
LeaveCriticalSection(&(pHWHead->RegCritSec));
RETAILMSG(QYDEBUG,
(TEXT("-SL_OtherIntr 0x%X\r\n"), pHead));
}
BOOL
SL_SetParityq(
PVOID pHead, // @parm PVOID returned by HWInit
ULONG Parity // @parm ULONG parity field from DCB.
)
{
PSER16550_INFO pHWHead = (PSER16550_INFO)pHead;
UINT8 lcr;
BOOL bRet;
RETAILMSG(QYDEBUG,
(TEXT("+SL_SetParity 0x%X, x%X\r\n"), pHead, Parity));
bRet = TRUE;
EnterCriticalSection(&(pHWHead->RegCritSec));
try {
lcr = INB(pHWHead, pLCR);
RETAILMSG(QYDEBUG,(TEXT("SER16550 Register LCR=0x%x\r\n"),lcr));
lcr &= ~SERIAL_PARITY_MASK;
RETAILMSG(QYDEBUG,(TEXT("SERIAL3 PARITY =%d\r\n"),Parity));
switch ( Parity ) {
case ODDPARITY:
lcr |= SERIAL_ODD_PARITY;
break;
case EVENPARITY:
lcr |= SERIAL_EVEN_PARITY;
break;
case MARKPARITY:
lcr |= SERIAL_MARK_PARITY;
break;
case SPACEPARITY:
lcr |= SERIAL_SPACE_PARITY;
break;
case NOPARITY:
lcr |= SERIAL_NONE_PARITY;
break;
default:
bRet = FALSE;
break;
}
if (bRet) {
OUTB(pHWHead, pLCR, lcr);
RETAILMSG(QYDEBUG,(TEXT("SER16550 Register LCR=0x%x\r\n"),INB(pHWHead, pLCR)));
}
}
except (GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ?
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
bRet = FALSE;
}
LeaveCriticalSection(&(pHWHead->RegCritSec));
RETAILMSG(QYDEBUG,
(TEXT("-SL_SetParity 0x%X\r\n"), pHead));
return(bRet);
}
BOOL
SL_SetStopBitsq(
PVOID pHead, // @parm PVOID returned by HWInit
ULONG StopBits // @parm ULONG StopBits field from DCB.
)
{
PSER16550_INFO pHWHead = (PSER16550_INFO)pHead;
UINT8 lcr;
BOOL bRet;
RETAILMSG(QYDEBUG,
(TEXT("+SL_SetStopBits 0x%X, x%X\r\n"), pHead, StopBits));
bRet = TRUE;
EnterCriticalSection(&(pHWHead->RegCritSec));
lcr = INB(pHWHead, pLCR);
RETAILMSG(QYDEBUG,(TEXT("SERIAL3 Register LCR=0x%x \r\n"),lcr));
lcr &= ~SERIAL_STOP_MASK;
RETAILMSG(QYDEBUG,(TEXT("SERIAL3 STOP BIT =%d\r\n"),StopBits));
try {
// Note that 1.5 stop bits only works if the word size
// is 5 bits. Any other xmit word size will cause the
// 1.5 stop bit setting to generate 2 stop bits.
switch ( StopBits ) {
case ONESTOPBIT :
lcr |= SERIAL_1_STOP ;
break;
case ONE5STOPBITS :
lcr |= SERIAL_1_5_STOP ;
break;
case TWOSTOPBITS :
lcr |= SERIAL_2_STOP ;
break;
default:
bRet = FALSE;
break;
}
if (bRet) {
OUTB(pHWHead, pLCR, lcr);
}
}
except (GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ?
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
bRet = FALSE;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -