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

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

?? touchscreen(完善版 +pressure).c

?? S3C44B0x下的ADS7843觸摸屏驅動資料與代碼
?? C
字號:
/*
***************************************
* linux/driver/touch/touchscreen.c
* touchscreen driver for my S3C44b0X board
* copyright by kom118@163.com
***************************************
*/

#include <linux/config.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/sched.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/errno.h>
#include <linux/types.h>
#include <linux/ioport.h>
#include <linux/poll.h>
#include <linux/interrupt.h>
#include <linux/wait.h>  /*等待隊列*/

#include <asm/uaccess.h>
#include <asm/arch-S3C44B0X/s3c44b0x.h>

#include <asm/io.h>
#include <asm/irq.h>
#include <asm/arch-S3C44B0X/irqs.h>

#define  TOUCH_MAJOR        67
#define  TOUCH_DEVNAME   "touchscreen_kmf"
#define  TS_IRQ   S3C44B0X_INTERRUPT_EINT2

#define  TOUCHSTATUS_UP          0
#define  TOUCHSTATUS_DOWN     1

#define  MASK_BIT(bit)       (1<<(bit))
#define  BIT_EINT2      (1<<23)
#define  MAX_TS_BUF   16  //校準用
#define  TOUCH_TIMER_DELAY1    (HZ)/100

static int    touch_users = 0;  /* number of connected users; only one is allowed */
static int    touch_event=0;    /* is there an event pending? */
static int    j,flags=0;
static unsigned char rtmp=0;

/*該值校正用*/
//static int   xres = 640;
//static int   yres = 240;

// A/D 通道選擇命令字和工作寄存器
#define	CHX 	0x90	//通道Y+的選擇控制字	//0x9c   0x94
#define	CHY 	0xD0	//通道X+的選擇控制字	//0xDc  0xD4

#define TP_DCLK(a)           outw((inw(S3C44B0X_PDATF) &(~(1<<8)) ) | ((a&1)<<8),S3C44B0X_PDATF)   //----GPF8  ,output
#define TP_CS(a)		      outw((inw(S3C44B0X_PDATF) &(~(1<<7)) ) | ((a&1)<<7),S3C44B0X_PDATF)   //-----GPF7 , output
#define TP_DIN(a)            outw((inw(S3C44B0X_PDATF) &(~(1<<6)) ) | ((a&1)<<6),S3C44B0X_PDATF)   //------GPF6 ,output


//讀ADS7843的I/O控制口
//#define TP_BUSY	
#define TP_DOUT	       ((inw(S3C44B0X_PDATF)>>5) & 0x1)	       //-------GPF5
#define TP_IRQ		((inb(S3C44B0X_PDATG)>>2) & 0x1)        //TP_IRQ--------ExINT2(GPG2)


/*打算在中斷中使用定時器隊列,定義定時器鏈表*/
static struct timer_list  touch_timer;  /* be used for polling */

struct  TS_RET
{
	unsigned short p;
 	unsigned short x; //The x position
  	unsigned short y;//The y position	
} ;
//static  struct TS_RET  touchstate;

typedef struct {
   	 unsigned int Status;                          //觸摸屏狀態
   	 struct TS_RET  buf[MAX_TS_BUF];   //觸摸屏緩沖區
    	 unsigned int head,tail;                           //觸摸屏緩沖區頭和尾
    	 wait_queue_head_t  wq;                        //等待隊列
} TS_DEV;
static TS_DEV touchdev;

#define BUF_HEAD         touchdev.buf[touchdev.head]    //緩沖區頭
#define BUF_TAIL           touchdev.buf[touchdev.tail]       //緩沖區尾
#define INCBUF(x,mod)   ((++(x)) & ((mod)-1))            //移動緩沖區指針

static void (*TouchEvent)(void);
static void TouchEvent_dummy(void) {}
static int  IS_DOWN(void);
static void bubble_sort(unsigned short *array, int n)/*采用冒泡排序*/
{
	 int j, k, h; 
	 unsigned short temp;
  
 	for (h=n-1; h>0; h=k) /*循環到沒有比較范圍*/
	 {
  		for (j=0, k=0; j<h; j++) /*每次預置k=0,循環掃描后更新k*/
 			 {
 				  if (*(array+j) > *(array+j+1)) /*大的放在后面,小的放到前面*/
  				 {
    					 temp= *(array+j);
   					 *(array+j) = *(array+j+1);
   					 *(array+j+1) =temp; /*完成交換*/
    					  k = j; /*保存最后下沉的位置。這樣k后面的都是排序排好了的。*/
   				}
  			}
 	}
}


static void ads7843_Start( void )
{
       TP_CS(1);
	TP_DCLK(0);
	TP_CS(0);	
	TP_DIN(1);
    	//TP_DCLK(1);
       		
}

static void ads7843_Write ( unsigned char  cmd )/*實際上寫命令字*/
{
	unsigned char  i,temp;

	temp=0x80;
	//printk("TP_DCLK=");
      // TP_DCLK(0);
	for( j = 0; j < 5; j++ );   //Tcss-Tds
	
	for( i = 0; i < 8; i++ )
	{
		/*將控制字分解成位傳入ads7843,從而ads7843發送命令*/
		if(cmd&temp)  
				TP_DIN(1);
		else
				TP_DIN(0);
	
	

		for( j = 0; j < 15; j++ );
		/*軟件模擬一個CLK,將一位送出,總共送8位,所以總共循環產生了8格時鐘*/
		TP_DCLK(1);  /*DCLK置高*/
		for( j = 0; j < 10; j++ );	//200ns

		TP_DCLK(0); /*DCLK清0*/
		for( j = 0; j < 25; j++ );	//200ns	
		//為送下一位準備
		temp=temp>>1;   
	}

	TP_DIN(0); /*DIN清0,準備讀數據了*/
	
       /*接下來可以讀數據了,直接調用ads7843_read()函數*/
       return ;
}

/*讀數據*/
static unsigned short  ads7843_Read ( void )
{
	unsigned short ack = 0 ;
	unsigned char i;

	for( i = 0; i < 11; i++ )
	{
		TP_DCLK(1); 
		for( j = 0; j < 25; j++ );	//200ns
		
		TP_DCLK(0); 
		for( j = 0; j < 10; j++ );	/*時鐘下降沿讀取*/

		if(TP_DOUT)
			ack +=1;
		
		for( j = 0; j < 15; j++ ); //120ns
		ack=ack<<1;
	}
	
       TP_DCLK(1); 
	for( j = 0; j < 25; j++ );	//200ns
	TP_DCLK(0); 
	for( j = 0; j < 10; j++ ); //80ns
	
      //接收最后一位,第12位
	if(TP_DOUT)
			ack +=1;
		

	for( j = 0; j < 15; j++ );	

	for( i = 0; i < 4; i++ )
	{
		TP_DCLK(1); 
		for( j = 0; j < 25; j++ );	//200 ns
		
		TP_DCLK(0); 
		for( j = 0; j < 25; j++ );	
	
	}
	
	//最后將~CS 置高,ads7843禁止
	TP_CS(1);
	
	return ack;
}

static void ads7843_get_XY(void)
{	
	int sum,i;
	unsigned short  tempx,tempy,val[20];
	sum=0;
	/*----------------X  坐標與讀取處理---------------*/
	for(i=0;i<20;i++)
	{
		ads7843_Start() ;
		for( j = 0; j < 5; j++ ); //40ns
		ads7843_Write(CHX) ;
		//延時400ns等待數據轉換
		for( j = 0; j < 50; j++ ); //200ns
       	val[i]= ads7843_Read();
		
		for( j = 0; j < 100; j++ );
	}

	/*對val進行排序*/
       bubble_sort(val, 20);
       
	/*采用中值平均濾波發處理數據*/
	for(i=3;i<17;i++)
	{
		sum+=val[i];
	}
	/*求平均值*/
       tempx=(unsigned short)(sum/14);
	   
	/*----------------Y  坐標與讀取處理---------------*/
	sum=0;
	
	for(i=0;i<20;i++)
	{
		 ads7843_Start() ;
		 for( j = 0; j < 5; j++ ); //40ns
		 ads7843_Write(CHY) ;
		 for( j = 0; j <50; j++ ); //200ns
		 val[i]= ads7843_Read() ;

		 for( j = 0; j < 100; j++ );
	}
	
	/*對val進行排序*/
       bubble_sort(val, 20);
       
	/*采用中值平均濾波發處理數據*/
	for(i=3;i<17;i++)
	{
		sum+=val[i];
	}
	
	/*求平均值*/
	tempy=(unsigned short)(sum/14);

      /*坐標轉換*/

	BUF_HEAD.x=(3853-tempx)*640/(3853-264);
	BUF_HEAD.y=(tempy-650)*240/(3638-650);

	printk("X=%d ,  Y=%d\n",BUF_HEAD.x,BUF_HEAD.y);
	
	touchdev.tail=INCBUF(touchdev.tail,MAX_TS_BUF);

}


static  void  s3c44b0_IO_init(void)
{
       /*配置與ADS7843 相連的I/O端口 output : PF5,PG3;      input:PF6,PF7,PF8   ;ads7843  busy  線沒用*/
	unsigned int val32;
	unsigned short  val16;

      /*配置F  端口*/
	/*-------------------------*/
	/* configuration of PCONF  */
	/*-------------------------*/
	val32=inl(S3C44B0X_PCONF);
	outl((val32&0xFFC003FF)|0xFFC923FF, S3C44B0X_PCONF);  /* config GPF5 input  ; GPF6  GPF7  GPE8 output */
	
	/*-------------------------*/
	/* configuration of PUPF */
	/*-------------------------*/
	val16 =inb(S3C44B0X_PUPF)&0xFFEF;
	outw(val16, S3C44B0X_PUPF); /* config GPF5 activate pull up   GPF5 上拉電阻使能,GPF6,GPF7,GPF8  disable */
}

static int  IS_DOWN(void)
{
       rtmp=inb(S3C44B0X_PDATG);
	
        //讀入GPG端口數據,若沒鍵按下,GPG2 為1 
	if ((rtmp &0x04)==0) 
	{   
	      //延時一段時間再判斷,延時消除抖動
  		for( j= 0; j< 5000; j++ );	 //10ms
  		
		 rtmp=inb(S3C44B0X_PDATG); 
		 
	       if ((rtmp&0x04)==0) 
	 	 {
	 	 	//確實有鍵按下
	 	 	 touchdev.Status=TOUCHSTATUS_DOWN;
			 flags=1;
	 	 	 return  1;
	        }
		else 
		{
			return 0;
		}
	}
	return 0;     
}

void touch_task_handler (unsigned long irq)   /*中斷程序下半部*/
{    
      
	 //延時10ms后,判斷按鍵狀態
	if(IS_DOWN()==1)
	{	
		 /*獲取X , Y 坐標*/
              ads7843_get_XY();	
		
		/*觸摸屏仍然被按下, 繼續輪詢*/
		while((rtmp&0x04)==0)
		rtmp=inb(S3C44B0X_PDATG);
		
		BUF_HEAD.p=1;
		touch_event=1;
     		wake_up_interruptible(&(touchdev.wq));   /* wake any reading process */ 

	}

	
	//重新將G端口GPG2 設置為中斷模式
	outw(inw(S3C44B0X_PCONG)|0x30, S3C44B0X_PCONG); 
	  
	//開中斷
	outl(inl(S3C44B0X_INTMSK)&(~BIT_EINT2),S3C44B0X_INTMSK); 
	
	  //清中斷請求寄存器
	 outl(inl(S3C44B0X_I_ISPC)|(BIT_EINT2),S3C44B0X_I_ISPC);	
	  
	/*-------------------------*/
	/* enable irq          		     */
	/*-------------------------*/
	//enable_irq(irq);
	
	touchdev.Status=TOUCHSTATUS_UP;
	
	return ;
} 

static void touch_interrupt(int irq, void *dev_id, struct pt_regs *regs)  /*中斷程序上半部*/
{ 
	  //關中斷
	outl(inl(S3C44B0X_INTMSK)|(BIT_EINT2),S3C44B0X_INTMSK);
	
	  //清中斷請求寄存器
	 outl(inl(S3C44B0X_I_ISPC)|(BIT_EINT2),S3C44B0X_I_ISPC);
	
	for( j= 0; j< 5000; j++ );	 	//10ms
	
	 /*-------------------------*/
	/* disable irq          		      */
	/*-------------------------*/
	//disable_irq(irq);
	if (touchdev.Status==TOUCHSTATUS_UP)
	{      //printk(KERN_INFO "get in interrupt  ...:):)\n");
       
		//設置GPG2為輸入模式
	       outw(inw(S3C44B0X_PCONG)&0xFFCF,S3C44B0X_PCONG);
		
		//初始化定時器
		init_timer(&touch_timer);
		touch_timer.function = touch_task_handler;
		touch_timer.data = irq;
		touch_timer.expires = jiffies+TOUCH_TIMER_DELAY1;
		add_timer(&touch_timer);
	}
	
	return;

}

static ssize_t touchscreen_read(struct file *file, char *buffer,
			  size_t count, loff_t *pos)
{    
      retry:
		
	 	if (touchdev.head != touchdev.tail) //當前循環隊列中有數據
		{ 
			//把數據從內核空間傳送到用戶空間返回
			if(copy_to_user(buffer,(struct  TS_RET *)&BUF_HEAD,sizeof(struct  TS_RET)))
			{
				printk("error reading, copy_to_user\n");
				return  -EFAULT;
			}
			BUF_HEAD.p=0;/*	讀出數據后,按下狀態清楚*/
                     touchdev.head=INCBUF(touchdev.head,MAX_TS_BUF);
			return sizeof(struct  TS_RET);
		}
		else
		{
	  		 if(file->f_flags & O_NONBLOCK)//若用戶采用非阻塞方式讀取
        		  return   -EAGAIN;
			 
	   		 // printk("sleep ..... \n");
	 		  wait_event_interruptible(touchdev.wq,flags);
			  flags=0;
			  //printk("sleep after .....\n");
		}
		
     	goto retry;

     return  sizeof(unsigned char) ;
       	
	  
}

static unsigned int touchscreen_poll(struct file *file, poll_table *wait)
{
	printk("poll  normally !!!\n");
	poll_wait(file, &(touchdev.wq),   wait);   
  	return   (touchdev.head   ==   touchdev.tail)   ?   0   :   (POLLIN   |   POLLRDNORM); 

       /*poll_wait(file, &(touchdev.wq), wait);
	if(touch_event)
		return (POLLIN | POLLRDNORM);  /* readable */
 
	/*return 0;*/
}

static int touchscreen_open(struct inode *inode, struct file *file) 
{
	if(!touch_users) /* only one user is allowed!! */
		touch_users++;
	else
		return -EBUSY;
		
       //開中斷
	outl(inl(S3C44B0X_INTMSK)&(~BIT_EINT2),S3C44B0X_INTMSK); 
	printk("opened  normally :):):):):):)!!!\n");
	
	for( j= 0; j< 10000; j++ );	 
	touchdev.head = touchdev.tail = 0; //清空按鍵動作緩沖區
	enable_irq(TS_IRQ);
	
	return 0;
}

static int touchscreen_close(struct inode * inode, struct file * file)	
{
	TouchEvent = TouchEvent_dummy; //函數指針指向空函數
	if(touch_users<1)
	{	
		printk("release  touchdevice error\n");
	       return -ENODEV;
	}
       touch_users--;
	if(!touch_users) /* must be also true since we allow only one user */
	{	disable_irq(TS_IRQ);
		//關中斷
	     outl(inl(S3C44B0X_INTMSK)|BIT_EINT2,S3C44B0X_INTMSK); 
	}
	return 0;

}

struct file_operations  ts_fops = {
	read: touchscreen_read,  
	open: touchscreen_open,
	release: touchscreen_close, //釋放設備
	poll: touchscreen_poll,   //查詢設備
};


int s3c44b0x_ts_init(void)
{     
	int ret,val32;
	
	printk("s3c44b0x_touch: initializing...\n");
	
       /*-------------------------------*/
	/* configure s3c44b0x   I/O    		 */
	/* s3c44b0_IO_init();				 */
	/*-------------------------------*/
	s3c44b0_IO_init(); 
	   
	//TP_CS(1);/*ads7843芯片禁止*/
       /*-------------------------------*/
	/* configure interrupt          			 */
	/*-------------------------------*/
	
	// 將多功能端口GPG2設置為中斷模式
	outw(inw(S3C44B0X_PCONG)|0x30, S3C44B0X_PCONG); 	
	//INT2上拉使能
	outb(inb(S3C44B0X_PUPG)&(0<<2),S3C44B0X_PUPG);
	
	val32=inl(S3C44B0X_EXTINT);
	outl((val32&0xFFFFF8FF)|0x200, S3C44B0X_EXTINT);	/* 下降沿觸發*/

	 //設置中斷控制器INTMOD
	val32=inl(S3C44B0X_INTMOD);
	val32&=~MASK_BIT(23);
	outl(val32, S3C44B0X_INTMOD); 	  /* normal IRQ */

	 //設置中斷控制器INTCON
	outb( 0x5,S3C44B0X_INTCON);

	//注冊設備
	if((ret = register_chrdev(TOUCH_MAJOR,TOUCH_DEVNAME ,&ts_fops))<0)
	{
		printk("touch_rw. unable to get major %d for led write\n", TOUCH_MAJOR);
		return ret;
	}
	
	//注冊中斷
  	if(request_irq(TS_IRQ, touch_interrupt,SA_INTERRUPT, "44b0_touchscreen",NULL))
	{
		printk("s3c44b0: unable to get IRQ\n");
		return -EBUSY;
	}	
	
	touchdev.head = touchdev.tail = 0;  //初始化結構體touchdev
	touchdev.Status = TOUCHSTATUS_UP;
       
       //初始化等待隊列
	 init_waitqueue_head(&(touchdev.wq));
	   
        return 0;

}


int  s3c44b0x_ts_exit(void)
{
	int ret;

	//注銷中斷
	free_irq(TS_IRQ, NULL);
	//注銷設備
	if((ret = unregister_chrdev(TOUCH_MAJOR,TOUCH_DEVNAME ))<0)
	       printk("TOUCH DEV. unable to release major %d for read  \n",TOUCH_MAJOR);
		return ret;
	
	printk(KERN_INFO "touchscreen uninstalled\n");
	return 0;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲另类色综合网站| 精品国产免费久久| 老司机免费视频一区二区三区| 亚洲欧洲日韩av| 亚洲视频免费在线观看| 亚洲精品免费在线播放| 亚洲美女淫视频| 亚洲午夜一区二区| 日韩av中文在线观看| 日韩电影在线看| 蜜臀91精品一区二区三区| 美脚の诱脚舐め脚责91| 国产精品一区二区免费不卡 | 精品国产欧美一区二区| 精品国产一区久久| 国产精品乱码一区二区三区软件 | 欧美日韩国产一二三| 日韩一区二区三区四区| 久久久99久久| 国产精品久99| 日韩国产精品久久久| 国产精一品亚洲二区在线视频| 成人免费精品视频| 欧美日韩午夜在线视频| 欧美xxxxx牲另类人与| 国产欧美1区2区3区| 亚洲欧美日韩国产手机在线| 亚洲成人7777| 国产成人精品免费看| 欧美三级一区二区| 久久久精品国产免费观看同学| 亚洲欧美综合另类在线卡通| 视频一区二区中文字幕| 成人性生交大片免费看视频在线| 在线这里只有精品| 国产色婷婷亚洲99精品小说| 午夜亚洲国产au精品一区二区| 国产精品99久久久久久久vr| 欧美日韩中文一区| 国产精品人人做人人爽人人添| 五月激情六月综合| 成人av第一页| 久久尤物电影视频在线观看| 亚洲第一成人在线| 91网站在线播放| 国产日韩欧美综合在线| 日本欧美一区二区在线观看| 91蝌蚪porny| 欧美国产乱子伦| 久久97超碰色| 在线这里只有精品| 国产精品精品国产色婷婷| 美腿丝袜亚洲色图| 69av一区二区三区| 亚洲成人一区二区| 91蝌蚪porny成人天涯| 国产女人水真多18毛片18精品视频 | 91精品欧美久久久久久动漫 | 国产精品综合一区二区三区| 宅男在线国产精品| 亚洲一区二区视频| 91老师片黄在线观看| 国产精品免费视频网站| 国产裸体歌舞团一区二区| 欧美tk—视频vk| 日韩国产欧美一区二区三区| 欧美视频三区在线播放| 一区二区激情视频| 欧洲精品视频在线观看| 日韩一区在线免费观看| 91丨九色丨尤物| 综合自拍亚洲综合图不卡区| 色综合天天天天做夜夜夜夜做| 国产精品人妖ts系列视频| av中文字幕不卡| 亚洲欧美日韩国产一区二区三区| 色综合久久久久久久久| 亚洲人吸女人奶水| 精品视频资源站| 日韩专区欧美专区| 欧美刺激脚交jootjob| 国产精品一区二区x88av| 国产视频一区在线观看| 99久久精品一区| 一区二区三区日韩在线观看| 欧美在线free| 日韩精品亚洲专区| 欧美成人精品福利| 国产91高潮流白浆在线麻豆| 亚洲三级电影网站| 欧美网站大全在线观看| 日本成人中文字幕| 久久九九99视频| 91麻豆国产精品久久| 五月天激情综合| 久久精品综合网| 欧美中文字幕一区二区三区| 午夜不卡av免费| 欧美激情一区二区三区不卡| 94-欧美-setu| 老司机免费视频一区二区三区| 国产欧美日韩精品在线| 欧美图片一区二区三区| 国产综合久久久久久久久久久久| 国产精品理伦片| 欧美一级夜夜爽| 丁香激情综合国产| 同产精品九九九| 国产精品欧美一区喷水| 欧美女孩性生活视频| 国产精品888| 亚洲电影视频在线| 欧美国产日产图区| 欧美一区二区高清| 91性感美女视频| 国产真实乱对白精彩久久| 亚洲欧美日韩电影| 久久久久久久精| 欧美精品一二三| www.亚洲人| 国产精品影视天天线| 午夜久久久久久久久| 国产精品成人免费在线| 欧美不卡一区二区三区| 色综合久久久久综合| 国产经典欧美精品| 久久精品国产99国产| 亚洲午夜私人影院| 最新不卡av在线| 国产精品青草久久| 久久女同性恋中文字幕| 3atv一区二区三区| 色av一区二区| 97久久超碰国产精品| 国产精品白丝av| 国产美女一区二区三区| 美女网站色91| 老司机免费视频一区二区 | 国产精品自拍三区| 日韩电影在线免费看| 亚洲一区二区四区蜜桃| 亚洲激情一二三区| 亚洲欧洲中文日韩久久av乱码| 亚洲国产精品黑人久久久| 久久久天堂av| 久久久三级国产网站| 精品国产三级电影在线观看| 精品欧美乱码久久久久久 | 国产精品久久久久久久久久免费看| 亚洲精品一区二区三区影院| 欧美一级艳片视频免费观看| 欧美一区二区三区视频在线| 欧美男男青年gay1069videost | 成人美女视频在线观看| 国产在线播精品第三| 国产激情视频一区二区在线观看 | 亚洲成av人片www| 亚洲va韩国va欧美va| 午夜精品影院在线观看| 日韩精品一级中文字幕精品视频免费观看 | 午夜激情综合网| 欧美aⅴ一区二区三区视频| 日韩影院免费视频| 奇米亚洲午夜久久精品| 国产精品一区二区三区乱码| 成人av先锋影音| 色婷婷一区二区三区四区| 欧美性生活影院| 日韩一级黄色片| 国产视频一区二区在线| 亚洲欧美一区二区三区极速播放| 亚洲国产日产av| 精品亚洲aⅴ乱码一区二区三区| 国产盗摄精品一区二区三区在线| 丰满岳乱妇一区二区三区| 色屁屁一区二区| 日韩精品一区二区三区视频| 国产三级久久久| 亚洲国产精品久久艾草纯爱| 久久97超碰国产精品超碰| 99精品久久只有精品| 91精品久久久久久蜜臀| 国产欧美综合色| 亚洲亚洲人成综合网络| 国产一区二区h| 在线一区二区视频| 久久色视频免费观看| 亚洲影视在线观看| 国产精品一区在线观看你懂的| 91亚洲大成网污www| 26uuu久久天堂性欧美| 亚洲成人手机在线| 成人一道本在线| 777午夜精品视频在线播放| 国产精品三级av| 精品一区二区免费看| 欧美网站大全在线观看| 中文字幕精品—区二区四季| 婷婷开心久久网| 91麻豆6部合集magnet|