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

Linux 驅動開發 | 驅動世界里的宏偉建筑

系統 Linux
Linux 的 device model 是一個旨在統一管理所有設備驅動的模型。它猶如一棟規模宏大的建筑:以 kobject、kset、attribute 等作為基本的建筑材料,構造出支撐驅動世界的 bus、device、driver 三大組件,最后通過 sysfs 在各種基礎的建筑材料之間建立彼此的互聯層次關系,并向外界提供了與建筑內設施進行互動的文件接口。

[[386924]]

本文轉載自微信公眾號「嵌入式Hacker」,作者吳偉東Jack。轉載本文請聯系嵌入式Hacker眾號。  

哈嘍,我是老吳。

是否每一個上進的人都會覺得自己還可以再努力一點?

事情到了最后,只要沒達成目的,總能把失敗的原因歸為 "沒有再努力一點"。

但是,對努力的最大錯誤認知就是:時間越長,過程越痛苦,代表我越努力。

想一想,是否有更合理的努力方式?

以下是正文:

  • 一、什么是 device model?
  • 二、device model 的 3 個核心概念
  • 三、bus、device、driver 是如何關聯的?
  • 四、bus、device、driver 最簡單示例
  • 五、小結
  • 六、相關參考

一、什么是 device model?

Linux 的 device model 是一個旨在統一管理所有設備驅動的模型。

它猶如一棟規模宏大的建筑:

以 kobject、kset、attribute 等作為基本的建筑材料,

構造出支撐驅動世界的 bus、device、driver 三大組件,

最后通過 sysfs 在各種基礎的建筑材料之間建立彼此的互聯層次關系,并向外界提供了與建筑內設施進行互動的文件接口。

device model 有什么作用?

可以將 device 的硬件描述 和 driver 進行分離,提升 driver 的代碼復用率;

可以對 device 進行分類;

可以遍歷 device 和 driver;

可以更好地呈現設備的拓撲關系;

可以通過 sysfs 訪問設備;

可以讓設備支持熱插拔;

...

為了控制篇幅,本文將重點放在與驅動工程師關系最緊密的 bus、device、driver 3 個 組件。

二、device model 的 3 個核心概念

device model 里有 3 個核心的概念:

  • bus
  • device
  • driver

什么是 bus?

bus 代表一種總線,例如 I2C、SPI、Usb 等。

bus 是 Linux 設備驅動模型這種建筑的核心框架,系統中的設備和驅動都依附在其周圍。

啟動系統后,可以通過 /sys/bus 可以查看系統里當前有哪些總線。

bus 由 struct bus_type 來描述:

  1. struct bus_type { 
  2.  const char *name
  3.  const char *dev_name; 
  4.  struct device *dev_root; 
  5.  const struct attribute_group **bus_groups; 
  6.  const struct attribute_group **dev_groups; 
  7.  const struct attribute_group **drv_groups; 
  8.  
  9.  int (*match)(struct device *dev, struct device_driver *drv); 
  10.  int (*uevent)(struct device *dev, struct kobj_uevent_env *env); 
  11.  int (*probe)(struct device *dev); 
  12.  int (*remove)(struct device *dev); 
  13.  void (*shutdown)(struct device *dev); 
  14.  
  15.  ... 
  16.  struct subsys_private *p; 
  17.  struct lock_class_key lock_key; 
  18. }; 

不需要一下子了解各個成員的作用,用到的時候再說明。

重點關注成員:

  • int (*match)(struct device *dev, struct device_driver *drv),用于判斷掛在該 bus 上的設備和驅動是否匹配的回調函數;
  • int (*probe)(struct device *dev),如果 bus 具有探測設備的能力,則會提供該回調函數;
  • struct subsys_private *p,用于管理 bus 上的設備和驅動的數據結構;

注冊 bus 的 api:

  1. int bus_register(struct bus_type *bus); 

什么是 device ?

device 代表了某個設備。

由 struct device 來描述:

  1. struct device { 
  2.  struct device *parent; 
  3.  struct device_private *p; 
  4.  struct kobject kobj; 
  5.  const char *init_name; 
  6.  const struct device_type *type; 
  7.  struct mutex mutex; 
  8.  struct bus_type *bus; 
  9.  struct device_driver *driver; 
  10.  void *platform_data; 
  11.  void *driver_data; 
  12.     ... 

重點關注成員:

  • struct kobject kobj,內核對象;
  • struct bus_type *bus,設備所在的總線;
  • struct device_driver *driver,和設備綁定在一起的驅動,如果還沒綁定,則為 NULL;

注冊 device 的 api:

  1. int device_register(struct device *dev) 

什么是 driver?

driver 代表了設備驅動。

由 struct device_driver 來描述:

  1. struct device_driver { 
  2.  const char *name
  3.  struct bus_type *bus; 
  4.  
  5.  struct module *owner; 
  6.  const char *mod_name; /* used for built-in modules */ 
  7.  
  8.  bool suppress_bind_attrs; /* disables bind/unbind via sysfs */ 
  9.  enum probe_type probe_type; 
  10.  
  11.  const struct of_device_id *of_match_table; 
  12.  const struct acpi_device_id *acpi_match_table; 
  13.  
  14.  int (*probe) (struct device *dev); 
  15.  int (*remove) (struct device *dev); 
  16.  void (*shutdown) (struct device *dev); 
  17.  int (*suspend) (struct device *dev, pm_message_t state); 
  18.  int (*resume) (struct device *dev); 
  19.  const struct attribute_group **groups; 
  20.  
  21.  const struct dev_pm_ops *pm; 
  22.  
  23.  struct driver_private *p; 
  24. }; 

重點關注成員:

  • struct bus_type *bus;
  • int (*probe) (struct device *dev);

值得一提的是,總線控制器也是一種設備。

例如 I2C 總線控制器這個設備,對應的驅動為 I2C controller driver。

而掛在 I2C 總線上的設備,對應的驅動為 I2C device driver。

注冊 driver 的 api:

  1. int driver_register(struct device_driver *drv); 

三、bus、device、driver 是如何關聯的?

device model 最核心的工作就是維護這三類抽象的實例,以及建立它們之間的關聯關系。

bus 如何管理 device 和 driver ?

在 struct bus_type 中有一個 struct subsys_private *p 指針,它負責管理掛在 bus 上的所有設備和驅動,其定義如下:

  1. struct subsys_private { 
  2.  struct kset subsys; 
  3.  struct kset *devices_kset; 
  4.  struct list_head interfaces; 
  5.  struct mutex mutex; 
  6.  
  7.  struct kset *drivers_kset; 
  8.  struct klist klist_devices; 
  9.  struct klist klist_drivers; 
  10.  struct blocking_notifier_head bus_notifier; 
  11.  unsigned int drivers_autoprobe:1; 
  12.  struct bus_type *bus; 
  13.  
  14.  struct kset glue_dirs; 
  15.  struct class *class; 
  16. }; 

兩個 klist 成員以鏈表的形式將該總線上所有的驅動與設備鏈接到一起。

struct kset *drivers_kset 和 struct kset *devices_kset 是在向系統注冊當前新總線時動態生成的容納該總線上所有驅動與設備的 kset。

在內核里,用 kobject 來表示一個對象,kset 則是 kobject set 的縮寫,即內核對象集合。

內核用 kobject 和 kset 等數據結構作為原材料,以實現面向對象的方式構建了 device model 的框架。

最后,device 和 device_driver 的 bus 成員也會指向總線:

device 和 driver 的綁定

無論是通過 device_register() 注冊一個 device 到 bus 上,

還是通過 driver_register() 注冊一個 device_driver 到 bus 上,

都會導致 bus 嘗試執行 device 和 driver 的綁定行為。

1. device_register() 觸發的綁定

注冊 device 時:

  1. int device_register(struct device *dev); 
  2.  device_add(dev); 
  3.   bus_probe_device(dev); 
  4.    __device_attach(dev, true); 

__device_attach(dev, true) 會為 device 遍歷 bus 上的所有 driver:

  1. bus_for_each_drv(dev->bus, NULL, &data, __device_attach_driver); 
  2.  driver_match_device(drv, dev); 
  3.   drv->bus->match ? drv->bus->match(dev, drv) : 1; 
  4.  driver_probe_device(drv, dev); 

driver_match_device() 通過 bus 里的 match 函數來判斷是否 device 和 driver 是否匹配,

是否 match 的判斷標準一般是通過 of_match_table 或者是 id_table 作為衡量的標準,

以 i2c bus 的 match 函數為例:

  1. static int i2c_device_match(struct device *dev, struct device_driver *drv) 
  2.  struct i2c_client *client = i2c_verify_client(dev); 
  3.  struct i2c_driver *driver; 
  4.  
  5.  
  6.  /* Attempt an OF style match */ 
  7.  if (i2c_of_match_device(drv->of_match_table, client)) 
  8.   return 1; 
  9.  
  10.  /* Then ACPI style match */ 
  11.  if (acpi_driver_match_device(dev, drv)) 
  12.   return 1; 
  13.  
  14.  driver = to_i2c_driver(drv); 
  15.  
  16.  /* Finally an I2C match */ 
  17.  if (i2c_match_id(driver->id_table, client)) 
  18.   return 1; 
  19.  
  20.  return 0; 

一旦 match 成功,就會調用 driver_probe_device() 以觸發探測設備的行為:

  1. int driver_probe_device(struct device_driver *drv, struct device *dev); 
  2.  really_probe(dev, drv); 
  3.   if (dev->bus->probe) { 
  4.    ret = dev->bus->probe(dev); 
  5.   } else if (drv->probe) { 
  6.    ret = drv->probe(dev); 
  7.   } 

如果 bus 具有探測設備的能力的話,例如 pci bus, 則會使用 bus->probe() 探測設備,

否則,使用 driver->probe() 探測設備,driver 的 probe 操作跟具體的硬件設備掛鉤。

2. 由 driver_register() 觸發的綁定

  1. int driver_register(struct device_driver *drv); 
  2.  bus_add_driver(drv); 
  3.   driver_attach(drv); 

driver_attach(drv) 會為 driver 遍歷 bus 上的所有 device:

  1. int driver_attach(struct device_driver *drv); 
  2.  bus_for_each_dev(drv->bus, NULL, drv, __driver_attach); 
  3.   __driver_attach(); 
  4.    driver_match_device(drv, dev); 
  5.    driver_probe_device(drv, dev); 

和 device_register() 一樣,最終都會調用 driver_match_device(drv, dev),

進而通過 bus 里的 match 函數來判斷是否 device 和 driver 是否匹配。

同樣地,一旦 match 成功,就會調用 driver_probe_device() 以觸發探測設備的行為,后續的操作和注冊設備時是一模一樣的。

3. device 和 drvier 的綁定關系

前面說了綁定是如何被觸發的,現在來明確一下綁定的具體操作。

對于能成功匹配的 device 和 driver,兩者之間的關系是 N 對 1,即可以有多個 device 和 1 個 driver 綁定在一起。

對于 device:

其 driver 成員指向已綁定的 device_driver。

  1. int driver_probe_device(struct device_driver *drv, struct device *dev) 
  2.  really_probe(dev, drv); 
  3.   dev->driver = drv; 

對于 driver:

在 device_driver 里鏈表 klist_devices 保存了該 driver 上已綁定的所有 device。

  1. int driver_probe_device(struct device_driver *drv, struct device *dev) 
  2.  really_probe(dev, drv); 
  3.   driver_bound(dev); 
  4.    klist_add_tail(&dev->p->knode_driver, &dev->driver->p->klist_devices); 

在 /driver/base/driver.c 中,提供了一些 api,用于遍歷處理 driver 上綁定的所有 device:

  • int driver_for_each_device()
  • struct device *driver_find_device()

四、bus、device、driver 最簡單示例

下面的例子,

構造了一個名為 "simple_bus" 的 bus 實例。

  1. static int sb_match(struct device *dev, struct device_driver *driver) 
  2.  return !strncmp(dev_name(dev), driver->name, strlen(driver->name)); 
  3.  
  4. struct bus_type sb_bus_type = { 
  5.  .name = "sb"
  6.  .match = sb_match, 
  7. }; 
  8.  
  9. static ssize_t version_show(struct bus_type *bus, char *buf) 
  10.  return snprintf(buf, PAGE_SIZE, "%s\n", Version); 
  11.  
  12. static BUS_ATTR_RO(version); 
  13.  
  14. static void sb_dev_release(struct device *dev) 
  15. { } 
  16.  
  17. int register_sb_device(struct sb_device *sbdev) 
  18.     sbdev->dev.bus = &sb_bus_type; 
  19.  sbdev->dev.release = sb_dev_release; 
  20.     dev_set_name(&sbdev->dev, sbdev->name); 
  21.     return device_register(&sbdev->dev); 
  22. EXPORT_SYMBOL(register_sb_device); 
  23.  
  24. void unregister_sb_device(struct sb_device *sbdev) 
  25.  device_unregister(&sbdev->dev); 
  26. EXPORT_SYMBOL(unregister_sb_device); 
  27.  
  28. static int sb_drv_probe(struct device *dev) 
  29.  printk(KERN_INFO"sb_drv probe %s\n", dev_name(dev)); 
  30.  return 0; 
  31.  
  32. int register_sb_driver(struct sb_driver *sdrv) 
  33.  sdrv->driver.bus = &sb_bus_type; 
  34.  sdrv->driver.probe = &sb_drv_probe; 
  35.  return driver_register(&sdrv->driver); 
  36. EXPORT_SYMBOL(register_sb_driver); 
  37.  
  38. void unregister_sb_driver(struct sb_driver *driver) 
  39.  driver_unregister(&driver->driver); 
  40. EXPORT_SYMBOL(unregister_sb_driver); 
  41.  
  42. static int __init sb_bus_init(void) 
  43.  int ret; 
  44.  
  45.  ret = bus_register(&sb_bus_type); 
  46.  if (ret) { 
  47.   printk(KERN_ERR "Unable to register sb bus, failure was %d\n",ret); 
  48.   return ret; 
  49.  } 
  50.  if (bus_create_file(&sb_bus_type, &bus_attr_version)) 
  51.   printk(KERN_ERR "Unable to create version attribute\n"); 
  52.  return 0; 
  53.  
  54. static void sb_bus_exit(void) 
  55.  bus_unregister(&sb_bus_type); 
  56.  
  57. module_init(sb_bus_init); 
  58. module_exit(sb_bus_exit); 

xxx_chip.c:注冊4個名為 "chipX" 的 device

  1. struct xxx_chip { 
  2.  char devname[20]; 
  3.  struct sb_device sdev; 
  4. }; 
  5.  
  6. int chipdev_num = 4; 
  7. struct xxx_chip *chipdev; 
  8.  
  9. static void chip_register_dev(struct xxx_chip *dev, int index
  10.  snprintf(dev->devname, sizeof(dev->devname), "chip%d"index); 
  11.  dev->sdev.name = dev->devname; 
  12.  dev_set_drvdata(&dev->sdev.dev, dev); 
  13.  register_sb_device(&dev->sdev); 
  14.  
  15. int chip_init(void) 
  16.     int i; 
  17.  
  18.     chipdev = kmalloc(chipdev_num*sizeof (struct xxx_chip), GFP_KERNEL); 
  19.  
  20.     memset(chipdev, 0, chipdev_num*sizeof (struct xxx_chip)); 
  21.     for (i = 0; i < chipdev_num; i++) { 
  22.   chip_register_dev(chipdev + i, i); 
  23.  } 
  24.  
  25.     return 0; 
  26.  
  27. void chip_cleanup(void) 
  28.     int i; 
  29.     for (i = 0; i < chipdev_num; i++) { 
  30.   unregister_sb_device(&chipdev[i].sdev); 
  31.  } 
  32.     kfree(chipdev); 
  33.  
  34. module_init(chip_init); 
  35. module_exit(chip_cleanup); 

xxx_chip_drv.c:注冊1個名為 "chip" 的 driver

  1. static struct sb_driver sculld_driver = { 
  2.  .driver = { 
  3.   .name = "chip"
  4.  }, 
  5. }; 
  6.  
  7. int xxx_chipdrv_init(void) 
  8.     return register_sb_driver(&sculld_driver); 
  9.  
  10. void xxx_chipdrv_cleanup(void) 
  11.     unregister_sb_driver(&sculld_driver); 
  12.  
  13. module_init(xxx_chipdrv_init); 
  14. module_exit(xxx_chipdrv_cleanup); 

運行效果:

  1. root@buildroot:~# insmod simple_bus.ko  
  2. root@buildroot:~# tree /sys/bus/sb 
  3. /sys/bus/sb 
  4. ├── devices 
  5. ├── drivers 
  6. ├── drivers_autoprobe 
  7. ├── drivers_probe 
  8. ├── uevent 
  9. └── version 
  10.  
  11. root@buildroot:~# insmod xxx_chip.ko  
  12. root@buildroot:~# tree /sys/bus/sb 
  13. /sys/bus/sb 
  14. ├── devices 
  15. │   ├── chip0 -> ../../../devices/chip0 
  16. │   ├── chip1 -> ../../../devices/chip1 
  17. │   ├── chip2 -> ../../../devices/chip2 
  18. │   └── chip3 -> ../../../devices/chip3 
  19. ├── drivers 
  20. ├── drivers_autoprobe 
  21. ├── drivers_probe 
  22. ├── uevent 
  23. └── version 
  24.  
  25. root@buildroot:~# insmod xxx_chip_drv.ko 
  26. sb_drv probe chip0 
  27. sb_drv probe chip1 
  28. sb_drv probe chip2 
  29. sb_drv probe chip3 
  30.  
  31. root@buildroot:~# tree /sys/bus/sb 
  32. /sys/bus/sb 
  33. ├── devices 
  34. │   ├── chip0 -> ../../../devices/chip0 
  35. │   ├── chip1 -> ../../../devices/chip1 
  36. │   ├── chip2 -> ../../../devices/chip2 
  37. │   └── chip3 -> ../../../devices/chip3 
  38. ├── drivers 
  39. │   └── chip 
  40. │       ├── bind 
  41. │       ├── chip0 -> ../../../../devices/chip0 
  42. │       ├── chip1 -> ../../../../devices/chip1 
  43. │       ├── chip2 -> ../../../../devices/chip2 
  44. │       ├── chip3 -> ../../../../devices/chip3 
  45. │       ├── uevent 
  46. │       └── unbind 
  47. ├── drivers_autoprobe 
  48. ├── drivers_probe 
  49. ├── uevent 
  50. └── version 

通過打印信息可知,device 和 driver 經由 bus 判斷是否 match 之后,執行了 driver 的 probe() 函數,符合我們前面的分析。

五、小結

Linux 的 device model 是個非常復雜的系統。

從一個比較高的層次來看,主要由總線、設備和驅動構成。

內核為了實現這些組件間的相關關系,定義了 kobject 和 kset 這樣的基礎底層數據結構,然后通過 sysfs 文件系統向用戶空間展示發生在內核空間中的各組件間的互聯層次關系,并以文件系統接口的方式為用戶空間程序提供了訪問內核對象屬性信息的簡易方法。

為了控制篇幅,本文并沒有涉及到 kojbect 和 sysfs。

如果你感興趣的話,去挖掘一下以下內容:

  • device model 的底層數據結構 kojbect、kset 是如何工作的?
  • 內核是如何使用 device model 去構建 i2c、spi、usb 等驅動框架?
  • device model 和 sysfs 是如何協同工作的?
  • sysfs 里如何創建屬性文件以訪問設備驅動?
  • sysfs 里的 class 有什么作用?

六、相關參考

《Linux 設備驅動》

  • 第 14 章 Linux 設備模型

《深入 Linux 設備驅動程序內核機制》

  • 第 9 章 Linux 設備驅動模型

《Linux設備驅動開發詳解》

  • 第 5 章 Linux文件系統與設備文件
  • 第 12 章 Linux設備驅動的軟件架構思想

Linux/Documentation/driver-model

  • bus.txt
  • class.txt
  • device.txt
  • driver.txt
  • overview.txt

 

責任編輯:武曉燕 來源: 嵌入式Hacker
相關推薦

2009-12-17 15:59:26

Linux驅動開發

2023-05-15 11:11:57

智能建筑數據驅動

2023-02-23 19:28:09

ODD測試

2009-10-23 08:19:10

NVIDIA驅動Linux驅動下載

2009-12-10 09:33:30

Linux驅動開發

2012-05-28 15:49:06

Linux凱迪拉克

2023-03-16 15:18:16

2015-11-02 18:11:36

物聯網數據虛擬

2010-09-28 10:39:35

Google收購歷史

2021-11-29 07:55:45

Linux GPIO Linux 系統

2011-04-11 13:26:25

Linux驅動

2022-05-10 08:49:46

設備驅動Linux

2023-12-28 18:18:40

人工智能智能建筑綠色建筑

2020-12-03 08:59:06

Linux設備驅動

2015-08-07 09:34:44

AMDLinux

2010-07-19 10:05:52

ibmdwLinux

2021-02-22 08:36:48

Linux 驅動Fbdev

2010-01-04 10:09:49

2022-09-16 11:19:25

失敗開發

2022-08-08 19:35:37

HDF驅動開發鴻蒙
點贊
收藏

51CTO技術棧公眾號

精品免费一区二区三区| 国产精品毛片大码女人| 国外成人免费在线播放| 黄色国产在线观看| av在线一区不卡| 亚洲视频你懂的| 国产精品高清一区二区三区| 中文字幕在线观看视频网站| 郴州新闻综合频道在线直播| 在线播放91灌醉迷j高跟美女| 欧美这里只有精品| 深夜影院在线观看| 久久99蜜桃精品| 韩日精品中文字幕| 国产午夜精品久久久久久久久| 日韩一级特黄| 天天操天天色综合| 中文字幕一区二区三区最新| 你懂的网站在线| 日本系列欧美系列| 久久久免费精品| 国产精品麻豆一区| 亚洲第一论坛sis| 在线播放一区二区三区| 激情综合网婷婷| 成年人网站在线| 久久久青草青青国产亚洲免观| 成人精品一区二区三区| 国产精品自拍99| 亚洲视频电影在线| 国产香蕉97碰碰久久人人| 超碰人人cao| 丁香久久综合| 一本久久综合亚洲鲁鲁五月天 | 亚洲欧美一区二区三| 麻豆成人久久精品二区三区红 | 国模大尺度一区二区三区| 57pao成人永久免费视频| 久久久久久久麻豆| 国产成人ay| 日韩av中文字幕在线| 精品人妻一区二区三区免费| av一区在线播放| 福利微拍一区二区| 久久99中文字幕| 色图在线观看| 亚洲日本韩国一区| 综合久久国产| 男人在线资源站| 国产人成亚洲第一网站在线播放| 久久精品二区| 香港一级纯黄大片| 成人精品鲁一区一区二区| 国产一区二区丝袜| 一卡二卡在线视频| 麻豆精品久久久| 国产精品久久久久久久久影视| 国产精品第5页| 亚洲综合电影一区二区三区| 高清在线视频日韩欧美| 国产一级生活片| 狠狠噜噜久久| 国模吧一区二区| 日韩三级小视频| 一区二区三区福利| 55夜色66夜色国产精品视频| 日日骚av一区二区| 丝袜美腿一区二区三区| 国产精品老牛影院在线观看| 中文无码精品一区二区三区| 久久精品理论片| 亚洲a一级视频| 亚洲精品国产suv一区| 从欧美一区二区三区| 精品国产福利| 国产精品麻豆一区二区三区| 中文无字幕一区二区三区| 相泽南亚洲一区二区在线播放| 色网站在线看| 亚洲理论在线观看| www.射射射| 成人午夜视屏| 欧美日韩国产三级| 欧美一区二区三区影院| jizz国产精品| 亚洲色图国产精品| 五月综合色婷婷| 国内自拍视频一区二区三区| 91国在线精品国内播放| а中文在线天堂| 国产在线精品一区二区夜色| 国产精品免费看一区二区三区| 网站黄在线观看| 国产欧美在线观看一区| 福利网在线观看| а√天堂中文在线资源8| 日本丰满少妇一区二区三区| 成人av毛片在线观看| 波多野结衣欧美| 伊人久久免费视频| 久久久久久欧美精品se一二三四| 国产精品免费看| 国产在线日韩在线| 熟妇高潮一区二区三区| 国产精品久久看| 成年人午夜免费视频| 成人交换视频| 亚洲国产精品一区二区三区| 成人午夜免费影院| 亚洲成人中文| 国产在线拍揄自揄视频不卡99| 好男人www在线视频| 久久精品一二三| 日本熟妇人妻xxxx| 日日夜夜亚洲精品| 精品一区二区电影| 国产大学生自拍| 日韩不卡免费视频| 国产伦精品一区二区三区照片91| 在线视频91p| 欧美日韩精品在线| 97超碰免费在线观看| 综合色就爱涩涩涩综合婷婷| 久久综合免费视频| 中文字幕69页| caoporm超碰国产精品| 日本特级黄色大片| 韩国精品主播一区二区在线观看 | 亚洲一区在线播放| 国产又黄又猛又粗| 日韩影视在线观看| 欧美精品电影在线| 国产人妖在线播放| 亚洲国产高清不卡| 国产日韩一区二区在线观看| 动漫av一区| 欧美成人三级视频网站| 伊人网综合在线| 久久久久久久久久久久久久久99| 18禁裸男晨勃露j毛免费观看| 曰本一区二区| 中文字幕国内精品| 青青国产在线视频| www久久精品| 成人在线观看你懂的| 日韩影片在线观看| 久久香蕉国产线看观看网| 一本久道久久综合无码中文| 国产日韩欧美a| 男人操女人免费| 自拍亚洲一区| 欧美综合激情网| 视频国产在线观看| 色综合一个色综合亚洲| 狠狠人妻久久久久久综合蜜桃| 在线国产日韩| 久久青青草综合| 亚洲美女炮图| 亚洲美女激情视频| 久久久久久久久久久影院| 99精品1区2区| 动漫av网站免费观看| 亚洲精品亚洲人成在线观看| 欧美一级片免费在线| 日韩欧美亚洲系列| 91福利社在线观看| 国产精品理论在线| 蜜臀国产一区二区三区在线播放 | 国产一区红桃视频| 午夜视频在线看| 制服丝袜av成人在线看| 欧美成人一二三区| 国产999精品久久久久久绿帽| 成人黄色片免费| 成人性生交大片免费看96| 久久久久一本一区二区青青蜜月| 日本高清视频免费观看| 日韩欧美999| 国产成人一区二区在线观看| 免费在线看一区| 国产精品一区在线免费观看| 午夜电影一区| 98精品在线视频| 国产一二三区在线| 777午夜精品免费视频| 欧美精品一区二区蜜桃| 99久久国产综合精品麻豆| 日本精品一区二区三区四区| 欧州一区二区| 97se视频在线观看| 日韩精品av| 中文字幕久久精品| 精品国产18久久久久久| 激情av一区二区| 波多野结衣家庭教师在线观看 | 欧美日韩在线免费| 刘亦菲国产毛片bd| 国产**成人网毛片九色 | 国产精品国产亚洲精品看不卡15| 精精国产xxxx视频在线野外| 一色桃子一区二区| 成人精品在线播放| 欧美在线不卡视频| 成人免费精品动漫网站| 91麻豆免费在线观看| 欧美成人福利在线观看| 亚洲第一黄色| 亚洲啪啪av| 亚洲a级精品| 成人h猎奇视频网站| 日韩深夜视频| 欧美成人精品在线观看| 欧美zozo| 亚洲爱爱爱爱爱| 91久久久久久久久久久久| 精品成人久久av| 波多野结衣亚洲一区二区| www久久精品| 亚洲av熟女高潮一区二区| 蜜桃精品视频在线| 国产成人a亚洲精v品无码| 亚洲国产精品成人| 日韩免费电影一区二区| 成人av综合网| 91久久久久久久久久久久久| 新片速递亚洲合集欧美合集| 欧美精品福利视频| 国产原厂视频在线观看| 亚洲午夜色婷婷在线| 亚洲欧美日韩成人在线| 精品国产亚洲一区二区三区在线观看| 中文字幕在线播放不卡| 日韩欧美在线网址| 影音先锋亚洲天堂| 亚洲一区二区欧美日韩| 日本a级片视频| ●精品国产综合乱码久久久久| 国产精品伦子伦| 粉嫩一区二区三区在线看| www.五月天色| 蜜臀av一区二区在线观看| 任你操这里只有精品| 亚洲深夜激情| 久色视频在线播放| 影音先锋在线一区| 蜜臀精品一区二区| 午夜精品亚洲| 99亚洲国产精品| 亚洲人成免费网站| 黑人巨茎大战欧美白妇 | 国产精品久久中文字幕| 黄色成人精品网站| 成人免费a级片| 欧美亚洲不卡| 日韩精品在线视频免费观看| 欧美片第1页综合| 国产免费裸体视频| 尤物在线精品| 久久免费视频3| 99热这里只有成人精品国产| 狠狠97人人婷婷五月| av不卡免费看| 国产日韩一区二区在线观看| 日韩国产在线观看一区| 成人性视频欧美一区二区三区| 久久性色av| 91福利国产成人精品播放| 麻豆国产精品官网| 一区二区三区国产好的精华液| 国内精品视频一区二区三区八戒 | 欧美性www| 亚洲综合精品一区二区| 高潮久久久久久久久久久久久久| 精品免费日产一区一区三区免费| 台湾佬综合网| 日本日本精品二区免费| 欧美成人直播| 欧洲精品视频在线| 亚洲无线一线二线三线区别av| 成人免费aaa| 老妇喷水一区二区三区| 欧美成人福利在线观看| 国产成人av一区二区三区在线观看| 亚洲少妇一区二区三区| 91老司机福利 在线| 91精品久久久久久久久久久久| 自拍偷拍欧美精品| 国产一级片免费观看| 色婷婷国产精品久久包臀| 精品国产www| 日韩视频国产视频| 国产精品国产高清国产| 在线观看视频99| 美女精品导航| 国产成人精品免高潮在线观看| 欧美视频第一| 国产精品美女xx| 日韩精品看片| 国产美女在线一区| 免费美女久久99| 性高潮免费视频| 国产日韩欧美精品综合| 久久中文字幕无码| 欧美亚洲一区二区在线观看| 亚洲精品一级片| 在线观看欧美www| 超碰高清在线| 91欧美激情另类亚洲| 妖精视频一区二区三区| 99久re热视频精品98| 欧美综合二区| 亚洲乱妇老熟女爽到高潮的片| 国产欧美日韩在线视频| 精品少妇theporn| 欧美日韩精品欧美日韩精品一| 婷婷在线观看视频| 久久资源免费视频| 在线一区视频观看| 久久精品成人一区二区三区蜜臀| 亚洲精品国产首次亮相| 日韩精品一区中文字幕| 成人激情午夜影院| www.5588.com毛片| 欧美亚洲一区二区在线| 你懂得在线网址| 久久久久五月天| 精品午夜av| 亚洲人体一区| 日本成人中文字幕| 中文字幕av网址| 天天综合色天天综合| 亚洲国产福利视频| 欧美床上激情在线观看| 香蕉久久久久久| 日韩欧美亚洲区| 久久午夜电影| 男生裸体视频网站| 亚洲一区二区三区国产| 国产男男gay体育生网站| 中文字幕亚洲精品| 久久婷婷五月综合色丁香| 欧美大香线蕉线伊人久久国产精品| 欧美日韩亚洲一区| 国产精品久久久久久9999| 国产精品久久久久久久久久免费看| 青娱乐在线免费视频| 亚洲日本欧美中文幕| 欧美xo影院| 欧美一区二区在线| 久久综合中文| 欧美大波大乳巨大乳| 欧洲av一区二区嗯嗯嗯啊| 黄色片在线播放| 国产精品大陆在线观看| 国产一区国产二区国产三区| 欧美日韩在线成人| 国产欧美日韩另类一区| 日韩久久久久久久久久| 一本色道久久88亚洲综合88| 欧美三区四区| 无遮挡亚洲一区| 精品一区二区在线看| 黄色a级片在线观看| 日韩欧美的一区二区| 蜜臀av国内免费精品久久久夜夜| 国产精品免费区二区三区观看| 国产日韩欧美三区| 久久久亚洲av波多野结衣| 午夜精品久久久久久久久| 天天操天天射天天| 日本sm极度另类视频| 日韩精品免费| 下面一进一出好爽视频| 亚洲国产wwwccc36天堂| 无码国产精品高潮久久99| 日本aⅴ大伊香蕉精品视频| 欧美成人自拍| 成人做爰69片免费| 婷婷久久综合九色国产成人| 你懂的视频在线| 成人福利网站在线观看11| 好看的亚洲午夜视频在线| 少妇精品一区二区三区| 欧美性大战久久久久久久| 黄色av网站在线播放| www.成人av| 蜜桃久久av| 国产色无码精品视频国产| 亚洲成人久久电影| 亚洲mmav| 美女扒开大腿让男人桶| 久久久久久电影| 国产日韩欧美中文字幕| 2019av中文字幕| 久久久久国产| 日本丰满少妇裸体自慰| 这里只有精品99re| 天堂电影一区| 国产又黄又爽免费视频| 91小视频免费看|