亚洲有码Av一区二区三区_国产高清啪啪免费视频_69色视频国产_国产成人人人爆出白浆_国产精品自在线拍国_一本久久伊人热热精品无码_午夜性刺激在线看免费带字幕_助力高品质欧美狂喷水_亚洲精品日韩无码_精品无码一区二区三区蜜臀_麻豆高清国产AV_熟妇人素无码中文字幕_亚洲a级片在线观看_国产欧美日韩三区_99国产成人高清在线观看

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
返回資訊列表
日本91白丝| www.人人摸在线视频| 久久五月份| 超碰97久久观看| 另类图片天天影视| 欧美日韩中文视频播放| 国产 日韩 另类 视频一区爱| 中文字暮97| 亚洲大色堂| 色综91| 91精品女厕偷拍视频| 99国产人成精品| 久久大精品乱码视频人妻熟女| 一起草在线视频| 激情综合久久| 女性91网站| 欧美国产日韩清纯唯美| 天天干2区3区| 人人操人人舒服| 情色日播放AV| 精品国产Av无码久久久亚洲| 中文字日本乱码| 亚洲国产另类在线中文| 麻豆久久久久久久久丝袜| 天天亚洲| 国产亚洲人妻综合日韩 久久| 久9爱精品| 人人操人人大香蕉| 欧美少妇高潮| 日韩一级二级| 国产高清26uuu| 色在线69堂| 97亚洲综合在线| 国产自产自拍| 91情色在线| 丁香久久| 人人操人人操人人人操| 日本韩国一本产品小视频日本韩国一本产品久久久产品小视频日本韩国一本产品久 | 四虎精品永久在线观看| 99天堂网| 久久性爱视频免费看| 日本三级韩三级99久久| 一级黄色视频网| 欧美激情色婷婷花野真衣一区二区 | 成人精品电影| 可以免费观看的日韩av毛片| 青女偷拍网| 国产亚洲日本精品在线| 青草园大香蕉| 中文啪啪视频| 欧美黄色片在线播放| 亚洲九九爱| 国产女人成人精品视频| 91丝袜在线观看| 青青草吊丝| 久久精品日韩| 久久超碰日韩精品| 日韩欧美成人大香蕉| 久久久四区| 97国产超湿| 久久久无码精品人妻二区| 裸体美女免费看网站青草| 久操电影| 道久久五香丁月婷婷激情综合| 狼狼色丁香久久婷婷综合五月| 中精品一区二区三区| 99热66| 久久精品国产Aⅴ| 婷婷香蕉欧美在线一区二区三区 | 激情五月天丁香社区| 天天碰久久入| 久日91在线| 在线观看中文av字幕| 美女上床网站| 麻豆性爱视频在线播放| 丁香五月天社区| 天天视频黄| 久久久久久99999国产精品| 婷婷色色五月天| 波多野结衣AV无码一区| 青青草在线视频美女| 婷婷久久网| 伊人网免费视频| 欧亚揄拍偷拍精品视频 | 男人的天堂 在线一区| 超碰在97| 午夜福利在线视频1000| 啊啊啊不要好疼视频| 无套内射人妻在线播放| 乱欲视频| 天天综合官网| 舔足天天操天天射| 日本黄色天堂| 天天看特黄的免费网站| 久操99| 亚洲av强奸乱伦| 欧美aa一级片| 黑人美精品 A片| 国产精品禁久久久精品| 亚洲天堂久| 啊啊啊啊啊啊啊好爽不要| 九九热AV| 亚洲色综合| 国产精品久久久久亚洲av| 乱伦熟女论坛| 日韩无码一级黄色av片| A级片日韩欧美国产欧美视频精选观看 | 神马久久久久久| 97精品国产精品免费观看| 久久手机好看网站| 91啪9色| 在线精品福利免费播放| 欧美精品1区2区3区| 天天做日日做天天欢。| 日韩性爱电影一区| 日本www操操操| 唐山老熟妇露脸啪啪叫| 最新日韩黄片| 欧美一级久久久丰满| 淫荡网址| 久久久久久久免费A片国产成a人亚洲精∨品无码| 天堂精品| 伊人宅男大香蕉| 亚洲久草AV色图| 99亚洲人人| 亚州精品丝袜-不卡成人免费| 欧美不卡二区| 日本国产成人亚洲精品无码| 激情文学网伊人| 激情丁香五月婷婷| 艳美熟妇先锋一二三区| 日韩av影片在线观看| 在线无码操| 亚欧无码在线| 丁香九月激情| 麻豆国产原创AV色哟哟| 中文字幕人妻色偷偷久久皮| 日韩精品9区| 校园春色中文字幕AV| 久草热制服丝袜在线观看| caopeng97人妻| 亚州 综合 色图| 黄总AV色图| 亚洲一区二区三区麻豆传媒| 亚洲影视高清第一页| 亚洲综合射| 99精品综合久久久久五月天| 狠久久| 亚洲人久久久久日| 国产精品探花色| 久久香蕉综合一本到3atv| 一级免费啪啪片| 色妹子A V| 玖玖爱一区在线| 91国产伊人大香蕉| 一二三区操逼国产91| 影音先锋日本乱伦| 无套内射性感少妇视频| 热久久这里只有精品| 91天天日| 亚洲第一精品在线视频| 乱伦系列一区二区| 亚洲精品丝袜| 亚春色色| 国产精品视频一区二区三区八戒| 五月激情综合网| 亚洲天堂另类小说男人| 99久久99久久免费精品蜜臀| 日韩精品 视频一区二区| 免费观看的av| 打av高清| 国产日本顶级一区二区三区| 色五天伊人| 99爱在线视频| 久久亚码| 亚洲影院成人| 蜜臀精品1区2区| 日本黄页视频在线观看| 婷婷干黄色| 精品久久久九九九孕妇| 国产精品在线网站| 天天日天天干天天摸天天操| 老司机午夜精品视频| 免费黄色片。| 欧美性爱在线无码| 九九久久综合| 国产狂喷潮在线精品| 成人青青草原伊人| 欧美日日网| 日本狠狠干| 91精产一区二区三区| 欧美玖玖爱免费玖玖| 亚洲av青草久久一区二区| 亚洲黄色网址视频| 亚洲情色婷婷五月天| 日本一卡二区在线| 成人性爱电影一区二区| 蜜臀久久久国产| 欧美色网| 精品人人| 亚洲不雅视频1区二区| 综合久久欧美| 久久国产精品视频| 亚洲一区中文精品| 97碰在线视频| yy少妇精品久久| 九九综合九九综合| 欧美亚州手机在线| 久久东京热久久| 国产人妖视频一区在线观看| 人妻天天爽| 色屁屁影院www国产| 久久久久无码| 中文字幕一区二区三区四区在线视频| 韩国轻伦国内自拍一区| 国产高清成人免费视频| 人妻夜夜爽天天爽麻豆三区网站| 欧美亚洲天堂| 极品粉嫩一区二区| 欧洲综合无码| 亚洲日本天堂| 日本九九九九| 久久AV色| 最新日产中文在线麻豆| 夜夜福利| 国产精品久久久久中文字幕| 色色色色色色色色综合| 超碰在线人人射| 伊人色综合超碰| 五月天婷婷在线看| 欧美超碰人妻97| 国产激情在线观看| 超碰在线免费一区二区三区| 欧美日韩性爱操大逼| 久久久久久久久久久999| 欧美伊人久久综合网| 制服中出中文人人精品| 中文字幕日本久久| 超碰97人妻| 99999精品成人| 一区二区三区探花在线观看| 欧美狠狠狠| 殴美牲| 亚洲影院成人| 99色在线| 九热大香蕉| 黄片aaaaa一区| 天天舔日美女视频| 中 文字幕一区二区三四 五 区日 日 骚| 欧美牲| 伊人久久蜜月| 啊好爽受不了无码| 女人高潮大叫一级毛片| 白丝AV| 国产久久久久影院老熟女| 久久久中文| 欧美18老人禁| 精品在线78| 天堂资源欧美| 91精品久久久久久综合五月天| 国产老太乱伦一区| 色偷偷综合91久久噜噜| 精品国产99| 欧亚免费视频| 日韩人妻有码免费视频| 亚洲综合九九| 国产外初女出血视频| 精品少妇后入一区二区三区四区人妻巨乳 | 午夜一区| 青青伊人这里只有精品| 亚洲美女av无码| 亚洲天堂资源| 日本97久久久精品| 日韩草久视频| 日韩操人| 国产亚洲精品美女久久久m| 欧美在线天堂| 97se亚洲综合自| 伦在线97| 屌妞视频久久久久久久 | 午夜精品久久久久久久久久蜜桃| 久久久久99999| 加勒比av网| 国产高清不卡视频| 91亚州日韩高清| 韩国一级做A片免费的| 中文AV制服乱伦| 久久久9999| 上床啊啊啊| 美女网站黄页| 蜜屁Av| 天天做天天爱天天爽AV| 91是天天| 欧美色图天堂在线| 久久五月综合| 久久丁香五月婷婷| 天美麻花大全视频| 91人妻尻屄视频| 无码丰满熟妇一区二区浪潮AV| 夜夜骑夜夜操| 中文字幕久久婷婷丁香五月天| 国产精品不卡少妇白| 久久噜噜噜精品国产亚洲综合| 精品一二三区女同 | 色五月婷婷五月天| 超碰在线人妻| 99在线精品观看99| 丁香五月激情综合| 色婷婷五月综合| 婷婷色婷婷| 婷婷中文字幕| 伊人天堂在线| 亚洲天堂另类小说男人| 裸模AV女优| 亚洲av热热色| 精品女同一区| 天天干天天操天天干天天操| A V视频日本| 人人操人人操人人人操| 亚洲欧美日韩二区视频| 强奸乱伦日韩AV| 国产亚洲色婷婷久久99精品91葵花宝典| 综合五月婷婷亚洲一区| 大香蕉五月天| 麻豆天美国美国产| 九草在线大香蕉| 日日噜噜夜夜久久亚洲一区二区| 9997se| 色色97爱| 欧美探花网| 黄色免费网页无码| A久久| 欧洲无码一区二区| 天天澡天天爽日日av| 中文字幕视频免费| 97干在线视频| 亚洲欧洲日本精品中文a∨| 久久精品欧美一区二区三区不卡| 亚洲精品美女久久久久久久久| 秋霞视频一区二区| 色妹子A V| 青青欧美| 亚州综合色| 精品国产无码中文| 亚洲九九夜夜| 日日黄色三级网站| 91大神精品长腿在线观看网站| 97色色色| 欧美老妇女内射网址| 超碰在线成人| 欧美另类精品xxxx| a久久| a人欧美综合天堂麻豆| 人妻人久久精品中文字幕| 国产人妻久久精品一区二区三区| 国产黄色影片在线观看| 伊人久久青青草| 亚州欧美总和| 中文久久| 六月婷婷综合| 日本最新免费韩国1区2区视频播放| 少妇人妻在线| 99e久久国产精品| 久久老子无码午夜伦不卡| 国产超碰国产97| 熟妇激情| 一级做受视频免费是看美女| 九九热AV| 亚洲双插| 国产欧美岛国精品一区| 成人影 天天操 亚洲| 欧美日韩97在线| 人妻色偷色噜| 国产人妻精品久久久一区二区三区| 国产探花精品在线| 亚射在线| 久夜视频| www.激情| 中文字幕精品三级久久久| 狠狠干狠狠干| 校园春色中文字幕AV| 国产成人在线观看网址| 丁香五月天激情综合| 色娱乐色呦呦夜夜夜夜av| 亚洲九九九| 91操碰| 啊啊啊啊啊啊啊网址在线观看| 日韩一级二级三级免费看完整版| 欧美在线干| 夜色97| 青娱乐欧美激情一区二区| 欧亚洲精品有视频| 大肥女高潮bbwbbwhd视频| 丁香五月天堂| 偷拍导航视频网站| 色5月婷婷| 精品高清牛人盗摄一区二区三区中文字幕A片免费在线观看 | 精品人妻无码一区二区三区不卡-精品人妻无码一区二区...|精品少妇一区二区三 | 五月丁香久久| 蜜臀Av一区二区三区| 久久直播国产| 欧美传媒一区| 尤物一级在线免费观看| 久久久九九九九| 91久久免费视频互動交流 | 亚洲婷婷综合网| 香蕉一区二区三区在线视频| 久思思热视频在线观看| 九九九九精品一区| 欧美日韩性爱无码| 久久久久人| 老司机射| 亚洲色宗合| 国产久久一区二区午夜| 亚洲欧美日韩中文播放| 久久久久久久久久久久久久久乱码| V A在线| 亚洲大色堂| 亚洲色鬼| 亚洲 小说 欧美 激情 另类| 亚洲欧美日产国产91毛片| 人人操人人插人人摸人人干| 在线情色电影 91大| 成人性爱高清视频免费看| 亚洲涩图欧美| 混色激情av| 乱伦一二三| 欧美精品三区| 久久9视频| 久久青青草在线视频| 18一区二区三区| 婷婷av在线中文字幕| 亚州 综合 色图| 人人干人人搞人人摸| 亚洲综合嫩| 伊人久久青青草| 精品国产91av一区二区三区| 午夜视频久久久| 人妻丝袜一区二区三区在线| 丝袜 亚洲 偷拍| 香港澳门日本三级网站| 成人久久久精品| 六月婷婷五月丁香| 免费1级a做爰片观看| 久久久久96| 欧美大码在线视频| 太久视频| 天天噜| 在线黄色污污网站| 色啪网| 内射夫妻三片| 久草精品在线| 精品 码产区一区二-1080P高清在线www-B029AV | 天天摸夜夜添无码小视频| 青青草AV色| 毛片视频白嫩| 婷婷五月天色网| 国产这里只有精品| 蜜乳性色无码专日粉嫩骚逼AV| 超碰美国| 久久久性少妇| 粉嫩少妇自慰在线| 爱爱60秒免费视频| 大色综合网| 国产精品不卡一区二区三区av| 影音资源男人日韩| 亚州综合色图| 97网址www| 伊人色综合网电影| 岛国网址国产| 亚洲天堂在线怕怕视频| 亚洲女人91| 日韩欧美天天爽爽爽天天爽爽| 天天综合网国产| 911粉嫩人妻| 一级AV性爱| 久久超碰网| 久久99人妖视频国产| 国产精品嫩草影院午夜两性| 中文字幕欧美丝袜07资源| 人伦四五区| 欧美在线色| www.99热在线只有精品| 日本不卡卡一区| 99热免费| 亚洲欧美精品91| 亚洲成A∨人影院在线欢看| 100啪啪视频大全| 热99这里有精品综合久久 | 欧美高潮| 国产人伦精品一区二区三区 | 四虎国产精品永久在线囯在线 | 亚洲风情综合网| 亚洲网污污污污| 无码视频一区二区| 一牛一区二区三区久久| 熟女中出视频| 91久久18禁| 东京成人一区| 1204av韩国| 99亚洲人人| 美女大乳久久久久久久女人18| 丝袜狠狠草尤物人妻av91| 亚洲 欧美 91| 精品九区| 天堂综合网| 丝袜美腿av女优在线| 99re黄| 亚洲天堂男人网| 中文字幕一区二区视频在线观看| 九九AV| 1769一区| 日本免费专区| 人妻人人操| 日日狠狠久久偷偷色综合免费| 婷婷伊人| 亚洲熟妇丝袜在线观看| juliaann丝袜大战黑鬼| 97精品97久久| 欧美日韩欧美| 超碰在线人人射| 一区二区免费电影久久| 加勒比久久综合网高清| 亚洲一区日韩| 久久手机视直播| 久9久9精品| 人妻大香蕉| 91 天天综合| 久久老女人| 99这里只有精品国产| 色色香蕉| 天天插天天插| 91AV天堂| 国产67194| 台湾佬激情综合| 东京热一区二区三区四区五区六区| 91九九九小逼| 日韩97超碰| 在线播放成人高清免费视频 | AV色女综合| 国产91影院| 人人操人人摸人人看人人干| 超碰国产在线| 东北女人的毛片| 本道在线| 很很操在线| 成人网站 免费观看| 怡红院视频在线| 亚洲资源网| 欧美人妻少妇| 欧美特大黄一级片片免费| 亚州色交| 亚洲天堂少妇| 成全在线观看免费观看| 色色无码| 国产熟女自拍| 人妻少妇被猛烈进入中| 大香蕉色十月| 久啪视频| 综合欧美激情网| 亚洲色堂免费视频| 亚洲欧美综合图片| 三级色综合| 台欧久久精品视频| 久久人妻熟女一区二区| 久久欧洲| 97天堂| 色999五月色| 超碰97久久观看| 97久久久| 日韩免费人妻色情网站| 九九这里只有精品| 欧美日韩一区二区三区四区蜜桃| 国产精品经典一卡久久久| 美女十八禁| aaaa少妇高潮大片| 亚洲污污网站| 樱花蜜乳av| 亚洲成人一二三区| 亚洲色欧美| 亚洲天堂男人在线| 亚洲欧洲日韩中文字幕一区| 韩国一级做A片免费的| 欧美论理片| 国产对白刺激视频| 97精品视频免费| 老熟妇乱轮| 中文字幕91综合| 少妇一区二区三区| 蜜桃久久综合视频| 亚洲久久久久| 2020中文字幕| 97超碰欧美| 久草精品热视| 2024年最新色情网站在线观看| 爱爱动态120秒| 男人夜色天堂ss| 97伊人| 丁香五月综合| 99re在线| 久久熟妇五十路一区| 女人与公拘交酡2020视频| 亚洲国产一级中文综合久久天堂在线免费观看| 久久产精品一区二区三区电影| 在现视频女上位好爽| 九九九热| 亚洲综合图文| www.久久最新地址| 亚洲色图欧美色图综合| 色色激情五月天| 少妇熟女一区二区三区| ′ !γ}丶。。久久精品欧美一区二区三区| 美欧色综合| 久久久久久性爱片| 天天干天天燥| 夜夜嗨一区二区三区三州加勒比 | 国产又粗又大硬免费色网视频| 澳门人妻久久| 国产毛片久久久久久久| 久久久熟女一区| 欧美色色色| 亚洲欧美高清无码| 亚洲黄色网址| 91操操| 张柏芝国产一区在线观看| 91美女在线视频| 婷婷AV一区二区三区| 久久精品国产亚洲av水密被窝| 伊人久久青青草| 麻豆AV96熟妇人妻| 久操凹凸视频| 蜜臀网 一区| 青青操少妇| 国产一区二区三区精品观看啪| 9久久久久| 青青草色插素人| 婷婷亚洲天堂| 久久久国产av美女私房| 九九久久国产精品怡红院| 99国内精品| 天天视频黄网站| 亚洲欧美小说| 亚洲情色综合网| 国产超碰国产97| 国产强奸AV在线| 97国产精选| 操人妻逼91| 超碰99热| 国产一区二区a毛片| 青青草一区二区高清无码视频| 久久111| 大香蕉综合| 黄色片一区二区三区四区五区| 麻豆色99999| 暖暖精品二区三区观看| 国产版a级片直播在线| 国产福利一区二| 91女色| 亚洲综合一| 五月天色图| 很很热性爱视频| 日本日皮视频逼| 伊人网免费视频| 九99久久| 欧美天天综| 超碰九色| 免费精品人妻一区二区三| 熟妇综合一区二区三区| 久久精品综合| 97人人爱人人做人人乐| 日韩欧美麻豆大片| www久久久| 一级久久性爱视频| 亚洲国产尤物yw在线观看| 中文字幕精品探花视频| 春色91| 男人女人18禁片免费看网站| 国产无马av| 国产操操日韩三级黄| 欧美十八禁视频| 天天看天天日天天操| 人妻精品一区二区| 精品人妻无码一区二区三区不卡-精品人妻无码一区二区...|精品少妇一区二区三 | 女优大全 - 91n| 亚洲久久天堂| 人妻喷水| 亚洲欧美激情小说| 中文字幕av一区二区三区人妻少妇| 青青草字幕AV| 久久大精品乱码视频人妻熟女| 久插综合| 久久111| 东京成人一区| 久久男人网| 麻豆AV短剧| 美国久久一二三四| 国产欧美日韩臀| 久久中日麻豆| 日本999精品| 丰满精品人妻少妇久久字幕| 97超碰资源网| 亚欧美综合网。| 夜夜操一区二区| 日本最新1区2区3区| 欧美在线色图| 国产高清不卡视频| 少妇内射www在线观看视频| 91天射| 色哟哟av网址| 欧美,日韩,中文,另类| 国产一线二线三线av| 91人妻人人澡人人爽人人精品| 国产久久久久久| 欧美人与动性人交a| 激情小说图片亚洲首页| 草莓精品视频在线免费观看| 亚洲无码?第一页| 凸凹视频在线观看| 99热精品在线| 嫩草 人人网精品| 9999九九九久久久| 91高清日| 国产一级高清免费观看| 国产传媒午夜理伦精品| 美女极品一区二区三区| 五月丁香啪啪网| 99色悠悠| 91日产欧美| 日韩人妻 中文字幕| 在线性黄高清免费视频| 六六久久日韩不卡| 久久爽爽精品| 999色欧美中文字幕| 香蕉人欧美综合| 国产乱伦亚洲| 中文字幕在线观看视频www| 国产精品久久9| 美女91色黄18| 丰满人妻一区二区三区色-百度| 欧美精品23| 欧美十八禁在线看| 亚洲中文人妻色| 欧美激情黑人| 久久精品国产亚洲5555| 日韩AV无码中文一区二区| 99热| 综合久久99亚洲人妻中文在线| 精品人妻高清麻豆av| av一区二区三区不卡| 日本中文字幕在线电影| 中 文字幕一区二区三四 五 区日 日 骚 | 把腿张开老子CAO烂你| 天天干天天插| 少妇第一页| 夜草网站| 六月丁香五月婷婷| 精品人妻无码一区二区三区不卡-精品人妻无码一区二区...|精品少妇一区二区三 | 黄色高清无码无码破解免费暗网| 一区麻豆 高清中文字幕| 精品国产久久乱码| 老熟妇乱轮| 国产原创剧情在线丝袜| 亚洲第一色页夜| 99久久综合网| www.91欧美| 午夜精品久久一区二区| 99色天堂| 免费国产| 亚洲第一黄色av网站| 国产精品对白内射| 伊人超碰97| 无遮挡h肉动漫在线观看| 色 亚洲 91| 一二三区操逼国产91| 亚洲va综合va国产va中文| 日日干夜夜欢| 女人被男人桶爽视频网站| 国精品一区二区三| 婷婷五月天激情四射| 亚洲中文字幕精品久久久久久直播| 欧美97视频| 手机午夜电影神马久久| 精品免费1| 综合欧美亚洲| 丁香五月偷拍| 日韩成人小视频| www黄片免费看com| 超碰无码五月97| 中文字幕国产| 另类av综合久久| 国产精品ⅴ无码大片在线看.| 内射白嫩美女| 天美传媒婬乱在| 一区二区激情国产熟女| 草久在线| 婷婷色综合| 992大香蕉| 激情综合五| 国内一级精品| 亚洲精品丝袜-不卡成人免费……| 中文字幕一二三av| 后入福利| 美女黄频a美女大全免费皮| 九草九九九| 日韩性爱小视频在线观看| 女上位精品在线| 国产粉嫩出水在线播放| 另类图片五月天| 国产高潮AA片免费看| 国内一级精品| 久久黄黄| 精品国模无码| 好屌色综合| 免费作爱一级视频| 我爱操| 婷婷久久综合| 美女裸体无遮挡永久免费观看网站| 黄色成品网站| 97精品熟女少妇一区| 欧洲性人爱视频| 久久婷五月天| 欧美激情久操网| 99www.bibizy香蕉资源国产一区二区三区高清 | 青娱乐手机日韩在线视频| 日韩一级特黄av毛片| 综合色久欲| 人妻嗯啊啊在线播放| 高清有码一区二区| 亚洲精品蜜桃久久久久久久| 欧洲一级性爱视频在线观看| 欧日韩一二三f区| 国产女上位好爽在线| 眼镜人妻101.com| 久久中文字幕女同性恋一区| 五月天大香蕉| 中日韩一区二区三区欧美| 一区二区视频你懂的| 狠狠色狠狠色狠狠五月| 在线视频资源| 亚洲自拍另类丝袜综合| 激情终合网| 玖玖玖玖精品国产剧情| 精品午夜福利| 日韩美女高潮喷水视频| 五月丁香| 成全在线观看免费观看| 高颜值美女口爆高潮浪叫| 成人无码专区精品视频| 国产激情在线| TS人妖另类精品视频系列| 蜜臀aV午夜一区二区三区| 亚洲色图大香| 91c色| 超碰97久久| 久草老司机| 欧美色图片91| 久久久久国产无av| 波多野结衣之双飞调教在线播放| 精久久久| 欧美 传媒 麻豆 日韩 偷拍| 久久露脸国产老熟女| .精品人妻一区二区三| 哈哈操 大香蕉| 日本人妻天堂网站在线播放| 熟妇在线视频一区二区| 国语国产操逼伊人AV网| 人妻少妇久久中文字幕一区二区 麻豆| 动漫av中文| 亚洲综合网电影91| 亚洲性爱无码乱伦av| 国产v片在线免费观看| 岛国激情视频在线观看| 精品96久久| 白丝被操91| 久久久久久久久久久久色网| 天天干人妻| 任我爽视频在线观看| 国产成人无码网站在线视频| AA级电影三区| 亚洲天天综合| 亚洲人久久久久日| 精品久操| 国产精品视频自拍在线| 久久黄人人爽视频| 91综合天天看| 女同性恋中文字幕| 新视频sss国产| 吉田爱美AV在线| 啪啪91| 亚洲综合小说另类图欧美视频激情小说色五月天| 干干干天天| 国产美女裸体秘 永久无遮挡| 久久久久亚洲Av无码专区老牛影视 | 综合伊人网12色| 黄页av| 九色黄站| 亚洲自拍97| 淫淫综合网| 欧美综合中文| 国语精品av| 午夜操一视频一区| 国厂麻豆77q4| 无码人妻一区二区一牛影视| 色五月综合网| 国产热RE99久久6国产精品首| 欧美成熟性爱精品| 欧亚无码视频| 大香蕉乱级| 国产二区视频在线观看电影| 蜜乳Av成人片网站| 玖玖爱在线视频免费观看| 粉嫩av在线| 亚洲本色精品一区二区久久| 草草电影院| 丰满人妻一区二区三区免费 | 天操老女人| 超碰538| 国产大陆天天艹| 岛国激情视频在线观看| 少妇一级婬片免费放一级a性色.| 自拍偷拍草一草| 欧美日韩大黄片| 国语国产操逼伊人AV网| 亚洲制服欧美另类内射| 亚洲国产欧美中文永久| 丁香六月婷| 1024久久高清视频| 国产高清不卡视频| 久久同城AV| 国产夫妻性生活视频| 亚洲a色| 91欧洲国产成人久久精品网站| 欧美十八禁视频| 亚洲成a人片在线观看中文!!!| 另类一区| 欧美视频在线第3页| 亚洲AV资源| 超碰久在线天天做| 99rre在线精品99re8| 伊人操| 日韩欧美成人午夜福利| 亚洲偷拍自拍在线视频| 夜夜嗨AV一区天天| 日韩在线97| 自拍啪啪视频| 久久久97| 五月丁香六月综合缴清无码| 亚洲一区二区三区中文字幕| 欧美性爱第一区| 国产伦精品一区二区三区在线观| 荡小穴在线观看| 东京热不卡视频| 九九九九精品精| 中文字幕精品一区欧美| 九九碰九九爱97| 欧美久久婷婷| 操久久久久| 一级成人性爱| 五月天婷婷综合| 综合欧美日韩在线| 2017天天插| 国产成人综合在线播放| 深爱五月天| 日噜夜夜夜夜夜夜夜夜夜夜爽爽爽爽爽爽爽爽爽爽爽爽 | 日本性爱网址| 日本久久超碰| 久草毛片| 日韩免费高清大片在线| 国产成人自拍视频在线| 精品国产91久久久久久一区黄无| 蜜桃香蕉久草精品在线| 久久精品国产AV一区二区三区| 亚洲欧洲综合视频在线| 青青草啪啪网| 中文字幕AV中出| 亚洲精品xxx| 天堂av2019| 亚洲春色欧美| 人干人人人操人人摸| 中文字暮97| 情色五月天就去干| 国产精品区在线12p| 精品四五区| 四季av一区二区凹凸精品小说| 91AV入口| 国产剧情一区在线观看| 骚货 中文字幕 av| 欧美一级久久久丰满| 婷婷色导航| 色哟哟AV| 免费一级黄色录像影片| 天天操天天射青青草| 色欧美在线| 伊人黄色视频免费观看| 精品九九九九九九九| 婷婷婷婷婷婷久久久久| 丁香激情网| 亚洲日韩欧美一区二区| 涩综合导航| 麻豆久久久久久久久丝袜| 久9九综合在线| 91精品黄在线观看| 蜜臀在线看片| 一,爱啪啪,在线免费视频| 精品97久久综合| 激情小说图片亚洲首页| 九九九九88| 78超碰| 亚洲欧洲国产综合av| 亚洲综合九| 一本色道综合久久欧美| 少妇被玩视频二三区| aa片毛片| 操穴国产| 97伊人| 成人性爱美曰韩| 亚洲Av噜噜一区二区三区妖精| 综合色图,成人综合网| 日本97久久| 九月丁香综合网| 亚洲色图欧美色图制服诱惑| 亚洲小电影免费涩涩成人在线高清| 久久一区,青青青青草视频在线播放| 日韩欧美传媒一区国产| 操逼逼福利视频| 国产成人精品一区| 999国产精品999| 极品少妇久久久久| 超碰在线国产| 超碰99在线| 精品一区二区三区蜜桃臀赵总 | 成人电影一区| 久草新在线| 国产精品久久久久久夜夜夜| 日韩精品一区二区高清| 91综合国产精品| 国产亚洲日本精品在线| 中文字幕国产| 东京热亚洲一区二区| 91综合色| 新97国产超碰| 免费看久久久性性| 男人的天堂视频精品乱在线| 欧洲综合视频| 视频在线观看免费一区二区三区| 亚洲清纯唯美| 91大学精品激情戏| 午夜毛片亚洲精品片国产久久久| 蜜臀av一区二区三区免费观看| 性色aV一区二区三区噜噜| 亚射在线| 国产成人亚洲精品无码古代早漏男| 欧美激色| 9+1视频网址| 国产一区二区啪啪视频| 超碰伊人在线| 国产1769在线| 日韩三级av片| 久久久久久性爱片| 日韩欧美成人综合在线| 久久久久久十| 嗯……啊…嗯嗯…啊…好舒服| 天天躁日日躁xxxxx| 农村少妇久久久久久久| 亚洲精品天天影视综合网| 熟女人妻一区二区三区| 校园春色 欧美| 激情五月天校园春色网| av天天在线观看| yellow网站免费观看日韩高清无码| 亚91网| 色天堂综合| 久草婷婷| 免费一级a毛片久久久久久鸭绿欲| 欧美性第1页| 青苹果影院男人的天堂| 国产超碰人人操| 少妇厨房愉情理伦片bd在线观看| 91精品操美女| 97久久免费| 五月天丁香| 首页中文字幕中文字幕免费| 小说区 图片区色 综合区| 国内一区二区三区| 国产超碰在线一区| 久久久无码国精品无码三区三区| 日韩国产欧美伦理在线| 97综合久久| 91天天综合在线观看| 67194无码不卡| 色五月激情网| 日韩一性一交一A片俄罗斯| 亚洲猛交| 九热大香蕉| 另类小说五月天| 五月天婷精品激情| 蜜臀av在线播放一区二区三区| 思思热在线cao| 青青青国产手线观看视频2| 精品传媒在线一区| 亚洲久草AV色图| 中文字幕精品久久久久人妻红杏ⅰ| 久悠悠av| 色欧美天天| 综合一区中亚洲国产成人综合精品 | 人妻 欧美 中文| 磁力99AV| 自拍二页| 男人久久精品| 男人网站婷婷| 精品一区二区三区四区外站 | 久久久久网站-538在线视频-欧美永久乱码 | 日韩av在线精品观看| 久久69| 久久伊人影院| 97资源站日韩| 91久久国产精品| 91精品操美女| 精彩久久中文| 操91| 青青操视频在线| 麻豆国产成人精品| 欧美夜色| 秋霞一区二区三区四区五区六区七区| 日韩AV中文字幕电影| 97亚洲综合电影| 欧美色棕合| 人妻激情另类| 精品-91人妻子系列| 在线观看亚洲专区| 国产视频一区二区三区在线免费观看| 久久专区| 久久无码精品| 国产亚洲色婷婷久久99精品91 - 百度| 97超碰色色| 中国一级αV| 91国产操逼视频| 国产av激情无码久久天堂| 精品久久久久久AV无码| 久久欲| 亚洲日韩美国人妻| 亚洲导航深夜福利| 尤物国产一区在线观看| 狠狠亚洲| 精品妇操一区二区三区| 九九九九九九免费视频| K8久久久久| 78超碰| 欧洲黄色网| 狠日操| 久99视频| 丁香激情网| 麻豆 欧美 日韩| 亚洲 欧美 小说| 熟妇国产免费一区| 亚洲久久天堂| 韩国一级做a久久久久| 成人无码在线视频网站| 3P乱轮视频| 综合色播|