📄 ser16552.c.bak
字号:
try {
OUTB(pHWHead, pIER, (UCHAR)IER_NORMAL_INTS);
OUTB(pHWHead, pMCR, 0x2b);// AFC=1,DTR=1,RTS=1
// Set default framing bits.
OUTB(pHWHead, pLCR, SERIAL_8_DATA | SERIAL_1_STOP | SERIAL_NONE_PARITY);
RETAILMSG(QYDEBUG,(TEXT("SERIAL3 Register LCR(0x03)=0x%x\r\n "),INB(pHWHead, pLCR)));
// Get defaults from the DCB structure
//设置波特率,默认9600
SL_SetBaudRateq( pHead, pHWHead->dcb.BaudRate );
SL_SetByteSizeq( pHead, pHWHead->dcb.ByteSize );
SL_SetStopBitsq( pHead, pHWHead->dcb.StopBits );
SL_SetParityq( pHead, pHWHead->dcb.Parity );
//
// A 16450 (which is pretty much a FIFO-less 16550) can be supported by
// not initializing the FIFO.
//
if (pHWHead->ChipID == CHIP_ID_16550) {
// Set up to use 16550 fifo for 14 byte interrupt granularity.
// Shadow the FCR bitmask since reading this location is the IIR
pHWHead->FCR = 0;
OUTB(pHWHead, pIIR_FCR, (pHWHead->FCR | SERIAL_FCR_RCVR_RESET | SERIAL_FCR_TXMT_RESET) );
}
// MDD and calls post init.
SL_PostInitq(pHWHead);
ReadMSRq(pHWHead);
ReadLSRq(pHWHead);
#ifdef DEBUG
if ( ZONE_INIT )
DumpSerialRegistersq(pHWHead);
#endif
}
except (GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ?
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
// Just get out of here.
}
LeaveCriticalSection(&(pHWHead->RegCritSec));
DEBUGMSG (ZONE_OPEN,
(TEXT("-SL_Open 0x%X, IIR 0x%X\r\n"), pHead, pHWHead->IIR));
RETAILMSG(QYDEBUG,(TEXT("-SL_Openq() END \r\n")));//=====QM:0419
}
VOID
SL_Closeq(
PVOID pHead // @parm PVOID returned by HWinit.
)
{
PSER16550_INFO pHWHead = (PSER16550_INFO)pHead;
RETAILMSG(QYDEBUG,
(TEXT("+SL_Close 0x%X\r\n"), pHead));
if ( pHWHead->OpenCount )
pHWHead->OpenCount--;
EnterCriticalSection(&(pHWHead->RegCritSec));
try {
// Disable all interrupts and clear MCR.
// OUTB(pHWHead, pIER, (UCHAR)0);
// OUTB(pHWHead, pMCR, (UCHAR)0);
//****
OUTB(pHWHead, pIER, (UCHAR)0x01);
OUTB(pHWHead, pMCR, (UCHAR)0x2B);
pHWHead->IIR = INB(pHWHead, pIIR_FCR);
}
except (GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ?
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
// Just get out of here.
}
LeaveCriticalSection(&(pHWHead->RegCritSec));
RETAILMSG(QYDEBUG,
(TEXT("-SL_Close 0x%X\r\n"), pHead));
}
VOID
SL_Initq(
PVOID pHead, // @parm points to device head
PUCHAR pRegBase, // Pointer to 16550 register base
UINT8 RegStride, // Stride amongst the 16550 registers
EVENT_FUNC EventCallback, // This callback exists in MDD
PVOID pMddHead, // This is the first parm to callback
PLOOKUP_TBL pBaudTable // BaudRate Table
)
{
PSER16550_INFO pHWHead = (PSER16550_INFO)pHead;
RETAILMSG(QYDEBUG,(TEXT("+SL_Initq, 0x%X\r\n"), pHWHead));
RETAILMSG(QYDEBUG,(TEXT("+SL_Initq, 0x%X\r\n"), pHead));
// Set up pointers to 16550 registers
pHWHead->pData = pRegBase + (RegStride * RECEIVE_BUFFER_REGISTER);
pHWHead->pIER = pRegBase + (RegStride * INTERRUPT_ENABLE_REGISTER);
pHWHead->pIIR_FCR = pRegBase + (RegStride * INTERRUPT_IDENT_REGISTER);
pHWHead->pLCR = pRegBase + (RegStride * LINE_CONTROL_REGISTER);
pHWHead->pMCR = pRegBase + (RegStride * MODEM_CONTROL_REGISTER);
pHWHead->pLSR = pRegBase + (RegStride * LINE_STATUS_REGISTER);
pHWHead->pMSR = pRegBase + (RegStride * MODEM_STATUS_REGISTER);
pHWHead->pScratch = pRegBase + (RegStride * SCRATCH_REGISTER);
// if (!SerMapRegisterAddresses3())
RETAILMSG(QYDEBUG,(TEXT("SERIAL4 REGSTRIDE = %d\r\n"),RegStride));
// Store info for callback function
pHWHead->EventCallback = EventCallback;
pHWHead->pMddHead = pMddHead;
// Now set up remaining fields
if ( pBaudTable != NULL ){
pHWHead->pBaudTable = (LOOKUP_TBL *) pBaudTable;
RETAILMSG(QYDEBUG,(TEXT("pBaudTable != NULL 0x%X\r\n")));
}
else
pHWHead->pBaudTable = (LOOKUP_TBL *) &SER_BaudTable;
pHWHead->FlushDone = CreateEvent(0, FALSE, FALSE, NULL);
pHWHead->OpenCount = 0;
RETAILMSG(QYDEBUG,(TEXT("OpenCount 0x%X\r\n")));
// Don't allow any interrupts till PostInit.
OUTB(pHWHead, pIER, (UCHAR)0);
//****
OUTB(pHWHead, pIER, (UCHAR)IER_NORMAL_INTS);
OUTB(pHWHead, pMCR, 0x2b);// MAX3244
InitializeCriticalSection(&(pHWHead->TransmitCritSec));
InitializeCriticalSection(&(pHWHead->RegCritSec));
// Clear any interrupts which may be pending. Normally only
// happens if we were warm reset.
ClearPendingIntsq( pHWHead );
RETAILMSG(QYDEBUG,(TEXT("-SL_INITq, 0x%X\r\n"), pHWHead));
}
BOOL
SL_PostInitq(
PVOID pHead // @parm PVOID returned by HWinit.
)
{
PSER16550_INFO pHWHead = (PSER16550_INFO)pHead;
RETAILMSG(QYDEBUG,(TEXT("+SL_PostInit, 0x%X\r\n"), pHWHead));
// Since we are just a library which might get used for
// builtin ports which init at boot, or by PCMCIA ports
// which init at Open, we can't do anything too fancy.
// Lets just make sure we cancel any pending interrupts so
// that if we are being used with an edge triggered PIC, he
// will see an edge after the MDD hooks the interrupt.
//清除全部中断标志和中断源
ClearPendingIntsq( pHWHead );
RETAILMSG(QYDEBUG,(TEXT("-SL_PostInit, 0x%X\r\n"), pHWHead));
return(TRUE);
}
VOID
SL_ClearBreakq(
PVOID pHead // @parm PVOID returned by HWinit.
)
{
PSER16550_INFO pHWHead = (PSER16550_INFO)pHead;
RETAILMSG(QYDEBUG, (TEXT("+SL_ClearBreak, 0x%X\r\n"), pHead));
EnterCriticalSection(&(pHWHead->RegCritSec));
try {
unsigned char byte;
byte = INB(((PSER16550_INFO)pHead), pLCR);
OUTB(((PSER16550_INFO)pHead), pLCR, byte & ~SERIAL_LCR_BREAK);
}
except (GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ?
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
// Just exit
}
LeaveCriticalSection(&(pHWHead->RegCritSec));
RETAILMSG(QYDEBUG, (TEXT("-SL_ClearBreak, 0x%X\r\n"), pHead));
}
VOID
SL_SetBreakq(
PVOID pHead // @parm PVOID returned by HWinit.
)
{
PSER16550_INFO pHWHead = (PSER16550_INFO)pHead;
RETAILMSG(QYDEBUG, (TEXT("+SL_SetBreak, 0x%X\r\n"), pHead));
EnterCriticalSection(&(pHWHead->RegCritSec));
try {
unsigned char byte;
byte = INB(((PSER16550_INFO)pHead), pLCR);
OUTB(((PSER16550_INFO)pHead), pLCR, byte | SERIAL_LCR_BREAK);
}
except (GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ?
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
// Just exit
}
LeaveCriticalSection(&(pHWHead->RegCritSec));
RETAILMSG(QYDEBUG, (TEXT("-SL_SetBreak, 0x%X\r\n"), pHead));
}
BOOL
SetBaudRateq(
PVOID pHead,
ULONG BaudRate
)
{
PSER16550_INFO pHWHead = (PSER16550_INFO)pHead;
USHORT divisor;
UCHAR lcr;
RETAILMSG(QYDEBUG,(TEXT("+SerBaudRateq()\r\n")));
// **** Warning ***** Make no system calls, called in power context
divisor = DivisorOfRateq(pHead, BaudRate);
RETAILMSG(QYDEBUG,(TEXT("BaudRate=0x%x\r\n"),divisor));
if ( divisor ) {
lcr = INB(pHWHead, pLCR);
RETAILMSG(QYDEBUG,(TEXT(" + lcr lcr LCR =0X%X\r\n"),lcr));
RETAILMSG(QYDEBUG,(TEXT(" +SER16550 Register LCR =0X%X\r\n"),INB(pHWHead, pLCR)));
OUTB(pHWHead, pLCR, lcr | SERIAL_LCR_DLAB);
OUTB(pHWHead, pData, divisor & 0xff); //pData is DivLatch Lo
OUTB(pHWHead, pIER, (divisor >> 8) & 0xff); //pIER is DivLatch Hi
OUTB(pHWHead, pLCR, lcr);
RETAILMSG(QYDEBUG,(TEXT(" +SER16550 Register LCR =0X%X\r\n"),INB(pHWHead, pLCR)));
//****
OUTB(pHWHead, pIER, 0x01);
RETAILMSG(QYDEBUG,(TEXT("-SerBaudRateq(S)\r\n")));
return( TRUE );
} else {
RETAILMSG(QYDEBUG,(TEXT("-SerBaudRateq(F)\r\n")));
return( FALSE );
}
}
BOOL
SL_SetBaudRateq(
PVOID pHead, // @parm PVOID returned by HWInit
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 {
}
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 {
}
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")));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -