精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

国内精品国产成人国产三级粉色| 天天躁日日躁狠狠躁喷水| 色乱码一区二区三区网站| 欧美日韩激情一区二区| www.好吊操| 国产三级视频在线看| 国内精品视频一区二区三区八戒| 久久免费视频观看| 日韩片在线观看| 亚洲精品三区| 欧美午夜精品久久久久久浪潮 | 国产在线xxxx| 日韩欧美在线观看一区二区| 六月丁香综合在线视频| 国内久久久精品| 午夜激情福利电影| 伊人久久大香线蕉av不卡| 91精品国产综合久久久久久| 久久久久人妻精品一区三寸| 日韩伦理电影网站| 国产精品国模大尺度视频| 噜噜噜噜噜久久久久久91| 国产黄色av片| 老鸭窝一区二区久久精品| 国产91精品高潮白浆喷水| 国产高清在线免费观看| 999国产精品永久免费视频app| 亚洲精品美女在线观看播放| 波多野结衣网页| 亚洲av片不卡无码久久| 黑人巨大精品| 亚洲国产视频在线| 超碰免费在线公开| 国产一区精品| 久久一区二区视频| 久久久福利视频| 内射后入在线观看一区| 国产精品一区不卡| 国产精品视频导航| 无码视频一区二区三区| 国产精品久久久久毛片大屁完整版| 久久成年人视频| 91视频青青草| 影视一区二区| 久热精品视频在线观看| 国产高清视频免费在线观看| 久久国产电影| 中文字幕亚洲自拍| 超碰人人人人人人人| 国产毛片一区二区三区| 亚洲欧美日韩区| 天天躁日日躁aaaa视频| 一本色道久久综合亚洲精品酒店| 亚洲国产欧美精品| 久久福利小视频| 日本妇女一区| 亚洲精品一二区| 国产毛片久久久久久久| 精品久久影院| 色偷偷噜噜噜亚洲男人| 欧美三级黄色大片| 欧美天天在线| 97精品久久久| 久久久久久亚洲av无码专区| 日韩不卡一区二区| 国产精选久久久久久| 一区二区三区免费在线| 国产一区二区调教| 高清视频一区| 日本啊v在线| 国产精品剧情在线亚洲| 99精品视频网站| 久久亚洲资源| 91精品办公室少妇高潮对白| 久久久久国产一区| 精品999日本久久久影院| 日韩精品一区在线观看| 国产精品第七页| 欧洲三级视频| 欧美不卡视频一区发布| 韩国av免费观看| 日韩高清一级片| 91日本在线观看| 少妇av一区二区| 亚洲国产精品精华液2区45| 国产日韩欧美大片| 中文字幕在线视频网站| 欧美精品一二三区| www.88av| 久久精品高清| 久久久伊人日本| 日韩久久久久久久久久| 国产精品亚洲一区二区三区妖精 | 99热这里只有精品在线| 99久久精品国产一区二区三区| 日韩国产高清一区| 久久青青色综合| 日本黄色一区二区| 美女又黄又免费的视频| 欧洲杯半决赛直播| 91国偷自产一区二区三区的观看方式| 亚洲天堂自拍偷拍| 91在线国内视频| 六月婷婷激情网| 成人软件在线观看| 亚洲精品一区在线观看| 少妇愉情理伦三级| 国产亚洲在线| 97人人澡人人爽| 69久久夜色| 色综合久久久久网| 在线xxxxx| 亚洲精品国产首次亮相| 国产精品成人免费电影| 黄频网站在线观看| 亚洲人成网站精品片在线观看| 成年人黄色片视频| 极品国产人妖chinesets亚洲人妖| 日日骚av一区| 久久久久久亚洲av无码专区| 91在线视频网址| 日韩精品一区二区免费| 在线不卡一区| 色偷偷偷亚洲综合网另类| 丁香六月婷婷综合| 91色九色蝌蚪| 亚洲人成无码网站久久99热国产 | 欧美精品国产精品久久久 | 欧美日韩激情视频一区二区三区| 亚洲一区二区av电影| 不卡中文字幕在线观看| 成人在线视频免费观看| 国产脚交av在线一区二区| 国产又爽又黄网站亚洲视频123| 亚洲综合激情另类小说区| 欧美日韩理论片| 香蕉av一区二区| 成人综合网网址| 日本在线天堂| 欧美老女人在线| 蜜臀av午夜精品久久| 久草在线在线精品观看| 亚洲精品日韩成人| 国产极品嫩模在线观看91精品| 亚洲天天在线日亚洲洲精| 一级一片免费看| 91麻豆免费在线观看| 尤物av无码色av无码| 米奇精品关键词| 91福利视频在线观看| 青春草在线观看| 色av成人天堂桃色av| 无码 人妻 在线 视频| 日本在线不卡一区| 亚洲三区视频| 激情综合五月| 久久久久久综合网天天| 天天干天天爽天天操| 欧美日韩国产在线看| 真实乱视频国产免费观看 | 欧美日韩一区二区三区四区五区六区| 好吊视频一区二区三区四区| 国产亚洲精品久久飘花| www.成人影院| 日韩中文在线不卡| 国产不卡av在线播放| 亚洲综合久久久久| 日韩 中文字幕| 日本成人在线不卡视频| 天天成人综合网| 大陆精大陆国产国语精品| 青青青国产精品一区二区| 成年午夜在线| 日韩精品中文字幕在线一区| 国产精品久久久久久久久久久久久久久久久 | 手机看片日韩av| 国产一区二区免费视频| 2019日韩中文字幕mv| 国产精品一线天粉嫩av| 91亚洲精品久久久久久久久久久久 | 久久综合色之久久综合| 欧美精品性生活| 国产精品av久久久久久麻豆网| 久久大香伊蕉在人线观看热2| 欧美日韩国产网站| 欧美肥臀大乳一区二区免费视频| 青春有你2免费观看完整版在线播放高清| 欧美性色综合网| 精品亚洲永久免费| 国产女同性恋一区二区| 激情av中文字幕| 奇米精品一区二区三区在线观看| 狠狠干视频网站| 九九亚洲视频| 国产精品视频免费一区| h1515四虎成人| 欧美极度另类性三渗透| 1区2区3区在线观看| 精品国内二区三区| 在线视频 中文字幕| 欧美日韩国产专区| 日本一级二级视频| 国产欧美日本一区视频| 男男一级淫片免费播放| 久久国产精品第一页| 黄www在线观看| 伊人成综合网| 午夜精品视频在线观看一区二区 | 国产在线精品一区二区三区不卡| 777久久久精品一区二区三区| 亚欧美无遮挡hd高清在线视频 | 成人激情免费在线| 美女18一级毛片一品久道久久综合| 欧美不卡视频一区发布| jizz日韩| 亚洲人成电影网| 少妇人妻偷人精品一区二区| 91精品国产欧美日韩| 中日韩av在线| 欧美体内谢she精2性欧美| 日本午夜小视频| 亚洲一区在线观看免费观看电影高清| 网站永久看片免费| 国产欧美1区2区3区| 波多野结衣 在线| 99久久99久久综合| 亚洲色偷偷色噜噜狠狠99网| 国产成人综合在线观看| av中文字幕网址| 精品在线一区二区三区| 91香蕉视频导航| 奇米色一区二区| 天天干天天干天天干天天干天天干| 香蕉视频成人在线观看| 国产白丝袜美女久久久久| 亚洲精选在线| 日本不卡在线观看视频| 国产日韩欧美| av天堂永久资源网| 快she精品国产999| 久久久久免费精品| 日韩av中文在线观看| 日韩中文字幕在线视频观看| 99人久久精品视频最新地址| 国产精品网站免费| 亚洲毛片播放| 人妻有码中文字幕| 久久久久久亚洲精品杨幂换脸| 黄色片一级视频| 久久久久国产精品一区三寸| 人妻丰满熟妇av无码区app| 日韩精品亚洲专区| 中文字幕第100页| 国产一区二区精品久久| 国产精品91av| fc2成人免费人成在线观看播放| 日本japanese极品少妇| 国产亚洲福利社区一区| 91国模少妇一区二区三区| 国产欧美精品在线观看| 九九精品视频免费| 亚洲一二三四区| 亚洲天堂日韩av| 在线免费观看成人短视频| 91国产免费视频| 精品国一区二区三区| 九色在线播放| 久久久精品影院| 漫画在线观看av| 国产精品9999| 亚洲视频国产| 日本高清视频一区二区三区| 亚洲不卡av不卡一区二区| 国产高清www| 老司机精品视频网站| 亚洲午夜精品一区| 99久久综合狠狠综合久久| 中字幕一区二区三区乱码| 亚洲欧美偷拍三级| 国产日产精品一区二区三区| 精品视频一区 二区 三区| 亚洲AV无码国产精品午夜字幕| 日韩精品在线免费观看视频| av在线播放av| 国内精品久久久久久久久| 亚洲日本网址| 国产经典一区二区三区| 嫩草影视亚洲| 国产 欧美 日本| 日韩电影在线观看电影| 久久久久亚洲av片无码v| 国产亚洲欧洲997久久综合| 青青青在线视频| 在线观看精品一区| 国产小视频一区| 久久久精品国产亚洲| 国产精品专区免费| 国产精品一码二码三码在线| 欧美影院三区| 两根大肉大捧一进一出好爽视频| 韩日精品视频一区| 精品国产成人亚洲午夜福利| 一区二区三区日韩精品视频| 日本中文在线播放| 欧美成人激情免费网| 拍真实国产伦偷精品| 7777精品视频| aaa国产精品| 欧美日韩一区二区三区电影| 日韩在线a电影| avtt香蕉久久| 亚洲一区自拍偷拍| 国产又粗又大又黄| 中文字幕亚洲欧美在线| 亚洲一二三四| 精品久久精品久久| 国产专区一区| 午夜影院免费版| 亚洲欧洲成人精品av97| 国产在线观看第一页| 日韩成人xxxx| caoporn视频在线观看| 国产富婆一区二区三区| 亚洲一级淫片| 国产女同无遮挡互慰高潮91| 国产欧美日韩不卡免费| 欧美成人一区二区三区四区| 亚洲免费人成在线视频观看| 国产h片在线观看| 国产成人成网站在线播放青青 | 99久久久无码国产精品6| 成人性色生活片免费看爆迷你毛片| 全网免费在线播放视频入口| 7777精品伊人久久久大香线蕉| 后入内射无码人妻一区| 在线观看欧美日韩电影| 亚洲一区二区久久久久久久| 欧美丝袜激情| 亚洲视频在线a| 久久女同精品一区二区| 全部毛片永久免费看| 亚洲第一二三四五区| 2020日本在线视频中文字幕| 成人片在线免费看| 国内成人在线| 欧美xxxxx精品| 婷婷中文字幕综合| 色一情一乱一区二区三区| 91国内精品久久| 久久男人av| jizzjizzxxxx| 国产女人aaa级久久久级| 啪啪小视频网站| 日韩中文字幕欧美| 亚洲色图综合| 国产91沈先生在线播放| av在线综合网| 草莓视频18免费观看| 色偷偷噜噜噜亚洲男人| 日本一区二区乱| 日韩精品在线中文字幕| 91免费在线播放| 中文字幕有码视频| 久久的精品视频| 国产三级午夜理伦三级| 久久香蕉国产线看观看av| 日韩三级精品| 欧美 日韩 激情| 中文字幕欧美激情一区| 国产特级黄色片| 91精品国产91久久久久久不卡| 免费黄色成人| 一级黄色高清视频| 欧美日韩色婷婷| av在线资源网| 97久久天天综合色天天综合色hd| 国产欧美91| 国产又色又爽又高潮免费| 精品日本一线二线三线不卡| 欧美亚洲韩国| 小泽玛利亚av在线| 久久中文字幕电影| 国产又粗又大又爽视频| 91黑丝高跟在线| 久久精品亚洲人成影院| 欧美无人区码suv| 欧美日韩黄色影视| 91超碰在线| 一区二区三区精品国产| 成人av中文字幕| 亚洲中文一区二区三区| 91精品国产91久久久久久| 国产精品99久久| 毛茸茸多毛bbb毛多视频| 欧美精品日韩精品| 一区一区三区| 草b视频在线观看| 中文字幕综合网| 青青免费在线视频| 粉嫩高清一区二区三区精品视频 |