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

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

?? ser2410_ser.c

?? 三星2410 Windows CE 4.2 串口驅動源碼。適合所有以S3C2410X為主芯片開發的平臺。
?? C
?? 第 1 頁 / 共 2 頁
字號:
//
// Copyright (c) Microsoft Corporation.  All rights reserved.
//
//
// Use of this source code is subject to the terms of the Microsoft end-user
// license agreement (EULA) under which you licensed this SOFTWARE PRODUCT.
// If you did not accept the terms of the EULA, you are not authorized to use
// this source code. For a copy of the EULA, please see the LICENSE.RTF on your
// install media.
//
/*++
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.

Module Name:  

Abstract:  

Notes: 
--*/

#define EXAMINE_BOOTARGS
#define DEBUGMODE 0

#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 "S2410.h"

#define USERDBG        1

#ifdef EXAMINE_BOOTARGS
#include <bootarg.h>
#include <oalintr.h>
#include <pc.h>
#endif

#include <ser2410.h>

#undef ZONE_INIT
#include <serdbg.h>

#define BAUD_TABLE_SIZE 23
static const
PAIRS   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  BaudTable = {BAUD_TABLE_SIZE, (PAIRS *) BaudPairs};

// Miscellaneous internal routines.
PUCHAR
static
Ser_InternalMapRegisterAddresses(
                                ULONG   HWAddress,
                                ULONG   Size
                                )
{
	PUCHAR              ioPortBase; 
	ULONG               inIoSpace = 1;
	PHYSICAL_ADDRESS    ioPhysicalBase = { HWAddress, 0};

	RETAILMSG(DEBUGMODE, (TEXT("+ Ser_InternalMapRegisterAddresses : HalTranslateBusAddress\r\n")));
	if ( HalTranslateBusAddress(Isa, 0, ioPhysicalBase, &inIoSpace, &ioPhysicalBase) ) {
		DEBUGMSG(1, (TEXT("Ser_InternalMapRegisterAddresses : HalTranslateBusAddress - OK\r\n")));
	        if ( !inIoSpace ) {
			DEBUGMSG(1, (TEXT("Ser_InternalMapRegisterAddresses : ! IO Space\r\n")));
			if ( (ioPortBase = (PUCHAR)MmMapIoSpace(ioPhysicalBase, Size, FALSE)) == NULL ) {
				// We may as well not continue
				DEBUGMSG(ZONE_INIT | ZONE_ERROR, (TEXT("Error mapping I/O Ports\r\n")));
				return (NULL);
			}
		} else {
			DEBUGMSG(1, (TEXT("Ser_InternalMapRegisterAddresses : IO Space\r\n")));
			ioPortBase = (PUCHAR)ioPhysicalBase.LowPart;
		}
	} else {
		DEBUGMSG(ZONE_INIT | ZONE_ERROR, (TEXT("Error translating I/O Ports.\r\n")));
		return (NULL);
	}

	RETAILMSG(DEBUGMODE, (TEXT("- Ser_InternalMapRegisterAddresses : %d\r\n"),ioPortBase ));
	return (ioPortBase);
}

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

	PS2410_UART_INFO   pHWHead2   = (PS2410_UART_INFO)pHWHead;
	RETAILMSG (DEBUGMODE, (TEXT("SerSetOutputMode : ")));
	if(UseIR)  
	{
		RETAILMSG (DEBUGMODE, (TEXT("IRDA \r\n")));
		SETREG(pHWHead2,rULCON,SER2410_IRMODE_MASK);   // Infra-red mode enable.
	}
	else
	{
		RETAILMSG (DEBUGMODE, (TEXT("SERIAL \r\n")));
		CLEARREG(pHWHead2,rULCON,SER2410_IRMODE_MASK);   // Infra-red mode enable.
	}
}



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

    Ser_GetRegistryData

Description:

    Take the registry path provided to COM_Init and use it to find this 
    requested comm port's DeviceArrayIndex, teh 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(PSER_INFO pHWHead, LPCTSTR regKeyPath)
{
#define GCI_BUFFER_SIZE 256   

	LONG    regError;
	HKEY    hKey;
	DWORD   dwDataSize = GCI_BUFFER_SIZE;

	RETAILMSG(DEBUGMODE, (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.  
	hKey = OpenDeviceKey(regKeyPath);
	if ( hKey == NULL ) {
		DEBUGMSG(ZONE_INIT | ZONE_ERROR,(TEXT("Failed to open device key\r\n")));
		return ( FALSE );        
	}

	// Okay, we're finally ready to try and load our registry data.
	dwDataSize = PC_REG_DEVINDEX_VAL_LEN;
	regError = RegQueryValueEx(
					hKey, 
					PC_REG_DEVINDEX_VAL_NAME, 
					NULL, 
					NULL,
					(LPBYTE)(&pHWHead->dwDevIndex), 
					&dwDataSize);

	if ( regError == ERROR_SUCCESS ) {
		dwDataSize = PC_REG_IRQ_VAL_LEN;
		regError = RegQueryValueEx(
					hKey, 
					PC_REG_IRQ_VAL_NAME, 
					NULL, 
					NULL,
					(LPBYTE)(&pHWHead->dwIRQ), 
					&dwDataSize);
	}

	if ( regError == ERROR_SUCCESS ) {
		dwDataSize = PC_REG_IOBASE_VAL_LEN;
		regError = RegQueryValueEx(
					hKey, 
					PC_REG_IOBASE_VAL_NAME, 
					NULL, 
					NULL,
					(LPBYTE)(&pHWHead->dwIOBase), 
					&dwDataSize);
	}

	if ( regError == ERROR_SUCCESS ) {
		dwDataSize = PC_REG_IOLEN_VAL_LEN;
		regError = RegQueryValueEx(
					hKey, 
					PC_REG_IOLEN_VAL_NAME, 
					NULL, 
					NULL,
					(LPBYTE)(&pHWHead->dwIOLen), 
					&dwDataSize);
	}

	RegCloseKey (hKey);

	if ( regError != ERROR_SUCCESS ) {
		RETAILMSG(DEBUGMODE, (TEXT("Failed to get serial registry values, Error 0x%X\r\n"),regError));
		return ( FALSE );
	}

	RETAILMSG (DEBUGMODE,(TEXT("SerInit - Devindex %d, IRQ %d, IOB %X, IOLen %X \r\n"),
		pHWHead->dwDevIndex, pHWHead->dwIRQ, pHWHead->dwIOBase, pHWHead->dwIOLen));
	return ( TRUE ); 
}



/*
 @doc OEM 
 @func PVOID | SerInit | Initializes device identified by argument.
 *  This routine sets information controlled by the user
 *  such as Line control and baud rate. It can also initialize events and
 *  interrupts, thereby indirectly managing initializing hardware buffers.
 *  Exported only to driver, called only once per process.
 *
 @rdesc The return value is a PVOID to be passed back into the HW
 dependent layer when HW functions are called.
 */
static
PVOID
SerInit(
		BOOL bIR,
		ULONG   Identifier, // @parm Device identifier.
		PVOID   pMddHead,   // @parm First argument to mdd callbacks.
		PHWOBJ  pHWObj      // @parm Pointer to our own HW OBJ for this device
       )
{
	PSER_INFO   pHWHead;

#ifdef EXAMINE_BOOTARGS    
	PVOID       *ppBootArgs = NULL;  // Pointer to pointer to bootargs.
	PHYSICAL_ADDRESS PhysicalAddress = {0,0};
#endif    

	// Note on defaults.  While the PC typcially considers COM1 to be at 
	// 3F8, irq4 and COM2 to be 2F8, irq3, NKPC uses COM1 internally for the
	// debugger.  So, when NK tells me to start "COM1" it really means the
	// first one that's available, which is what the PC calls COM2.  Confused?
	// The end result is that COM1 on NK is what the PC considers to be COM2.
	// But wait, there's more.  On a Puzzle, the debugger is on COM2 and the
	// COM1 for NK is ACTUALLY COM1.  So PCs need 2F8 for their port base
	// and Puzzles need 3F8.

	RETAILMSG(DEBUGMODE, (TEXT("SerInit - !!! \r\n")));

	// Allocate for our main data structure and one of it's fields.
	pHWHead = (PSER_INFO)LocalAlloc( LMEM_ZEROINIT|LMEM_FIXED,	sizeof(SER_INFO) );
	if ( !pHWHead )
		return( NULL );

	if ( ! Ser_GetRegistryData(pHWHead, (LPCTSTR)Identifier) ) {
		DEBUGMSG (ZONE_INIT|ZONE_ERROR,
			(TEXT("SerInit - Unable to read registry data.  Failing Init !!! \r\n")));
		goto ALLOCFAILED;
	}

	pHWHead->pBaseAddress = Ser_InternalMapRegisterAddresses(pHWHead->dwIOBase, pHWHead->dwIOLen);

#ifdef EXAMINE_BOOTARGS        
	// Allocate a pointer to our bootargs since they may indicate that we don't have
	// access to the hardware resource.

	// First, map the bootargs pointer itself.  Note that I'm reading/writing
	// directly on the physical address.  I can do this since I know this is CEPC and 
	// know the adress is not in IO space.  For OEM platforms you would want to do
	// HalTranslateBusAddress first.
	PhysicalAddress.LowPart = BOOT_ARG_PTR_LOCATION & ~0x80000000;

	if ( ppBootArgs = MmMapIoSpace(PhysicalAddress, sizeof( PVOID ), TRUE ) ) {
		DEBUGMSG (ZONE_INIT,
			(TEXT("SerInit - ppBootArgs (%X) at %X\r\n"), 
			PhysicalAddress.LowPart, ppBootArgs ));
	} else {
		DEBUGMSG (ZONE_INIT | ZONE_ERROR,
			(TEXT("SerInit - ppBootArgs failure at %X\r\n"), PhysicalAddress.LowPart ));
		goto ALLOCFAILED;
	}

	// Now map the bootargs structure itself
	PhysicalAddress.LowPart = (DWORD) *ppBootArgs;
	if ( pHWHead->pBootArgs = MmMapIoSpace(PhysicalAddress, sizeof(BOOT_ARGS), TRUE ) ) {
		DEBUGMSG (ZONE_INIT,
			(TEXT("SerInit - pBootArgs (%X) at %X\r\n"), 
			PhysicalAddress.LowPart, pHWHead->pBootArgs ));
	} else {
		DEBUGMSG (ZONE_INIT | ZONE_ERROR,
			(TEXT("SerInit - pBootArgs failure at %X\r\n"), 
			(DWORD)PhysicalAddress.LowPart));
		goto ALLOCFAILED;
	}

	// We no longer need ppBootArgs
	MmUnmapIoSpace( ppBootArgs, sizeof(PVOID) );
#endif // EXAMINE_BOOTARGS

	pHWHead->pMddHead     = pMddHead;
	pHWHead->pHWObj = pHWObj;
	pHWHead->cOpenCount   = 0;

	RETAILMSG(DEBUGMODE,(TEXT("SerInit - IRQ %d = SYSINTR %d\r\n"),
					pHWHead->dwIRQ, pHWHead->pHWObj->dwIntID));

	// Set up our Comm Properties data    
	pHWHead->CommProp.wPacketLength       = 0xffff;
	pHWHead->CommProp.wPacketVersion     = 0xffff;
	pHWHead->CommProp.dwServiceMask      = SP_SERIALCOMM;
	pHWHead->CommProp.dwReserved1         = 0;
	pHWHead->CommProp.dwMaxTxQueue        = 16;
	pHWHead->CommProp.dwMaxRxQueue        = 16;
	pHWHead->CommProp.dwMaxBaud       = BAUD_115200;
	pHWHead->CommProp.dwProvSubType      = PST_RS232;
	pHWHead->CommProp.dwProvCapabilities =
		PCF_DTRDSR | PCF_RLSD | PCF_RTSCTS |
		PCF_SETXCHAR |
		PCF_INTTIMEOUTS |
		PCF_PARITY_CHECK |
		PCF_SPECIALCHARS |
		PCF_TOTALTIMEOUTS |
		PCF_XONXOFF;
	pHWHead->CommProp.dwSettableBaud      =
		BAUD_075 | BAUD_110 | BAUD_150 | BAUD_300 | BAUD_600 |
		BAUD_1200 | BAUD_1800 | BAUD_2400 | BAUD_4800 |
		BAUD_7200 | BAUD_9600 | BAUD_14400 |
		BAUD_19200 | BAUD_38400 | BAUD_56K | BAUD_128K |
		BAUD_115200 | BAUD_57600 | BAUD_USER;
	pHWHead->CommProp.dwSettableParams    =
		SP_BAUD | SP_DATABITS | SP_HANDSHAKING | SP_PARITY |
		SP_PARITY_CHECK | SP_RLSD | SP_STOPBITS;
	pHWHead->CommProp.wSettableData       =
		DATABITS_5 | DATABITS_6 | DATABITS_7 | DATABITS_8;
	pHWHead->CommProp.wSettableStopParity =
		STOPBITS_10 | STOPBITS_20 |
		PARITY_NONE | PARITY_ODD | PARITY_EVEN | PARITY_SPACE |
		PARITY_MARK;

	pHWHead->fIRMode = bIR;
	pHWHead->s2410COM.UseIrDA = bIR;

#ifdef EXAMINE_BOOTARGS
	// Don't actually init the hardware if it is being used for debugging
	if ( ((pHWHead->pBootArgs->ucComPort == 1) && (pHWHead->dwIOBase == COM1_BASE)) ||
		((pHWHead->pBootArgs->ucComPort == 2) && (pHWHead->dwIOBase == COM2_BASE)) || 
		((pHWHead->pBootArgs->ucComPort == 3) && (pHWHead->dwIOBase == COM3_BASE)) ||
		((pHWHead->pBootArgs->ucComPort == 4) && (pHWHead->dwIOBase == COM4_BASE)) ) {
		DEBUGMSG (ZONE_INIT|ZONE_ERROR, (TEXT("\r\nSerInit - Skipping hardware init of debug port\r\n\r\n")));        
	} else
#endif
	{
		DEBUGMSG (ZONE_INIT|USERDBG, (TEXT("SerInit - Init 16550 data\r\n")));
		SL_Init( pHWHead, pHWHead->pBaseAddress, 1,
				EvaluateEventFlag, pMddHead, (PLOOKUP_TBL)&BaudTable);
		DEBUGMSG (ZONE_INIT,
			(TEXT("SerInit - Disabling UART Power\r\n")));
		SerSetOutputMode(pHWHead, FALSE, FALSE );    
//		SerSetOutputMode(pHWHead, bIR, ~bIR);    
	}

	return (pHWHead);

	ALLOCFAILED:
	if ( pHWHead->pBaseAddress )
		VirtualFree(pHWHead->pBaseAddress, 0, MEM_RELEASE);
	if ( ppBootArgs )
		MmUnmapIoSpace( ppBootArgs, sizeof( PVOID ) );
	if ( pHWHead->pBootArgs )
		MmUnmapIoSpace( pHWHead->pBootArgs, sizeof(BOOT_ARGS) );

	LocalFree(pHWHead);
	return (NULL);
}


PVOID
SerInitSerial(
       ULONG   Identifier, // @parm Device identifier.
       PVOID   pMddHead,   // @parm First argument to mdd callbacks.
       PHWOBJ  pHWObj      // @parm Pointer to our own HW OBJ for this device
)
{
	RETAILMSG(DEBUGMODE, (TEXT("SerInitSerial\r\n")));
	return (SerInit(FALSE, Identifier, pMddHead, pHWObj));
}

PVOID
SerInitIR(
       ULONG   Identifier, // @parm Device identifier.

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91精品国产综合久久精品图片| 久久99久久99精品免视看婷婷| 国产成人免费高清| 久久久www成人免费无遮挡大片| 蜜臀av国产精品久久久久| 91精品国产综合久久精品麻豆| 亚洲成人福利片| 日韩一区二区三区四区五区六区| 视频一区视频二区中文字幕| 欧美一区二区三区日韩视频| 精品一区二区综合| 国产日韩精品一区| 在线视频你懂得一区二区三区| 亚洲国产视频网站| 制服.丝袜.亚洲.中文.综合| 韩国成人福利片在线播放| 国产精品视频你懂的| 色噜噜狠狠一区二区三区果冻| 天天免费综合色| 久久欧美一区二区| 在线国产亚洲欧美| 另类综合日韩欧美亚洲| 久久精品无码一区二区三区| 色综合中文字幕国产| 一区二区视频免费在线观看| 日韩亚洲欧美综合| 大白屁股一区二区视频| 亚洲图片欧美色图| 精品福利在线导航| 91福利视频久久久久| 久久精品久久综合| 亚洲婷婷综合久久一本伊一区| 欧美一级爆毛片| 不卡的av网站| 青椒成人免费视频| 国产精品久久久久久久久久久免费看| 精品视频全国免费看| 国产成人啪午夜精品网站男同| 亚洲激情自拍视频| 久久午夜免费电影| 欧美亚洲动漫另类| 成人一区二区视频| 蜜臀av一区二区在线免费观看| **网站欧美大片在线观看| 日韩欧美一级二级三级久久久| av午夜精品一区二区三区| 麻豆精品一区二区av白丝在线| 一区二区在线观看视频| 久久久国产精品午夜一区ai换脸| 欧美性受xxxx| 不卡欧美aaaaa| 精品一区二区久久| 午夜精品爽啪视频| 一区二区三区蜜桃| 国产精品少妇自拍| 久久久噜噜噜久久人人看| 91精品国产乱码久久蜜臀| 91性感美女视频| 国产99久久久国产精品免费看| 日本午夜精品一区二区三区电影| 亚洲欧美电影院| 国产精品美女一区二区三区| 精品国产乱码久久久久久久久 | 中文字幕av免费专区久久| 欧美一区二区三区视频在线观看| 色中色一区二区| 99久久er热在这里只有精品66| 国内外成人在线| 久久成人免费网| 青青草97国产精品免费观看无弹窗版 | 日本人妖一区二区| 午夜视频一区在线观看| 亚洲已满18点击进入久久| 亚洲男人都懂的| 亚洲手机成人高清视频| 中文字幕一区二区视频| 亚洲国产精品激情在线观看| 国产欧美精品一区二区色综合 | 亚洲va天堂va国产va久| 一区二区三区美女| 亚洲一区二三区| 亚洲国产综合91精品麻豆| 夜夜嗨av一区二区三区四季av | 中文幕一区二区三区久久蜜桃| 久久免费视频一区| 久久久久久久网| 中文久久乱码一区二区| 中文字幕免费不卡| 国产精品国产馆在线真实露脸 | www.久久久久久久久| 懂色av中文一区二区三区 | 中文字幕一区二区三区在线观看| 国产女主播一区| 中文字幕一区二区在线播放| 亚洲精品日产精品乱码不卡| 亚洲一区影音先锋| 日本aⅴ亚洲精品中文乱码| 日本欧美一区二区在线观看| 久久国产精品无码网站| 国产精一品亚洲二区在线视频| 国产91精品在线观看| 91网页版在线| 欧美肥妇free| 久久久久久久免费视频了| 国产精品嫩草99a| 亚洲国产精品久久人人爱| 六月丁香婷婷色狠狠久久| 风间由美一区二区av101| 色激情天天射综合网| 在线播放91灌醉迷j高跟美女| 精品欧美乱码久久久久久1区2区 | 欧美经典三级视频一区二区三区| 亚洲欧美在线视频观看| 亚洲成人免费观看| 国产精品一区不卡| 欧美在线你懂得| 精品成人a区在线观看| 亚洲色图在线播放| 日本亚洲天堂网| 97精品电影院| 日韩欧美电影一二三| 国产精品久久久久久福利一牛影视| 亚洲成人三级小说| 粉嫩欧美一区二区三区高清影视| 日本韩国一区二区三区视频| 日韩欧美你懂的| 亚洲男女一区二区三区| 六月丁香婷婷久久| 欧美三级在线播放| 国产女主播视频一区二区| 亚洲成人www| 丁香婷婷综合网| 欧美一区二区三区思思人| 亚洲三级免费观看| 国产麻豆视频精品| 欧美一三区三区四区免费在线看| 国产精品久久久久久久久免费樱桃 | 亚洲aaa精品| 成人性生交大片免费| 欧美一级片免费看| 亚洲永久免费av| 99re成人在线| 国产午夜精品福利| 麻豆一区二区在线| 精品1区2区3区| 亚洲视频每日更新| 成人黄色软件下载| 久久夜色精品国产噜噜av| 日韩精品免费专区| 欧美日韩中字一区| 亚洲私人影院在线观看| 国产 日韩 欧美大片| 欧美成人aa大片| 麻豆精品久久久| 欧美一区二区三区视频在线观看| 亚洲一区二区欧美| 91福利精品视频| 一区二区三区欧美日| 成人app网站| 亚洲国产成人午夜在线一区| 韩国v欧美v亚洲v日本v| 日韩欧美国产精品一区| 婷婷国产v国产偷v亚洲高清| 欧美午夜精品久久久久久孕妇| 亚洲日本在线视频观看| 91亚洲大成网污www| 亚洲人精品午夜| 一本色道久久综合亚洲aⅴ蜜桃| 国产精品污www在线观看| 国产美女一区二区| 国产三级精品三级在线专区| 国产一区二区伦理| 久久久精品综合| 懂色av一区二区三区免费看| 久久久久久久久久久99999| 国产精品123| 国产精品久久久久久久久图文区 | 国产精品一区二区你懂的| 欧美精品一区二区三区在线| 黄色资源网久久资源365| 久久综合久久综合亚洲| 国产成人在线色| 中文字幕一区视频| 欧美影视一区二区三区| 天天综合色天天综合| 精品久久人人做人人爱| 国产精品99久久久久久有的能看| 日本一区二区综合亚洲| 91免费观看在线| 天天色 色综合| 久久久久久99精品| 97精品超碰一区二区三区| 亚洲第一搞黄网站| 日韩一卡二卡三卡| 国产91丝袜在线播放九色| 亚洲欧美日韩一区二区| 欧美蜜桃一区二区三区| 精品在线视频一区| 一区免费观看视频| 在线成人高清不卡|