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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? 最近新學(xué)linux對(duì)一個(gè)鼠標(biāo)驅(qū)動(dòng)的分析.cpp

?? 最近新學(xué)linux對(duì)一個(gè)鼠標(biāo)驅(qū)動(dòng)的分析
?? CPP
?? 第 1 頁 / 共 2 頁
字號(hào):
一個(gè)鼠標(biāo)驅(qū)動(dòng)程序的分析(/driver/input/mouse/amimouse.c)

一:Input設(shè)備驅(qū)動(dòng),(我稱為虛擬輸入設(shè)備)//drivers/input/input.c文件
	 input設(shè)備是一種字符設(shè)備在模塊初始化時(shí)創(chuàng)建設(shè)備類"input",注冊(cè)Input字符設(shè)備,input的操作函數(shù)只有Open函數(shù)。當(dāng)打開特
	 定設(shè)備時(shí)才將特定的設(shè)備操作函數(shù)
	 static struct file_operations input_fops = {
	.owner = THIS_MODULE,
		.open = input_open_file,
	};
函數(shù)調(diào)用如下:
“/input/input . c”
input_init()//這是虛擬輸入設(shè)備的入口,既模塊加載時(shí)調(diào)用
{
	class_simple_create(THIS_MODULE,"input");//創(chuàng)建設(shè)備類
	input_proc_init()//創(chuàng)建proc下的文件節(jié)點(diǎn)
		retval = register_chrdev(INPUT_MAJOR, "input", &input_fops);//注冊(cè)字符設(shè)備驅(qū)動(dòng)程序,在系統(tǒng)字符設(shè)備數(shù)組中添加一個(gè)字符設(shè)
	
	備,主設(shè)備號(hào)為INPUT—MAJOR,操作函數(shù)集為input_fops,在特殊文件打開時(shí)會(huì)根據(jù)文件的節(jié)點(diǎn)結(jié)構(gòu)INODE中的主設(shè)備
		
		號(hào)在系統(tǒng)字符設(shè)備數(shù)組中搜索主設(shè)備號(hào)相同的字符設(shè)備驅(qū)動(dòng)程序的操作函數(shù)集并將此操作函數(shù)集付給FILE結(jié)構(gòu)的操
		
		作函數(shù)集指針f_ops并執(zhí)行該函數(shù)集中的打開操作。。對(duì)于本input類設(shè)備即為input_fops中的input_open_file
		
		devfs_mk_dir("input")//在設(shè)備目錄"/dev"下創(chuàng)建devfs文件系統(tǒng)的"input"目錄,以后的具體輸入設(shè)備也將在這個(gè)目錄下建立
		
		特殊設(shè)備文件,當(dāng)打開該特殊文件時(shí)即對(duì)設(shè)備進(jìn)行操作
}
當(dāng)打開具體文件時(shí)既執(zhí)行input_ipen_file
此函數(shù)會(huì)尋到具體設(shè)備的文件操作函數(shù)集并付給file->f_op(這是一個(gè)文件的操作函數(shù)集,當(dāng)系統(tǒng)打開一個(gè)文件時(shí)即產(chǎn)生一個(gè)file結(jié)構(gòu)
對(duì)該文件的操作都通過file中的f_opes 如讀取即調(diào)用FILE->f_op->read等


二:輸入驅(qū)動(dòng)器,輸入驅(qū)動(dòng)器是指一類的輸入設(shè)備(比如鼠標(biāo)輸入驅(qū)動(dòng)器,鍵盤輸入驅(qū)動(dòng)器等等)
這里說的是鼠標(biāo)輸入驅(qū)動(dòng)器。。(我也稱之為虛擬鼠標(biāo)驅(qū)動(dòng)器,因?yàn)樗⒉煌瓿烧嬲挠布嚓P(guān)的鼠標(biāo)驅(qū)動(dòng),
真正的硬件IO驅(qū)動(dòng)要在device中完成)他的描述結(jié)構(gòu)是
struct input_handler {
	
	void *private;//私有數(shù)據(jù)
	
	void (*event)(struct input_handle *handle, unsigned int type, unsigned int code, int value);//響應(yīng)輸入事件的函數(shù)
	struct input_handle* (*connect)(struct input_handler *handler, struct input_dev *dev, struct input_device_id *id);//連接設(shè)備的函數(shù)
	void (*disconnect)(struct input_handle *handle);//斷開設(shè)備
	
	struct file_operations *fops;//文件操作函數(shù)集
	int minor;//次設(shè)備號(hào)
	char *name;//設(shè)備名
	
	.....
};
static struct mousedev *mousedev_table[MOUSEDEV_MINORS];
static struct input_handler mousedev_handler = {
	.event =	mousedev_event,//鼠標(biāo)事件回調(diào)函數(shù)
		.connect =	mousedev_connect,//連接device
		.disconnect =	mousedev_disconnect,
		.fops =		&mousedev_fops,//文件操作函數(shù)集
		.minor =	MOUSEDEV_MINOR_BASE,//次設(shè)備號(hào)基數(shù)
		.name =		"mousedev",//設(shè)備名
		.id_table =	mousedev_ids,//本驅(qū)動(dòng)支持的設(shè)備ID
};

他的入口是:
“/input/mousedev . c”
static int __init mousedev_init(void)
{
	input_register_handler(&mousedev_handler);//在虛擬輸入設(shè)備中注冊(cè)鼠標(biāo)輸入驅(qū)動(dòng)器
	
	memset(&mousedev_mix, 0, sizeof(struct mousedev));
	INIT_LIST_HEAD(&mousedev_mix.list);
	init_waitqueue_head(&mousedev_mix.wait);
	mousedev_table[MOUSEDEV_MIX] = &mousedev_mix;//給設(shè)備數(shù)組一個(gè)默認(rèn)的鼠標(biāo)device
	mousedev_mix.exist = 1;
	mousedev_mix.minor = MOUSEDEV_MIX;
	
	devfs_mk_cdev(MKDEV(INPUT_MAJOR, MOUSEDEV_MINOR_BASE + MOUSEDEV_MIX),
		S_IFCHR|S_IRUGO|S_IWUSR, "input/mice");//建立input/mice文件
	class_simple_device_add(input_class, MKDEV(INPUT_MAJOR, MOUSEDEV_MINOR_BASE + MOUSEDEV_MIX),
		NULL, "mice");//在input_class設(shè)備類中增加本設(shè)備驅(qū)動(dòng)程序
	
	
	printk(KERN_INFO "mice: PS/2 mouse device common for all mice\n");
	
	return 0;
}
虛擬鼠標(biāo)設(shè)備驅(qū)動(dòng)器就提供了各種操作的操作集函數(shù),如read,write,ioctrl,等
static struct file_operations mousedev_fops = {
	.owner =	THIS_MODULE,
		.read =		mousedev_read,
		.write =	mousedev_write,
		.poll =		mousedev_poll,
		.open =		mousedev_open,
		.release =	mousedev_release,
		.fasync =	mousedev_fasync,
};
“/input/input . c”
void input_register_handler(struct input_handler *handler)
{
	struct input_dev *dev;//具體設(shè)備描述結(jié)構(gòu)
	struct input_handle *handle;//設(shè)備句柄
	struct input_device_id *id;//設(shè)備ID
	
	if (!handler) return;
	
	INIT_LIST_HEAD(&handler->h_list);//初始化設(shè)備驅(qū)動(dòng)器的鏈表
	
	if (handler->fops != NULL)
		input_table[handler->minor >> 5] = handler;//把驅(qū)動(dòng)器按次設(shè)備號(hào)放到驅(qū)動(dòng)器數(shù)組里,虛擬設(shè)備支持最多8個(gè)次設(shè)備
	
	list_add_tail(&handler->node, &input_handler_list);//加入驅(qū)動(dòng)器鏈表
	
	list_for_each_entry(dev, &input_dev_list, node)
		if (!handler->blacklist || !input_match_device(handler->blacklist, dev))
			if ((id = input_match_device(handler->id_table, dev)))//用當(dāng)前所有的輸入設(shè)備于驅(qū)動(dòng)器適配
				if ((handle = handler->connect(handler, dev, id)))//適配成功與驅(qū)動(dòng)器連接
					input_link_handle(handle);//連接成功將設(shè)備句柄加到設(shè)備的句柄鏈表中
}
我們先假設(shè)注冊(cè)驅(qū)動(dòng)器時(shí)還沒有一個(gè)輸入設(shè)備在鏈表中,即注冊(cè)時(shí)不需要進(jìn)行驅(qū)動(dòng)器適配。在后面設(shè)備注冊(cè)時(shí)再講適配
連接
這樣就完成了一個(gè)驅(qū)動(dòng)器的注冊(cè)
三,具體設(shè)備。。
這里完成的是真實(shí)與硬件交互的設(shè)備程序。。設(shè)備的描述結(jié)構(gòu)是input_dev
struct input_dev {
	
	void *private;//私有數(shù)據(jù)
	
	char *name;//
	......
	int (*open)(struct input_dev *dev);
	void (*close)(struct input_dev *dev);
	int (*accept)(struct input_dev *dev, struct file *file);
	int (*flush)(struct input_dev *dev, struct file *file);
	int (*event)(struct input_dev *dev, unsigned int type, unsigned int code, int value);
	int (*upload_effect)(struct input_dev *dev, struct ff_effect *effect);
	int (*erase_effect)(struct input_dev *dev, int effect_id);//都是些回調(diào)函數(shù)了
	
	struct input_handle *grab;//設(shè)備句柄
	struct device *dev;//通用設(shè)備結(jié)構(gòu)
	
	struct list_head	h_list;//句柄鏈表input_link_handle函數(shù)將設(shè)備句柄加入到鏈表中。dev響應(yīng)中斷時(shí)如果沒有自己專用的event函數(shù)就遍歷handle列表找到handle指向的input_handler的evnt函數(shù)調(diào)用
	struct list_head	node;
};


struct input_handle {
	
	void *private;//私有數(shù)據(jù) 
	
	int open;
	char *name;
	
	struct input_dev *dev;//設(shè)備
	struct input_handler *handler;//句柄擁有者驅(qū)動(dòng)器
	
	struct list_head	d_node;
	struct list_head	h_node;
};
它的入口是:
“/input/mouse/amimouse . c”
static int __init amimouse_init(void)
{
	if (!MACH_IS_AMIGA || !AMIGAHW_PRESENT(AMI_MOUSE))
		return -ENODEV;
	
	amimouse_dev.evbit[0] = BIT(EV_KEY) | BIT(EV_REL);
	amimouse_dev.relbit[0] = BIT(REL_X) | BIT(REL_Y);
	amimouse_dev.keybit[LONG(BTN_LEFT)] = BIT(BTN_LEFT) | BIT(BTN_MIDDLE) | BIT(BTN_RIGHT);
	amimouse_dev.open = amimouse_open;
	amimouse_dev.close = amimouse_close;
	
	amimouse_dev.name = amimouse_name;
	amimouse_dev.phys = amimouse_phys;
	amimouse_dev.id.bustype = BUS_AMIGA;
	amimouse_dev.id.vendor = 0x0001;
	amimouse_dev.id.product = 0x0002;
	amimouse_dev.id.version = 0x0100;
	
	input_register_device(&amimouse_dev);//注冊(cè)設(shè)備
	
	printk(KERN_INFO "input: %s at joy0dat\n", amimouse_name);
	return 0;
}
“/input/input . c”
void input_register_device(struct input_dev *dev)
{
	struct input_handle *handle;
	struct input_handler *handler;
	struct input_device_id *id;
	
	
	/*
	* If delay and period are pre-set by the driver, then autorepeating
	* is handled by the driver itself and we don't do it in input.c.
	*/
	
	init_timer(&dev->timer);//初始化設(shè)備的定時(shí)器,對(duì)鼠標(biāo)沒什么用mousedev里沒對(duì)他做什么,對(duì)鍵盤有用
	if (!dev->rep[REP_DELAY] && !dev->rep[REP_PERIOD]) {
		dev->timer.data = (long) dev;
		dev->timer.function = input_repeat_key;
		dev->rep[REP_DELAY] = 250;
		dev->rep[REP_PERIOD] = 33;
	}
	
	INIT_LIST_HEAD(&dev->h_list);//初始化設(shè)備的句柄鏈表
	list_add_tail(&dev->node, &input_dev_list);
	
	list_for_each_entry(handler, &input_handler_list, node)//遍歷驅(qū)動(dòng)器列表
		if (!handler->blacklist || !input_match_device(handler->blacklist, dev))  
			if ((id = input_match_device(handler->id_table, dev)))//找到與設(shè)備相配的驅(qū)動(dòng)器,用id_table適配
				if ((handle = handler->connect(handler, dev, id)))//適配成功與驅(qū)動(dòng)器連接// 這里是mouse驅(qū)動(dòng)器
					mousedev的connect函數(shù)是mousedev_connect
					input_link_handle(handle);//把Mousedev返回input_handle(注意不是input_handler)加到dev的handle連表中
				//這樣dev響應(yīng)中斷時(shí)如果沒有自己專用的event函數(shù)就遍歷handle列表找到handle指向的input_handler的evnt函數(shù)調(diào)用
				
#ifdef CONFIG_HOTPLUG
				input_call_hotplug("add", dev);
#endif
				
#ifdef CONFIG_PROC_FS
				input_devices_state++;
				wake_up(&input_devices_poll_wait);
#endif
}

看看驅(qū)動(dòng)器是怎么連接設(shè)備的,他申請(qǐng)一個(gè)mousedev結(jié)構(gòu)用來保存鼠標(biāo)設(shè)備信息。將設(shè)備和設(shè)備句柄及input_handler聯(lián)系起來
放在mousedev_table指針數(shù)組中并給每個(gè)mousedev分配一個(gè)ID minor進(jìn)行唯一標(biāo)志
struct mousedev {
	int exist;//設(shè)備是否存在
	int open;//
	int minor;
	char name[16];
	wait_queue_head_t wait;//等待隊(duì)列
	struct list_head list;//打開mousdev的文件的列表
	struct input_handle handle;//設(shè)備句柄-	
	struct mousedev_hw_data packet;
	unsigned int pkt_count;
	int old_x[4], old_y[4];
	int frac_dx, frac_dy;
	unsigned long touch;
};
struct input_handle {
	
	void *private;
	
	int open;
	char *name;
	
	struct input_dev *dev;
	struct input_handler *handler;
	
	struct list_head	d_node;
	struct list_head	h_node;
};
“/input/mousedev . c”
static struct input_handle *mousedev_connect(struct input_handler *handler, struct input_dev *dev, struct input_device_id *id)
{
	struct mousedev *mousedev;
	int minor = 0;
	
	for (minor = 0; minor < MOUSEDEV_MINORS && mousedev_table[minor]; minor++);
	if (minor == MOUSEDEV_MINORS) {
		printk(KERN_ERR "mousedev: no more free mousedev devices\n");
		return NULL;
	}
	
	if (!(mousedev = kmalloc(sizeof(struct mousedev), GFP_KERNEL)))
		return NULL;
	memset(mousedev, 0, sizeof(struct mousedev));
	
	INIT_LIST_HEAD(&mousedev->list);
	init_waitqueue_head(&mousedev->wait);
	
	mousedev->minor = minor;
	mousedev->exist = 1;
	mousedev->handle.dev = dev;
	mousedev->handle.name = mousedev->name;
	mousedev->handle.handler = handler;
	mousedev->handle.private = mousedev;
	sprintf(mousedev->name, "mouse%d", minor);
	
	if (mousedev_mix.open)
		input_open_device(&mousedev->handle);//看默認(rèn)的mousedev是否需要打開,如果需要就打開設(shè)備。
	
	mousedev_table[minor] = mousedev;
	
	devfs_mk_cdev(MKDEV(INPUT_MAJOR, MOUSEDEV_MINOR_BASE + minor),
		S_IFCHR|S_IRUGO|S_IWUSR, "input/mouse%d", minor);建立設(shè)備文件
	class_simple_device_add(input_class,
		MKDEV(INPUT_MAJOR, MOUSEDEV_MINOR_BASE + minor),
		dev->dev, "mouse%d", minor);
	
	return &mousedev->handle;
}
所有的注冊(cè)已經(jīng)完成
四:設(shè)備控制。。。。
打開設(shè)備。
當(dāng)系統(tǒng)打開一個(gè)設(shè)備時(shí) 如"/dev/input/mouse0",虛擬文件系統(tǒng)根據(jù)文件節(jié)點(diǎn)INODE中的主設(shè)備

號(hào)在系統(tǒng)字符設(shè)備數(shù)組中搜索主設(shè)備號(hào)相同的字符設(shè)備驅(qū)動(dòng)程序的操作函數(shù)集并將此操作函數(shù)集付給FILE結(jié)構(gòu)的操

作函數(shù)集指針f_ops并執(zhí)行該函數(shù)集中的打開操作。。對(duì)于input類設(shè)備即為input_fops中的input_open_file
“/input/input . c”
static int input_open_file(struct inode *inode, struct file *file)
{
	struct input_handler *handler = input_table[iminor(inode) >> 5];//根據(jù)次設(shè)備號(hào)找到驅(qū)動(dòng)器這里我們就假設(shè)是打開
	鼠標(biāo)既找到了mousedev_handler
	struct file_operations *old_fops, *new_fops = NULL;
	int err;
	
	/* No load-on-demand here? */
	if (!handler || !(new_fops = fops_get(handler->fops)))//得到輸入驅(qū)動(dòng)器的操作函數(shù)集//輸入驅(qū)動(dòng)器。可以是一個(gè)鼠標(biāo)輸入驅(qū)動(dòng)器
		//或者一個(gè)鍵盤輸入驅(qū)動(dòng)器,這里分析的是鼠標(biāo)
		return -ENODEV;
	
		/*
		* That's _really_ odd. Usually NULL ->open means "nothing special",
		* not "no device". Oh, well...
	*/
	if (!new_fops->open) {//如果輸入驅(qū)動(dòng)器沒有打開操作函數(shù),既設(shè)備文件無法完成打開操作

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
色综合视频一区二区三区高清| 国产一区二区看久久| 色激情天天射综合网| 伊人婷婷欧美激情| 欧美日韩一区不卡| 捆绑变态av一区二区三区| 精品欧美黑人一区二区三区| 国产一区三区三区| 国产精品免费视频网站| 91福利在线免费观看| 午夜精品久久久久久久蜜桃app| 欧美精品第1页| 韩国三级中文字幕hd久久精品| 中文字幕国产一区| 欧美性做爰猛烈叫床潮| 久久精品国产精品青草| 国产日产欧美一区二区三区| 99精品国产91久久久久久| 偷拍日韩校园综合在线| 久久免费精品国产久精品久久久久| 丁香天五香天堂综合| 亚洲精品五月天| 日韩免费高清视频| 岛国精品在线播放| 日日夜夜免费精品视频| 久久精品免视看| 欧美无砖专区一中文字| 国内成人免费视频| 一区二区三区欧美日韩| 欧美精品一区二区三区在线播放 | 日韩专区欧美专区| 久久蜜桃香蕉精品一区二区三区| 色婷婷综合激情| 色久综合一二码| 久久91精品久久久久久秒播| 亚洲欧美日韩国产一区二区三区| 日韩一区二区高清| 91视视频在线观看入口直接观看www| 日日摸夜夜添夜夜添亚洲女人| 国产精品免费久久久久| 欧美一区二区三区四区五区 | 久久99久久99| 亚洲风情在线资源站| 国产精品无圣光一区二区| 欧美疯狂做受xxxx富婆| 91网站在线观看视频| 精品一区二区三区免费| 亚洲成av人片在www色猫咪| 中文字幕精品一区| 久久综合色8888| 5858s免费视频成人| 91麻豆123| 国产成人啪免费观看软件| 日韩精品亚洲专区| 亚洲三级视频在线观看| 久久久久久久综合狠狠综合| 日韩欧美国产一区在线观看| 欧美日韩卡一卡二| 91福利社在线观看| 99久久精品一区| 成人h精品动漫一区二区三区| 美国av一区二区| 成人理论电影网| 国产精品主播直播| 国模冰冰炮一区二区| 另类小说视频一区二区| 日韩成人一级片| 日韩avvvv在线播放| 午夜免费欧美电影| 亚洲国产精品嫩草影院| 亚洲国产日韩av| 亚洲午夜一二三区视频| 一区二区三区在线影院| 亚洲黄色性网站| 亚洲欧美日韩国产综合| 亚洲乱码国产乱码精品精的特点| 日韩一区在线免费观看| 亚洲特黄一级片| 亚洲欧美日韩国产手机在线 | 欧美吻胸吃奶大尺度电影| 欧美伊人久久久久久久久影院| 日本韩国视频一区二区| 99re视频这里只有精品| 91蜜桃婷婷狠狠久久综合9色| 不卡高清视频专区| 色妞www精品视频| 在线视频国产一区| 欧美日韩综合色| 欧美日韩国产片| 这里是久久伊人| 欧美一级片在线看| 久久综合久久99| 国产精品久久久久影院亚瑟 | 欧美一三区三区四区免费在线看 | 成人18精品视频| 日本精品一级二级| 91精品国产综合久久蜜臀| 欧美精品久久久久久久多人混战 | 日韩极品在线观看| 美国精品在线观看| 国产成人免费视频网站| 91视频在线看| 91精品国产麻豆| 日本一区二区三区国色天香 | 日韩在线播放一区二区| 精品一区二区免费在线观看| 国产成人免费网站| 91国产视频在线观看| 一区二区三区免费看视频| 亚洲成人免费影院| 国产一区二区福利| 91国内精品野花午夜精品| 欧美一区二区三区不卡| 亚洲精品一区二区三区影院| 国产精品久久久久久久久动漫| 亚洲电影你懂得| 国产综合色在线| 色菇凉天天综合网| 精品国精品国产尤物美女| 国产精品成人一区二区艾草 | voyeur盗摄精品| 欧美日本一区二区三区四区| 日韩一区二区三区在线| 自拍偷自拍亚洲精品播放| 久久精品国产成人一区二区三区| 色综合久久久久久久久| 26uuuu精品一区二区| 亚洲综合图片区| 国产高清亚洲一区| 欧美一级淫片007| 一区二区免费在线播放| 国产不卡在线视频| 91精品视频网| 亚洲人成小说网站色在线| 韩国中文字幕2020精品| 欧美人与z0zoxxxx视频| 综合自拍亚洲综合图不卡区| 国精产品一区一区三区mba视频| 在线中文字幕不卡| 中文字幕国产一区二区| 老司机精品视频一区二区三区| 91亚洲精华国产精华精华液| 久久久精品一品道一区| 丝袜国产日韩另类美女| 色婷婷国产精品| 国产精品久久久久aaaa| 国产精品正在播放| 亚洲精品在线免费观看视频| 午夜久久久影院| 欧美视频你懂的| 中文字幕一区二区三区不卡在线| 国产一区二三区好的| 日韩亚洲欧美中文三级| 亚洲综合免费观看高清完整版在线 | 久久久久久麻豆| 伦理电影国产精品| 欧美肥妇bbw| 亚洲mv在线观看| 91福利在线导航| 亚洲乱码中文字幕| 色综合久久综合中文综合网| 国产精品沙发午睡系列990531| 国产成人精品综合在线观看 | 亚洲视频香蕉人妖| 粉嫩高潮美女一区二区三区| 久久婷婷综合激情| 精品制服美女丁香| 欧美xfplay| 国产精品资源在线观看| 国产色产综合产在线视频| 国产一区二区精品在线观看| 久久久精品国产99久久精品芒果| 久久66热偷产精品| xnxx国产精品| 成人晚上爱看视频| 亚洲视频一区在线观看| 欧美精品一区视频| 国产美女娇喘av呻吟久久 | 中文字幕av资源一区| 福利视频网站一区二区三区| 中文字幕av不卡| 色婷婷狠狠综合| 视频在线观看一区二区三区| 日韩网站在线看片你懂的| 看国产成人h片视频| 久久影音资源网| 丁香婷婷深情五月亚洲| 亚洲欧美另类图片小说| 欧美日韩精品欧美日韩精品| 美女视频一区在线观看| 国产欧美精品一区aⅴ影院| 99re免费视频精品全部| 亚洲国产精品自拍| 精品日产卡一卡二卡麻豆| 成人高清视频在线| 亚洲国产视频一区二区| 日韩精品中文字幕在线一区| 成人手机在线视频| 亚洲成人av电影| 久久美女高清视频|