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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? scif0.c

?? WinCE5.0BSP for Renesas SH7770
?? C
?? 第 1 頁 / 共 2 頁
字號:
// 
// @rdesc This routine returns a bitmask indicating which interrupts
//   are currently pending.
//
INTERRUPT_TYPE
SCIF0GetInterruptType(
    PVOID pHead      // Pointer to hardware head
    )
{
    PSCIF_INFO	pHWHead = (PSCIF_INFO)pHead;
    PDMA_INFO	pTxDma = pHWHead -> pTxDma;
    PDMA_INFO   pRxDma = pHWHead -> pRxDma;

    INTERRUPT_TYPE interrupts;
    USHORT	FSR;
    USHORT	LSR;

    DEBUGMSG (ZONE_THREAD,
              (TEXT("+SerGetInterruptType 0x%X\r\n"), pHead));
    try
    {
        FSR = READ_REGISTER_USHORT(pHWHead -> pFSR);
        LSR = READ_REGISTER_USHORT(pHWHead -> pLSR);
    }
    except (GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ?
            EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
        FSR = 0;
        LSR = 0;
    }

	// Clear InterruptType
    interrupts = INTR_NONE;

	// Check ErrorFlag
    if ( LSR & SCIF_LSR_ORER ||
//		FSR & (SCIF_SSR_BRK|SCIF_SSR_FER|SCIF_SSR_PER) ){
		FSR & (SCIF_SSR_ER|SCIF_SSR_BRK|SCIF_SSR_FER|SCIF_SSR_PER) ){
	
		DEBUGMSG(ZONE_THREAD,(TEXT("ERROR - FSR : 0x%x  LSR : 0x%x\r\n"),FSR,LSR));
					
        interrupts = INTR_LINE;

    }else if ( LSR & SCIF_LSR_TO ){
		interrupts = INTR_RX;
//		DEBUGMSG(ZONE_THREAD,(TEXT("SCIF Receive timeout FSR[%04x] LSR[%04x]\r\n"),FSR,LSR));
//		WRITE_REGISTER_USHORT(pHWHead -> pLSR,
//			READ_REGISTER_USHORT(pHWHead -> pLSR) & ~(SCIF_LSR_TO));

	// DMA Transfer complate (Receive)
    }else if (*(pRxDma -> pvDINTSR) & (0x00000001 << (pRxDma -> Ch))){
        interrupts = INTR_RX;
		WRITE_REGISTER_ULONG(pRxDma -> pvDINTCR, 0x00000001 << (pRxDma -> Ch));

	// DMA Transfer complate (Transmit)
    }else if (*(pTxDma -> pvDINTSR) & (0x00000001 << (pTxDma -> Ch))){
        interrupts = INTR_TX;
		WRITE_REGISTER_ULONG(pTxDma -> pvDINTCR, 0x00000001 << (pTxDma -> Ch));
		SetEvent(pHWHead->FlushDone);
    }

    if (pHWHead->AddTXIntr) {
        interrupts |= INTR_TX;
        pHWHead->AddTXIntr = FALSE;
    }

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

    return interrupts;
}


#pragma optimize("", off)  
//
// @doc OEM
// @func ULONG | SerTXIntr | This routine is called from the new MDD
//   whenever INTR_TX is returned by SerGetInterruptType.  It is responsible
//   for loading up the TX FIFO with next block of data.
// 
// @rdesc None
//
VOID
SCIF0TxIntr(
    PVOID pHead,                // Hardware Head
    PUCHAR pTxBuffer,          // @parm Pointer to receive buffer
    ULONG *pBuffLen            // @parm In = max bytes to transmit, out = bytes transmitted
    )
{
	PSCIF_INFO pHWHead = (PSCIF_INFO)pHead;
	DWORD	byteCount, transCount;
	DWORD	dcr_value;
	USHORT	SPTR;
	UCHAR  dmy;

    DEBUGMSG (ZONE_WRITE, (TEXT("+PutBytes - sent %d.\r\n"),
                           *pBuffLen));
	if( *pBuffLen == 0 ){
		return;
	}

    // 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 )
    {
        SPTR = ReadModemStatus( 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->SPTR & SCIF_SPTR_CTS) )
        {
            DEBUGMSG (ZONE_WRITE|ZONE_FLOW,
                      (TEXT("PutBytes, flowed off via CTS\n") ) );

            pHWHead->CTSFlowOff = TRUE;  // Record flowed off state
            WRITE_REGISTER_USHORT(pHWHead -> pSCR, READ_REGISTER_USHORT(pHWHead -> pSCR) & ~SCIF_SCR_TIE);
            // disable TX interrupts shile 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.
			*pBuffLen = 0;
            return;

        }

    }

    EnterCriticalSection(&(pHWHead->TransmitCritSec));

    if ( SCIF0_TXBUFFER_SIZE < *pBuffLen ){
        byteCount = SCIF0_TXBUFFER_SIZE;
    }else{
        byteCount = *pBuffLen;
    }

    DEBUGMSG (ZONE_WRITE | ZONE_THREAD,
              (TEXT("Put Bytes - Write max of %d bytes\r\n"),
               byteCount));

	*pBuffLen = 0;
    for( transCount = 0; byteCount; byteCount-- ){
 	*(pHWHead -> pTxBuff + (transCount++)) = *(pTxBuffer++);
        (*pBuffLen)++;
    }
    dmy = *(pHWHead -> pTxBuff + transCount - 1);	// Coherency measures  

//	WRITE_REGISTER_USHORT(pHWHead -> pSCR, READ_REGISTER_USHORT(pHWHead -> pSCR) & ~SCIF_SCR_TE);

    dcr_value = DCR_DPDS_8BIT		|
				DCR_DDRMD_MODULE	|
				DCR_DPDAM_FIX	 	|
				DCR_DMDL_PERIPHERAL	|
				DCR_SPDS_8BIT		|
				DCR_SDRMD_MODULE	|
				DCR_SPDAM_FIX		|
				DCR_SMDL_MEMORY		|
				DCR_DIP_1PAGE		|
				DCR_ACMD_DISABLE	|
				DCR_CT_DISABLE		|
				DCR_PKMD_DISABLE	|
				DCR_BTMD_ENABLE		|
				DCR_DTAU_BYTE		|
				DCR_DTAC_DISABLE	;	

	try {
		dma_SetPage(pHWHead -> pTxDma, 0, SCIF0_TX_BUFFER_BASE, SCIF0_REGBASE + SCIF_SCFTDR_OFFSET, (ULONG)transCount);
		dma_SetPort(pHWHead -> pTxDma, DPTR_DDPT_SCIF0);
		dma_SetControl(pHWHead -> pTxDma, dcr_value);
		dma_SetCommand(pHWHead -> pTxDma, DCMDR_DMEN);
		dma_InterruptEnable(pHWHead -> pTxDma);
	}
	except (GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ?
		EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
    }

    LeaveCriticalSection(&(pHWHead->TransmitCritSec));

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

    return;
}
#pragma optimize("", on)


//
// @doc OEM
// @func ULONG | SCIF0_OtherIntr | This routine is called from the MDD
//   whenever INTR_MODEM is returned by SCIF_GetInterruptType.
// 
// @rdesc None
//
VOID
SCIF0OtherIntr(
    PVOID pHead                // Hardware Head
    )
{
    PSCIF_INFO   pHWHead	= (PSCIF_INFO)pHead;
    USHORT MSR;

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

    MSR = (USHORT)ReadModemStatus( pHWHead );
    try
    {
        if ( pHWHead -> CTSFlowOff && (MSR & SCIF_SPTR_CTS) ){
            pHWHead -> CTSFlowOff = FALSE;
            WRITE_REGISTER_USHORT(pHWHead -> pSCR, READ_REGISTER_USHORT(pHWHead -> pSCR) | SCIF_SCR_TIE);
            pHWHead -> AddTXIntr = TRUE;
        }
    }
    except (GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ?
            EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
        // Just exit
    }
    

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


//
// @doc OEM
// @func ULONG | SL_OtherIntr | This routine is called from the MDD
//   whenever INTR_MODEM is returned by SL_GetInterruptType.
// 
// @rdesc None
//
VOID
SCIF0ModemIntr(
            PVOID pHead                // Hardware Head
            )
{
    SCIF0OtherIntr(pHead);
}


//  
// @doc OEM
// @func	ULONG | SerGetStatus | This structure is called by the MDD
//   to retrieve the contents of a COMSTAT structure.
//
// @rdesc	The return is a ULONG, representing success (0) or failure (-1).
//
ULONG
SCIF0GetStatus(
    PVOID	pHead,	// @parm PVOID returned by HWInit.
    LPCOMSTAT	lpStat	// Pointer to LPCOMMSTAT to hold status.
    )
{
    PSCIF_INFO pHWHead = (PSCIF_INFO)pHead;
    ULONG	  RetVal  = pHWHead->CommErrors;
    
    DEBUGMSG (ZONE_FUNCTION,
              (TEXT("+SCIF0GetStatus 0x%X\r\n"), pHead));

    pHWHead->CommErrors = 0; // Clear old errors each time

    if ( lpStat )
    {
        if ( pHWHead -> CTSFlowOff )
            pHWHead -> Status.fCtsHold = 1;
        else
            pHWHead -> Status.fCtsHold = 0;

        if ( pHWHead -> CommCharInQueue )
            pHWHead -> Status.fTxim = TRUE;
        else
            pHWHead -> Status.fTxim = FALSE;
        memcpy(lpStat, &(pHWHead->Status), sizeof(COMSTAT));
    }
    else
        RetVal = (ULONG)-1;

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


/*
 @doc OEM
 @func BOOL | SCIF_EnableIR | This routine enables ir.
 *  Not exported to users, only to driver.
 *
 @rdesc Returns TRUE if successful, FALSEotherwise.
 */
BOOL
SCIF0EnableIR(
    PVOID   pHead, // @parm PVOID returned by HWinit.
    ULONG   BaudRate  // @parm ULONG baudrate.
    )
{
    return FALSE;
}

/*
 @doc OEM
 @func BOOL | SCIF_DisableIR | This routine disable the ir.
 *  Not exported to users, only to driver.
 *
 @rdesc Returns TRUE if successful, FALSEotherwise.
 */
BOOL
SCIF0DisableIR(
    PVOID   pHead /*@parm PVOID returned by HWinit. */
    )
{
    return FALSE;
}


const
HW_VTBL SCIF0IoVTbl = {
    SCIF0Init,
    SCIF_PostInit,
    SCIF_Deinit,
    SCIF0Open,
    SCIF_Close,
    SCIF0GetInterruptType,
    SCIF_RxIntr,
    SCIF0TxIntr,
    SCIF0ModemIntr,
    SCIF_LineIntr,
    SCIF_GetRxBufferSize,
    SCIF_PowerOff,
    SCIF_PowerOn,
    SCIF_ClearDTR,
    SCIF_SetDTR,
    SCIF0ClearRTS,
    SCIF0SetRTS,
    SCIF0EnableIR,
    SCIF0DisableIR,
    SCIF_ClearBreak,
    SCIF_SetBreak,
    SCIF_XmitComChar,
    SCIF0GetStatus,
    SCIF_Reset,
    SCIF_GetModemStatus,
    SCIF_GetCommProperties,
    SCIF_PurgeComm,
    SCIF_SetDCB,
    SCIF_SetCommTimeouts,
    SCIF_Ioctl};

PHWOBJ
GetSerialObject(
               DWORD DeviceArrayIndex
               )
{
    PHWOBJ pSerObj;

    // We do not have a statically allocated array of HWObjs.  Instead, we 
    // allocate a new HWObj for each instance of the driver.  The MDD will 
    // always call GetSerialObj/HWInit/HWDeinit in that order, so we can do 
    // the alloc here and do any subsequent free in HWDeInit.

    // Allocate space for the HWOBJ.
    pSerObj = (PHWOBJ)LocalAlloc( LPTR, sizeof(HWOBJ) );
    if ( !pSerObj )
        return (NULL);

    // Fill in the HWObj structure that we just allocated.
    if( DeviceArrayIndex == 0 ){
        pSerObj->BindFlags = THREAD_AT_INIT;     // Have MDD create thread when device is first opened.
//        pSerObj->BindFlags = THREAD_IN_PDD;            // We take care of our own IST
        pSerObj->dwIntID   = SYSINTR_SCIF0;            // SysIntr is filled in at init time
        pSerObj->pFuncTbl  = (HW_VTBL *) &SCIF0IoVTbl; // Return pointer to appropriate functions
    }
    else{
        pSerObj->BindFlags = THREAD_AT_INIT;     // Have MDD create thread when device is first opened.
//        pSerObj->BindFlags = THREAD_IN_PDD;            // We take care of our own IST
        pSerObj->dwIntID   = SYSINTR_IR;               // SysIntr is filled in at init time
        pSerObj->pFuncTbl  = (HW_VTBL *) &SCIF3IoVTbl; // Return pointer to appropriate functions
    }

    // Now return this structure to the MDD.
    return (pSerObj);
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
成人小视频免费观看| 日韩一卡二卡三卡国产欧美| 国产无人区一区二区三区| 蜜臀va亚洲va欧美va天堂| 欧美久久一二区| 石原莉奈一区二区三区在线观看| 91丨porny丨中文| 亚洲国产日韩a在线播放性色| 91在线观看美女| 日韩中文字幕一区二区三区| 欧美一区二区视频在线观看2022| 日韩精品三区四区| 欧美成人性战久久| 99精品视频中文字幕| 亚洲h动漫在线| 国产欧美日韩在线观看| 99免费精品视频| 国产午夜亚洲精品理论片色戒| 自拍av一区二区三区| 欧美精品视频www在线观看 | 成人免费av在线| 亚洲一区二区中文在线| 国产欧美日韩视频一区二区| 在线观看av一区二区| 国产成人在线电影| 蜜桃视频在线一区| 五月婷婷综合激情| 亚洲免费伊人电影| 国产精品福利在线播放| 26uuu亚洲| 久久夜色精品一区| 精品国免费一区二区三区| 欧美影院一区二区| 欧美午夜理伦三级在线观看| 色综合久久久久网| 91视视频在线观看入口直接观看www | 成人美女视频在线看| 人人狠狠综合久久亚洲| 天堂精品中文字幕在线| 视频一区在线播放| 亚洲国产一区二区在线播放| 一区二区三区在线高清| 亚洲日本在线视频观看| 一区二区三区中文字幕| 一级日本不卡的影视| 无码av免费一区二区三区试看| 一区二区三区丝袜| 午夜精品一区在线观看| 久久99精品国产麻豆婷婷洗澡| 国产精品三级电影| 久久久精品中文字幕麻豆发布| 久久精品这里都是精品| 日韩码欧中文字| 婷婷中文字幕一区三区| 国产一区欧美二区| 99国产欧美另类久久久精品 | 国产精品羞羞答答xxdd| 91麻豆蜜桃一区二区三区| 欧美三级电影一区| 久久久国产精品午夜一区ai换脸| 中文字幕亚洲不卡| 免费人成网站在线观看欧美高清| 美洲天堂一区二卡三卡四卡视频| 不卡一卡二卡三乱码免费网站| 欧美在线一二三| 中文字幕欧美一| 国产高清无密码一区二区三区| 91国产精品成人| 国产精品家庭影院| 精品一区二区免费在线观看| 欧美日韩久久不卡| 亚洲欧美在线观看| 成人午夜激情在线| 欧美电影一区二区| 一区二区三区在线高清| 99久久精品国产观看| 国产丝袜欧美中文另类| 九九九精品视频| 精品国产人成亚洲区| 日本欧美加勒比视频| 717成人午夜免费福利电影| 亚洲午夜激情网页| 91美女精品福利| 亚洲黄网站在线观看| 色婷婷亚洲综合| 日日摸夜夜添夜夜添亚洲女人| 91成人免费网站| 青青草91视频| 日本一区二区免费在线观看视频| 国产在线不卡一卡二卡三卡四卡| 久久伊人蜜桃av一区二区| 国产寡妇亲子伦一区二区| 欧美一级夜夜爽| 日本一区二区成人在线| 国产一区二区三区免费在线观看| 久久亚洲春色中文字幕久久久| 精彩视频一区二区| 中文字幕人成不卡一区| 欧美精品粉嫩高潮一区二区| 麻豆成人免费电影| 日本一区二区三区高清不卡 | 日韩高清不卡在线| 国产日产欧产精品推荐色| 欧美视频自拍偷拍| 国精产品一区一区三区mba桃花| 国产精品女主播在线观看| 欧美三级在线看| 一本久久精品一区二区| 国产一区二区导航在线播放| 亚瑟在线精品视频| 亚洲色图都市小说| 国产精品午夜在线观看| 日韩一区二区三区免费观看| 欧洲激情一区二区| 色欧美日韩亚洲| 在线精品视频小说1| 成人av在线网| 国产成人av电影在线| 九九久久精品视频| 国产乱人伦偷精品视频不卡| 韩国在线一区二区| 国产一区日韩二区欧美三区| 国产美女精品人人做人人爽| 精品一二线国产| 国产一区二区久久| 成人丝袜18视频在线观看| av资源网一区| 欧美性猛交xxxxxx富婆| 中文字幕日韩精品一区| 久久久久高清精品| 国产欧美一区二区精品性色超碰| 久久久久国产精品厨房| 精品视频一区三区九区| 欧美性高清videossexo| 欧洲生活片亚洲生活在线观看| 欧美亚洲日本国产| 国产欧美一区二区精品性色| 国产一区欧美日韩| 欧美国产成人在线| 91在线视频18| 日本一区二区视频在线| 乱一区二区av| 51精品久久久久久久蜜臀| 亚洲18色成人| 久久尤物电影视频在线观看| 精品亚洲aⅴ乱码一区二区三区| 2021国产精品久久精品| 国产成人av自拍| 悠悠色在线精品| 欧美xfplay| 成人免费毛片片v| 一区二区三区小说| 日韩欧美成人一区二区| 国产宾馆实践打屁股91| 亚洲成人一区二区在线观看| 欧美成人一级视频| 色综合 综合色| 国产一区二区看久久| 亚洲成人免费看| 亚洲欧洲精品一区二区三区| 这里只有精品免费| 91啪在线观看| 成人av综合在线| 久久99久久99| 日韩电影在线看| 亚洲自拍偷拍av| 亚洲三级免费观看| 国产亚洲精久久久久久| 欧美一区在线视频| 91福利在线播放| 成人福利视频网站| 精品系列免费在线观看| 三级久久三级久久| 亚洲sss视频在线视频| 亚洲色图视频免费播放| 国产网红主播福利一区二区| 精品国产一区二区国模嫣然| 日韩免费电影一区| 26uuu久久综合| 国产日韩综合av| 欧美一级日韩不卡播放免费| 欧美日韩国产乱码电影| 7777精品伊人久久久大香线蕉 | 亚洲另类色综合网站| 国产精品乱码一区二区三区软件 | 一区二区成人在线| 欧美国产精品专区| 亚洲色图19p| 亚洲国产日韩a在线播放性色| 一区二区在线观看视频在线观看| 综合网在线视频| 日本不卡一区二区三区| 久久不见久久见中文字幕免费| 老司机免费视频一区二区 | 欧美区在线观看| 精品少妇一区二区三区视频免付费| 久久综合久久鬼色| 亚洲欧美综合色| 精品一区二区三区在线视频| 成人av网站在线|