日韩精品一区二区三区在线视频放-无码中文字幕V?一区二区-成年片免费观看视频-国内少妇人妻丰满av-国产精品中文字幕免费观看-亚洲成人久久一区二区三区-国内少妇偷人精品视频无缓冲-一区二区国产精品日本一区二区三区在线网

ARTICLE DETAIL

資訊詳情

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

嵌入式Linux驅(qū)動開發(fā):從MFD到syscon與regmap的底層機制

嵌入式Linux驅(qū)動開發(fā):從MFD到syscon與regmap的底層機制 1. 一個物理設(shè)備為什么要拆成一群驅(qū)動MFD的出現(xiàn)邏輯1.1 單驅(qū)動時代的維護噩夢做嵌入式Linux驅(qū)動開發(fā)的人十有八九會遇到這樣一種芯片一顆芯片里既有ADC又有GPIO還帶兩路LDO、一個看門狗和一個復(fù)位控制器。我最早接手這種項目時習(xí)慣性地在一個驅(qū)動文件里把這些功能全寫了結(jié)果probe函數(shù)長得像流水賬IRQ處理里塞滿了各種功能的判斷IOCTL滿天飛。后來同事想單獨復(fù)用里面的GPIO驅(qū)動幾乎要連鍋端光是拆文件就拆了兩天。這種芯片在嵌入式領(lǐng)域太常見了PMIC、SoC內(nèi)部的混合信號模塊、外掛的編解碼器都是典型的一個物理設(shè)備多類功能形態(tài)。如果不做拆分直接的痛點有四個功能耦合ADC讀到一半GPIO來了中斷兩個邏輯互相干擾出問題很難定位。復(fù)用困難換一塊主控想保留其中一路regulator的邏輯根本沒法單獨搬走。生命周期混亂一個probe里要初始化多個子系統(tǒng)任何一個失敗都會拖垮全部功能。代碼結(jié)構(gòu)失控維護半年后沒人敢動這個文件改動一處影響全局。所以Linux內(nèi)核才搞出了MFDMulti-Functional Device子系統(tǒng)。它的核心思想很簡單把一個物理設(shè)備通過虛擬總線拆分成多個平臺設(shè)備每個設(shè)備專職做一類事。這樣ADC驅(qū)動只管ADCregulator驅(qū)動只管穩(wěn)壓GPIO驅(qū)動只管引腳各干各的最后通過資源描述把共享的中斷、寄存器配置傳遞下去。1.2 MFD做了一件什么事mfd_cell與子設(shè)備注冊MFD的使用模式看一眼代碼就明白了。主設(shè)備驅(qū)動在probe階段做基礎(chǔ)初始化然后構(gòu)造一個mfd_cell數(shù)組里面描述每個子功能模塊的名字、資源、設(shè)備樹compatible等最后調(diào)用devm_mfd_add_devices()一次性把這些cell注冊成平臺設(shè)備。static const struct mfd_cell my_pmic_devs[] { { .name my-pmic-adc, .of_compatible vendor,my-pmic-adc, .num_resources 1, .resources adc_resources, }, { .name my-pmic-gpio, .of_compatible vendor,my-pmic-gpio, .num_resources 1, .resources gpio_resources, }, };主驅(qū)動的probe短很多static int my_pmic_probe(struct platform_device *pdev) { struct regmap *regmap; int irq; regmap devm_regmap_init_i2c(to_i2c_client(pdev-dev), config); if (IS_ERR(regmap)) return PTR_ERR(regmap); irq platform_get_irq(pdev, 0); if (irq 0) return irq; /* 注冊中斷控制器 */ ret devm_regmap_add_irq_chip(pdev-dev, regmap, irq, IRQF_ONESHOT, 0, irq_chip, irq_data); if (ret) return ret; return devm_mfd_add_devices(pdev-dev, PLATFORM_DEVID_NONE, my_pmic_devs, ARRAY_SIZE(my_pmic_devs), NULL, 0, NULL); }每個子模塊的驅(qū)動寫法和普通platform驅(qū)動完全一樣自己注冊一個platform_driver匹配子節(jié)點compatible后在probe里通過platform_get_resource()拿到寄存器地址或中斷號。MFD負(fù)責(zé)的只是生出這些子設(shè)備子設(shè)備完全不知道父設(shè)備的內(nèi)部實現(xiàn)。這樣設(shè)計還有一個隱藏好處很多PMIC可以直接復(fù)用內(nèi)核里現(xiàn)成的子驅(qū)動比如regulator框架下的regmap_regulator驅(qū)動、GPIO框架下的gpio-regmap驅(qū)動只要MFD把regmap和中斷域傳遞正確幾乎不用新寫驅(qū)動代碼。如果覺得這些概念抽象可以把MFD想象成物業(yè)公司一棟大樓物理芯片有很多房間子功能物業(yè)統(tǒng)一負(fù)責(zé)水電寄存器映射、門禁中斷控制器各家公司子驅(qū)動租下房間后按自己的方式經(jīng)營水電出問題找物業(yè)內(nèi)部業(yè)務(wù)互不干涉。2. syscon底層到底藏了什么regmap的誕生和解剖2.1 syscon是“系統(tǒng)控制寄存器區(qū)的統(tǒng)管者”說完MFD再來看syscon。這兩個東西出現(xiàn)頻率一樣高但解決的問題完全不同。SoC里經(jīng)常存在這樣一段寄存器區(qū)域它既不屬于某個標(biāo)準(zhǔn)外設(shè)也不歸某個驅(qū)動獨占而是一堆雜七雜八的控制位混在一起。比如0x1000處是某個外設(shè)的軟復(fù)位寄存器0x1004處是睡眠喚醒使能0x1008處又變成了另一個外設(shè)的時鐘門控。傳統(tǒng)做法是每個驅(qū)動各自ioremap這段地址然后各讀各的。這樣做的后果很糟糕同一段物理內(nèi)存被映射了好幾份虛擬地址沒有統(tǒng)一緩存機制也沒法用內(nèi)核的調(diào)試框架統(tǒng)一查看。syscon就是來解決這個問題的。它把這堆系統(tǒng)控制寄存器抽象成一個統(tǒng)一的設(shè)備節(jié)點由內(nèi)核helper在底層創(chuàng)建一個全局共享的regmap實例。別的驅(qū)動想操作寄存器時不再自己ioremap而是通過syscon API去拿到這個regmap然后走regmap的讀寫接口??吹竭@里你應(yīng)該明白了syscon本身不是一個功能驅(qū)動它更像一個寄存器倉庫管理員。誰需要用這段寄存器就到倉庫管理員那里登記一下領(lǐng)一把鑰匙struct regmap *用完了歸還。倉庫內(nèi)部用什么方式管理貨架、怎么做緩存、怎么加鎖調(diào)用者不需要關(guān)心。2.2 regmap不是簡單的read/write套殼很多初學(xué)者把regmap理解成封裝了read/write函數(shù)的寄存器操作工具這個理解沒錯但低估了它的含金量。regmap真正的價值在于分了兩層緩存層可以配置cache_type把寄存器值緩存在內(nèi)存里避免頻繁訪問慢速總線比如I2C。物理層通過regmap_config里注冊的reg_read、reg_write函數(shù)指針對接實際總線可以是MMIO、I2C、SPI甚至可以是自定義的回調(diào)。static const struct regmap_config my_syscon_config { .reg_bits 32, .val_bits 32, .reg_stride 4, .max_register 0x3ff, .cache_type REGCACHE_RBTREE, };對于一個regmap實例幾乎所有操作都收斂成幾個通用函數(shù)regmap_read(regmap, reg, val)讀單個寄存器。regmap_write(regmap, reg, val)寫單個寄存器。regmap_update_bits(regmap, reg, mask, val)讀-改-寫保證并發(fā)安全。regmap_field_read/write操作寄存器里某個bit域不用手動移位并掩碼。syscon在底層創(chuàng)建regmap時會自動從設(shè)備樹節(jié)點的reg屬性里解析地址和長度并且根據(jù)reg-io-width屬性設(shè)置寄存器位寬一般不需要驅(qū)動開發(fā)者手動配置那些初始化參數(shù)。這也是syscon API能短小精悍的原因——它把最繁瑣的配置都干掉了。另外注意一個細(xì)節(jié)syscon創(chuàng)建的regmap默認(rèn)是沒有打開cache的。因為系統(tǒng)控制寄存器往往需要及時反映硬件狀態(tài)如果開了緩存又沒處理好失效邏輯讀到的可能是舊值。這一點在后面的設(shè)備樹坑里會詳細(xì)展開。3. MFD syscon 合體流程從probe到子設(shè)備拿到regmap3.1 一條完整的注冊鏈路MFD和syscon經(jīng)常一起出現(xiàn)因為很多MFD芯片本身就是多個功能模塊共享一大段寄存器空間的典型。它們合體后的注冊鏈路大致是這樣的內(nèi)核在設(shè)備模型初始化階段或devm_platform_iomap_resource()被調(diào)用時MFD主驅(qū)動先probe。主驅(qū)動解析設(shè)備樹找到compatible syscon的節(jié)點調(diào)用syscon_node_to_regmap()獲得統(tǒng)一regmap。主驅(qū)動用這個regmap繼續(xù)初始化芯片的基礎(chǔ)功能讀版本號、響應(yīng)軟復(fù)位、初始化中斷控制寄存器。主驅(qū)動注冊MFD的子設(shè)備通過mfd_cell或設(shè)備樹子節(jié)點把資源、中斷域傳遞下去。子驅(qū)動probe時再次通過syscon API拿到同一個regmap然后各自操作屬于自己的寄存器區(qū)間。這種設(shè)計最關(guān)鍵的一點是所有子驅(qū)動共享同一個regmap實例而不是各自創(chuàng)建一份。這樣不僅節(jié)省內(nèi)存還能保證并發(fā)安全——regmap內(nèi)部自帶了spinlock或mutex多個驅(qū)動同時讀寫同一段寄存器不會打架。以實際代碼為例。假設(shè)一個PMIC主驅(qū)動的probe里有這樣的初始化static int pmic_main_probe(struct platform_device *pdev) { struct device *dev pdev-dev; struct regmap *regmap; struct regmap_irq_chip_data *irq_data; unsigned int version; int ret; /* 通過設(shè)備樹phandle找到syscon節(jié)點對應(yīng)的regmap */ regmap syscon_regmap_lookup_by_phandle(dev-of_node, pmic,regmap); if (IS_ERR(regmap)) return PTR_ERR(regmap); /* 讀取芯片版本寄存器的bit[4:0] */ ret regmap_read(regmap, PMIC_VERSION_REG, version); if (ret) return ret; dev_info(dev, PMIC version: 0x%x\n, version 0x1f); /* 在這里注冊regmap irq chip為子設(shè)備提供中斷 */ ret devm_regmap_add_irq_chip(dev, regmap, irq, IRQF_ONESHOT, 0, pmic_irq_chip, irq_data); if (ret) return ret; /* 注冊MFD子設(shè)備 */ return devm_mfd_add_devices(dev, PLATFORM_DEVID_NONE, pmic_cells, ARRAY_SIZE(pmic_cells), NULL, 0, irq_data); }再來看子驅(qū)動側(cè)比如ADC子驅(qū)動。它的probe里不需要重復(fù)初始化regmap直接查phandle拿現(xiàn)成的regmap就行static int pmic_adc_probe(struct platform_device *pdev) { struct device *dev pdev-dev; struct regmap *regmap; regmap syscon_regmap_lookup_by_phandle(dev-of_node, syscon); if (IS_ERR(regmap)) return PTR_ERR(regmap); /* 利用regmap_field取得某個ADC轉(zhuǎn)換結(jié)果位域 */ adc_data-field devm_regmap_field_alloc(dev, regmap, adc_field_config); if (IS_ERR(adc_data-field)) return PTR_ERR(adc_data-field); return 0; }這種模式的好處顯而易見主驅(qū)動負(fù)責(zé)大而全的基礎(chǔ)工作子驅(qū)動負(fù)責(zé)小而專的業(yè)務(wù)邏輯。寄存器映射、中斷分發(fā)這些容易出錯的部分被MFD和syscon徹底封裝掉了。3.2 simple-mfd與syscon配合的設(shè)備樹解法在設(shè)備樹層面一個常見的組合是compatible syscon, simple-mfdpmic: pmic20000000 { compatible syscon, simple-mfd; reg 0x20000000 0x1000; #address-cells 1; #size-cells 1; adc0 { compatible vendor,pmic-adc; reg 0x0 0x100; interrupts 5 IRQ_TYPE_LEVEL_HIGH; /* 子驅(qū)動拿到同一顆芯片的regmap */ syscon pmic; }; gpio100 { compatible vendor,pmic-gpio; reg 0x100 0x100; gpio-controller; #gpio-cells 2; }; };這里syscon負(fù)責(zé)把這顆芯片的寄存器空間變成統(tǒng)一regmapsimple-mfd則告訴內(nèi)核這個節(jié)點下面還有子設(shè)備需要of_platform_populate()把它們都創(chuàng)建出來。兩者疊加之后一個節(jié)點同時完成了寄存器倉庫和子設(shè)備掛載兩個工作。需要提醒一下simple-mfdsyscon的寫法在內(nèi)核社區(qū)有過一些爭論。某些維護者認(rèn)為simple-mfd節(jié)點的子設(shè)備不應(yīng)該共用父節(jié)點的regmap字段而應(yīng)該通過phandle顯式傳遞。但從實際項目來看這種寫法在大量SoC平臺都工作正常只要子設(shè)備驅(qū)動里用syscon_regmap_lookup_by_phandle()明確引用父節(jié)點而不是隱式依賴就會很安全。3.3 中斷與寄存器regmap_irq_chip讓父設(shè)備更穩(wěn)定MFD芯片的另一個復(fù)雜點在中斷。一顆PMIC通常只有一個中斷輸出引腳但內(nèi)部可能掛了十幾個中斷源ADC完成中斷、過壓保護中斷、看門狗超時中斷、按鍵檢測中斷……如果這些都要子驅(qū)動各自去處理原始中斷那父設(shè)備的中斷引腳早就被搶破了。Linux內(nèi)核的regmap_irq_chip方案可以完美處理這件事。它利用regmap讀寫能力直接操作中斷狀態(tài)寄存器和屏蔽寄存器把單一物理中斷拆成多個虛擬中斷并建立一個irq domain讓子設(shè)備通過platform_get_irq()拿到屬于自己的中斷號。static const struct regmap_irq pmic_irqs[] { REGMAP_IRQ_REG(PMIC_IRQ_ADC_DONE, 0x10, BIT(0)), REGMAP_IRQ_REG(PMIC_IRQ_OVP, 0x10, BIT(1)), REGMAP_IRQ_REG(PMIC_IRQ_WDOG, 0x10, BIT(2)), }; static const struct regmap_irq_chip pmic_irq_chip { .name pmic-irq, .status_base 0x10, .mask_base 0x12, .unmask_base 0x13, .ack_base 0x11, .num_irqs ARRAY_SIZE(pmic_irqs), .irqs pmic_irqs, };實現(xiàn)這種機制之后子驅(qū)動像處理普通外設(shè)中斷一樣注冊request_threaded_irq()就可以寄存器層面的狀態(tài)判斷、中斷清除全部由regmap_irq_chip自動完成。這既簡化了子驅(qū)動又保證了中斷響應(yīng)的一致性。4. 驅(qū)動側(cè)最常用的syscon API選型與用法4.1 查找regmap的三個API對比syscon相關(guān)API里日常打交道最多的就是下面這三個API參數(shù)適用場景返回說明syscon_node_to_regmap()struct device_node *np已知節(jié)點指針直接獲取該節(jié)點對應(yīng)的regmap成功返回struct regmap *失敗返回ERR_PTRsyscon_regmap_lookup_by_compatible()const char *compatible不知道具體節(jié)點只知道compatible字符串同上syscon_regmap_lookup_by_phandle()struct device_node *np,const char *property子驅(qū)動通過設(shè)備樹屬性引用父syscon節(jié)點同上三者的關(guān)系可以用一句話概括syscon_node_to_regmap()是底層實現(xiàn)后兩個是它的封裝。實際開發(fā)中我推薦優(yōu)先使用syscon_regmap_lookup_by_phandle()因為它在設(shè)備樹里顯式聲明了依賴關(guān)系可讀性最強也方便后續(xù)維護的人一眼看出這個驅(qū)動在用哪個syscon節(jié)點。一個容易忽略的細(xì)節(jié)這幾個函數(shù)返回的都是ERR_PTR判斷失敗時一定要用IS_ERR()不能直接比較NULL。很多新手在probe里寫regmap syscon_regmap_lookup_by_phandle(np, syscon); if (!regmap) return -EINVAL;這樣寫一旦返回ERR_PTR(-EPROBE_DEFER)會被當(dāng)成成功后面繼續(xù)操作就會訪問非法指針內(nèi)核直接oops。正確的寫法是regmap syscon_regmap_lookup_by_phandle(np, syscon); if (IS_ERR(regmap)) { ret PTR_ERR(regmap); if (ret -EPROBE_DEFER) return ret; dev_err(dev, failed to get syscon regmap: %d\n, ret); return ret; }4.2 讀寫寄存器regmap_update_bits與regmap_field實操拿到regmap之后具體的寄存器操作也有講究。直接regmap_write()寫一個整值寄存器是最簡單的情況但實際項目里更多時候要求只改某個寄存器里的某幾個bit其他bit保持不變。這時候如果用read-modify-write需要自己加鎖、自己移位非常容易寫錯。regmap_update_bits()就是為這種場景準(zhǔn)備的/* 在寄存器0x20的bit[7:5]寫入新的分頻系數(shù) */ ret regmap_update_bits(regmap, 0x20, 0xe0, div 5);參數(shù)含義分別是regmap、寄存器地址、掩碼哪幾位會被改動、新值已經(jīng)左移對齊到位域上。regmap內(nèi)部會處理讀改寫和并發(fā)保護比自己手動操作可靠得多。更進(jìn)一步的方案是regmap_field。它的作用是預(yù)先描述一個位域之后操作這個位域只需要一句regmap_field_write()完全不用管移位和掩碼。static const struct reg_field version_field REG_FIELD(0x00, 0, 4); field devm_regmap_field_alloc(dev, regmap, version_field); if (IS_ERR(field)) return PTR_ERR(field); ret regmap_field_read(field, version);假如寄存器地址是0x00bit[0]到bit[4]存的是版本號用REG_FIELD(reg, lsb, msb)聲明之后regmap_field_read()讀出來的就直接是版本號數(shù)值不需要知道它在哪個bit、也不需要手動移位。平時我寫MFD子驅(qū)動凡是涉及芯片功能配置的地方都傾向用regmap_field。它還有一個好處是讓寄存器布局變得更加集中和顯眼后續(xù)查硬件手冊對照代碼時效率高很多。4.3 一個可供抄作業(yè)的例子下面用一段完整的最小示例演示子驅(qū)動里如何拿到syscon regmap并完成讀版本號更新bit域兩步典型操作static int demo_probe(struct platform_device *pdev) { struct device *dev pdev-dev; struct regmap *regmap; struct regmap_field *cfg_field; unsigned int version; int ret; regmap syscon_regmap_lookup_by_phandle(dev-of_node, syscon); if (IS_ERR(regmap)) return dev_err_probe(dev, PTR_ERR(regmap), failed to get syscon regmap\n); ret regmap_read(regmap, 0x00, version); if (ret) return ret; dev_info(dev, chip version: 0x%x\n, version); cfg_field devm_regmap_field_alloc(dev, regmap, REG_FIELD(0x20, 1, 3)); if (IS_ERR(cfg_field)) return PTR_ERR(cfg_field); /* 開啟某個功能位同時保留其他bit不變 */ ret regmap_field_write(cfg_field, 0x5); if (ret) return ret; return 0; }dev_err_probe()是內(nèi)核5.2以后比較推薦的錯誤返回方式它既能打印日志又能在-EPROBE_DEFER時靜默處理避免啟動階段刷屏。如果你維護的內(nèi)核版本較老沒有這個函數(shù)也可以自己用IS_ERR加條件判斷實現(xiàn)同樣的邏輯。5. 設(shè)備樹里容易被忽視的坑5.1 compatible的順序問題compatible屬性是有順序語義的。內(nèi)核在匹配驅(qū)動時會按順序比較第一個字符串。所以compatible syscon, simple-mfd和compatible simple-mfd, syscon效果完全不同。syscon框架在of_syscon_register()里會遍歷compatible屬性找到包含syscon的字符串才會執(zhí)行注冊邏輯。如果把simple-mfd放在前面某些內(nèi)核版本在遍歷到第一個字符串時可能不會繼續(xù)查找syscon導(dǎo)致syscon注冊失敗。正確做法是把syscon放在第一個compatible syscon, simple-mfd;這一點在文檔里經(jīng)常被忽略但在實際排障中能省下很多時間。如果你發(fā)現(xiàn)子驅(qū)動調(diào)用syscon_regmap_lookup_by_phandle()返回-EINVAL先檢查一下這個順序。5.2 reg重疊問題syscon的管理粒度是節(jié)點。兩個不同的設(shè)備樹節(jié)點即使reg指向同一段物理地址也會被syscon創(chuàng)建成兩個獨立regmap實例。這意味著同一塊寄存器可能被兩個驅(qū)動同時訪問卻沒有任何同步機制。我見過一個項目兩個模塊分別定義了syscon節(jié)點指向同一段寄存器區(qū)域各自操作自己的bit。結(jié)果A模塊寫入的數(shù)據(jù)被B模塊的緩存覆蓋問題極其隱蔽用調(diào)試器看硬件寄存器完全正常但軟件讀出來總是不對。正解是整個系統(tǒng)里同一段物理寄存器區(qū)域只允許一個syscon節(jié)點。其他模塊通過phandle引用這個唯一節(jié)點獲取regmap。所以設(shè)備樹里看到重復(fù)的syscon定義不要猶豫先合并再往下查。5.3 cache與只讀寄存器如果你在子驅(qū)動里自建regmap并打開cache會遇到一類典型問題寄存器由硬件自動更新比如中斷狀態(tài)寄存器、ADC結(jié)果寄存器但regmap緩存不會自動失效驅(qū)動讀到的永遠(yuǎn)是緩存里的舊值。syscon默認(rèn)regmap是不開cache的cache_type REGCACHE_NONE所以直接用syscon場景下這個問題不常見。但如果你在MFD主驅(qū)動里自定義了regmap且開了cache必須對硬件自動更新的寄存器做特殊處理要么在讀取時設(shè)置regmap_bypass標(biāo)志跳過緩存要么把這些寄存器設(shè)置為volatile讓regmap每次都走物理總線讀取要么在硬件更新后手動調(diào)用regmap_cache_only(false)并flush。在配置regmap_config時如果確定某些寄存器是硬件自動更新的可以在volatile_reg回調(diào)里返回true這是最干凈的方案。5.4 probe順序與EPROBE_DEFERsimple-mfdsyscon場景下子設(shè)備的probe順序并不嚴(yán)格。如果子驅(qū)動依賴主MFD的regmap_irq_chip已經(jīng)注冊完畢而設(shè)備樹順序恰好讓子設(shè)備先probe就會遇到中斷資源不存在的問題。這種情況下子驅(qū)動不能直接將-ENXIO返回了事而應(yīng)該返回-EPROBE_DEFER告訴內(nèi)核我還沒準(zhǔn)備好過一會兒再試我一次。內(nèi)核會在后續(xù)時機重新觸發(fā)probe直到依賴條件滿足。判斷一個錯誤是否應(yīng)該返回-EPROBE_DEFER有個簡單標(biāo)準(zhǔn)如果這個資源是由另一個驅(qū)動/框架注冊的并且名字里帶devm_或irq_domain大概率需要-EPROBE_DEFER。比如platform_get_irq()返回-ENXIO時先別急著報錯確認(rèn)中斷域是否已注冊如果沒注冊就返回-EPROBE_DEFER。6. 調(diào)試經(jīng)驗和一次真實排障6.1 用debugfs把regmap扒開看內(nèi)核默認(rèn)開啟CONFIG_DEBUG_FS和CONFIG_REGMAP_DEBUG后每個regmap實例都會在/sys/kernel/debug/regmap/目錄下生成一個子目錄。目錄名通常是設(shè)備名加序號里面有registers當(dāng)前所有寄存器的值。access每個寄存器的可讀可寫權(quán)限表。range寄存器地址范圍信息。遇到驅(qū)動讀出來的寄存器值和硬件手冊對不上第一步就去看這里cat /sys/kernel/debug/regmap/*/registers輸出大概是00: 00000010 04: 00000000 08: 00000001這能快速告訴你是驅(qū)動讀錯了地址還是物理總線上的值本身就不對。如果地址范圍里沒有你要看的寄存器那多半是max_register配置太小了regmap直接拒絕越界訪問。6.2 devmem交叉驗證debugfs只能反映軟件層面的regmap視角要驗證硬件真實狀態(tài)還需要一把物理標(biāo)尺。在嵌入式Linux的busybox環(huán)境里通常有devmem工具# 查看物理地址0x20000020處的32位值 devmem 0x20000020 32這個命令繞過regmap直接讀物理地址。如果devmem讀出來的值與debugfs里regmap顯示的不一致問題基本可以鎖定在regmap緩存或者寄存器地址映射方向如果兩邊一致但和硬件手冊預(yù)期不符那就要檢查設(shè)備樹里的reg地址、reg-io-width是否與芯片選型匹配了。devmem讀出來的物理地址必須和reg屬性完全對應(yīng)如果syscon節(jié)點有多個reg段還要確認(rèn)你讀的是哪一段。這里沒有捷徑只能對著芯片手冊逐項核對。6.3 共享regmap的釋放坑syscon返回的regmap是所有驅(qū)動共享的負(fù)責(zé)創(chuàng)建它的一般是syscon框架或MFD主驅(qū)動。子驅(qū)動在remove時千萬不要去調(diào)用regmap_exit()或devm_regmap_exit()之類的東西這個regmap并不歸你管。我踩過一次很隱蔽的坑某子驅(qū)動在remove里加了regmap_exit(regmap)試圖清理資源。結(jié)果另一個正在運行的驅(qū)動拿著同一個regmap指針下一次regmap_read直接崩潰而且現(xiàn)場看起來完全像硬件故障。排查了整整一個下午最后在代碼review里發(fā)現(xiàn)是這個熱心的release函數(shù)干的好事。關(guān)于共享對象原則很簡單誰創(chuàng)建誰釋放。通過syscon API拿到的regmap生命周期由syscon框架統(tǒng)一管理子驅(qū)動只需使用即可。6.4 probe失敗排查清單最后整理一份排查清單純經(jīng)驗總結(jié)按出現(xiàn)頻率排序現(xiàn)象常見原因定位手段syscon_regmap_lookup_by_phandle返回-EINVAL設(shè)備樹節(jié)點compatible順序不對或?qū)傩詻]寫檢查/proc/device-tree下對應(yīng)節(jié)點的compatible屬性返回-EPROBE_DEFERsyscon節(jié)點尚未完成注冊確認(rèn)節(jié)點沒有被status disabled禁用regmap_read返回-EIO寄存器地址超過max_register查看debugfs regmap目錄下的range讀到的值一直不變緩存未失效檢查volatile_reg配置用devmem交叉驗證中斷一直不觸發(fā)irq domain尚未注冊查看/proc/interrupts確認(rèn)子驅(qū)動中斷號是否映射成功probe反復(fù)重入父設(shè)備和子設(shè)備probe順序沖突確認(rèn)返回了-EPROBE_DEFER而不是-ENXIO做MFD syscon開發(fā)最大的經(jīng)驗其實就一句話不要試圖繞過框架自己管理底層寄存器。MFD已經(jīng)把芯片拆分的骨架搭好了syscon把寄存器訪問的內(nèi)存管理做透了我們要做的只是把業(yè)務(wù)邏輯裝進(jìn)合適的殼里。真正難搞的問題往往不是代碼寫不出來而是沒有理解框架為什么這樣設(shè)計。只要能想明白誰創(chuàng)建、誰使用、誰釋放這三個問題整個驅(qū)動架構(gòu)就會清晰很多。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
www.91人妻.com| 很黄很污的免费网站| 中出91视频| 高清不卡一二三区视频......| 9国产超碰| 欧美色图片欧美色图| 天天干天天狼在线视频| 久久久久亚洲熟妇熟女| 美女上床网站| 91久久午夜无码鲁丝片久久人妻| 中文字幕精品资源在线| 天天看天天日天天操| 久久久性爱视频| 国产v片在线免费观看| 99青青草国产视频| 很很干很很操| 人、人、摸,人、人、草| 91久久久亚洲| 天天干18禁| 狠狠图片青青草| 欧美一级做a爰片免费视频| 精品久久久久久AV无码| 2020中文字幕在线观看| 国产青青综合伊人| 欧美 熟女 日韩| 91n美女视频| 婷婷五月天av| 欧美一区二区观看在线| jizz啪啪| 欧美精品精品一区二区| 天啪| 阿姨一区二区免费视频-高清正片西瓜视频下载app-T450AV | 老熟女阿 国产91| 亚洲综合骚逼| 亚洲āv网址在线观看| 天天综合,91入口| 1024手机看片欧美日韩| 2003天天干夜夜操| 偷拍 精品 另类 四区| 偷看洗澡一二三区美女| 久久久九九网站| 中国国国产一级特黄毛片| 无码操逼视频一下| 97超碰人人模人人拍人人| 另类图片五月天| 色亚州人久干视频在线观看免费版| 色小视频蜜乳| 午夜丁香| 五月天激情国产综合婷婷婷| 五月天激情网图片| sss视频华人在线| 亚洲美乱| 亚洲官网在线| 蜜桃中文字日产乱幕4区| 又黑又大又粗| 操香逼| 国产精品一区二区后入| 蜜桃臀一区二区aV| 一区二区三区麻豆| 欧美组图日韩亚洲中文字幕| 日韩熟女无码| 国产精品一区二区手机看片| 欧美人妻一区| 亚洲色图欧美色图另类图片| 秋霞成人做爱| 免费观看啪视频| 尤物黄色在线观看网站| 日产狠狠干| 成人免费福利在线观看| 色婷婷丁香五月| 毛片视频白嫩| 后入式在线免费观看60秒| 日本免费一区二区不卡| 99精品九九九九九九| 亚洲人妻精品一区二区| 26uuu国产亚洲综合| 91日韩国产欧美亚洲另类精盘州至城都| 酒色综合网| 东京热天堂网| 精品亚洲国产成人精品| 曰韩精品九九无码| 美女AV一区二区| 中文无线日韩一区| 高清国产成人无码| 99久久无色码| 黄色一区二区秘书性感| 久热伊人| 久久精品成人| 久久毛卡| 欧美熟女激情| 九九九只有精品| 屁股久久久久久久久| 蜜屁Av| 欧美成97爱| 欧美极度丰满熟妇hd| 亚洲最大AV网| 97国伦国色| 亚洲熟久久| 麻豆国产97在线| A一区片| 黄页| 国产丸一视频| 久久熟女人| 亚洲1区2区三区高清中文字幕| 日本高清免费一本视频在线观看| 亚洲色天堂九9| 色五月婷婷在线| 青青免费在线视频一区| 久久精品99| 国产夫妻一区二区| 亚洲天天做日日做天天谢日日| 中国东北熟女老太婆内谢| 中文字幕在线播放2中文字幕在线观看2| 日本不卡二三区| 美女9118禁| 国产精品无套内谢| 精品小视频在线| 日本影视久久免费| 天天天天操| 国产欧美日产一区二区三区 - 国产欧美日 | 福利天堂| 男啪女色黄无遮挡免费观看| 视频不卡中文字幕| 婷婷五月综合激情| 欧美亚洲首页| 岛国人妻少妇av在线观看| 91免费看中出视频| 99综合网| 亚洲国产综合视频| 偷拍欧美综合| 日韩成人性日韩成人性爱视频在线免费观看 | 亚洲在线网站| 天天综合网入口~91| 日本黄色精品专区网站| 香蕉一区二区三区在线视频| 中文字幕丰满人妻日本| 亚洲综合码| 欧美高清18A片| AV老汉| 操逼逼一区视频| 国产综合久久久鬼色| 精品国产乱码久久久影院| 国产亚洲中文不卡二区| A一级色女| 国产92麻豆天美精品色欲5| 欧美在线55555| 国产对白刺激视频| 色悠久久久av| 激情五月婷婷综合| JuliaAnnXXX888| 人人操AV| 久久永久无码人妻视频| 久久国语| 亚洲 欧美 色图| 国产少妇与亚洲av| 久热精品在线国产| 色五月AV在线| ,国产乱人伦精品一区二区三区| 妇女一区二区三区| 少妇免费视频| 国产人妖视频一区在线观看| 欧美黑人与女人91| 日本不卡五区| 秋霞操逼片| 亚洲永久永久永久永久一级一级一级精品| 中文字幕人妻丝袜乱一区三区| 亚洲性爱高潮影院| 中文AV制服乱伦| 农村妇女精品一区二区| 99啪啪| 97无码视频在线播放| 久久精品一区| 操屄不卡视频| 日韩黄色片子| 抽插无码高清一区| 久久久久亚洲一区女同性恋中文字幕| 国产尤物AV尤物在线观看不卡| 亚洲精品黄码久久久久| 另类av天堂| 97人人模人人爽人人| 97超碰护士| 极品粉嫩少妇视频| 综合色色网| 国产午夜精品在线观看| 亚洲骚男同com| 97色伦欧美| 国产久久av| 国产精品福利视频| 亚洲男人天堂视频| 97国产天堂岛| 91 手机在线播放 绯色| 性爱乱伦一区| 啊啊啊不要好爽日韩无码一区| 国产亚洲国产超碰| 国产视频一区二区三区在线免费观看 | 欧美欲色| 天天综合精品| 91精品伊人久久久大香线蕉91| 亚洲在线A| 91麻豆天美国产| 五月天大香蕉| 欧美性爱18观看| 青青草色AV| 欧美一区二区三区黄色影视| 粉嫩国产精品久久久| 婷婷亚洲综合| 亚洲精品亚洲人成在线麻豆| 又大又大又大又粗爽高潮观看 | 婷婷香蕉| 国产欧美日韩在线不卡第一页| 综合伊人网12色| 国内毛片四区| 欧美日本天堂| 欧美三级一级| 神马久久久久眼| 人人色人人操在线| 色99视频| 欧美亚洲激情小说| 人人摸人人干| 丁香啪啪| 99精品久久| 婷婷亚洲五月***久久| 五月天我淫我色av| 欧美伊人久久综合网| 好淫网一二三视区| 欧美日韩国产传媒在线精品| 久久久久久久 九九九九九九九| 婷婷久久五月天| 亚洲成人久久美女| 大香交伊人网| 久久9久9久99久9久9| 亚洲国产日韩欧美熟妇在线| www色日本| 婷婷中文网| 日韩黄色一区二区三区| 日本三级日本三级99| 免费一级视频特黄色大片| 日韩欧美亚洲一区二区三区影院| 国产小u女在线观看| 日本人人操人人操| 99国产人成精品| 中文字幕第页| 国产25页| 色超碰综合| 天堂亚洲精品久久老牛| 亚洲精品黑丝| 91AV入口| 久久AV无码网址| 91蜜桃婷婷狠狠久久综合9色| 中文字幕 码 自拍 视频 区| 国产美脚女优尤物在线观看| 青草园大香蕉| 青娱乐啪啪视频| 翔田千里A片一区二区| 午夜男女爽爽爽影院视频| 免费αV在线视频| 97人人操人人摸人人爱| 欧美日韩m| 99re在线观看| 中文字幕五区| 免费看一级a性色生活片久久无| 欧美日韩岛国大片在线观看| 天天干天天做| 嗯啊抽插大香蕉网页| 91精品无码人妻系列| 中文 人妻 制服| 国产欧美后入| 超碰成人公开| 欧美系列在线一区二区| 亚洲色啪| 亚州色图片在线色| 久久综合日韩亚洲欧美| 天天综合香 ld视频| 精品无码产区一区二| 亚洲影视综合| 你懂得91| 精品白丝一区| 欧美中文字幕日韩在线| 69超碰综合| 亚洲熟女乱综合一区二区三区| 啊啊在线| 操高情无码| 动漫片子网站3黄| 97碰碰日本乱偷人妻中文的| 免费AV中文网在线观看| 人妻熟女午夜精品在线| 国产黑白丝在线| 国产在线视频二区| 97人肏| 美国三级日本三级久久99| www国产无码| 秋霞一集毛片观看| 精彩视频日韩| 日韩一卡二卡三卡| 97中文天堂| 偷偷人人精品女女久久| av天堂5| 狠狠2050在线观看| WWW啪啪的com| 怡春苑东京热| 国产精品麻豆免费视频| 人妻一区久久二区三区色播| 超碰97久| 天天综合网站| 一本色道久久综合狠狠操| 久久久久免费看少妇A片特黄| 久久久久久久 九九九九九九九 | 国产丝袜美女在线一区| 亚洲色图久久成人| 国产在线精品偷| 日韩欧美资源| 美国aaaaa一级黄片| 久久久久9999妇女| 熟女人妇一区二区三区| 久热99999| 午夜无码精品免费看性色| 欧美白嫩在线放| 人妻一二三区| 色综合超碰超| 国产一区二区欧美日本| 人妻一区久久二区三区色播| 91骚熟女| 久久人爽| 精品一二三区久久AAA片| 久久国模av| 久久久久人妻二区精品叶可怜| 操逼精品视频| 一区二区影院| 久热精品在线| 熟女在线视频| 国产特级毛片AAAAAA高潮流水| 农村妇女精品一区二区| 久久性生大片免费观看性| 亚州宗合另类| 奇米四色影视777久久久| 91国精产品| 操一区| 九九九免费视频| 青草青青久久久久久国产| 日韩欧美亚洲自拍偷拍| 自拍二页| 婷婷五月天成人网| 欧美 精品国产制服第一页 | 人妻人人操| 嗯~啊~快点 死我视频免费看网站| 丝袜美腿制服人妻二区中文字幕| 久久久一区二区三区麻豆| 91在线页| 午夜偷拍久久熟女| 午夜视频黄| 99re99视频在线免费观看| 一块操欧美| 亚洲高清91| 91逼逼女人91| 欧美午夜一区二区三区| 国产h小视频在线观看免费| 10000部十八禁看电影| 男女激烈网站最新| 人妻久久| 二级久久网| 五月天激情网站| 欧美精品日韩久久久九| 久久久人妻| 后入福利视频| 97精品97| 亚洲成人一二三区| 99热18| 黄色AAAAA欧美| 欧州91高潮| 玖色av| 亚洲一区二区专区-国产丝袜精品丝袜-成人AV| 91动漫操逼视频| 国产精品不卡一区二区三区av| 啊啊啊久久久视频| 热久久九九热| 99999精品成人| 日韩熟女乱伦中出| 日本成人在线不卡一区二区三区| 中文字幕诱惑制服人妻丝袜美丝袜美 | 操逼无码操逼| 欧美精品成人一区二区在线观看 | 色图综合网| 91n.欧美| 男人的天堂Va| 热热色色综合| 久久亚码| 国内精品久久国产,www香蕉久久五月丁香,亚洲欧美日韩精品永久在线,日本精品一 | 日韩成人高清一区二区| 亚洲狼狼干综合1| 67914亚洲精品| 国产欧美一区激情交| 国产精品原创巨作?v网站| 99re99在线视频| 美女诱惑在线一区| 九九久久国产精品| 又黄又粗又硬又长又大| 天无日色综合| 色墦五月丁香| 日本岛国黄色网址 | 黄色片一区二区三区四区五区| 亚洲色人阁| 欧州91高潮| 后入式免费视频| 人妻天堂网| 97干在线视频| 91av熟女人妻| 国产一级137片内射麻豆| 97超碰磁| 亚洲五码一区二区三区| 99热婷婷| 91色黑人少妇| 一级黄色影片| www九九热| 中文字幕精品日韩中文字幕| 亚洲av淫乱| 无码av永久免费专区网站| 精品国产一区二区三区四区在线看| 日韩高清黄片| 超碰97人妻在线| 色y情视频免费看| 亚洲麻豆av一区二区| 大香蕉免费3| 日韩一级性爱无码| 歐美一級亂黃99在綫精品| 精品国产一区二区久久| 久久精品小视频| 一区二区偷拍拍视频| 国产成人网站在线观看| 2001天天操| 狠狠色婷婷777| 日本不卡二三区| 日韩三四五区| 亚洲。日韩。欧美| 中文字幕人乱码中文字的预防方法 | 日韩无码操逼片| 粉嫩不卡一区二区性爱| 日韩人妻精品久久久久| 99在线观看无大码| 欧美性夜| 岛国网址国产 | 色精品极品| 小骚逼被操的爽不爽| 欧州91高潮| 很黄很色的视频在线观看| 国产97色在线| 97久久免费| 亚洲资源站| 日韩人妻免费精品| 亚洲国成人情色好看电影| 亚洲不卡一| 黄色人人| 欧美精品丝袜久久久中文字幕| 一区二区播放| 美女极品一区二区三区| 亚洲视频小说| 91东京热男人的天堂| 婷婷五月天激情四射| 小骚逼被操的爽不爽| 永久免费av无码网站国产app| 亚洲精品日日夜夜52| 日韩精品9999| 神马麻豆福利院| 色啪网| 操淫穴亚洲五月丁香| 欧美成熟性爱精品| 桃色六月天| 激情一区二区| 丁香五月电影| 狠狠色五月亚洲91| 99久久网站| 色香91| 视频国产精品未满十八禁止在线观看| 久久久不能久久久久| 九九草| 九九亚洲视频| 久久精品噜噜噜成人看免欧美大片| 久久国产乱子伦精品免费女人| 少妇免费视频| 蜜臀久久99精品久久久久久-DVD原版全| 强奸乱伦动态污图免费| 亚洲欧美综合网站| 黑人无码一区二区| 美女毛片999| 日本性爰一道本| 精品网站99999| 乱伦a片视频| 97视频900| 亚洲第一黄色av网站 | 成人午夜高潮av猛片| 激情丁香五月| 男人天堂网站| 亚洲色图20p| 亚欧免费| 欧美亚洲清纯| 三级片网站在线播放| 亚洲综合色图欧美| 思思热在线观看| 色欧洲| 天天综合有色网| 2018天天干在线视频| 天天操美美| 中文字幕av亚洲在线| 黑人性欧美| 香蕉在线一区二区三区| 国内精品嫩模A∨私拍小视频| 久久天天躁日日躁狠狠躁| 岛国片在线视频网站| 好舒服视频| 日韩精品一区二区三区色欲| 97视频在线观看免费高清| 日韩AV片| 久久综合亚洲色1080p| 在线小说视频一区| 日本有码久久| 精品人体无圣光凹凸| 日本精品免费一区二区三区四区| 无码av永久免费专区网站| 国产白丝网站| 日韩有码免费视频| 日韩性爱视频在线免费观看| 蜜臀一二三区| 久热久一区二区三区| 成人aⅴ一区二区三区| 97人人夜| 欧美青青视频| 日韩pv中文| 国产亲戚伦亲在线| 精品久久久久久中文字幕视频免费 | 97人人色| 日韩人妻精品中文字幕| 日本三级大片| 欧美一级久久久久久久大片动画| 91欧| 97操在线| 色欲人妻一区二区在线| 发朗少妇买婬全视频中文| 青草草免费网站av| 亚洲人妻精品一区二区| 国产又长又大又粗的视频| 亚洲情色1区| 一个人免费HD91视频| www.亚洲黄色| 精品无码久久久久久久杏吧| 九久久精| 超碰97人人乐| 99国内熟女露脸视频| 亚洲色图 图片| 日本99视频| 亚洲精品一二区| 青青草色情网站视频| 天天躁日日躁AAAAXXXX国产| 精品国产乱码久久| 欧美丝袜91| 久湿久久| 色制服丝袜夫妻av一区| 天天日老熟妇| 丝袜大香蕉| 国产强奸超碰AV| 色操逼网| 人人搡人人肉久久精品| 在线女人91| 91亚州日韩高清| 色色五月婷| 五月婷婷丁香| 国产精品免费日韩| 日韩性爱视频在线免费观看| 日本欧美中文字幕| 91碰碰| 欧美大片天天看| 亚洲精品骚逼| 色大香蕉97N| 1204av韩国| 欧亚第一综合网| 澳门人妻久久| 伦理弟一页| 大香交伊人网| 激情文学网伊人| 男人的天堂VA| 色色色色电影网| 日本一本道A级黄色毛片试看60分钟| 亚洲,日韩,欧美,成人播放 | 日韩激情啪啪啪| 欧美专区17页| 玖玖爱免费观看视频| 性色av一区二区| 粉嫩av平台| 美女啊啊啊啊啊啊啊| 色香欲影| 色噜噜综合在线| 国产91 丝袜在线播放| 亚欧国产无码精品在线| 五月丁香婷婷色| 人妻中文字幕日韩电影| 色色色欧美| 日本人体九九九九九九| 色哟哟-国产专区| 久久综合女优| 久久久9 9 9精品| 婷婷爽人人婷婷爽视频| 26uuu久久| 亚洲国产欧美另类自拍| 国产激情片在线观看| 啊啊啊不要好疼视频| 99国产在线绯色一区| 伊人国产av| 亚洲综合一| 97干在线视频| 国产欧美在线观看免费观看| 偷拍 亚洲 欧美| 国产剧情一区在线观看| 国产视频人人网| 97这里都是精品| 日韩Va亚洲va欧美Ⅴa久久| 欲色啪| 制服乱伦| 亚洲色图欧美一区二区不卡| 偷窥自拍亚洲色图| 天天懆天天日| 蜜桃臀一区二区aV| 亚洲丝袜色| 一区二区乱码福利| 欧美成人色| 99精品久久久久久久婷婷蜜桃| 天天天干977| 啊好爽受不了无码| 亚洲va有码在线天堂| 九九热精品视频六| 精品蜜乳AV免费观看| 久久大线蕉一区| 性爱乱伦网址| 日本性爱视频一级| 国产婷婷综合在线观看| 伊人久久综合精品欧美| 丝袜狠狠草尤物人妻av91| 天操天操夜操夜月操月年年操操| 97超碰磁| 久久久久久久久久久97| 日本一区二区三区午夜观看| 亚洲在钱| 自拍盗摄一区| 大香蕉av在线| 不卡中文字幕aⅴ在线| 一二三区视频在线观看| 久久国产视频专区一二三| 国产99久久99热这里只有精品15| 91亚洲人| 欧美日韩国产电影| 嗯嗯啊啊视频在线看| 四虎精品一区| 97操| 综合一区中亚洲国产成人综合精品| 九九热这里只有在线精品视 伊人草 成人菠萝蜜视频在线观看 | 干B网| 韩国一级AAA| 超碰97玖玖爱| 日本孕妇一区二区视频操逼免费看 | 亚洲天堂电影网99999| 99国产精品视频尤物| 熟妇熟女一区二三区| 男人天堂欧美| 在线观看一卡二卡| 玖玖爱影院| 青青草原人妻| 午夜精品久久一区二区| caopeng97| 人妻三级在线中文字幕| 国产成人综合在线播放| 小草精彩毛片| 99热欧美| 婷婷色导航| 岛国黄色大片网站| 日韩精品在线观看观看| 高清无码久操视频| 亚洲91射| 欧美高清在线| 97爱| 无码人妻毛片丰满熟妇精品区| 视频在线观看一二三区| 国产粉嫩出水在线播放| 蜜乳AV一区| 亚洲精品一区二区精品| 中文字幕丰满人妻日本| 色九久| 欧美热图99| 国产91美女视频| 蜜臀在线网站| 欧美激情亚洲情色| 9九九国产| 后入福利| 97精品全部| 亚洲日韩视频二区| 久久久久9久久久久| 97超碰人人操人人操| 欧美五区| 天天看,天天做| 中国特猛少妇色xxx| 老司机午夜精品视频| 男人的天堂VA| 91丝袜美女视频| 亚洲天堂男人天堂网| 欧亚日韩中文在线| 亚洲中文字幕熟女| Sekablack无码一区| 综合av社区| 亚洲欧美自拍偷拍| 国产粉嫩出水在线播放| 久久五月丁香| 欧美se综合| 久久亚洲影院一区二区| 久草视频在线视频在线视频在线观看 | 亚洲一区日韩| 中文字幕高清精品一区| 高清无码学生妹高潮| 日韩三级伦理中文字幕| 玖玖超碰熟| 69AV女优男人的天堂| 国产一区二区欧美日本| 少妇熟女1区2区3区| 免费男人的天堂| 香蕉久久精品| 日韩人妻精品久久久久| 91高清无码下载| 欧州一区二区三区四区| 操逼999| 九九天堂| 九九碰九九爱97超碰| 亚州免费啪啪视频| 日本操逼无码| 色97干| 国产2.3.4区| 一区二区三区四区久久视1| 丁香五月天堂网| 国产 亚洲 丝袜 制服| 日本韩国国产精品一区| 九九热九九热| 婷婷情色综合网| 成人欧美日超碰| 国产精品欧美在线观看| 国产精品麻豆免费视频| 狠狠综合网| 97香焦色区| 国产第二页| 丰满人妻一区二区中文| 91社区伊人| 乱伦色图网址是多少| 婷婷在线播放| 亚洲日韩XXX| 美女91网站| 激情五月天社区| 超碰天天操你比| 久草这里只有精品 | 密臀成人视频久久久| 中文字幕国产在线天堂| 在线综合 亚洲 欧美中文字幕| 啪啪啪大香蕉| 成人天天爽| 国产色产精品在线观看 | 明星性猛交ⅹxxx乱大交| 免费在线观看国内色片网站网址| 日本啊啊啊啊啊视频| 色鬼在线综合| 中美日韩毛片| 天美传媒Av在线| 人妻黑丝袜电影| 国产欧美精选自拍一区| 欧美性夜| 日韩无码操逼片| 超碰日本97美女人妻人人玩人人爱| 一本大道久| 91成人久久| 欧美人妻色| 乱欲视频| 久久综合18p| 中文久久久| www.久久99| 日本精品九九九| 日韩乱伦AⅤ| 中文字幕熟女人妻丝袜| 日韩欧美三级| 亚洲精品人体| 亚洲无码超碰免费| 操逼逼福利视频| 色情综合网| 久久9 9 9精品| 欧美情色贴图| 国产五码丝袜屁眼| 亚洲人精品久久久| 欧洲精品一级二级精品综合视频综合| 少妇三p| a级免费在线观看| 亚洲日韩美国人妻| 婷婷五月天成人网| 闷骚老熟女15P| av 模特一区了| 麻豆91熟妇人妻中文字幕茄子| 大屁股人妻女教师撅着屁股| 天天日天天干天天色| 最新日产中文在线麻豆| 亚洲熟妇图片| 午夜AV污污污| 啊啊啊免费视频| 一级毛片电影免费看| 国产精品无码在线| 天天干一区二区| 好吊爽好吊爽在线视频,中文字幕精品一区二区日本,国产良妇出轨视频在线观看, | 日韩综合第八区国产精品| 色播综合| 99re免费| 99热aaa| 浪人综合网| 91九色在线| 天天干18禁| 神马久久久久眼| 婷婷av在线中文字幕| 美日韩在线不卡人妻| 亚洲精品无码成人久久久99| 亚洲图片偷拍欧美| 人妻久久久| 国产黄色剧情影片麻豆免费播放| 国产精品。| 成人AV超碰免费在线| 久欲AV| 亚洲高潮少妇| 色哟哟综合| 99爱爱| 精品国产国产AV| 蜜臀99久久精品久久久久| 玖玖爱免费观看视频| 国产精品午夜成人福利| 欧美色图亚洲激情| 日韩无码专区| 加勒比综合a∨| 超碰在线1234区| se吧提供国产乱老熟视频胖女人| 怡红院网站在线视频| 91麻豆天美国产欧美| 亚洲国产av中文字幕久久 | 综合网色| 一二三区精品视频| 999 久久久| 加勒比大香蕉视频在线| 91久久免费视频互動交流| 青操影院| 少妇国产不卡| 婷婷激情五月天小说网| 91骚熟女| 亚州免费啪啪视频| 婷婷丁香六月| 国色综合天| 亚洲 欧美日韩 另类| 日日日大屁股骚女人精品| 免费?级毛片无码?∨蜜芽试看| 蜜桃精品一区二区三区ww| 男人在线天堂| 96精品在线| 亚洲色欧美| 亚州成人a∨| 国产又猛又粗又爽又黄| 91老熟女逼| 综合av社区| 淫乱图区 | 亚洲啪啪性视频| 九九超碰综合网| 天天激情干| 人人摸人人舔一区二区| 欧日a| 国产精品伦理| 亚洲国产精品久久久久久久久久| 欧美熟女少妇| 97超碰香蕉| AND人妻系列| 久久透逼视频| 青青草一区二区三区四| 日本熟女中文| 97干在线视频| 人妻天天爽夜夜爽精品2| 欧美爱三级日韩久久| 欧美性生活内射| 亚洲欧美另类图片| 夜夜嗨绯色| 亚洲网自拍| 亚洲欧美一区二区三区在钱蜜桃| 亚洲欧洲网站免费观看| 1000部熟女视频在线观看| 伦理第一页| 91欧| 男人的天堂VA| 清纯唯美综合亚洲| 五月天亚洲网| 青青草伊人久久| 麻豆天美制片厂网站视频| 亚洲情色婷婷五月天| 深夜啪啪啪视频免费| 国产亚洲99久久精品| 中文自拍欧美影视| 久久婷婷综合国际产色怕| 国产精品制服丝袜清纯唯美| 黄色一区二区秘书性感| 伊人网综合在线视频| 欧美强奸乱能| av网页一区二区三区| 97在线精品观看视频| 免费啪啪av| 亚洲无码国产精品久久| 思思热国产在线视频| 熟女精品va中文字幕| 亚洲av综合色区无码一| 人妻一区视频| 欧美丝袜亚洲| 日韩欧美成人大香蕉| 夂久色| 婷婷色播婷婷| 玖玖玖玖精品国产剧情| 亚洲精品一区二区精品| 日日爱99| 久艹日日日| 精品成人久久久人人亚洲| 国语精品内射在线观看| 天天艹天天日| 亚洲色图殴美色图激情乱伦| 大奶啊啊好爽 | 最新国内自拍av免费| 91伊人久| 久久精品国产亚洲AV高清演员表| 黄色一区二区秘书性感| 69精品久久久久中文字幕| 色一情一乱一乱一区91Av| 熟女精品一区二区三区| a男人的天堂| 亚洲限制级| 少妇精品久久久八区九区| 五月天婷婷色| 中国国产精品一区视频| 日韩无码服务区| 成人天天爽| 精国久久一区二区三区98| 99久久精品国产高潮| 亚洲系列第一页| 影音先锋少妇| 国产日韩精品suv| 人爽不卡视频| 91男人综合| 黑人精品欧美一区二区蜜桃| 国产欧美日产一区二区三区 - 国产欧美日| 久久啊啊啊视频| 国产一区二区三区,在线观看观看| 伊人久久亚洲中文字幕不卡| 亚洲日韩东京热一区| 日本黄色XXX| 我要色综合网站| 色逼综合| 国产二区三区免费视频| 国产美女口爆吞精视频| 中文字幕一区二区免费在线| 亚洲va有码在线天堂| av无码精品久久久久| 国产精品免费视频人成| 久久婷婷热| 在线啊啊啊啊| 精品一久久久| 99最新日韩偷拍视频| 黄页网站成人免费| 日韩少妇无码| 日韩精品在线视频在线观看| 狠狠色狠狠色狠狠五月| 亚洲高清无码免费观看视频| 999久久久精品国产| 日本一二三高清| 精彩久久中文| 超碰97综合| 亚洲av国产av综合av卡| 在线观看色视频| 99色视频| 久草新免费| 亚洲色图91欧美日韩| 精品九九九九九九九九九| www.av家庭乱伦| 丝袜AV一二三区| 欧美性爱超碰97| 久久‘黄片视频| 欲色啪| 韩国一级AAA| 欧美色天堂网在线视频| www熟女乱伦com| 91暧暧| 人人操人人色网| 射 色综合| 国产久久久久久| 婷婷综合五月天| 久久日韩肥臀| 婷婷综合在线| 欧美性高潮| 五月婷婷大香蕉| 青女偷拍网| 五月婷丁香| 果冻传媒A片麻豆熟妇人妻| 国产99 中文字幕日韩小视频| 亚洲区限制级 99| 五月丁香社区婷婷日韩欧美精品影院 | 青草草免费网站av| 鸥美插入视频| 天天操天天干一区二区 | 久热69九色熟妇97| 欧美线天码中字| 日本高清视频xxxx| 99精品网| 日韩丨制服丨中文|在线| 伊人网青青| 亚洲av在线免费观看| 中文字幕av片| 免费精品人妻一区二区三| 情色日播放AV| 亚洲精品天堂久久A∨51成人漫 | 亚洲成A∨人影院在线欢看| 夜夜无码| 久久久久久亚洲精品不卡人乳| 视频不卡中文字幕| 精品人妻一区二区三区-国产精品| 中文字幕久久婷婷丁香五月天| 中文字幕少妇色 | 亚洲一级特黄大片在线播放91| 97伦乱| 精品色色| 熟女乱3伦999| 欧美精品久久| 亚洲最大网站av| 日韩欧美女求操每天更新| 亚洲欧洲美腿丝袜| 综合国产影视三级| 超碰视97中文| 亚洲 日本 一 二 三| 人人模人人看| 中文字幕乱偷人妻久久艾草网| · —级AA伦aa坐爱午夜极速ⅴA一区天天噪天天噪天天噪 | 日韩欧美性爱电影在线观看| 欧美少妇内射| 亚洲无码一区二区三区三州| 超碰美国| 成人热久久精品| 丰满人妻大屁一区二区| 日日超碰亚洲| 亚洲精品 欧美精品| 另类图片五月天| 狠狠色伊人亚洲综合网站色| 毛片麻豆91糖心精品毛情片| 激情综合五月天| 久综合国内精品自在自线| 国内精品久9| 亚洲精品蜜桃久久久一区二区三区| 日韩无码a片| 特污精品女优骚货黄色视频在线免费观看| 超碰超碰超碰超碰的大鸡吧操黑丝袜 | 高潮内射在线| 成人午夜高潮av猛片| 日本不卡码黄色| 久热影视| 熟妇激情| 激情五月天色播| 97亚洲精品| 91久久18禁| 深夜视频| 亚洲另类色图片| 色婷亚洲五月在线观看| 嫩草在线视频| 丰满人妻一区二区三区免费 | 国产乱码久久| 中国东北熟女老太婆内谢| 欧差乱伦二三| 日本亚洲嫩草影院啪啪| 欧美国产成人在线| 91n美女视频| 99久在线精品99re8| 欧美aa一级片| 亚洲国产精品无码AV久久| 亚洲天堂少妇| 97精品在线| 亚洲黄日韩无码专区| 口爆综合网| 精品国产片亚洲一区| 天天色,天天干,天天干| 国产精品高潮久久久无码| 竹菊一区二区三区AV线| 豆1无夜无码| 欧美A√综合网 | 欧美韩国你懂得在线 | 亚州综合图片| 国产精品午夜成人福利| 欧美在线官网| 五月天综合网| 91啪啪视频| HEYZO高无码国产精品227| 天天做日日做| 亚洲一卡二卡在线免费| 国产精品午夜AV完会免费 | 欧美综合综合| q2午夜理论片夜色av| 亚洲欧美在线综合| 日韩ab网| a人欧美综合天堂麻豆| 中文字幕一区二区在线日韩精品| 伊人aaa| 亚洲伊人久久精品狠狠在线| 亚洲一区二区性爱电影| 亚洲国产成人精品999| 99re这里只有精品2| 欧美夜色| 69AV女优男人的天堂| 91free福利| 精品无码不卡视频| 天天爽天天操啊啊啊| 天美一区在线| 逼逼逼逼操操操操操操操操操午夜剧场| 欧美激情专区| 夜夜骑夜夜操| 日本成a人v网站在线观看| 国产无码精品成人| PMv在线观看| 天天谢天天干| 岛国网址国产| 无色无码| 六月婷婷色综合| 日本大片日本一区二区免费高清| 亚洲欧美精品一区天堂久久 | 一本大道青青| 欧美性夜| 亚洲婷婷丁香在线| 国产精品成久久久久午夜午夜| 日韩av性爱在线播放| 成人av福利在线观看| 曰韩操B| 韩国一级做A片免费的| 婷婷导航| 亚洲不卡不卡中文字幕不卡 | 伊人991| 久久偷偷色综合蜜桃| 国产精品禁久久久精品| 91亚洲人| 色欲久久久久综合网| 中文字幕一区二区在线日韩精品| 啪啪啪精品视频| 久久五月天婷婷| 啊啊啊啊啊在线观看网址 | 久久久久久午夜男人的天堂| 色综合中文字幕不卡| 精品国产72| 嗯~啊~轻一点 视频| 欧美在线天堂| 免费一级性爱久久| 激情啪啪拍91| 人妻久热在线| 超碰在97| 久久91| 国产成人一级av88| 婷婷五月色| 日本 免费 一区二区三区 久久香蕉| 少妇精品久久久| Blackedraw视频一区二区| 国产无马视频| 99热这里只有精品地址| 99操碰|