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

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

?? ser2440_hw.c

?? 包含了大量文件
?? C
?? 第 1 頁 / 共 5 頁
字號:
/*++
THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
PARTICULAR PURPOSE.
Copyright (c) 1995-2000 Microsoft Corporation.  All rights reserved.
Copyright (c) 2001-2002 SAMSUNG Electronics Corporation.  All rights reserved.

Author	hmseo@sec.samsung.com (SAMSUNG Electronics)

Module Name:  

ser2440_hw.c

Abstract:  

    This file implements the standard device specific functions for a S3C2440
    based serial device.

Functions:
SER_RegAlloc
SER_VirtualAlloc
SER_VirtualFree
ReadLSR
ReadMSR
ShowSerialRegisters
ClearPendingInts
S2440_SetIrDAIOP
S2440_SetSerialIOP
S2440_SetIOP
SL_Open
SL_Close
SL_Init
SL_PostInit
SL_Deinit
SL_ClearDTR
SL_SetDTR
SL_ClearRTS
SL_SetRTS
SL_ClearBreak
SL_SetBreak
SetBaudRate
SL_SetBaudRate
SL_SetByteSize
SL_SetParity
SL_SetStopBits
SL_GetRxBufferSize
SL_GetRxStart
SL_GetInterruptType
SL_RxIntr
SL_PutBytes
SL_TxIntr
SL_TxIntrEx
SL_LineIntr
SL_OtherIntr
SL_ModemIntr
SL_GetStatus
SL_Reset
SL_GetModemStatus
SL_PurgeComm
SL_XmitComChar
SL_PowerOff
SL_PowerOn
SL_SetDCB
SL_SetCommTimeouts
SL_Ioctl

--*/

#define DEBUGMODE 0
#define ZONE_FUNCTION	1
#define USERDBG			1
#define ZONE_WRITE		1

#include <windows.h>
#include <types.h>
#include <ceddk.h>
#include <memory.h>
#include <serhw.h>
#include <ser16550.h>
#include <hw16550.h>
#include <nkintr.h>
#include <devload.h>
#include <windev.h>
#include <notify.h>

#include <pm.h>
#include <excpt.h>

#include "pmplatform.h"
#include "S2440.h"
#include "ser2440.h"

#define PUBLIC		
#define PRIVATE		static

PRIVATE volatile IOPreg   * v_pIOPregs;
PRIVATE volatile UART0reg * v_pUART0regs;
PRIVATE volatile UART1reg * v_pUART1regs;
PRIVATE volatile UART2reg * v_pUART2regs;
PRIVATE volatile INTreg   * v_pINTregs;
PRIVATE volatile PWMreg   * v_pPWMregs;

VOID SER_VirtualFree(VOID);
BOOL SER_VirtualAlloc(VOID);

VOID ReadLSR(PVOID pHead);
VOID ReadMSR(PVOID pHead);

BOOL SL_SetByteSize(PVOID pHead, ULONG ByteSize);
BOOL SL_SetStopBits(PVOID pHead, ULONG StopBits);
BOOL SL_SetParity(PVOID pHead, ULONG Parity);
BOOL SerPowerOn(PVOID   pHead);
BOOL SerPowerOff(PVOID   pHead);

#define EXCEPTION_ACCESS_VIOLATION STATUS_ACCESS_VIOLATION 

PRIVATE PVOID
SER_RegAlloc(PVOID addr, INT sz)
{
	PVOID reg;

	reg = (PVOID)VirtualAlloc(0, sz, MEM_RESERVE, PAGE_NOACCESS);

	if (reg)
	{
		if (!VirtualCopy(reg, addr, sz, PAGE_READWRITE | PAGE_NOCACHE )) 
		{
			VirtualFree(reg, sz, MEM_RELEASE);
			reg = NULL;
		}
	}

	return reg;
}


PRIVATE BOOL
SER_VirtualAlloc(VOID)
{
	BOOL r = FALSE;

    RETAILMSG(DEBUGMODE,(TEXT("::: SER_VirtualAlloc()\r\n")));

	do
	{
		v_pIOPregs = (volatile IOPreg *)SER_RegAlloc((PVOID)IOP_BASE, sizeof(IOPreg));
		if (v_pIOPregs == NULL) 
		{
			ERRORMSG(1,(TEXT("For IOPreg: VirtualAlloc failed!\r\n")));
			break;
		}
	
		v_pUART0regs = (volatile UART0reg *)SER_RegAlloc((PVOID)UART0_BASE, sizeof(UART0reg));
		if (v_pUART0regs == NULL) 
		{
	    	ERRORMSG(1,(TEXT("For UART0reg: VirtualAlloc failed!\r\n")));
		    break;
		}

		v_pUART1regs = (volatile UART1reg *)SER_RegAlloc((PVOID)UART1_BASE, sizeof(UART1reg));
		if (v_pUART1regs == NULL) 
		{
	    	ERRORMSG(1,(TEXT("For UART1reg: VirtualAlloc failed!\r\n")));
		    break;
		}

		v_pUART2regs = (volatile UART2reg *)SER_RegAlloc((PVOID)UART2_BASE, sizeof(UART2reg));
		if (v_pUART2regs == NULL) 
		{
	    	ERRORMSG(1,(TEXT("For UART2reg: VirtualAlloc failed!\r\n")));
		    break;
		}

		v_pINTregs = (volatile INTreg *)SER_RegAlloc((PVOID)INT_BASE, sizeof(INTreg));
		if (v_pINTregs == NULL) 
		{
	    	ERRORMSG(1,(TEXT("For INTregs: VirtualAlloc failed!\r\n")));
		    break;
		}

		v_pPWMregs = (volatile PWMreg *)SER_RegAlloc((PVOID)PWM_BASE, sizeof(PWMreg));
		if (v_pPWMregs == NULL) 
		{
	    	ERRORMSG(1,(TEXT("For PWMregs: VirtualAlloc failed!\r\n")));
		    break;
		}
		
		r = TRUE;
	} while (0);

	if (!r)
	{
		SER_VirtualFree();

		RETAILMSG(DEBUGMODE,(TEXT("::: SER_VirtualAlloc() - Fail\r\n")));
	}
	else
	{
		RETAILMSG(DEBUGMODE,(TEXT("::: SER_VirtualAlloc() - Success\r\n")));
	}


	return r;
}

PRIVATE void
SER_VirtualFree(VOID)
{
    RETAILMSG(DEBUGMODE,(TEXT("::: SER_VirtualFree()\r\n")));

	if (v_pIOPregs)
    {
        VirtualFree((PVOID)v_pIOPregs, sizeof(IOPreg), MEM_RELEASE);
        v_pIOPregs = NULL;
    }
    if (v_pUART0regs)
    {   
        VirtualFree((PVOID)v_pUART0regs, sizeof(UART0reg), MEM_RELEASE);
        v_pUART0regs = NULL;
    } 
    if (v_pUART1regs)
    {   
        VirtualFree((PVOID)v_pUART1regs, sizeof(UART1reg), MEM_RELEASE);
        v_pUART1regs = NULL;
    } 
    if (v_pUART2regs)
    {   
        VirtualFree((PVOID)v_pUART2regs, sizeof(UART2reg), MEM_RELEASE);
        v_pUART2regs = NULL;
    } 
    if (v_pINTregs)
    {   
        VirtualFree((PVOID)v_pINTregs, sizeof(INTreg), MEM_RELEASE);
        v_pINTregs = NULL;
    } 
    if (v_pPWMregs)
    {   
        VirtualFree((PVOID)v_pPWMregs, sizeof(INTreg), MEM_RELEASE);
        v_pPWMregs = NULL;
    } 
}

//
// Reading the LSR clears most of its bits.  So, we provide this wrapper,
// which reads the register, records any interesting values, and
// stores the current LSR contents in the shadow register.
//
//__inline
VOID
ReadLSR(PVOID pHead)
{
	PS2440_UART_INFO   pHWHead   = (PS2440_UART_INFO)pHead;
	ULONG LineEvents             = 0;
	ULONG LineStatus             = 0;
	UCHAR tmp;

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

	RETAILMSG(DEBUGMODE, (TEXT("ReadLSR \r\n")));

	try 
	{
		LineStatus = INREG(pHWHead,rUERSTAT);
		RETAILMSG(DEBUGMODE,  (TEXT("Line Status Register : 0x%x\r\n"), LineStatus));
	}

	except (GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ?
		EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) 
	{
		// pHWHead->LSR = SERIAL_LSR_THRE;
	}

	if ( LineStatus & (COM2440_LSR_OE | COM2440_LSR_PE | COM2440_LSR_FE))
	{
		// Note: Its not wise to do debug msgs in here since they will
		// pretty much guarantee that the FIFO gets overrun.
		if ( LineStatus & COM2440_LSR_OE )
		{
			// When overrun error occurs, S2440 rURXH must be read.
			tmp = *(pHWHead->pUFRXH);
			pHWHead->DroppedBytes++;
			pHWHead->CommErrors |= CE_OVERRUN;
			LineEvents |= EV_ERR;
		}

		if ( LineStatus & COM2440_LSR_PE )
		{
			pHWHead->CommErrors |= CE_RXPARITY;
			LineEvents |= EV_ERR;
		}

		if ( LineStatus & COM2440_LSR_FE )
		{
			pHWHead->CommErrors |= CE_FRAME;
			LineEvents |= EV_ERR;
		}
	}

	if ( LineStatus & COM2440_LSR_BI )
		LineEvents |= EV_BREAK;

	// Let WaitCommEvent know about this error
	if ( LineEvents )
		pHWHead->EventCallback( pHWHead->pMddHead, LineEvents );
}

//
// Reading the MSR clears many of its bits.  So, we provide this wrapper,
// which reads the register, records any interesting values, and
// stores the current MSR contents in the shadow register.
// Note that we always have DDCD and DCTS enabled, so if someone
// wants to keep an eye on these lines, its OK to simply read the
// shadow register, since if the value changes, the interrupt
// will cause the shadow to be updated.
//
//__inline
VOID
ReadMSR(PVOID pHead)
{
	PS2440_UART_INFO   pHWHead   = (PS2440_UART_INFO)pHead;
	ULONG Events = 0;
	ULONG msr, msr_DSR;

	RETAILMSG(DEBUGMODE, (TEXT("ReadMSR \r\n")));
	try 
	{
		// read nCTS status
		msr = INREG(pHWHead,rUMSTAT);
		RETAILMSG(DEBUGMODE,  (TEXT("Modem Status Register : 0x%x\r\n"), msr));

		// read nDSR status 
		// - As you know this routine is valid only at the SMDK2440 board.
		if ( !pHWHead->UseIrDA )
		{
			if(*(pHWHead->rDSRport) & (1<<(pHWHead->DsrPortNum)))	// Low active
			    msr_DSR = 0;
			else
			    msr_DSR = 1;
		}
	}

	except (GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ?
		EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH)
	{
		msr = 0;
	}

    // Save the MSR value in a shadow
    pHWHead->MSR = msr;

	// For changes, we use callback to evaluate the event
	if (msr & COM2440_MSR_DCTS)  // Delta CTS (SERIAL_MSR_DCTS)
	{
		Events |= EV_CTS;
		pHWHead->vUMSTAT |= COM2440_MSR_DCTS;
	} 

	if(msr & COM2440_MSR_CTS) 
		pHWHead->vUMSTAT |= COM2440_MSR_CTS;
	else
		pHWHead->vUMSTAT &= ~COM2440_MSR_CTS;

	// S2440 does not support Delta DSR status by H/W,
	// so we have to check this by S/W.
	//
	// if(DSR : High->Low) - became active
	if (msr_DSR)			// S2440 Evaluation Board bidged these two pins.
	{
		if(!(pHWHead->vUMSTAT & COM2440_MSR_DSR))
		{
			pHWHead->vUMSTAT |= COM2440_MSR_DDSR;
			Events |= EV_DSR;
			Events |= EV_RLSD;  // DCD
		}    // there is a change... H->L(became active)
		else
			pHWHead->vUMSTAT &= ~COM2440_MSR_DDSR;
		pHWHead->vUMSTAT |= COM2440_MSR_DSR;
	}
	// if(DSR : Low->High) - became in-active
	else
	{
		if((pHWHead->vUMSTAT & COM2440_MSR_DSR))
		{
			pHWHead->vUMSTAT |= COM2440_MSR_DDSR;
			Events |= EV_DSR;
			Events |= EV_RLSD;  // DCD
		}   // there is a change... L->H (became inactive)
		else
			pHWHead->vUMSTAT &= ~COM2440_MSR_DDSR;
		pHWHead->vUMSTAT &= ~COM2440_MSR_DSR;
	}

	RETAILMSG(DEBUGMODE,  (TEXT("ReadMSR Events:0x%x\r\n"), Events));
	RETAILMSG(DEBUGMODE,  (TEXT("ReadMSR MSR:0x%x\r\n"), msr));
	RETAILMSG(DEBUGMODE,  (TEXT("ReadMSR MSR_DSR:0x%x\r\n"), msr_DSR));   

	if ( Events )
		pHWHead->EventCallback( pHWHead->pMddHead, Events );
}

VOID
ShowSerialRegisters(PVOID  pHead)
{
	PS2440_UART_INFO   pHWHead   = (PS2440_UART_INFO)pHead;

	RETAILMSG(1, (TEXT("InterruptType : 0x%X, 0x%X, 0x%X, 0x%X\r\n"), 		
					*(pHWHead->UART_INTMASK), 		
					*(pHWHead->UART_INTSUBMASK),  		
					*(pHWHead->UART_INTSRCPND), 		
					*(pHWHead->UART_INTSUBSRCPND)));
	RETAILMSG(1,  (TEXT("rULCON: 0x%x "), pHWHead->s2440SerReg->rULCON));
	RETAILMSG(1,  (TEXT("rUCON: 0x%x "), pHWHead->s2440SerReg->rUCON));
	RETAILMSG(1,  (TEXT("rUFCON: 0x%x "), pHWHead->s2440SerReg->rUFCON));
	RETAILMSG(1,  (TEXT("rUMCON: 0x%x "), pHWHead->s2440SerReg->rUMCON));
	RETAILMSG(1,  (TEXT("rUERSTAT: 0x%x "), pHWHead->s2440SerReg->rUERSTAT));
	RETAILMSG(1,  (TEXT("rUFSTAT: 0x%x "), pHWHead->s2440SerReg->rUFSTAT));
	RETAILMSG(1,  (TEXT("rUMSTAT: 0x%x "), pHWHead->s2440SerReg->rUMSTAT));
	RETAILMSG(1,  (TEXT("rUTXH: 0x%x "), pHWHead->s2440SerReg->rUTXH));
	RETAILMSG(1,  (TEXT("rURXH: 0x%x "), pHWHead->s2440SerReg->rURXH));
	RETAILMSG(1,  (TEXT("rUBRDIV: 0x%x\r\n"), pHWHead->s2440SerReg->rUBRDIV));
	RETAILMSG(1,  (TEXT("pHWHead->vUMSTAT: 0x%x \r\n"), pHWHead->vUMSTAT));
	RETAILMSG(1,  (TEXT("pHWHead->CTSFlowOff: 0x%x \r\n\r\n"), pHWHead->CTSFlowOff));
}

#define BAUD_TABLE_SIZE 23
static const
PAIRS    LS_BaudPairs[BAUD_TABLE_SIZE] =
{
	{50,        2307},
	{75,        1538},
	{110,       1049},
	{135,        858},
	{150,        769},
	{300,        384},
	{600,        192},
	{1200,        96},
	{1800,        64},
	{2000,        58},
	{2400,        48},
	{3600,        32},
	{4800,        24},
	{7200,        16},
	{9600,        12},
	{12800,        9},
	{14400,        8},
	{19200,        6},
	{23040,        5},
	{28800,        4},
	{38400,        3},
	{57600,        2},
	{115200,       1}
};

static const
LOOKUP_TBL  LS_BaudTable = {BAUD_TABLE_SIZE, (PAIRS *) LS_BaudPairs};

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

	EnterCriticalSection(&(pHWHead->RegCritSec));

	RETAILMSG(DEBUGMODE,(TEXT("ClearPendingInts \r\n")));
	try
	{
		SETREG(pHWHead,rUFCON,0x6);    // tx, rx fifo reset
		ClearSubINTPnd(pHWHead, pHWHead->bTxINT | pHWHead->bRxINT | pHWHead->bErrINT);
		ClearINTPnd(pHWHead, pHWHead->bINT);
		tmpReg = INREG(pHWHead,rUERSTAT);
	}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
a美女胸又www黄视频久久| 美国十次了思思久久精品导航| 国产夫妻精品视频| 久久精品亚洲一区二区三区浴池| 国产一区二区三区久久悠悠色av| 久久久久久影视| av电影在线观看一区| 亚洲美女视频在线| 欧美精品乱人伦久久久久久| 日日骚欧美日韩| 精品国产1区二区| www.色综合.com| 亚洲一区二区三区小说| 4438x成人网最大色成网站| 精品在线一区二区| 中文字幕视频一区二区三区久| 色综合天天综合狠狠| 日韩成人免费看| 国产喷白浆一区二区三区| 色婷婷久久综合| 蜜臀av一区二区在线免费观看| 国产亚洲精品超碰| 欧美一a一片一级一片| 麻豆国产一区二区| **欧美大码日韩| 日韩久久免费av| av亚洲精华国产精华精华| 五月婷婷欧美视频| 日本一区二区免费在线观看视频 | 国产麻豆视频精品| 亚洲人成网站精品片在线观看| 欧美精三区欧美精三区| 国产成人av在线影院| 亚洲成a天堂v人片| 国产精品污网站| 国产精品欧美精品| 91精品在线免费| 91原创在线视频| 精品一区二区三区久久| 一区二区三区中文字幕电影| 久久综合999| 欧美手机在线视频| 成人性生交大片免费看视频在线| 亚洲成av人在线观看| 国产精品入口麻豆原神| 日韩亚洲欧美成人一区| 色综合色狠狠天天综合色| 国产乱子轮精品视频| 日韩激情中文字幕| 一区二区在线免费| 国产精品色呦呦| 精品国产一区二区三区av性色 | 亚洲欧美aⅴ...| 久久免费偷拍视频| 日韩精品中文字幕在线不卡尤物 | 粉嫩嫩av羞羞动漫久久久 | 视频一区二区中文字幕| 中文字幕在线观看一区| 久久久亚洲高清| 日韩午夜在线观看| 欧美三级一区二区| 色综合天天在线| 成人av资源在线| 国产精品99久久久久久有的能看| 日韩av在线发布| 午夜精品福利一区二区三区蜜桃| 亚洲欧洲精品一区二区精品久久久| 精品免费日韩av| 欧美一区二区高清| 欧美精品第1页| 欧美巨大另类极品videosbest | 欧美色成人综合| 91久久国产最好的精华液| 91小视频免费看| 一本色道综合亚洲| 91一区一区三区| 一道本成人在线| 日本高清不卡视频| 中文字幕不卡三区| 久久精品在线免费观看| 国产日韩欧美麻豆| 国产日韩欧美高清在线| 国产精品美女久久久久av爽李琼| 欧美激情一区二区三区不卡| 中文字幕av一区二区三区免费看 | 亚洲免费观看高清完整版在线观看 | 国产一区二区三区精品视频| 国产在线精品免费| 从欧美一区二区三区| 99久久国产综合精品色伊| 99re这里只有精品视频首页| 色综合久久久久综合体| 欧洲生活片亚洲生活在线观看| 欧美在线你懂的| 91精品福利在线一区二区三区| 日韩一区二区中文字幕| 久久婷婷色综合| 国产精品久久久久一区二区三区| 亚洲免费在线观看| 日韩精品乱码免费| 国产一区二区三区在线看麻豆| 成人性生交大合| 在线观看视频欧美| 欧美一级片在线看| 中国色在线观看另类| 亚洲已满18点击进入久久| 久久草av在线| 99v久久综合狠狠综合久久| 欧美日韩国产经典色站一区二区三区| 亚洲精品国产无套在线观| 亚洲成人在线免费| 国产精品乡下勾搭老头1| 91久久精品一区二区三| 欧美大白屁股肥臀xxxxxx| 国产精品视频免费看| 日本在线不卡视频| 丰满亚洲少妇av| 欧美精品tushy高清| 日本一区免费视频| 日本午夜精品视频在线观看| 国产成人在线网站| 欧美喷水一区二区| 国产精品视频线看| 日本成人在线看| 91在线观看地址| 久久精品亚洲精品国产欧美kt∨ | 亚洲成人综合在线| 国产精品一区专区| 欧美精品在线观看播放| 国产欧美精品一区二区三区四区 | 亚洲人成在线播放网站岛国| 蜜桃一区二区三区四区| 91香蕉国产在线观看软件| 日韩久久久久久| 五月天国产精品| 91丨九色丨蝌蚪丨老版| 日韩免费福利电影在线观看| 一卡二卡欧美日韩| 成人一区在线看| 日韩精品免费专区| 色哟哟一区二区在线观看| 精品99一区二区| 日韩精品一二三区| 欧美亚洲图片小说| 亚洲欧洲制服丝袜| caoporm超碰国产精品| 精品久久久久久无| 日本sm残虐另类| 欧美伊人精品成人久久综合97 | 96av麻豆蜜桃一区二区| 久久久久久久综合色一本| 日韩 欧美一区二区三区| 欧美日韩中文国产| 亚洲第一搞黄网站| 欧美亚洲一区三区| 亚洲一区二区在线免费看| 91视频一区二区三区| 中文字幕五月欧美| www.成人网.com| 国产精品成人免费精品自在线观看| 国产在线一区观看| 久久先锋资源网| 国产毛片精品一区| 国产欧美一二三区| 成人伦理片在线| 亚洲欧洲av在线| 91丝袜美女网| 亚洲精品福利视频网站| 色欧美88888久久久久久影院| 中文字幕一区二区三区在线观看 | 91蜜桃网址入口| **性色生活片久久毛片| 91麻豆免费看片| 一区二区三区在线观看网站| 色域天天综合网| 亚洲成人av在线电影| 欧美军同video69gay| 蜜桃精品视频在线观看| 欧美不卡一区二区三区| 激情都市一区二区| 久久九九国产精品| 99在线精品一区二区三区| 亚洲女人****多毛耸耸8| 欧美色视频在线| 美女视频黄久久| 欧美国产日韩一二三区| 91免费视频网址| 日韩激情在线观看| 精品国产91乱码一区二区三区| 国产电影一区在线| 懂色av一区二区三区免费观看| 国产精品视频第一区| 欧美在线999| 精品综合久久久久久8888| 亚洲国产激情av| 欧美无乱码久久久免费午夜一区| 欧美bbbbb| 国产精品看片你懂得| 欧美日韩亚洲综合在线| 极品美女销魂一区二区三区免费|