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

📄 bvd_ser16550.c

📁 cayman提供的PXA270 wince下的bsp源码包
💻 C
📖 第 1 页 / 共 5 页
字号:
		}
    }
    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 + -