色五月色开心色婷婷色丁香,五月婷婷丁香花综合网,婷婷丁香五月激情综合在线,五月婷婷六月丁香动漫,婷婷丁香五月激情综合在线,丁香花中文字幕在线观看,播五月色五月开心五月网,开心激情综合网,狠狠色丁香婷婷综合最新地址,丁香视频在线观看,狠狠做六月爱婷婷综合av,久久激情五月丁香伊人

ARTICLE DETAIL

資訊詳情

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

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

i.MX6ULL Linux驅(qū)動開發(fā):Platform總線設(shè)備與驅(qū)動匹配機制全解析 做i.MX6ULL的Linux驅(qū)動開發(fā)很多人第一次接觸Platform總線時都是一頭霧水明明照著教程寫完了一個platform_driverinsmod也成功了但probe函數(shù)就是不執(zhí)行設(shè)備號也申請不到折騰一整天最后發(fā)現(xiàn)是設(shè)備樹里compatible字段和驅(qū)動里的of_match_table沒有對上。這個坑我踩過帶過的不少新同事也踩過所以我想把i.MX6ULL平臺下這套設(shè)備與驅(qū)動匹配機制徹底講透從內(nèi)核為什么要搞Platform這一套東西到匹配流程內(nèi)部到底發(fā)生了什么事再到怎么自己寫一個能被正常probe的驅(qū)動、怎么排查匹配失敗的問題一次說清楚。這篇文章適合正在學(xué)嵌入式Linux驅(qū)動開發(fā)、尤其是用i.MX6ULL或者類似Cortex-A7核心板做項目的朋友閱讀不管你是剛看完字符設(shè)備驅(qū)動、準(zhǔn)備往設(shè)備樹和Platform模型過渡還是已經(jīng)寫了不少驅(qū)動但一直沒認真搞明白匹配原理都能從里面得到能直接拿去用的東西。1. 先搞清楚Platform機制到底解決了什么問題1.1 早期字符設(shè)備驅(qū)動寫法為什么撐不住了咱們先把時間拉回到Linux 2.6之前。早期寫驅(qū)動最常見的方式就是把板子上的硬件資源寫死在驅(qū)動代碼里。比如你要操作一個LED對應(yīng)的GPIO寄存器直接在驅(qū)動里硬編碼物理地址ioremap之后對著寄存器地址寫值如果要注冊一個中斷也是直接寫死中斷號。這種方式在嵌入式開發(fā)早期確實簡單粗暴能用但問題很快就暴露出來了。首先是資源沖突。同一個芯片可能被用在幾十種板卡上A板子LED接在GPIO1_IO03B板子LED接在GPIO1_IO05同一份驅(qū)動代碼在兩塊板子上就沒法通用。其次是設(shè)備變更帶來的維護地獄硬件工程師說改一下引腳連接驅(qū)動開發(fā)就得跟著改源碼重新編譯版本管理一混亂哪天改錯了哪個地址排查起來極其痛苦。這就引出了Linux設(shè)備模型里最重要的思路驅(qū)動是驅(qū)動設(shè)備是設(shè)備兩者分開維護通過一種統(tǒng)一的機制在運行時完成匹配和綁定。驅(qū)動只負責(zé)描述“我能操作什么類型的外設(shè)、怎么操作”設(shè)備則描述“這塊板子上實際有哪些外設(shè)、外設(shè)的資源寄存器地址、中斷號、GPIO等在哪里”。誰也不要寫死誰。1.2 總線、設(shè)備、驅(qū)動三角色如何分工Linux為了解決上面的問題抽象出了總線bus、設(shè)備device、驅(qū)動driver三個角色。PCI設(shè)備有PCI總線USB設(shè)備有USB總線它們都是真實存在的物理總線設(shè)備和驅(qū)動都掛在這種總線上由總線子系統(tǒng)負責(zé)匹配。問題來了SoC內(nèi)部的很多外設(shè)控制器比如I2C控制器、SPI控制器、UART、GPIO控制器、以太網(wǎng)MAC它們并不是掛在PCI或者USB這種物理枚舉總線上面的。系統(tǒng)啟動時這些設(shè)備是固定存在的不需要像USB設(shè)備那樣去掃描發(fā)現(xiàn)。為了讓這些“天生就存在”的片上外設(shè)也能套用總線-設(shè)備-驅(qū)動模型內(nèi)核提供了一個虛擬總線叫platform_bus也就是咱們常說的Platform總線。Platform總線上掛的“設(shè)備”叫platform_device可以是芯片內(nèi)部集成的外設(shè)控制器也可以是指定為platform_device的外部設(shè)備。在Device Tree設(shè)備樹普及之后內(nèi)核在啟動階段會解析設(shè)備樹把其中匹配到的節(jié)點一個一個轉(zhuǎn)換成platform_device掛到platform總線上。驅(qū)動這邊只要你寫的是platform_driver注冊時就會掛到同一條虛擬總線上。總線負責(zé)撮合新來了一個platform_device總線就去看看現(xiàn)有的platform_driver有沒有能匹配上它的新注冊了一個platform_driver總線又會反過來掃描現(xiàn)有的platform_device。一旦匹配成功總線就會調(diào)用driver里的probe函數(shù)把設(shè)備相關(guān)的資源信息交給你你的驅(qū)動從這一刻才開始真正初始化硬件。1.3 i.MX6ULL上哪些資源依賴這套機制i.MX6ULL是NXP基于Cortex-A7內(nèi)核設(shè)計的低功耗應(yīng)用處理器內(nèi)部集成了大量的外設(shè)控制器??梢赃@么說除了內(nèi)存控制器等極少數(shù)基礎(chǔ)組件芯片上幾乎你能用到的所有外設(shè)控制器在Linux內(nèi)核里都是以platform_device的形式存在或者由設(shè)備樹節(jié)點轉(zhuǎn)換而來的。舉個例子你就會明白設(shè)備樹里經(jīng)??吹筋愃七@樣的節(jié)點i2c1 { clock-frequency 100000; pinctrl-names default; pinctrl-0 pinctrl_i2c1; status okay; };這個i2c1節(jié)點在內(nèi)核啟動階段會被轉(zhuǎn)換成platform_device然后去匹配I2C控制器驅(qū)動里的platform_driver匹配成功進入probe之后驅(qū)動才會去初始化i2c適配器、注冊i2c總線。之后再發(fā)現(xiàn)掛在這條i2c總線上的客戶端設(shè)備就又是另一套i2c_client的匹配邏輯了。搞懂這個流程你就能明白為什么很多時候我們給某個外設(shè)控制器寫驅(qū)動第一個函數(shù)入口不是file_operations里的open/release而是probe函數(shù)。因為你的驅(qū)動首先要被“系統(tǒng)認識”通過Platform匹配機制綁定到對應(yīng)設(shè)備上才有資格去操作硬件資源。2. 匹配機制全解析一條probe是怎么被叫醒的2.1 驅(qū)動和設(shè)備在什么時機相互打量一個platform_driver從注冊到它的probe被調(diào)用中間經(jīng)歷的過程非常關(guān)鍵。很多人只知道寫驅(qū)動時要注冊platform_driver但不知道probe調(diào)用的完整時機。當(dāng)你在驅(qū)動里調(diào)用platform_driver_register的時候內(nèi)核會把driver掛到platform_bus_type這根虛擬總線上然后立刻執(zhí)行一次總線對已有設(shè)備的掃描。內(nèi)核會遍歷platform bus上所有的device對每一個設(shè)備調(diào)用platform_match函數(shù)看看你的driver跟哪個設(shè)備能配對。只要找到一個配對的設(shè)備立刻執(zhí)行probe。反過來設(shè)備是怎么來的有兩種常見來源。傳統(tǒng)方式是通過platform_device_register主動注冊平臺代碼里構(gòu)造platform_device結(jié)構(gòu)體然后塞給內(nèi)核這在老內(nèi)核或者不使用設(shè)備樹的場景中很常見?,F(xiàn)在的主流方式則是設(shè)備樹內(nèi)核在啟動時用of_platform_default_populate_init遍歷設(shè)備樹根節(jié)點下的所有節(jié)點把 compatible 屬性匹配的節(jié)點變成platform_device隨后掃描驅(qū)動列表完成匹配。所以probe被調(diào)用的時機其實有兩種典型場景如果你先加載驅(qū)動后注冊設(shè)備比如設(shè)備樹節(jié)點本來就在但驅(qū)動是后面insmod的那么在platform_driver_register內(nèi)部掃描設(shè)備時就會觸發(fā)probe。如果設(shè)備在你驅(qū)動的probe執(zhí)行過程中又創(chuàng)建了子設(shè)備比如MFD多功能設(shè)備驅(qū)動創(chuàng)建子平臺設(shè)備那是設(shè)備注冊時反向掃描驅(qū)動觸發(fā)probe。理解這個雙向掃描邏輯后面排查“為什么probe沒跑”時就能有個清晰的方向到底是設(shè)備始終沒被創(chuàng)建還是設(shè)備與驅(qū)動的匹配條件不滿足。2.2 內(nèi)核源碼里platform_match的匹配順序要真正理解匹配機制不能只看概念我建議你打開內(nèi)核源碼里drivers/base/platform.c找到platform_match函數(shù)。不同內(nèi)核版本可能會有細微差別但核心邏輯基本穩(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. 嘗試設(shè)備樹匹配 */ 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. 嘗試驅(qū)動名字與設(shè)備名字直接匹配 */ return (strcmp(pdev-name, drv-name) 0); }需要注意的是在沒有使能ACPI的嵌入式ARM平臺上第二步通常不會生效關(guān)鍵的匹配路徑就是設(shè)備樹compatible匹配、id_table匹配和名字匹配三路。最初級的匹配方法是驅(qū)動程序名和設(shè)備名相同。早期platform驅(qū)動在driver結(jié)構(gòu)體和platform_device結(jié)構(gòu)體的name字段直接保持一致即可。這種匹配路線現(xiàn)在仍然存在但更多是兜底邏輯。設(shè)備樹普及之后絕大多數(shù)場景走的是第一條of_driver_match_device。設(shè)備樹匹配的核心是compatible屬性。設(shè)備樹里的每個節(jié)點只要是代表一個真實的設(shè)備基本都要寫compatible屬性。比如某個外設(shè)節(jié)點長得這樣mydevice: mydevice020c406c { compatible myvendor,mydevice; reg 0x020c406c 0x4; ... };驅(qū)動側(cè)就要在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);匹配時內(nèi)核拿設(shè)備樹節(jié)點的compatible屬性字符串和of_match_table數(shù)組里所有compatible字段逐一比較只要有一個相等就算匹配成功。2.3 of_device_id里藏的小秘密data指針很多基礎(chǔ)教程在講of_device_id時只強調(diào)compatible字段必須對齊卻忽略了一個很實用的字段data。我在這兒重點說一下。of_device_id結(jié)構(gòu)體的data成員是一個void指針用于在驅(qū)動側(cè)攜帶與某個compatible關(guān)聯(lián)的私有數(shù)據(jù)。比如同一顆芯片上可能有多個功能相近但寄存器細節(jié)不同的IP核驅(qū)動里可以共用同一個probe函數(shù)但在of_device_id里通過data來區(qū)分IP版本probe時用of_match_device取出當(dāng)前匹配到的of_device_id然后強轉(zhuǎn)data拿到不同的硬件信息。我給你一個實際場景。假設(shè)板子上有兩個LED控制器一個老版本寄存器地址偏移不同一個新版本兩者的compatible分別是“myvendor,led-v1”和“myvendor,led-v2”。如果用兩套of_match_table分別寫兩個驅(qū)動顯然很蠢。更聰明的做法是一個驅(qū)動of_match_table里放兩個條目data分別指向不同的led_hw_cfg結(jié)構(gòu)體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官方內(nèi)核以及很多主流驅(qū)動里都能看到做好之后板級差異就被壓縮到一個結(jié)構(gòu)體數(shù)據(jù)里驅(qū)動代碼的復(fù)用性明顯提升。2.4 匹配成功后內(nèi)核額外做的幾件事匹配成功后內(nèi)核會自動補齊一些基礎(chǔ)信息接著才會調(diào)用你的probe。首先是dev_set_drvdata一類內(nèi)部關(guān)聯(lián)操作讓設(shè)備與驅(qū)動之間建立關(guān)聯(lián)之后你在probe內(nèi)部用的dev_get_drvdata才有效。其次是sysfs文件系統(tǒng)視角下/sys/bus/platform/devices目錄下的設(shè)備會出現(xiàn)一個driver符號鏈接指向/sys/bus/platform/drivers下面你的驅(qū)動目錄。還有一點很多剛?cè)腴T的新人會困惑為什么probe里已經(jīng)用misc_register注冊了字符設(shè)備但insmod之后/dev下并沒有立刻出現(xiàn)對應(yīng)節(jié)點這跟Platform匹配機制無關(guān)但發(fā)生場景經(jīng)常重合。insmod執(zhí)行后probe成功調(diào)用了設(shè)備注冊動作在probe里也完成了但用戶空間的udev或者mdev嵌入式環(huán)境常用busybox mdev需要在收到uevent事件后去創(chuàng)建/dev節(jié)點。如果你的系統(tǒng)里沒有配置udev/mdev自動處理那/dev下確實不會自動出現(xiàn)設(shè)備節(jié)點。這一點在之后的調(diào)試過程中非常常見別把板子本身的問題和匹配機制混為一談。另外如果設(shè)備節(jié)點被設(shè)置為status disabled那么內(nèi)核掃描設(shè)備樹時一般不會為該節(jié)點創(chuàng)建platform_device。注意是“一般不會”。有些場合下節(jié)點會被創(chuàng)建但驅(qū)動會被禁止綁定具體取決于內(nèi)核的配置。在i.MX6ULL這種主流BSP中disabled節(jié)點基本不會生成platform_device因此你的驅(qū)動永遠得不到probe的機會。這是一個非常隱蔽的坑后面排查部分我會專門提到。3. 在i.MX6ULL上實操寫一個能匹配上的Platform驅(qū)動3.1 環(huán)境準(zhǔn)備與基礎(chǔ)工程建議咱們動手寫一個完整的Platform驅(qū)動別空談理論。我用的是i.MX6ULL開發(fā)板內(nèi)核版本以4.1.15或者4.9.x為主這也是目前市面上不少i.MX6ULL開發(fā)板BSP的常見內(nèi)核版本。交叉編譯工具鏈一般是arm-linux-gnueabihf-根據(jù)你自己開發(fā)板配套的SDK來定。寫驅(qū)動之前我建議先確認三件事內(nèi)核源碼目錄已經(jīng)準(zhǔn)備好并且編譯過一遍生成了Module.symvers。開發(fā)板內(nèi)核里設(shè)備樹已經(jīng)支持你將要修改的節(jié)點或者你知道怎么把新的dtb燒進去。板子上的文件系統(tǒng)能夠加載內(nèi)核模塊比如insmod/modprobe命令可用。寫驅(qū)動文件之前先在板子上執(zhí)行下面這條命令看看當(dāng)前系統(tǒng)里platform設(shè)備的大致情況ls /sys/bus/platform/devices/你會看到很多設(shè)備比如soc、1001000.uart、2000000.spi之類名字一般是“寄存器地址.設(shè)備名”的格式這些就是內(nèi)核從設(shè)備樹里解析出來后掛到platform總線上的設(shè)備。等下咱們自己通過設(shè)備樹創(chuàng)建的設(shè)備也會以類似的形式出現(xiàn)在這個目錄。3.2 設(shè)備樹中定義自己的平臺設(shè)備節(jié)點我們的目標(biāo)是創(chuàng)建一個叫“myled”的平臺設(shè)備然后讓驅(qū)動程序通過compatible匹配到它進入probe最后操作一個GPIO點燈。你需要在設(shè)備樹源文件里找到根節(jié)點或者合適的父節(jié)點添加以下這個節(jié)點。很多i.MX6ULL開發(fā)板的設(shè)備樹頂層是板級dts文件如imx6ull-14x14-evk.dts里面有根節(jié)點“/”往根節(jié)點里加就行了。有些為了方便管理會放在根節(jié)點的某個子節(jié)點中只要能被內(nèi)核正常解析到就行放在根下最直觀。/ { myled { compatible myvendor,myled; pinctrl-names default; pinctrl-0 pinctrl_myled; led-gpio gpio1 3 GPIO_ACTIVE_LOW; status okay; }; };注意這個節(jié)點里我引用了pinctrl_myled你必須在設(shè)備樹里對應(yīng)的iomuxc節(jié)點下添加這個引腳復(fù)用配置。以i.MX6ULL為例通常在設(shè)備樹中可以找到類似這么一段iomuxc { pinctrl_myled: myledgrp { fsl,pins MX6UL_PAD_GPIO1_IO03__GPIO1_IO03 0x10b0 ; }; };引腳的宏定義MX6UL_PAD_GPIO1_IO03__GPIO1_IO03在設(shè)備樹頭文件里已經(jīng)定義好不同開發(fā)板這個宏可能不一樣具體看你的BSP設(shè)備樹。我這里只是給你一個示例實際操作時必須以自己板卡上的引腳為依據(jù)。改完設(shè)備樹之后重新編譯dtb然后燒錄或者通過tftp/nfs方式加載到板子上啟動。啟動后在板子上執(zhí)行l(wèi)s /sys/bus/platform/devices/myled如果設(shè)備樹解析正常你應(yīng)該能看到這個目錄存在。到這一步你的“平臺設(shè)備”已經(jīng)創(chuàng)建成功內(nèi)核里已經(jīng)存在一個platform_device就等著驅(qū)動來匹配了。如果看不到設(shè)備目錄優(yōu)先檢查設(shè)備樹有沒有被正確編譯加載compatible、status屬性有沒有問題。3.3 編寫Platform驅(qū)動并正確注冊接下來寫驅(qū)動。為了把注意力集中在Platform機制上我直接用一個最簡單的點燈驅(qū)動示例通過miscdevice注冊字符設(shè)備用戶程序用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);這個驅(qū)動用module_platform_driver宏完成platform_driver_register和platform_driver_unregister的封裝。加載時注冊驅(qū)動總線掃描設(shè)備后如果匹配成功probe就會被調(diào)用。3.4 編譯、加載與查看匹配效果對應(yīng)的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總線的設(shè)備與驅(qū)動綁定關(guān)系ls -l /sys/bus/platform/devices/myled/driver如果驅(qū)動已經(jīng)成功綁定這個符號鏈接會指向drivers目錄下的myled驅(qū)動。再用設(shè)備名匹配方式來驗證一下純名字匹配路徑的優(yōu)先級問題如果設(shè)備樹里沒有compatible而你的platform_device是內(nèi)核代碼直接注冊的driver結(jié)構(gòu)體里的name字段和設(shè)備name相同也可能匹配成功。這一點雖然老派在兼容舊代碼時很有用。3.5 GPIO子系統(tǒng)在Platform機制中扮演的輔助角色在剛才的驅(qū)動里我用到了devm_gpiod_get和gpiod_set_value這是內(nèi)核GPIO子系統(tǒng)提供的基于描述符的接口。你可能會疑惑這跟Platform匹配機制有什么關(guān)系關(guān)系其實不直接但屬于Platform設(shè)備操作最典型的資源獲取方式。傳統(tǒng)開發(fā)中要操作GPIO需要ioremap并配置引腳復(fù)用寄存器很繁瑣?,F(xiàn)在的推薦姿勢是在設(shè)備樹節(jié)點里通過led-gpio這樣的屬性描述“我需要哪個引腳”驅(qū)動中通過devm_gpiod_get獲取GPIO描述符。這個API能正常工作前提是你傳入了指向struct device的指針也就是platform_device里的pdev-dev。設(shè)備樹、GPIO子系統(tǒng)、Platform驅(qū)動模型這三者是緊密配合的。Platform總線匹配只是給你一個“入場券”入場之后怎么拿資源、怎么使用硬件又注冊了另一套內(nèi)核API。很多教程把這幾個維度混在一起新手就容易懵。我建議你在實驗時把這條鏈路拆開理解設(shè)備樹節(jié)點 設(shè)備說明書描述有什么資源。Platform驅(qū)動匹配 驗證“這個驅(qū)動能管這個設(shè)備”。probe函數(shù) 驅(qū)動讀取說明書實際操作資源。misc或者字符設(shè)備框架 把操作能力暴露給用戶空間。3.6 id_table匹配方式與非設(shè)備樹場景聊完設(shè)備樹方式咱們也花點時間說說id_table匹配。畢竟并非所有內(nèi)核和所有平臺都使用設(shè)備樹而老平臺代碼里大量存在platform_device_id的使用方式。如果你有一個平臺設(shè)備它不是從設(shè)備樹生成的而是通過platform_device_register注冊的例如內(nèi)核板級文件里這么寫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); }你的驅(qū)動需要通過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內(nèi)部執(zhí)行順序是先查of_match_table再查ACPI再查id_table最后才是driver name與device name直接比較。但這里有個細節(jié)如果驅(qū)動同時配置了of_match_table和id_table設(shè)備樹匹配又是首要路徑許多時候驅(qū)動作者會把compatible匹配的設(shè)備也放進id_table里主要是為了MODULE_DEVICE_TABLE生成模塊別名方便modprobe自動加載模塊。“為什么我明明把驅(qū)動編譯成模塊放到文件系統(tǒng)了modprobe能識別到模塊卻還是會找不到設(shè)備”這類問題經(jīng)常就是模塊別名機制的問題。modprobe在加載模塊前要根據(jù)設(shè)備uevent里的MODALIAS環(huán)境變量去尋找對應(yīng)的模塊MODALIAS內(nèi)容與設(shè)備樹compatible相關(guān)而模塊中通過MODULE_DEVICE_TABLE導(dǎo)出的表決定了內(nèi)核知道這個模塊能支持哪些設(shè)備。如果你只寫了of_match_table沒有同步MODULE_DEVICE_TABLE自動加載時可能就會出問題。這個知識點一般很少人講透遇到了先檢查這里不會錯。4. 匹配失敗排查與調(diào)試經(jīng)驗4.1 最常見的匹配失敗原因匹配失敗是驅(qū)動開發(fā)里最磨人的問題之一。根據(jù)我?guī)ы椖康慕?jīng)驗下面這些原因幾乎覆蓋了八成以上的失敗場景你排查時不妨按順序過一遍。compatible字符串不一致這是頭號問題。設(shè)備樹里寫著myvendor,myled驅(qū)動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然后對比驅(qū)動模塊中由of_match_table生成的模塊別名。也可以直接看/proc/device-tree下設(shè)備樹節(jié)點里的屬性是否和你期望的一致。設(shè)備樹沒過。這個問題尤其隱蔽因為很多開發(fā)板啟動時用的不是最新編譯的dtb你改了dts但忘了重新編譯或者編譯了沒有傳到板子對應(yīng)的啟動分區(qū)。排查方法很直接在板子上重新查看設(shè)備樹里你添加的節(jié)點是否存在例如ls /proc/device-tree/myled/ cat /proc/device-tree/myled/compatiblestatus屬性被設(shè)成disabled。如前所述disabled狀態(tài)可能導(dǎo)致platform_device根本不創(chuàng)建。檢查節(jié)點status是否為okay或者干脆去掉status屬性。有些BSP中特定父節(jié)點下的status控制邏輯還會有差異需要具體問題具體分析但第一懷疑對象一定是這里。pinctrl配置出錯。節(jié)點里的pinctrl-0引用了不存在的pinctrl_myled節(jié)點或者引用的引腳宏跟iomuxc里實際配置不一致雖然不直接影響Platform匹配但probe里GPIO請求時會失敗導(dǎo)致probe返回錯誤碼驅(qū)動被卸載現(xiàn)象看起來跟匹配失敗一樣。排查時可以先用以下命令確認這個設(shè)備是否綁定過驅(qū)動ls -l /sys/bus/platform/devices/myled/driver如果driver鏈接存在說明匹配成功過probe里報錯的可能性更大如果不存在才說明匹配階段都沒走通。GPIO號沖突或者重復(fù)申請。i.MX6ULL的GPIO資源管理通過GPIO子系統(tǒng)完成如果你在設(shè)備樹里把同一個引腳用在兩個不同節(jié)點或者驅(qū)動里重復(fù)請求了同一個GPIOdevm_gpiod_get會返回錯誤。典型報錯是EBUSY或者EINVAL同樣會讓probe失敗。這類問題和Platform匹配本身無關(guān)但極易干擾判斷建議出現(xiàn)probe失敗時先把dmesg完整拉出來看最終錯誤碼而不是只盯著最前面的日志。拿不到寄存器資源。如果節(jié)點里聲明了reg屬性驅(qū)動用platform_get_resource和devm_ioremap_resource去獲取但寄存器地址范圍跟別的設(shè)備重疊devm_ioremap_resource也會返回錯誤。很多人在probe失敗時只看到return -EBUSY卻不會想到是物理地址資源沖突。4.2 如何快速定位匹配路徑到底走到哪一步匹配失敗時核心問題是搞清楚內(nèi)核到底在哪個環(huán)節(jié)放棄了。我常用的辦法有以下幾步第一步打開內(nèi)核的驅(qū)動調(diào)試信息。在cmdline里加上ignore_loglevel和dyndbg或者簡單點使用dmesg -n 8。由于Platform總線匹配在出錯時不一定都有日志輸出這個方法有時不夠直觀但先把日志級別放到最高沒壞處。第二步在驅(qū)動里加打印。如果你不確定自己的probe是否被調(diào)用過直接在probe入口加一條dev_info或者pr_info。很多人會嫌打印土但實際調(diào)試中這永遠是最直接有效的辦法。注意probe里返回錯誤碼時內(nèi)核會打印類似“myled: probe of myled failed with error -16”的消息看到這類log就知道驅(qū)動和設(shè)備已經(jīng)匹配成功是probe內(nèi)部處理出了問題。第三步利用sysfs節(jié)點檢查匹配狀態(tài)。這是最高效的方式# 查看設(shè)備是否綁定驅(qū)動 ls -l /sys/bus/platform/devices/myled/driver # 查看驅(qū)動的名字和它支持的設(shè)備id cat /sys/bus/platform/drivers/myled/uevent ls /sys/bus/platform/drivers/myled/如果設(shè)備下driver鏈接指向了你的驅(qū)動說明已經(jīng)綁定成功probe被調(diào)用過。如果驅(qū)動目錄完全是空的說明設(shè)備樹里根本沒有符合條件的設(shè)備或者設(shè)備的compatible和你驅(qū)動里的of_match_table不一致。走到這一步匹配路徑基本就能定位出來。第四步抓總線級調(diào)試日志。內(nèi)核的驅(qū)動模型在drivers/base/dd.c里提供了許多調(diào)試信息輸出需要把CONFIG_DEBUG_DRIVER打開編譯內(nèi)核時啟用這個選項然后dmesg里會出現(xiàn)“matched device”之類的日志。這類信息量很大但如果你懷疑是匹配邏輯本身出了問題它是最權(quán)威的排查工具。4.3 一個真實的踩坑案例設(shè)備樹改名引發(fā)的詭異問題我之前在一個項目里調(diào)試一款外設(shè)驅(qū)動遇到過一個特別迷惑的現(xiàn)象驅(qū)動模塊加載沒報錯但probe就是不執(zhí)行。設(shè)備樹節(jié)點添加到dts里了也確認過dtb燒錄成功/sys/bus/platform/devices目錄下能看到設(shè)備的目錄名字也跟我預(yù)期的一樣。按照常規(guī)排查compatible我也對比過兩者看起來一模一樣。最后我實在沒辦法把兩個字符串逐個字符用十六進制打了出來這才發(fā)現(xiàn)問題設(shè)備樹里寫了“myvendor,my-led”但驅(qū)動里of_device_id寫的是“myvendor,myled”中間少了一個連字符“-”肉眼看久了確實很難發(fā)現(xiàn)。這就是為什么我強烈建議用uevent里的MODALIAS字段做嚴格比對而不是憑肉眼去檢查dts和代碼。還有一次是同事反饋說insmod之后probe沒執(zhí)行我過去查看發(fā)現(xiàn)/sys/bus/platform/devices下設(shè)備目錄能看到了但內(nèi)核日志里沒有任何關(guān)于這個設(shè)備probe失敗的記錄。通過對比dtb和dts源碼才發(fā)現(xiàn)板子實際加載的dtb是一份舊的備份文件壓根沒有他改的這個節(jié)點目錄雖然能看到但那是另一份設(shè)備樹里本來就有的同名設(shè)備compatible和寄存器地址都不同。這種環(huán)境問題最容易浪費時間排查時一定先確認板子真正加載的設(shè)備樹是不是你改的那個。4.4 probe成功后卻被移除的常見原因定位到probe被調(diào)用了但執(zhí)行到一半驅(qū)動就被移除了這類問題也很典型。最常見的原因是probe返回了錯誤碼。例如我讓你看內(nèi)核在probe失敗時打印的那行信息myled: probe of myled failed with error -16這個-16對應(yīng)- EBUSY。它可能來自platform_get_resource返回NULL后你直接return -EINVAL也可能來自gpiod_get返回錯誤。需要注意的是probe一旦返回非零內(nèi)核的driver core會認為驅(qū)動綁定失敗之后會自動執(zhí)行清理操作驅(qū)動和設(shè)備會被解除關(guān)聯(lián)看起來就像模塊被卸載了一樣。所以當(dāng)dmesg里能看到probe被調(diào)用但隨后設(shè)備driver鏈接消失不要盯著Platform匹配機制看問題基本都在probe內(nèi)部邏輯里。要做的就是把probe里每一步可能的錯誤碼都打印出來確定是哪一步返回的再去排查對應(yīng)子系統(tǒng)的問題。很多人不知道一個小細節(jié)如果probe在某個子系統(tǒng)返回EPROBE_DEFER延遲探測內(nèi)核不會立刻判定失敗而是把設(shè)備掛到一個等待隊列等對應(yīng)依賴的驅(qū)動加載完成后再重新觸發(fā)probe。這在多驅(qū)動依賴場景里非常重要。在i.MX6ULL的驅(qū)動開發(fā)中如果設(shè)備樹里引用的某個時鐘或中斷控制器對應(yīng)的驅(qū)動還沒就緒你的驅(qū)動probe可能會被反復(fù)推遲執(zhí)行。dmesg里看到“deferred probe”相關(guān)的字眼別慌這是內(nèi)核的合理等待機制你需要回頭檢查自己依賴的外設(shè)驅(qū)動有沒有加載成功。4.5 使用內(nèi)核deferred probe機制多說一句EPROBE_DEFER因為我發(fā)現(xiàn)很多新手第一次遇到它都會誤判成匹配失敗。在你的probe函數(shù)中當(dāng)你請求某個資源但該資源對應(yīng)的設(shè)備驅(qū)動還沒準(zhǔn)備好時比如調(diào)用clk_get、regulator_get、gpiod_get時返回了-EPROBE_DEFER你應(yīng)該直接把這個錯誤碼原樣返回給內(nèi)核。內(nèi)核的driver core看到返回-EPROBE_DEFER會把你的設(shè)備放到一個延遲列表中后續(xù)每當(dāng)有新的driver注冊都會重新嘗試對這些設(shè)備進行綁定和probe。這個機制保證了設(shè)備之間的依賴關(guān)系可以通過“你等我一會”的方式動態(tài)解決而不是簡單在probe里死循環(huán)等待資源就緒。實際調(diào)試時你可以在內(nèi)核cmdline中添加deferred_probe_timeout2這樣系統(tǒng)啟動后如果還存在EPROBE_DEFER的設(shè)備會在超時后打印詳細信息提示你到底在等待哪個資源。這個功能在排查啟動早期驅(qū)動順序問題時幾乎是救命稻草。4.6 常見問題速查表我把上面所有問題整理成一張速查表方便你日后直接對照排查?,F(xiàn)象常見原因排查與解決方向probe完全沒有執(zhí)行compatible不匹配對比uevent的MODALIAS與of_match_tableprobe完全沒有執(zhí)行設(shè)備節(jié)點不存在或statusdisabled檢查/proc/device-tree下節(jié)點與statusprobe沒有執(zhí)行但設(shè)備目錄存在設(shè)備驅(qū)動匹配沒觸發(fā)確認驅(qū)動有沒有注冊成功查看/sys/bus/platform/driversprobe執(zhí)行后打印錯誤GPIO或寄存器資源沖突查看dmesg錯誤碼檢查pinctrl和reg地址范圍insmod后/dev節(jié)點不出現(xiàn)udev/mdev規(guī)則未配置手動mknod或配置mdev自動創(chuàng)建規(guī)則probe反復(fù)不執(zhí)行出現(xiàn)deferred probe依賴資源尚未就緒查詢相關(guān)驅(qū)動是否加載成功必要時deferred_probe_timeout模塊無法modprobe自動加載MODULE_DEVICE_TABLE缺失或alias生成異常檢查模塊的modinfo輸出與MODALIAS匹配情況這張表你保存下來遇到問題時先對號入座。別小看這些檢查項很多資深工程師排查這類問題也基本走的是這套流程只不過他們已經(jīng)把每一步都內(nèi)化成了肌肉記憶。5. 升級認知從一套機制到整個設(shè)備模型思維5.1 Platform只是Linux設(shè)備模型里的一個縮影如果你只是想在i.MX6ULL上調(diào)通一個點燈驅(qū)動其實上面4節(jié)內(nèi)容已經(jīng)足夠。但如果你想把Linux驅(qū)動的知識體系搭得更完整我建議你從Platform這套機制中跳出來思考一下它背后統(tǒng)一的Linux內(nèi)核設(shè)備模型。Platform總線設(shè)備驅(qū)動模型本質(zhì)上只是Linux通用設(shè)備模型的一個應(yīng)用。Linux內(nèi)核維護了一個設(shè)備模型的骨架包括kobject、kset、uevent、sysfs等底層設(shè)施在這個骨架上衍生出不同類型的總線。不管是platform_bus_type、i2c_bus_type、spi_bus_type還是pci_bus_type它們都有共同的語義設(shè)備注冊、驅(qū)動注冊、總線匹配、probe調(diào)用、電源管理回調(diào)等。你在這篇文章里學(xué)到的compatible匹配、driver綁定、sysfs節(jié)點檢查這些技能在后續(xù)接觸I2C客戶端驅(qū)動、SPI設(shè)備驅(qū)動時同樣適用區(qū)別只是總線類型和匹配函數(shù)不一樣。I2C設(shè)備的client與driver通過id_table或者設(shè)備樹compatible匹配SPI設(shè)備也是類似邏輯。很多講Platform總線的教程喜歡鋪陳各種概念但我覺得內(nèi)核設(shè)備模型背后的核心設(shè)計思想才是真正值得玩味的東西把易變的、板級相關(guān)的設(shè)備描述從穩(wěn)定的驅(qū)動邏輯中剝離出來。設(shè)備樹解決了設(shè)備描述“寫在哪”的問題Platform總線解決了設(shè)備與驅(qū)動“怎么見面”的問題而GPIO、時鐘、中斷等內(nèi)核子系統(tǒng)則解決了資源“怎么共享不沖突”的問題。5.2 理解匹配機制對日常開發(fā)的實際影響哪怕你已經(jīng)能熟練地照著別人的驅(qū)動模板抄代碼我也建議你花時間把匹配機制吃透。因為不理解匹配機制你在調(diào)試時會缺少一個方向感只知道代碼寫出來沒反應(yīng)抓不住“系統(tǒng)如何認識我的設(shè)備”這條主線。舉個例子。設(shè)備樹里如果出現(xiàn)這個節(jié)點uart1 { status okay; };按我們前面說的流程內(nèi)核會把uart1節(jié)點轉(zhuǎn)換成platform_device去匹配IMX6ULL的uart驅(qū)動。如果你哪天發(fā)現(xiàn)一個串口設(shè)備死活打不開第一步就應(yīng)該去確認uart1節(jié)點是否成功創(chuàng)建了platform_device然后再看uart驅(qū)動有沒有綁定到這個設(shè)備、probe有沒有執(zhí)行。理解了這套機制之后你排查硬件驅(qū)動的順序就會變得很清晰從設(shè)備樹到平臺設(shè)備再到驅(qū)動綁定最后才是驅(qū)動內(nèi)部硬件初始化的邏輯。另一個常見場景是外設(shè)的時鐘和電源管理。Platform驅(qū)動在probe里拿到設(shè)備之后往往要操作clk和regulator子系統(tǒng)比如打開外設(shè)時鐘、調(diào)節(jié)電壓。這些資源同樣可以在設(shè)備樹節(jié)點中描述。如果資源描述不正確probe里clk_prepare_enable就會失敗。你只有理解了整個鏈條才能在設(shè)備樹、驅(qū)動代碼、內(nèi)核日志三個視角之間來回切換定位問題而不是逮著compatible死磕。5.3 如何繼續(xù)深入學(xué)習(xí)Platform相關(guān)技術(shù)如果你想在這個方向上有更扎實的積累我給幾條具體建議。第一條翻內(nèi)核源碼時別只看platform.c還要看device.h、platform_device.h、of_device.h這幾個頭文件把platform_device、platform_driver、of_device_id這幾個結(jié)構(gòu)體的字段都弄明白尤其是resource結(jié)構(gòu)體理解IORESOURCE_MEM、IORESOURCE_IRQ的用法。probe里那些platform_get_resource、platform_get_irq之類的API其實都是在操作resource結(jié)構(gòu)體明白了數(shù)據(jù)結(jié)構(gòu)你再去看接口函數(shù)不會覺得它們散亂。第二條自己獨立完成一次從設(shè)備樹建節(jié)點到用戶空間應(yīng)用程序調(diào)用完整鏈路的實驗。別只抄教程看完文章后關(guān)掉網(wǎng)頁自己憑理解寫一版踩過的坑記得越牢成長越快。實驗時可以刻意制造幾個錯誤比如把compatible故意寫錯、把status設(shè)為disabled觀察probe失敗的具體表現(xiàn)然后再修正回來。這種做法比重復(fù)抄代碼有用得多。第三條條件允許的話用QEMU或者虛擬平臺去讀內(nèi)核源碼里更多總線模型的實現(xiàn)。i.MX6ULL開發(fā)板適合做真實的硬件對接但如果你想在更深層面理解Linux設(shè)備模型比如分析bus_type結(jié)構(gòu)體的match、uevent、probe回調(diào)在driver core里如何被調(diào)度一臺能編譯內(nèi)核的Linux主機配合QEMU的virt平臺調(diào)試效率可能比反復(fù)燒錄板子更高。6. 最后再分享幾個調(diào)試小技巧調(diào)試Platform驅(qū)動時有幾條經(jīng)驗我覺得很有用分享給你們。第一dmesg一定要養(yǎng)成隨手清空的習(xí)慣。開發(fā)板長期運行內(nèi)核日志緩沖區(qū)會被各種無關(guān)消息占滿容易把關(guān)鍵日志沖掉。每次insmod之前先dmesg -c把舊日志清掉加載之后再看dmesg輸出這樣probe里打印的信息一目了然不會遺漏。第二多利用sysfs少依賴暴力加打印。sysfs是內(nèi)核設(shè)備模型的實時投影/sys/bus/platform/devices目錄下的每個符號鏈接和uevent文件都是判斷設(shè)備狀態(tài)的最可靠依據(jù)。很多問題看一眼驅(qū)動鏈接、cat一下uevent就能定位完全不需要重新編譯模塊加打印。雖然加打印在調(diào)試probe內(nèi)部邏輯時仍然必要但先通過sysfs確認匹配狀態(tài)能幫你少走很多彎路。第三改設(shè)備樹之后一定要確認板子加載的是你編譯的新dtb。嵌入式開發(fā)中啟動流程各有差異有的從SD卡讀dtb有的從EMMC指定分區(qū)讀有的通過u-boot環(huán)境變量指定tftp加載。改完設(shè)備樹卻忘記更新對應(yīng)位置的dtb是我見過最頻繁的低級錯誤。調(diào)試設(shè)備樹相關(guān)問題時先在板子上執(zhí)行l(wèi)s /proc/device-tree/看看節(jié)點是否真實存在再往下排查能省掉大量無意義的工作。第四合理使用devm系列的資源管理API。我在示例驅(qū)動里大量使用了devm_kzalloc、devm_gpiod_get這些devm前綴的函數(shù)本質(zhì)上是把資源釋放的責(zé)任掛在struct device的生命周期上。probe成功之后設(shè)備與驅(qū)動解除綁定時內(nèi)核會自動幫你釋放這些資源。這能有效避免probe失敗時忘記釋放之前申請的資源導(dǎo)致的問題。不夸張地說內(nèi)核里devm系列API的出現(xiàn)讓驅(qū)動資源管理的出錯率降低了一個量級。第五也是我覺得最重要的一點不要急著一次寫完整個驅(qū)動。你可以先把probe函數(shù)只留一條打印確認匹配鏈路通順再一步步加上GPIO申請、寄存器映射、設(shè)備注冊等邏輯。每一次小步驗證都能讓問題邊界變得非常清晰。真按這種方式做大多數(shù)Platform匹配類問題在半個小時內(nèi)就能定位遠比你一股腦寫完兩百行驅(qū)動再調(diào)半天高效得多。我在實際項目里用這套方法解決過的問題不計其數(shù)甚至有時候不是i.MX6ULL平臺換成其它ARM SoC或者RISC-V芯片只要內(nèi)核還是Linux這套Platform設(shè)備與驅(qū)動匹配機制基本不會變調(diào)試思路也是相通的。這就是花時間把機制理解透的價值。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
国产2.3.4区| 久久女女| 婷婷色综合欧美日韩| 久久精品中文字幕无码l| 五月婷婷六月色| 啊好爽快点-国产一区二区三区撒尿在线-成人AV| 国模久久在线| 性爱乱伦网址| 97久精品| 一级一性爱免费视频| 狠狠久久亚洲欧美专区| 日本亚欧爱爱| 黄色大香焦1级‘′‘| 精品国产乱码久久久久久影片| 日本九九久久99| 亚洲啪啪综合?v一区综合精品区| 激情五月综合网| 99热国产精品| 九九av| 久草精品国产蜜臀 | 99久久综合| 91蜜桃传媒精品久久久一区二区| 日韩欧美字幕亚洲一区二区 | 91午夜无码| 亚洲大色堂| 狠狠久久手机视频精品| 成人老鸭窝人人在线视频| 国产日本顶级一区二区三区| www.99热| 欧美Aⅴ| 天美一二三在线观看Av| 91无码西班牙视频在线| 国产农村妇女精品1区二区| 丰满人妻一区二区三区免费 | 欧美精品三级黄片| 午夜成人福利影视| 日逼视频日本| 91劲爆| 国产精品嫩草影院午夜两性 | 久久精品高清AV| 亚洲一区亚洲天堂| 激情综合久久| 99久久99久久免费精品蜜臀| 欧美第38页| 国产精品久久久久无码Av网曝门| 欧美一品道| 国产黄色av大片网站| 国产丸一视频| 闷骚老熟女15P| 国内精品久久人妻性色av| 使劲用力艹少妇视频一区二区| 白天啪啪晚上啪啪视频| 欧洲亚洲人妻无码高清久久三区四区| 最新加勒比丝袜在线| 精品人妻一区二区三区日产乱码| 日日噜噜夜夜久久亚洲一区二区 | 一本久道久久综合狠狠爱一密臀精| 五月天婷婷色色| 不卡在线观看视频| 欧美一品道| 碰碰在线视频| 日韩av色图综合| 久久久久久久久久黄色网 | 日欧操屄视频| 东北少妇高潮zzzz| 97欧美色综合| 牛牛aV| 亚洲高潮影院| 18禁久极品美女久久哦哟呀!| av绯色| 97亚洲欧美| 少妇专区一二三四五| 日韩女模中文造逼| 九九精品无码专区免费| 国产精品乱码久久久久| 99re热| 色999人与兽| 操逼逼中文字幕| 男人天堂2030| 人澡逼| av操操不卡| 国产精品久久伊人| 中文字幕一区二区日韩网| 91热色| 精品人妻伦一二三区久久| www亚洲免费| 成人在线午夜视频一区| 91在线限制级| a网站免费观看| 久草免费福利在线播放| 色翁荡息又大又硬又粗又爽| 一区二区三| 五月天欧美色图| 97超碰逼| 中文字幕少妇色| 亚洲欧洲精品成人| 婷色五月| 无码操逼网| 亚洲色系另类精品国产| 日韩亚洲中文字幕在线| 天天弄天天操| 大香蕉在线视频15| 无码人妻丰满熟妇奶水区毛片| 女人天堂AV五区在线| 青青草日本无码| 欧美性猛交美女自慰91| 加勒比AV网| 好吊爽好吊爽在线视频,中文字幕精品一区二区日本,国产良妇出轨视频在线观看, | 十八禁网站在线| 亚洲五月丁香花狠狠干一区二区三区 | 欧美性爱日韩高清| 91人妻最真实刺激绿帽| 黄色av片三级三级三级免费看| 99热在线观看| 少妇毛片久久| 亚洲资源一区| 天天懆天天日| 色噜噜狠狠色综合日日| 好舒服视频| 精品高清牛人盗摄一区二区三区中文字幕A片免费在线观看 | 亚洲成人久久一区二区| 亚洲另类综合欧美| 久湿久久| 操逼视频色| 婷色五月| 超碰在线综合97| 午夜男女爽爽爽影院视频| 国产精品香蕉热久久新品| 色妹子A V| 色色99| 国产一区二区精品在线视频| 国产91美女视频| 伊人专区一区二区三区| 欧美性天天影视| 自拍第一页| 国产一区自拍欧美日韩| 伊色综合天堂色97| 97人人模人人爽人人| 人妻 欧美 中文| 五月天综合网| 伊人伊人LD| 视频一区二区免费在线| 久久精品一区二区三区不卡| 欧美日韩精品青青| 国产呦精品一区二区三区下载| 亚洲18禁| 久久97| 色九九九九久| 2017大香蕉| 中文字幕jul-617人妻熟女| 久久人爽| 爱av免费| 亚洲日韩乱码中文无码蜜桃臀网站| 蜜臀久久99精品| 欧美色图第一页| 久久黄黄| 亚洲 欧美 第一页 | 91九色丰满高潮| 老司机深夜18禁污污网站| 欧美黄色图片| 亚洲啪啪视频一区二区| 久久久专区| 国语国产操逼伊人AV网| 国产AV人人夜夜澡人人爽麻豆| 在线观看AV片| 97K超碰在线| 口爆综合网| 五十路六十路素人熟女| 国产风韵犹存熟妇三区| 日本大片日本一区二区免费高清 | 中国韩国明星一极片一区乱码毛片人妻熟女一区二区三区 | 嫩草影院永久在线制服丝袜| 精品一区二区人妖| 99色骚| 日韩美女操b| 综合久久99亚洲人妻中文在线| 999国产精品999| 夜夜高潮夜夜爽夜夜爱爱一区| 思思性爱| 精品人妻1237| 国产精品人人爽人人做可爱福利| 奇米四色影视777久久久| 亚洲中文字幕av| 亚洲无码com| 激情小说五月天| 中文操逼字幕| 97超碰公开| 91日日| 97最新在线播放视频| 国产97在线 | 亚洲| 台欧久久精品视频| 婷婷色在线| 男女做爰猛烈动高潮A片免费应用| 欧美91精彩| 国产美脚女优尤物在线观看| 九九Av| 性色aV一区二区三区噜噜| 国产AV人人 夜夜人人澡| 色婷婷电影网| 亚洲AV成人在线| 蜜乳AV一区| 亚洲不雅视频1区二区| 欧美人人天天网| 91丨精品丨国产丨丝袜| 97视频900| 爱干爱射网啊啊啊| 亚射在线| 国产欧美日韩精品中文| 97超碰人人操人人操| 2019亚洲男人天堂| 性性欧美| 欧美精品日韩一区二区| 亚洲av淫乱| 日韩乱伦视频| 日本最新免费韩国1区2区视频播放| 7777奇米影视久久| 久久免费精品视频免一| 色综合五月天| 综合网欧| 日本大香蕉综合网红本杳社区| 密臀在线视频| 国产第12页| 嫖老熟女A片一二三区| 日韩啪啪啪啪啪| 蜜桃中文字日产乱幕4区| 久久99999| 美女主播色欲91抠b在线播放| 九九九精品一区二区无码| 亚洲97网站| 夫妻AV网站| 韩日色费| 97人人射| 人妻少妇久久中文| av爱爱爱| 啊…啊…操我用力操我| 伊人在线大香蕉视频久久| 日逼97| 亚洲,日韩,欧美,成人播放| 亚洲aV无码成人在线观看| 中文字幕一区 二 区 三 四 五 区日 日 骚 | 91精品人| 国产 亚洲 丝袜 制服| 91xingse| 在线五区| 亚洲精美粉嫩嫩泬在线观看| 国产激情视频在线观看| 久久视频少妇美女| 亚洲欧美不卡线| www.色婷婷色综合| 国产精品无码AV网站| 亚洲骚逼少妇| 天天躁日日躁狠狠狠躁| 国产精品婬乱一级毛片彝族| 96久久久精品| 亲子敌伦对白在线播放| 天天操av懂色| 免费试看60秒| 加勒比无码一区二区三区| 国产97在线播放| 成人a大片在线观看| 久久中日麻豆| 亚洲国产婷婷在线播放| 亚洲永久永久永久永久一级一级一级精品| 精品日日人妻| 69精品少妇一区二区三区蜜桃| 亚洲乱熟女一区二区三区大香蕉| 哑洲在线| 97色婷| 日曰骚久久精品| 日韩一级片在线看| 超碰色图| 久久久久久中文字幕中文字幕最新| AV天黑人| 91在线视频免费中出| 免费精品无码一级毛片牛牛影视| 国产天天骚| 97久久超碰日韩精品| 一区二区三区四区色图| 99这里只有精品国产| 亚洲男人的天堂网| 正在播放:深夜激情大战,自带黑丝袜全力输出骚穴 | 91无遮挡| 亚洲中文字幕乱码无码一区二区| 亚洲自拍天堂| 欧美性性性| 久久色一区| 99久久久er直播网址| 色偷偷2020免费视频播放| 激情一区二区三区在线观看| 天天综合网国产| 97在线观看| 精品综合久久久久久97| 国产自产91区13区| 丁香五月影院| 日本高清_区二区三区 | 青青免费在线视频一区| 人妻喷水| 伊人伊人LD| 亚洲AV无码天美传媒一区| 中文字幕一区二区日韩网| 日韩91网站| 亚洲综合校园春色| 日韩精品99久久久久久中文字幕| 超碰免费人人| 91美女高潮| 97干在线看| 五月婷婷综合激情| 欧美性爱系列| 日韩不卡毛片Av免费高清| 国产高清视频无码在线| 欧美 亚洲 在线| 肉丝中文无码高清| 久久是精品| 不卡一区视频| 欧美成人国产精品| 很很很很操| 天美精品一区二区三区四区在线观看| 91N五十路| 久久久蜜桃一区二区三区| 欧美黄片视频在线观看免费 | 手机看片91人妻| 熟女人妻一区二区三区免费看 | 麻豆国产97在线| 五十路熟女人妻一区二区在线观看 | 日本一区二区做爱的视频| 色色网91| 欧美熟女操屄| 五月婷丁香| 东京太热男人的天堂久久久| 97精品综合久久网| 9色在线| 欧美日韩第一页| 久9视频| 五月婷婷激情| 婷婷综合激情| 日日干夜夜干| 天天摸夜夜摸| 免费成人在线熟妇网| 午夜毛片高清免费不卡| 中文熟女五十乱码在线| 青青草影视蜜久久| 青青草一区二区高清无码视频| 中文字幕色AV| 综合情欲网| 伊色久人大在线| 国产捆绑一区| 99久久e免费热视| www.av在线观看| 啊啊啊好爽快点啊啊啊嗯嗯| 91AV老熟女视频| 日本孕妇孕交| 97天天日| 日韩美女操b| 五月婷婷综合网| 后入 亚洲 美女 射| 精品亚州18| 熟女91网站| 99这里只有精品国产| 亚洲另类电影| 亚洲性图91| 国产60页| 天天色播| 欧洲精品一二三在线| 久热伊人| 日本性爰一道本| 亚洲 欧美 天天| AV老汉| 青青青在线高清视频在线一二三四区 | 六月婷婷综合| 久久久久9久久久久| 懂色aV一区二区天美传媒| 八戒午夜福利理论片| 激情看片网站| 久久久成人免费av电影| juliaann欧美丝袜办公室| 美女尤物人人操| 精品.99999| 国产精品乱码久久| 日本中文字幕在线视频| 亚洲成人妻日韩在线| 91另类| 国产亚洲禁久一区二区| 精品九九淫乱男| 少妇一级婬片免费放一级a性色.| 婷婷丁香熟妇综合网| 伊人在线大香蕉二。| 亚洲无码免费看| 91网站18在线| 久热在线精品免费观看| 99热超碰| 国产精品播放| 丰满人妻-区二区三区免费| 好湿好紧视频| 人人扣人人操| 天天久久久久久| 99操视频| 青青草国产欧美非洲黑人| 日韩精品99999| 久热一区二区| 一区二区三区四区久久视1| 2020中文在线一区二区三区| 嗯嗯啊啊好大好爽| 激情五月丁香五月| 免费精品无码一级毛片牛牛影视 | 国产亚洲精品第一最新| 亚洲中文字幕熟女少妇一区二区| 日本一本一区二区三区四区五区欧美日韩中文字幕 | 懂色av一区二区三区天美传媒| 天天性射网| 青青草玖玖爱| 国产熟女免费观看久久| 亚洲蜜臀精品视频久久| 九九精品美女高溯喷水| 翔田千里AⅤHD无码| 麻豆黄站| 青青色综合| 日本肉体xxxx裸交| 深夜福利黄片| 亚洲熟妇综合久久久久久| 久久久蜜桃一区二区三区| 久久黄片国产一区二区| 啊啊啊啊无码| 欧美97视频| 美女啊啊啊啊啊啊啊| 日韩人妻免费精品| 久久久无码视频| 尤物视频新赏网鲜网色诱网| 性色高清在线| 丝袜大香蕉| 温婉少妇玩3p| 翔田千里Av在线| 久热热| 欧美在线中M| 少妇与黑人高潮在线| 久久久97| 9l视频自拍9l九色成人| 久草视频在线视频在线视频在线观看 | 人人操人人插人人摸人人干| 欧美日韩狠狠爱| 老司机午夜福利视频一区二区| 欧美综合站| 二色av| 天天躁日日躁AAA片李宗瑞| 波多野42部无码喷潮在线观看| 欧亚日韩中文在线| 2017天天操| 91亚洲综合在线| 一本色道久久综合精品婷婷| 亚洲欧美天| 九九九九一区| 99999国产| 天天网综合| 国产精品久久久久婷婷二区次| 日韩成人色图| 久久婷婷亚洲欧| 伊人97色天使| 少妇极品熟妇人妻无码| 久久久111| 91丝袜熟女| 中文字幕人乱码中文字的预防方法 | 黑人在线91| 欧美日韩青操| 9 1超碰九色| 一二三区视频在线观看| 传媒在线观看一区二区三区| 久草新在线| 青草一区二区| 日韩一级二级三级在线不卡观看完整| 亚洲97在线观看| 久久超碰国产一区二区三区| av强奸乱轮| 日韩性爱再线视频| 久久久久成人蜜桃精品| 91视频国品一二三区| 91天天日| 国产丸一视频| 九九热国产| 亚洲一区中文精品| 91爆操视频| 日本久久精品| 又摸又舔在线观看网站| 中出91视频| 久久久人妻| 另类小说综合网| 图色综合网| 久久香蕉超碰97国产精品| www.成人无码| 1人人看人人摸人人操| 婷婷丁香五月综合| 国产天美传媒精品| 天天草天天日| 亚洲色五月| 欧美变态激情网| 亚洲av噜噜噜噜噜噜| 亚洲欧美日韩免费电影| 日产操逼| 夜精品久无码| 75大香蕉| 亚洲人妻久久| 精品久久久亚洲AV成人网站| 熟女一区二区三区| 久久成年片色大黄全免费网站| 亚州情色j区| 欧美韩日精品资源| 久久久久久久久久va| 最新加勒比丝袜在线| 无码九九| 欧美系列在线一区二区| 67914在线精品观看| 国产精品日日摸夜夜添骚逼| 日本99热| 国产日韩怡红院| 手机在线中文字幕国产| 九九热最新| 欧美日韩国产色五月综合在线| 亚洲免费成人在线高清无码视频| 日本一片一区| 视频二区美腿制服人妻欧美| 8050午夜少妇无码| 久久超碰av在线| 色哟哟511老熟女| 是还免费视频1727我| 日本无码1| 嗯嗯啊啊好大好爽| 99re免费视频精品全部| 超碰天天久久79| 人人干黄色| 91美女看B| 日本一级二级三级网站| 伊人久大| 欧美亚洲日韩人妻在线观看| 婷婷激情四射| 精品国产99| 亚洲午夜福利视频| 青青草色AV| 色婷婷成人综合| 天天干天天燥| 欧美 日韩第一性色| 亚洲一区二区精品福利| 啊啊啊无码| 在线黄色污污网站| 超碰99在线| 18禁看网站一区| 91天天美女| 亚洲黄色电影| 国产精品69久久久久孕妇欧美| 日韩欧美中文字幕搭讪巨乳美人妻视频| 色伊人91| 亚洲最大网站av| 另类图片五月天| 白丝AV网站| 91亚州日韩高清| 欧美黄片视频在线观看免费| 不卡中文字幕aⅴ在线| 久男人久久| 日少妇亚洲版| 台湾佬中文娱乐自偷自拍| 国产成人综合在线播放| 国产欧美在线观看免费观看| 97久久国产| 97色操| 久久中文字幕女同性恋一区| 韩日男人的天堂| 天天做天天爽| 国人欧美精品一区二区| 国产免a费看黄片在线| 蜜臀99久久| 不卡视频一区蜜桃视频| 天美麻豆一区二区三区| av草草在线电影| 激情婷婷丁香| 欧美综合传媒| 亚洲激情深爱文学小说网站| 日本不卡二三区| 老女人爆菊| 校园春色 男人天堂| 五月丁香六月激情综合| 中文字幕精品一区二区精品| 综合五月天| 三级色综合| 国产欧美日韩精品中文| 日韩不卡毛片Av免费高清| 青青伊人这里只有精品| 91丨熟女丨丰满熟女| 欧美综合区| 淫妻综合网| 亚洲欧美国产其他二区| 日韩人妻制服丝袜av| 国产精品香蕉热久久新品| 秋霞影音一区二区三区| 屁股久久久久久久| 欧美一级美片在线观看免费| 伊人激情五月天一区二区| 九九综合久久| 欧美另类色图片| 嗯嗯,好大,好爽,好骚| 成人网欧美风情| 九一性生活免费视频| 夜夜国自区| 日韩精品在线视频,日韩精品……| 韩国免费播放一级毛片| 国产福利小视频高清在线观看| 亚洲va综合va国产va中文| 伊人久久国产免费观看视频| 黄色大片一区二区密桃丝袜| 日本天天干天天搞一区| 97在线视频免费看| 亚洲激情综合另类男同| 免费毛片在线播放| 黄色不卡视频| 中文字幕伊人| 日韩国产精品人妻无码久久久| 国产精品不卡一区二区电影| 国产99 中文字幕日韩小视频| 大香蕉综合| 欧美人妖内射| 免费操逼视频下载| 青青操少妇| 91黄站| 欧美系列在线一区二区| 午夜性| 男人精品区| 在线人人人人人人精品超| 67914在线精品观看| 国产精品国产| 久久久久久久久一区二区三区| 欧美另类精品xxxx| 色 亚洲 91| 国产极品粉嫩馒头一线天av| 久久免费老司机精品| 91丨豆花丨熟女| 久久av色| 国产又操| 国产精品无码av在线| 不卡在线一区,精品一区二区三区中| 男人天堂免费| 国产白嫩漂亮KTV在线| 综合天天网| 亚洲国产欧美一区二区潘金莲| 一牛影视久久久一区二区三区| 神马麻豆福利院| 99热在线观看| 私人尤物在线精品不卡| 性色avv| 26uuu久久| 亚洲精品久久久久久久蜜桃臀| 好一吊区二区| 六月婷婷激情| 91中文字幕制服丝袜免费视频| 超碰人人在线| 久久久天堂| 国产伦精品免编号公布| 日本性爱视频一级| 搞中出视频在线观看| 精品黑人一区二区| 97视频免费播放| 亚熟在线| 日本高清一区二区在线| 国产精品剧情| 欧美亚洲美少妇一区二区| 国产伦乱91| 国产精品不卡一区二区三区| 大香蕉AV在线| 日本一区99| 福利在线黄片| 日韩特级毛片免费观看全集| 日韩久草| juliaann精品熟女一区| 日韩性爱视频免费在线| 亚洲激情深爱文学小说网站| 夜夜嗨一区二区| 成人乱人伦一区二区| 激情五月天校园春色网| 日产国产精品中文久久婷婷| 强奸乱伦日韩AV| 人妻熟妇一区二区三区| 亚州春色| 亚洲有码 视频一区| 久久精品国产免费观看99| 亚洲精品一二牛牛| 精品无码久久| 丝袜色综合| 另类亚洲图色| 人人澡人人爽人人精品| 久久久九九网站| 操逼片国产| 啊v在线观看视频| 97国产精品| 五月天色色网站| 亚洲情色 自拍| 家庭乱伦性爱av| 二三四区精品| 国产精品无码久久久久2028| 伊人991| 国产久久成人| 成人一区二区三区四区| 日韩欧美成人午夜福利| 久噜噜| 国产成人手机视频激情| 美女网站黄页| 亚洲图片婷婷五月天| 日影院久久婷婷夜夜网| 被体育老师抱着c到高潮| 蜜桃午夜视频一区二区 | 999久久芭蕾| 婷婷五月影院| 熟妇乱伦一区二区| 国产精品高潮久久AV| 韩国一级婬片A片无码天美 | 亚洲欧洲偷拍一区| 91人精品妻入口| 欧成人精品一区二区三区| 色婷婷九月天天综合| 富女玩鸭子一级毛片| 亚洲宅男天堂| 人妻少妇久久中文字幕一区二区 麻豆| 日韩美女久久一区二区三区| 亚洲男人久久综合天堂| 日本999精品视频| 國產尤物AV尤物在線觀看| 青青草一区二区三区四| 97一区二区蜜臀| WWW4虎| 熟妇艹鸡八| 91网站18在线| 北野未奈加勒比av| 久久欧美激情| 国产成人拍国产亚洲精品| 男人天堂东京热| 少妇熟女1区2区3区| 免费一级特黄特色大片在线观看看| 制服中出中文人人精品| 麻豆蜜桃视频在线观看| 操久久久久| 亚洲欧洲综合成人av一区| 日日日大屁股骚女人精品| 日本福利二区视频| 国产精品点击进入在线影院高清| 老汉网| 日韩美女操b| 91男女啊啊啊| 97超碰天天| 人人九九精| 天天躁日日躁狠狠躁| 亚洲一区日韩精品中文字幕| 超碰成人最新最好看| 久久伊人影院| 岛国在线一区二区三区| 亚洲 中文字幕 精品| 中文高清一区二区的| 少妇厨房愉情理伦片bd在线观看| 日日插夜夜| 激情在线青青操| 91色宗合| 伊人天堂在线| 男人天堂网址| 亚洲最大的黄色电影网站。| 91亚洲综合在线| 99热综合| 黑人综合网| 青青欧美在线| 狠狠色噜噜狠狠狠狠2018| 91美腿丝袜在线观看| 色婷婷六月丁香七月婷婷| 成熟熟女国产精品一区二区| 欧美经典一区二区三区| 国产中文日韩欧美一区二区三区人妻丝袜美腿 | 人人摸人人舔一区二区| 99色在线视频| 日韩视频小说在线观看| www.91色综合| 久久婷婷色| 成人性爱视频在线看| 久久人| 日韩成人综合网| 国产精品国产亚洲区艳妇糸列| 欧美青青草视频| www激情| 日韩有码 一区二区三区| 1024精品在线| 2020中文字幕在线| 99热99re6国产在线播放| 激情综合网激情五月天| #NAME?| 国产女人91精品嗷嗷嗷嗷| 欧美高清在线| 在线观看日韩av不卡| 蜜臀一二三区| 日韩无码成人电影| 一区二区中文| 97网址www| 久草国产在线视频| 日本高清视频xxxx| 青青草福利视频| 精品美女少妇一区二区| 精品乱子一区二区三区99| 国产剧情一区在线观看| 精品欧美А∨无码黑人大荫蒂| 欧美亚洲天堂| 欧美人妻制服| 日韩三级av片| 国产精品色约约| 亚洲揄拍网| 热久久99999| 97人人爱人人做人人乐| 一区二区首页| 欧美中文字幕一区 | 亚洲中文日韩欧美大香蕉视频| 激情抓乳插进去啪啪啪日韩| 日韩操p| 成人精品久久久午夜福利| 国产免费黄色一级大片| 2023天天操夜夜操| 亚洲一卡二卡在线免费| 中文字幕AV乱伦| 国产强奸乱伦欧美| 男女猛烈无遮掩视频免费软件| 福利视频香蕉免费一区二区在线| 99久久久无码国产精品性啊聊| 91狠狠综| 精品无码秘 人妻一区二区| 97在线观看免费视频| 尤物av网站免费在线播放| 午夜经典| 久久国产乱子伦精品免费女,网站| 亚洲欧美在线丝袜| 999999精品| 亚洲色欧美| 翔田千里爆乳巨臀无码| 欧美天天综合在线| 精品999999| 美女午夜福利免费视频| 国产老女人久久毛| 国产乱伦视频污| 欧 美 自 拍 偷 拍| 99这里只有精品国产| 性爱免费视频成人| 久久一区二区三区入口| 国产67194| 久热69九色熟妇97| 精品国产99| 亚洲日本大香蕉1| 99re黄| 日韩黄片影院| 欧美亚洲尤物久久| 六月色色| 婷婷综合视频| 亚洲永久AV无码精品秋霞| 丰满人妻一区二区中文| 美女性91| 日韩字幕一区| 亚洲性爱无码乱伦av| 日韩欧美国产高清视频| 天天日B夜夜干B时时操B| 亚洲综合网电影91| 91成人国产综合久久精品蜜月| 热热色国产一二区AV| 九久精品| 国产第12页| 91精品久久久久久77777| 熟妇人妻一区二区| 啊啊啊久久久视频| 九九九九精品| 国产操操日韩三级黄| 欧美黄页在线| 操B久久| 91精品导航| 激情小说图片亚洲首页| 国产av美女被艹的乱叫| 色女网日韩| 91综合天天看| 亚洲国产91精品一区二区久久| 一级久久久久久久久久久 | 日本成人免费一区二区三区| 日操粉逼逼| 久久久99久9| 亚洲色综网| 亚洲av性爱电影| 亚洲AV无码国产精品久久久久| 欧美大香蕉卡久久| 欧美97av| 午夜视频好爽啊| 精品91摸| 97在线日韩中文字幕| 无码高清少妇久久| 中文字幕在线免费观看视频| 97超碰色屌| 欧美综合网在线| 乱伦av.com| 九九热视频这里只有精品| 精彩久久中文| 99无码精品| 91色综| 天天情欲宗合网| 亚洲无无码αⅴ每日更新| 日本久久精品| 东北操逼| 国产成人欧美一区二区三区的国产| 亚洲男人的天堂亚洲| 91欧洲入口| 2023天天操夜夜操| 欧美有码激情视频一区二区三区| 校园春色美腿丝袜 | 在线观看无码三级少妇| 日本91白丝| 91 天天综合| 日本一级二级三级网站| 亚洲综合图色在线| 永久免费av无码网站国产app | 久久久久久99999国产精品| 翔田千里AⅤHD无码| 日韩99神马视频播放片在线播放| 欧日韩一二三f区| 乱伦AVxx| 五月天亚洲网| 中文字幕日韩人妻视频一区二区三区| 午夜福利区| 欧州一区二区三区四区| 97国产色综合| 亚洲啪啪综合?v一区综合精品区| 久久婷婷伊人| 蜜臀网 一区| 色啪网| 久热最新在线杭州| 亚洲欧洲网站免费观看| 久久久久久久久久久久久女过产乱-少妇高潮一区二区三区喷水-成人AV | 中文字幕在线观看AV| 大香蕉手机在线| 强奸乱伦大香蕉网| 精品成人女人久久| 精品久久久久av影院| 精品人妻一区二区三区夜夜| 国产亚洲性生活视频播放| 久九九九九九九热| 操国产高清| 中文字幕一区二区三区蜜臀| 午夜男女爽爽大片免费观看| 激情五月天婷婷| 欧成人精品H无码| 色综合美国| 91色狼| 欧美色图亚州激情| 在线观看一级α片刺激高潮视频| 极品粉嫩少妇视频| 牛牛操视频逼| 伊人国产视频| 操逼操逼逼操操逼91| 丝袜狠狠草尤物 91| 操逼操操操91| 综合亚洲欧美| 久久黄黄| 午夜舔阴达高潮视频免费看| 青苹果影院男人的天堂| 99久久婷婷| 蜜臀th| 五月天玖玖资源站| 理论久久婷婷网8| 五月天激情网站| 欧美男人天堂| 天天天天做夜夜夜夜做| 色情乱伦AV| 超碰99re| 亚州色交| 欧美日韩黄片精品在线| 欧亚韩国999| 婷婷亚洲综合| 久久久久久久久久va| 熟女中出视频| 日韩人妻免费精品| 天美传媒AV在线播放| 亚洲图片欧美在线视频| 亚州男人天堂| 精久久久91| 强奸乱伦麻豆| 97超碰中文在线| 日韩ab网| www…国产操逼| 欧美色院| 无码人妻系列少妇| 女人双腿搬开让男人桶| 精品一区二区三区国产| 久久天天躁日日躁狠狠躁| 91艹B视频| 美女诱惑一区| 无码男人天堂| 大香蕉亚洲中文| 亚洲最新av无码成人精品区 | 日韩色图 一区二区| 九九亚洲| 日韩精品在线视频在线观看| 大香蕉淫人| 日日骚 av| 五月婷视频| 八戒午夜福利理论片| 麻豆色约约| 日韩久久超碰色| 久久老子无码午夜伦不卡| 一区二区乱码福利| 欧美亚州色的图| 亚洲一区日韩| 日韩福利综合一区| 超碰99在线| 我中文字幕6区| 国产亚洲人妻综合日韩 久久| 国产高清免费不卡av| 97资源久久| 人乳av| 久久国产对白激情浪潮 | 久久伊人东京热| 传媒免费一区二区三区| 成人精品在线观看| 欧美亚洲色图另类国产| 大香蕉欧美| 久久久久久中文| 91九九九逼| 精品国产一区二区三区av在线资源| 亞洲久久直播| 伊人久久综合影院精品久久久| 大香蕉人妻久久| 老熟妇综合| 女同在线视频一区| 久久久久9| 国产女人操逼视频| 囯戸精品高潮呻吟旡码| 婷婷操视频| 深夜视频| AV女资源| 亚洲做性| 风月影院男女十八禁| 狠狠图片青青草| 国产成人网址| 福利色色| AV无码久久久精品| 天天色,天天干,天天干| 在线人成亚洲视频免费观看| 91色拍| 色综合91好| 中文字幕人妻丝袜乱一区三区| 色悠久久久av| 久久久精品一区二区| 超碰地址97| 人妻在线大香蕉| 成人十八禁日韩欧美一二三| 天天爽天天爽| 骚逼高潮久久精品| 欧美在线视频99| 亚洲国产日韩欧美熟妇在线| 欧美一区二区三区日韩| 九九热久久99精品re| 久久久99免费| 午夜激情成人在线观看| 好吊色综合| 91天堂网| 九九九久久久| 国产精品一区二区麻豆| 2020中文字幕在线| 一级免费精品| 久久老熟女| 精品人妻一区二区三区免费视频| 欧美色图99| 欧洲精品一级二级精品综合视频综合 | 亚欧免费| 嫩草影院性色| 国产1769在线| 超碰AV在线| 亚洲综合97中文网| 久久国产99精品72福利| 亚洲综合113页| 亚洲另类久操网| 四虎永久在线精品免费网址 | 91狠狠综合久久| 天天干夜夜操一区二区| 久久久久久九九九九九| 久久精品久久久久久久| 日本加勒比无码专区| 国产精品久久久久久亚洲色欲| 在线中文字幕| 亚洲免费成人在线高清无码视频| 蜜桃视频成a人v在线| 国产一级作爱毛片| 六月天婷婷| 日本三级日本三级三级人妇四虎| 91色五月俺来也| 色天堂综合| 国产超碰国产97| 丝袜夫妻自拍| 久久亚码| 啊嗯嗯啊好大好爽| 欧美亚洲首页| 国产无码久久高清| 偷拍三区| 337p大胆噜噜噜噜噜91Av| 国产精品交换一区二区| 欧美亚洲性爱一区二区| 91影视亚洲| JuliaAnnXXX888| 91精品人| 久久精品国产亚洲AV无码电影| 亚洲国产麻豆一区二区三区| 99操99| 伊人网在线观看| 99抽插| 久久久555| 少妇一级婬片免费放一级a性色.| 久久精品店| 看日韩美女二区三区免费操逼视频 | 色香综合| 黑人精品XXX一区一二区| 亚洲午夜福利在线影院| 久久久久久人妻| 高潮综合网| 日韩内| 日日操免费视频| a网站免费观看| 18岁禁 茉莉成人久久| 亚洲区小说| 久综合国内精品自在自线| 久热婷婷| 最新精品久久蜜桃| 久久久久久999| 岛国黄色短视频| 亚洲欧洲偷拍一区| 青操影院| 秋霞免费无码视频日韩A片| 人妻中文字幕精品无码| 久7色| 国产亚洲色婷婷99精品91| 精品传媒在线一区| 乳欲人妻办公室奶水| 日韩人妻大香蕉| 熟妇无码视频三区| 国产日韩精品suv| 日韩在线观看中文字幕视频| 日韩情色AV| 欧美最婬乱婬爆婬牲视频| 无码操逼视频一下| 亚洲欧洲偷拍一区| 一本久久久精品| 超碰成人公开| 91撸色网 玖玖网 欧美| 91bbb| 一级免费啪啪片| 欧美亚洲厕所精品偷拍91| 日韩成年人性爱视频| 亚洲天堂99| 激情四射熟女丝袜| 亚洲色婷婷久久91| 毛片麻豆91糖心精品毛情片| 超碰91在线| 亚洲日韩精品在线播放| 天天插夜夜爽| 色九久| 日本三级A片网站com| 强上我不卡卡| 91老熟女视频| 成人八戒网站| 综合久久99亚洲人妻中文在线| 人人操人人爽人人操人人| 日本天天操| 91网站18在线|