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

📄 ser16552.c.bak

📁 2440 wince uart source code
💻 BAK
📖 第 1 页 / 共 4 页
字号:
  
    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 + -