亚洲有码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 丝袜在线观看| 日本精品一区二区中文字幕| 不卡在线观看视频| 96精品在线| 久久春色| 很狠操| 久久久久久国产精品免费网站| 97看操| 色综合尤物| 久操国产在线| 九七人妻在线| 国产精品对白内射| 国产又爽又黄| 国产一区二区三三视频| 91日韩网站| 91红杏| 成人七区| 欧美区亚洲区偷拍区| 1024手机看片欧美日韩| www.五月天| 一级二级三级黑人无码| 久久久97| 国产精品农村妇女精品| 东京热熟女亚洲视频网站| 久久98| 日本一区二区三区免费观看| 欧州91高潮| 亚洲天天精品| 久久久草草精品| 91老熟女逼| 人人色人人操在线| 香港成人一级视频在线青青草| 67914在线兔费成人视频| 天天天干977| 亚洲一区二区三区AV无码| 一本道综合色图| 天天干天天日天天射黄色片| 成人精品在线| 色偷偷综合91久久噜噜| 欧美网站免费| 97久久超碰国产精品| 在线观看日韩av不卡| 东京热精品97综合网| 大香蕉十区| 91红杏| 啪啪免费| 精品制服美女中文一区二区三区| 日本操逼视频导航| 午夜乱轮操逼视频免费看| 中文字幕一区二区三区四区在线视频| 偷拍 亚洲 欧美| 91欧美高清| 亚洲视频小说| 蜜乳AV网址| 色嗨嗨在线| 91超级碰| 二区熟妇韩日| 97天堂| 啊啊啊啊免费视频| 黄色电影在线播放综合网站| 久久精品美女一区| 亚洲男人的天堂AV| 天天日天天干少妇日| 久久精品人妻一区| 中文字幕一区二区三区高清| 亚洲欧美在线观看2021 | 国产青视频| 97超色| 精品69网| 多乙久久久久久| 精品人妻一区二区三区-国产精品| 96免费视频在线| 国产精品欧美在线观看| 日韩乱伦影音先锋| 人妻AV在线| 玖玖爱一区在线| 少妇无码999| 性在久久久久久| 丁香五月激情综合| 欧美传媒一区| 国产一区二区三区导航| 亚洲和欧美裸体美女双飞视频| 中韩中文字幕在线观看| 国产精品极品美女视频| 特污免视频| 一本色道久久综合狠狠操| 国产精品久久久久久高清无码免费看 | 中国农村熟妇毛片视频| 国产人妻精品久久久一区二区三区 | 成人性爱电影一区二区| 久久精品操| www国产天美久久久| 中文字幕人妻色偷偷久久皮| 日本高清免费一本视频在线观看| 久久视网78| 日韩电影在线观看网址| 国产精品爆乳懂色蜜乳| 99碰碰| 中文字幕丝袜| 五月激情小说| 熟女乱伦A| 亚洲精品乱码线路中文字幕 | 凹凸视频在线一区二区| 91精品国产综合久久久蜜臀酒店| 青青久久艹| 欧美人与动性人交a| 五月丁香激情四射| 色y情视频免费看| 天天摸夜夜添无码小视频| 免费在线观看国内色片网站网址| 日本在线播放不卡一区| 人妻天堂综合网| 禁止观看美女黄| 1024手机看片欧美日韩| 超碰97极品9| 欧美激情久操网| 亚洲色图欧美色图日韩色图| 综合一区中亚洲国产成人综合精品 | 免费一级视频特黄色大片| av线电影| 亚洲第一页综合在线| 色成人Www精品永久观看| 欧美国产视频| 久久亚洲欧美中文字幕国语| 久久久久久9999| 一级做受视频免费是看美女| 日本99久久| 九九九只有精品| 懂色AV蜜臀无码精品APP| 中文字幕精品久久久久人妻红杏ⅰ| 日韩欧美午夜一区二区| 中文一区在线日| 97精品国产精品免费观看| 麻豆国产成人精品| 一本久道久久综合狠狠爱一密臀精| 久久是精品| 9Ⅰ超碰| 啊啊啊好想要| 国产精品人人爽人人做可爱福利| 中文字幕91页| 色妺妺在线视频| 麻豆久久久久久久久丝袜| 日韩ab网 | 久久超碰97| 美女主播色欲91抠b在线播放| 91高潮喷水美女| 欧美人妻少妇| 亚洲欧洲精品成人| 操我啊啊啊啊啊| 精品人妻一区二区三区不卡断| 天综合中文| 天美传媒av在线| 欧洲亚洲少妇| 日韩无码黄色片| 日本久久精品| 日韩 欧美 视频 在线 一区| 亚洲高清无码AAA久久久精品| 日韩激情啪啪| 九九九久千久久激情蜜桃在线看 | 老熟女网站| 免费观看性欧美一级| 亚洲精品99999| 久久久久久加勒比| 欧美成人9797| 神马午夜久久| 中文一区在线日| 亚洲天天自拍| 欧美一区二区| 亚洲第一在线视频| 五月天亚洲色图| 久久欧洲| 日韩成人免费电影| 人妻少妇被猛烈进入中| 国产91亚洲精品一区二区三区| 天天综合~91| 丁香激情网| 亚洲国产成人福利在线观看| 丁香五月成人| 国产精品白丝在线播放| 免费视频一二三区| 亚洲和欧美裸体美女双飞视频| 婷婷综合在线观看| 99无码精品| 国产熟码AV| 青青国产精品在线| 操逼操操操91| 91在线视频国产网站| 留下AⅤ黄色片| 日韩久久激情精品| 三及片网站| 亚洲日韩精品一区二区| 亚洲日韩欧美一区二区| 97视频在线免费看| 亚洲国产第一页综合视频| 操操逼操操逼操操逼逼| 超碰97人人乐| 另类 综合 日韩 欧美 亚洲| 人妻天堂综合网| 操逼1区| 久久久久夜夜夜夜| 美女黄网| 精品免费囯产一区二区三区| 日日干男人的天堂| 久久av色| 亚洲熟女中文字幕在线| 久久综合资源一区二区| 久久香蕉国产线看观看亚洲女人 | 3p国产欧美99热| 欧美色另类| 亚洲在线观看| 久欲AV| 日本人妻天堂网站在线播放| 操逼内射干逼白丝91| 九九热免费国产视频婷婷伊人五月 | 91在线精品| 综合 欧美 亚洲 日本| …亚洲黄色厕厕女女在线播…| 久久男人网| 欧美最婬乱婬爆婬性视频| 亚洲天堂中文字幕无码男同| 91中文在线| 我要看免费韩日黄片| 国产精品视频精品一二| 国产黄a三级三级三级av在线看| 欧美九9 9 9| 综合自拍| 长长久久88视频| www.狠狠| 台湾佬中文娱乐自偷自拍| 亚洲日产专区| 久久这里精品国产99丫e6| 亚洲色图 欧美热图 清纯唯美 另类自拍 | 国产女人高潮嗷嗷嗷叫小说| 黑人无码一区二区| 欧美一区二区亚洲天堂| 亚洲午夜AV| 可以看的av| 国产AV久久久蜜爱影集| 亚洲天堂,男人| 一区二区三区精品黑丝白丝酒店对鸡 | 欧美日韩*字幕一区| 亚洲欧美日韩制服另类| 国产成人亚洲精品无码古代早漏男| 伊人久久在线视频观看| 免费黄色片子| 欧美在线伊人色| 日韩欧美麻豆大片| 97超碰巨乳| 欧美玖玖爱免费玖玖| 久久久久人| 嗯嗯啊啊啊好爽| 国产精品久久久| 欧美伊人久久综合网| 91爆操视频| **一级毛片国产| 天天狠| 九九九九九九成人| 91超碰碰在线| 蜜臀99久久国产| 一级AV性爱| 一本大道不卡一二三区| 一级黄色牲爱A级片| 又大又白奶子| 亚洲在钱| 国内精品99999| 超碰精品日韩欧美国产| 黄片在线免费在线观看| 嗯……啊…嗯嗯…啊…好舒服| 操淫穴亚洲五月丁香 | 人人爱人人乐人人操| 成人av在线播放| **一级毛片国产| 神马午夜久久久| 国产97综合| 热99这里有精品综合久久| 国产AV无码AV| 亚洲激情网一二三四区| 国模久久在线| 手机在线中文字幕国产| 国产乱码久久| 欧美最婬乱婬爆婬牲视频| 色欲三区| 宅男午夜在线视频| 伊人宅男大香蕉 | 素人美腿视频网站| 美女91AV| 啪啪一区| 99热99re6国产在线播放| 青草伊人网| www.色吧5.com| 亚洲精品影视老司机| 91美女中出| 啊啊啊久久久视频 | 久久精视频美日韩在线视频| 黄总AV色图| 91性网| 乱伦日本色图AⅤ| 久神马| 尤物网站91| 亚洲精品男人的天堂| 999久久芭蕾| 日本国产欧美高清在线| 国产精品久久久亚洲一区| 亚洲视频小说| 91看黄片| 精品久久久中文字幕不| 91综合色| 熟女一区二区三区| 操逼不卡中文字幕| 午夜无码熟妇丰满人妻| 岛国大片国产| 99精品网站| 极品销魂美女一区二区| 综合97亚洲| 日韩激情啪啪啪| 91中文精品日韩欧美在线| 久久婷婷电影网| 久久女人视频| 18禁在线视频| 艳美熟妇先锋一二三区| 免费1级a做爰片观看| 亚洲s在线观看| 综合激情五月天| 欧美人妻熟女在线| 97网址www| 男人天堂导航| 中日韩欧美精品无码AⅤ一区二区| 久久成年精品| 成人免费不卡在线视频| 97超碰护士| 日日干日日操五月天伦理视频| 影音先锋每日最新资源在线观看| 一本一首道人妻少妇免费久久| 国产精品久久久久久久久久二区三区| 亚洲密乳AV| 99精品无码| 久操九九九九| 欧美成人性爱视频大全| 亚洲激情综合另类| 久久九九精品一区二区| 6080yy午夜理论三级一区二区三区无码| 精品性爱| 天天热精品| 日韩精品 资源| 性爱视频免费网址| 大香蕉淫人网| 超碰天天操| 日本黄 R色 成 人网站| 69国产对白刺激| 婷婷九月| 人人做天天爱| 伊人少妇久久久| 中文一区二区婷婷视频| 婷婷六月色| 成人自拍三级在线观看| 日日骚av| 老女人老91妇女老热女| 91人人爽人人爽人人人,gav福利视频导航,日韩欧美亚洲国产字幕四区 | 天天干美少妇一区| 国产无马视频| 国产欧美在线观看免费观看| 欧美姓爱综合网| 加勒比无码一区二区三区| 免费公开人人操| 天天网综合| 国产精品电影推荐| 激情自拍 校园春色| 第四色奇米影视777| 综合欧美亚洲| 嗯~啊~轻一点 视频| 东北女人操比视频| 一级免费啪啪片| 亚洲日韩视频二区| 欧美一级美片在线观看免费| 97色综合中文网| 嗯嗯啊啊好大好爽| yazhousetuoumei| 熟女丰满人妻一区| 97网址www| 黄污污污污| 色呦呦呦在线观看视频| 涩涩这里只有精品视频| 国产高清成人免费视频| 91综合熟女| 9九九国产| 青青伊人久久| 欧美日韩亚洲五月天婷婷| 久久精品亚洲婷婷| 91 亚洲 欧洲| 男人的天堂2010| 91超级碰碰| 亚洲 欧美 手机在线观看| 天天躁日日躁成人字幕aⅴ| 天天爽天天操啊啊啊| 久久精品无码熟妇一区二区三区视频导航| 无码一区二区三区四区五区六区七区八区九区十区视频 | 国产亚洲 中文欧美久久| 人、人、摸,人、人、草| 日韩美女操b| 精品久久久久久无码| 国内伊人久久久久久网站视频| 亚洲男人天堂手机版| 5252色欧美在线男人的天堂| 中文字幕乱妇免费视频| 久久久四区| 91欧美大片| 日本成人在线不卡一区二区三区| 久久大黄片| 黄色免费网| 久久免费99精品久久久久久| 蜜乳AV免费观看| 女人被男人桶爽视频网站| 日本熟女中文字幕一区| 婷婷丁香熟妇综合网| 五月婷丁香| 天天欧美色| 亚洲激情网一二三四区| 精品97精品97| 日韩精品人妻中文字幕不卡乱码| 超碰97亚洲| 亚洲伊人成综合成人网| 国产一区在线观看无码AV| 亚洲国产欧美另类自拍| 亚洲精品视频在线播放| 日韩人妻精品久久久久| 91艹逼精品| 国产中午字一暮区| 97干在线| 中文字幕精品一区二区精| 3p国产色噜噜一区| 成人无码专区精品视频| 一区二区首页| 天天日夜干| a一区二区三区乱码在线| 在线精品福利免费播放| 亚洲国产第一页综合视频| 另类欧美色| 国产精品爆乳懂色蜜乳| 在线观看日韩av不卡| 丁香激情网| baiduhicn.com。| 尤物视频新赏网鲜网色诱网| 激情五月综合开心五月| 国产91久久九九免费精品无码| 一区二区激情国产熟女 | 亚洲日韩av专区无码| 日韩欧美中文| 日本少妇va7777| 亚洲色婷婷综合久久一区二区三区| 人人操,人人液| 久久亚洲精品成人av| 97色碰| 超碰97网址| 熟妇一区二区| 18禁免费视频| 超碰精品在线| 久久精品高清无码一区| 青青免费在线视频一区 | 国产精品久久久九九九| 一级一性爱免费视频| 啊视频在线| 操操操操网黑人| 伊人九九| 激情色播| 97久久超碰日韩精品| 欧美亚洲一级在线观看| 婷婷色网| 日本欧美中文字幕| 秋霞曰韩R级| 看看日B真人视频| 亚洲国产精品无码AV久久久| 看看小穴| 久久在线观看免费视频| 日韩情色视频| 久久精品女同亚洲女同13| 亚洲欧美综合区自拍另类| 天天综合网在线| 亚洲色图欧美色图另类图片| 熟女字幕| 亚洲色综网| 欧美性爱1080p| 97欧美色资源| 在线观看免费视频国产| 色综合中文字幕不卡| 国产精品欧美在线观看| 亚洲欧美成人在线| 欧美性爱超碰97| 久久综合婷婷| 热热色综合网| 五月丁香六月婷| 国产路线专区| 精品久久在线区一区| 色婷婷国产精品一区在线观看| 99亚亚热| 人人么人人操| 欧美熟女妇同| 欧美经典一区二区三区| 韩三级a视频在线观看| 国产嫩草精品A88AV在线| 91在线视频国产网站| 国内黄色精品| 久久男人精品| 大香蕉性欧美| 在线观看一卡二卡| 人人干黄色| 人人妻天天做天天爽| 久久老子无码午夜伦不卡| 91欧美情色| 91女在线观看| 国产麻豆福利av在线播放| 天天摸天天舔天天操| 黑人猛交| 五月婷婷丁香六月丁香| 蜜桃久久久久久| 国产Aα| 91国产伊人大香蕉| 欧美夜夜狠| 亚洲欧美色图小说| 97爱爱官网| 欧洲无码一区二区| 91精品国产日韩欧美综合| 亚洲性刺激| 日韩一区二区熟女| 国产一级黄色片在线观看| 人妻一区二区三区熟女| 狠狠躁AV| 综合婷婷| 日韩中文字幕国产| 国产丝袜啪啪| 97精品久久久久中文字幕| 9久热| 精品无码不卡视频| 中文字幕欧美丝袜07资源| 天天干人妻| 偷拍欧美综合| 久久99午夜精品一区人妻| 在线天堂资源亚洲| 四虎免费视频| 亚洲高清视频在线观看| 成人五月香网在线| 精品国产肉丝袜在线拍国语| 午夜视频黄| 亚洲资源站| 我爱搞逼综合网| 日韩一级二级在线| 婷婷导航| 天天躁日日躁AAA片李宗瑞| 17c嫩草51久久91嫩草| 全国男人天堂网| 成人在线午夜视频一区| 91欧美偷拍| 人人乐大香蕉| 激情综合五| 色官网在线| 国产美女销魂在线观看不卡| 超碰在线人妻中文字幕| 国产剧情在线| 久久久久久久性爱| 欧亚 另类 久| 97色综合中文网| 天天射天天色成人| 国产精品夜夜夜| 伊人国产av| 久操99| 午夜精品久久久久久久男人的天堂| 亚洲成人久久一区二区| 吖在线不卡一区二区国产剧情| 久艹日日日| 天堂综合网| 亚洲资源吧| 人妻少妇无码| 欧美激情 亚洲色图| 操逼无毒无码免费视频| 久久超碰日韩精品| 殴美性天天| 五十路三区在线| 搡老女人老91妇女老熟女| 日本αv| 国产无码久久高清| 日韩中文字幕人妻视频| 强奸乱伦动态污图免费| 成人精品在线观看| 97资源超碰| 久偷拍| 青青欧美| 人妻丝袜二区| 日韩成人无码| 亚洲成熟国产精品美女| 五月丁香六月婷| 亚洲人精品久久久喷水| 丰满精品人妻少妇久久字幕| 久久久精品视频欧州站| 91久久婷婷| 久久久久久久久久va| A V视频日本| 久操热| 国产乱婷婷精品二区三区| 日韩精品电影| 97久久超碰日韩精品| 九九无码| 丁香九月婷婷| 一本一道vs波多野结衣| 嗯嗯啊操我| 亚洲视频,小说| 亚州欧美综合| 操逼A∨| 国产熟女完整版中字| 99精品成人免费看| 美女露胸露奶头| 九一屌逼| 狠狠色五月亚洲91| 亚洲啪啪视频免费| 欧美经典一区二区三区| 婷婷亚洲天堂| 韩国女主播青草在线| 91欧美性| 九九九色| ?亚洲伊人伊成久久人综合网| 这里是精品| 老女人91| 久久国产在线一区二区| 爽 好舒服 无码刺激久久| 狠狠中文字幕| 欧美人妻色| 亚洲精品电影| 91人妻素女| 婷婷色香| 综合网97| 特级特黄一级毛片免费| 日韩欧美视频青青| 超碰到97情色| 国内毛片无遮挡国产| 一本道综合色图| 超碰精品人妻狠狠干| 色屁屁影院www国产| 一区二区三区探花在线观看| 伊人影院中文字幕| 九九九九免费高| 强奸乱伦AV一天堂网| 熟妇熟女视频一区二区三区| 天天天干977| 夜间福利片1000无码| 人妻无码久久一区二区三区免费| 大香蕉78| 五月天综合网| 99热这里只有精品18| 不卡啪啪视频| 天天干1区2区在线| 中国东北熟女老太婆内谢| 天天享受天天看| 日韩av在线精品观看| 97九色人妻| 天天综合97| 久久久久13| 韩国三级色呦呦| 91熟女视频网| 天天色播亚洲综合网站| 岛国999| 国产精品亚洲一区二区三区四区| 精品国产乱码久久久兰草影视| 国产精品天堂| 嗯啊不要在线观看嗯啊| 丰满人妻-区二区三区免费看| 精品超碰国产| 精品女同一区二区三区| 大香蕉综合在线| 九九热精品视频六| 五月丁香久久| 九九九九AV| 美国美女AV在线| 中文操逼字幕| 99蜜桃臀亚洲成人在线观看| 强奸乱伦中文字幕AV| 午夜福利在线视频1000| 日本一区二区做爱的视频| 国产精品久久久久久久久久二区三区| 人人透人人操| 999热这里只有精品| 日韩av不卡在线观看| 99久在线精品99re8| 日韩999| 日韩97在线| 熟女丰满人妻一区| 国产婷婷综合在线观看| 日日夜夜噜| 浪人综合网| 超碰欧美COM| 99性视频| 国产精品又黄又猛又粗| 大香蕉伊利av| 亚洲九月丁香| 69一区二区三区| 欧美成人亚洲精品| 亚洲九月丁香| 夜夜爽夜夜| 日韩78m视频| 欧美性爱视频免费一区一A| 91中出视频| 久久久久久性爱视频| 亚洲欧美日韩免费观看| 麻豆av一区二区三区| 2019天天干天天操| 78超碰| 久久曰曰| 婷婷六月色| 亚洲影院无码在线| 后入合集| 老熟女熟妇| 日韩探花精品在线视频| 超碰人妻久久| 91 刺激在线| 91午夜无码| 国产97在线 | 亚洲| 日本不卡二三区| 99久久精品无码一区二区| 丰满人妻-区二区三区免费看| 久久做97| 五月天婷婷成人网| 亚洲第一黄色av网站| 欧美+日产+中文| 国产精品久久久久久夜夜夜夜| 国产欧美伊人| 大伊香蕉在线视频免费| 国产在线视频二区| 亚洲国产成人精品女人久久久| 精品无码一区二区人妻久久蜜桃| 亚洲 欧美 中文 日韩超碰| 欧美性爱中文字幕无线码| 狠狠爱大香蕉| 蜜臀99久久精品| 99精品网| 99热99在线| 东亚亚洲无码高清| 天堂无码精品国产久| 久热影视| 国产精品麻豆成人av| 成人线上超碰| 亚洲欧美伦综合| 操久久久久| 亚洲大色鬼| 中出人妻中文字幕91在线| 人妻一区二区三区| 国产精品制服丝袜中文字幕日韩一区二区三区 | 99操| 天天看综合网| 色婷五月天| 亚洲天堂久久| 国产25页| 91网亚洲| 无码欧美有限公司| 五月天色色色| 97色婷| 成人a大片在线观看| 日本久操视频| 人妻日日干| 国产精品久久久午夜夜伦鲁鲁| 99re9在线| 亚洲中文字幕三级在线| 留下AⅤ黄色片| 国语av最新自产拍在线观看| 欧美人妻久久精品二区三区| 欧美午夜视频免费观看| www.yeyecao| 国产三级资源在线观看| 成人无码在线超碰网| 天天影视色香欲综合网小说| 国产精品不卡高清在线观看| 粉嫩av在线| 亚洲在线网站| 亚洲激情在线观看一区| 一起草欧美| 精品久久无码午夜福利| 午夜亚洲国产理论秋霞| 免费A片三p视频| 国产又黄又粗的视频| 草草网站影院白丝内射| 久久精品国产亚洲AV无码电影| 日本国产高清色www视频在线| 333kkkk·亚洲com久久| 国产精品老熟女一区二区| 欧美大香蕉在线观看| 人人摸人人干| 午夜毛片高清免费不卡| 日韩有码中文字幕女同性恋| 97久久久| 久草网站免费在线观看| 久久香蕉国产线看观看猫咪av| 国产一区二区啪啪视频| 日韩素人无码一区二区三区三州| 色第一页| 好爽要喷了| 国产99999| 国产一区二区三三视频| 亚洲一区二区三区欧美日韩| 99国产人成精品| 超碰人妻久久人妻中文97| 欧美超碰96| 无毛精品| 亚州欧美综合| 国内一区二区免费| 人妻少妇被猛烈进入中| 9久久精品| 久久超碰免费的| 97在线欧| 亚洲无码国产探花在线观看| 天天做日日做天天欢。| 大奶啊啊好爽 | 日韩精品99999| 九九九久久久久| 天天综合,91入口| 国产一二三在线视频五十路| 性爱视频无打码在线观看| 99色在线| 色阁阁AV综合网| 亚洲日韩国产精品| 日本人人操人人操| 国产精品午夜成人福利| 99色热| 国产Av超碰| 欧美综合自拍成人自拍第二十页| 亚洲美腿丝袜香蕉影视欧美成人| 激情小说日韩无码| 亚洲第一页色| 久久9 9 9精品| 精品高清牛人盗摄一区二区三区中文字幕A片免费在线观看 | 人妻精品一区一区三区蜜桃91| 青娱乐999| 唐山老熟妇露脸啪啪叫| 亚洲图片欧美制度| 久九色| 看免费的黄片| 69精品人人人人| 精品一级| 亚洲欧洲网站免费观看| 亚洲综合性网址| 无码人妻一区二区三区色欲aⅴ| 久热这里| 一二三区精品视频| 亚洲成?V人片在线观看福利| 98福利在线视频| 思思热国产高清| 五月天玖玖资源站| 天天日天天射天天干| 国产精品人妻免费精品| 亚洲精品一区中文字幕乱码| 国产精品白丝AV| 人人看人人爰人人操| 亚洲色堂免费视频| 97aiaiai| 97中文超碰| 欧美色91| 性爱AV天堂| 精品少妇999| 中文字幕日韩综合| 亚欧高清| 97网址www| 无码人妻精品一区二区三区99不卡| 国产欧美美女免费观看视频| 成年人黄色| 97玖玖人妻| 国产91亚洲精品一区二区三区| 浪人综合网| 91视频成人福利网站在线一区 | 这里都是精品在线观看| 蜜臀99久久精品| 国内毛片国产专区二| 97综合国产精品高潮久久| 亚洲熟女综合一区二区| 亚洲欧美一区二区三区在钱蜜桃 | 无码高清少妇久久| 欧美亚洲美少妇一区二区| 亚洲免费在线探花| 综合色图亚洲欧美| 91av一区二区在线观看| 黑人精品久久97| 国产精品一级片在线看| 欧洲精品区| 日本天天色| 亚州综合网| 吻戏激情性巴克| 啪啪性爱免费视频| 欧美第五页| 粉嫩国产精品久久粉嫩| 国产精品分类在线观看| 午夜综合在线| 国产成人网站在线观看| 欧美激情亚洲| 久久一留热品黄| 国产家庭乱伦表演| 日本精品一区二区三| 人人色人人操在线| 五月丁香黄色网| 智利AV在线网| 久久草大香蕉| 亚洲一区二区三区中文字幕| 日本久久久久久久久久| 蜜臀亚洲中文| 国产精品久久久久久久黄无码| 丝袜视频网国产90| 中文字幕精品丝袜| 亚洲四虎熟女精品| 深夜激情| 久久曰曰| 天天干美少妇一区| 欧美日韩色综合网| 久久久无码精品人妻二区| 久久久艹艹艹| 欧美色综合影院| 九九九精品色乱九九九| 九九玖玖精品| 97人人干| 亚欧成人综合影院| 91这里只有精品| 色香91| 久久免费看高潮毛片韩国| av天堂5| 玖玖爱影院| 另类图片亚洲加勒比另类图片亚洲加勒比另类图片亚洲加勒比 | 亚洲资源一区| a片亚洲一本通视频| 3571色综合一区二区二区| 无码视频黄色网战| 国产中文大片资源中文字幕| 熟女精品日韩一区二区三区| 91天美传媒精品| 人妻熟女午夜精品在线| 91综合色噜噜| 91精品丝袜久久久久久| 超碰在线第一页| 天堂国产AV| 99热这里只有精| 久久九九视频九九视频| 欧美亚洲情色| 伊人九九| 亚洲操操操无码| 国产日韩欧美| av九九| 国产天天骚| 大香蕉伊人久久| 狠狠激情综合狠狠操中文字幕| 青青草福利视频| 啪啪自拍九九综合| 中国少妇啪啪视频| 一本大道久| 亚洲天堂日本| 蜜桃久久久久久久久久久久| 91蜜臀熟女| 丁香六月综合激情| 激情小说五月天| 色5月婷婷| 久色网| 色色激情五月天| 国产成人自拍视频在线| 亚洲人妻中文在线视频| 边做饭边操逼逼| 一级AV性爱| 亚欧高清| 日韩欧无码一区二区三区免费不卡 | 欧美91色| 玖玖资源视频一区二区三区| 欧美在线 亚洲| 4虎在线视频| 啊啊啊在线看| 嗯嗯嗯啊啊啊干死我吧| 黄色一区三区| 啊啊啊啊啊好舒服视频| 少妇精品久久久八区九区| 欧美乱妇狂野欧美在线视频| 欧美性天天影院| 加勒比性爱成人在线| 中出人妻中文字幕91在线| 精品丰满熟妇人妻一区| 国产精品一区二区密臀| 久久成人网站| 在线看污网站| 国产传媒日韩欧美| 色视频蜜乳| 3d成人精品一区二区| 色香色欲天天综合网天天来吧| 国产激情久久久| 97亚洲综合电影| 精品久久在线区一区| 怡红院视频在线| 超碰97最新人妻| 精品综合久久久久久97| 黄片视频观看| 99re公开精品免费视频| 岛国片在线观看视频亚洲| 韩日男人的天堂| 99r九九| 五毛骚逼极品美女怕怕| 中文字幕、久久精品国产2020、久久综合久久自在自线精品自、亚洲 | 中国91AV| 欧美αv.com| 色综合久久久久| 超碰碰97| 91美女色视频亚洲| 这里只有97精品| AV乱伦专区| 国产三级日产三级韩国三级 | 久久超碰爱| 久久久99999久网站| 蜜臀99久久国产| 在线中文字幕| 久久98| 欧美在线啊啊啊 | 欧美偷拍区| 久久久精品国产亚洲AV无码| 久久美女国产| 亚洲精品 大香蕉| 激情四射五月天| 日本精品五区| 色婷婷狠狠18禁| 久久9久9久99久9久9| 国产中文字幕在线| 99久久婷婷丁香| 九九久久首页| 中国韩国明星一极片一区乱码毛片人妻熟女一区二区三区 | 97伊人超碰| 操www| 91无人区卡一卡二卡三乱码入口最新版:能让用户有更多选择的选择-经典说说-爱 | 日韩BBN| 超碰国产精品久| www.婷婷| 欧美色图片欧美色图| 亚洲另类欧美精品| 五月丁香啪啪啪| 91伊人大香蕉| 亚洲国产97| 日韩精品中文字幕二区| 青青草原人妻| 精品人妻一区二区免费看| 日韩欧美中文| 亚州色图狠狠干| 蜜臀视频网站| 被男人吃奶很爽的毛片| 婷婷丁香五月激情啪啪| 尤物视频新赏网鲜网色诱网| 久久直播国产| 超碰97男人| 午夜.DJ高清在线观看免费7| 9久久9综合| 日韩大香蕉| 九月丁香婷婷| 干少妇视频| hd成人一区二区在线| 久久久96精品| 日本精品无码三级网站| 久久亚洲骚逼综合| www久久久| 欧美色日本| 日日日日做夜夜夜夜无码| 97操碰| 天天操妹子| 激情五月天婷婷| 亚欧操逼片在线观看| 92人人操人人| 亚洲91综合| 手机看片1025| 少妇大屁屁| 色婷婷狠狠| 午夜精品久久久久久久久久久久久| www.色婷婷色综合| 激情黄色五月天| 中文字幕一区二区三区高清| 制服少妇欧美| 视频黄色国产一级| 欧美综合综合| 天天综合91在线| 久久九九热| 野狼激情网| 超碰色老头| 920日本午夜免费| 欧美洲精品一级| 色官网在线| 91色狼| 九九拍拍精品视频在线播放 | 久久蜜桃一区二区| 色优久久| 色呦呦国产精品免费看| 亚洲色性情三级| 高清无码 国产精品| 97在线视频观看免费| 亚洲麻豆精品二区三区| 1769一区| 精品一国2| 日本丝袜人妻内射| 91美女精品| 五月天黄色av| 亚洲成人性| 亚洲色婷婷综合久久久久中文| 天天操天天舔| 国产白丝av| 伊人久久大香线综合无码| aaa一级黄片| 国产日韩久久| 69人妻精品丰满熟女区| 五月丁香网站| 91伊人久| 久久人妻无码毛片A片麻豆| 人妻天堂综合网| 天天干天天燥| 亚欧美综合网| 久插综合| 丁香五月婷婷五月| 国产成年女人免费视频播放a| 超碰一区二区| 丁香五月婷婷五月| 亚洲h片在线免费观看| 日韩天天综合| 69人妻精品丰满熟女区| 亚洲色诱惑| 91人妻最真实刺激绿帽| 麻豆天天躁天天揉揉AV| 欧美久久久15P| 免费精品人妻一区二区三| 日韩猛交| 久久精品电影| 女人天堂AV五区在线| 欧美岛国精品在线观看| 日韩无码第3页| 久久香蕉超碰97国产精品 | 久久国产在线一区二区| 天天澡天天爽日日av| 麻豆60秒| 性无码专区2020| 久久综合久色欧美综合狠狠| 91老司机在线视频免费观看 | 国产AV久久久蜜爱影集| 内射夫妻三片| 啊v在线观看视频| 久久久久久久久久久久久女过产乱-少妇高潮一区二区三区喷水-成人AV | 国产女大学生AV| 小电影欧美91| 国产日韩欧美| 熟妇人妻一区二区三区| 丁香五月激情综合| 亚洲精品美女久久久久久久久| 黄色视频60分钟| 3PAV乱伦视频| 欧美高潮| 老女人老91妇女老热女| 中美日韩毛片| 国产乱婷婷精品二区三区| 天天日夜夜| 我要看免费韩日黄片| 1级午夜影院费免区| 夜夜欧美| 91久久国产精品| 91精品少妇搡搡搡| 99日免费视频中文字幕| 伊人精品视频| 你草精品在线视频| 91网亚洲| 亚洲欧美日韩有码| 人妻内射一区二区在线视频| 黄色十八禁网站| 神马久久久久久久久久久久|