99精品久久精品一区二区-亚洲熟妇无码?v在线播放-日本国产精品无码字幕在线观看-久久久亚洲永夜AV-亚洲一级无码一区二区一-免费国产成高清人在线视频-中文字幕乱码免费观看-国产毛片精品妇女久久久

ARTICLE DETAIL

資訊詳情

深耕商務建站與企業(yè)官網運營的一線實戰(zhàn)洞察。

i.MX6ULL Linux驅動開發(fā):Platform總線設備與驅動匹配機制全解析

i.MX6ULL Linux驅動開發(fā):Platform總線設備與驅動匹配機制全解析 做i.MX6ULL的Linux驅動開發(fā)很多人第一次接觸Platform總線時都是一頭霧水明明照著教程寫完了一個platform_driverinsmod也成功了但probe函數(shù)就是不執(zhí)行設備號也申請不到折騰一整天最后發(fā)現(xiàn)是設備樹里compatible字段和驅動里的of_match_table沒有對上。這個坑我踩過帶過的不少新同事也踩過所以我想把i.MX6ULL平臺下這套設備與驅動匹配機制徹底講透從內核為什么要搞Platform這一套東西到匹配流程內部到底發(fā)生了什么事再到怎么自己寫一個能被正常probe的驅動、怎么排查匹配失敗的問題一次說清楚。這篇文章適合正在學嵌入式Linux驅動開發(fā)、尤其是用i.MX6ULL或者類似Cortex-A7核心板做項目的朋友閱讀不管你是剛看完字符設備驅動、準備往設備樹和Platform模型過渡還是已經寫了不少驅動但一直沒認真搞明白匹配原理都能從里面得到能直接拿去用的東西。1. 先搞清楚Platform機制到底解決了什么問題1.1 早期字符設備驅動寫法為什么撐不住了咱們先把時間拉回到Linux 2.6之前。早期寫驅動最常見的方式就是把板子上的硬件資源寫死在驅動代碼里。比如你要操作一個LED對應的GPIO寄存器直接在驅動里硬編碼物理地址ioremap之后對著寄存器地址寫值如果要注冊一個中斷也是直接寫死中斷號。這種方式在嵌入式開發(fā)早期確實簡單粗暴能用但問題很快就暴露出來了。首先是資源沖突。同一個芯片可能被用在幾十種板卡上A板子LED接在GPIO1_IO03B板子LED接在GPIO1_IO05同一份驅動代碼在兩塊板子上就沒法通用。其次是設備變更帶來的維護地獄硬件工程師說改一下引腳連接驅動開發(fā)就得跟著改源碼重新編譯版本管理一混亂哪天改錯了哪個地址排查起來極其痛苦。這就引出了Linux設備模型里最重要的思路驅動是驅動設備是設備兩者分開維護通過一種統(tǒng)一的機制在運行時完成匹配和綁定。驅動只負責描述“我能操作什么類型的外設、怎么操作”設備則描述“這塊板子上實際有哪些外設、外設的資源寄存器地址、中斷號、GPIO等在哪里”。誰也不要寫死誰。1.2 總線、設備、驅動三角色如何分工Linux為了解決上面的問題抽象出了總線bus、設備device、驅動driver三個角色。PCI設備有PCI總線USB設備有USB總線它們都是真實存在的物理總線設備和驅動都掛在這種總線上由總線子系統(tǒng)負責匹配。問題來了SoC內部的很多外設控制器比如I2C控制器、SPI控制器、UART、GPIO控制器、以太網MAC它們并不是掛在PCI或者USB這種物理枚舉總線上面的。系統(tǒng)啟動時這些設備是固定存在的不需要像USB設備那樣去掃描發(fā)現(xiàn)。為了讓這些“天生就存在”的片上外設也能套用總線-設備-驅動模型內核提供了一個虛擬總線叫platform_bus也就是咱們常說的Platform總線。Platform總線上掛的“設備”叫platform_device可以是芯片內部集成的外設控制器也可以是指定為platform_device的外部設備。在Device Tree設備樹普及之后內核在啟動階段會解析設備樹把其中匹配到的節(jié)點一個一個轉換成platform_device掛到platform總線上。驅動這邊只要你寫的是platform_driver注冊時就會掛到同一條虛擬總線上??偩€負責撮合新來了一個platform_device總線就去看看現(xiàn)有的platform_driver有沒有能匹配上它的新注冊了一個platform_driver總線又會反過來掃描現(xiàn)有的platform_device。一旦匹配成功總線就會調用driver里的probe函數(shù)把設備相關的資源信息交給你你的驅動從這一刻才開始真正初始化硬件。1.3 i.MX6ULL上哪些資源依賴這套機制i.MX6ULL是NXP基于Cortex-A7內核設計的低功耗應用處理器內部集成了大量的外設控制器??梢赃@么說除了內存控制器等極少數(shù)基礎組件芯片上幾乎你能用到的所有外設控制器在Linux內核里都是以platform_device的形式存在或者由設備樹節(jié)點轉換而來的。舉個例子你就會明白設備樹里經??吹筋愃七@樣的節(jié)點i2c1 { clock-frequency 100000; pinctrl-names default; pinctrl-0 pinctrl_i2c1; status okay; };這個i2c1節(jié)點在內核啟動階段會被轉換成platform_device然后去匹配I2C控制器驅動里的platform_driver匹配成功進入probe之后驅動才會去初始化i2c適配器、注冊i2c總線。之后再發(fā)現(xiàn)掛在這條i2c總線上的客戶端設備就又是另一套i2c_client的匹配邏輯了。搞懂這個流程你就能明白為什么很多時候我們給某個外設控制器寫驅動第一個函數(shù)入口不是file_operations里的open/release而是probe函數(shù)。因為你的驅動首先要被“系統(tǒng)認識”通過Platform匹配機制綁定到對應設備上才有資格去操作硬件資源。2. 匹配機制全解析一條probe是怎么被叫醒的2.1 驅動和設備在什么時機相互打量一個platform_driver從注冊到它的probe被調用中間經歷的過程非常關鍵。很多人只知道寫驅動時要注冊platform_driver但不知道probe調用的完整時機。當你在驅動里調用platform_driver_register的時候內核會把driver掛到platform_bus_type這根虛擬總線上然后立刻執(zhí)行一次總線對已有設備的掃描。內核會遍歷platform bus上所有的device對每一個設備調用platform_match函數(shù)看看你的driver跟哪個設備能配對。只要找到一個配對的設備立刻執(zhí)行probe。反過來設備是怎么來的有兩種常見來源。傳統(tǒng)方式是通過platform_device_register主動注冊平臺代碼里構造platform_device結構體然后塞給內核這在老內核或者不使用設備樹的場景中很常見。現(xiàn)在的主流方式則是設備樹內核在啟動時用of_platform_default_populate_init遍歷設備樹根節(jié)點下的所有節(jié)點把 compatible 屬性匹配的節(jié)點變成platform_device隨后掃描驅動列表完成匹配。所以probe被調用的時機其實有兩種典型場景如果你先加載驅動后注冊設備比如設備樹節(jié)點本來就在但驅動是后面insmod的那么在platform_driver_register內部掃描設備時就會觸發(fā)probe。如果設備在你驅動的probe執(zhí)行過程中又創(chuàng)建了子設備比如MFD多功能設備驅動創(chuàng)建子平臺設備那是設備注冊時反向掃描驅動觸發(fā)probe。理解這個雙向掃描邏輯后面排查“為什么probe沒跑”時就能有個清晰的方向到底是設備始終沒被創(chuàng)建還是設備與驅動的匹配條件不滿足。2.2 內核源碼里platform_match的匹配順序要真正理解匹配機制不能只看概念我建議你打開內核源碼里drivers/base/platform.c找到platform_match函數(shù)。不同內核版本可能會有細微差別但核心邏輯基本穩(wěn)定。整個匹配過程大概分這么幾步static int platform_match(struct device *dev, struct device_driver *drv) { struct platform_device *pdev to_platform_device(dev); struct platform_driver *pdrv to_platform_driver(drv); /* 1. 嘗試設備樹匹配 */ if (of_driver_match_device(dev, drv)) return 1; /* 2. 嘗試ACPI匹配 */ if (acpi_driver_match_device(dev, drv)) return 1; /* 3. 嘗試platform專用id_table匹配 */ if (pdrv-id_table) if (platform_match_id(pdrv-id_table, pdev) ! NULL) return 1; /* 4. 嘗試驅動名字與設備名字直接匹配 */ return (strcmp(pdev-name, drv-name) 0); }需要注意的是在沒有使能ACPI的嵌入式ARM平臺上第二步通常不會生效關鍵的匹配路徑就是設備樹compatible匹配、id_table匹配和名字匹配三路。最初級的匹配方法是驅動程序名和設備名相同。早期platform驅動在driver結構體和platform_device結構體的name字段直接保持一致即可。這種匹配路線現(xiàn)在仍然存在但更多是兜底邏輯。設備樹普及之后絕大多數(shù)場景走的是第一條of_driver_match_device。設備樹匹配的核心是compatible屬性。設備樹里的每個節(jié)點只要是代表一個真實的設備基本都要寫compatible屬性。比如某個外設節(jié)點長得這樣mydevice: mydevice020c406c { compatible myvendor,mydevice; reg 0x020c406c 0x4; ... };驅動側就要在of_device_id數(shù)組里提供一個同樣的compatible字符串static const struct of_device_id mydevice_of_match[] { { .compatible myvendor,mydevice, }, { /* sentinel */ }, }; MODULE_DEVICE_TABLE(of, mydevice_of_match); static struct platform_driver mydevice_driver { .probe mydevice_probe, .remove mydevice_remove, .driver { .name mydevice, .of_match_table mydevice_of_match, }, }; module_platform_driver(mydevice_driver);匹配時內核拿設備樹節(jié)點的compatible屬性字符串和of_match_table數(shù)組里所有compatible字段逐一比較只要有一個相等就算匹配成功。2.3 of_device_id里藏的小秘密data指針很多基礎教程在講of_device_id時只強調compatible字段必須對齊卻忽略了一個很實用的字段data。我在這兒重點說一下。of_device_id結構體的data成員是一個void指針用于在驅動側攜帶與某個compatible關聯(lián)的私有數(shù)據(jù)。比如同一顆芯片上可能有多個功能相近但寄存器細節(jié)不同的IP核驅動里可以共用同一個probe函數(shù)但在of_device_id里通過data來區(qū)分IP版本probe時用of_match_device取出當前匹配到的of_device_id然后強轉data拿到不同的硬件信息。我給你一個實際場景。假設板子上有兩個LED控制器一個老版本寄存器地址偏移不同一個新版本兩者的compatible分別是“myvendor,led-v1”和“myvendor,led-v2”。如果用兩套of_match_table分別寫兩個驅動顯然很蠢。更聰明的做法是一個驅動of_match_table里放兩個條目data分別指向不同的led_hw_cfg結構體static struct led_hw_cfg led_v1_cfg { .reg_offset 0x00, .max_brightness 255, }; static struct led_hw_cfg led_v2_cfg { .reg_offset 0x10, .max_brightness 1023, }; static const struct of_device_id myled_of_match[] { { .compatible myvendor,led-v1, .data led_v1_cfg }, { .compatible myvendor,led-v2, .data led_v2_cfg }, { /* sentinel */ }, }; static int myled_probe(struct platform_device *pdev) { const struct of_device_id *match; struct led_hw_cfg *cfg; match of_match_device(myled_of_match, pdev-dev); if (match) cfg (struct led_hw_cfg *)match-data; ... }這個用法在NXP官方內核以及很多主流驅動里都能看到做好之后板級差異就被壓縮到一個結構體數(shù)據(jù)里驅動代碼的復用性明顯提升。2.4 匹配成功后內核額外做的幾件事匹配成功后內核會自動補齊一些基礎信息接著才會調用你的probe。首先是dev_set_drvdata一類內部關聯(lián)操作讓設備與驅動之間建立關聯(lián)之后你在probe內部用的dev_get_drvdata才有效。其次是sysfs文件系統(tǒng)視角下/sys/bus/platform/devices目錄下的設備會出現(xiàn)一個driver符號鏈接指向/sys/bus/platform/drivers下面你的驅動目錄。還有一點很多剛入門的新人會困惑為什么probe里已經用misc_register注冊了字符設備但insmod之后/dev下并沒有立刻出現(xiàn)對應節(jié)點這跟Platform匹配機制無關但發(fā)生場景經常重合。insmod執(zhí)行后probe成功調用了設備注冊動作在probe里也完成了但用戶空間的udev或者mdev嵌入式環(huán)境常用busybox mdev需要在收到uevent事件后去創(chuàng)建/dev節(jié)點。如果你的系統(tǒng)里沒有配置udev/mdev自動處理那/dev下確實不會自動出現(xiàn)設備節(jié)點。這一點在之后的調試過程中非常常見別把板子本身的問題和匹配機制混為一談。另外如果設備節(jié)點被設置為status disabled那么內核掃描設備樹時一般不會為該節(jié)點創(chuàng)建platform_device。注意是“一般不會”。有些場合下節(jié)點會被創(chuàng)建但驅動會被禁止綁定具體取決于內核的配置。在i.MX6ULL這種主流BSP中disabled節(jié)點基本不會生成platform_device因此你的驅動永遠得不到probe的機會。這是一個非常隱蔽的坑后面排查部分我會專門提到。3. 在i.MX6ULL上實操寫一個能匹配上的Platform驅動3.1 環(huán)境準備與基礎工程建議咱們動手寫一個完整的Platform驅動別空談理論。我用的是i.MX6ULL開發(fā)板內核版本以4.1.15或者4.9.x為主這也是目前市面上不少i.MX6ULL開發(fā)板BSP的常見內核版本。交叉編譯工具鏈一般是arm-linux-gnueabihf-根據(jù)你自己開發(fā)板配套的SDK來定。寫驅動之前我建議先確認三件事內核源碼目錄已經準備好并且編譯過一遍生成了Module.symvers。開發(fā)板內核里設備樹已經支持你將要修改的節(jié)點或者你知道怎么把新的dtb燒進去。板子上的文件系統(tǒng)能夠加載內核模塊比如insmod/modprobe命令可用。寫驅動文件之前先在板子上執(zhí)行下面這條命令看看當前系統(tǒng)里platform設備的大致情況ls /sys/bus/platform/devices/你會看到很多設備比如soc、1001000.uart、2000000.spi之類名字一般是“寄存器地址.設備名”的格式這些就是內核從設備樹里解析出來后掛到platform總線上的設備。等下咱們自己通過設備樹創(chuàng)建的設備也會以類似的形式出現(xiàn)在這個目錄。3.2 設備樹中定義自己的平臺設備節(jié)點我們的目標是創(chuàng)建一個叫“myled”的平臺設備然后讓驅動程序通過compatible匹配到它進入probe最后操作一個GPIO點燈。你需要在設備樹源文件里找到根節(jié)點或者合適的父節(jié)點添加以下這個節(jié)點。很多i.MX6ULL開發(fā)板的設備樹頂層是板級dts文件如imx6ull-14x14-evk.dts里面有根節(jié)點“/”往根節(jié)點里加就行了。有些為了方便管理會放在根節(jié)點的某個子節(jié)點中只要能被內核正常解析到就行放在根下最直觀。/ { myled { compatible myvendor,myled; pinctrl-names default; pinctrl-0 pinctrl_myled; led-gpio gpio1 3 GPIO_ACTIVE_LOW; status okay; }; };注意這個節(jié)點里我引用了pinctrl_myled你必須在設備樹里對應的iomuxc節(jié)點下添加這個引腳復用配置。以i.MX6ULL為例通常在設備樹中可以找到類似這么一段iomuxc { pinctrl_myled: myledgrp { fsl,pins MX6UL_PAD_GPIO1_IO03__GPIO1_IO03 0x10b0 ; }; };引腳的宏定義MX6UL_PAD_GPIO1_IO03__GPIO1_IO03在設備樹頭文件里已經定義好不同開發(fā)板這個宏可能不一樣具體看你的BSP設備樹。我這里只是給你一個示例實際操作時必須以自己板卡上的引腳為依據(jù)。改完設備樹之后重新編譯dtb然后燒錄或者通過tftp/nfs方式加載到板子上啟動。啟動后在板子上執(zhí)行l(wèi)s /sys/bus/platform/devices/myled如果設備樹解析正常你應該能看到這個目錄存在。到這一步你的“平臺設備”已經創(chuàng)建成功內核里已經存在一個platform_device就等著驅動來匹配了。如果看不到設備目錄優(yōu)先檢查設備樹有沒有被正確編譯加載compatible、status屬性有沒有問題。3.3 編寫Platform驅動并正確注冊接下來寫驅動。為了把注意力集中在Platform機制上我直接用一個最簡單的點燈驅動示例通過miscdevice注冊字符設備用戶程序用ioctl控制亮滅極簡版。完整代碼示例#include linux/module.h #include linux/platform_device.h #include linux/of.h #include linux/of_gpio.h #include linux/gpio/consumer.h #include linux/miscdevice.h #include linux/uaccess.h #include linux/fs.h #define MYLED_ON 0x01 #define MYLED_OFF 0x00 struct myled_dev { struct gpio_desc *led_gpio; }; static struct myled_dev *myled_data; static long myled_ioctl(struct file *file, unsigned int cmd, unsigned long arg) { switch (cmd) { case MYLED_ON: gpiod_set_value(myled_data-led_gpio, 1); break; case MYLED_OFF: gpiod_set_value(myled_data-led_gpio, 0); break; default: return -EINVAL; } return 0; } static const struct file_operations myled_fops { .owner THIS_MODULE, .unlocked_ioctl myled_ioctl, }; static struct miscdevice myled_miscdev { .minor MISC_DYNAMIC_MINOR, .name myled, .fops myled_fops, }; static int myled_probe(struct platform_device *pdev) { struct device *dev pdev-dev; int ret; dev_info(dev, myled probe success\n); myled_data devm_kzalloc(dev, sizeof(*myled_data), GFP_KERNEL); if (!myled_data) return -ENOMEM; myled_data-led_gpio devm_gpiod_get(dev, led, GPIOD_OUT_LOW); if (IS_ERR(myled_data-led_gpio)) { ret PTR_ERR(myled_data-led_gpio); dev_err(dev, failed to get led gpio: %d\n, ret); return ret; } gpiod_set_consumer_name(myled_data-led_gpio, myled); ret misc_register(myled_miscdev); if (ret) { dev_err(dev, failed to register misc device\n); return ret; } return 0; } static int myled_remove(struct platform_device *pdev) { misc_deregister(myled_miscdev); return 0; } static const struct of_device_id myled_of_match[] { { .compatible myvendor,myled, }, { /* sentinel */ }, }; MODULE_DEVICE_TABLE(of, myled_of_match); static struct platform_driver myled_driver { .probe myled_probe, .remove myled_remove, .driver { .name myled, .of_match_table myled_of_match, }, }; module_platform_driver(myled_driver); MODULE_LICENSE(GPL); MODULE_AUTHOR(Your Name); MODULE_DESCRIPTION(i.MX6ULL platform device match demo);這個驅動用module_platform_driver宏完成platform_driver_register和platform_driver_unregister的封裝。加載時注冊驅動總線掃描設備后如果匹配成功probe就會被調用。3.4 編譯、加載與查看匹配效果對應的Makefile非常簡單obj-m : myled.o KERNELDIR : /path/to/your/kernel CROSS_COMPILE : arm-linux-gnueabihf- CC : $(CROSS_COMPILE)gcc all: $(MAKE) -C $(KERNELDIR) M$(PWD) ARCHarm CROSS_COMPILE$(CROSS_COMPILE) modules clean: $(MAKE) -C $(KERNELDIR) M$(PWD) ARCHarm CROSS_COMPILE$(CROSS_COMPILE) clean編譯之后得到myled.ko拷貝到板子上insmod加載insmod myled.ko正常的話dmesg里能看到myled myled: myled probe success此時查看platform總線的設備與驅動綁定關系ls -l /sys/bus/platform/devices/myled/driver如果驅動已經成功綁定這個符號鏈接會指向drivers目錄下的myled驅動。再用設備名匹配方式來驗證一下純名字匹配路徑的優(yōu)先級問題如果設備樹里沒有compatible而你的platform_device是內核代碼直接注冊的driver結構體里的name字段和設備name相同也可能匹配成功。這一點雖然老派在兼容舊代碼時很有用。3.5 GPIO子系統(tǒng)在Platform機制中扮演的輔助角色在剛才的驅動里我用到了devm_gpiod_get和gpiod_set_value這是內核GPIO子系統(tǒng)提供的基于描述符的接口。你可能會疑惑這跟Platform匹配機制有什么關系關系其實不直接但屬于Platform設備操作最典型的資源獲取方式。傳統(tǒng)開發(fā)中要操作GPIO需要ioremap并配置引腳復用寄存器很繁瑣?,F(xiàn)在的推薦姿勢是在設備樹節(jié)點里通過led-gpio這樣的屬性描述“我需要哪個引腳”驅動中通過devm_gpiod_get獲取GPIO描述符。這個API能正常工作前提是你傳入了指向struct device的指針也就是platform_device里的pdev-dev。設備樹、GPIO子系統(tǒng)、Platform驅動模型這三者是緊密配合的。Platform總線匹配只是給你一個“入場券”入場之后怎么拿資源、怎么使用硬件又注冊了另一套內核API。很多教程把這幾個維度混在一起新手就容易懵。我建議你在實驗時把這條鏈路拆開理解設備樹節(jié)點 設備說明書描述有什么資源。Platform驅動匹配 驗證“這個驅動能管這個設備”。probe函數(shù) 驅動讀取說明書實際操作資源。misc或者字符設備框架 把操作能力暴露給用戶空間。3.6 id_table匹配方式與非設備樹場景聊完設備樹方式咱們也花點時間說說id_table匹配。畢竟并非所有內核和所有平臺都使用設備樹而老平臺代碼里大量存在platform_device_id的使用方式。如果你有一個平臺設備它不是從設備樹生成的而是通過platform_device_register注冊的例如內核板級文件里這么寫static struct resource myled_resources[] { { .start 0x020c406c, .end 0x020c406f, .flags IORESOURCE_MEM, }, }; static struct platform_device myled_device { .name myled, .id -1, .num_resources ARRAY_SIZE(myled_resources), .resource myled_resources, }; static int __init myled_device_init(void) { return platform_device_register(myled_device); }你的驅動需要通過platform_driver里的id_table來匹配而不只是名字。使用示例static const struct platform_device_id myled_id_table[] { { myled, 0 }, { }, }; MODULE_DEVICE_TABLE(platform, myled_id_table); static struct platform_driver myled_driver { .probe myled_probe, .remove myled_remove, .driver { .name myled, }, .id_table myled_id_table, };platform_match內部執(zhí)行順序是先查of_match_table再查ACPI再查id_table最后才是driver name與device name直接比較。但這里有個細節(jié)如果驅動同時配置了of_match_table和id_table設備樹匹配又是首要路徑許多時候驅動作者會把compatible匹配的設備也放進id_table里主要是為了MODULE_DEVICE_TABLE生成模塊別名方便modprobe自動加載模塊?!盀槭裁次颐髅靼羊寗泳幾g成模塊放到文件系統(tǒng)了modprobe能識別到模塊卻還是會找不到設備”這類問題經常就是模塊別名機制的問題。modprobe在加載模塊前要根據(jù)設備uevent里的MODALIAS環(huán)境變量去尋找對應的模塊MODALIAS內容與設備樹compatible相關而模塊中通過MODULE_DEVICE_TABLE導出的表決定了內核知道這個模塊能支持哪些設備。如果你只寫了of_match_table沒有同步MODULE_DEVICE_TABLE自動加載時可能就會出問題。這個知識點一般很少人講透遇到了先檢查這里不會錯。4. 匹配失敗排查與調試經驗4.1 最常見的匹配失敗原因匹配失敗是驅動開發(fā)里最磨人的問題之一。根據(jù)我?guī)ы椖康慕涷炏旅孢@些原因幾乎覆蓋了八成以上的失敗場景你排查時不妨按順序過一遍。compatible字符串不一致這是頭號問題。設備樹里寫著myvendor,myled驅動of_match_table里寫的是myvendor,myled 多了個空格或者大小寫不一致都匹配不上。排查方法很簡單在板子上執(zhí)行cat /sys/bus/platform/devices/myled/uevent看輸出的MODALIAS字段OF_NAMEmyled OF_FULLNAME/myled OF_COMPATIBLE_0myvendor,myled MODALIASof:NmyledTNULLCmyvendor,myled然后對比驅動模塊中由of_match_table生成的模塊別名。也可以直接看/proc/device-tree下設備樹節(jié)點里的屬性是否和你期望的一致。設備樹沒過。這個問題尤其隱蔽因為很多開發(fā)板啟動時用的不是最新編譯的dtb你改了dts但忘了重新編譯或者編譯了沒有傳到板子對應的啟動分區(qū)。排查方法很直接在板子上重新查看設備樹里你添加的節(jié)點是否存在例如ls /proc/device-tree/myled/ cat /proc/device-tree/myled/compatiblestatus屬性被設成disabled。如前所述disabled狀態(tài)可能導致platform_device根本不創(chuàng)建。檢查節(jié)點status是否為okay或者干脆去掉status屬性。有些BSP中特定父節(jié)點下的status控制邏輯還會有差異需要具體問題具體分析但第一懷疑對象一定是這里。pinctrl配置出錯。節(jié)點里的pinctrl-0引用了不存在的pinctrl_myled節(jié)點或者引用的引腳宏跟iomuxc里實際配置不一致雖然不直接影響Platform匹配但probe里GPIO請求時會失敗導致probe返回錯誤碼驅動被卸載現(xiàn)象看起來跟匹配失敗一樣。排查時可以先用以下命令確認這個設備是否綁定過驅動ls -l /sys/bus/platform/devices/myled/driver如果driver鏈接存在說明匹配成功過probe里報錯的可能性更大如果不存在才說明匹配階段都沒走通。GPIO號沖突或者重復申請。i.MX6ULL的GPIO資源管理通過GPIO子系統(tǒng)完成如果你在設備樹里把同一個引腳用在兩個不同節(jié)點或者驅動里重復請求了同一個GPIOdevm_gpiod_get會返回錯誤。典型報錯是EBUSY或者EINVAL同樣會讓probe失敗。這類問題和Platform匹配本身無關但極易干擾判斷建議出現(xiàn)probe失敗時先把dmesg完整拉出來看最終錯誤碼而不是只盯著最前面的日志。拿不到寄存器資源。如果節(jié)點里聲明了reg屬性驅動用platform_get_resource和devm_ioremap_resource去獲取但寄存器地址范圍跟別的設備重疊devm_ioremap_resource也會返回錯誤。很多人在probe失敗時只看到return -EBUSY卻不會想到是物理地址資源沖突。4.2 如何快速定位匹配路徑到底走到哪一步匹配失敗時核心問題是搞清楚內核到底在哪個環(huán)節(jié)放棄了。我常用的辦法有以下幾步第一步打開內核的驅動調試信息。在cmdline里加上ignore_loglevel和dyndbg或者簡單點使用dmesg -n 8。由于Platform總線匹配在出錯時不一定都有日志輸出這個方法有時不夠直觀但先把日志級別放到最高沒壞處。第二步在驅動里加打印。如果你不確定自己的probe是否被調用過直接在probe入口加一條dev_info或者pr_info。很多人會嫌打印土但實際調試中這永遠是最直接有效的辦法。注意probe里返回錯誤碼時內核會打印類似“myled: probe of myled failed with error -16”的消息看到這類log就知道驅動和設備已經匹配成功是probe內部處理出了問題。第三步利用sysfs節(jié)點檢查匹配狀態(tài)。這是最高效的方式# 查看設備是否綁定驅動 ls -l /sys/bus/platform/devices/myled/driver # 查看驅動的名字和它支持的設備id cat /sys/bus/platform/drivers/myled/uevent ls /sys/bus/platform/drivers/myled/如果設備下driver鏈接指向了你的驅動說明已經綁定成功probe被調用過。如果驅動目錄完全是空的說明設備樹里根本沒有符合條件的設備或者設備的compatible和你驅動里的of_match_table不一致。走到這一步匹配路徑基本就能定位出來。第四步抓總線級調試日志。內核的驅動模型在drivers/base/dd.c里提供了許多調試信息輸出需要把CONFIG_DEBUG_DRIVER打開編譯內核時啟用這個選項然后dmesg里會出現(xiàn)“matched device”之類的日志。這類信息量很大但如果你懷疑是匹配邏輯本身出了問題它是最權威的排查工具。4.3 一個真實的踩坑案例設備樹改名引發(fā)的詭異問題我之前在一個項目里調試一款外設驅動遇到過一個特別迷惑的現(xiàn)象驅動模塊加載沒報錯但probe就是不執(zhí)行。設備樹節(jié)點添加到dts里了也確認過dtb燒錄成功/sys/bus/platform/devices目錄下能看到設備的目錄名字也跟我預期的一樣。按照常規(guī)排查compatible我也對比過兩者看起來一模一樣。最后我實在沒辦法把兩個字符串逐個字符用十六進制打了出來這才發(fā)現(xiàn)問題設備樹里寫了“myvendor,my-led”但驅動里of_device_id寫的是“myvendor,myled”中間少了一個連字符“-”肉眼看久了確實很難發(fā)現(xiàn)。這就是為什么我強烈建議用uevent里的MODALIAS字段做嚴格比對而不是憑肉眼去檢查dts和代碼。還有一次是同事反饋說insmod之后probe沒執(zhí)行我過去查看發(fā)現(xiàn)/sys/bus/platform/devices下設備目錄能看到了但內核日志里沒有任何關于這個設備probe失敗的記錄。通過對比dtb和dts源碼才發(fā)現(xiàn)板子實際加載的dtb是一份舊的備份文件壓根沒有他改的這個節(jié)點目錄雖然能看到但那是另一份設備樹里本來就有的同名設備compatible和寄存器地址都不同。這種環(huán)境問題最容易浪費時間排查時一定先確認板子真正加載的設備樹是不是你改的那個。4.4 probe成功后卻被移除的常見原因定位到probe被調用了但執(zhí)行到一半驅動就被移除了這類問題也很典型。最常見的原因是probe返回了錯誤碼。例如我讓你看內核在probe失敗時打印的那行信息myled: probe of myled failed with error -16這個-16對應- EBUSY。它可能來自platform_get_resource返回NULL后你直接return -EINVAL也可能來自gpiod_get返回錯誤。需要注意的是probe一旦返回非零內核的driver core會認為驅動綁定失敗之后會自動執(zhí)行清理操作驅動和設備會被解除關聯(lián)看起來就像模塊被卸載了一樣。所以當dmesg里能看到probe被調用但隨后設備driver鏈接消失不要盯著Platform匹配機制看問題基本都在probe內部邏輯里。要做的就是把probe里每一步可能的錯誤碼都打印出來確定是哪一步返回的再去排查對應子系統(tǒng)的問題。很多人不知道一個小細節(jié)如果probe在某個子系統(tǒng)返回EPROBE_DEFER延遲探測內核不會立刻判定失敗而是把設備掛到一個等待隊列等對應依賴的驅動加載完成后再重新觸發(fā)probe。這在多驅動依賴場景里非常重要。在i.MX6ULL的驅動開發(fā)中如果設備樹里引用的某個時鐘或中斷控制器對應的驅動還沒就緒你的驅動probe可能會被反復推遲執(zhí)行。dmesg里看到“deferred probe”相關的字眼別慌這是內核的合理等待機制你需要回頭檢查自己依賴的外設驅動有沒有加載成功。4.5 使用內核deferred probe機制多說一句EPROBE_DEFER因為我發(fā)現(xiàn)很多新手第一次遇到它都會誤判成匹配失敗。在你的probe函數(shù)中當你請求某個資源但該資源對應的設備驅動還沒準備好時比如調用clk_get、regulator_get、gpiod_get時返回了-EPROBE_DEFER你應該直接把這個錯誤碼原樣返回給內核。內核的driver core看到返回-EPROBE_DEFER會把你的設備放到一個延遲列表中后續(xù)每當有新的driver注冊都會重新嘗試對這些設備進行綁定和probe。這個機制保證了設備之間的依賴關系可以通過“你等我一會”的方式動態(tài)解決而不是簡單在probe里死循環(huán)等待資源就緒。實際調試時你可以在內核cmdline中添加deferred_probe_timeout2這樣系統(tǒng)啟動后如果還存在EPROBE_DEFER的設備會在超時后打印詳細信息提示你到底在等待哪個資源。這個功能在排查啟動早期驅動順序問題時幾乎是救命稻草。4.6 常見問題速查表我把上面所有問題整理成一張速查表方便你日后直接對照排查?,F(xiàn)象常見原因排查與解決方向probe完全沒有執(zhí)行compatible不匹配對比uevent的MODALIAS與of_match_tableprobe完全沒有執(zhí)行設備節(jié)點不存在或statusdisabled檢查/proc/device-tree下節(jié)點與statusprobe沒有執(zhí)行但設備目錄存在設備驅動匹配沒觸發(fā)確認驅動有沒有注冊成功查看/sys/bus/platform/driversprobe執(zhí)行后打印錯誤GPIO或寄存器資源沖突查看dmesg錯誤碼檢查pinctrl和reg地址范圍insmod后/dev節(jié)點不出現(xiàn)udev/mdev規(guī)則未配置手動mknod或配置mdev自動創(chuàng)建規(guī)則probe反復不執(zhí)行出現(xiàn)deferred probe依賴資源尚未就緒查詢相關驅動是否加載成功必要時deferred_probe_timeout模塊無法modprobe自動加載MODULE_DEVICE_TABLE缺失或alias生成異常檢查模塊的modinfo輸出與MODALIAS匹配情況這張表你保存下來遇到問題時先對號入座。別小看這些檢查項很多資深工程師排查這類問題也基本走的是這套流程只不過他們已經把每一步都內化成了肌肉記憶。5. 升級認知從一套機制到整個設備模型思維5.1 Platform只是Linux設備模型里的一個縮影如果你只是想在i.MX6ULL上調通一個點燈驅動其實上面4節(jié)內容已經足夠。但如果你想把Linux驅動的知識體系搭得更完整我建議你從Platform這套機制中跳出來思考一下它背后統(tǒng)一的Linux內核設備模型。Platform總線設備驅動模型本質上只是Linux通用設備模型的一個應用。Linux內核維護了一個設備模型的骨架包括kobject、kset、uevent、sysfs等底層設施在這個骨架上衍生出不同類型的總線。不管是platform_bus_type、i2c_bus_type、spi_bus_type還是pci_bus_type它們都有共同的語義設備注冊、驅動注冊、總線匹配、probe調用、電源管理回調等。你在這篇文章里學到的compatible匹配、driver綁定、sysfs節(jié)點檢查這些技能在后續(xù)接觸I2C客戶端驅動、SPI設備驅動時同樣適用區(qū)別只是總線類型和匹配函數(shù)不一樣。I2C設備的client與driver通過id_table或者設備樹compatible匹配SPI設備也是類似邏輯。很多講Platform總線的教程喜歡鋪陳各種概念但我覺得內核設備模型背后的核心設計思想才是真正值得玩味的東西把易變的、板級相關的設備描述從穩(wěn)定的驅動邏輯中剝離出來。設備樹解決了設備描述“寫在哪”的問題Platform總線解決了設備與驅動“怎么見面”的問題而GPIO、時鐘、中斷等內核子系統(tǒng)則解決了資源“怎么共享不沖突”的問題。5.2 理解匹配機制對日常開發(fā)的實際影響哪怕你已經能熟練地照著別人的驅動模板抄代碼我也建議你花時間把匹配機制吃透。因為不理解匹配機制你在調試時會缺少一個方向感只知道代碼寫出來沒反應抓不住“系統(tǒng)如何認識我的設備”這條主線。舉個例子。設備樹里如果出現(xiàn)這個節(jié)點uart1 { status okay; };按我們前面說的流程內核會把uart1節(jié)點轉換成platform_device去匹配IMX6ULL的uart驅動。如果你哪天發(fā)現(xiàn)一個串口設備死活打不開第一步就應該去確認uart1節(jié)點是否成功創(chuàng)建了platform_device然后再看uart驅動有沒有綁定到這個設備、probe有沒有執(zhí)行。理解了這套機制之后你排查硬件驅動的順序就會變得很清晰從設備樹到平臺設備再到驅動綁定最后才是驅動內部硬件初始化的邏輯。另一個常見場景是外設的時鐘和電源管理。Platform驅動在probe里拿到設備之后往往要操作clk和regulator子系統(tǒng)比如打開外設時鐘、調節(jié)電壓。這些資源同樣可以在設備樹節(jié)點中描述。如果資源描述不正確probe里clk_prepare_enable就會失敗。你只有理解了整個鏈條才能在設備樹、驅動代碼、內核日志三個視角之間來回切換定位問題而不是逮著compatible死磕。5.3 如何繼續(xù)深入學習Platform相關技術如果你想在這個方向上有更扎實的積累我給幾條具體建議。第一條翻內核源碼時別只看platform.c還要看device.h、platform_device.h、of_device.h這幾個頭文件把platform_device、platform_driver、of_device_id這幾個結構體的字段都弄明白尤其是resource結構體理解IORESOURCE_MEM、IORESOURCE_IRQ的用法。probe里那些platform_get_resource、platform_get_irq之類的API其實都是在操作resource結構體明白了數(shù)據(jù)結構你再去看接口函數(shù)不會覺得它們散亂。第二條自己獨立完成一次從設備樹建節(jié)點到用戶空間應用程序調用完整鏈路的實驗。別只抄教程看完文章后關掉網頁自己憑理解寫一版踩過的坑記得越牢成長越快。實驗時可以刻意制造幾個錯誤比如把compatible故意寫錯、把status設為disabled觀察probe失敗的具體表現(xiàn)然后再修正回來。這種做法比重復抄代碼有用得多。第三條條件允許的話用QEMU或者虛擬平臺去讀內核源碼里更多總線模型的實現(xiàn)。i.MX6ULL開發(fā)板適合做真實的硬件對接但如果你想在更深層面理解Linux設備模型比如分析bus_type結構體的match、uevent、probe回調在driver core里如何被調度一臺能編譯內核的Linux主機配合QEMU的virt平臺調試效率可能比反復燒錄板子更高。6. 最后再分享幾個調試小技巧調試Platform驅動時有幾條經驗我覺得很有用分享給你們。第一dmesg一定要養(yǎng)成隨手清空的習慣。開發(fā)板長期運行內核日志緩沖區(qū)會被各種無關消息占滿容易把關鍵日志沖掉。每次insmod之前先dmesg -c把舊日志清掉加載之后再看dmesg輸出這樣probe里打印的信息一目了然不會遺漏。第二多利用sysfs少依賴暴力加打印。sysfs是內核設備模型的實時投影/sys/bus/platform/devices目錄下的每個符號鏈接和uevent文件都是判斷設備狀態(tài)的最可靠依據(jù)。很多問題看一眼驅動鏈接、cat一下uevent就能定位完全不需要重新編譯模塊加打印。雖然加打印在調試probe內部邏輯時仍然必要但先通過sysfs確認匹配狀態(tài)能幫你少走很多彎路。第三改設備樹之后一定要確認板子加載的是你編譯的新dtb。嵌入式開發(fā)中啟動流程各有差異有的從SD卡讀dtb有的從EMMC指定分區(qū)讀有的通過u-boot環(huán)境變量指定tftp加載。改完設備樹卻忘記更新對應位置的dtb是我見過最頻繁的低級錯誤。調試設備樹相關問題時先在板子上執(zhí)行l(wèi)s /proc/device-tree/看看節(jié)點是否真實存在再往下排查能省掉大量無意義的工作。第四合理使用devm系列的資源管理API。我在示例驅動里大量使用了devm_kzalloc、devm_gpiod_get這些devm前綴的函數(shù)本質上是把資源釋放的責任掛在struct device的生命周期上。probe成功之后設備與驅動解除綁定時內核會自動幫你釋放這些資源。這能有效避免probe失敗時忘記釋放之前申請的資源導致的問題。不夸張地說內核里devm系列API的出現(xiàn)讓驅動資源管理的出錯率降低了一個量級。第五也是我覺得最重要的一點不要急著一次寫完整個驅動。你可以先把probe函數(shù)只留一條打印確認匹配鏈路通順再一步步加上GPIO申請、寄存器映射、設備注冊等邏輯。每一次小步驗證都能讓問題邊界變得非常清晰。真按這種方式做大多數(shù)Platform匹配類問題在半個小時內就能定位遠比你一股腦寫完兩百行驅動再調半天高效得多。我在實際項目里用這套方法解決過的問題不計其數(shù)甚至有時候不是i.MX6ULL平臺換成其它ARM SoC或者RISC-V芯片只要內核還是Linux這套Platform設備與驅動匹配機制基本不會變調試思路也是相通的。這就是花時間把機制理解透的價值。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
成人做爰黄A片免费看直播室男男| 精品无码久久久久久久久| 丁香五月天.com| 狠狠操狠狠操AV| 五月天色婷婷网| 大香蕉520| 超碰在线免费观看日韩| 思思热在线视频精品| 五月婷婷AV| 婷婷五月天色| 婷婷午夜| 国产日产成人亚洲欧美国产VA| 1024人妻无码中文字幕| 日韩无码AV电影网站| 乱码操操| 99碰碰| 天天天天天天噜| 91ncom.色| 丁香玖玖视频大全| 任你操精品免费| 91夫妻视频| 婷婷色五月天在线| 久久婷婷六月综合综合| 色五月综合| 欧美激情综合色综合啪啪五月| 影音先锋激情网| 色婷婷免费观看| 一级无码作爱片| 大战熟女丰满人妻AV| 老司机伊人| 五月综合久久| 亚洲热综合| 亚洲欧洲另类| 久久er99热精品一区二区| 亚洲色久| 久热九九| 精品香蕉99久久久久网站| 五月天婷婷基地| 99久久九九| 亚洲乱码w在线观看| 色色a| 人草人人| 玖玖爱综合网| 五月天婷婷久久| 久久婷婷热| 亚洲AV中文在线| 饮料下药迷倒漂亮女同事强干| 26uuu亚洲欧美| 91精品国产综合久久密臀 | 99视频网| 激情av在线| 日本丁香五月| 日韩色色视频| 99色嘟嘟精品网站| 熟女网站久久| 色婷婷六月综合| 婷婷六月激情丁香| 少妇性按摩无码中文A片| 99热这里全都是精品| 午夜激情五月天| 婷婷五月美女直播| 超碰在线人妻| 青青草原亚洲久| 另类国产欧美视频| 狠狠色丁香五月婷巨| 色婷网| 这里只有精彩小视频视频网站| 天天玩夜夜操天天爽| 在线播放成人网站| 青草激情在线| 狠狠综合| 丁香五月97视频| 9热视频在线观看| 91精品婷婷国产综合| 天天射美女| 国产成人网| 激情婷婷丁香色五月综合| 亚洲五月天天| 色五月大| 丁香婷婷综合影院| 无码地址| 国产婷婷久久| 九玖视频这里只有精品| 亚亚州久久高潮| 亚洲综合久| 开心激情站| 精品一区久热| 六月婷婷五月丁香首页| 九九成人视频| 日本视频不卡123区| 婷婷丁香五月天操逼| 六月婷欧美| 激情丁香五月婷| 免费不卡狠操美女视频网 | 色色色综合色| 国内久久亭亭| 欧美久久婷婷| 熟女人妻一区二区三区免费看| 伊人久久综合| 琪琪色网址| 婷婷五月综合网激情| 色婷婷AAA| 婷婷五月丁香基| 9l视频自拍9l九色9l成人| 久热9| 丁香六月婷婷色播| 婷婷五点亚洲| 国产av网| 婷婷五月天综合色| 久久人妻熟女一区二区| 六月丁香花婷婷| 在线可以看的av网址| www.狠狠| 久久这里只有精品久久| 欧美性猛交99久久久99| 久久婷婷六月综合综合| 婷婷六月激情综合| 人人操人人妻| 久久五月婷天天干| 人人色人人弄人人操| 五月丁香婷婷色色色| 噜噜噜精品欧美成人在线观看| 亚洲爆乳无码精品AAA片蜜桃| 婷婷五月丁香综合激情| 五月天激情亚洲| 人人爱干人人爱草| 国产成人网址| 深爱五月激情网| 综合啪啪| 成人版视频在线观看| 五月婷婷狠狠干| 人妻久久久| 国产99美少妇| 俺去也五月| 欧美性二区| 欧美乱码国产一级A片| 久久丁香综合香蕉| 五月丁香六月情| 91碰免费视频| 日本va欧美va欧美精品88| 欧美S码亚洲码精品M码| 亚洲久久婷婷| 天天视频精品9| 久久996re热这里只有精品无码| 九九色综合九九色| 五月丁香婷婷无码A∨| 99热99干| 丁香五月综合色婷婷| 91九色精品女同系列| 超碰在线网站| 99色在线观看| 六月婷婷狠狠| 国产高潮白浆一区二区| 99ri视频在线播放| 久久五月天合网| 色婷婷五月在线| 色综合九九| 九九碰九九爱97超碰| 在线观看的av| 中文幕无线码中文字蜜桃| 美女婷婷六月色| 青草青草视频2免费观看| 国产精品国产成人国产三级 | 玖热精品综合视频| 日韩AV无码影片| 丁香五月婷婷乱| 九九草草逼| 在线可以看的av网址| 青青操成人福利| 人人视频人人干人人做| 99无码免费视频| 五月天丁香色色| 天天日日夜夜爽。| 欧美日本VA| 亚洲综合五月天婷婷丁香| 天天撸夜夜爽| 六月婷婷av| 五月天啪啪| 丁香五月婷婷激情视频播放| 色哟哟性爱av| 97人妻碰碰中文无码久热丝袜| 色久婷婷网| 91丁香色| 亚洲热久久| 久久久精久人妻| 九伊人网| 九九九激情网| 激情深爱五月天| 天天看夜夜看| 欧美日韩AAAAA| 色色色com| 噜噜狠狠色综无码久久合欧美| 五月天久久婷婷| 精品久久99| 色狠狠婷婷| 婷婷五月天天爽| 婷婷丁香六月五月天| 丁香五月-激情综合| 婷婷五月综合网| 日日爱678| 亚洲美女裸体被操在线观看| 欧美日韩91| 六月丁香色婷婷| 九九热av| 91色在线 | 日韩| 成人综合网站| 99热综合网| 五月婷导航| 丁香九月激情| 在线观看亚洲视频影院| 婷婷五月天涩涩| 久久久久久欧美精品se一二三四| 色噜噜狠狠色综合网| 91啪级电影| 久操综合| 欧美人人女女精品综合五月天| 99网| www.zbzhongsen.com| 激情六月色| 久久婷婷五月天激情| 久操无码| 91丨九色丨熟女高潮| 99热伊人综合| 级人人91| 开心婷婷五月综合| 久综合4| 操操碰| 大香蕉综合| 婷婷五月天BBw| 99爱视频精品在线观看| 激情五月天婷婷直播| 丁香九月激情久久| 色婷婷综合成人| Y11111111111少妇电影院| 免费无码毛片一区二区A片| 婷婷伊人网| 99热这里只有精品首页| 99re6久热只有精品6在线直播| 激情综合网,婷婷五月天| 色五月婷婷狠狠撸| 玖玖精品视频99| 激情六月下句是什么| 亚洲永久免费| 天天弄天天爽| 五月天成人网婷婷| 婷婷瑟瑟五月天| 婷婷五月天首页| 亚洲看av的网站| www.99热最新视频8| 九九热这里只有精品556| 九九婷婷综合| 中文字幕婷婷五月天| 五月香婷婷| 免费AV播放| 色婷婷基地| 婷婷月五天在线在线看| 色五月激情五月丁香五月婷婷啪啪综合| 久久久人妻人伦| 玖玖国产视频一区| 97干婷婷五月天| 亚洲久久婷婷丁香五月天| 先锋资源 996| 色婷婷AV在线| 噼里啪啦在线观看免费完整版视频| 99热这里只有精品8| 日本片日本片祼观看网站在线看中文版网页在线看 | 亚洲精品操一操、噜一噜、摸一摸、爽| 99色啊| 婷婷色五月久久| 成 久久| 亚洲色婷婷五月| 天天爽天天爽视频| 五月婷婷无码| 亚洲无码影音| 丁香六月激情| 99色1| 婷婷色爱| 久久婷婷五月| 色色色com| 热99.com婷婷| 婷婷偷拍网| 欧美黑人巨大猛烈cuckold| 婷婷五月激情片| 日日操天天爽| 99久久激情视频| av国产精品| 另类婷婷五月天啪帕帕| 中文字幕成人| 五月丁香人妻| 婷婷性爱| www99精品| 久久久久综合激动五月天| 色色五月婷婷丁香| 狠狠操综合| 伊人激情网| 天天肏视频| 婷婷综合成人五月天| 日本VA视频| 黄色片区子| 日韩精品AV一区二区三区| 婷婷天堂伊人| 亚洲国产色婷婷| 五月婷婷丁香色吧网| 99热在线观看免费精品| 狠狠噪| 亚洲精品影视| 婷婷狠狠操| 67194国产| 日本久久人| 五月丁六月香av| 26.uuu丁香五月婷婷| 欧美韩国日本| 婷婷五月大| 亚洲色优| 超碰自拍天堂| 人妻尝试久久久久久久久久久久| 五月天播播| 色色婷婷婷丁香五月天| 99热最新网址| 亚洲中文字幕在线观看| 91丨九色丨大屁股| 久9久9久9久9久9久9| 天天干天天av天天射| 久久婷婷视频| 激情久久久久久| 天天久久九九| 99色一| 91丨九色丨43老版熟女| 99热99网| 婷婷狠狠操| 色五月偷偷| 丁香五月综合在线观看| 五月丁小婷婷激情四射| 婷婷深爱五月天在线| 97婷婷色| 轮奸综合网| 五月激情网站| www.91九色| 婷婷五月天小说网| 在线91日韩| 久久这里有精品视频在线免费观看| 伊人激情| 伊人日日干| 青青草激情网| 综合欧美五月婷婷| 少妇性按摩无码中文A片 | 日本精品。999| 婷婷色网| 亚洲第一色色色| 色99网| 亚洲综合在线播放| 9l视频自拍9l九色成人| 国产成人网| 99re久久| 亚洲激情网站无码| 天天日色情| 开心五月综合激情综合五月| 九九久久9 9在线观看| 日日干夜夜撸夜夜骑| 99这里只有精品| 梁铮版《蜘蛛女侠》在线| 丁香五月天视频| 色色综合色视频| 日韩色色视频| 夜夜夜夜操| av免费在线看不卡无毒| 美女妹子后射视频网站在线观看| 99内射视频| 久操97| 亚洲一级色电影| 色综合中文| 色5月婷婷| 五月婷婷综合网| 丁香六月成人网| 激情婷婷激情在线不卡| 亚洲情色一区| 99精品色色| 1024亚洲无码| 久久总和99| 99久久综合| 超碰99在线观看| 九九在线免费观看| 99亚洲精美视频在线观看| 成人五月天丁香| 五月天无码| 午夜精品久久久久久久爽| 人人看人人草人人摸| 任我肏视频精品| 免费观看的av| 这里只有精9| 大香蕉视频婷婷| 青青草原伊人网| 婷婷偷拍网| 九九精品免费视频99| 丁香五月婷婷亚洲色图| 丁香色啪综合| 91九色熟女| 国产SUV精品一区二区6| 人人摸人人干| 开心日韩丁香婷婷五月| 婷婷五月天黄色网址| 亚洲久久激情| 五月婷婷开心网| 丁香五月激情天AV无码| 光棍影院日韩精品| 大香蕉在九| 久久WW| 婷婷色五月天第7色| 99热亚州综合| 极品少妇XXXX精品少妇偷拍| 91无码视频| 99视频精品8 | 久久五月婷婷视频| 秋霞av吧| 日本久久天堂| www.精品99| 99久久精品网| 美女五月天婷婷| 99啪在线| 国产亚洲99久久精品熟女| 久久天天| 九九热99免费视频| 99热这里只有精品16| 婷婷四月 成人 狠狠干| 9色在线视频| 亚洲综合欧美色丁香婷婷888月图片| 狠狠色噜噜狠狠狠888| 中文AV网站| 亚洲AAA| 国产超碰在线| 久久精品婷婷| 国产日韩av片| 丁香五月婷婷亚洲另类| 婷婷六月久久| 亚洲成人丁香花| 国产FREESEXVIDEOS性中国| www.五月丁香| 久99热在线观看| 四色五月婷婷在线观看| 婷婷香五月| 丁香五月综合福利视频导航| 色色综合网站| 99色视频| jiZZdr| 14色综合婷婷| 丁香五月首页| 99视频内射三四| 91人人操人人爱| 婷婷五月天播播| www.深爱激情| 99色色色色| 五月婷婷久草在线视频综合| 久久精品66| 99爱最新免费视频在线观看| 亚洲成人乱码av网站| 久色成人| 色五月婷婷啪啪五月| 婷婷久久夜| 激情综合五月色在线| 亚洲欧洲另类| 天天干夜夜操A片| 五月五婷婷网| 99热99日…..| 操逼123网| 九色色| 这里只有精彩视| 久狠日av| 思思99热| 99热精品在这里| 五月婷婷影| 国产毛片精品一区二区色欲黄A片| 色色五月丁香| 极品人妻VIDEOSSS人妻| 西西4r午夜剧场| 九九久久玖玖爱| 色久一| 婷婷丁香五月天影院| 日本天堂爱爱| 九九精品片一| 开心婷婷五月中文字幕组| 26uuu精品一区二区| 激情五月天婷婷| 五月丁香色色| 欧美成人AAA片一区国产精品| 亚州美女| 94干大香蕉| 啪啪黄页网| 99色视频在线| 久久这里只有精品视频15 | 日本人人草草| www.五月激情.com| 色色色色色色网| 色播婷婷五月天| 精品夜夜澡人妻无码AV| 激情综合婷婷久久| 开心婷婷五| 这里只有九九精品| 97婷婷狠狠| 天堂无码人妻精品AV一区| 天堂网操| site:hcxsz888.com| 亚洲99在线视频| 国产精品爽爽久久久久久| 五月丁香啪啪| 亚洲国产网站| 激情五月天综合图片小说网站| 六月婷婷在线| 疯狂做受XXXX高潮A片| 国产精品黑丝| 天天日,天天射,天天插| 97色啪| 色伦专区97中文字幕| 丁香久久九九99| 综合亚洲五月天| 婷婷久久色| 99re热免费观看视频精品| 亚洲偷| 99riAV国产精品视频| 思思久久精品视频| 色五月婷婷综合在线| 白人荫道BBWBBB大荫道| 超碰99热| 久久精彩免费视频| 伊人大香蕉爱聚| 成人在线网| www.99成人视频| 亚洲色啪| 在线播放成人网站| 开心五月婷婷| 热婷婷av| 思思热在线视频99| 国产精品99久久久久久久女警| 五月婷婷日| 久色五月| 久热婷婷综合| 青草性爱视频| 开心激情站| 六月婷婷啪啪| 激情五月天偷拍综合网| 香蕉曰比| 热99只有精品| 成人免费120分钟啪啪| 婷婷五月情| 俺去也婷婷| 色九月丁香婷婷蜜桃在线观看| 婷婷丁香五月视频| 中文字幕在线观看视频www| 97极品在线| 这里只有久久精99| 玖玖婷婷五月天毛片| site:wpjngj.com| 激情综合国产| 婷婷久久久久| 综合色色婷婷| 欧美内射AA| 国产 亚洲 在线| 五月婷久久久| 青青草原亚洲天堂| 五月婷婷色影院| 久久久无码精品成人A片小说| 伊人激情综合| 天天摸天天做天天爱天天爽| 先锋男人91资源| 婷婷五月丁香六月天亚洲综合| 亚洲字幕AV一区二区三区四区| 精品色情一区二区三区四区| 极品人妻VIDEOSSS人妻| 五月丁香直播| 丁香色婷婷色手机免费在线| 99精品22| 亚洲视频无| 极品人妻VideOssS人妻| 2016日日夜夜操| 激情综合色婷婷啪啪六月天| 久久综合干| 天天干夜夜想| 狠狠狠狠狠狠狠狠狠狠狠色宗合图片| 久草婷婷网| 激情五月少妇| 九色无码| 色婷婷五月在线| 青青草a在线| 免费无码毛片一区二区A片| 色婷婷丁香五月天在线视频| 国产av第一专区| 激情综合五月婷婷六月丁香| 久久性刺激| 狠狠干狠狠色| wwwxxx五月婷婷小说| 碰99在线| 日韩 中文 欧美| 婷婷偷拍网| 国产欧美精品AAAAAA片| 狠狠五月综合在线| 五月丁香av中文| 丁香五月婷婷五月| 欧美色爱五月天| 26UUU欧美激情一区二区| 六月色婷婷| 日日操天天爽| 综合久久9| 超碰97在线操| 1区2区视频| 五月天天丁香婷婷在线中| 九九九激情综合| xxx.色婷婷| 婷婷午夜| 国产性爱色| 色色性爱视频| 色丁香五月天婷婷| 色色色色热热| 狠狠综合区| 综合色图区| 婷婷五月在线播放| 色婷婷久久综合久色| 91/九色黑人| 亚洲色五月| 丁香五月六月欧美| 99小视频在线| 99色在线免费观看视频| 国产婷婷色综合AV蜜臀AV| 99A片| 色五月在线| 日韩在线观看亚洲| av在线婷婷| 五月天综合婷婷| 天天撸天天干天天插| 五月婷丁香花| 日本九九视频| 伊人天堂婷婷| 风流少妇A片一区二区蜜桃| 深爱激情五月天| 精品九九视频| eeuus五月婷| 久久新地此| 色色色com| 免费视频无码| 色综合久久88色综合天天99| 天天日,天天插| 丁香六月视频| 亚洲夜五月| 婷婷五月丁香啪啪| 天天操精品| 乱乱av| 99热综合| 99在线精品视频| 99在线视频播放| 99久在线精品99re8热| 婷婷色系婷色| 婷婷丁香五月天综合网| 天天操天天日天天爱| 色天堂A| 激情丁香久久| 热996精品在线观看| 五月丁香婷婷伊人日韩| 综合福利网| 内射干少妇亚洲69XXX| 俺去也五月天婷婷| 激情综合网五月激情| 色婷婷免费视频| 五月精品| 五月丁香欧美综合| 91avse| 久久婷狠狠色| 免费黄色片子| 这里只有精品在线观看视频| 狠狠插狠狠插| 激情综合网激情五月天| 91碰碰碰| 麻豆AV一区二区三区| 少妇AB又爽又紧无码网站| 亚洲亚洲人成综合网络| 无码人妻丰满熟妇奶水区码| 91人在线观看| 91国产精品视频播放| 5Www色5夜| 婷婷色基地在线看 | 激情五月综合亚洲另类| 久久激情五月婷婷| 狠狠干天天日| 极品人妻XXXXOOOO| 日本久久激情| 国产精品岛国片在线观看免费| 九九九九中文字幕| 99热欧美偷拍| 九九久久综合| 久久黄色网扯| 五月婷久久在线| 丁婷婷五月天在线播放| 久久婷婷成人| 夜夜操狠狠操| 伦乱人妻| www.色五月.com| 国产五月丁香在线| 天天精品视频在线观看视频| 思思热这里只有精品| 色七七九九| 99色在线| 久久久久久婷| 婷婷六月色开| 超碰狠狠色| 精品99在线观看| 色婷婷综合网| 任你弄在线视频免费| 天天干天天操天天射| 青草青草久热这里只有精品| 国产精品久久久60086| 深爱综合网| 久久久久人妻| 综合激情四射一theav| 丁香五月日韩| 精品久久久久久久人妻| 六月婷久久| 超pen个人视频97| 九月丁香八月婷婷久久综合久97| www.天天色综合| 五月婷婷开心丁香| 色五月六月| 色九月丁香婷婷蜜桃在线观看| 黄色激情久久| 战争与艾拉电影免费观看| 超碰免费人妻| www.cao.com久久| 那里有AV网址| 色婷婷久久综合久色综| 日韩啪啪网| 91一道本| 六月婷婷影院| 思思久久99| 日韩色色一区| 婷婷丁香五月天在线| 激情综合色| 久久天堂女人| 久久香蕉婷婷五月天| 欧美视频五区| 丁香婷婷婷| 丁香六月中文| 91丨九色丨国产打屁股| 久人人操| 婷婷五月天亚洲图片| 精品人妻一区二区三区四区不卡在| 久久久全国免费视频| 五月婷婷开心亚洲无| 99热只有| 69人人操人人爽| 五月综亚洲| 天天爽天天干| 99久久久免费| 成人版视频在线观看| 婷婷丁香大香蕉| 五月丁香婷婷无码A∨| 大香蕉精品视频| 任你日热视频| 婷婷日日夜夜| 久久99人人| 亚洲丁香五月天在线视频| 97香蕉碰碰人妻国产欧美| 亚洲人人操| 综合五月天完整| 国产欧美日韩综合精品一区二区| 伊人婷婷青青cao| 精品99在线| 吊色AV男人的天堂| 丁香六月婷婷| 97婷婷在线| 丁香五月天激情免费在线观看AV777| 日韩色色色色| 五月色丁香激情| 亚洲12p| 狠狠色官网| www.天天干| 亚洲视频色色| 欧美 日韩 人妻 高清 中文| 日本人妻丁香婷婷久久寝取熟女五月| 狠狠操综合| wWw色五月| 五月天婷婷成人网| 综合色天天| 成人做爰A片免费看网站找不到了| 婷婷爱综合| 麻豆AV一区二区三区| 激情五月婷婷色综合| 无码AV免费精品一区二区三区 | 91日韩美女被插视频| 天天日天天干天天操| 超碰99热精品| 欧美影院婷婷| 五月婷婷六月丁香免费| 1024日韩| 丁香五月综合在线播放| 999热这里只有美国精品| 99热这里只有精品18| 日本三级片片| 成人视屏在线观看| 性色欲情 网站| 国产精品人成A片一区二区| 色婷婷丁香五月高清在线| 欧美色男人网站| 天天日天天干天天插天天射| AVV黄| PORNY九色9l自拍视频成人| 黄色AV日韩| 国产精品人成A片一区二区| 亚洲一区二区无码蜜乳av| 激情骚五月| 五月丁香六月香香蕉| 秋霞午夜理论| 久热精品9999| 我爱大香蕉| 五月开心六月婷婷在线播放网站| 九色激情| 亚洲啪视频| 狠狠色丁婷婷日日,伊人激情综合网| 激情五月婷婷综合网| 五月综合在线| 婷婷开心深爱五月天| 日本综合九九| 91碰视频| 五月婷综合网| 99人人干| 中文字幕不卡网站| 色婷婷婷婷| 99无码视频| 精品久久久人妻| 婷婷丁香人妻天久久| 91嫩草国产线观看亚洲一区二区| 色丁香五月| 激情五月婷婷啪啪| 综合久久高清| 色色五月婷婷网| 丁香五月色色| www.99热. com这里只有精品| 婷婷99热| 成人AV片播放| 婷婷丁香六月天| 99热亚洲精品| 激情婷婷综合| 婷婷射综合| 激情五月黄色| 激情五月婷婷丁香| 色婷婷五月天视频网站| 我要色综合五月婷婷| 亚洲婷婷基地| 大香蕉视频99| 国产做爰视频免费播放| 五月婷六月| 激情五月天色婷婷| 99这里只有精品国产| 99热综合色图| 青青草99re| 极品少妇XXXX精品少妇偷拍| 五月丁香婷婷综合久久| SESE无码AV| 五月丁香婷婷无码A∨| 五月天激情久久| 97在线日韩| 人妻体体内射精一区二区| 久久色区| 99九九视频| 亚洲欧美一区二区三区四区爱爱动图| 中文人妻主播久久| 五月婷婷AV| 永久免费一区二区三区| 日噜噜色| 亚洲六月综合激情久久下卡| 激情综合五月| 思思热视频| 亚洲中文字幕av| 激情五月天网站| 九九热99热| 襙逼网| 五月天无码视屏播放| 日本三级大片| 99视频自拍| 美女黄频aⅴ视频| CAoub青青超碰| 色碰97| 日本高清不卡免费一区二区三区| 天天揷综合网| 亚洲精品无AMM毛片| 五月天色图| 婷婷色婷婷| 色99视频| 亚洲国产精品VA在线看黑人| 亚洲精品V天堂中文字幕| 九九碰九九爱97超碰| 99热官网精品在线| 99这里只有精品|v| 五月婷婷啪啪| 欧美婷婷| 欧美顶级少妇做爰HD| 九九色色| 国产精品久久久爽爽爽麻豆色哟哟| 五月天精品| 丰满少妇猛烈A片免费看观看| 五月婷婷激情网| 成人无码髙潮喷水A片| 开心五月激情网| 少妇人妻偷人精品无码视频新浪| 粉嫩AV久久一区二区三区| 免费视频WWW在线观看网站| av亚洲国产小电影| 玖玖婷婷免费| 激情五月婷婷她| 婷婷伊人75| 9精品在线| 开心六月婷| 色综合天天网| 都市激情小说婷婷| 久久这里有精品| 激情六月婷婷| 色色色综合网| 99热网精品| 激情五月天福利| 99热销国产这里有精品| 成人视屏在线观看| 久久五月丁香伊人青草| wwwxxx五月婷婷小说| 色永久| 97香蕉久久超级碰碰高清版| 色色a| 老师的粉嫩小又紧水又多A片视频| 日本www免费九九| 欧美色偷拍| 丁香综合婷婷开心激情网| 五月永久激情| 九九这里有精品| www久| 成人国产欧美大片一区| 99啪视频在线观看| 超碰人人色| 婷婷色五月情| 99热大香蕉| 亚洲熟妇AV乱码在线观看| 午夜福利8055| 99久久66| 婷婷性爱五月天| 天天天天天天操| 欧美日韩成人h| 激情综合网五月丁香| 五月丁香综合久久| 色香久久| 久久人人做人人妻人人玩精品va| 九伊人网| 婷婷五月免费观看| 四月婷婷丁香五月| 天天天天干| 丁香五月www| 丁香五月综合激情久久潮喷| 色色亚洲五月天| 超碰99在线观看| 国产综合久久久777777| www.minyis.com【JT】实力收量可预付TG@LXSPSW8| 五月丁香六月婷婷视频| 天天综合色| 婷婷色六月| 色欲五月天| 99九九精品视频| 亚洲婷婷性爱| 性爱AV天堂| 99网99热| 日碰日| 丁香六月AV| 日韩在线99| 伊人狼人干| 天天 青草 制服丝袜 在线| 五月丁香婷婷基地| 69超碰在线| 99热99在线| 人妻少妇色综合| 婷婷丁香成人色综合| 99久久99视频只有精品| 婷婷激情综合| WWW.亚洲无码| 伦乱美欧| 丁香五月五月婷婷| 一本久道综合99| 婷婷丁香色无五月| 在线看的免费网站| 九九99在线观看视频| 五月天激情久久| se婷97| 五月天中文网| 中文字幕日产A片在线看| 久久久WWW| 五月天婷婷综合网| 99热亚洲综合| 五月婷婷五月天亚洲无码| 被强行糟蹋的女人A片| 婷婷五月天色色| 色色色地址| 女人天堂久久| 99亚洲精品视频| 97操碰免费视频| 六月丁香激情综合| 成人在线观看精品| 伊人国产婷婷五月天| 婷婷啪啪| 色六月天天激情综合网| 26uuu在线观看| 超碰国产在线| 这里只有精品1| 婷婷伊人綜合中文字幕| 色情综合| 九九色中文| 婷婷五月天AV| 99久久婷婷国产综合精品青桔| 99日本在线| 日韩欧美一级大黄网站| 激情六月丁香| 亚洲AV网站| 99热这里只有精品1| 狠狠搞五月天| 婷婷91| 色婷婷五月天激情久久| 久久AV无码精品人妻系列试探| 丁香五月深爱五月婷婷| 色色色五月天婷婷| 五月天精品综合| 免费观看日韩成人av| 婷婷狠狠干| 人橾人| 婷婷丁香六月| 激情综合网络插| 嫩BBB搡BBBB榛BBBB| 日日射天天射| 日韩AV成人电影| 狠狠色五月| 丁香五月性| 99国产精品久久久久久久久久久| 激情图片亚洲| 五月丁香龟婷婷| 九色地址91视频| 超碰人人操人人干| 丁香五月综合久久八| 影音先锋高清无码资源网| 亚洲成人黄色网| 五月天色色婷婷| 久久五月丁香| 五月四色色| 欧美日韩五月婷婷| 俺去也五月天婷婷| 六月五月久久丁香| 国产亚洲成AV人片在线| 色噜噜狠狠色综合网| 五月天激情小说婷婷| av一级棒av| 97色色色| 日本激情ⅩXX免费视频| 影音先锋 萱萱| www.97碰碰com| 99精品视频在线免费观看| 五月激情综合婷婷| 日本在线视频www色| 天天噜天天爱| 亚洲成Av人片乱码色第1集| 99久re热视频精品98| 无码激情精品色婷婷久久久久| 久艹久| 丁香五月天堂网| 日韩AV大全| 九九Av| 任我肏视频精品| XX色综合| 色丁香五月| 在线视频色五月| 婷婷色偷拍| 丁香婷婷综合激情五月色| 九九热在线精品| 婷婷色播六月无码| 色情婷婷。| 黄色片久久| 午夜免费试看| 久久婷婷五月综合色和| 俺也去在线久久精品23欧美综合视频网站,丰满人妻一区二区三区在线视频53,丰满 | 五月草影视| 综合狠狠伊人| 婷婷五月色惰| 久热在线中文字幕色999舞| 婷婷五月天丁香社区| 翔田千里无码| 五月婷婷综合激情| 色 五月 天 婷婷 丁香 九月| 性爱视频久久| 女同激情久久av久久| 五月丁香六月香综合激情| 九玖视频这里只有精品| 99久久高清视频| 一本道在线电影| 五月丁香成人网| 婷婷久久色| 99性爱无码| 久热这里只有精品性色AV| 色综合香蕉| 五月丁小婷婷激情四射| 色色色欧美| 激情五月天色网站| 天天操电影院色狼性av| 六月婷婷狠狠| 成片免费观看视频大全| 五月婷婷七月丁香| 人妻在线观看视频| 成人精品视频99在线观看免费| www.99在线| 欧美性猛交99久久久99| 超碰1999| 天天五月情| 五月综合亚洲| 午夜美女人啪最红院| 久久久精品视频79| 99久久久久久| 六月婷婷啪啪| 色99婷婷五月天| 色色草97| www.亚洲激情.com| 久久九九激情五月天| 202丰满熟女妇大| 99热最新网址| 狠狠操狠狠| 午夜丁香婷婷| 丁香色婷婷| 99国产在线| 超碰国产在线| 久久久婷婷| 中文字幕成人| 色色色9| 99热这里有精力| 丁香六月婷婷开心| 91九色精品女同系列| 操逼毛片国语对白| 五月婷色色| 91超级碰| 激情综合网丁香| 五月丁香激情综合啪| 再次出发二| 极品 少妇 内射| 激情婷婷丁香色情五月天| 五月天婷婷久久综合| 天天插天天干天天舔| 99小视频网站| 婷婷五月色天| 日本久久婷婷| 99亚州综合精品成人网| 五月丁香影视| 思思热在线| 综合色在线| 五月婷婷丁香大香蕉| 嫩草国产| 91狠狠综合网| 91丨九色丨东北熟女| 5月婷婷综合| 久久这里99| 天天做夜夜爽| 久久99婷婷| 嫩草AV久久伊人妇女超级A| 666555。COm毛片| 国产高潮白浆一区二区| 婷婷五月丁香色综合| 久久婷婷六月综合| 九月婷婷综合八月丁香在线观看| 欧美另类五月激情| 99热99热在线| 婷婷中文在线| 日本猛少妇色XXXXX猛叫| 91久女| 狠狠干综合网| 丁香女人五月天| 精品草原久久视频| 玖玖婷婷色五月| www色婷婷| 嘿嘿视频免费看9| 91视频一起草| 丁香亚洲婷婷五月| 五月婷婷官网色| 亚洲AV免费在线| 成人国产欧美大片一区| 国精产品一区二区三区| 欧美成人AAA片一区国产精品| 天天爱天天操| 99热人人操人人操| 97视频久久| 国产Va视频| 丁婷婷五月天在线播放| 26uuu| 逼特逼在线免费播放| 伊人五月综合网| 色五月婷婷激情综合网| 天天狠狠干| 99热综合网| 99视频日韩| 九九色综合| 亚洲国产va| 人人摸人人摸| 9l视频自拍九色9l黑人| 99久久精彩视频。| 日本五月天婷婷丁香| 91狠狠色丁香婷婷综合久久精品| 色婷婷啪啪| 五月丁香婷色| 国产精品视频免费看| 热91久| 五月婷婷久久久| www.开心激情| 91色婷婷综合久久中文字幕二区| 久久99日本精品视频免费观看| 久久综合激情五月天| 婷婷五月免费视频| 人妻AV在线| 五月天久久色| 婷婷涩五月| 男人的天堂在线婷婷| 天天爽成人综合网站| h在线看免费版在线看| 激情色情五月天| 久久婷婷综合五月天| 97成人超碰免| 99热最新网址| 亚洲精品视频在线| 九九色综合网| 可以看的AV网站| 欧美情色一区| 婷婷五月花免费视频在线| 六月色播| 婷婷五月激情五月丁香五月| 色色亚卅| 九九AV| 亚洲小视频免费播放| 天堂五月婷婷| 欲色人妻| www.五月激情红色| 激情综合一| 97人人操在线| 色色色色色色色色色色色色色97| 日本综合九九| 欧美一区二区三区不卡影视| A久久| 天天色播| 操碰99| 外国碰视频网站97| 成人丁香五月天Av| 激情婷婷综合网| 色播五月婷婷五月| 久久男人网婷婷| 五月天激情日色在线| 99噜噜噜在线播放| 色综合久久88色综合天天人守婷| 色色色网站| 激情五月婷婷免费视频| 夜夜爽天天干| 俺也去在线久久精品23欧美综合视频网站,丰满人妻一区二区三区在线视频53,丰满 | 久久XX日本综合| 日本熟女一区二区| 激情98色婷婷五| 久久这里只有精品无码| 国产日产亚系列精品版优势 | 99精品亚洲| 婷婷狠狠狠爱| 激情五月天社区| 色婷婷91| 五月综合丁香婷婷| 激情四射网| 超碰99在线| 秋霞三级色戒| 亚洲日韩一页精品发布| 色婷五月丁香久亚洲| 九九99精品免费播放|