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

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

?? sc2410_usb_ser.c

?? 三星公司2410的usb驅動程序
?? C
?? 第 1 頁 / 共 4 頁
字號:
/*+
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) 2001. Samsung Electronics, co. ltd  All rights reserved.

Module Name:  

Abstract:

	S3C2410 USB function(ACTIVE SYNC) device driver (Wrapper layer)

rev:
	2003.3.19	: updated for USB-DMA (purnnamu)
	2002.5.7	: Add to s3c2410_code (Seung-han, Lim)
	2002.1.22	: First release/no error recovery (kwangyoon LEE, kwangyoon@samsung.com)

Notes: 
*/
/* MiTAC Int'l Corp. 2002     

$release notes
Modifier         sign                 date                   Description
================================================================================
Jocky	jocky0308		03/08/2006 		   Do not set too many events.
Ed Yeh      edyeh1108            11/8/2005              Add AC-in event.
Jonathan    Jonathan01_0915      09/15/2005             Modify S2440 USB Driver to PNA500 


*/

#include <windows.h>
#include <types.h>
#include <ceddk.h>
#include <memory.h>
#include <notify.h>
#include <serhw.h>
#include "S2410.h"
#include <SC2410_usb_hw.h>
#include <SC2410_usb_ser.h>
#include <nkintr.h>
#include <oalintr.h>
#include <devload.h>
#include <windev.h>
#undef ZONE_INIT
#include <serdbg.h>
#include <celog.h> 
#include <drv_glob.h> //:-)
#include "drvlib.h" //Jonathan01_0915



extern VOID SerialEventHandler(PVOID pHead);

extern void msWait(unsigned msVal);

extern volatile USBD_GLOBALS *usbdShMem;	//:-)
//Jonathan01_0915 start
volatile PDRIVER_GLOBALS  pDriverGlobals = NULL;
volatile IOPreg           *s2410IOP      = NULL;       
volatile CLKPWRreg        *s2410CLKPW    = NULL;    
//Jonathan01_0915 end

static HANDLE hUSBAcInIntr = NULL; //edyeh1108


__inline static VOID
SignalRemoval( PSER_INFO pHWHead )
{
	pHWHead->ModemStatus &= ~MS_RLSD_ON;
	EvaluateEventFlag(pHWHead->pMddHead, EV_RLSD);
}


static
DWORD WINAPI SerEventThread(PSER_INFO pHWHead)
{
	ULONG WaitReturn;
	static HWND fgp=NULL, prev_fgp	= NULL; 	
	static HWND dialog_hwnd			= NULL;
	static ULONG firstplug			= 0, toretry = 0;
	static PROCESS_INFORMATION pi_usbcnect, pi_repllog;
	
	DEBUGMSG(1, (TEXT("++SerEventThread\r\n")));
	DEBUGMSG(1, (TEXT("Spinning in dispatch thread %X\n\r"), pHWHead));
	
	while (!pHWHead->pDispatchThread)
		Sleep(20);

	while (!pHWHead->KillRxThread) {
		DEBUGMSG (1, (TEXT("Event %X, Index %d, Int %d\r\n"), 
				pHWHead->hSerialEvent,
				pHWHead->dwDevIndex,
				pHWHead->pHWObj->dwIntID ));

	// Ugly.  We don't get an interrupt when we are unplugged from the
	// bus, but we'd like to know when that happens.  So we use a timeout
	// on our interrupt wait.  This effectively allows me to poll the SOF
	// status, and if SOFs stop arriving, I'll assume we have been
	// disconnected from the bus.  Wait is last, allowing us to essentially
	// spoof one interrupt right at startup.

	// Only poll if we are opened and active.  Otherwise no one cares

#ifdef POLL_FOR_DISCONNECT
		if (pHWHead->cOpenCount && pHWHead->dConfIdx)
		{
			// DEBUGMSG(1, (TEXT("waitforsingleobject in up\r\n")));
      
			WaitReturn = WaitForSingleObject(pHWHead->hSerialEvent, SC2410_USB_POLL_RATE);
			// DEBUGMSG(1, (TEXT("waitforsingleobject in\r\n")));
		}
		else
#endif        
		{
		  	//DEBUGMSG(1, (TEXT("waitforsingleobject out up\r\n"))); 
	      	WaitReturn = WaitForSingleObject(pHWHead->hSerialEvent, INFINITE);

/*
	      	DEBUGMSG(1, (TEXT("waitforsingleobject out\r\n")));  
	
		  	if (WaitReturn == WAIT_ABANDONED)
		  	{
				DEBUGMSG(1, (TEXT("WAIT_ABANDONED\r\n")));
			}
	
			if (WaitReturn == WAIT_OBJECT_0)
			{
				DEBUGMSG(1, (TEXT("WAIT_OBJECT_0\r\n")));
			}
	
			if (WaitReturn == WAIT_TIMEOUT)
			{
				DEBUGMSG(1, (TEXT("WAIT_TIMEOUT\r\n")));
			}
	
			if (WaitReturn == WAIT_FAILED)
			{
				DEBUGMSG(1, (TEXT("WAIT_FAILED\r\n")));
			}
*/
		}
	
		SerialEventHandler(pHWHead->pMddHead);
		InterruptDone(pHWHead->pHWObj->dwIntID);
	}
	
	DEBUGMSG (1, (TEXT("--SerEventThread %x exiting\r\n"), pHWHead));

	return (0);
}

static
BOOL StartEventThread(PSER_INFO pHWHead)
{
    
	// Initialize the interrupt to be associated with the hSerialEvent
	// event. If this call fails, then another process has registered 
	// for the interrupt, so fail the init and set the hSerialEvent to NULL.
	DEBUGMSG(1, (TEXT("Initializing interrupt 0x%X, 0x%X\n\r"),
			pHWHead->pHWObj->dwIntID, pHWHead->hSerialEvent));

	if (!InterruptInitialize(pHWHead->pHWObj->dwIntID, pHWHead->hSerialEvent, 0, 0)) 
	{

		DEBUGMSG(1, (TEXT("Error initializing interrupt\n\r")));

		return (FALSE);
	}

	InterruptDone(pHWHead->pHWObj->dwIntID);
    
	// Now set up the dispatch thread 
	pHWHead->KillRxThread = 0;

	DEBUGMSG(1, (TEXT("Spinning thread%X\n\r"), pHWHead));

	pHWHead->pDispatchThread = CreateThread(NULL,0, SerEventThread,
							pHWHead, 0,NULL);
	if (pHWHead->pDispatchThread == NULL) 
	{
		DEBUGMSG(1, (TEXT("Error creating Event thread (%d)\n\r"), GetLastError()));
		return (FALSE);
	}

	DEBUGMSG (1, (TEXT("Created Event thread %X\r\n"), pHWHead->pDispatchThread));
	DEBUGMSG (1, (TEXT("About to set priority\r\n")));

	CeSetThreadPriority(pHWHead->pDispatchThread, DEFAULT_THREAD_PRIO);
                          
	DEBUGMSG (1, (TEXT("Back from setting priority\r\n")));

	return (TRUE);
}

/***************************************************************
 @doc OEM
 @func VOID | SerSetBaudRate |
 * This routine sets the baud rate of the device.
 *  Not exported to users, only to driver.
 *
 @rdesc None.
 ****************************************************************/
static
BOOL SerSetBaudRate( PVOID pHead,	// @parm PVOID returned by SerInit
		     ULONG BaudRate )	// @parm ULONG representing decimal baud rate.
{
	PSER_INFO   pHWHead = (PSER_INFO)pHead;

	DEBUGMSG(1, (TEXT("SerSetBaudRate\r\n")));

	// Baudrate is meaningless.  Just be agreeable and say we did it.
	return (TRUE);    
}

/****************************************************************
	@doc INTERNAL

	@func VOID | SerUSB_InternalMapRegisterAddresses |
		This routine maps the ASIC registers. 
		It's an artifact of this
		implementation.

	@rdesc None.
****************************************************************/
static
void SerUSBInternalMapRegisterAddresses( PSER_INFO   pHWHead )
{
	PUCHAR  pVMem;
	BOOL    bMapReturn;
	ULONG   err			= 0;
  
	DEBUGMSG(1, (TEXT("++SerUSBInternalMapRegisterAddresses\r\n")));

	// Map CSR registers.
	pVMem = (PUCHAR)VirtualAlloc(0, PAGE_SIZE*2, MEM_RESERVE, PAGE_NOACCESS);
	
	if (pVMem) 
	{
		DEBUGMSG(1, (TEXT("VirtualAlloc Succeeded\r\n")));

		bMapReturn = VirtualCopy( pVMem,
					  (LPVOID)pHWHead->dwIOBase,
					  PAGE_SIZE,
					  PAGE_READWRITE | PAGE_NOCACHE );
		if (!bMapReturn) 
		{
			err = GetLastError();
			DEBUGMSG(1, (TEXT("Virtual Copy: Serial SPACE FAILED\r\n")));
		}

		pVMem = (BYTE *)pVMem;
		pHWHead->pUSBCtrlAddr=(volatile struct udcreg *)((BYTE *)pVMem + 0x140); // offset

		bMapReturn = VirtualCopy( pVMem+PAGE_SIZE,
					  (LPVOID)IOP_BASE,
					  PAGE_SIZE,
					  PAGE_READWRITE | PAGE_NOCACHE );
		if (!bMapReturn) 
		{
			err = GetLastError();
			DEBUGMSG(1, (TEXT("Virtual Copy: IOP SPACE FAILED\r\n")));
		}

		pHWHead->pIrqCtrlAddr=(volatile IOPreg *)(pVMem+PAGE_SIZE);

		bMapReturn = VirtualCopy( pVMem+PAGE_SIZE,
					  (LPVOID)CLKPWR_BASE,
					  PAGE_SIZE,
					  PAGE_READWRITE | PAGE_NOCACHE );
		if (!bMapReturn) 
		{
			err = GetLastError();
			DEBUGMSG(1, (TEXT("Virtual Copy: CLKPWR SPACE FAILED\r\n")));
		}

		pHWHead->pCLKPWR = (volatile CLKPWRreg *)(pVMem+PAGE_SIZE);
		
	} else {
    		DEBUGMSG(1, (TEXT("Virtual Alloc: FAILED\r\n")));
	}
  
		DEBUGMSG(1, (TEXT("VirtualCopy Succeeded, pVMem:%x\r\n"), pVMem));

		DEBUGMSG(1, (TEXT("--SerUSBInternalMapRegisterAddresses\r\n")));
}

static
BOOL SerSetIRBaudRate( PSER_INFO pHWHead, ULONG baud )	// @parm baud rate - ignored
{
	DEBUGMSG(1, (TEXT("Serial set IR Baud %d\r\n"), baud));

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



/*******************************************************************************
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.

******************************************************************************/

static
BOOL Ser_GetRegistryData(PSER_INFO pHWHead,	LPCTSTR regKeyPath)
{
#define GCI_BUFFER_SIZE 256   

	LONG    regError;
	HKEY    hKey;
	TCHAR   devKeyPath[GCI_BUFFER_SIZE];
	DWORD   dwDataSize = GCI_BUFFER_SIZE;

	DEBUGMSG(1,
			(TEXT("Ser_GetRegistryData 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(1,(TEXT("Failed to open %s, Error 0x%X\r\n"),regKeyPath,regError));
		return (FALSE);                
	}

	regError = RegQueryValueEx( hKey, 
				    DEVLOAD_DEVKEY_VALNAME,
				    NULL, 
				    NULL, 
				    (LPBYTE)devKeyPath,
				    &dwDataSize);

	// We're done with that registry key, so close it.
	RegCloseKey (hKey);

	if (regError != ERROR_SUCCESS) 
	{
		DEBUGMSG(1, (TEXT("Failed to find data at %s\\%s, Error 0x%X\r\n"), 
				regKeyPath, DEVLOAD_DEVKEY_VALNAME, regError));
		return (FALSE);                
	}

	DEBUGMSG(1, (TEXT("Try to open %s\r\n"), devKeyPath));

	regError = RegOpenKeyEx(HKEY_LOCAL_MACHINE, 
				devKeyPath, 
				0,
				KEY_ALL_ACCESS, 
				&hKey);

	if (regError != ERROR_SUCCESS) 
	{
		DEBUGMSG(1,(TEXT("Failed to open %s, Error 0x%X\r\n"), devKeyPath, regError));
		return (FALSE);        
	}

	// Okay, we're finally ready to try and load our registry data.
	dwDataSize = SC2410USB_REG_DEVINDEX_VAL_LEN;

	regError   = RegQueryValueEx(hKey, 
				     SC2410USB_REG_DEVINDEX_VAL_NAME, 
				     NULL, 
				     NULL,
				     (LPBYTE)(&pHWHead->dwDevIndex), 
				     &dwDataSize);

	if (regError == ERROR_SUCCESS) 
	{
		dwDataSize = SC2410USB_REG_IRQ_VAL_LEN;

		regError = RegQueryValueEx( hKey, 
					    SC2410USB_REG_IRQ_VAL_NAME, 
					    NULL, 
					    NULL,
					    (LPBYTE)(&pHWHead->dwIRQ), 
					    &dwDataSize );
	}

	if (regError == ERROR_SUCCESS) 
	{
		dwDataSize = SC2410USB_REG_IOBASE_VAL_LEN;

		regError = RegQueryValueEx( hKey, 
					    SC2410USB_REG_IOBASE_VAL_NAME, 
					    NULL, 
					    NULL,
					    (LPBYTE)(&pHWHead->dwIOBase), 
					    &dwDataSize);
	}

	if (regError == ERROR_SUCCESS) 
	{
		dwDataSize = SC2410USB_REG_IOLEN_VAL_LEN;

		regError = RegQueryValueEx( hKey, 
					    SC2410USB_REG_IOLEN_VAL_NAME, 
					    NULL, 

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美综合一区二区| 麻豆91精品91久久久的内涵| 久久精品国产在热久久| 欧美成人精精品一区二区频| 九九国产精品视频| 国产精品水嫩水嫩| 色网站国产精品| 日韩和欧美的一区| 亚洲国产精品成人久久综合一区| 91成人在线精品| 国产精品综合一区二区| 一区二区三区在线影院| 日韩午夜三级在线| 不卡的av网站| 秋霞av亚洲一区二区三| 亚洲欧洲另类国产综合| 91精品国产欧美一区二区18| 高清不卡一二三区| 香蕉av福利精品导航| 中文天堂在线一区| 一区二区在线观看视频在线观看| 精品久久国产老人久久综合| 久久香蕉国产线看观看99| 在线观看视频一区二区欧美日韩| 欧美色手机在线观看| 国产99久久久久久免费看农村| 国产成人精品午夜视频免费| 人人超碰91尤物精品国产| 精品一区二区三区在线播放| 成人一级视频在线观看| 国产精品18久久久久久久网站| 成人动漫中文字幕| 欧美综合一区二区| 国产亚洲成av人在线观看导航| 91精品国产综合久久国产大片 | 日韩精品在线一区二区| 91在线精品一区二区| 国产精品456露脸| 91久久国产综合久久| 日韩欧美123| 一区二区三区中文字幕电影| 久久精工是国产品牌吗| 一本色道a无线码一区v| 日韩一区二区高清| 亚洲欧洲一区二区三区| 韩国成人福利片在线播放| 美腿丝袜一区二区三区| av在线一区二区三区| 91免费版pro下载短视频| www.av亚洲| 精品动漫一区二区三区在线观看| 91精品国产综合久久久久久久久久| 欧美日韩专区在线| 国产精品久99| 中文字幕一区不卡| 久久99精品久久久久婷婷| 在线一区二区观看| 亚洲私人黄色宅男| 亚洲国产精品久久久久秋霞影院 | 欧美自拍偷拍午夜视频| 国产亚洲一区二区三区四区| 日韩精品色哟哟| 欧美在线免费观看亚洲| 国产精品蜜臀在线观看| 国产真实乱偷精品视频免| 欧美一区二区视频在线观看2022| 一区二区三区色| 91看片淫黄大片一级| 国产精品国产三级国产| 丁香另类激情小说| 中文字幕乱码亚洲精品一区| 国精产品一区一区三区mba视频| 91精品欧美福利在线观看| 亚洲二区在线观看| 欧美日韩成人高清| 久久综合九色综合欧美亚洲| 日本视频中文字幕一区二区三区| 成人国产精品免费网站| 国产精品久久三区| 色呦呦国产精品| 亚洲精品免费视频| 欧美视频一区二区在线观看| 精品国产一区二区国模嫣然| 久久国产视频网| 久久久久青草大香线综合精品| 亚洲一级在线观看| 成人精品电影在线观看| 中文字幕中文乱码欧美一区二区 | 亚洲精品日韩专区silk| 91福利在线观看| 日韩av午夜在线观看| 日韩手机在线导航| 国产精品一区二区免费不卡| 欧美韩日一区二区三区四区| 91丨九色丨黑人外教| 一区二区三区高清在线| 91精品视频网| 国产在线不卡一区| 日韩亚洲电影在线| 国产福利精品导航| 一区二区三区精品视频在线| 555www色欧美视频| 国产91在线观看丝袜| 最新高清无码专区| 欧美岛国在线观看| 99re这里只有精品视频首页| 婷婷六月综合网| 欧美性三三影院| 精品一区二区三区在线播放视频| 国产精品久久毛片| 69p69国产精品| 成人毛片在线观看| 蜜臀av性久久久久av蜜臀妖精| 久久久天堂av| 欧美在线看片a免费观看| 九色porny丨国产精品| 亚洲免费av在线| 在线观看91视频| 国产福利一区二区三区| 亚洲综合色在线| 中文字幕高清一区| 日韩欧美一二三四区| 91理论电影在线观看| 国产麻豆一精品一av一免费| 亚洲电影视频在线| 国产精品电影一区二区| 久久久久久久久岛国免费| 欧美喷潮久久久xxxxx| a亚洲天堂av| 99久久精品免费看国产| 美国三级日本三级久久99| 亚洲黄色小说网站| 国产精品美女久久久久aⅴ国产馆 国产精品美女久久久久av爽李琼 国产精品美女久久久久高潮 | 中文字幕欧美三区| 亚洲精品一区二区三区福利| 欧美日韩在线播放| 91麻豆swag| 成人av午夜影院| 国产最新精品免费| 精品伊人久久久久7777人| 丝袜美腿亚洲色图| 亚洲www啪成人一区二区麻豆| 亚洲欧洲成人精品av97| 欧美激情一区在线观看| 久久综合久久久久88| 精品少妇一区二区三区| 欧美一级理论片| 欧美一区二区成人6969| 精品视频一区三区九区| 在线观看国产日韩| 欧美偷拍一区二区| 欧美三级三级三级| 这里只有精品免费| 日韩一区二区中文字幕| 日韩午夜在线影院| 欧美精品一区二区蜜臀亚洲| 欧美岛国在线观看| 国产网站一区二区三区| 欧美无砖专区一中文字| 欧美剧在线免费观看网站 | 国产成人精品一区二区三区网站观看| 久久精品国产色蜜蜜麻豆| 另类小说综合欧美亚洲| 国产一区二区三区不卡在线观看| 久久99热这里只有精品| 国产精品88888| 91丨porny丨国产| 欧美在线观看一区二区| 6080亚洲精品一区二区| 欧美videos大乳护士334| 国产视频一区不卡| 亚洲欧美日韩中文字幕一区二区三区| 亚洲欧美激情插| 日韩成人一级片| 国产成人精品免费在线| 色av成人天堂桃色av| 91精品国产91久久久久久一区二区 | 国产精品亚洲第一区在线暖暖韩国| 国产一区二区三区四区在线观看| 国产ts人妖一区二区| 一本大道久久精品懂色aⅴ| 欧美乱妇20p| 国产色一区二区| 亚洲精品大片www| 狠狠色丁香久久婷婷综合_中| 99精品国产91久久久久久| 欧美日韩国产免费| 国产日韩欧美高清在线| 日韩精品一区二| 亚洲欧美日韩人成在线播放| 日韩国产欧美三级| 色狠狠一区二区三区香蕉| 欧美三级三级三级爽爽爽| 久久看人人爽人人| 性久久久久久久| aaa欧美日韩| 精品久久99ma| 亚洲成人1区2区| 91色综合久久久久婷婷| 精品播放一区二区|