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

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

?? usbh_hw.c

?? USB Host在嵌入式系統中的實現.包括所有源代碼.
?? C
字號:
/*2005/12/15 jessefanchiang 
	bug: Bulk In Second data will save to First Bulk IN Last one Buffer position
	from:
		1.HISR token Done Enable BulkIN Last one transaction.
		2.SOF Interrupt will Find BulkIN transaction to Enable
*/
#include "standard.h"
#include "nucleus.h"
#include "usbhost.h"

//#define HOSTHW_PRINTF logprintf
#define HOSTHW_PRINTF if(0) printf

#define HISR_STACKSIZE  800
#define USB_BDT_PAGE    ( (Uint32) USB10BDT0REG0 )

static Uint32 pHISRStack[HISR_STACKSIZE];
static NU_HISR usbh_hisr;

EP_DATA *Ctrl_ep;
DEV_INFO *device_info;
HOST_QUEUE_HEAD	ISO_QH,INT_QH,CONTROL_QH,BULK_QH;
void QH_init(void)
{
    HOST_QUEUE_HEAD *curr_QH;
    
//	HOSTHW_PRINTF("BULK QH init\n");		
	BULK_QH.TD_num=4;
	BULK_QH.TD_head=NULL;
	BULK_QH.TD_tail=NULL;	
	
//	HOSTHW_PRINTF("CONTROL QH init\n");		
	CONTROL_QH.TD_num=3;
	CONTROL_QH.TD_head=NULL;
	CONTROL_QH.TD_tail=NULL;
		
//	HOSTHW_PRINTF("INT QH init\n");		
	INT_QH.TD_num=2;
	INT_QH.TD_head=NULL;
	INT_QH.TD_tail=NULL;
	
//	HOSTHW_PRINTF("ISO QH init\n");
	ISO_QH.TD_num=1;
	ISO_QH.TD_head=NULL;
	ISO_QH.TD_tail=NULL;
	
//	HOSTHW_PRINTF("QH Link\n");	
	ISO_QH.QH_next		=	&INT_QH;
	INT_QH.QH_next		=	&CONTROL_QH;
	CONTROL_QH.QH_next	=	&BULK_QH;
	BULK_QH.QH_next		=	&ISO_QH;
	
	//verify QH link
	HOSTHW_PRINTF("USBH: ISO QH Addr=0x%x, next QH=0x%x\n",&ISO_QH,ISO_QH.QH_next);
		HOSTHW_PRINTF("USBH: INT QH Addr=0x%x, next QH=0x%x\n",&INT_QH,INT_QH.QH_next);
			HOSTHW_PRINTF("USBH: CONTROL QH Addr=0x%x, next QH=0x%x\n",&CONTROL_QH,CONTROL_QH.QH_next);
				HOSTHW_PRINTF("USBH: BULK QH Addr=0x%x, next QH=0x%x\n",&BULK_QH,BULK_QH.QH_next);

}

/*Transfer Setting Fill to Register*/
void Fill2REG_FCT(TRANSACTION_STRUCT *currTD)
{
    BDT_STRUCT *bdt;
    
    //Select Data IN/OUT
    if((currTD->state&0x0F)==PROCESS_IN)
    {
	    //Data IN Setting
	    //1.Get Data IN BDT
	    //2.Link to Txf
	    //3.BDT Buffer Setting
	    //4.COntrol Register Setting
	    
	    bdt = (BDT_STRUCT *)((Uint32)USB_BDT_PAGE | USBHOST_EVEN_ODD_IN_GET());//usb_host.even_odd_IN);
	    currTD->bdt = bdt;
	    
	    USBHOST_EVEN_ODD_IN_SET();
	    //usb_host.even_odd_IN ^= BDT_ODD_EVEN_BIT;
	}
	else if(((currTD->state&0x0F)==PROCESS_OUT)||
			((currTD->state&0x0f)==CNTRL_SETUP)||
			((currTD->state&0x0f)==CNTRL_LAST))
	{
	    //Data OUT Setting
	    //1.Get Data OUT BDT
	    //2.Link to Txf
	    //3.BDT Buffer Setting
	    //4.COntrol Register Setting
	    bdt = (BDT_STRUCT *)((Uint32)USB_BDT_PAGE | USBHOST_EVEN_ODD_OUT_GET());//usb_host.even_odd_OUT);
	    currTD->bdt = bdt;
	    USBHOST_EVEN_ODD_OUT_SET();
	    //usb_host.even_odd_OUT ^= BDT_ODD_EVEN_BIT;
	}
	
    *regBUFBASEL = currTD->BUFBASEL;
    *regBUFBASEH = currTD->BUFBASEH;
    
	/* Enable the token done, error, STALL and RESET interrupts */
//	*regINT_ENB = INTR_TOK_DNE | INTR_ERROR | INTR_STALL | INTR_USB_RST | INTR_SOF_TOK;	
	        
   	/* Ship it */
	bdt->PID   = currTD->bdt_PID;
	bdt->BC    = currTD->bdt_BC;
	bdt->ADDRL = currTD->bdt_ADDRL;
	bdt->ADDRH = currTD->bdt_ADDRH;
	
	*regEP0CTL	= currTD->EP0CTL;
	*regADDR 	= currTD->ADDR;
	*regTOKEN	= currTD->TOKEN;
}


TRANSACTION_STRUCT *SearchQHsTD(HOST_QUEUE_HEAD *QH)
{
    Uint8 i;
    TRANSACTION_STRUCT *TD;
    HOST_QUEUE_HEAD	*CurrQH, *NextQH;

    

	CurrQH=QH;
	NextQH=QH->QH_next;
	
	for(i=1;i<=4;i++){
		if(CurrQH->TD_head!=NULL){	//Check QH 's Has TD or Not

			return CurrQH->TD_head;
		}
		else{			
			CurrQH=NextQH;			//Get Next QH
			NextQH=CurrQH->QH_next;
		}
	}
	return NULL;
}

void QH_RemoveTD(HOST_QUEUE_HEAD *QH, TRANSACTION_STRUCT *CurrTD)
{
	TRANSACTION_STRUCT *head, *prve, *next;
	
	head=QH->TD_head;
	next=CurrTD->TD_next;
	/*Case 1. QH First TD*/
	if(head==CurrTD){
		/*Case1.1 TD Tail*/
		if(next==NULL){	
			QH->TD_head=NULL;
			QH->TD_tail=NULL;
		}
		/*Case1.2 Link to Next TD*/
		else
			QH->TD_head=next;
	}
	/*Case 2. Multi TD*/
	else{		
		//prve=usb_host.prve_TD;	/*Get Prve TD*/
		prve=(TRANSACTION_STRUCT *)USBHOST_PRVE_TD_GET();
		/*Case2.1 TD Tail*/
		if(next==NULL){
			prve->TD_next=NULL;	/*Init Prve TD_next=NULL*/
			QH->TD_tail=prve;
		}
		/*Case2.2 Link to Next TD*/
		else
			prve->TD_next=next;	/*Prve Link to TD->TD_next*/	
	}
	free(CurrTD);
}

void SOF_ISR(void)
{
    TRANSACTION_STRUCT *currTD;
    	
	currTD=SearchQHsTD(&ISO_QH);	
	if(currTD==NULL){/*No Any More TD Link to QH*/
//		usb_host.curr_QH=NULL;
//		usb_host.prve_TD=NULL;
//		usb_host.curr_TD=NULL;
		USBHOST_CURR_QH_RESET();
		USBHOST_CURR_TD_RESET();
		USBHOST_PRVE_TD_RESET();
		return;
	}
//	//2005/12/14 jessefanchiang
//	//Check Curr TD BDT OWN Setting
//	if((currTD->bdt->PID&&BDT_PID_OWN)==BDT_PID_OWN)
//		return;
	//2.QH Init
//	usb_host.curr_QH=(HOST_QUEUE_HEAD*)currTD->QH;
	USBHOST_CURR_QH_SET((HOST_QUEUE_HEAD*)currTD->QH);
	//3.TD Init
//	usb_host.prve_TD=currTD;
//	usb_host.curr_TD=currTD;
	USBHOST_CURR_TD_SET(currTD);
	USBHOST_PRVE_TD_SET(currTD);
	

	//4.Setting
	Fill2REG_FCT(currTD);
}

//Get Curr TD Data
//Set Next TD
//Remove Finish TD
Uint8	debug_tokendone_log[500];
Uint16	Debug_tokendone_count=0;
Uint32	Debug_tokendone_step=0;
void Debug_TokenDone_record(Uint32 data)
{
	if(Debug_tokendone_count>499)
		Debug_tokendone_count=0;
	debug_tokendone_log[Debug_tokendone_count]=(Uint8)data;
	Debug_tokendone_count++;
}

void TokenDone_ISR(Uint32 rstatus)
{
    Uint8 status, tmp;
    Uint32 PROCESS_ID, new_Addr, remain_byte, bytecnt;
    EP_DATA *ep;
    BDT_STRUCT *bdt;
    HOST_QUEUE_HEAD *this_qh;
	TRANSACTION_STRUCT *this_td, *nextTD;
	Uint32	dbg_log=0;

	this_qh		= (HOST_QUEUE_HEAD *)USBHOST_CURR_QH_GET();
	this_td		= (TRANSACTION_STRUCT *)USBHOST_CURR_TD_GET();
	nextTD		= this_td->TD_next;
	PROCESS_ID	= (Uint32)this_td->state;
	ep			= this_td->curr_EP;
	
	
    status = this_td->bdt->PID & BDT_PID_MASKS;	/* Get the status from BDT */
    if (!status || (status == BDT_NAK_PID))		/*When TD NAK From USB Device*/
    {
    	dbg_log=0x30000000;
    	/*Interrupt IN NAK*/
    	if((this_td->state&0xF0) == INT_TRANSACTION){
    		QH_RemoveTD(this_qh, this_td);	/*Remove Curr TD*/
    		USBH_work_report(USBH_INTNAK, PROCESS_ID, rstatus);
    		dbg_log |=0x1000000;
    	}
    	/*Others NAK*/
    	else{
    		dbg_log |=0x2000000;
			if (++this_td->NAKcount > 30000) {
				QH_RemoveTD(this_qh, this_td);	/*Remove Curr TD*/
	            USBH_work_report(USBH_NAK, PROCESS_ID, rstatus);	//Notify to Call Bake FCT
				this_td->NAKcount = 0;
				dbg_log |=0x400000;
				goto next_td_setting;
			}
			USBHOST_PRVE_TD_SET(this_td);
			dbg_log |=0x300000;
		}
		goto next_td_setting;
    }
    

	if(((this_td->state&0x0f)==CNTRL_SETUP)||((this_td->state&0x0f)==CNTRL_LAST)){
	    QH_RemoveTD(this_qh, this_td);/*Remove Curr TD*/
		USBH_work_report(USBH_DONE, PROCESS_ID, rstatus);
		dbg_log=0x20000000;
//		HOSTHW_PRINTF("log 0x%x\n",dbg_log);
		return;
	}
	
	dbg_log=0x10000000;
	/* Endpoint Data Toggle*/
	ep->DATAx ^= BDT_PID_DATA01;

	bdt 			= this_td->bdt;	/*Host Buffer Descriptor Table*/
	bytecnt 		= bdt->BC;		/*Data Bytes Count*/	    
	ep->curr_count += bytecnt;
	/*--------------------------------Debug Log Message-----------------------------------------*/
//  temp to disable 2005/12/19 jessefanchiang debug for USBD 1.1
//	HOSTHW_PRINTF("ByteCount %d InOdd:%d InEven:%d OutOdd:%d OutEven:%d\n",
//	bytecnt,*(Uint8 *)0xE0480031,*(Uint8 *)0xE0480035,*(Uint8 *)0xE0480039,*(Uint8 *)0xE048003D);
//	HOSTHW_PRINTF("DATAx %x Curraddr %x%x%x%x\n",
//	ep->DATAx,this_td->BUFBASEH,this_td->BUFBASEL,this_td->bdt_ADDRH,this_td->bdt_ADDRL);
//	bdt->BC=0;
	/*--------------------------------Debug Log Message-----------------------------------------*/
	
	/*Get Remain Bytes*/
	remain_byte = this_td->length - ep->curr_count;
	
	this_td->bdt_BC = ep->pksize;	/*Set BDT Byte Count*/
	if (remain_byte < ep->pksize) 	/*Set BDT Byte Count if Short Packet*/
		this_td->bdt_BC = (Uint8)remain_byte;
	
	/*2.Done Condition*/
	if((this_td->length==ep->curr_count)||(bytecnt != this_td->curr_EP->pksize)){
		dbg_log |=0x3000000;
		//Bulk OUT Zero Packet
		//1.total length mod 64 ==0
		//2.transaction ID is Bulk OUT
		//3.curr byte count=64
		//4.Finish Send Zero Packet byte count=0
	    if(((this_td->length%64)==0)&&((this_td->state&0x0F)==PROCESS_OUT)&&(bytecnt)){
	    	this_td->bdt_BC=0;
	    	HOSTHW_PRINTF("BULK OUT Send Zero Packet\n");
	    	dbg_log |=0x500000;
	    }
	    else{
		    QH_RemoveTD(this_qh, this_td);/*Remove Curr TD*/
			USBH_work_report(USBH_DONE, PROCESS_ID, rstatus);
			dbg_log |=0x400000;
			goto next_td_setting;
		}
	}
	dbg_log |=0x60000;
	/*Init Next Packet Data Toggle*/
	this_td->bdt_PID	= BDT_PID_OWN | ep->DATAx;
	/*init Next Packet Buffer head*/
	new_Addr=(Uint32)(this_td->io_bf+ep->curr_count);	//Get Next Data Buffer Start
	if(new_Addr >(Uint32)(this_td->io_bf+this_td->length)){
		HOSTHW_PRINTF("USBH IO Buffer Error\n");
		while(1);
	}
	IObf_2_BDT(this_td, (Uint8 *)new_Addr);				//TD Buffer Address Converter
	HOSTHW_PRINTF("NextAddr %x\n",new_Addr);
	
next_td_setting:
	return;//Direct EXit,Don't Enable Next transaction Descriptor 

	//SOF Interrupt Check
	tmp=(Uint8)(rstatus>>16);
	if((tmp&INTR_SOF_TOK)==INTR_SOF_TOK){
		dbg_log |=0x1000;
//		HOSTHW_PRINTF("log 0x%x BC %d\n",dbg_log,bytecnt);
		return;
	}
	dbg_log |=0x2000;										
	USBHOST_PRVE_TD_SET(this_td);		//Change Next TD to Do,Remeber Curr TD
	/*QH TD Tail Get Next QH's TD*/
	if(nextTD==NULL){
		dbg_log |=0x100;
		nextTD=SearchQHsTD(this_qh->QH_next);
		if(nextTD==NULL){/*No Any More TD Link to QH*/
			USBHOST_CURR_QH_RESET();
			USBHOST_CURR_TD_RESET();
			USBHOST_PRVE_TD_RESET();
			dbg_log |=0x10;
//			HOSTHW_PRINTF("log 0x%x BC %d\n",dbg_log,bytecnt);
			return;
		}
		dbg_log |=0x20;
		USBHOST_CURR_QH_SET((HOST_QUEUE_HEAD*)nextTD->QH);
		USBHOST_PRVE_TD_SET(nextTD);
	}
	dbg_log |=1;
	USBHOST_CURR_TD_SET(nextTD);
	Fill2REG_FCT(nextTD);
//	HOSTHW_PRINTF("log 0x%x BC %d\n",dbg_log,bytecnt);
}

static void USBH_hisr(void)
{
    Uint8 istatus, status, error;
    Uint32 rstatus;
    Uint32 PROCESS_ID=0;
    
        
    /* While any of the enabled interrupts are asserted... */
    istatus = *regINT_STAT & *regINT_ENB;

    
    while (istatus) 
    {
        error = *regERR_STAT;
        status = *regSTATUS;
        
        /*Action Status+INT Status+Error Status+Transaction Status*/
        /*Action Status is Current Action Status		*/
        /*INT Status is Interrupt Status Register Value	*/
        /*ERROR Status is Error Occurred Status Value	*/
        /*Transation Status is HOST Controller Transaction Status */
		rstatus = ((Uint32)istatus << 16) | ((Uint32)error << 8) | status;
        
        /* Clear error bits */
        *regERR_STAT = error & *regERR_ENB;
        /* Previous token transmission should already be done */
        if (*regCTL & CTRL_TOKEN_BUSY) {
//            usb_host.state = NO_REQUEST;
//            usb_host.reset_required = TRUE;
//            usb_host.DeviceReady = NOT_READY;
//            Start_USB_Host_Task(USBH_ERROR, rstatus);

            /* Clear all enabled interrupts */
            *regINT_STAT = istatus;

            /* Check for another interrupt pending */
            istatus = *regINT_STAT & *regINT_ENB;


            /* Clear bit in exception register. */
            *(unsigned long *)EXMSK1A |= (1 << USB1_INTERRUPT_BIT);
            *(Uint32 *)EXCLRA = (1 << USB1_INTERRUPT_BIT);
            return;
        }
		
        /* Check if STALL interrupt */
        if (istatus & INTR_STALL) 
        {
            /* A bad-CRC16 error is OK with STALL, clear error */
            if (error & VUSB_ERR_STAT_CRC16) {
                error ^= VUSB_ERR_STAT_CRC16;
                if (!error) {
                    istatus     ^= VUSB_INT_STAT_ERROR;
                    *regINT_STAT = VUSB_INT_STAT_ERROR;
                }
            }
            rstatus = ((Uint32)istatus << 16) | ((Uint32)error << 8) | status;
        	USBH_work_report(USBH_STALL, PROCESS_ID, rstatus);
        }
        /* Check if ATTACH interrupt */
        else if (istatus & INTR_ATTACH)
        {
			*regINT_ENB=0;
			USBH_work_report(USBH_ATTACH, PROCESS_ID, rstatus);
        }
        else if (istatus & INTR_TOK_DNE){
       		
        	*regINT_STAT = istatus;					/* Clear all enabled interrupts */
        	TokenDone_ISR(rstatus);
       		istatus = *regINT_STAT & *regINT_ENB;	/* Check for another interrupt pending */
       		continue;
        }
        else if (istatus & INTR_SOF_TOK)     	
			SOF_ISR();	/*SOF 1ms do one time start from ISO transfer*/
        else if (istatus & INTR_ERROR)
			USBH_work_report(USBH_ERROR, PROCESS_ID, rstatus);
        /* Check if RESET interrupt */
        else if (istatus & INTR_USB_RST) 
        {
            *regCTL = 0;
            /* Let polling routine know that device went bye-bye */
            USBHOST_DEVICEREADY_SET(NOT_READY);
            //usb_host.DeviceReady = NOT_READY;
            USBH_work_report(USBH_RESET, PROCESS_ID, rstatus);
        }
		
        /* Clear all enabled interrupts */
        *regINT_STAT = istatus;

        /* Check for another interrupt pending */
        istatus = *regINT_STAT & *regINT_ENB;
    }

    /* Clear bit in exception register. */
    *(unsigned long *)EXMSK1A |= (1 << USB1_INTERRUPT_BIT);
    *(Uint32 *)EXCLRA = (1 << USB1_INTERRUPT_BIT);
}

/***********************************************************************/
/*  Function Name  : USBH_isr                                          */
/*  Returned Value : None                                              */
/*                                                                     */
/*  Service all the interrupts in the VUSB1.1 host hardware            */
/***********************************************************************/
static void USBH_isr(int vector)
{
    /* Mask off USB interrupts because we're moving to HISR */
    *(unsigned long *)EXMSK1A &= ~(1 << USB1_INTERRUPT_BIT);

    NU_Activate_HISR(&usbh_hisr);

    /* Clear bit in exception register. */
    *(Uint32 *)EXCLRA = (1 << USB1_INTERRUPT_BIT);
}


void usbh_hw_init(void)
{
	DEV_INFO *DEV;
	STATUS status;
    void (*old_lisr)(int);
    
    
	//Default Pipe Create
	Ctrl_ep=(EP_DATA *)calloc(sizeof(EP_DATA),1);
	
	//Device Info Struct
	device_info=(DEV_INFO *)calloc(sizeof(DEV_INFO)*DEVID_MAX,1);
	
  	QH_init();
  	
    /* Register HISR */
    status = NU_Create_HISR(&usbh_hisr, "HostHISR", USBH_hisr, 2, pHISRStack,
                            HISR_STACKSIZE);
    ASSERT(status == NU_SUCCESS);

    /* Install the LISR (Low Interrupt Service Routine). */
    status = NU_Register_LISR(USB1_INTERRUPT_BIT, USBH_isr, &old_lisr);
    ASSERT(status == NU_SUCCESS);
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
一区二区三区在线视频观看58| 国产在线国偷精品产拍免费yy| jlzzjlzz欧美大全| 欧美哺乳videos| 国产福利一区二区三区视频 | 国产美女精品一区二区三区| 日韩一级二级三级精品视频| 日韩电影在线观看网站| 久久亚洲免费视频| 在线观看成人小视频| 日韩专区一卡二卡| 日韩一级大片在线观看| 国产成人在线免费观看| 亚洲人成在线播放网站岛国| 6080国产精品一区二区| 国产成人综合网站| 青青青爽久久午夜综合久久午夜 | 色激情天天射综合网| 国产精品一区二区三区乱码| 亚洲成人动漫在线观看| 日本一区二区三级电影在线观看| 欧美日韩国产首页| 日本高清不卡视频| 懂色av一区二区在线播放| 中文字幕一区在线| 久久这里只有精品首页| 制服丝袜日韩国产| 国产乱码精品一区二区三区av| 国产精品久久久久久久久果冻传媒 | 亚洲成av人片在www色猫咪| 国产精品久久久久一区| 国产日韩欧美综合一区| 精品免费日韩av| 欧美不卡激情三级在线观看| 日韩欧美激情四射| 亚洲同性gay激情无套| 中文字幕在线免费不卡| 亚洲精品在线免费观看视频| 成人影视亚洲图片在线| 蜜臀av性久久久久蜜臀aⅴ流畅| 中文字幕字幕中文在线中不卡视频| 久久久久久久久久美女| 欧美午夜理伦三级在线观看| 欧美亚洲综合色| 在线看日本不卡| 91精品欧美一区二区三区综合在 | 日韩一区二区三区视频| 国产精品第一页第二页第三页| 亚洲欧美日韩在线不卡| 亚洲蜜臀av乱码久久精品| 一区二区在线免费| 日韩黄色免费网站| 国产乱码精品一品二品| 色先锋资源久久综合| 欧美日韩黄视频| 亚洲精品在线电影| 一区二区三区在线视频免费| 美女爽到高潮91| av电影在线观看一区| 欧美日韩电影一区| 久久九九影视网| 五月婷婷另类国产| 一本色道久久综合狠狠躁的推荐 | 欧美精品一区二区三区蜜臀 | 日韩欧美在线网站| 亚洲欧美激情视频在线观看一区二区三区| 一区二区三区波多野结衣在线观看| 国产高清亚洲一区| 欧美卡1卡2卡| 亚洲视频资源在线| 成人免费va视频| 在线免费亚洲电影| 亚洲狼人国产精品| 91在线无精精品入口| 欧美一二三在线| 国产精品欧美一区二区三区| 国产一区二区在线看| 日韩欧美久久一区| 国产午夜精品久久久久久免费视| 蜜臀久久99精品久久久久久9 | 最新不卡av在线| 粗大黑人巨茎大战欧美成人| 久久久国产一区二区三区四区小说| 亚洲444eee在线观看| 欧美日韩午夜影院| 亚洲欧美一区二区三区孕妇| aaa欧美色吧激情视频| 亚洲精品伦理在线| 99在线精品观看| 国产亚洲污的网站| av在线播放不卡| 亚洲视频一二区| 色综合色综合色综合| 亚洲乱码中文字幕综合| 欧美色男人天堂| 免费观看在线色综合| 久久亚洲春色中文字幕久久久| 国产91高潮流白浆在线麻豆| 亚洲日本在线a| 精品处破学生在线二十三| 91在线观看地址| 国产综合色视频| 国产欧美精品在线观看| 欧美性做爰猛烈叫床潮| 五月激情综合网| 久久毛片高清国产| 91丝袜高跟美女视频| 久久99精品久久只有精品| 国产精品免费久久| 精品欧美久久久| 欧美日韩五月天| 99精品1区2区| 色婷婷av一区二区| 日日夜夜精品视频天天综合网| 777a∨成人精品桃花网| 精品一区二区三区视频在线观看| 国产精品久久久久久久久久免费看| 欧美午夜片在线观看| 懂色av一区二区在线播放| 亚洲码国产岛国毛片在线| 欧美岛国在线观看| 色网综合在线观看| 99视频有精品| 91免费版在线看| 欧美亚洲国产一区二区三区| 精品视频在线看| 日韩一级二级三级精品视频| 欧美老肥妇做.爰bbww| 99久久综合国产精品| 另类的小说在线视频另类成人小视频在线 | 国产精品一二二区| 久久不见久久见免费视频1| 中文字幕一区二区三区乱码在线 | 26uuu欧美| 国产欧美一区二区精品性色超碰| 久久精品夜色噜噜亚洲a∨| 91精品免费观看| 91福利视频在线| 蜜臀久久99精品久久久画质超高清| 亚洲免费av网站| 日产欧产美韩系列久久99| 国产精品538一区二区在线| 99久久精品免费看国产| 欧美私模裸体表演在线观看| 国产成人免费在线| 蜜桃视频一区二区三区在线观看 | 亚洲另类在线制服丝袜| 亚洲综合另类小说| 蜜臀精品一区二区三区在线观看| 青娱乐精品视频| 国产成人在线看| 在线日韩一区二区| 国产三级三级三级精品8ⅰ区| 欧美精品vⅰdeose4hd| 国产亚洲福利社区一区| 亚洲精品视频在线看| 亚洲va欧美va国产va天堂影院| 亚洲午夜电影网| 狠狠色综合日日| 欧美在线视频你懂得| 国产欧美日韩不卡| 久久99精品久久久久久久久久久久 | 99视频一区二区| 久久久亚洲综合| 久久99精品久久久久婷婷| 国内精品不卡在线| 欧美日韩黄视频| 日韩你懂的电影在线观看| 国产精品国模大尺度视频| 美女一区二区在线观看| 91国模大尺度私拍在线视频| 久久在线观看免费| 自拍偷在线精品自拍偷无码专区| 亚洲精品成人天堂一二三| 日韩成人精品在线观看| 丁香另类激情小说| 欧美日韩在线播放三区四区| 国产欧美日本一区二区三区| 久久精品国产**网站演员| 欧美视频一区在线| 一卡二卡三卡日韩欧美| 91碰在线视频| 亚洲福利视频一区| 4hu四虎永久在线影院成人| 中文字幕免费不卡| 国产成人亚洲精品青草天美| 51午夜精品国产| 国产毛片精品一区| 国产午夜亚洲精品理论片色戒 | 久久久久国产精品麻豆| 在线观看免费亚洲| 91原创在线视频| 成人免费黄色在线| 国产精品亚洲第一区在线暖暖韩国| 午夜日韩在线电影| 亚洲欧美日韩中文播放| 日韩欧美中文字幕制服| 94-欧美-setu| 国产精品 日产精品 欧美精品| 视频一区二区三区中文字幕|