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

📄 ser16552.c

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