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

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

?? scif_cmn.c

?? WinCE5.0BSP for Renesas SH7770
?? C
?? 第 1 頁 / 共 3 頁
字號:
//
//  Copyright(C) Renesas Technology Corp. 1999-2004. All rights reserved.
//
//  Serial driver for ITS-DS7
//
//  FILE      : scif_cmn.c
//  CREATED   : 2002.06.26
//  MODIFIED  : 2004.09.01
//  AUTHOR    : Renesas Technology Corp.
//  HARDWARE  : RENESAS ITS-DS7
//  HISTORY   : 
//              2003.06.20
//              - Created release code.
//                (based on Serial driver for ITS-DS4 Source Kit Ver.1.2.0 for WCE 4.2)
//              2004.01.23
//              - Modified specification changed DDASR for 2nd cut. use DTCSR.
//              2004.02.02
//              - Changed for corresponding to COM_MDD2.
//              - Bug fixed. (fail,etc in CETK)
//              2004.03.02
//              - Revised Check and clear Receive Error Bit of Serial Status Register.
//              2004.09.01
//              - Created release code for WCE5.0.
//

#include <windows.h>
#include <types.h>
#include <memory.h>
#include <serhw.h>
#include <excpt.h>
#include <serdbg.h>

#include "platform.h"
#include "sh7770.h"
#include "..\inc\scif.h"
#include "oalintr.h"

#include "drv_glob.h"

extern const HW_VTBL SCIF0IoVTbl;
extern const HW_VTBL SCIF3IoVTbl;

#define EXCEPTION_ACCESS_VIOLATION STATUS_ACCESS_VIOLATION 

#define BAUD_TABLE_SIZE	19

static const
PAIRS	SCIF_BaudPairs[BAUD_TABLE_SIZE] = {
    {110,    2095},
    {300,    768},
    {600,    384},
    {1200,   192},
    {2400,   96},
    {4800,   48},
    {9600,   24},
    {14400,  16},
    {19200,  12},
    {38400,  6},
    {57600,  4},
    {115200, 2}};
static const
LOOKUP_TBL  SCIF_BaudTable = {BAUD_TABLE_SIZE, (PAIRS *) SCIF_BaudPairs};
// Miscellaneous internal routines.
PUCHAR

Ser_InternalMapRegisterAddresses(
    ULONG   HWAddress,
    ULONG   Size
    )
{
	PUCHAR	ioPortBase; 

    DEBUGMSG(ZONE_FUNCTION, 
             (TEXT("+Ser_InternalMapRegisterAddresses: adr=0x%x len=0x%x\r\n"),
			 HWAddress, Size));

	ioPortBase = VirtualAlloc(0, Size, MEM_RESERVE, PAGE_NOACCESS);
	if ( ioPortBase == NULL )
	{
		ERRORMSG(1, (TEXT("Ser_InternalMapRegisterAddresses: VirtualAlloc failed!\r\n")));
	}
	else if ( !VirtualCopy((PVOID)ioPortBase, (PVOID)HWAddress, Size, PAGE_READWRITE|PAGE_NOCACHE) )
	{
		ERRORMSG(1, (TEXT("Ser_InternalMapRegisterAddresses: VirtualCopy failed!\r\n")));
		VirtualFree( (PVOID)ioPortBase, 0, MEM_RELEASE );
		ioPortBase = 0;
	}

    DEBUGMSG(ZONE_FUNCTION, 
             (TEXT("-Ser_InternalMapRegisterAddresses: mapped at 0x%x\r\n"),
              ioPortBase ));

    return ioPortBase;
}


static
BOOL
SerSetIRBaudRate(
                PSCIF_INFO   pHWHead,
                ULONG baud     // @parm     UINT16 what is the baud rate
                )
{
    DEBUGMSG (ZONE_INIT, (TEXT("Serial set IR Baud %d\r\n"),
                          baud));

    // We don't support IR
    return (FALSE);
}


//
// Helper routine to search through a lookup table for a designated
// key.
//
ULONG
SCIF_LookUpValue(
    ULONG	Key,
    PLOOKUP_TBL pTbl,
    PULONG	pErrorCode
    )
{
    ULONG   index = 0;

    *pErrorCode = 0;

    while ( index < pTbl->Size )
	{
        if ( Key == pTbl->Table[index].Key )
            return pTbl->Table[index].AssociatedValue;

        ++index;
	}

    *pErrorCode = (ULONG)-1;

    return 0;
}

//
// Helper function.  Pass in a baudrate, and the corresponding divisor
// (from the baudtable) is returned.  If no matching baudrate is found
// in baudtable, then return 0.
//
USHORT
SCIF_DivisorOfRate(
    PVOID   pHead,      // @parm PVOID returned by HWinit.
    ULONG   BaudRate	// @parm     ULONG representing decimal baud rate.    
    )
{
    ULONG   errorcode = 0;
    USHORT  divisor;

//    divisor = (USHORT)LookUpValue(BaudRate, ((PSCIF_INFO) pHead)->pBaudTable, &errorcode);
    divisor = (USHORT)SCIF_LookUpValue(BaudRate, (PLOOKUP_TBL)&SCIF_BaudTable, &errorcode);

    if ( errorcode )
        divisor = 0;

    return divisor;
}

//
// This function is a derivative of the ReadLSR function
// from the 16550 driver. Everytime that we need to
// check the status of the connection (errors, etc) we
// do it by calling this function. It reads the register
// and reports any errors to the MDD. That is convenient.
//
USHORT
ReadStatus(
    PVOID  pHead
    )
{
    PSCIF_INFO pHWHead = (PSCIF_INFO)pHead;
    ULONG LineEvents = 0;
    USHORT	FSR;
    USHORT	LSR;
    int		i,j;
    USHORT	SCFDR;
    
    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;
    }
    if ( (FSR & (SCIF_SSR_PER | SCIF_SSR_FER | SCIF_SSR_BRK)) ||
         (LSR & SCIF_LSR_ORER) || (FSR & SCIF_SSR_ER) ){

		if ( FSR & SCIF_SSR_ER )
			pHWHead -> CommErrors |= CE_FRAME|CE_RXPARITY;

        if ( FSR & SCIF_SSR_PER )
            pHWHead -> CommErrors |= CE_RXPARITY;

        if ( FSR & SCIF_SSR_FER )
            pHWHead -> CommErrors |= CE_FRAME;

        if ( LSR & SCIF_LSR_ORER ){
            pHWHead -> CommErrors |= CE_OVERRUN;
            pHWHead -> DroppedBytes ++;
        }

        if ( LSR & SCIF_SSR_BRK )
            LineEvents |= EV_BREAK;

        LineEvents |= EV_ERR;

	    try
	    {
	        if ( FSR & SCIF_SSR_BRK ){
	            WRITE_REGISTER_USHORT(pHWHead -> pFSR, FSR & ~SCIF_SSR_BRK);
	        }
			if ( LSR & SCIF_LSR_ORER ){
				// receive FIFO clear
				SCFDR = READ_REGISTER_USHORT(pHWHead -> pFDR);
				j  = (SCFDR & 0x001f);
				//pHWHead -> DroppedBytes += j;
				DEBUGMSG (ZONE_THREAD,(TEXT("find overrun : receive FIFO clear %d\r\n"), j));
				for( i = 0; i < j; i++ )
					READ_REGISTER_UCHAR(pHWHead -> pFRDR);
				WRITE_REGISTER_USHORT(pHWHead -> pLSR, LSR & ~SCIF_LSR_ORER);
			}
			if ( FSR & SCIF_SSR_ER ){
				WRITE_REGISTER_USHORT(pHWHead -> pFSR, FSR & ~SCIF_SSR_ER);
			}

			// Check Error
	        if ( FSR & (SCIF_SSR_ER | SCIF_SSR_PER | SCIF_SSR_FER | SCIF_SSR_BRK) ){
				// Error Process
	        	if( FSR ){
	        		j  = ((FSR & 0xf000) >> 12);
	        		j |= ((FSR & 0x0f00) >>  8);
	        	}
	        	else{
	        		j = 16;
	        	}
				for( i = 0; i < j; i++ )
	                READ_REGISTER_UCHAR(pHWHead -> pFRDR);

	            WRITE_REGISTER_USHORT(pHWHead->pFSR, FSR & ~(SCIF_SSR_ER | SCIF_SSR_PER | SCIF_SSR_FER | SCIF_SSR_BRK));
	        }
		}
		except (GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ?
				    EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
		}
	}
	// Let WaitCommEvent know about this error
	if ( LineEvents )
		EvaluateEventFlag( pHWHead -> pMddHead, LineEvents );
//        pHWHead -> EventCallback( pHWHead -> pMddHead, LineEvents );
    return FSR;
}

//
// This function checks the status of all of the modem
// signals : CTS, RTS.
//
USHORT
ReadModemStatus(
    PVOID  pHead
    )
{
    PSCIF_INFO  pHWHead = (PSCIF_INFO)pHead;
    ULONG       Events = 0;
    USHORT      MSR;
    
    try
    {
        MSR = READ_REGISTER_USHORT(pHWHead -> pSPTR);
    }
    except (GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ?
            EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
        MSR = 0;
    }

    if( (pHWHead->SPTR & SCIF_SPTR_CTS) != (MSR & SCIF_SPTR_CTS) ){

        // For changes, we use callback to evaluate the event
        if ( !(MSR & SCIF_SPTR_CTS) ){
            Events |= EV_CTS;
            pHWHead->ModemStatus &= ~MS_CTS_ON;
            pHWHead->ModemStatus &= ~MS_RLSD_ON;
        }
        else{
            pHWHead->ModemStatus |= MS_CTS_ON;
            pHWHead->ModemStatus |= MS_RLSD_ON;
            Events |= EV_RLSD;
        }
    }

    if( Events )
        EvaluateEventFlag( pHWHead -> pMddHead, Events );

//        pHWHead->EventCallback( pHWHead->pMddHead, Events );
	pHWHead->SPTR = MSR;

    return MSR;
}


#define IER_NORMAL_INTS (SCIF_SCR_RIE | SCIF_SCR_REIE)

//
/////////////////// Start of exported entrypoints ////////////////
//


//
// @doc OEM 
// @func ULONG | SCIF_Close | Does nothing except keep track of the
// open count so that other routines know what to do.
//
ULONG
SCIF_Close(
    PVOID   pHead // @parm PVOID returned by HWinit.
    )
{
    PSCIF_INFO pHWHead = (PSCIF_INFO)pHead;

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

    if( pHWHead->OpenCount )
        pHWHead->OpenCount--;
    if ( !pHWHead -> OpenCount ){
        try
        {
			while( !(READ_REGISTER_USHORT(pHWHead -> pFSR) & SCIF_SSR_TEND) );
			while(  (READ_REGISTER_USHORT(pHWHead -> pFSR) & SCIF_SSR_RDF) );

			// Disable all interrupts and clear MCR.
            WRITE_REGISTER_USHORT(pHWHead -> pSCR, READ_REGISTER_USHORT(pHWHead -> pSCR) &
                ~(SCIF_SCR_TIE|SCIF_SCR_RIE|SCIF_SCR_REIE|SCIF_SCR_TE|SCIF_SCR_RE) );
            WRITE_REGISTER_USHORT(pHWHead -> pFCR, SCIF_FCR_TFRST | SCIF_FCR_RFRST);
        }
        except (GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ?
                EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
            // Just get out of here.
        }
    }
	dma_InterruptDisable(pHWHead -> pRxDma);
	dma_InterruptDisable(pHWHead -> pTxDma);
    dma_Stop(pHWHead -> pRxDma);
    dma_Stop(pHWHead -> pTxDma);

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


/*
 @doc OEM 
 @func PVOID | SerPostInit | Performs final hardware initialization.
 *
 */
BOOL
SCIF_PostInit(
         PVOID   pHead   // @parm PVOID returned by SerInit.
         )
{
    PSCIF_INFO   pHWHead = (PSCIF_INFO)pHead;

    DEBUGMSG (ZONE_INIT,(TEXT("+SerPostInit, 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.
//    ClearPendingInts( pHWHead );
    ReadModemStatus( pHWHead );

    DEBUGMSG (ZONE_INIT,(TEXT("-SerPostInit, 0x%X\r\n"), pHWHead));

    return TRUE;
}


// Routine to clear any pending interrupts.  Called from Init and PostInit
// to make sure we atart out in a known state.
/*
VOID
ClearPendingInts(
       PSCIF_INFO   pHead // @parm PVOID returned by HWinit.
       )
{
    PSCIF_INFO pHWHead = (PSCIF_INFO)pHead;


    EnterCriticalSection(&(pHWHead->RegCritSec));

    try {
    	// Clear Interrupt
    }
    except (GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ?
            EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
        DEBUGMSG (ZONE_ERROR,(TEXT("-SerPostInit, 0x%X - ERROR\r\n"), pHWHead));
        // Just fall through & release CritSec
    }

    LeaveCriticalSection(&(pHWHead->RegCritSec));
}
*/


/*
 *  NOTE : The caller should have set pHWHead->fIRMode.  It is not
 * set here, since power on/off may need to temporarily disable
 * the intefaces without actually overwriting the current recorded
 * mode.
 */
static
void
SerSetOutputMode(
                PSCIF_INFO   pHWHead,
                BOOL UseIR,     // @parm     BOOL Should we use IR interface
                BOOL Use9Pin    // @parm     BOOL Should we use Wire interface
                )
{
    // If you support IR, here you need to set the interface to either IR mode
    // or normal serial. Note that it is possible for both BOOls to
    // be false (i.e. power down), but never for both to be TRUE.
}


/*++
*******************************************************************************
Routine:

    Ser_GetRegistryData

Description:

    Take the registry path provided to COM_Init and use it to find this 
    requested comm port's DeviceArrayIndex, the IOPort Base Address, and the
    Interrupt number.
   
Arguments:

    LPCTSTR regKeyPath	the registry path passed in to COM_Init.

Return Value:

    -1 if there is an error.

*******************************************************************************
--*/
BOOL
Ser_GetRegistryData(PSCIF_INFO pHWHead, LPCTSTR regKeyPath)
{
#define GCI_BUFFER_SIZE 256   

    LONG    regError;
    HKEY    hKey;

    DEBUGMSG(ZONE_INIT, (TEXT("Try to open %s\r\n"), regKeyPath));

    // We've been handed the name of a key in the registry that was generated
    // on the fly by device.exe.  We're going to open that key and pull from it
    // a value that is the name of this serial port's real key.  That key
    // will have the DeviceArrayIndex that we're trying to find.  

    regError = RegOpenKeyEx(
                           HKEY_LOCAL_MACHINE, 
                           regKeyPath,
                           0, 
                           KEY_ALL_ACCESS, 
                           &hKey);
    if ( regError != ERROR_SUCCESS ) {
        DEBUGMSG(ZONE_INIT | ZONE_ERROR,
                 (TEXT("Failed to open %s, Error 0x%X\r\n"), regKeyPath, regError));
        return ( FALSE );                

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲欧美一区二区三区久本道91| 国产精品视频一二三区| 在线免费观看日韩欧美| 欧美高清视频不卡网| 2023国产精华国产精品| 国产精品久久久久久福利一牛影视 | 国产电影一区在线| 麻豆成人在线观看| av亚洲精华国产精华| 欧美妇女性影城| 久久久亚洲午夜电影| 一区二区三区丝袜| 国产盗摄一区二区三区| 欧美日本韩国一区| 中文字幕不卡三区| 蜜桃av一区二区三区| 国产91精品精华液一区二区三区| 欧美亚日韩国产aⅴ精品中极品| 精品国产a毛片| 午夜视频一区在线观看| 国产成人精品综合在线观看 | 在线观看亚洲a| 久久理论电影网| 麻豆国产91在线播放| 日本高清免费不卡视频| 国产三级精品在线| 日韩和的一区二区| 国产成人免费视频网站高清观看视频| 欧美一个色资源| 亚洲一级二级三级在线免费观看| 国产一区二区三区免费在线观看| 欧美精品一卡二卡| 亚洲欧美一区二区在线观看| 国产成都精品91一区二区三| 欧美一级欧美三级| 亚洲国产精品一区二区尤物区| 国产不卡视频一区二区三区| 欧美疯狂做受xxxx富婆| 亚洲午夜久久久久中文字幕久| 成人免费观看男女羞羞视频| 日韩亚洲欧美成人一区| 亚洲1区2区3区4区| 国产成人午夜精品5599| 精品国产乱码久久久久久久| 日本在线播放一区二区三区| 日本高清不卡一区| 亚洲六月丁香色婷婷综合久久| 亚洲国产日韩a在线播放性色| 91福利视频在线| 玉米视频成人免费看| 色综合激情久久| 最新国产の精品合集bt伙计| 一本大道综合伊人精品热热| 亚洲日穴在线视频| 色欧美88888久久久久久影院| 亚洲欧洲无码一区二区三区| 国产91精品入口| 亚洲蜜臀av乱码久久精品| 99久久精品免费精品国产| 国产精品进线69影院| 97久久超碰国产精品电影| 国产日产亚洲精品系列| 色综合久久综合网欧美综合网| 国产精品不卡在线| 欧洲精品一区二区| 无码av免费一区二区三区试看| 91麻豆精品国产91久久久资源速度| 日本不卡视频在线观看| 精品久久久久久亚洲综合网| 久久国产精品99久久久久久老狼| 精品欧美乱码久久久久久| 国产一区二区在线视频| 国产精品午夜在线| 在线免费观看视频一区| 日日夜夜精品视频天天综合网| 日韩三级视频在线看| 国产麻豆一精品一av一免费| 国产精品萝li| 欧美日韩在线播放三区四区| 捆绑调教美女网站视频一区| 欧美日韩国产a| 粉嫩一区二区三区性色av| 怡红院av一区二区三区| 欧美一级专区免费大片| 国产69精品久久久久毛片 | 久久综合九色综合97婷婷| 精品制服美女久久| 亚洲男人天堂av| 欧美婷婷六月丁香综合色| 青椒成人免费视频| |精品福利一区二区三区| 99久久精品国产网站| 亚洲高清免费观看高清完整版在线观看 | 国产精品私房写真福利视频| 91在线视频播放地址| 日韩成人一级片| 国产精品无遮挡| 在线播放中文字幕一区| 国产精品白丝jk黑袜喷水| 亚洲va天堂va国产va久| 久久精品水蜜桃av综合天堂| 欧美午夜视频网站| 激情综合色播激情啊| 亚洲最大成人综合| 久久综合资源网| 欧美日韩午夜在线视频| 成人动漫一区二区在线| 久久99精品国产麻豆不卡| 亚洲综合999| 精品国产乱码久久久久久夜甘婷婷| 97久久精品人人澡人人爽| 国产毛片精品视频| 天堂一区二区在线免费观看| 国产精品伦理在线| 精品欧美一区二区三区精品久久| 欧美亚洲国产一区二区三区| 国产美女一区二区三区| 国产在线一区二区综合免费视频| 亚洲成人午夜影院| 日韩和欧美的一区| 亚洲v精品v日韩v欧美v专区| 亚洲国产日韩精品| 亚洲精品国产精华液| 一区二区三区美女视频| 国产精品国产三级国产有无不卡 | 色香色香欲天天天影视综合网| 丁香亚洲综合激情啪啪综合| 九九九精品视频| 国产成人免费在线视频| 国产精品1024久久| 成人免费毛片嘿嘿连载视频| 国产麻豆精品视频| 99久久久国产精品| 91视频在线观看| 精品污污网站免费看| 91色综合久久久久婷婷| 欧美日韩在线播放三区| 91免费观看国产| 欧美日韩国产精选| 在线欧美小视频| 欧美另类变人与禽xxxxx| 欧美不卡一区二区| 2020国产精品| 亚洲免费av网站| 亚洲国产精品久久久男人的天堂 | 国产欧美一区二区精品性 | 欧美一区二区在线看| 2020日本不卡一区二区视频| 久久久国产一区二区三区四区小说 | 91麻豆成人久久精品二区三区| 91女厕偷拍女厕偷拍高清| 色哟哟国产精品| 日韩片之四级片| 国产视频一区二区三区在线观看| 亚洲日本青草视频在线怡红院 | 亚洲一卡二卡三卡四卡无卡久久| 日一区二区三区| 精品夜夜嗨av一区二区三区| av在线播放成人| 91小视频免费看| 日韩一级免费观看| 国产91丝袜在线播放| 欧美性淫爽ww久久久久无| 久久久久国产精品免费免费搜索| 中文字幕在线一区| 蜜臀精品久久久久久蜜臀 | 久久不见久久见免费视频1| av在线播放成人| 欧美绝品在线观看成人午夜影视| 国产精品天干天干在线综合| 亚洲一区在线观看网站| 成人午夜视频在线观看| 在线精品视频免费播放| 久久久欧美精品sm网站| 亚洲激情欧美激情| 国产 欧美在线| 91精品国产手机| 亚洲乱码日产精品bd| 日本成人在线不卡视频| 丰满放荡岳乱妇91ww| 欧美二区三区91| 椎名由奈av一区二区三区| 美腿丝袜亚洲色图| 欧美日韩亚洲综合在线 欧美亚洲特黄一级 | 欧美日韩高清不卡| 国产精品福利一区二区三区| 狠狠色丁香婷婷综合久久片| 一本久道久久综合中文字幕| 国产精品美女一区二区在线观看| 欧美成人在线直播| 五月天激情综合网| 日本韩国欧美在线| 中文字幕乱码一区二区免费| 精品一二三四在线| 欧美女孩性生活视频| 午夜av电影一区| 99riav久久精品riav| 国产精品久久午夜夜伦鲁鲁| 九色|91porny| 国产亚洲午夜高清国产拍精品|