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

? 歡迎來(lái)到蟲(chóng)蟲(chóng)下載站! | ?? 資源下載 ?? 資源專(zhuān)輯 ?? 關(guān)于我們
? 蟲(chóng)蟲(chóng)下載站

?? go7007drv.c

?? ARM嵌入式應(yīng)用開(kāi)發(fā)實(shí)例USB項(xiàng)目控制器的實(shí)現(xiàn)源代碼
?? C
字號(hào):
#include <linux/config.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/poll.h>
#include <linux/usb.h>
#include <linux/slab.h>

#include "usb-func.h"
#include "go7007drv.h"

#define MAXBLOCKSIZE		4096

/* Debug status */
static int debug = 0;

/* Redefine debug macro */
#undef	dbg
#define dbg(format, arg...) \
	do { if (debug) printk(KERN_DEBUG __FILE__ ": [" __FUNCTION__ "] " \
		format "\n" , ## arg); \
	} while (0)

#undef	err
#define err(format, arg...) printk(KERN_ERR __FILE__ ": [" __FUNCTION__ "] " \
		format "\n" , ## arg)

////////////////////////////////////////////////////////////////////////////////////////////
//
// SDK interacts with driver via send coomand to driver.
// All commands are sent accompanied by a "CMD_PACKET" structure , the "Type" field of
// the structure holds the command type which is defined as following enum. The other fields varies
// according to different command.

enum CMD
{
	CMD_BOOTUP,
	CMD_INITIALIZE,
	CMD_UNINITIALIZE,
	CMD_SENDPACKETS,
	CMD_SETBLOCKSIZE,

	// set interface mode
	//
	// CMD_PACKET::Param :	IM_HPI -- hpi mode, 
	//						IM_USB -- usb mode, 
	//						IM_STANDBY -- standby 

	CMD_SETINTERFACEMODE,

	// read cbus registers via firmware
	//
	// CMD_PACKET::Param : number of registers to read
	// CMD_PACKET::pBuf  : each unit of word holds an address
	// 
	// return buffer : each unit of word holds a read result data

	CMD_READCBUSREGFW,

	// write cbus registers via firmware
	//

	// CMD_PACKET::Param : number of registers to write
	// CMD_PACKET::pBuf  : each unit of word holds alternated address and data

	CMD_WRITECBUSREGFW,

	// read a hpi register
	//
	// CMD_PACKET::Param : address of hpi register
	// 
	// return buffer : a word that holds the read result data

	CMD_READHPIREGISTER,

	// write a hpi register
	//
	// CMD_PACKET::Param : address of hpi register
	// CMD_PACKET::pBuf	 : a word that holds data to write

	CMD_WRITEHPIREGISTER,

	// do a self test

	// CMD_PACKET::Param :	ST_HWMBIST -- hardware mbist
	// CMD_PACKET::pBuf  :
	
	// CMD_PACKET::Param :	ST_BASICHPICHECK -- basic hpi check
	// CMD_PACKET::pBuf  :  
	
	// CMD_PACKET::Param :	ST_IOCHECK -- io check
	// CMD_PACKET::pBuf  :  
	
	// CMD_PACKET::Param :	ST_SWMBIST -- software mbist
	// CMD_PACKET::pBuf  :
	
	// CMD_PACKET::Param :	ST_MEMSCAN -- memory scan
	// CMD_PACKET::pBuf  :  WORD[0] : memory size, 0 -- 4M, 1-- 8M

	CMD_SELFTEST,
	CMD_SENDPACKETSWITHRETURN,
	CMD_INITIALIZEI2C,
}; 

// DECLARE_WAIT_QUEUE_HEAD(delay_wq);

static void Delay()
{
	wait_queue_head_t wq_delay;

	init_waitqueue_head(&wq_delay);
	sleep_on_timeout(&wq_delay, 0.1*HZ);

	// sleep_on_timeout(&delay_wq, 0.1*HZ);
}

// 0 -- success
// -1 -- timeout
// -2 -- error interrupt type

int CheckInterruptPipe(pusb_t pdx, int InterruptType, int RepeatNum)
{
	int i;
	int r;
	USHORT IntRetVal, IntRetData;

	for(i=0;i<RepeatNum;i++)
	{
		r = ReadInterruptPipe(pdx, &IntRetVal, &IntRetData);

		if (r != 0)
		{
			if(IntRetVal == InterruptType)
				return 0;
			else
			{
				PrintMsg1(("<DRV> CheckInterruptPipe : Error Interrupt 0x%08X, required 0x%08X",IntRetVal, InterruptType));
				Delay();
				continue;//return IntRetVal;
			}
		}
		else
		{
			PrintMsg1(("<DRV> CheckInterruptPipe : Timeout"));
			return -1;
		}
	}

	return -2;
}

int CheckInterruptPipeWithReturn(pusb_t pdx, int InterruptType, int InterruptData, int RepeatNum)
{
	int i;
	int r;
	USHORT IntRetVal, IntRetData;

	r = ReadInterruptPipe(pdx, &IntRetVal, &IntRetData);

	if (r != 0)
	{
		if(IntRetVal==InterruptType || IntRetVal == 0x555b)
		{
			if(InterruptData<0) {
				err("IntRetData = 0x%x", IntRetData);
				return IntRetData;
			} else {
				err("IntRetVal==InterruptVal, InterruptData >= 0");
				return 0;
			}
		}
		else
		{
			err("<DRV> CheckInterruptPipe : Error Interrupt 0x%08X, required 0x%08X",IntRetVal, InterruptType);
			return IntRetVal;
		}
	}
	else
	{
		err("<DRV> CheckInterruptPipe : Timeout");
		return -1;
	}
}

// 0 -- success
// -1 -- timeout
// -2 -- error interrupt type

int CheckInterruptPipe2(pusb_t pdx, int InterruptType, int InterruptData, int RepeatNum)
{
	int i;
	int r;
	USHORT IntRetVal, IntRetData;

	for(i=0;i<RepeatNum;i++)
	{
		r = ReadInterruptPipe(pdx, &IntRetVal, &IntRetData);

		if (r != 0)
		{
			if((IntRetVal == InterruptType) && (IntRetData == InterruptData))
				return 0;
			else
			{
				dbg("Error Interrupt 0x%08x 0x%08x", IntRetVal,IntRetData);
				Delay();
				continue;//return IntRetVal;
			}
		}
		else
		{
			dbg("Timeout");
			return -1;
		}
	}

	return -2;
}

//////  return 0 -- success

int BootupChipWithFirmware(pusb_t pdx, unsigned char *pFirmware, int Firmlen)
{
	int r;

	PrintMsg1(("<DRV> BootupChipWithFirmware : Enter, FirmLen : %d",Firmlen));

	if(pdx->DeviceState != DS_OPENED && pdx->DeviceState != DS_BOOTUPED)
		return 1;

	WriteInterrupt(pdx,0x0001,0x0001);
	mdelay(50);

	WriteInterrupt(pdx,0x0001,0x0001);
	mdelay(50);

	if(CheckInterruptPipe(pdx, 0x55aa, 10)!=0)
	{
		PrintMsg(("<DRV> BootupChip : Bootup Fail 1"));
		PrintMsg1(("<DRV> BootupChip : Bootup Fail 1"));
		return 2;
	}

//	DownloadFirmware

	r = DownloadBuffer(pdx, pFirmware, Firmlen);
	if (r == 0)
		return 3;	

	if(CheckInterruptPipe(pdx, 0x5a5a, 10)!=0)
	{
		PrintMsg(("<DRV> BootupChip : Fail 2"));
		PrintMsg1(("<DRV> BootupChip : Fail 2"));
		return 3;
	}

	err("<DRV> BootupChip : Success");
	PrintMsg1(("<DRV> BootupChip : Success"));

	pdx->DeviceState = DS_BOOTUPED;
	return 0;
}

// DECLARE_WAIT_QUEUE_HEAD(wq_stop_stream_thread);

void StopStreamThread(void *arg)
{
	int rv;
	pusb_t pdx = (pusb_t)arg;

	pdx->StreamThreadState = 0;
	rv = sleep_on_timeout(&pdx->wq_stop_stream_thread, 5*HZ);

	dbg("StopStreamThread: rv = %d", rv);
}

DECLARE_MUTEX		(stream_thread_mutex);

int StreamThreadProc(void *arg)
{
	unsigned char	*pBlock;
	int	r;
	int ncount;

	pusb_t pdx = (pusb_t)arg;

	PrintMsg(("<DRV> StreamThreadProc : Enter"));

	if(pdx->bulk_in_buffer == NULL)
	{
		dbg("ERROR: bulk_in_buffer is NULL");
	}

	pBlock = pdx->bulk_in_buffer;

	ncount = 0;
	while(pdx->StreamThreadState == 1)
	{
		int BlockSize1 = BULK_IN_BUFSIZE;	//pdx->BlockSize;

		// down(&stream_thread_mutex);
		r = ReadStreamPipe(pdx, pBlock, BlockSize1);

		if(pdx->StreamThreadState == 1 && r != 0 ) {
			StreamBuffer_AddBlock(&(pdx->StreamBuffer),pBlock, BlockSize1);
		}

		// up(&stream_thread_mutex);
	#if 0
		while(ncount++ > 50) {
			schedule();
			ncount = 0;
		}
	#endif
	}

	PrintMsg1(("<DRV> StreamThreadProc : Need exit"));

	PrintMsg(("<DRV> StreamThreadProc : Exit"));
	wake_up(&pdx->wq_stop_stream_thread);
}

extern void begin_stream_input(pusb_t s);

// return 0: success
int InitializeDevice(pusb_t pdx, INT_PACKET *pInitPackets, int InitPacketsNum)
{
//	HANDLE InterruptThreadHandle;
//	HANDLE StreamThreadHandle;
//	NTSTATUS ntStatus;
	int r;

	PrintMsg(("<DRV> InitializeDevice : Enter"));

	if(pdx->DeviceState != DS_BOOTUPED)
		return 1;

	StreamBuffer_Reset(&(pdx->StreamBuffer));

//	pdx->IFrameNum = 0;
//	pdx->PFrameNum = 0;

//	pdx->TotalDelay = 0;
//	pdx->ChipDelay = 0;

	r = DownloadBuffer(pdx, (unsigned char *)pInitPackets, sizeof(INT_PACKET)*InitPacketsNum);
	if (r == 0)
		return 3;	

	if(CheckInterruptPipe(pdx, 0x0000, 10)!=0)
	{
		PrintMsg(("<DRV> Initialize : fail"));
		PrintMsg1(("<DRV> Initialize : fail"));
		return 3;	
	}

//	pdx->InterruptThreadState = 1;
//	ntStatus = PsCreateSystemThread( &InterruptThreadHandle, THREAD_ALL_ACCESS, NULL, NULL, NULL,
//								   InterruptThreadProc, (PVOID)fdo);

	pdx->StreamThreadState = 1;
	// kernel_thread(StreamThreadProc, (void *)pdx, 0);
	begin_stream_input(pdx);

	pdx->DeviceState = DS_RUNNING;

	err("<DRV> InitializeDevice : Completed SUCCESSFUL");
	return 0;
}



int UninitializeDevice(pusb_t pdx)
{
//	PDEVICE_EXTENSION pdx = fdo->DeviceExtension;
//	unsigned short *pBuffer;		
//	unsigned int i;

	PrintMsg(("<DRV> UninitializeDevice : Enter"));

	if(pdx->DeviceState != DS_RUNNING)
		return 1;

	// pdx->StreamThreadState = 0;		// stop stream thread
	StopStreamThread(pdx);


	WriteInterrupt(pdx,0x0001,0x0001);

	// send 0x0020 packet to make chip stop
/*	pBuffer = (unsigned short *)ExAllocatePool(NonPagedPool,64);
	RtlZeroMemory(pBuffer,64);
	pBuffer[0] = 0x0020;
	DownloadBuffer(fdo, (unsigned char *)pBuffer,64);
	ExFreePool(pBuffer);
*/
//	pdx->InterruptThreadState = 0;		// stop interrupt thread

//	for (i = 0; i < pdx->Interface->NumberOfPipes; i++)
//		AbortPipe(fdo,(USBD_PIPE_HANDLE) pdx->Interface->Pipes[i].PipeHandle);

//	for (i = 0; i < pdx->Interface->NumberOfPipes; i++)
//		ResetPipe(fdo,i);

	PrintMsg(("<DRV> Left"));

	pdx->DeviceState = DS_OPENED;

	return 0;
}

// return 0: success
int InitializeI2C(pusb_t pdx, INT_PACKET *pInitPackets, int InitPacketsNum)
{
	int r;

	PrintMsg1(("<DRV> InitializeI2C : Enter"));

	if(pdx->DeviceState != DS_BOOTUPED)
		return 1;

	r = DownloadBuffer(pdx, (unsigned char *)pInitPackets, sizeof(INT_PACKET)*InitPacketsNum);
	if (r == 0)
		return 3;	

	if(CheckInterruptPipe2(pdx, 0x555a, 0, 10)!=0)
	{
		PrintMsg(("<DRV> InitializeI2C : fail"));
		PrintMsg1(("<DRV> InitializeI2C : fail"));
		return 3;	
	}

	PrintMsg1(("<DRV> InitializeI2C : Completed"));
	return 0;
}

// return 0 : success
//        1 : fail

int	OnWriteProc(pusb_t pdx, const char *buf)
{
	int r = 0;
	CMD_PACKET *pCmd = (CMD_PACKET *)buf;

//	PrintMsg1(("<DRV> Write : %d %d",FrameSize,pCmd->Type));

	switch (pCmd->Type)
	{
	case CMD_BOOTUP:
		r = BootupChipWithFirmware(pdx, pCmd->pBuf, pCmd->Param);
		break;
	
	case CMD_INITIALIZE:
	{
		int PacketNum = pCmd->Param;
		INT_PACKET *p = (INT_PACKET *)(pCmd->pBuf);

//		DumpBuffer(pBuf,PacketNum*64+5);

		r = InitializeDevice(pdx, p, PacketNum);
		break;
	}

	case CMD_UNINITIALIZE:
	        err("CMD_UNINITIALIZE called");
		UninitializeDevice(pdx);
		break;
 
	case CMD_INITIALIZEI2C:
	{
		int PacketNum = pCmd->Param;
		INT_PACKET *p = (INT_PACKET *)(pCmd->pBuf);

//		DumpBuffer(pBuf,PacketNum*64+5);
		r = InitializeI2C(pdx, p, PacketNum);
		break;
	}

	case CMD_SENDPACKETS:
	{
		int PacketNum = pCmd->Param;
		INT_PACKET *p = (INT_PACKET *)(pCmd->pBuf);
		int rv;

//		PrintMsg1(("<DRV> Send Packet to chip : PacketNum(%d)",PacketNum));
//		DumpBuffer1(p,64);

		rv = DownloadBuffer(pdx,(UCHAR *)p,64*PacketNum);
		err("CMD_SENDPACKETS,rv = %i", rv);

		break;
	}

/*	case CMD_SETBLOCKSIZE:	
	{
		int BlockSize1 = pCmd->Param;
														    
		if(BlockSize1>0&&BlockSize1<=64)
			BlockSize1 = 64;
		else if(BlockSize1>64&&BlockSize1<=128)
			BlockSize1 = 128;
		else if(BlockSize1>128&&BlockSize1<=256)
			BlockSize1 = 256;
		else if(BlockSize1>256&&BlockSize1<=512)
			BlockSize1 = 512;
		else if(BlockSize1>512&&BlockSize1<=1024)
			BlockSize1 = 1024;
		else if(BlockSize1>1024&&BlockSize1<=2048)
			BlockSize1 = 2048;
		else if(BlockSize1>2048&&BlockSize1<=4096)
			BlockSize1 = 4096;
		else
			BlockSize1 = 8192;

		pdx->BlockSize = BlockSize1;
		
		PrintMsg1(("<DRV> BLOCKSIZE : %d",pdx->BlockSize));
		break;
	}

	case CMD_SETINTERFACEMODE:
	{
		int IfMode = pCmd->Param;
		UCHAR Data[1];

		if(IfMode == IM_HPI)
		{
			DoVendorRequest(fdo, VR_STARTHPI, 0, 0, Data, 1, DIR_IN); 
			if(Data[0] == 0xaa)
				r=0;
			else
				r=1;
		}
		else if(IfMode == IM_USB)
		{
			DoVendorRequest(fdo, VR_STARTUSB, 0, 0, Data, 1, DIR_IN); 
			if(Data[0] == 0x55)
				r=0;
			else
				r=1;
		}
		else if(IfMode == IM_STANDBY)
		{
			DoVendorRequest(fdo, VR_STANDBY, 0, 0, Data, 1, DIR_IN); 
			if(Data[0] == 0x88)
				r=0;
			else 
				r=1;
		}

		PrintMsg1(("<DRV> CMD_SETINTERFACEMODE %d, Return : 0x%02x",IfMode,Data[0]));
		break;
	}

	case CMD_WRITEHPIREGISTER:
		r = WriteHPIRegister(fdo, (USHORT)(pCmd->Param), *((USHORT *)(pCmd->pBuf)));
		break;

	case CMD_WRITECBUSREGFW:
		r = WriteCBusRegFW(fdo, pCmd->Param, (USHORT *)pCmd->pBuf);
		break;

	case CMD_SELFTEST:
	{
		int SelfTest = pCmd->Param;
		PrintMsg1(("<DRV> Self Test : %d",SelfTest)); 
		
		switch (SelfTest)
		{
		case ST_HWMBIST:
		{
			UCHAR Data[1];

			DoVendorRequest(fdo, VR_STARTBIST, 0, 0, Data, 1, DIR_IN); 
			if(Data[0] == 0)
				r=0;
			else
				r=1;
			PrintMsg1(("<DRV> Return val : %d",Data[0])); 
			break;
		}

		case ST_BASICHPICHECK:
			r = ST_BasicHPICheck(fdo, pCmd->pBuf);
			break;

		case ST_IOCHECK:
			r = ST_IOCheck(fdo, pCmd->pBuf);
			break;

		case ST_SWMBIST:
			r = ST_SwMBist(fdo, pCmd->pBuf);
			break;

//		case ST_REGSCAN:
//			r = ST_RegScan(fdo, pCmd->pBuf);
//			break;

		case ST_MEMSCAN:
			r = ST_MemoryScan(fdo, *((USHORT *)(pCmd->pBuf)));
			break;
		}
		break;
	}
*/
	default:
		break;
	}

	return r;
}

int OnIoctlProc(pusb_t pdx, unsigned long arg)
{
        int r = 0;
	CMD_PACKET *pCmd = (CMD_PACKET *)arg;

        err("OnIoctlProc : %d", pCmd->Type);
	
	switch (pCmd->Type)
	{
	case CMD_SENDPACKETSWITHRETURN:
	{	
		int PacketNum = pCmd->Param;
		INT_PACKET *p = (INT_PACKET *)(pCmd->pBuf);

                err("CMD_SENDPACKETSWITHRETURN,will downloadbuffer");
		DownloadBuffer(pdx,(UCHAR *)p, 64);
		err("[0x%x..0x%x..0x%x..0x%x..0x%x]", pCmd->pBuf[4], pCmd->pBuf[3], pCmd->pBuf[2], pCmd->pBuf[1], pCmd->pBuf[0]);
		
		r = CheckInterruptPipeWithReturn(pdx, 0x555a, -1, 10);

		if (r >= 0) {
			err("checkInterruptPipeWithReturn return 0x%x", r);
			put_user(r, (unsigned short *)arg);
			r = 0;
		} else {
			err("CMD_SENDPACKETSWITHRETURN, fail r = 0");
		}
		
		break;
	}
	
	default:
		break;
	}
	
	return r;
}


void dump_bin(char *Title,unsigned char *buf, int len)
{
	char s[256],s1[16];
	int i;
	
	PrintMsg1(("%s",Title));

	strcpy(s,"");	
	for(i=0;i<len;i++)
	{
		sprintf(s1, "%02X ", buf[i]);
		strcat(s,s1);
		if(i%16==15)
		{
			PrintMsg1(("%s",s));
			strcpy(s,"");
		}
	}
}  

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
精品人在线二区三区| 日本一不卡视频| 国产欧美日韩精品在线| 亚洲精品一区二区三区99| 日韩欧美色电影| 欧美成人精品福利| 精品国产一区二区三区av性色| 欧美videofree性高清杂交| 精品福利av导航| 久久久影视传媒| 中文字幕一区二区三区不卡在线| 国产精品久久久爽爽爽麻豆色哟哟| 国产精品丝袜黑色高跟| 亚洲视频在线一区观看| 亚洲一区自拍偷拍| 日韩av一区二区三区| 久久99日本精品| 国产91精品露脸国语对白| gogogo免费视频观看亚洲一| 北条麻妃一区二区三区| 一本大道久久a久久综合婷婷| 在线观看免费亚洲| 欧美一级高清大全免费观看| 久久蜜桃av一区精品变态类天堂 | 福利电影一区二区| 99久精品国产| 欧美日韩久久一区| 欧美mv日韩mv| 18成人在线观看| 视频一区在线播放| 国产美女视频一区| 97精品国产露脸对白| 欧美欧美欧美欧美首页| 2020国产精品久久精品美国| 中文字幕一区不卡| 天堂影院一区二区| 国产999精品久久久久久| 99国产精品久| 日韩三级高清在线| 国产精品久久看| 日韩激情视频网站| 成人免费观看视频| 在线成人高清不卡| 欧美激情中文字幕| 日韩国产高清影视| 丁香天五香天堂综合| 欧美色综合影院| 国产欧美日本一区视频| 亚洲r级在线视频| 国产麻豆成人精品| 欧美日韩成人综合天天影院| 国产欧美va欧美不卡在线| 亚洲国产欧美日韩另类综合| 国产精品888| 7777精品伊人久久久大香线蕉超级流畅 | 久久一夜天堂av一区二区三区 | 国产一区二区在线看| 国产mv日韩mv欧美| 欧美另类z0zxhd电影| 国产喷白浆一区二区三区| 亚洲国产日日夜夜| 成人免费黄色在线| 精品久久一二三区| 午夜精品爽啪视频| 亚洲精品在线三区| 亚洲精品日韩综合观看成人91| 激情六月婷婷久久| 91麻豆精品国产自产在线观看一区| 国产精品看片你懂得| 久久狠狠亚洲综合| 欧美日韩国产高清一区二区三区| 中文字幕一区二区日韩精品绯色| 久久福利资源站| 777亚洲妇女| 亚洲国产日韩精品| 92精品国产成人观看免费| 26uuu欧美| 强制捆绑调教一区二区| 欧美日韩视频在线一区二区| 国产精品国产馆在线真实露脸| 国产老女人精品毛片久久| 欧美一区二区三区性视频| 亚洲国产精品久久久久秋霞影院| 成人av免费观看| 国产欧美视频一区二区三区| 精品一区二区在线免费观看| 日韩视频一区二区| 日韩制服丝袜先锋影音| 欧美日韩国产欧美日美国产精品| 亚洲综合另类小说| 色婷婷综合久色| 亚洲欧美日韩一区| 99精品欧美一区二区三区小说| 国产日韩欧美一区二区三区综合| 老司机精品视频线观看86| 日韩午夜中文字幕| 天堂av在线一区| 91精品国产综合久久精品图片| 亚洲一区二区三区视频在线| 在线免费不卡视频| 亚洲午夜羞羞片| 欧美乱熟臀69xxxxxx| 亚洲第一av色| 欧美一区二区在线视频| 蜜桃视频在线一区| 欧美精品一区男女天堂| 国产一区二区免费在线| 国产日本欧美一区二区| 成人午夜看片网址| 中文字幕一区二区三区色视频| 91丨porny丨国产入口| 亚洲欧美一区二区不卡| 在线观看日产精品| 首页亚洲欧美制服丝腿| 日韩欧美一级精品久久| 国产在线精品一区二区三区不卡| 久久久久久久久蜜桃| 成人爱爱电影网址| 一区二区三区视频在线看| 欧美日韩国产影片| 精品一区二区三区影院在线午夜 | 国产精品午夜免费| 91无套直看片红桃| 亚洲成人资源网| 日韩欧美成人一区二区| 国产sm精品调教视频网站| 亚洲色图欧美在线| 这里是久久伊人| 国产一本一道久久香蕉| 日韩伦理电影网| 欧美精品在线观看播放| 国产精品中文字幕欧美| 亚洲三级在线观看| 欧美一区二区三区精品| 粉嫩嫩av羞羞动漫久久久| 一区二区三区在线高清| 8x8x8国产精品| 粗大黑人巨茎大战欧美成人| 夜夜嗨av一区二区三区网页| 日韩一级黄色片| 不卡一区二区三区四区| 日本欧美在线看| 国产欧美日韩在线看| 在线观看91精品国产入口| 精品影视av免费| 亚洲精品国产视频| 久久中文字幕电影| 色婷婷综合在线| 精品一区二区在线看| 亚洲精品五月天| 久久久久国色av免费看影院| 在线免费视频一区二区| 国产一区二区中文字幕| 亚洲一区二区三区中文字幕| 久久久久久久久99精品| 欧美日韩国产一级| 高清不卡在线观看av| 五月天激情综合| 亚洲欧美综合在线精品| 亚洲精品在线免费观看视频| 欧美在线视频全部完| 国产99久久精品| 蜜臀av性久久久久av蜜臀妖精 | 乱中年女人伦av一区二区| 亚洲少妇屁股交4| 久久久午夜电影| 欧美精品v国产精品v日韩精品 | 欧美一三区三区四区免费在线看| 懂色av噜噜一区二区三区av| 天堂影院一区二区| 亚洲免费观看在线视频| 欧美国产精品v| 精品免费一区二区三区| 欧美日韩不卡一区二区| 色综合色狠狠综合色| 成人爽a毛片一区二区免费| 另类专区欧美蜜桃臀第一页| 一区二区三区国产| 成人欧美一区二区三区在线播放| 久久久久久久综合狠狠综合| 欧美精品aⅴ在线视频| 在线视频综合导航| 一本一本久久a久久精品综合麻豆 一本一道波多野结衣一区二区 | 粉嫩久久99精品久久久久久夜| 亚洲国产视频在线| 亚洲欧美日韩一区二区| 国产精品初高中害羞小美女文| 精品国偷自产国产一区| 337p亚洲精品色噜噜狠狠| 日本道色综合久久| 99久久久久久99| 成人h精品动漫一区二区三区| 国产露脸91国语对白| 久久成人免费网| 日韩 欧美一区二区三区| 丝袜诱惑制服诱惑色一区在线观看| 一区二区欧美国产| 亚洲资源在线观看| 一区二区三区四区中文字幕| 亚洲视频精选在线|