精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Linux字符設備驅動框架

系統 Linux
字符設備是Linux三大設備之一(另外兩種是塊設備,網絡設備),字符設備就是字節流形式通訊的I/O設備,絕大部分設備都是字符設備,常見的字符設備包括鼠標、鍵盤、顯示器、串口等等,當我們執行ls -l /dev的時候,就能看到大量的設備文件,c就是字符設備,b就是塊設備,網絡設備沒有對應的設備文件。

字符設備是Linux三大設備之一(另外兩種是塊設備,網絡設備),字符設備就是字節流形式通訊的I/O設備,絕大部分設備都是字符設備,常見的字符設備包括鼠標、鍵盤、顯示器、串口等等,當我們執行ls -l /dev的時候,就能看到大量的設備文件,c就是字符設備,b就是塊設備,網絡設備沒有對應的設備文件。編寫一個外部模塊的字符設備驅動,除了要實現編寫一個模塊所需要的代碼之外,還需要編寫作為一個字符設備的代碼。

驅動模型

Linux一切皆文件,那么作為一個設備文件,它的操作方法接口封裝在struct file_operations,當我們寫一個驅動的時候,一定要實現相應的接口,這樣才能使這個驅動可用,Linux的內核中大量使用"注冊+回調"機制進行驅動程序的編寫,所謂注冊回調,簡單的理解,就是當我們open一個設備文件的時候,其實是通過VFS找到相應的inode,并執行此前創建這個設備文件時注冊在inode中的open函數,其他函數也是如此,所以,為了讓我們寫的驅動能夠正常的被應用程序操作,首先要做的就是實現相應的方法,然后再創建相應的設備文件。

  1. #include <linux/cdev.h> //for struct cdev 
  2. #include <linux/fs.h>   //for struct file 
  3. #include <asm-generic/uaccess.h>    //for copy_to_user 
  4. #include <linux/errno.h>            //for error number 
  5.  
  6. static int ma = 0; 
  7. static int mi = 0; 
  8. const int count = 3;/* 準備操作方法集 *//*  
  9. struct file_operations { 
  10.     struct module *owner;   //THIS_MODULE 
  11.      
  12.     //讀設備 
  13.     ssize_t (*read) (struct file *, char __user *, size_t, loff_t *); 
  14.     //寫設備 
  15.     ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *); 
  16.  
  17.     //映射內核空間到用戶空間 
  18.     int (*mmap) (struct file *, struct vm_area_struct *); 
  19.  
  20.     //讀寫設備參數、讀設備狀態、控制設備 
  21.     long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long); 
  22.  
  23.     //打開設備 
  24.     int (*open) (struct inode *, struct file *); 
  25.     //關閉設備 
  26.     int (*release) (struct inode *, struct file *); 
  27.  
  28.     //刷新設備 
  29.     int (*flush) (struct file *, fl_owner_t id); 
  30.  
  31.     //文件定位 
  32.     loff_t (*llseek) (struct file *, loff_t, int); 
  33.  
  34.     //異步通知 
  35.     int (*fasync) (int, struct file *, int); 
  36.     //POLL機制 
  37.     unsigned int (*poll) (struct file *, struct poll_table_struct *); 
  38.     。。。 
  39. }; 
  40. */ 
  41.  
  42. ssize_t myread(struct file *filep, char __user * user_buf, size_t size, loff_t* offset) 
  43. {    return 0; 
  44. struct file fops = { 
  45.     .owner = THIS_MODULE, 
  46.     .read = myread, 
  47.     ... 
  48. };/* 字符設備對象類型  
  49. struct cdev { 
  50.     struct kobject kobj;      
  51.     struct module *owner;      //模塊所有者(THIS_MODULE),用于模塊計數 
  52.     const struct file_operations *ops;//操作方法集(分工:打開、關閉、讀/寫、...) 
  53.     struct list_head list; 
  54.     dev_t dev;                            //設備號(第一個) 
  55.     unsigned int count;            //設備數量 
  56. }; 
  57. */static int __init chrdev_init(void){ 
  58.     ...    /* 構造cdev設備對象 */ 
  59.     struct cdev *cdev_alloc(void);    /* 初始化cdev設備對象 */ 
  60.     void cdev_init(struct cdev*, const struct file_opeartions*);    /* 申請設備號,靜態or動態*/ 
  61.     /* 為字符設備靜態申請第一個設備號 */ 
  62.     int register_chrdev_region(dev_t from, unsigned count, const charname);    /* 為字符設備動態申請第一個設備號 */ 
  63.     int alloc_chrdev_region(dev_t* dev, unsigned baseminor, unsigned count, const charname); 
  64.  
  65.     ma = MAJOR(dev)     //從dev_t數據中得到主設備號 
  66.     mi = MINOR(dev)     //從dev_t數據中得到次設備號 
  67.     MKDEV(ma,1) //將主設備號和次設備號組合成設備號,多用于批量創建/刪除設備文件 
  68.  
  69.     /* 注冊字符設備對象cdev到內核 */ 
  70.     int cdev_add(struct cdev* , dev_t, unsigned); 
  71.     ... 
  72. }static void __exit chrdev_exit(void){ 
  73.     ...    /* cdev_del()、cdev_put()二選一 */ 
  74.     /* 從內核注銷cdev設備對象 */ 
  75.     void cdev_del(struct cdev* );    /* 從內核注銷cdev設備對象 */ 
  76.     void cdev_put(stuct cdev *);    /* 回收設備號 */ 
  77.     void unregister_chrdev_region(dev_t from, unsigned count); 
  78.     ... 
  79.  

羅嗦一句,如果使用靜態申請設備號,那么最大的問題就是不要與已知的設備號相沖突,內核在文檔"Documentation/devices.txt"中已經注明了哪些主設備號被使用了,從中可以看出,在2^12個主設備號中,我們能夠使用的范圍是240-255以及261-2^12-1的部分,這也可以解釋為什么我們動態申請的時候,設備號經常是250的原因。此外,通過這個文件,我們也可以看出,"主設備號表征一類設備",但是字符/塊設備本身就可以被分為好多類,所以內核給他們每一類都分配了主設備號。 

 

 

 

實現read,write

Linux下各個進程都有自己獨立的進程空間,即使是將內核的數據映射到用戶進程,該數據的PID也會自動轉變為該用戶進程的PID,由于這種機制的存在,我們不能直接將數據從內核空間和用戶空間進行拷貝,而需要專門的拷貝數據函數/宏:

  1. long copy_from_user(void *to, const void __user * from, unsigned long n) 
  2. long copy_to_user(void __user *to, const void *from, unsigned long n) 

這兩個函數可以將內核空間的數據拷貝到回調該函數的用戶進程的用戶進程空間,有了這兩個函數,內核中的read,write就可以實現內核空間和用戶空間的數據拷貝。

  1. ssize_t myread(struct file *filep, char __user * user_buf, size_t size, loff_t* offset) 
  2.     long ret = 0; 
  3.     size = size > MAX_KBUF?MAX_KBUF:size
  4.         if(copy_to_user(user_buf, kbuf,size
  5.                 return -EAGAIN; 
  6.     } 
  7.     return 0; 
  8.  

實現ioctl

ioctl是Linux專門為用戶層控制設備設計的系統調用接口,這個接口具有極大的靈活性,我們的設備打算讓用戶通過哪些命令實現哪些功能,都可以通過它來實現,ioctl在操作方法集中對應的函數指針是long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long);,其中的命令和參數完全由驅動指定,通常命令會寫在一個頭文件中以供應用層和驅動層遵守同樣的通信協議,Linux建議如圖所示的方式定義ioctl()命令

設備類型    序列號     方向      數據尺寸
8bit        8bit    2bit    13/14bit 

設備類型字段為一個幻數,可以是0~0xff之間的數,內核中的"ioctl-number.txt"給出了一個推薦的和已經被使用的幻數(但是已經好久沒人維護了),新設備驅動定義幻數的時候要避免與其沖突。

序列號字段表示當前命令是整個ioctl命令中的第幾個,從1開始計數。

方向字段為2bit,表示數據的傳輸方向,可能的值是:_IOC_NONE,_IOC_READ,_IOC_WRITE和_IOC_READ|_IOC_WRITE。

數據尺寸字段表示涉及的用戶數據的大小,這個成員的寬度依賴于體系結構,通常是13或14位。

內核還定義了_IO(),_IOR(),_IOW(),_IOWR()這4個宏來輔助生成這種格式的命令。這幾個宏的作用是根據傳入的type(設備類型字段),nr(序列號字段)和size(數據長度字段)和方向字段移位組合生成命令碼。

內核中還預定義了一些I/O控制命令,如果某設備驅動中包含了與預定義命令一樣的命令碼,這些命令會被當做預定義命令被內核處理而不是被設備驅動處理,有如下4種:

  • FIOCLEX:即file ioctl close on exec 對文件設置專用的標志,通知內核當exec()系統帶哦用發生時自動關閉打開的文件
  • FIONCLEX:即file ioctl not close on exec,清除由FIOCLEX設置的標志
  • FIOQSIZE:獲得一個文件或目錄的大小,當用于設備文件時,返回一個ENOTTY錯誤
  • FIONBIO:即file ioctl non-blocking I/O 這個調用修改flip->f_flags中的O_NONBLOCK標志

實例 

  1. //mycmd.h...#include <asm/ioctl.h>#define CMDT 'A'#define KARG_SIZE 36struct karg{    int kval;    char kbuf[KARG_SIZE]; 
  2. };#define CMD_OFF _IO(CMDT,0)#define CMD_ON  _IO(CMDT,1)#define CMD_R   _IOR(CMDT,2,struct karg)#define CMD_W   _IOW(CMDT,3,struct karg)...  
  1. //chrdev.c 
  2.  
  3. static long demo_ioctl(struct file *filp, unsigned int cmd, unsigned long arg){ 
  4.     static struct karg karg = { 
  5.         .kval = 0, 
  6.         .kbuf = {0}, 
  7.     }; 
  8.     struct karg *usr_arg; 
  9.     switch(cmd){ 
  10.         case CMD_ON:        /* 開燈 */ 
  11.         break; 
  12.         case CMD_OFF:        /* 關燈 */ 
  13.         break; 
  14.         case CMD_R: 
  15.         if(_IOC_SIZE(cmd) != sizeof(karg)){ 
  16.            return -EINVAL; 
  17.         } 
  18.         usr_arg = (struct karg *)arg; 
  19.          
  20.         if(copy_to_user(usr_arg, &karg, sizeof(karg))){  
  21.            return -EAGAIN; 
  22.         }  
  23.         break; 
  24.         case CMD_W:      
  25.         if(_IOC_SIZE(cmd) != sizeof(karg)){ 
  26.            return -EINVAL; 
  27.         } 
  28.         usr_arg = (struct karg *)arg; 
  29.         if(copy_from_user(&karg, usr_arg, sizeof(karg))){                       return -EAGAIN; 
  30.         } 
  31.         break; 
  32.         default
  33.         ; 
  34.     }; 
  35.     return 0;}  

創建設備文件

插入的設備模塊,我們就可以使用cat /proc/devices命令查看當前系統注冊的設備,但是我們還沒有創建相應的設備文件,用戶也就不能通過文件訪問這個設備。設備文件的inode應該是包含了這個設備的設備號,操作方法集指針等信息,這樣我們就可以通過設備文件找到相應的inode進而訪問設備。創建設備文件的方法有兩種,手動創建或自動創建,手動創建設備文件就是使用mknod /dev/xxx 設備類型 主設備號 次設備號的命令創建,所以首先需要使用cat /proc/devices查看設備的主設備號并通過源碼找到設備的次設備號,需要注意的是,理論上設備文件可以放置在任何文件加夾,但是放到"/dev"才符合Linux的設備管理機制,這里面的devtmpfs是專門設計用來管理設備文件的文件系統。設備文件創建好之后就會和創建時指定的設備綁定,即使設備已經被卸載了,如要刪除設備文件,只需要像刪除普通文件一樣rm即可。理論上模塊名(lsmod),設備名(/proc/devices),設備文件名(/dev)并沒有什么關系,完全可以不一樣,但是原則上還是建議將三者進行統一,便于管理。

除了使用蹩腳的手動創建設備節點的方式,我們還可以在設備源碼中使用相應的措施使設備一旦被加載就自動創建設備文件,自動創建設備文件需要我們在編譯內核的時候或制作根文件系統的時候就好相應的配置: 

  1. Device Drivers ---> 
  2.         Generic Driver Options ---> 
  3.             [*]Maintain a devtmpfs filesystem to mount at /dev 
  4.             [*] Automount devtmpfs at /dev,after the kernel mounted the rootfs  

OR

制作根文件系統的啟動腳本寫入

  1. mount -t sysfs none sysfs /sys 
  2. mdev -s //udev也行  

有了這些準備,只需要導出相應的設備信息到"/sys"就可以按照我們的要求自動創建設備文件。內核給我們提供了相關的API

  1. class_create(owner,name); 
  2. struct device *device_create_vargs(struct class *cls, struct device *parent,dev_t devt, void *drvdata,const char *fmt, va_list vargs); 
  3.  
  4. void class_destroy(struct class *cls);    
  5. void device_destroy(struct class *cls, dev_t devt);  

有了這幾個函數,我們就可以在設備的xxx_init()和xxx_exit()中分別填寫以下的代碼就可以實現自動的創建刪除設備文件

  1. /* 在/sys中導出設備類信息 */ 
  2.     cls = class_create(THIS_MODULE,DEV_NAME); 
  3.         /* 在cls指向的類中創建一組(個)設備文件 */ 
  4.     for(i= minor;i<(minor+cnt);i++){ 
  5.         devp = device_create(cls,NULL,MKDEV(major,i),NULL,"%s%d",DEV_NAME,i); 
  6.     }    
  1. /* 在cls指向的類中刪除一組(個)設備文件 */ 
  2.     for(i= minor;i<(minor+cnt);i++){ 
  3.         device_destroy(cls,MKDEV(major,i)); 
  4.     } 
  5.         /* 在/sys中刪除設備類信息 */ 
  6.     class_destroy(cls);             //一定要先卸載device再卸載class  

完成了這些工作,一個簡單的字符設備驅動就搭建完成了,現在就可以寫一個用戶程序進行測試了^ - ^ 

責任編輯:龐桂玉 來源: 嵌入式Linux中文站
相關推薦

2009-09-11 08:36:16

linux塊字符設備linux操作系統

2009-08-04 10:46:04

2017-11-16 14:46:58

Linuxplatform總線驅動設備

2020-12-03 08:59:06

Linux設備驅動

2022-05-10 08:49:46

設備驅動Linux

2021-11-16 06:55:36

Linux字符設備

2021-11-22 08:14:23

Linux Linux驅動Linux 系統

2009-12-23 13:17:36

Linux設備驅動

2011-01-10 18:21:38

linux編寫程序

2017-11-06 17:16:55

Linux設備驅動并發控制

2023-05-15 08:58:41

塊設備驅動Linux

2016-12-15 14:55:31

Linux定時延時

2021-11-29 07:55:45

Linux GPIO Linux 系統

2023-03-08 15:55:53

Linux驅動鴻蒙

2021-04-12 12:00:13

Linux運維Linux系統

2023-05-12 07:27:24

Linux內核網絡設備驅動

2009-12-07 09:39:04

Linux設備驅動硬件通信

2023-03-02 20:52:11

? PWM脈沖寬度調制

2017-11-07 20:12:05

Linux音頻設備ALSA

2017-03-01 16:40:12

Linux驅動技術設備阻塞
點贊
收藏

51CTO技術棧公眾號

亚洲视频中文字幕| 精品一二三四区| 国产日韩欧美综合一区| 久久精品久久久久久| 日韩av卡一卡二| 黄色av网站免费在线观看| 在线精品一区| 国产一区二区三区中文| 丰满少妇中文字幕| 午夜不卡影院| 国产精品你懂的在线| 99在线观看视频网站| 欧美国产成人精品一区二区三区| 日韩成人综合| 亚洲大尺度美女在线| 免费大片在线观看| 丝袜在线视频| 久久久av毛片精品| 91香蕉视频在线下载| 性色av免费观看| 国产精品香蕉| 欧美日韩免费观看一区二区三区| 免费高清一区二区三区| а天堂8中文最新版在线官网| 影院欧美亚洲| 日韩中文有码在线视频| 日韩免费高清一区二区| 日日夜夜亚洲| 一本色道久久综合亚洲91| 国产91视频一区| 天堂аⅴ在线地址8| 99re这里都是精品| 不卡一卡2卡3卡4卡精品在| 中文在线最新版天堂| 国产午夜精品一区二区三区欧美 | 无码国产伦一区二区三区视频 | 欧美亚洲动漫制服丝袜| 久久av一区二区三区漫画| 一级特黄aaaaaa大片| 日韩主播视频在线| 欧美性在线视频| 成年人免费看毛片| 韩国一区二区三区在线观看| 久久成年人视频| 欧美日韩色视频| 久久精品青草| 久久韩剧网电视剧| a一级免费视频| 日韩欧美不卡| 日韩在线欧美在线| 波多野结衣家庭教师在线观看| 亚洲免费观看高清完整版在线观| 亚洲精品成人久久电影| 精品人妻伦一二三区久| 国产成人aa在线观看网站站| 欧美一区二区久久久| 亚洲欧美日本一区二区| 伊人国产精品| 欧美一区二区视频在线观看2020 | 欧美日韩免费电影| 国产精品久久久久影院老司 | 五月天网站亚洲| 蜜桃成人在线| 波多野结衣黄色网址| 日韩欧美视频在线播放| 综合激情国产一区| 天天爽天天爽天天爽| 国产精品久久久久久麻豆一区软件 | heyzo一本久久综合| 青青精品视频播放| 51国产偷自视频区视频| 久久视频一区| 国产精品久久久久久久9999 | 蜜臀av性久久久久蜜臀aⅴ流畅 | 萌白酱视频在线| 国产精品国产一区| 欧美伦理91i| 国产一区二区三区影院| 亚洲欧美日韩一区在线观看| 国产91色在线|| 中文在线字幕免费观| 国产九九视频一区二区三区| 国产视频在线观看一区| 男人天堂综合| 国产精品妹子av| 国产911在线观看| 欧洲一区精品| 欧美另类z0zxhd电影| www.四虎精品| 国产精品一区二区三区av麻| 欧美一区二区女人| 99久久免费看精品国产一区| 欧洲福利电影| 欧美福利视频网站| 神马久久久久久久| 狠狠色2019综合网| 国产亚洲精品美女久久久m| 国产尤物视频在线| 一区二区欧美视频| 成人免费无码av| 成人在线日韩| 欧美区视频在线观看| 久久久久久久久久久久国产精品| 久久不卡国产精品一区二区| 插插插亚洲综合网| 99re国产在线| 成人精品小蝌蚪| 亚洲一区不卡在线| 黄色软件视频在线观看| 在线成人高清不卡| a级大片在线观看| 中国成人一区| 久久6精品影院| 秋霞av一区二区三区| 国产91精品一区二区麻豆网站 | 国产精品揄拍一区二区| 天天综合网在线| 亚洲精品国产高清久久伦理二区| 五月天丁香综合久久国产| 福利网站在线观看| 欧美日韩激情一区| 中文字幕xxx| 亚洲视频福利| 91久久在线观看| wwwww在线观看免费视频| 午夜精品久久久久久久久| 蜜臀一区二区三区精品免费视频| 亚洲成aⅴ人片久久青草影院| 欧美成人激情图片网| 中文字幕第2页| 久久精品人人做人人综合 | 丝袜亚洲精品中文字幕一区| 国产伦精品一区二区三区照片| 精品国产18久久久久久| 国产乱码精品一区二区三区忘忧草| 欧美日韩喷水| melody高清在线观看| 调教+趴+乳夹+国产+精品| 国产精品欧美性爱| 欧美在线二区| 成人在线激情视频| 又爽又大又黄a级毛片在线视频| 色综合久久天天综合网| 法国伦理少妇愉情| 午夜在线精品偷拍| 久久久99国产精品免费| 日韩激情电影| 亚洲国产欧美久久| 日本三级片在线观看| 丁香婷婷综合五月| 日韩精品久久一区二区| 日韩欧美一级| 欧美高清在线观看| 黄色福利在线观看| 亚洲国产成人av网| 久久人妻少妇嫩草av无码专区| 欧美日韩免费| 国产一区免费在线观看| 国产美女高潮在线| 日韩精品有码在线观看| 国产午夜性春猛交ⅹxxx| 蜜桃久久久久久久| 日韩精品久久久免费观看| 国产日韩另类视频一区| 宅男66日本亚洲欧美视频| 中文字幕一区二区三区免费看| 中文字幕免费观看一区| 亚洲免费av一区| 欧美另类亚洲| 精品免费视频123区| 菠萝蜜视频在线观看www入口| 日韩电影在线观看中文字幕| 337p粉嫩色噜噜噜大肥臀| 国产精品久久久久久久久久免费看| 在线免费看v片| 视频一区欧美| 国产精品日韩欧美大师| 日本免费中文字幕在线| 欧美一卡2卡三卡4卡5免费| 不卡的免费av| 国产视频一区在线播放| www.51色.com| 一区二区久久| 亚洲电影一二三区| 日韩视频一区二区三区四区| 97av在线视频| 婷婷激情在线| 日韩成人激情视频| 在线观看视频中文字幕| 亚洲综合视频在线| 自拍偷拍中文字幕| 久久69国产一区二区蜜臀| 青草青青在线视频| 亚州一区二区| 国产91久久婷婷一区二区| 超碰电影在线播放| 亚洲人成77777在线观看网| 91午夜交换视频| 精品久久久国产精品999| 日韩av片在线免费观看| 不卡av电影在线播放| 一个色综合久久| 国产日产高清欧美一区二区三区| 亚洲一区三区| 久久综合欧美| 国产精品对白刺激久久久| 欧美日一区二区三区| 亚洲人成77777在线观看网| 国产美女精品视频国产| 色婷婷精品大在线视频| 久草网站在线观看| 亚洲国产成人自拍| 在线免费观看污视频| 国产在线一区观看| 日韩欧美黄色大片| 日韩香蕉视频| 国产乱子伦精品视频| 久久国产精品亚洲人一区二区三区| 好吊色欧美一区二区三区| 日韩黄色三级在线观看| 欧美专区第一页| av第一福利在线导航| 丝袜亚洲欧美日韩综合| 你懂的免费在线观看视频网站| 精品少妇一区二区三区在线视频 | 丁香影院在线| 久久天堂电影网| 91精品国产91久久久久游泳池 | 六月婷婷久久| 免费日韩一区二区三区| 亚洲在线观看视频| 日韩黄色在线| 国产日韩精品入口| 国产精品亲子伦av一区二区三区| 51ⅴ精品国产91久久久久久| 俺来俺也去www色在线观看| 九九综合九九综合| 尤物在线网址| 亚洲成人精品久久| 国产成人av免费看| 欧美一三区三区四区免费在线看| 一区二区视频免费观看| 在线视频欧美精品| 日日夜夜狠狠操| 欧美性20hd另类| 欧美福利第一页| 国产视频亚洲色图| 中文字幕在线观看免费高清| 久久这里只有精品首页| 在线观看国产免费视频| 91视频国产资源| 91精品视频国产| 国产在线一区观看| 在线免费黄色小视频| 国产成人免费在线| 日韩综合第一页| 久久综合色综合88| 69视频在线观看免费| 国产精品伦理一区二区| 欧美日韩色视频| 亚洲成a人v欧美综合天堂下载| 国产午夜福利精品| 色综合久久88色综合天天免费| 日本一本在线观看| 欧美日韩国产乱码电影| 999av视频| 亚洲第一偷拍网| 欧美精品少妇| 日韩综合中文字幕| 污片在线免费观看| 97在线视频免费观看| 中文字幕在线官网| 国产精品一香蕉国产线看观看| 色综合一区二区日本韩国亚洲| 99c视频在线| 网友自拍一区| 亚洲一区二区三区精品在线观看 | 国产极品在线视频| 国产精品久久久久久麻豆一区软件| 老司机午夜网站| 亚洲日本国产| 牛夜精品久久久久久久| 国产精品456露脸| 日本免费福利视频| 国产精品妹子av| 日韩高清免费av| 欧美日韩一区二区三区高清| 亚洲av无码乱码在线观看性色| 亚洲精美色品网站| 天堂中文а√在线| 韩国日本不卡在线| 成人国产一区| 国产嫩草一区二区三区在线观看| 精品一区不卡| 福利视频一区二区三区四区| 日本视频免费一区| zjzjzjzjzj亚洲女人| 欧美国产综合色视频| 国产亚洲第一页| 欧美日韩中字一区| 亚洲欧美日韩动漫| 久久亚洲精品成人| 精品国产免费人成网站| 亚洲最大福利网| 欧美精品色图| 欧美牲交a欧美牲交| 国产一区二区三区在线看麻豆| 女~淫辱の触手3d动漫| 亚洲精品视频在线观看免费| 亚洲永久精品一区| 亚洲第一福利网站| 国产cdts系列另类在线观看| 热99在线视频| ccyy激情综合| 男同互操gay射视频在线看| 999精品视频| 国产xxxxx在线观看| 成人亚洲一区二区一| 欧美a级片免费看| 在线观看亚洲专区| 天堂а√在线8种子蜜桃视频| 日韩精品亚洲视频| 日韩av官网| 91精品久久久久久蜜桃| 97精品国产一区二区三区| 毛片av免费在线观看| 99这里只有久久精品视频| 九九九免费视频| 日韩一级片网址| 成人午夜在线影视| 成人免费观看网址| 成人系列视频| 美女一区二区三区视频| 国产午夜一区二区三区| 欧美a视频在线观看| 亚洲欧美www| 欧美xoxoxo| 欧美日韩精品一区| 嫩草成人www欧美| 大黑人交xxx极品hd| 精品欧美一区二区三区| 天堂网2014av| 91精品国产色综合久久不卡98| 欧美大胆视频| 日韩av资源在线| 国产丝袜美腿一区二区三区| 久久久999久久久| 中文字幕在线看视频国产欧美在线看完整 | 国产成人一区二区三区免费看| 最新国产精品久久久| 日韩av福利在线观看| 伊人性伊人情综合网| 东京干手机福利视频| 午夜免费在线观看精品视频| 麻豆视频一区| 日韩亚洲在线视频| 国产精品网曝门| 国产一区二区三区三州| 久久在线视频在线| 视频一区视频二区欧美| 国内精品视频一区二区三区| 99久久精品费精品国产一区二区| 亚洲 欧美 成人| 色婷婷av一区二区三区在线观看 | 91精品国产品国语在线不卡 | 国产99久久精品一区二区 夜夜躁日日躁 | 国产一级做a爰片在线看免费| 精品99一区二区三区| 少妇视频在线观看| 日本精品一区二区三区视频| 久久99精品久久久久久| 青青青在线免费观看| 欧美精品一区二区三区很污很色的| 女人高潮被爽到呻吟在线观看| 欧美一区二区三区精美影视| 免费成人在线观看| 青青草原在线免费观看视频| 亚洲护士老师的毛茸茸最新章节| 亚洲国产福利| 香蕉精品视频在线| eeuss影院一区二区三区| 亚洲中文一区二区| 欧美丰满少妇xxxxx| 国产成人1区| 中文写幕一区二区三区免费观成熟| 欧美日韩国产精品一区| 免费在线午夜视频| 国产视频在线观看一区| 久久激情五月婷婷| 国产亚洲精品av| 中文字幕日韩在线播放| 国产色噜噜噜91在线精品| 青青青在线视频免费观看| 一区二区在线观看视频在线观看| 欧美少妇另类| 3d动漫精品啪啪一区二区三区免费| 亚洲欧美日韩国产综合精品二区| 欧美日韩黄色网| 亚洲人午夜精品免费| 91蝌蚪精品视频|