📄 bvd_ser16550.c
字号:
}
}
except (GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ?
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
// Just exit
}
LeaveCriticalSection(&(pHWHead->RegCritSec));
DEBUGMSG (ZONE_FUNCTION, (TEXT("-HW_XSC1_ClearDTR, 0x%X\r\n"), pHead));
}
//
// @doc OEM
// @func VOID | HW_XSC1_SetDTR | This routine sets DTR.
//
// @rdesc None.
//
VOID
HW_XSC1_SetDTR(
PVOID pHead // @parm PVOID returned by HWinit.
)
{
PSER16550_INFO pHWHead = (PSER16550_INFO)pHead;
DEBUGMSG (ZONE_FUNCTION, (TEXT("+HW_XSC1_SetDTR, 0x%X\r\n"), pHead));
EnterCriticalSection(&(pHWHead->RegCritSec));
try {
ULONG value;
if (pHWHead->IOBase == FFUART_BASE_U_VIRTUAL)
{
value = INB((PSER16550_INFO)pHead, pMCR);
pHWHead->MCR |= SERIAL_MCR_DTR;
OUTB((PSER16550_INFO)pHead, pMCR, value | SERIAL_MCR_DTR);
}
else if (pHWHead->IOBase == BTUART_BASE_U_VIRTUAL)
{
//DEBUGMSG (1,(TEXT("**************HW_XSC1_ClearDTR %X\r\n"),pHWHead->MSR));
}
}
except (GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ?
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
// Just exit
}
LeaveCriticalSection(&(pHWHead->RegCritSec));
DEBUGMSG (ZONE_FUNCTION, (TEXT("-HW_XSC1_SetDTR, 0x%X\r\n"), pHead));
}
//
// @doc OEM
// @func VOID | HW_XSC1_ClearRTS | This routine clears RTS.
//
// @rdesc None.
//
VOID
HW_XSC1_ClearRTS(
PVOID pHead // @parm PVOID returned by HWinit.
)
{
PSER16550_INFO pHWHead = (PSER16550_INFO)pHead;
DEBUGMSG (ZONE_FUNCTION, (TEXT("+HW_XSC1_ClearRTS, 0x%X\r\n"), pHead));
EnterCriticalSection(&(pHWHead->RegCritSec));
try {
ULONG value;
value = INB((PSER16550_INFO)pHead, pMCR);
pHWHead->MCR &= ~SERIAL_MCR_RTS;
OUTB((PSER16550_INFO)pHead, pMCR, value & ~SERIAL_MCR_RTS);
}
except (GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ?
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
// Just exit
}
LeaveCriticalSection(&(pHWHead->RegCritSec));
DEBUGMSG (ZONE_FUNCTION, (TEXT("-HW_XSC1_ClearRTS, 0x%X\r\n"), pHead));
}
//
// @doc OEM
// @func VOID | HW_XSC1_SetRTS | This routine sets RTS.
//
// @rdesc None.
//
VOID
HW_XSC1_SetRTS(
PVOID pHead // @parm PVOID returned by HWinit.
)
{
PSER16550_INFO pHWHead = (PSER16550_INFO)pHead;
DEBUGMSG (ZONE_FUNCTION, (TEXT("+HW_XSC1_SetRTS, 0x%X\r\n"), pHead));
EnterCriticalSection(&(pHWHead->RegCritSec));
try {
ULONG value;
value = INB((PSER16550_INFO)pHead, pMCR);
pHWHead->MCR |= SERIAL_MCR_RTS;
OUTB((PSER16550_INFO)pHead, pMCR, value | SERIAL_MCR_RTS);
}
except (GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ?
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
// Just exit
}
LeaveCriticalSection(&(pHWHead->RegCritSec));
DEBUGMSG (ZONE_FUNCTION, (TEXT("-HW_XSC1_SetRTS, 0x%X\r\n"), pHead));
}
//
// @doc OEM
// @func VOID | HW_XSC1_ClearBreak | This routine clears break.
//
// @rdesc None.
//
VOID
HW_XSC1_ClearBreak(
PVOID pHead // @parm PVOID returned by HWinit.
)
{
PSER16550_INFO pHWHead = (PSER16550_INFO)pHead;
DEBUGMSG (ZONE_FUNCTION, (TEXT("+HW_XSC1_ClearBreak, 0x%X\r\n"), pHead));
EnterCriticalSection(&(pHWHead->RegCritSec));
try {
ULONG value;
value = INB((PSER16550_INFO)pHead, pLCR);
OUTB((PSER16550_INFO)pHead, pLCR, value & ~SERIAL_LCR_BREAK);
}
except (GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ?
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
// Just exit
}
LeaveCriticalSection(&(pHWHead->RegCritSec));
DEBUGMSG (ZONE_FUNCTION, (TEXT("-HW_XSC1_ClearBreak, 0x%X\r\n"), pHead));
}
//
// @doc OEM
// @func VOID | HW_XSC1_SetBreak | This routine sets break.
//
// @rdesc None.
//
VOID
HW_XSC1_SetBreak(
PVOID pHead // @parm PVOID returned by HWinit.
)
{
PSER16550_INFO pHWHead = (PSER16550_INFO)pHead;
DEBUGMSG (ZONE_FUNCTION, (TEXT("+HW_XSC1_SetBreak, 0x%X\r\n"), pHead));
EnterCriticalSection(&(pHWHead->RegCritSec));
try {
ULONG value;
value = INB((PSER16550_INFO)pHead, pLCR);
OUTB((PSER16550_INFO)pHead, pLCR, value | SERIAL_LCR_BREAK);
}
except (GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ?
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
// Just exit
}
LeaveCriticalSection(&(pHWHead->RegCritSec));
DEBUGMSG (ZONE_FUNCTION, (TEXT("-HW_XSC1_SetBreak, 0x%X\r\n"), pHead));
}
//
// XSC1_SER16550_SetBaudRate
//
// Internal function. The only real reason for splitting this out
// is so that we can call it from PowerOn and still allow HW_XSC1_SetBaud
// to do debug messages, acquire critical sections, etc.
//
BOOL
XSC1_SER16550_SetBaudRate(
PVOID pHead,
ULONG BaudRate
)
{
PSER16550_INFO pHWHead = (PSER16550_INFO)pHead;
USHORT divisor;
ULONG lcr;
// **** Warning ***** Make no system calls, called in power context
divisor = HW_XSC1_DivisorOfRate(pHead, BaudRate);
if ( divisor ) {
HW_XSC1_DisableTxRx(pHead);
lcr = INB(pHWHead, pLCR);
OUTB(pHWHead, pLCR, lcr | SERIAL_LCR_DLAB);
OUTB(pHWHead, pTHR_RBR_DLL, divisor & 0xff); //pTHR_RBR_DLL is DivLatch Lo
OUTB(pHWHead, pIER_DLH, (divisor >> 8) & 0xff); //pIER_DLH is DivLatch Hi
OUTB(pHWHead, pLCR, lcr);
HW_XSC1_EnableTxRx(pHead);
return( TRUE );
} else {
return( FALSE );
}
}
//
// @doc OEM
// @func BOOL | HW_XSC1_SetBaudRate |
// This routine sets the baud rate of the device.
//
// @rdesc None.
//
BOOL
HW_XSC1_SetBaudRate(
PVOID pHead, // @parm PVOID returned by HWInit
ULONG BaudRate // @parm ULONG representing decimal baud rate.
)
{
BOOL fRet;
PSER16550_INFO pHWHead = (PSER16550_INFO)pHead;
DEBUGMSG (ZONE_FUNCTION,
(TEXT("+HW_XSC1_SetbaudRate 0x%X, x%X\r\n"), pHead, BaudRate));
// DEBUGMSG (1,
// (TEXT("????????????????+HW_XSC1_SetbaudRate 0x%X, x%X\r\n"), pHead, BaudRate));
try {
// Enter critical section before calling function, since
// we can't make sys calls inside SetBaudRate
EnterCriticalSection(&(pHWHead->RegCritSec));
fRet = XSC1_SER16550_SetBaudRate(pHead, BaudRate);
LeaveCriticalSection(&(pHWHead->RegCritSec));
}except (GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ?
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
return( FALSE );
}
if ( fRet ) {
pHWHead->dcb.BaudRate = BaudRate;
DEBUGMSG (ZONE_FUNCTION,
(TEXT("-HW_XSC1_SetbaudRate 0x%X (%d Baud)\r\n"),
pHead, BaudRate));
return( TRUE );
} else {
DEBUGMSG (ZONE_FUNCTION | ZONE_ERROR,
(TEXT("-HW_XSC1_SetbaudRate - Error setting %d, failing to %d\r\n"),
BaudRate, pHWHead->dcb.BaudRate) );
return( FALSE );
}
}
//
// @doc OEM
// @func BOOL | HW_XSC1_SetByteSize |
// This routine sets the WordSize of the device.
//
// @rdesc None.
//
BOOL
HW_XSC1_SetByteSize(
PVOID pHead, // @parm PVOID returned by HWInit
ULONG ByteSize // @parm ULONG ByteSize field from DCB.
)
{
PSER16550_INFO pHWHead = (PSER16550_INFO)pHead;
ULONG lcr;
BOOL bRet;
DEBUGMSG (ZONE_FUNCTION,
(TEXT("+HW_XSC1_SetByteSize 0x%X, x%X\r\n"), pHead, ByteSize));
// DEBUGMSG (1, (TEXT("?????????????????+HW_XSC1_SetByteSize 0x%X, x%X\r\n"), pHead, ByteSize));
bRet = TRUE;
EnterCriticalSection(&(pHWHead->RegCritSec));
try {
HW_XSC1_DisableTxRx(pHead);
lcr = INB(pHWHead, pLCR);
lcr &= ~SERIAL_DATA_MASK;
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);
}
HW_XSC1_EnableTxRx(pHead);
}
except (GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ?
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
bRet = FALSE;
}
LeaveCriticalSection(&(pHWHead->RegCritSec));
DEBUGMSG (ZONE_FUNCTION,
(TEXT("-HW_XSC1_SetByteSize 0x%X\r\n"), pHead));
return(bRet);
}
//
// @doc OEM
// @func BOOL | HW_XSC1_SetParity |
// This routine sets the parity of the device.
//
// @rdesc None.
//
BOOL
HW_XSC1_SetParity(
PVOID pHead, // @parm PVOID returned by HWInit
ULONG Parity // @parm ULONG parity field from DCB.
)
{
PSER16550_INFO pHWHead = (PSER16550_INFO)pHead;
ULONG lcr;
BOOL bRet;
DEBUGMSG (ZONE_FUNCTION,
(TEXT("+HW_XSC1_SetParity 0x%X, x%X\r\n"), pHead, Parity));
// DEBUGMSG (1, (TEXT("??????????????????+HW_XSC1_SetParity 0x%X, x%X\r\n"), pHead, Parity));
bRet = TRUE;
EnterCriticalSection(&(pHWHead->RegCritSec));
try {
HW_XSC1_DisableTxRx(pHead);
lcr = INB(pHWHead, pLCR);
lcr &= ~SERIAL_PARITY_MASK;
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);
}
HW_XSC1_EnableTxRx(pHead);
}
except (GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ?
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
bRet = FALSE;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -