亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來(lái)到蟲(chóng)蟲(chóng)下載站! | ?? 資源下載 ?? 資源專(zhuān)輯 ?? 關(guān)于我們
? 蟲(chóng)蟲(chóng)下載站

?? ccir.c

?? WinCE 3.0 BSP, 包含Inter SA1110, Intel_815E, Advantech_PCM9574 等
?? C
?? 第 1 頁(yè) / 共 4 頁(yè)
字號(hào):
            EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
        // Do nothing - we're in enough trouble
    }

    DEBUGMSG (ZONE_FUNCTION,
              (TEXT("-CCIR_SetStopBits 0x%X\r\n"), pHead));
    
    return TRUE;
}

//
// @doc OEM
// @func ULONG | CCIR_GetRxBufferSize | This function returns
// the size of the hardware buffer passed to the interrupt
// initialize function.  It would be used only for devices
// which share a buffer between the MDD/PDD and an ISR.
//
// 
// @rdesc This routine always returns 0 for 16550 UARTS.
// 
ULONG
CCIR_GetRxBufferSize(
    PVOID pHead
    )
{
    return 0;
}

//
// @doc OEM
// @func PVOID | SC_GetRxStart | This routine returns the start of the hardware
// receive buffer.  See CCIR_GetRxBufferSize.
// 
// @rdesc The return value is a pointer to the start of the device receive buffer.
// 
PVOID
CCIR_GetRxStart(
    PVOID   pHead // @parm PVOID returned by SC_init.
    )
{
    return  NULL;
}

//
// @doc OEM
// @func ULONG | CCIR_GetGetInterruptType | This function is called
//   by the MDD whenever an interrupt occurs.  The return code
//   is then checked by the MDD to determine which of the four
//   interrupt handling routines are to be called.
// 
// @rdesc This routine returns a bitmask indicating which interrupts
//   are currently pending.
// 
INTERRUPT_TYPE
CCIR_GetInterruptType(
    PVOID pHead      // Pointer to hardware head
    )
{
    PSER16550_INFO	pHWHead = (PSER16550_INFO)pHead;
    INTERRUPT_TYPE interrupts;
    
    DEBUGMSG (0,
              (TEXT("+CCIR_GetInterruptType 0x%X\r\n"), pHead));
    try
    {
        pHWHead->IIR = INB(pHWHead, pIIR_FCR);
		//DumpLED(pHWHead);
    }
    except (GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ?
            EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
        pHWHead->IIR = SERIAL_IIR_INT_INVALID; // simulate no interrupt
    }

    if( pHWHead->IIR & SERIAL_IIR_INT_INVALID )
    {
		// No interrupts pending, vector is useless
		interrupts = INTR_NONE;
	}
	else
    {
		// The interrupt value is valid
		switch( pHWHead->IIR & SERIAL_IIR_INT_MASK )
		{
		case SERIAL_IIR_RLS:
			interrupts = INTR_LINE;
			break;

		case SERIAL_IIR_CTI:
		case SERIAL_IIR_CTI_2:
		case SERIAL_IIR_RDA:
			interrupts = INTR_RX;
			break;

		case SERIAL_IIR_THRE :
			interrupts = INTR_TX;
			break;
					
		case SERIAL_IIR_MS :
			interrupts = INTR_MODEM;
			break;

		default:
			interrupts = INTR_NONE;
			break;
		}
	}
    
	if (pHWHead->AddTXIntr)
	{ 
		interrupts |= INTR_TX;
		pHWHead->AddTXIntr = FALSE;
	}

	DEBUGMSG (ZONE_THREAD,
			  (TEXT("-CCIR_GetInterruptType 0x%X, 0x%X\r\n"),
			   pHead, interrupts));

	return interrupts;
}


// @doc OEM
// @func ULONG | CCIR_RxIntr | This routine gets several characters from the hardware
//   receive buffer and puts them in a buffer provided via the second argument.
//   It returns the number of bytes lost to overrun.
// 
// @rdesc The return value indicates the number of overruns detected.
//   The actual number of dropped characters may be higher.
//
ULONG
CCIR_RxIntr(
    PVOID pHead,                // @parm Pointer to hardware head
    PUCHAR pRxBuffer,           // @parm Pointer to receive buffer
    ULONG *pBufflen             // @parm In = max bytes to read, out = bytes read
    )
{
    PSER16550_INFO   pHWHead	= (PSER16550_INFO)pHead;
    ULONG	    RetVal	= 0;
    ULONG	    TargetRoom	= *pBufflen;
    BOOL        fRXFlag = FALSE;
    BOOL        fReplaceparityErrors = FALSE;
    BOOL        fNull;
    UCHAR       cEvtChar, cRXChar;

    
    DEBUGMSG (0, (TEXT("+GetBytes - len %d.\r\n"),
                  *pBufflen));
    *pBufflen = 0;

    // LAM - I have local copies of some DCB elements since I don't
    // want to keep dereferencing inside my read loop and there are too
    // many of them to trust the compiler.
    cEvtChar = pHWHead->dcb.EvtChar;
    fNull = pHWHead->dcb.fNull;
    if( pHWHead->dcb.fErrorChar && pHWHead->dcb.fParity )
        fReplaceparityErrors = TRUE;
    
    try
    {
        while ( TargetRoom )
        {
             // See if there is another byte to be read
            ReadLSR( pHWHead );

            if( pHWHead->LSR & SERIAL_LSR_DR )
            {
                 // Read the byte
                cRXChar = INB(pHWHead, pData);

                 // But we may want to discard it
                if( pHWHead->dcb.fDsrSensitivity &&
                    (! (pHWHead->MSR & SERIAL_MSR_DSR)) )
                {
                     // Do nothing - byte gets discarded
					DEBUGMSG (ZONE_FLOW,
							  (TEXT("Dropping byte because DSR is low\r\n")));
                }
                else if (!cRXChar && fNull)
                {
                     // Do nothing - byte gets discarded
					DEBUGMSG (ZONE_FLOW| ZONE_WARN,
							  (TEXT("Dropping NULL byte due to fNull\r\n")));
                }
                else
                {
                    // Do character replacement if parity error detected.
                    if( fReplaceparityErrors && (pHWHead->LSR & SERIAL_LSR_PE) )
                    {
                        cRXChar = pHWHead->dcb.ErrorChar;
                    }
                    else
                    {    
                        // See if we need to generate an EV_RXFLAG for the received char.
                        if( cRXChar == cEvtChar )
                            fRXFlag = TRUE;
                    }
                    
                    // Finally, we can get byte, update status and save.
                    *pRxBuffer++ = cRXChar;
                    (*pBufflen)++;
                    --TargetRoom;
                }
            }
            else
            {
                 // We read all chars, so we're done
                break;
            }
        }
    }
    except (GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ?
            EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
        // just exit
    }

    // if we saw one (or more) EVT chars, then generate an event
    if( fRXFlag )
        pHWHead->EventCallback( pHWHead->pMddHead, EV_RXFLAG );

    if( pHWHead->DroppedBytes )
        DEBUGMSG (ZONE_WARN, (TEXT("Rx drop %d.\r\n"),
                              pHWHead->DroppedBytes));
    
    DEBUGMSG (0, (TEXT("-GetBytes - rx'ed %d, dropped %d.\r\n"),
                  *pBufflen,
                  pHWHead->DroppedBytes));

    RetVal = pHWHead->DroppedBytes;
    pHWHead->DroppedBytes = 0;
    return RetVal;
}

// @doc OEM
// @func ULONG | CCIR_PutBytes | This routine is called from the MDD
//   in order to write a stream of data to the device.
// 
// @rdesc Always returns 0
//
ULONG
CCIR_PutBytes(
    PVOID   pHead,	    // @parm	PVOID returned by HWInit.
    PUCHAR  pSrc,	    // @parm	Pointer to bytes to be sent.
    ULONG   NumberOfBytes,  // @parm	Number of bytes to be sent.
    PULONG  pBytesSent	    // @parm	Pointer to actual number of bytes put.
    )
{
    PSER16550_INFO   pHWHead	= (PSER16550_INFO)pHead;
    UCHAR       byteCount;
    
    DEBUGMSG (ZONE_WRITE, (TEXT("+PutBytes - Len %d.\r\n"),
                           NumberOfBytes));

    pHWHead->CommErrors &= ~CE_TXFULL;

    // If CTS flow control is desired, check cts. If clear, don't send,
    // but loop.  When CTS comes back on, the OtherInt routine will
    // detect this and re-enable TX interrupts (causing Flushdone).
    // For finest granularity, we would check this in the loop below,
    // but for speed, I check it here (up to 8 xmit characters before
    // we actually flow off.
    if ( pHWHead->dcb.fOutxCtsFlow )
    {
        // ReadMSR( pHWHead );
        // We don't need to explicitly read the MSR, since we always enable
        // IER_MS, which ensures that we will get an interrupt and read
        // the MSR whenever CTS, DSR, TERI, or DCD change.
        
        if(! (pHWHead->MSR & SERIAL_MSR_CTS) )
        {
			unsigned char byte;
            DEBUGMSG (ZONE_WRITE|ZONE_FLOW,
                      (TEXT("PutBytes, flowed off via CTS\n") ) );
            pHWHead->CTSFlowOff = TRUE;  // Record flowed off state
            byte = INB(pHWHead, pIER);
            OUTB(pHWHead, pIER, byte & ~SERIAL_IER_THR); // disable TX interrupts while flowed off
            // We could return a positive value here, which would
            // cause the MDD to periodically check the flow control
            // status.  However, we don't need to since we know that
            // the DCTS interrupt will cause the MDD to call us, and we
            // will subsequently fake a TX interrupt to the MDD, causing
            // him to call back into PutBytes.
            return 0;
        }
    }

    // Same thing applies for DSR
    if ( pHWHead->dcb.fOutxDsrFlow )
    {
        // ReadMSR( pHWHead );
        // We don't need to explicitly read the MSR, since we always enable
        // IER_MS, which ensures that we will get an interrupt and read
        // the MSR whenever CTS, DSR, TERI, or DCD change.
            
        if(! (pHWHead->MSR & SERIAL_MSR_DSR) )
        {
            DEBUGMSG (ZONE_WRITE|ZONE_FLOW,
                      (TEXT("PutBytes, flowed off via DSR\n") ) );
            pHWHead->DSRFlowOff = TRUE;  // Record flowed off state
            OUTB(pHWHead, pIER, IER_NORMAL_INTS); // disable TX interrupts while flowed off

            // See the comment above above positive return codes.
            return 0;
        }
    }

    DEBUGMSG (ZONE_WRITE, (TEXT("PutBytes wait for CritSec %x.\r\n"),
                           &(pHWHead->TransmitCritSec)));
    EnterCriticalSection(&(pHWHead->TransmitCritSec));
    DEBUGMSG (ZONE_WRITE, (TEXT("PutBytes got CritSec %x.\r\n"),
                           &(pHWHead->TransmitCritSec)));
    
    ReadLSR( pHWHead );
    if( pHWHead->LSR & SERIAL_LSR_THRE )
    {
        if( pHWHead->IIR & SERIAL_IIR_FIFOS_ENABLED )
            byteCount = SERIAL_FIFO_DEPTH;
        else
            byteCount = 1;
            
        DEBUGMSG (ZONE_WRITE | ZONE_THREAD,
                  (TEXT("Put Bytes - Write max of %d bytes\r\n"),
                   byteCount));
        try
        {
            for( ; NumberOfBytes && byteCount; NumberOfBytes--, byteCount-- )
            {
                OUTB(pHWHead, pData, *pSrc);
                ++pSrc;
                (*pBytesSent)++;
            }
        }
        except (GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ?
                EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
            // Just ignore it, we'll eventually fall out of here
        }
                
    }
            
    // Enable xmit intr. We need to do this no matter what, 
    // since the MDD relies on one final interrupt before
    // returning to the application. 
    try
    {
        OUTB(pHWHead, pIER, IER_NORMAL_INTS | SERIAL_IER_THR);
    }
    except (GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ?
            EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
        // Hmm, not sure what would cause this.  Lets just tell
        // the MDD to bugger off until we get another TX
        // interrupt.
    }
            
    LeaveCriticalSection(&(pHWHead->TransmitCritSec));
    DEBUGMSG (ZONE_WRITE, (TEXT("PutBytes released CritSec %x.\r\n"),
                           &(pHWHead->TransmitCritSec)));

    DEBUGMSG (ZONE_WRITE, (TEXT("-PutBytes - sent %d.\r\n"),
                           *pBytesSent));

    return 0;
}

//
// @doc OEM
// @func ULONG | CCIR_TXIntr | This routine is called from the MDD
//   whenever INTR_TX is returned by CCIR_GetInterruptType
// 
// @rdesc None
//
VOID
CCIR_TxIntr(
    PVOID pHead                // Hardware Head
    )
{
    PSER16550_INFO   pHWHead	= (PSER16550_INFO)pHead;

    DEBUGMSG (0,
              (TEXT("+CCIR_TxIntr 0x%X\r\n"), pHead));

     // Disable xmit intr.  Most 16550s will keep hammering
     // us with xmit interrupts if we don't turn them off
     // Whoever gets the FlushDone will then need to turn
     // TX Ints back on if needed.
    try
    {
        OUTB(pHWHead, pIER, IER_NORMAL_INTS);
    }
    except (GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ?
            EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
        // Do nothing.  The worst case is that this was a fluke,
        // and a TX Intr will come right back at us and we will
        // resume transmission.
    }

    // Let the putbytes routine know he can continue
    //PulseEvent(pHWHead->FlushDone);
    
    DEBUGMSG (0,
              (TEXT("-CCIR_TxIntr\r\n")));
}

//
// @doc OEM
// @func ULONG | CCIR_LineIntr | This routine is called from the MDD
//   whenever INTR_LINE is returned by CCIR_GetInterruptType.
// 
// @rdesc None
//
VOID
CCIR_LineIntr(
    PVOID pHead                // Hardware Head
    )
{
    PSER16550_INFO   pHWHead	= (PSER16550_INFO)pHead;

    DEBUGMSG (0,
              (TEXT("+CCIR_LineIntr 0x%X\r\n"), pHead));

    ReadLSR( pHWHead );

    DEBUGMSG (0,
              (TEXT("-CCIR_LineIntr 0x%X\r\n"), pHead));
}

//
// @doc OEM
// @func ULONG | CCIR_OtherIntr | This routine is called from the MDD
//   whenever INTR_MODEM is returned by CCIR_GetInterruptType.
// 
// @rdesc None
//
VOID
CCIR_OtherIntr(
    PVOID pHead                // Hardware Head
    )
{
    PSER16550_INFO   pHWHead	= (PSER16550_INFO)pHead;

    DEBUGMSG (0,
              (TEXT("+CCIR_OtherIntr 0x%X\r\n"), pHead));

    ReadMSR( pHWHead );
    
    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,

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲国产一二三| 国模少妇一区二区三区| 精品福利av导航| 在线影视一区二区三区| 欧美丝袜自拍制服另类| 精品亚洲欧美一区| 亚洲最新视频在线观看| 国产蜜臀av在线一区二区三区| 在线观看日韩毛片| 不卡一二三区首页| 狠狠色丁香婷婷综合| 视频一区二区国产| 一个色在线综合| 中文字幕 久热精品 视频在线| 欧美一区日韩一区| 欧美在线观看视频一区二区三区 | 亚洲一区二区视频在线| 久久久精品tv| 精品国产乱码91久久久久久网站| 欧美影院午夜播放| 91在线免费看| 波多野结衣亚洲一区| 国产美女视频91| 麻豆成人久久精品二区三区小说| 图片区小说区区亚洲影院| 亚洲欧洲精品一区二区精品久久久| 精品国产欧美一区二区| 欧美精选一区二区| 欧美日韩国产在线观看| 欧美图片一区二区三区| 欧美最新大片在线看| 91理论电影在线观看| 成人精品小蝌蚪| 国产精品一区在线观看你懂的| 精品写真视频在线观看| 美腿丝袜亚洲色图| 日本欧美韩国一区三区| 免费高清成人在线| 精品一区二区三区蜜桃| 久久99精品国产91久久来源| 久久99精品国产.久久久久久| 精品一区二区三区免费观看| 国产一区二区三区精品视频| 极品少妇xxxx精品少妇| 国产一区二区不卡在线| 丁香婷婷综合五月| 不卡欧美aaaaa| 99久久精品情趣| 色综合色综合色综合| 日本韩国一区二区三区视频| 欧美亚洲国产一区在线观看网站| 在线观看亚洲精品视频| 欧美日韩高清影院| 欧美电视剧在线观看完整版| 午夜精品福利久久久| 美女国产一区二区| 黄色日韩三级电影| 成人丝袜视频网| 色国产综合视频| 日韩一区二区视频| 国产亚洲欧洲997久久综合| 国产精品久久久久久久岛一牛影视| 中文字幕综合网| 日日夜夜精品视频免费| 国产中文一区二区三区| 成人aa视频在线观看| 欧美视频中文一区二区三区在线观看| 欧美另类videos死尸| 2021中文字幕一区亚洲| 亚洲人成亚洲人成在线观看图片 | 成人免费高清视频| 欧美日韩亚洲综合在线 | 亚洲一二三区视频在线观看| 亚洲成va人在线观看| 极品少妇一区二区| 一本大道综合伊人精品热热| 欧美一级二级三级乱码| 久久精品国产久精国产爱| 国产a久久麻豆| 欧美亚洲国产一区二区三区va | 欧美大胆人体bbbb| 国产欧美一区二区精品忘忧草| 亚洲欧洲韩国日本视频| 日韩不卡一二三区| 成人精品小蝌蚪| 91精品中文字幕一区二区三区| 国产午夜精品一区二区三区视频 | 久久99精品久久久久婷婷| 成人avav影音| 日韩三级精品电影久久久| 亚洲欧洲色图综合| 九一九一国产精品| 欧美四级电影网| 国产精品毛片久久久久久久| 麻豆传媒一区二区三区| 欧美亚洲国产怡红院影院| 欧美国产禁国产网站cc| 日韩av在线发布| 色综合久久综合| 国产视频不卡一区| 青青草视频一区| 在线观看亚洲精品| 亚洲欧洲日韩一区二区三区| 国产曰批免费观看久久久| 欧美日本乱大交xxxxx| 亚洲欧美国产三级| 国产成都精品91一区二区三| 日韩美女视频一区二区在线观看| 一区二区三区日韩欧美精品| 国产91精品欧美| 久久免费电影网| 男女性色大片免费观看一区二区| 色婷婷精品久久二区二区蜜臀av| 久久久www成人免费无遮挡大片| 日韩成人免费在线| 欧美精品三级在线观看| 一区二区欧美在线观看| 9i看片成人免费高清| 国产丝袜在线精品| 国内精品视频666| 精品久久久久99| 麻豆精品在线播放| 欧美一区二区视频在线观看2022| 亚洲国产视频在线| 欧美日韩在线观看一区二区| 亚洲精品日产精品乱码不卡| 色诱亚洲精品久久久久久| 成人免费一区二区三区在线观看| 国产99久久久久| 亚洲国产电影在线观看| 国产成人综合在线播放| 国产日产精品1区| 国产高清精品久久久久| 国产色婷婷亚洲99精品小说| 国产一区二区三区美女| 久久一区二区三区四区| 国产一级精品在线| 国产精品视频一二三| 成人性生交大片免费看中文网站 | 麻豆精品国产91久久久久久| 91精品国产全国免费观看| 日韩经典一区二区| 欧美一区二视频| 久久99国产精品久久| 亚洲精品一区二区三区影院| 国模娜娜一区二区三区| 久久精品噜噜噜成人av农村| 欧美电视剧免费全集观看| 狠狠色丁香婷综合久久| 欧美激情在线一区二区三区| 成人精品国产免费网站| 亚洲欧美日韩中文字幕一区二区三区 | 欧美一级电影网站| 国产一区二区三区免费观看| 国产精品亲子乱子伦xxxx裸| 91丨九色丨蝌蚪富婆spa| 亚洲综合久久av| 91精品国产综合久久久久久漫画| 久久se这里有精品| 国产精品你懂的在线| 色婷婷香蕉在线一区二区| 日韩高清在线观看| 久久亚洲影视婷婷| 色综合久久99| 天天操天天色综合| 久久久美女毛片| 91电影在线观看| 蜜臀av亚洲一区中文字幕| 国产欧美一区在线| 在线观看免费视频综合| 捆绑变态av一区二区三区| 欧美激情中文不卡| 欧美伦理影视网| 国产高清不卡一区二区| 一区二区免费视频| 日韩精品中文字幕在线不卡尤物| 国产98色在线|日韩| 亚洲国产精品欧美一二99| 337p粉嫩大胆色噜噜噜噜亚洲 | 日日夜夜免费精品| 中文字幕精品一区二区精品绿巨人| 一本一道综合狠狠老| 国内精品久久久久影院薰衣草 | 亚洲欧美一区二区久久| 欧美一区二区三区在线电影| 成人免费观看视频| 日本欧美加勒比视频| 亚洲欧美日韩国产成人精品影院| 欧美一区二区三区婷婷月色| www.亚洲免费av| 美女精品自拍一二三四| 亚洲一区二区视频在线观看| 国产人妖乱国产精品人妖| 91.com视频| 91久久国产综合久久| 国产成人在线免费观看| 日本成人在线看| 一区二区三区日韩| 日本一区二区成人在线| 日韩欧美国产三级|