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

ARTICLE DETAIL

資訊詳情

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

Linux內(nèi)核syscon框架:寄存器統(tǒng)一管理與驅(qū)動開發(fā)實(shí)踐

Linux內(nèi)核syscon框架:寄存器統(tǒng)一管理與驅(qū)動開發(fā)實(shí)踐 調(diào)過Linux內(nèi)核驅(qū)動的人大概都見過這么一幕設(shè)備樹里明明只是聲明了一個(gè)簡單的寄存器區(qū)域驅(qū)動里卻要ioremap、要算偏移、要加spinlock最后還會因?yàn)椴煌?qū)動改了同一片寄存器的值而互相踩踏。syscon框架就是為了收拾這個(gè)爛攤子而生的。它是一個(gè)“雜散寄存器區(qū)域的統(tǒng)一管家”在Linux內(nèi)核中占據(jù)著一個(gè)很微妙的位置——說它簡單它確實(shí)只是一個(gè)regmap的封裝說它重要從時(shí)鐘到電源管理再到硬件隨機(jī)數(shù)依賴它的驅(qū)動遍布整個(gè)內(nèi)核。這篇就圍繞syscon框架從它解決的問題出發(fā)一直講到設(shè)備樹配置、驅(qū)動調(diào)用、業(yè)務(wù)落地和踩坑經(jīng)歷。無論你是剛?cè)腴T的內(nèi)核新手還是在為某塊板子的寄存器管理發(fā)愁的老手相信都能從中拿到點(diǎn)對自己有用的東西。1. 為什么我們需要syscon框架寄存器管理到底亂在哪1.1 一次真實(shí)的寄存器沖突現(xiàn)場之前做某款多媒體SoC的適配遇到了一個(gè)很典型的場景芯片手冊里有一塊叫“SYS_CFG”的區(qū)域地址從某個(gè)基址開始總共就256個(gè)字節(jié)。里面密密麻麻分布著幾十個(gè)寄存器——bit 0控制某個(gè)外設(shè)的軟復(fù)位bit 4到bit 6是某個(gè)PLL的鎖定狀態(tài)bit 8又是另一個(gè)模塊時(shí)鐘的開關(guān)。這些寄存器之間沒有任何規(guī)律純粹是芯片設(shè)計(jì)時(shí)“順手”放在一起的。問題來了。驅(qū)動A要操作bit 0做軟復(fù)位驅(qū)動B要輪詢bit 4到bit 6判斷PLL狀態(tài)驅(qū)動C需要改bit 8的時(shí)鐘開關(guān)。如果三個(gè)驅(qū)動都拿到自己設(shè)備樹里配的reg屬性各自ioremap同一個(gè)物理地址那么會出現(xiàn)三種尷尬每個(gè)驅(qū)動都維護(hù)一份自己的ioremap映射資源浪費(fèi)還在其次關(guān)鍵是cache一致性不好處理尤其在ARM體系下設(shè)備樹里沒有標(biāo)shared-dma-coherent的區(qū)域CPU cache和device view可能不一致。驅(qū)動A讀修改寫時(shí)把驅(qū)動B剛寫好的bit覆蓋了。這種問題在調(diào)試時(shí)極其隱蔽因?yàn)閺?fù)現(xiàn)它需要精確到微秒級的時(shí)序巧合。一旦某個(gè)驅(qū)動要probe失敗或卸載它不能隨便iounmap因?yàn)閯e的驅(qū)動還在用同一塊映射。這就是典型的“系統(tǒng)控制器”場景一片寄存器不屬于任何一個(gè)獨(dú)立的功能模塊而是整個(gè)SoC的“公共設(shè)施”。syscon框架為這類場景提供了一種“共享映射統(tǒng)一訪問”的解法本質(zhì)是用regmap子系統(tǒng)來做一次共享資源管理。1.2 syscon不是一個(gè)新功能而是一種約定嚴(yán)格來說syscon并不新增任何硬件能力。它做的事情聽起來簡單但價(jià)值極大由內(nèi)核統(tǒng)一維護(hù)對某個(gè)寄存器區(qū)域的ioremap多個(gè)驅(qū)動共享同一個(gè)映射避免各自為政。通過regmap提供統(tǒng)一的讀改寫接口天然處理了cache同步和鎖問題。允許驅(qū)動之間通過regmap的lock機(jī)制避免并發(fā)訪問沖突。在設(shè)備樹層面形成一種節(jié)點(diǎn)約定大家通過syscon的phandle引用同一個(gè)控制器。打個(gè)比方?jīng)]有syscon的時(shí)候幾個(gè)驅(qū)動相當(dāng)于各自拿鑰匙開了同一間辦公室文件擺得到處都是還經(jīng)常互相拿錯(cuò)。有了syscon辦公室門口多了一個(gè)管理員所有人去管理員那里登記、存取文件雖然多了一道手續(xù)但再也不會亂了。2. 設(shè)備樹中的syscon節(jié)點(diǎn)怎么聲明怎么引用2.1 從compatible開始syscon框架在設(shè)備樹中的核心就是一個(gè)節(jié)點(diǎn)它的compatible通常有兩種寫法syscon12340000 { compatible syscon, simple-mfd; reg 0x12340000 0x1000; };第一種寫法compatible里帶了simple-mfd意思是這個(gè)節(jié)點(diǎn)不僅是syscon還是一個(gè)“簡單多功能設(shè)備”——它的子節(jié)點(diǎn)通常對應(yīng)芯片手冊里的各個(gè)功能塊由simple-mfd機(jī)制自動展開probe子節(jié)點(diǎn)。第二種寫法更常見system-controller12340000 { compatible syscon; reg 0x12340000 0x1000; };這種節(jié)點(diǎn)的驅(qū)動匹配是在drivers/mfd/syscon.c里完成的。內(nèi)核會為它創(chuàng)建一個(gè)regmap并把regmap作為syscon設(shè)備的核心資源保存起來。2.2 引用方式phandle 偏移其他驅(qū)動引用syscon的方式很直接在設(shè)備樹里放一個(gè)syscon屬性some-driverabc00000 { compatible vendor,some-block; reg 0xabc00000 0x100; syscon system-controller 0x10; /* 基址偏移0x10 */ };這里system-controller是phandle指向之前定義的syscon節(jié)點(diǎn)后面的0x10表示這個(gè)驅(qū)動關(guān)心的寄存器相對于syscon基址的偏移。2.3 內(nèi)核驅(qū)動怎么拿到這個(gè)引用設(shè)備驅(qū)動側(cè)通過syscon_regmap_lookup_by_phandle來解析#include linux/mfd/syscon.h #include linux/of.h #include linux/regmap.h struct regmap *regmap; regmap syscon_regmap_lookup_by_phandle(np, syscon); if (IS_ERR(regmap)) { return PTR_ERR(regmap); }拿到regmap之后整個(gè)寄存器區(qū)域就可以像一個(gè)普通內(nèi)存塊一樣通過regmap_read/regmap_write/regmap_update_bits來訪問了。提醒syscon_regmap_lookup_by_phandle返回的regmap不需要驅(qū)動自己釋放它的生命周期由syscon設(shè)備管理。驅(qū)動remove時(shí)不要調(diào)用regmap_exit否則會double free。3. syscon的核心接口不只是regmap3.1 syscon整個(gè)家族接口syscon提供的接口并不算多但每個(gè)都很有用。我把它們梳理成三類按phandle查找、按節(jié)點(diǎn)查找、直接按地址創(chuàng)建。第一類是按phandle查找驅(qū)動代碼最常用struct regmap *syscon_regmap_lookup_by_phandle(struct device_node *np, const char *property); struct regmap *syscon_regmap_lookup_by_phandle_args(struct device_node *np, const char *property, int arg_count, unsigned int *arg);第二類是按節(jié)點(diǎn)查找struct regmap *syscon_node_to_regmap(struct device_node *np);這個(gè)接口適合已經(jīng)有struct device_node但不一定通過phandle屬性引用的場景。第三類是直接創(chuàng)建struct regmap *syscon_regmap_lookup_by_compatible(const char *s compatible);這個(gè)接口適合那種驅(qū)動不知道phandle屬性名但知道syscon節(jié)點(diǎn)的compatible字符串的場景。我最初一直想不通這個(gè)函數(shù)該怎么用后來在一個(gè)平臺驅(qū)動里看到了就是全局只有一個(gè)syscon節(jié)點(diǎn)直接按compatible找省得去改設(shè)備樹加phandle屬性。還有syscon_node_to_regmap需要特別說一句它查找的是節(jié)點(diǎn)對應(yīng)的regmap如果節(jié)點(diǎn)本身沒有建立regmap會返回錯(cuò)誤。但如果節(jié)點(diǎn)加上了syscon的compatible設(shè)備驅(qū)動會為它自動創(chuàng)建regmap。3.2 regmap層的配置syscon本身是建立在一個(gè)regmap之上的。drivers/mfd/syscon.c在probe時(shí)候會根據(jù)設(shè)備樹信息配置regmapstruct regmap_config config { .reg_bits 32, .val_bits 32, .reg_stride 4, .max_register resource_size(res), };通常它會根據(jù)reg屬性的大小推斷寄存器數(shù)量但對那些“寄存器之間有空洞”的硬件可以額外在設(shè)備樹里加reg-io-width或者自定義regmap配置。我碰到過一個(gè)硬件設(shè)計(jì)寄存器偏移不是連續(xù)的中間有大量保留區(qū)域這時(shí)就得手動設(shè)置stride或者用regmap_config里更細(xì)的max_register和num_reg_defaults_raw來避免掃描到無效寄存器。4. 動手寫一個(gè)依賴syscon的驅(qū)動完整實(shí)例4.1 場景設(shè)定假設(shè)有一個(gè)硬件模塊叫“某某系統(tǒng)控制”它需要在設(shè)備初始化時(shí)完成以下操作讀取寄存器0x04判斷某個(gè)硬件加速器是否已上電。如果沒上電則在寄存器0x00寫入BIT(0)啟動上電序列。輪詢寄存器0x04直到bit3置位表示上電完成。在關(guān)機(jī)前要清除寄存器0x00的bit0并等待bit3清零。這類場景非常典型就是電源管理、外設(shè)復(fù)位和狀態(tài)輪詢的混合操作。4.2 設(shè)備樹exp_syscon: syscon12340000 { compatible syscon; reg 0x12340000 0x1000; }; hw-accelabc00000 { compatible vendor,hw-accel; reg 0xabc00000 0x200; syscon exp_syscon 0x0; };4.3 驅(qū)動代碼骨架#include linux/module.h #include linux/platform_device.h #include linux/of.h #include linux/regmap.h #include linux/mfd/syscon.h #define SYSCON_PWR_CTRL 0x00 #define SYSCON_PWR_STATUS 0x04 #define PWR_ENABLE BIT(0) #define PWR_ACK BIT(3) struct hwaccel_data { struct regmap *regmap; struct device *dev; }; static int hwaccel_power_on(struct hwaccel_data *data) { unsigned int val; int ret; ret regmap_read(data-regmap, SYSCON_PWR_STATUS, val); if (ret 0) return ret; if (val PWR_ACK) return 0; /* 已上電 */ ret regmap_update_bits(data-regmap, SYSCON_PWR_CTRL, PWR_ENABLE, PWR_ENABLE); if (ret 0) return ret; /* 輪詢等待確認(rèn) */ return regmap_read_poll_timeout(data-regmap, SYSCON_PWR_STATUS, val, (val PWR_ACK), 1000, 100000); } static int hwaccel_probe(struct platform_device *pdev) { struct device *dev pdev-dev; struct device_node *np dev-of_node; struct hwaccel_data *data; struct regmap *regmap; data devm_kzalloc(dev, sizeof(*data), GFP_KERNEL); if (!data) return -ENOMEM; regmap syscon_regmap_lookup_by_phandle(np, syscon); if (IS_ERR(regmap)) { dev_err(dev, failed to get syscon regmap: %ld\n, PTR_ERR(regmap)); return PTR_ERR(regmap); } >regmap_update_bits(regmap, 4, BIT(0), BIT(0));是在修改物理寄存器0x12340010。但這里有一個(gè)反直覺的點(diǎn)硬件工程師在芯片手冊里通常寫的是“寄存器0x04”意思是基址加0x04字節(jié)處的寄存器。那么對應(yīng)regmap寄存器編號就是0x04 / 4 1。我調(diào)試某IP核的時(shí)候手冊寫的寄存器偏移是0x1C結(jié)果我在regmap里直接用regmap_read(regmap, 0x1C, val)讀出來的數(shù)據(jù)永遠(yuǎn)跟預(yù)期不符最后對著代碼和手冊查了好久才發(fā)現(xiàn)偏移應(yīng)該除以4。這個(gè)坑真的很經(jīng)典。要么在代碼里保持“寄存器編號byte offset/stride”要么在驅(qū)動里顯式定義一個(gè)宏比如#define REG_OFFSET_TO_INDEX(off) ((off) / 4)把換算關(guān)系寫清楚避免事后調(diào)試時(shí)混淆。5.3 regmap的默認(rèn)配置syscon為節(jié)點(diǎn)創(chuàng)建regmap時(shí)有幾個(gè)關(guān)鍵配置項(xiàng)需要注意。reg_bits和val_bits通常都是32但有些老平臺是16位總線就要在設(shè)備樹里表示清楚或者通過驅(qū)動側(cè)的regmap_config顯式指定。max_register最好根據(jù)reg屬性的大小設(shè)定否則如果硬件只實(shí)現(xiàn)了低地址段寄存器高地址段的讀操作可能返回cease錯(cuò)誤甚至觸發(fā)總線錯(cuò)誤。我遇到過一個(gè)極小概率但很麻煩的問題某個(gè)syscon節(jié)點(diǎn)的物理區(qū)域只有0x400個(gè)字節(jié)但有一個(gè)驅(qū)動在寫regmap_config.max_register時(shí)漏配導(dǎo)致內(nèi)核讓后續(xù)驅(qū)動訪問到0x1000偏移處的非法地址直接Serror panic。所以使用syscon時(shí)最好在驅(qū)動里檢查一下regmap能訪問的寄存器邊界unsigned int max_reg; int ret; ret regmap_get_max_register(regmap, max_reg); if (ret 0) return ret; if (offset max_reg) { dev_err(dev, register offset out of range: 0x%x 0x%x\n, offset, max_reg); return -EINVAL; }6. syscon與老式regmap私有管理的對比到底贏在哪6.1 一個(gè)驅(qū)動私自ioremap的問題在syscon流行之前很多驅(qū)動是這么寫的static void __iomem *base; static int foo_probe(struct platform_device *pdev) { struct resource *res; res platform_get_resource(pdev, IORESOURCE_MEM, 0); base devm_ioremap_resource(pdev-dev, res); if (IS_ERR(base)) return PTR_ERR(base); ... }然后其他驅(qū)動如果想訪問同一片區(qū)域可能要通過platform_device的私有數(shù)據(jù)或全局變量把這個(gè)base傳出去。這種方案在單驅(qū)動時(shí)很高效但對于共享寄存器區(qū)域就有致命缺陷io的訪問完全依賴誰先映射了這片內(nèi)存一旦驅(qū)動加載順序變化另一個(gè)驅(qū)動就拿不到地址。syscon的做法是把“誰持有regmap”這個(gè)信息交給內(nèi)核統(tǒng)一管理誰想用誰來查而不是誰加載早誰說了算。6.2 cache問題和自旋鎖regmap內(nèi)部對cache的處理也很講究。在大多數(shù)SoC默認(rèn)配置下內(nèi)存domain寄存器訪問需要保證cache一致性而regmap在regmap_update_bits流程里會同時(shí)考慮fast_io和cache_only等模式。雖然實(shí)際中syscon是MMIO通常不會開普通cache但regmap仍會對每次讀寫做好屏障和同步處理。相比之下如果驅(qū)動直接操作__iomem指針還要手動處理wmb()/rmb()這種內(nèi)存屏障。syscon的regmap統(tǒng)一封裝了這些細(xì)節(jié)驅(qū)動代碼可以干凈很多。6.3 模塊化和可測試性使用syscon的另一個(gè)好處是驅(qū)動代碼可以拆得更干凈底層寄存器訪問邏輯可以單獨(dú)做一個(gè)backend模塊方便在host環(huán)境做單元測試。我有個(gè)團(tuán)隊(duì)在做某電源管理子系統(tǒng)時(shí)因?yàn)殡娫葱酒募拇嫫骺刂七壿嫼蚐oC本身是解耦的就把寄存器訪問全部抽象成regmap接口然后在PC主機(jī)上用一個(gè)虛擬的regmap總線驅(qū)動來模擬硬件時(shí)序。這樣整個(gè)電源狀態(tài)機(jī)的邏輯可以在沒有硬件的情況下跑通省了大量上板時(shí)間。這完全仰仗于syscon把寄存器訪問和業(yè)務(wù)邏輯徹底解耦。7. syscon和mfd的異與同什么時(shí)候該用誰7.1 兩者解決的問題有重疊mfd是多功能設(shè)備框架通常對應(yīng)一個(gè)硬件芯片它里面有多個(gè)功能單元比如一個(gè)音頻codec里既有ADC又有DAC還有數(shù)字接口。mfd設(shè)備會創(chuàng)建多個(gè)子設(shè)備每個(gè)子設(shè)備又有一個(gè)獨(dú)立驅(qū)動。syscon看起來也可以創(chuàng)建一個(gè)多子節(jié)點(diǎn)的設(shè)備因?yàn)閟imple-mfd就是和syscon配合的。但兩者的側(cè)重點(diǎn)不同mfd側(cè)重“功能架構(gòu)”syscon側(cè)重“寄存器共享方式”。mfd是把一個(gè)物理設(shè)備拆成多個(gè)邏輯設(shè)備syscon是把一個(gè)寄存器區(qū)域共享給多個(gè)獨(dú)立設(shè)備。7.2 實(shí)際選型建議如果硬件手冊明確把某個(gè)區(qū)域定義成一個(gè)獨(dú)立的IP該IP下掛多個(gè)功能子模塊使用mfd更合理。如果多個(gè)IP之間共享一片寄存器但沒有從屬關(guān)系用syscon更合理。如果一個(gè)IP里既有多種功能又想讓外部驅(qū)動訪問該IP的某些寄存器可以考慮mfd包裝IP、內(nèi)部用syscon暴露寄存器區(qū)域兩者結(jié)合使用。我實(shí)際參與的一個(gè)項(xiàng)目就做過這種組合主控芯片里有一個(gè)混合信號處理單元它內(nèi)部有完整的mfd架構(gòu)管理ADC和比較器等子設(shè)備同時(shí)這個(gè)處理單元的寄存器區(qū)域又被另一個(gè)獨(dú)立的安全模塊引用這時(shí)在主設(shè)備里注冊一個(gè)syscon節(jié)點(diǎn)讓外部驅(qū)動通過syscon_node_to_regmap訪問就解決了跨驅(qū)動共享問題。8. 調(diào)試syscon的實(shí)用工具與心得8.1 debugfs里的regmap接口這是我最依賴的工具。內(nèi)核配置打開CONFIG_DEBUG_FS并掛載debugfs后在/sys/kernel/debug/regmap/目錄下能看到所有已注冊的regmap。每個(gè)regmap會生成幾個(gè)文件registers讀取當(dāng)前寄存器快照。access內(nèi)核會把讀寫權(quán)限信息輸出。nameregmap的名字通常和設(shè)備節(jié)點(diǎn)名對應(yīng)。如果你想快速確認(rèn)某個(gè)驅(qū)動對syscon寄存器的寫操作是否生效直接讀registers文件就能比對。但要注意debugfs里的信息只是當(dāng)前緩存狀態(tài)不代表真實(shí)硬件值如果regmap配置了cache并且發(fā)生了cache miss可能讀出來的不是最新硬件值。不過對于MMIO型的syscon一般不會開cache寫。8.2 使用tracepoint跟蹤訪問CONFIG_REGMAP_MMIO打開后內(nèi)核的tracepoint能捕捉到每次寄存器讀寫的地址和數(shù)據(jù)。調(diào)試時(shí)可以用echo 1 /sys/kernel/debug/tracing/events/regmap/regmap_reg_read/enable echo 1 /sys/kernel/debug/tracing/events/regmap/regmap_reg_write/enable cat /sys/kernel/debug/tracing/trace這樣可以清楚看到哪個(gè)驅(qū)動在什么時(shí)間讀了哪個(gè)寄存器。在排查多驅(qū)動互相踩踏的疑難雜癥時(shí)這一步的追蹤信息比邏輯分析儀還直觀。8.3 常見問題速查表問題現(xiàn)象可能原因排查方法probe返回-EPROBE_DEFERsyscon設(shè)備還沒注冊檢查設(shè)備樹syscon節(jié)點(diǎn)compatible是否匹配查看dmesg的deferred probe信息regmap_read_all返回-EIO訪問越過了regmap的max_register檢查regmap_config里max_register是否配到正確值寄存器值始終不對偏移沒有除以stride對照硬件手冊讀到的值和預(yù)期之間是否呈倍數(shù)關(guān)系兩個(gè)驅(qū)動互相覆蓋寄存器位缺少regmap鎖或者同時(shí)更新了同一寄存器確認(rèn)它們是否通過同一個(gè)regmap實(shí)例訪問檢查tracepoint確認(rèn)訪問序列syscon設(shè)備注冊失敗regmap_config里可能有無效配置內(nèi)核日志會打印syscon: invalid regmap之類信息檢查reg屬性長度8.4 一個(gè)需要特別警惕的板級問題某個(gè)平臺在低功耗休眠前要利用syscon的寄存器把整個(gè)系統(tǒng)控制單元配置到睡眠狀態(tài)。結(jié)果發(fā)現(xiàn)休眠喚醒后某些寄存器變成了隨機(jī)值。后來排查發(fā)現(xiàn)問題不在驅(qū)動而是板級設(shè)計(jì)里這片syscon區(qū)域沒有接入正確的電源域休眠時(shí)域掉電導(dǎo)致寄存器內(nèi)容丟失。驅(qū)動代碼再怎么訪問都是對的但硬件寄存器本身就沒了。這就是單片系統(tǒng)里提syscon特別容易忽視的問題syscon解決了軟件訪問問題但沒解決硬件供電問題。所以設(shè)計(jì)時(shí)要檢查這塊區(qū)域在低功耗狀態(tài)下的保持能力別把人家“系統(tǒng)控制器”當(dāng)普通內(nèi)存區(qū)域處理。9. 給驅(qū)動接入syscon時(shí)容易踩的坑與細(xì)節(jié)梳理9.1 phandle args和offset部分硬件在設(shè)計(jì)時(shí)同一片syscon區(qū)域里不同驅(qū)動關(guān)心的偏移差異很大最好的做法是讓設(shè)備樹把偏移直接傳給驅(qū)動而不是在設(shè)備樹里寫硬件寄存器絕對地址。比如power-ctrl10000000 { compatible vendor,power-ctrl; syscon exp_syscon 0x20; };驅(qū)動側(cè)用syscon_regmap_lookup_by_phandle_args來獲取struct regmap *regmap; unsigned int offset; int ret; ret syscon_regmap_lookup_by_phandle_args(np, syscon, 1, offset); if (IS_ERR(regmap)) return PTR_ERR(regmap);這樣設(shè)備樹已經(jīng)告訴了這個(gè)驅(qū)動它關(guān)心的偏移在哪驅(qū)動不需要重復(fù)定義偏移宏。與syscon_regmap_lookup_by_phandle相比這種模式更適合一個(gè)驅(qū)動內(nèi)部有多組不同寄存器的場景。9.2 不要自己持有全局regmap指針有些驅(qū)動圖省事把某個(gè)syscon的regmap指針存在全局變量里。一旦驅(qū)動被卸載重裝這個(gè)全局值就指向已釋放的內(nèi)存另一個(gè)驅(qū)動再查就只能crash。正確做法是每次需要時(shí)都通過syscon_node_to_regmap或syscon_regmap_lookup_by_phandle查詢。這可能會增加一點(diǎn)指針查找開銷但對于probe階段的調(diào)用完全可接受。如果運(yùn)行時(shí)會非常頻繁地使用可以在驅(qū)動的私有數(shù)據(jù)結(jié)構(gòu)里保存這個(gè)regmap指針而不是放進(jìn)全局。9.3 regmap的volatile范圍syscon區(qū)域里的寄存器很多是硬件狀態(tài)寄存器每次讀都會改變值。如果在regmap里配置了cache并標(biāo)記這些寄存器為non-volatile緩存會覆蓋真實(shí)狀態(tài)導(dǎo)致驅(qū)動讀到錯(cuò)誤值。這也是一個(gè)很容易被忽視的點(diǎn)。特別是某平臺把syscon節(jié)點(diǎn)里的一部分寄存器當(dāng)作普通寄存器來緩存而實(shí)際它們是一讀就自清零的latched寄存器。遇到這種問題可以在regmap_config里加volatile_table來指定哪些寄存器不能被緩存。10. 使用syscon的一些進(jìn)階玩法10.1 通過syscon_reboot實(shí)現(xiàn)重啟syscon不僅能在驅(qū)動里用內(nèi)核里還有基于它實(shí)現(xiàn)的雜項(xiàng)功能。比如drivers/power/reset/syscon-reboot.c通過設(shè)備樹配置一個(gè)復(fù)位寄存器用一個(gè)節(jié)點(diǎn)配置reboot-mode { compatible syscon-reboot; offset 0x0; mask 0x08; value 0x08; };這種配置可以讓整個(gè)系統(tǒng)掛到syscon的復(fù)位寄存器上不需要為重啟專門實(shí)現(xiàn)一個(gè)平臺驅(qū)動。同樣還有syscon-poweroff。10.2 配合syscon_restart_handle或regmap的寫保護(hù)部分SoC的寄存器區(qū)域有寫保護(hù)位比如要先往某個(gè)保護(hù)寄存器寫固定值才能真正改動目標(biāo)寄存器。這種邏輯同樣可以封裝在sycon驅(qū)動里通過regmap的write回調(diào)或者reg_update_bits的往返控制在底層實(shí)現(xiàn)業(yè)務(wù)驅(qū)動無感。10.3 把syscon作為regmap cache watch點(diǎn)我們曾經(jīng)借助syscon的regmap訪問記錄來追蹤一個(gè)可疑的驅(qū)動為什么在系統(tǒng)休眠時(shí)會周期性地讀某個(gè)寄存器。通過tracepoint和debugfs的訪問統(tǒng)計(jì)找到了特定的外部訪問模式最終問題定位到bios里某種GPIO中斷誤觸發(fā)導(dǎo)致讀取行為被反復(fù)調(diào)度。syscon提供了一個(gè)統(tǒng)一觀察窗口對這種疑難雜癥的排查幫助巨大。11. 在現(xiàn)有平臺里添加syscon支持具體步驟如果要在自己的平臺里引入syscon通常就以下幾個(gè)步驟。設(shè)備樹增加syscon節(jié)點(diǎn)并確認(rèn)reg屬性和硬件手冊一致。在需要使用syscon的驅(qū)動頭文件里加入#include linux/mfd/syscon.h。驅(qū)動中通過syscon_regmap_lookup_by_phandle或syscon_node_to_regmap獲取regmap。正確換算偏移使用regmap_read/write/update_bits訪問。驗(yàn)證時(shí)用debugfs的regmap接口和tracepoint。注意probe的順序通常syscon設(shè)備會被優(yōu)先初始化。如果存在依賴順序最好讓看起來需要syscon的驅(qū)動檢查-EPROBE_DEFER并重試。這個(gè)順序看起來很簡單但實(shí)際項(xiàng)目里我見過很多次“設(shè)備樹里syscon節(jié)點(diǎn)忘了加”或者“加了節(jié)點(diǎn)但忘記把compatible設(shè)成syscon”的低級失誤。一旦syscon節(jié)點(diǎn)沒建立regmap后面所有引用的驅(qū)動全部掛在-EPROBE_DEFER上日志里一片deferred probe warning。12. 從syscon框架到“好架構(gòu)需要好抽象”12.1 一個(gè)協(xié)議和實(shí)現(xiàn)的統(tǒng)一syscon框架給我的啟發(fā)是在嵌入式/內(nèi)核開發(fā)中很多看起來“沒什么技術(shù)含量”的基礎(chǔ)組件恰恰決定了整個(gè)系統(tǒng)的穩(wěn)定性和開發(fā)效率。寄存器的訪問本身是一件小事但凡是系統(tǒng)級的共享資源它的訪問方案必須在初始設(shè)計(jì)時(shí)就統(tǒng)一。等到硬件跑起來再補(bǔ)救日志里出現(xiàn)兩三個(gè)驅(qū)動互相覆蓋bit的問題時(shí)你才會明白早用syscon的價(jià)值。12.2 面向?qū)嵺`的編程范式syscon的做法其實(shí)是一種很通用的編程范式把資質(zhì)相同的資源抽取出來做統(tǒng)一的訪問控制讓業(yè)務(wù)模塊只依賴一個(gè)抽象接口不用關(guān)注實(shí)現(xiàn)細(xì)節(jié)。這和用戶態(tài)編程里的依賴注入、服務(wù)定位有異曲同工之妙只是它發(fā)生在內(nèi)核態(tài)以設(shè)備模型和regmap為載體。每次在系統(tǒng)里碰到多個(gè)模塊搶同一個(gè)寄存器區(qū)域我的第一反應(yīng)不是去加鎖而是先想這片區(qū)域適不適合用syscon統(tǒng)一管理。只有當(dāng)需求確實(shí)非常專一時(shí)才考慮在一個(gè)驅(qū)動里直接ioremap。這個(gè)權(quán)衡標(biāo)準(zhǔn)我希望能給初入內(nèi)核的朋友一些啟發(fā)。12.3 一點(diǎn)個(gè)人心得在做過的多個(gè)項(xiàng)目里syscon幾乎成了我處理寄存器共享問題時(shí)默認(rèn)的“第一選擇”。不只是因?yàn)樗峁┝薃PI更因?yàn)樗谡麄€(gè)內(nèi)核生態(tài)里已經(jīng)形成了成熟的規(guī)范和調(diào)試工具鏈。用熟了之后你會發(fā)現(xiàn)在設(shè)備樹審查階段就能很自然地識別出哪些節(jié)點(diǎn)應(yīng)該聲明為syscon哪些驅(qū)動應(yīng)該在設(shè)備樹里引用syscon屬性。說到底內(nèi)核框架的價(jià)值不在于它多么炫技而在于它能夠讓一批驅(qū)動協(xié)同工作時(shí)不打架。syscon在這方面的設(shè)計(jì)雖然樸素但極其有效。希望這篇文章能幫你在自己的項(xiàng)目中少走一段彎路把寄存器管理變成一件“不用太操心”的事。如果在調(diào)試中遇到什么特別反直覺的問題不妨也記錄下來。內(nèi)核開發(fā)就是這樣很多知識都是在踩坑和復(fù)盤之間積淀出來的。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
色淫网站优优视频| 91日产欧美| 毛片久久| 97综合在线观看| 97无码视频在线播放| 久久久九九九九| 91|九色|国产熟女| 激情熟女12P| 97在线观视频免费观看| 五月天婷婷色| 亚洲成?V人片在线观看福利| 老熟女搡BBBB搡BBBB视频| 97精品网站| 国产黄a三级三级三级av在线看| 最新av网站在线观看| 伊人网一本| 亚洲第一页欧美| 亚洲最大网站av| 欧州一区二区三区四区| 日日爱99| 91丝袜在线播放| 性性欧美| 久操九九九九九九九九九九九九九九九九九九九九九九九九九九九九 | 综合久久少妇中文字幕| 日韩欧美~中文字| 偷拍在线观看视频| 好吊色一区| 91 刺激在线| 丰满人妻一区二区三区四区| 奇米四色网| 亚州色综合| 欧美日韩不卡传媒| 日本高清一本二本免费不卡| 亚洲欧洲色情高清| 激情欧美日韩女同久久| 久久中出在线| 天天性射网| 欧美78| 欧美色997| www.色婷婷| 日本免费人成视频播放120秒| 色波多| 亚洲天天在线| 欧美高清第一页| 婷婷国产精品一区二区| 麻豆天天躁天天揉揉AV| 青草成人免费视频一COm| 亚洲欲色| 素人一区二区三区日韩| 99国产精品视频尤物| 日韩人妻 中文字幕| 成人午夜高潮av猛片| 亚洲精品一区二区精华| 人妻一区二区三区熟女| 综合久久97| 韩国三级色呦呦| 日本视频在线中文字幕| av一区二区三区四区| 欧美视频一| 国产精品视频91久久| 日本视频在线中文字幕| 国产家庭乱伦表演| 少妇人妻好深太紧了vr91| 农村女一级毛卡片| 家庭乱伦网站国产| 午夜精品一区二区三区三上悠亚| 歐美一級亂黃99在綫精品| 午夜天堂网| 1234区中文字幕在线观看_青青草国产在线_日韩一区二区 | 亚洲一二三| 裸体美女久久久| 91精品久久久久久久久久| 精品高清牛人盗摄一区二区三区中文字幕A片免费在线观看 | 亚洲成人网站在线观看| 91在线视频免费中出| 日本一区99| #NAME?| 九九AV| 约操熟妇| 综精品久久久aaaa| 大香蕉视频啪啪啪啪| 午夜在线播放| 午夜电影在线观看无码专区| 五月天激情婷婷| 伊人成人情色综合| 国产又大又粗又长视频| 中文字幕丰满人妻日本| 亚洲精品三| 精品网站9999| 干美女人妻| 91看黄片| 久久99999| 超碰97人妻在线| 手机在线观看不卡无码av| 亚洲.欧美.丝袜.中文.综合| 天天情欲宗合网| 日韩啪啪视频| 狠狠操综合| 超碰97色色| 久久久久人| 亚洲第一免费视频| 超碰超碰欧美| 蜜桃狠狠色伊人亚洲综合| 精品视频在线观看| 日韩精品99999| 日本中文字幕一区| 一线黄色免费性爱片| 25国产精品免费观看| 91天天爽| 久操网视频| 人人爽天天爽| 9色国产精品一区粉嫩| 亚洲二区精品在线观看| 青青草久久在线| 黄片qw| 五月天激情四射| 国产精品97超碰| 在线观看AV片| 台湾佬中文娱乐网久久久久久久久久com | 久草草一二三四区久久| 亚洲 欧美 手机在线观看| 偷拍亚洲高清图片| 性爱乱伦一区| 国产亚热在线久久| 欧美很很操视频| 美女毛片999| 国产视频一区二区三区在线免费观看| 九九九久千久久激情蜜桃在线看| 麻豆国产97在线| 精彩视频日韩| 激情文学88| 有码免费观看| 尤物av网站免费在线播放| 久草久热| 高清国产无码av| 色婷婷视频| 91 偷| 欧美顶级黄色大片免费| 久久精品六区| 久久草草欧美精品| 亚洲色图尤物视频| 久久亚洲一区女同性恋中文字幕| 丝袜AV一二三区| 七月婷婷综合| 免费超碰97久久| 日韩AV无码中文一区二区| 蜜桃香蕉久草精品在线| 熟妇在线视频一区二区| 韩国三级一线观看久| 欧美亚洲国产自久久| 成年人黄色小视频网站| 亚州欧美另类| 蜜桃久久久久久久| 久久精品国产亚洲AV成人直播| 国产熟女自拍| 国产乱婷婷精品二区三区| 蜜乳AV免费观看| 大干人妻| 好爽,再快点啊哈嗯嗯嗯嗯| 性在久久久久久| 超碰导航97| 97欧美精品综合| 丰满少妇乱子伦精品无| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区 | 欧美热图99| www.四虎在线| 中国亚洲呦女专区| 国产 日韩 欧美 中文 另类,国产 欧美 另类 制服 变态,高清 日韩 欧美 中文,高 | 日本岛国黄色网址| 中文字幕第9页萱萱影音先锋| 2017大香蕉国产精品久久| 国产伦乱91| 九九九免费视频| 亚洲涩图欧美| 欧美九九爱| 日本Xx性爱| 天天草天天日| 韩国嫰模上门援交视频| 亚洲天堂第一页| 亚洲砖码砖专无区2023| 福利操逼| 九九九九精| 中文字幕欧美日本乱码一线二线| 99热免费| 97超碰国产亚洲精品资源| 三级特黄60分钟播放| 99热这里都是精品| 中文字幕一品色图| 丰满搜索结果 -第18页- 久久高清无码| aaa一级黄片| 色综合V| 上床啊啊啊| 欧美日韩亚洲天堂网| 五月天婷婷综合网| 手机看片1024你懂的国产| 国产综合在线视频网站| 久久精品国产亚洲AV先锋| 91女优在线观看| 色999偷自拍拍| 色激情五月天| 天天干美少妇一区| 精品亚洲国产成人AV制服丝袜| 午夜福利1区2区3区| 老熟女网站| 亚洲久9| 免费99精品国产自在在线| 亚洲精品蜜桃久久久久久久| 91欧美另类| 97中文字幕色| 青青欧洲黑| 2019AV天堂| 亚洲国产综合久久天堂| 97舔舔| 红杏大香蕉| 狠狠操综合| 国产免费一区在线观看| 美女被艹尤物视频| 久久五月份| 婷婷丁香成人| 青青草日韩无码| 五月婷婷色| 亚洲欧美一区二区三区在钱蜜桃 | 人妻熟女av国产网站| 天天视频综合在线观看视频| 操高情无码| 日本女优在线视频福利| 曰韩精品视频一区二区| 精品黑人一区二区| 久久男女激情视频网站| 91人妻素女| 国产又操| 欧美狠狠操| 日韩午夜国产| 香蕉99秘 一区精品蜜桃臀| 欧美日韩狠狠爱| 屁股久久久久久| 中文字幕av亚洲精品| 国产精品盗摄 偷窥盗摄| 影视综合无码少妇| 狠狠色婷婷777| 人妻久久久| 色哟哟-国产专区| 99抽插| 色香网| 夜夜躁狠狠躁日日躁av| 成人自拍三级在线观看| 秋霞一级视频在线观看免费| 久久乐| 日本不卡二三区| 啊啊啊啊啊好舒服视频| 亚洲av噜噜噜噜噜噜| 精品国产无码中文| 日韩干B| 久久熟女嫩草成人片免费 | 91在线视频免费播放| 涩五月婷婷| 国产视频一区二区在线观看| 91女优在线观看| 欧美宗合网| 强奸乱伦AV网站| 欧美激情五月天| 亚洲精品1区| 色色九区| 亚洲婷婷五月天| 亚洲男人的天堂V| 中文字暮97| 丁香7月婷婷| 国产后入| 五月婷婷综合网| 久久仑合| 精品人妻免费观看| 伊人激情| 欧美色图99| 欧美gv在线观看| 大香网伊人久久综合| 99综合自拍| 色欧洲| 中文字幕亚韩| 欧亚揄拍偷拍精品视频| 国产精品com| 亚洲欧美成人在线| 色噜噜狠狠色综无码久久| 怡红院成人视频| 3d成人精品一区二区| 熟女高潮精品一区二区| 91精品人妻一区二区三区蜜桃| 中文字幕第二页| www.超碰| 欧美日韩国第一区| 96超碰网| 激情小说亚洲| 老司机福利社视频在线观看| 中文字幕高清20页视频| 7777奇米影视久久| 亚洲国产综合久久久性感熟妇| 丝袜美女诱惑 91 视频| av一区二区三区四区| 亚洲囯产精品女人久久久| 久久超碰、| 大香蕉专区| 加勒比久久av| 亚洲老熟妇xxx| 亚洲一区二区在线观看91| 97精彩视频网站| 韩三级a视频在线观看| 亚洲日韩久久精品一区| 欧美亚洲日韩人妻在线观看| 亚洲麻豆av一区二区| 日本中文字幕一区| 最新欧洲欧美日本激情网站| 亚洲国产丝袜熟女av| 美日韩成人| 大香蕉黄色一级片免费看| 成人区人妻精品一| 91在线丝袜视频| 亚洲精品成人激情在线| 精品一区二区三区国产| 少妇熟女视频一二三区| 欧美色图亚州激情| 久久五月天婷婷| 在线视频免费观看午夜| 亚洲永久AV无码精品秋霞| 久久久久921| 亚洲密乳AV| 天堂九九九九九九九九九| 国产成人精品午夜福利| 日韩精品三区四区| 日欧美色| 日本啊啊啊啊啊视频| 3P乱轮视频| 欧色综合| 久久久久国产| 99亚洲国产精品色一区二区三区| 97超碰总站| 日韩精品区二区三区不卡| 99国产精品视频尤物| 亚洲网站一区二区在线| 欧美色人| 操国产逼| 人人操,人人插| 爱妃国产亚洲视频中文字幕| 人人操,人人液| 中文字幕高清精品一区| 色黄污美女啪啪啪免费网站| 岛国A V在线免费看| 色欲Av人妻精品一区二| 国产成久久综合片| 国产精品视频自拍在线| 国产乱色国产精品免费视| 国产在线综合网| 国产精品69久久久久久久| 婷婷人妻激情| 欧美 亚洲 在线| 超碰在线人人射| av网站在线观看了| 26uuu国产成人综合| 精品亚洲国产成人AV制服丝袜| 无码操逼视频一下| 一色网男人的天堂| 天天综合网一91网| 日本国产高清色www视频在线| 91网站在线播放| 亚洲狠狠入| 日韩成年人性爱视频| 伊人五月天激情| 囯产操逼片| 四虎国产精品永久地址入口| 九九热精品在线| 99热精品在线观看| 亚洲黑人在线| 国精精品无码一二三区水多多| 日韩国产乱子伦App| www.夜夜操| 天天天天做夜夜夜夜做| 欧美综合天堂| 精品久久久久久中文| 91大胆欧美| 道久久五香丁月婷婷激情综合| 奶水 人妻 哺乳 在线| 中文字幕一区二区免费在线| 亚洲最大91网| 亚洲在线综合| 亚洲五码一区二区三区| 亚洲综合有玛| 东北女人操逼| 久久99久久99久久99人受| 330Dv国产女人终合视频极品人与兽| 久久久精品九| 女同女同恋久久级三级| 91人人爽人人爽| 午夜九九| 婷婷六月色开| 午夜精品久久久久久久99热影院| 亚洲综合第一页| 欧差乱伦二三| 熟女高潮精品一区二区| 天天操天天干美女网址导航| 91精品人妻偷情| 高清孕妇孕交| 久久亚洲天天做| 欧美日韩性爱电影在线| 亚洲怡春院| 日韩情色视频| 日本道不卡| 天天艹天天日| 色97欧美| 探花精品 一区二区| 欧美婷婷五月天| 少妇天堂| 污到发麻的视频 国产| 大二网站亚洲| 国产日韩欧美| 淫妻综合网| 青春草莓视频在线观看网址| 1234区中文字幕在线观看_青青草国产在线_日韩一区二区 | 嫖老熟女A片一二三区| 麻豆区久久久久亚| 五月综合视频| 天天日天天搞天天干| 国产和美国毛片| 综合激情五月天| 人人妻人射| 狠狠躁伊人中文字幕| 淫色网综合| 亚洲欧美在线观看免费| 久久午夜神马| 91热情品| 99热超碰| 五月婷久久| 日韩操逼性鲍| 久操精品| 国产伊人精品在线| 按摩中文字幕| 青娱乐福利99| 伊人国产av| 亚州综合色| 中文字幕一区日韩精| AV天堂国产| 97色欧洲| 久久久久幕乱码| 九草九九九| 久操不卡视频| 亚洲国产97| 精品中文一区二区| dy888午夜老子影视达达兔| 亚洲drav色图| 成人精品视频| 97在线青| 天综合网欧美| www被窝色com| 999九九精品| 色噜噜狠狠色综无码久久| 新视频sss国产| 99色骚| 国产精品网站www| 九九热视频这里只有精品| 伊人青青一区成人视频在线观看区 | 长长久久88视频| 综合啪啪| 五月天婷婷小说| 九九在线视频| 国产精品情侣啪啪| 国产人伦精品一区二区三区| 九色 人妻 大香蕉| 男人天堂综合| 好一吊区二区| 天天操夜夜操| 富女玩鸭子一级毛片| 综合亚洲欧美精品日韩?v| 欧洲特黄毛片免费看欧洲毛片| 亚洲āv网址在线观看| 亚洲自拍偷拍视频在线| 日日操丁香五月天| 日韩免费a级毛片无码a∨ | 青草成人免费视频一com| 无码伊人久久大杳蕉中文无码| 很很操在线| 99国产精品视频尤物| 久久性爱视频| 亚洲视频一二区| 久超超碰| 中文字幕女同在线| 色网1| 日韩三级一区| 五月丁香婷婷啪啪| 欧美色就是色| 国产又色又爽又舒服的三级视频| 成人天天爽| 亚洲欧美日韩有码| 91亚洲欧美色图| 啊啊啊用力在线观看| 久久久999日本大片| 另类av天堂| 97久久国产亚洲精品超碰热| 青青草狠狠撸| 亚洲欧美97√| 中文字幕日韩专区精品系列| 国产高清精品一区二区三区毛片| 人人插人人摸人人| 东京热男人的天堂精品| 国产 三级自拍| 日韩久久三区| 色香在线| 亚洲激情片| 老司机福利青青草| 欧美探花网| 婷婷久久大香蕉| 亚码激情| 青青草字幕AV| 91爱| 亚洲无码超碰免费| 婷婷综合网站| 丁香婷婷激情五月天无毒不卡| 日韩中文字幕av在线播放| 午夜九九| 激情国产乱伦Av| 欧美一级黄片免费播放| 91麻豆天美国产| 97天堂| 九九亚洲色在线观看| 欧美中文字幕精品人妻| 精品中文字幕第一页| 激情网五月天| 亚洲色图片区| 天天懆天天日| 色五月婷婷久久| 欧美性区| 亚洲不卡三级手机播放| 婷婷丁香五月综合| 欧美精品激情| 91丨九色丨43老版熟女| 亚洲欧美啪啪| 日韩精品免费高清视频在线| 麻豆 欧美 日韩| 亚欧无码线免费观看视频| 日本亚洲熟女视频| 九九免费影片| 懂色AV蜜臀无码精品APP| 超碰久在线天天做| 亚洲 无码 偷拍| 97日视频| 看黄片视频免费| 天天影视亚洲| 大乔未久88一区| 免费一级特黄特色大片在线观看看| 2021久久国产综合精品青草| 五月花婷婷| 麻豆区久久久久亚| 色噜噜狠狠色综无码久久合欧美| 国产精品操| 少妇被玩视频二三区| 一级片视频啪啪| 91在线色| 久久东京伊人一本到鬼色| 91nbbbbbb| 偷窥自拍A片| 中文字幕在线观看网址| 九九九九88| 久操不卡视频| 日本精品中文字幕视频| 亚洲文学偷乱拍啪啪啪啪 | julia国产在线| 青青草吊丝| 国产精品久久久久久照片| 午夜成人福利影视| 在线 欧美 亚洲| av一区二区三区四区| 亚洲精品第一| 久久少妇人妻| 国产一区免费午夜视频| 青青国产精品在线| 国产精品扒开腿做爽爽爽视频| 熟女五十路一区二区三| 99啪啪| 99999久久精| 我爱大香蕉| 久久精品中文字幕女同| 中文字幕一区二区三区高清| 欧美 传媒 麻豆 日韩 偷拍| 日本不卡五区| 激激五月| 97综合久久| 五月婷婷综合在线| 天天肏天天干| 一区二区偷拍拍视频| 欧美宗合网| 色色99| 久久久久久久久久久久97| 婷婷亚洲五月***久久| 九九九九免费视频| 99久久精品国产高潮| 欧美亚洲国产日本在线,久久精品国产| 精品国产Av无码久久久亚洲| 欧美黑人猛交春色影视大全| 色臀av| 国产高清1234区| 丰满人妻一区二区三区免费 | 日本有码影片下载 | 九九人妻| 亚洲福利中文字幕在线| 综合亚洲网| 五月婷婷综合在线| 在线视频 亚洲精品| 狼人综合婷婷激情四射 | 国产精品丝袜在线| 五月丁香六月婷| 啊啊啊啊啊啊好多水| 色妺妺在线视频| 欧美丝袜亚洲| 日韩AV熟女乱伦| 精品人妻久久久| 久久超碰爱| 日韩性爱一级片| 丝袜视频一区二区在线播放国产中文| 一级片在线观看高清无码| 大屁股熟女一区二区三区| 九九无码视频| 国产毛片片精品天天看视频| 国产精品。| 久久欧美性爱视频| 亚洲无992tv| 亚洲天堂人人妻| 综合一区中亚洲国产成人综合精品| 一本大道久| JULIA人妻风俗店中出电影| 国产一级137片内射麻豆| 91在线丝袜| 美女超碰978| 国产操操日韩三级黄| 人妖欧美一区二区| 国产亚卅97| 99久久婷婷| av爱爱爱| 午夜传煤十二区精品| 久久综合精品一区二区三区| 牛黄色久午久| 国产精品不卡一区二区三区av| 黄久在线| 好淫网一二三视区| 91热爆在线| 欧美激情另类一区二区| 97操B| 好屌色综合| 67914亚洲精品| 操操逼操操逼操操逼逼| 97超碰超碰| 久久久月天| 91成人在线| 一区二区偷拍拍视频| 日韩乱伦影音先锋| 黄片视频观看| 少妇蹲下露出大唇5| 久久久久久久久久黄色网| 欧美综合自拍成人自拍第二十页| 国产高清成人mv在线观看| 爱爱动态60秒| 久久精品噜噜噜成人看免欧美大片| 欧美日韩一干二干| 久久一二区四| av大香蕉| 天天肏夜夜肏| 成人三一级一片aaa| 国产欧美日本亚洲精品| 91 综合网| 精品少妇高潮久久| 综合色久欲| 91欧美丨精品丨入口| caopeng97人妻| 亚洲欧美一区二区三区在钱蜜桃 | 国产精品伦理| 久久久九九| 欧美伦乱爱| 你草精品在线视频| 神马视频久久久久久| 成人综合色网| 99热超碰| 91无码中出人妻视频| 色香蕉影院| www网站黄| 牛黄色久午久| 国产一区二区欧美日本| 中日韩欧美精品无码AⅤ一区二区| 国产欧美日本亚洲精品| 翔田千里无码一区| 亚洲春色欧美激情自拍| 老司机午夜精品视频| 国产无码精品无码| 秋霞色色影院| 久久性爱视频99| 很很操在线| 黄色操人| 国产成人超碰在线| 超碰在线人妻中文字幕| www.91人妻.com| 国产强奸乱伦xd| 日本欧美一区二区三区免费| 久久av一级av少妇av高潮 | 九九九九九九九九九九九蜜桃| 国产精品在线网站| 婷婷精品国产一区二区三区日韩| 东京热熟女亚洲视频网站| 国产激情久久久| 国产精品一区二区三区在线密挑| 天美av在线观看| 男人的天堂.com| 久久久久久久久久久999| 丁香婷婷激情五月天无毒不卡| 经典丝袜一区| 加勒比伊人影院| 情色大香蕉| 97天天综合| 久久黄片国产一区二区| 成人性爱美曰韩| 亚洲欧美日韩电影网站一区 | 精品人妻一区二区三区-国产| 欧美久久毛片基地| 欧美日韩亚洲天堂网| 亚洲天堂电影网| 欧美久久久| 成人情色综合网| 无码精品久久久久久亚洲| 成人无码在线视频网站| 国产 日韩 欧美 中文 另类,国产 欧美 另类 制服 变态,高清 日韩 欧美 中文,高 | 久久久96精品| 99热欧美| 尤物av网站免费在线播放| 久久亚洲AV无码白度| 少妇熟女1区2区3区| 夜夜草我| 天天日天天干天天整| 五月婷婷深深爱| 精品国产国产AV| 日本一卡二区在线| 在线综合 亚洲 欧美中文字幕| 人人操人人摸人| 亚洲春色激情小说| 久久偷偷色综合蜜桃| 99夜夜操| 婷婷视频在线免费观看| 99色色网| 欧美国产有色电影| 日产操逼| 日韩另类| 亚拍在线| 巨乳特殊服务按摩| 上床不卡网站| 女人香蕉久久毛毛片精品| AV麻豆免费一区| 九九综合| 熟妇激情| 天天操夜夜操狠很操| 综合色图,成人综合网| 91AV天美在线视频| 黄色香蕉视频网站一区| 五月婷婷激情综合| 97se综合| 三级特黄60分钟播放| 美女尤物福利视频| 91色夜| 久草视频在线视频在线视频在线观看| 国产在线不卡导航| 神马午夜久久| 十八禁视频网站| 欧美激情亚洲情色| 八戒无码国产午夜福利| 久久综合日韩亚洲欧美| …亚洲黄色厕厕女女在线播…| 秋霞免费AV| 亚精品无码毛片一区二区三区| 午夜舔阴达高潮视频免费看| 色老汉玖玖爱| 91精品人妻一区二区三区蜜臀| 911av网站免费观看| 中文97国产| 一级性爱网| 美女啊啊啊啊pc| 亚洲97超碰| 色青青久久影视| 久久久久久中文| 又粗又长又爽在线观看| 91国产美女丝袜足交精品视频| 日本人妻中文字幕| 熟妇视频一区二区三区在线观看| 欧美加勒比| 日韩熟妇二区| 99re在线| 熟女在线视频| 乱欲视频| 青青草国产亚洲精品久久| 亚洲 暴爽 AV人人爽日日碰| 日韩精品一区二区三区四虎影视| 99re久久| 精品少妇一区二区三区免费观看| 性色综合网| 久久国产99精品72福利| 97色亚洲| 亚洲视频,小说| 成人av影院在线观看| 情侣操 逼视频99| 日韩人成网站在线播放| Aa东京男人的天堂| 成人av免费观看| 人妻欧美| 久操视频免费在线观看| 久久久精品中文字幕爱豆| 丁香五月天久久精品视频一区二区三区| а√天堂资源官网在线资源| 欧美页片| 日韩精品中文字幕一| 色亚洲欧美| 久久激情五月| 国产在线综合网| 亚洲综合图色在线| 强奸乱伦大香蕉网| 色香av| 91人妻Pr| 亚洲婷婷丁香在线| AV中文字幕剧情1区2区3| 色色福利| 99999re| 91国产美女丝袜足交精品视频| 上海一级黄片| 99久久99九九99九九九| 日韩AV电影网站| 激情抓乳插进去啪啪啪日韩 | 激情深爱五月天| 亚洲无992tv| 熟妇高潮精品一区二区三区下载| 国产69精品久久久久99尤物| 丰满少妇一区二区三区免费看| 青青草视频久久久久| 国产乱伦亚洲| 欧美丝袜中文字幕07在线| 爱爱动态120秒| 偷拍自拍在线视频观看| 97超碰日韩| 性性久久| 国模限制级电影| 久久高清欧美国产| 蜜臀99久久| 天天操狠狠日夜夜干超大胆开放com大香蕉视频在线观看 | 爱妻综合网| 日韩99神马视频播放片在线播放| 欧美五十路熟| 少妇熟女一区二区三区| 色婷婷淫色网| 人妻激情另类| 强奸乱亚洲| 国产二区视频在线观看电影| 欧美日韩国产精品久久色婷婷| 密臀在线免费观看| 一区二区三区精品视频| 国产无码高清操逼视频| 九九九精品美女| 天天天天天天天天综合| 亚洲性综合9| 操逼操操操91| 欧美中文字幕日韩在线| 欧洲亚洲少妇| 性欧美第一页| 天天天天天天天天综合| 亚洲日韩一区电影| 国产亲戚伦亲在线| 国产精品人人爽人人做可爱福利| 夜夜欢天天干| 台湾佬中文娱乐网久久久久久久久久com| 日产国产精品中文久久婷婷| 国产毛片精品一区二区色欲黄A片| 色婷婷六月丁香七月婷婷| 久久精品熟妇丰满人妻99| 91偷拍欧美亚洲| 狠狠干狠狠色| 欧美专区日本专区| 岛国视频一二三区| 亚洲中文字幕在线视频一区二区| 91无码人妻精品一区二区三区蜜桃| 91天美传媒精品| 国产精品一二三区福利| 九九色逼| 精品人妻美妇91job| 91丨豆花丨熟女| 超清福利精品视频在线| 女沟厕偷窥piss小便| 国产在线激情| 欧美日韩亚洲少妇寂寞影院正在播放| 国产熟码AV| 日本中文字幕熟妇| 九九热午夜欧亚国产视频| 久久久久9久久久久| 亚洲另类综合欧美| 老色69| 激情丁香五月| 日本韩国一本产品小视频日本韩国一本产品久久久产品小视频日本韩国一本产品久 | 亚洲免费人妻在| 久草视频在线视频在线视频在线观看| 亚洲一区二区三区中文字幕| 色哟哟AⅤ| ji熟女.com| 四虎在线观看视频| 国产精品不卡av免费在线观看| 亚洲色人| 国产中出内射一区二区| AV乱伦专区| 欧美综合娱乐久久| 中国大陆国产高清AⅤ毛片| 日韩欧美国产一区二区三区四区| 午夜啪啪片| 少妇高潮对白在线观看| 亚洲日本韩国在线| Julia在线播放亚洲久久| 精品精品精品| 夜夜嗨av午夜成人| 久久大精品乱码视频人妻熟女| 97天天弄| 亚洲欧美激情小说| 天久久久噜噜噜久久国产精品爽爽| 亚洲综合网91| 久久国产AⅤ| 69av一区二区三区| 国产东北女人在线视频| 韩国一级做A片免费的| 国产麻豆福利av在线播放| 97香蕉碰碰人妻国产欧美| 69精品少妇一区二区三区蜜桃| 久久久艹艹艹| 都市激情人妻一区二区青青操视频 | 日韩成人私密一级精品av| 岛国福利在线精品播放| 亚洲AV噜噜狠狠网址蜜桃动漫| 探花激情视频| 超碰色中文| 国产suv精品一区二区四区999| 亚洲高清视频在线观看| 肉丝无码中文高清| 国产超碰欧美| 思思久热在线精品66| 亚洲一级特黄大片在线播放91| 乱欲一区二区| 亚洲……91| 1.igao73.com 加入收藏 免费专区 国产精品 中文字幕 日韩精品 欧美精品 精彩 | 日韩 欧美 视频 在线 一区| 国产午夜激片Av毛片不卡| 国产精品久久久亚洲一区| 中文字幕版| 黑人性暴力毛片| 亚洲高清无毛一区二区| 人人干人人操人人..com| 久久一区无码| 超碰97人人乐| 亚洲中字幕日本一区二区三区| 国产精品久久久久久 百度| 天美国产三级传媒| 1.igao73.com 加入收藏 免费专区 国产精品 中文字幕 日韩精品 欧美精品 精彩 | 91路www| 亚洲毛片久久| 免费少妇一区二区| 超碰人人干| 日韩中文字幕熟妇人妻| 精品二区三四区五电影 | 女人高潮抽搐喷水视频网站| 野狼激情网| 智利AV在线网| 中文人妻av高清一区| 精品 码产区一区二-1080P高清在线www-B029AV | 伊人影院在线理论播放| 9I1性色影院| 免费一级特黄特色大片在线观看看| 能看的av| 嗯~啊~轻一点 视频| 2018天天干在线视频| 蜜臀少妇一区二区| 性生活性生大爱77AV国产| 国产野战露脸在线播放| 久久久久精| 亚洲色婷婷综合久久久久中文| 日韩在线一区二区| 91人人爽人人爽| 清纯唯美激情| 啊v视频在线观看| 超碰在线97国产| 日韩免费一级性爱视频| 中文字幕精品一区二区精品| 蜜臀在线看片| 色情乱伦AV| 黄色片G G G| 国产色产精品在线观看 | 91社操逼| 国产亚洲日本| 激情熟女12P| av大香蕉网站| 国产区日韩区在线观看| 婷婷丁香五月综合| 欧美 亚洲精品首页| 国产精品亚洲免费| 老色鬼成人精品视频下载大在线观看| 精品亚洲国产成人精品| 美女黑人91神马| 蜜乳AV免费观看| 有码色中文字幕在线观看| 欧美日韩大香蕉| 殴美大黄片| 欧美日日人人天天| 国产女人成人精品视频| 99精品综合久久久久五月天| 亚洲成人一区二区精品| 日韩八十路老熟女| 凸凹视频在线观看| 大香蕉日亚洲日本亚大| 欧美啪啪女女| 97超碰9| 91黑丝在线播放| 国产强奸乱伦第1页| 亚洲中文制服诱惑| 久久久青草青青国产亚洲免观精品高清完整版_97久久综合区小说区图片区,国精品 | 91久久久久久| 久操电影网| 色哟哟的毛片| 999久久久免费精品国产牛牛| 久久久影院| 天天视频网站黄| 亚洲drav色图| 18禁超污无遮挡无码免费网| 97在线亚洲| 亚洲av夫妻操穴网| 亚洲Av诱惑| 婷婷香蕉欧美在线一区二区三区| 国产毛片片精品天天看视频| 亚洲av热热色| 国产精品嫩草久久久久| 少好三P| 中文字幕日韩综合| av亚欧| 亚州欧美总和| www.激情| 国产精品99精品视频网站| 久久爱超碰网| 热九九精品| 一区二区三区美女超清| 精品亚州18| 色情五月丁香| 强被迫伦姧在线观看无码网站| 婷婷月色| 日B操| 久久久久国产一区二| 超碰超碰超碰超碰的大鸡吧操黑丝袜| 天天摸,夜夜摸| 人人看人人爰人人操| 秘书高跟黑色丝袜国产91在线| 淮穴色AV| 深夜国产一区二区三区在线看| 97视频播放| 伊人久久大香线蕉亚洲五月天,青草青草欧美日本一区二区,欧美日产欧美日产国产 | AV女资源| wwe 天天干.com| 久久男女激情视频网站| 亚洲风情在线观看| 美日韩一二三区| 蜜桃成人1区2区3区| 免费福利视频中文字幕| 欧美九九九| ai欧美亚洲小说| 亚洲色天堂日韩中| 日本欧美一区二区三区免费| 九九久久玖玖| 蜜桃臀AV在线| 精品v1区| 天天爽天天操| 欧亚乱色熟女一区二区| 一级毛片电影免费看| 久草久日| 97在线欧洲| 一区二区三区在线资源| 日韩AV无码网站| 欧美春色| 欧美成人国产精品| 日本一区99| 99欧美| 99久久e免费热视| 中文字幕乱码人妻二区三区| 999精品乱码| 韩国嫰模上门援交视频| 五月天伊人| 97爱爱爱综合| 手机在线A片| 日韩肏逼视频| 中国91AV| 大香蕉 222| 五月丁香亭亭| 美女国产一区二区久久| 国产亚洲精品A在线观看下载| 国产日韩久久| 高清无码人妻久久久一区二区三区aⅴ| 天天干天天操天天拍| 日日爽夜夜爽| 五月天婷婷色色| 欧美做爰无码A片视频| 婷婷丁香五月天亚洲天堂网| 一区二区三区机械有限公司| 黄片色区软件| 中文日本免费高清| av亚欧| 啊啊啊草死我| 爱爱动态60秒| 欧美综合另类| 亚洲熟女人妻中文字幕一区二区| 91亚洲丝袜熟女| 素人伊尹大香蕉免费下载视频| 欧美在线官网| 97精品国产97久久久久久免费| 激情久久久| 日本狠狠干| 91GD.COM| 久/久精品99看9| 欧美日韩成人在线| 日韩精品 资源| 五月综合激情网| 日本免费中文一区二区三区四区| 久99| 麻豆天美国美国产| 蜜桃视频精品一区二区| 亚洲欧洲小说图片视频| 天天综合在线4| 久久超碰亚洲人| 亚洲人在线| 亚洲色图国产另类| 亚州男人的天堂| 天天在线91| chaopen97久久| 伊人超碰97| 国产色图乱伦| 一级性爱视频免费在线| 日韩一级久久毛片| 日韩中文字幕精品一区在线| 国产精品久久久鸭无码的功能| 女人爽到高潮潮喷18禁网站| 欧美丰满熟妇XXXX性ppX人交| 国产亚洲99久久精品| 6080yy午夜理论三级一区二区三区无码 | 97超碰色中文字幕| 免费视频观看60秒| 91情色| 五十路六十路七十路熟婆| 淫荡少妇免费| 丁香九月激情| 久久国色天香香蕉| 国精综合一二三区影视| 九九人妻| 日韩小电影| 久久首页| 亚洲AV无码国产精品久久久久| 丁香五月电影| 香港成人一级视频在线青青草| 亚洲熟女乱色一区二区三区久久久 | 色五月婷婷色| 大香蕉 222| 任我爽在线视频免费观看| 青青青草原| 欧美18老人禁| 日韩不卡a级视频专区| 超碰79人人乐|