99精品久久精品一区二区-亚洲熟妇无码?v在线播放-日本国产精品无码字幕在线观看-久久久亚洲永夜AV-亚洲一级无码一区二区一-免费国产成高清人在线视频-中文字幕乱码免费观看-国产毛片精品妇女久久久

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è)備樹里明明只是聲明了一個簡單的寄存器區(qū)域驅(qū)動里卻要ioremap、要算偏移、要加spinlock最后還會因?yàn)椴煌?qū)動改了同一片寄存器的值而互相踩踏。syscon框架就是為了收拾這個爛攤子而生的。它是一個“雜散寄存器區(qū)域的統(tǒng)一管家”在Linux內(nèi)核中占據(jù)著一個很微妙的位置——說它簡單它確實(shí)只是一個regmap的封裝說它重要從時鐘到電源管理再到硬件隨機(jī)數(shù)依賴它的驅(qū)動遍布整個內(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的適配遇到了一個很典型的場景芯片手冊里有一塊叫“SYS_CFG”的區(qū)域地址從某個基址開始總共就256個字節(jié)。里面密密麻麻分布著幾十個寄存器——bit 0控制某個外設(shè)的軟復(fù)位bit 4到bit 6是某個PLL的鎖定狀態(tài)bit 8又是另一個模塊時鐘的開關(guān)。這些寄存器之間沒有任何規(guī)律純粹是芯片設(shè)計(jì)時“順手”放在一起的。問題來了。驅(qū)動A要操作bit 0做軟復(fù)位驅(qū)動B要輪詢bit 4到bit 6判斷PLL狀態(tài)驅(qū)動C需要改bit 8的時鐘開關(guān)。如果三個驅(qū)動都拿到自己設(shè)備樹里配的reg屬性各自ioremap同一個物理地址那么會出現(xiàn)三種尷尬每個驅(qū)動都維護(hù)一份自己的ioremap映射資源浪費(fèi)還在其次關(guān)鍵是cache一致性不好處理尤其在ARM體系下設(shè)備樹里沒有標(biāo)shared-dma-coherent的區(qū)域CPU cache和device view可能不一致。驅(qū)動A讀修改寫時把驅(qū)動B剛寫好的bit覆蓋了。這種問題在調(diào)試時極其隱蔽因?yàn)閺?fù)現(xiàn)它需要精確到微秒級的時序巧合。一旦某個驅(qū)動要probe失敗或卸載它不能隨便iounmap因?yàn)閯e的驅(qū)動還在用同一塊映射。這就是典型的“系統(tǒng)控制器”場景一片寄存器不屬于任何一個獨(dú)立的功能模塊而是整個SoC的“公共設(shè)施”。syscon框架為這類場景提供了一種“共享映射統(tǒng)一訪問”的解法本質(zhì)是用regmap子系統(tǒng)來做一次共享資源管理。1.2 syscon不是一個新功能而是一種約定嚴(yán)格來說syscon并不新增任何硬件能力。它做的事情聽起來簡單但價值極大由內(nèi)核統(tǒng)一維護(hù)對某個寄存器區(qū)域的ioremap多個驅(qū)動共享同一個映射避免各自為政。通過regmap提供統(tǒng)一的讀改寫接口天然處理了cache同步和鎖問題。允許驅(qū)動之間通過regmap的lock機(jī)制避免并發(fā)訪問沖突。在設(shè)備樹層面形成一種節(jié)點(diǎn)約定大家通過syscon的phandle引用同一個控制器。打個比方?jīng)]有syscon的時候幾個驅(qū)動相當(dāng)于各自拿鑰匙開了同一間辦公室文件擺得到處都是還經(jīng)?;ハ嗄缅e。有了syscon辦公室門口多了一個管理員所有人去管理員那里登記、存取文件雖然多了一道手續(xù)但再也不會亂了。2. 設(shè)備樹中的syscon節(jié)點(diǎn)怎么聲明怎么引用2.1 從compatible開始syscon框架在設(shè)備樹中的核心就是一個節(jié)點(diǎn)它的compatible通常有兩種寫法syscon12340000 { compatible syscon, simple-mfd; reg 0x12340000 0x1000; };第一種寫法compatible里帶了simple-mfd意思是這個節(jié)點(diǎn)不僅是syscon還是一個“簡單多功能設(shè)備”——它的子節(jié)點(diǎn)通常對應(yīng)芯片手冊里的各個功能塊由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)建一個regmap并把regmap作為syscon設(shè)備的核心資源保存起來。2.2 引用方式phandle 偏移其他驅(qū)動引用syscon的方式很直接在設(shè)備樹里放一個syscon屬性some-driverabc00000 { compatible vendor,some-block; reg 0xabc00000 0x100; syscon system-controller 0x10; /* 基址偏移0x10 */ };這里system-controller是phandle指向之前定義的syscon節(jié)點(diǎn)后面的0x10表示這個驅(qū)動關(guān)心的寄存器相對于syscon基址的偏移。2.3 內(nèi)核驅(qū)動怎么拿到這個引用設(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之后整個寄存器區(qū)域就可以像一個普通內(nèi)存塊一樣通過regmap_read/regmap_write/regmap_update_bits來訪問了。提醒syscon_regmap_lookup_by_phandle返回的regmap不需要驅(qū)動自己釋放它的生命周期由syscon設(shè)備管理。驅(qū)動remove時不要調(diào)用regmap_exit否則會double free。3. syscon的核心接口不只是regmap3.1 syscon整個家族接口syscon提供的接口并不算多但每個都很有用。我把它們梳理成三類按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);這個接口適合已經(jīng)有struct device_node但不一定通過phandle屬性引用的場景。第三類是直接創(chuàng)建struct regmap *syscon_regmap_lookup_by_compatible(const char *s compatible);這個接口適合那種驅(qū)動不知道phandle屬性名但知道syscon節(jié)點(diǎn)的compatible字符串的場景。我最初一直想不通這個函數(shù)該怎么用后來在一個平臺驅(qū)動里看到了就是全局只有一個syscon節(jié)點(diǎn)直接按compatible找省得去改設(shè)備樹加phandle屬性。還有syscon_node_to_regmap需要特別說一句它查找的是節(jié)點(diǎn)對應(yīng)的regmap如果節(jié)點(diǎn)本身沒有建立regmap會返回錯誤。但如果節(jié)點(diǎn)加上了syscon的compatible設(shè)備驅(qū)動會為它自動創(chuàng)建regmap。3.2 regmap層的配置syscon本身是建立在一個regmap之上的。drivers/mfd/syscon.c在probe時候會根據(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配置。我碰到過一個硬件設(shè)計(jì)寄存器偏移不是連續(xù)的中間有大量保留區(qū)域這時就得手動設(shè)置stride或者用regmap_config里更細(xì)的max_register和num_reg_defaults_raw來避免掃描到無效寄存器。4. 動手寫一個依賴syscon的驅(qū)動完整實(shí)例4.1 場景設(shè)定假設(shè)有一個硬件模塊叫“某某系統(tǒng)控制”它需要在設(shè)備初始化時完成以下操作讀取寄存器0x04判斷某個硬件加速器是否已上電。如果沒上電則在寄存器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。但這里有一個反直覺的點(diǎn)硬件工程師在芯片手冊里通常寫的是“寄存器0x04”意思是基址加0x04字節(jié)處的寄存器。那么對應(yīng)regmap寄存器編號就是0x04 / 4 1。我調(diào)試某IP核的時候手冊寫的寄存器偏移是0x1C結(jié)果我在regmap里直接用regmap_read(regmap, 0x1C, val)讀出來的數(shù)據(jù)永遠(yuǎn)跟預(yù)期不符最后對著代碼和手冊查了好久才發(fā)現(xiàn)偏移應(yīng)該除以4。這個坑真的很經(jīng)典。要么在代碼里保持“寄存器編號byte offset/stride”要么在驅(qū)動里顯式定義一個宏比如#define REG_OFFSET_TO_INDEX(off) ((off) / 4)把換算關(guān)系寫清楚避免事后調(diào)試時混淆。5.3 regmap的默認(rèn)配置syscon為節(jié)點(diǎn)創(chuàng)建regmap時有幾個關(guān)鍵配置項(xiàng)需要注意。reg_bits和val_bits通常都是32但有些老平臺是16位總線就要在設(shè)備樹里表示清楚或者通過驅(qū)動側(cè)的regmap_config顯式指定。max_register最好根據(jù)reg屬性的大小設(shè)定否則如果硬件只實(shí)現(xiàn)了低地址段寄存器高地址段的讀操作可能返回cease錯誤甚至觸發(fā)總線錯誤。我遇到過一個極小概率但很麻煩的問題某個syscon節(jié)點(diǎn)的物理區(qū)域只有0x400個字節(jié)但有一個驅(qū)動在寫regmap_config.max_register時漏配導(dǎo)致內(nèi)核讓后續(xù)驅(qū)動訪問到0x1000偏移處的非法地址直接Serror panic。所以使用syscon時最好在驅(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 一個驅(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ù)或全局變量把這個base傳出去。這種方案在單驅(qū)動時很高效但對于共享寄存器區(qū)域就有致命缺陷io的訪問完全依賴誰先映射了這片內(nèi)存一旦驅(qū)動加載順序變化另一個驅(qū)動就拿不到地址。syscon的做法是把“誰持有regmap”這個信息交給內(nèi)核統(tǒng)一管理誰想用誰來查而不是誰加載早誰說了算。6.2 cache問題和自旋鎖regmap內(nèi)部對cache的處理也很講究。在大多數(shù)SoC默認(rèn)配置下內(nèi)存domain寄存器訪問需要保證cache一致性而regmap在regmap_update_bits流程里會同時考慮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的另一個好處是驅(qū)動代碼可以拆得更干凈底層寄存器訪問邏輯可以單獨(dú)做一個backend模塊方便在host環(huán)境做單元測試。我有個團(tuán)隊(duì)在做某電源管理子系統(tǒng)時因?yàn)殡娫葱酒募拇嫫骺刂七壿嫼蚐oC本身是解耦的就把寄存器訪問全部抽象成regmap接口然后在PC主機(jī)上用一個虛擬的regmap總線驅(qū)動來模擬硬件時序。這樣整個電源狀態(tài)機(jī)的邏輯可以在沒有硬件的情況下跑通省了大量上板時間。這完全仰仗于syscon把寄存器訪問和業(yè)務(wù)邏輯徹底解耦。7. syscon和mfd的異與同什么時候該用誰7.1 兩者解決的問題有重疊mfd是多功能設(shè)備框架通常對應(yīng)一個硬件芯片它里面有多個功能單元比如一個音頻codec里既有ADC又有DAC還有數(shù)字接口。mfd設(shè)備會創(chuàng)建多個子設(shè)備每個子設(shè)備又有一個獨(dú)立驅(qū)動。syscon看起來也可以創(chuàng)建一個多子節(jié)點(diǎn)的設(shè)備因?yàn)閟imple-mfd就是和syscon配合的。但兩者的側(cè)重點(diǎn)不同mfd側(cè)重“功能架構(gòu)”syscon側(cè)重“寄存器共享方式”。mfd是把一個物理設(shè)備拆成多個邏輯設(shè)備syscon是把一個寄存器區(qū)域共享給多個獨(dú)立設(shè)備。7.2 實(shí)際選型建議如果硬件手冊明確把某個區(qū)域定義成一個獨(dú)立的IP該IP下掛多個功能子模塊使用mfd更合理。如果多個IP之間共享一片寄存器但沒有從屬關(guān)系用syscon更合理。如果一個IP里既有多種功能又想讓外部驅(qū)動訪問該IP的某些寄存器可以考慮mfd包裝IP、內(nèi)部用syscon暴露寄存器區(qū)域兩者結(jié)合使用。我實(shí)際參與的一個項(xiàng)目就做過這種組合主控芯片里有一個混合信號處理單元它內(nèi)部有完整的mfd架構(gòu)管理ADC和比較器等子設(shè)備同時這個處理單元的寄存器區(qū)域又被另一個獨(dú)立的安全模塊引用這時在主設(shè)備里注冊一個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。每個regmap會生成幾個文件registers讀取當(dāng)前寄存器快照。access內(nèi)核會把讀寫權(quán)限信息輸出。nameregmap的名字通常和設(shè)備節(jié)點(diǎn)名對應(yīng)。如果你想快速確認(rèn)某個驅(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)試時可以用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這樣可以清楚看到哪個驅(qū)動在什么時間讀了哪個寄存器。在排查多驅(qū)動互相踩踏的疑難雜癥時這一步的追蹤信息比邏輯分析儀還直觀。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)系兩個驅(qū)動互相覆蓋寄存器位缺少regmap鎖或者同時更新了同一寄存器確認(rèn)它們是否通過同一個regmap實(shí)例訪問檢查tracepoint確認(rèn)訪問序列syscon設(shè)備注冊失敗regmap_config里可能有無效配置內(nèi)核日志會打印syscon: invalid regmap之類信息檢查reg屬性長度8.4 一個需要特別警惕的板級問題某個平臺在低功耗休眠前要利用syscon的寄存器把整個系統(tǒng)控制單元配置到睡眠狀態(tài)。結(jié)果發(fā)現(xiàn)休眠喚醒后某些寄存器變成了隨機(jī)值。后來排查發(fā)現(xiàn)問題不在驅(qū)動而是板級設(shè)計(jì)里這片syscon區(qū)域沒有接入正確的電源域休眠時域掉電導(dǎo)致寄存器內(nèi)容丟失。驅(qū)動代碼再怎么訪問都是對的但硬件寄存器本身就沒了。這就是單片系統(tǒng)里提syscon特別容易忽視的問題syscon解決了軟件訪問問題但沒解決硬件供電問題。所以設(shè)計(jì)時要檢查這塊區(qū)域在低功耗狀態(tài)下的保持能力別把人家“系統(tǒng)控制器”當(dāng)普通內(nèi)存區(qū)域處理。9. 給驅(qū)動接入syscon時容易踩的坑與細(xì)節(jié)梳理9.1 phandle args和offset部分硬件在設(shè)計(jì)時同一片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)告訴了這個驅(qū)動它關(guān)心的偏移在哪驅(qū)動不需要重復(fù)定義偏移宏。與syscon_regmap_lookup_by_phandle相比這種模式更適合一個驅(qū)動內(nèi)部有多組不同寄存器的場景。9.2 不要自己持有全局regmap指針有些驅(qū)動圖省事把某個syscon的regmap指針存在全局變量里。一旦驅(qū)動被卸載重裝這個全局值就指向已釋放的內(nèi)存另一個驅(qū)動再查就只能crash。正確做法是每次需要時都通過syscon_node_to_regmap或syscon_regmap_lookup_by_phandle查詢。這可能會增加一點(diǎn)指針查找開銷但對于probe階段的調(diào)用完全可接受。如果運(yùn)行時會非常頻繁地使用可以在驅(qū)動的私有數(shù)據(jù)結(jié)構(gòu)里保存這個regmap指針而不是放進(jìn)全局。9.3 regmap的volatile范圍syscon區(qū)域里的寄存器很多是硬件狀態(tài)寄存器每次讀都會改變值。如果在regmap里配置了cache并標(biāo)記這些寄存器為non-volatile緩存會覆蓋真實(shí)狀態(tài)導(dǎo)致驅(qū)動讀到錯誤值。這也是一個很容易被忽視的點(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è)備樹配置一個復(fù)位寄存器用一個節(jié)點(diǎn)配置reboot-mode { compatible syscon-reboot; offset 0x0; mask 0x08; value 0x08; };這種配置可以讓整個系統(tǒng)掛到syscon的復(fù)位寄存器上不需要為重啟專門實(shí)現(xiàn)一個平臺驅(qū)動。同樣還有syscon-poweroff。10.2 配合syscon_restart_handle或regmap的寫保護(hù)部分SoC的寄存器區(qū)域有寫保護(hù)位比如要先往某個保護(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訪問記錄來追蹤一個可疑的驅(qū)動為什么在系統(tǒng)休眠時會周期性地讀某個寄存器。通過tracepoint和debugfs的訪問統(tǒng)計(jì)找到了特定的外部訪問模式最終問題定位到bios里某種GPIO中斷誤觸發(fā)導(dǎo)致讀取行為被反復(fù)調(diào)度。syscon提供了一個統(tǒng)一觀察窗口對這種疑難雜癥的排查幫助巨大。11. 在現(xiàn)有平臺里添加syscon支持具體步驟如果要在自己的平臺里引入syscon通常就以下幾個步驟。設(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)證時用debugfs的regmap接口和tracepoint。注意probe的順序通常syscon設(shè)備會被優(yōu)先初始化。如果存在依賴順序最好讓看起來需要syscon的驅(qū)動檢查-EPROBE_DEFER并重試。這個順序看起來很簡單但實(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 一個協(xié)議和實(shí)現(xiàn)的統(tǒng)一syscon框架給我的啟發(fā)是在嵌入式/內(nèi)核開發(fā)中很多看起來“沒什么技術(shù)含量”的基礎(chǔ)組件恰恰決定了整個系統(tǒng)的穩(wěn)定性和開發(fā)效率。寄存器的訪問本身是一件小事但凡是系統(tǒng)級的共享資源它的訪問方案必須在初始設(shè)計(jì)時就統(tǒng)一。等到硬件跑起來再補(bǔ)救日志里出現(xiàn)兩三個驅(qū)動互相覆蓋bit的問題時你才會明白早用syscon的價值。12.2 面向?qū)嵺`的編程范式syscon的做法其實(shí)是一種很通用的編程范式把資質(zhì)相同的資源抽取出來做統(tǒng)一的訪問控制讓業(yè)務(wù)模塊只依賴一個抽象接口不用關(guān)注實(shí)現(xiàn)細(xì)節(jié)。這和用戶態(tài)編程里的依賴注入、服務(wù)定位有異曲同工之妙只是它發(fā)生在內(nèi)核態(tài)以設(shè)備模型和regmap為載體。每次在系統(tǒng)里碰到多個模塊搶同一個寄存器區(qū)域我的第一反應(yīng)不是去加鎖而是先想這片區(qū)域適不適合用syscon統(tǒng)一管理。只有當(dāng)需求確實(shí)非常專一時才考慮在一個驅(qū)動里直接ioremap。這個權(quán)衡標(biāo)準(zhǔn)我希望能給初入內(nèi)核的朋友一些啟發(fā)。12.3 一點(diǎn)個人心得在做過的多個項(xiàng)目里syscon幾乎成了我處理寄存器共享問題時默認(rèn)的“第一選擇”。不只是因?yàn)樗峁┝薃PI更因?yàn)樗谡麄€內(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)核框架的價值不在于它多么炫技而在于它能夠讓一批驅(qū)動協(xié)同工作時不打架。syscon在這方面的設(shè)計(jì)雖然樸素但極其有效。希望這篇文章能幫你在自己的項(xiàng)目中少走一段彎路把寄存器管理變成一件“不用太操心”的事。如果在調(diào)試中遇到什么特別反直覺的問題不妨也記錄下來。內(nèi)核開發(fā)就是這樣很多知識都是在踩坑和復(fù)盤之間積淀出來的。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
五月婷丁香| 色婷婷激情小说网| 婷婷五月天免费99| 在线日韩av| 思思热在线精品视频网站| 91精品久久久久久综合五月天| 丁香五月中文字幕| 五月综合激情婷婷六月色窝| 996热re视频精品视频这里| 人妻丰满精品一区二区A片| 牛牛碰免费| www.玖玖九| 丁香色情五月综合网站| 色婷丁香五月| 99九九免费精品| 婷婷欧美| 五月四色婷婷| 色婷婷久久综合| 久久婷五月天| AV天堂婷婷五月天| 天天操天天操| 99精品热视频| 久久综合影院| 影音先锋美国A| 夜夜爽天天日| 色色热99| 东京热免费视频网站| 这里有精品| 五月丁香婷婷色| 五月天色色网站| 久久伊人日日夜夜| aaa久久| 99久久www| www.国产色| 夜夜涩涩涩| 99re8热精品免费视频| 色丁香五月天| 五月天啪啪| 9超碰在线| 婷婷金品综合视频| 日日撸夜夜操| 天天草天天日| 伊人在线婷婷草| 九九色精品| 激情久久丁香| 久久五月网| 久久五月天视频| 99热在线观看| 色级停停| 天天揷综合网| 在线不卡的视频| 五月婷婷综合在线| 亚洲综合久| 婷婷成人丁香色情基地30| 色婷婷啪啪啪啪啪啪| 人妻免费网站| 黄色片久久| 9久热| 噼里啪啦在线观看免费完整版视频| 深爱综合网| 天天狠狠六月婷丁香影院| 另类图片五月天婷婷| 狠狠色狠狠干| 丁香五月天网友自拍啪啪啪视频| 丁香五月婷在线观看| 久久久妻人人人| 国产肏屄大片| 日本99在线| 青吴乐视频| 婷婷永久在线| 激情婷婷六月天| 夜夜撸天天操| 婷婷99狠狠躁天天久久久九九九| m色激情网| 无语停婷丁香网| 91热在线| 亚洲久热| 强辱丰满人妻HD中文字幕| 丁香成人色情五月天| 开心五月天激情网站| 五月丁香影视| www.激情| 精国产品一区二区三区A片| 成人精品人妻| 婷婷婷婷色| 五月天激情电影| 99激情视频| 五月婷色色| 另类综合激情| 激情都市另类| AV成人在线播放| 永久的网站AAAA| 婷婷色婷婷| 99在线视频免费| 玖热精品综合视频| 99在线观看免费精品视频| www 五月天 com| 婷婷综合精品视频97| 五月婷六月丁| 99A片| 免费视频WWW在线观看网站| 天天狠狠夜夜狠狠2023| 五月综合久久| 欧美日韩中国| 日本色道视频网站| 2025天天爽天天摸| 99热伊人| 欧美月久久| 激情av在线| 久热这里这里有精品| 99爱视频免费看| 中文字幕视频在线播放| 免费看欧美成人A片无码 | 深夜激情网| 天天插插天天| 丁香六月啪啪| 啪啪激情网| 天天干天天干天天干天天干天天| 99色综合| 久久九九思思| 黄色五月婷婷| 五月亭亭网成人在线视频| 99色在线视频| 97色婷婷五月天| 色五月婷婷久久| 婷婷五月天成人影片| 综合色五月天| 婷婷狠狠18禁久久| 激情五月丁香亭亭 | 深爱激情六月天| 婷婷五月天久| 99自拍视频| 婷婷色5月天在线。| 97韩国久久电影院| 亚洲日本韩国| 另类图片激情五月天| 五月天欧美激情| 亚洲AV中文在线| 思思99热热热99| 六月丁香成人| 五月婷婷激情综合网| 色五月综合| 色色色com| 亚洲欧洲99| 日日噜噜夜夜狠狠久久丁香五月| 婷婷日韩| 天天操天天操天天操天天操天天操天天操 | 九色在线观看91av| 婷婷久久五月天亚洲欧美国产日韩在线观看 | 日韩在线观看亚洲| 五月天激情中文字幕| 99热这里只有精品2| 亲子乱av一区二区三区的| 丁香六月激情| 激情五月综合网最新| 成人综合AV| 久久99激情五月天| 开心激情网五月| 婷婷在线网| 噜噜干日本| 天天干天天 亚洲| 色五月激情网| 欧洲日韩一区二区三区| WWW.桔色成人.COM| 伊人婷婷五月| H亚洲| 狠狠狠激情网| 99久热视频在线| 丁香婷婷六月天| 国产日比| 天天情色五月天| 欧美性猛交XXXX乱大交极品| 天天爽夜夜爽| 91亚洲免费片| 欧美精品99| 五月天伊人综合| 亚洲无码99| 久久午夜丁香| 激情综合网五月婷婷| 久久久久99精品成人网站| 日本婷婷| PORNY九色9l自拍视频成人| 六月婷婷激情| 五月天社区| 五月天播播| 色色无码日韩| 影音先锋91网站在线观看| 五月色俺婷婷| 99九无网码| 亚洲精品网址| 久热这里| 婷婷五月六月激情| 开心五月综合激情网| 日本99久久| 色婷婷aV四虎| 淫视馆AV在线| 激情婷婷五月天伊人在线观看| 97色婷婷| 97性视频| 亚州视频九九99| 一级片操逼视频| 开心五月天激情网站| 色色综合热| 激情六月婷婷| 国产精品久久..4399| 亚洲色久| 极品五月天| 偷偷操九九| 婷婷五月天激情电影| 99re热视频这里只有综合亚洲| 五月激情综合网| 这里只有精品在线看| 国产九九一区二区三区| 色婷婷五月天| 91婷婷搞| 亚洲 六月 综合| 91色色色18| 超碰人人99| 亚州激情九月| 99热免费| 成人婷婷| 婷婷六月视频| 婷丁五月| 色五月婷婷在线观看第一页舔| 开心婷婷丁香五月| WWW.99热| 婷婷日韩| 99热在线播放| 九九久久五月天| 婷婷中文字幕版| 六月婷基地| 五月色丁香| 国产日批视频| 综合99久久天天综合| 婷婷九月色| 天天爽日日爽夜夜爽| 色五月色五天色情网| 日本视频不卡123区| 天天爽天天爽视频| 五月情综合| www色婷婷com| 亚洲无码性爱| 久久精品99国产精品日本| 色综合色综合色综合色综合| 婷婷五月天伊人网在线观看视频| 99re最新地址视频| 超碰在线观看9| 99精品成人无码A片观看金桔| 99热这里只有精品在线观看| 五月丁香婷庭在线| 色插综合网| 97人人操在线| 丁香色成人| 97人人操人人插| 五月天婷婷综合| 婷婷六月综合基地| 欧美色色色色色| 九九草热在线观看| 思思热99er在线视频| 婷婷狠狠操| tingtingseav| 开心激情综合| 热久久91| 99热爱爱干干日| 婷婷精品性视频| 五月天婷婷在看| 香蕉大综综综合久久| 亚洲欧美在线观看| 婷婷99狠狠| 大香蕉九操| 第四色婷婷丁香五月| 五月婷婷五月丁香综合| 五月婷婷色播视频| 婷婷色婷婷亚洲成人| 久久草中文日韩欧美| 97操在线资源| 一区二区传媒视频| 久99精品视频| 色婷婷五月天av在线| 久青草影院| 丁香五月激情性色郤| 五月丁香六月欧美综合| 五月香蕉婷婷| 丁香婷婷五月天色播| 99re熱| 色99网| 99色中文| 色五月天.con| 丁香色五月婷婷17C| 久久久久婷婷| 国产精品国产| av在线观看网站| 亚洲性爱电影| 无码四色色色| 色 五月婷婷基地| 色婷婷综合五月| 丁香五月在线视频| 新五月天婷婷激情电影| 丁香五月综合在线观看| 欧美Va婷色| 玖玖五月丁香| 久久人妻精品| 婷婷五月天激情小说| www.色色五月天.com| 九九色图| 99热精品在线在线| 8050一级网| 亲子乱AV-区二区三区| 九色综合五月天婷五月| WWW·色色色·COM| 天天插天天插天天日| 这里只有精品99视频| 婷婷操超碰| 91黄址| 国产亚洲精品人人| 婷婷五月天亚洲综合| 第四色婷婷丁香五月| 99热8| 五月丁香无码| 狠狠色丁香| 精品久久久中文字幕大豆网推荐理由| 精品操逼一区二区| 色婷婷五月天中文字幕| 精a品a视a频| 国产99精品免费视频| 69激情小说| 亚洲成人噜噜| 99精品在线观看视频| 日韩免费视频| 丁香五月天激情四射网| 久久ER视频com| 婷婷五月天成人影片| 99精品综合| 超碰在线人人| 狠狠狠狠狠狠草| 成人资源在线| 色 丁香婷婷| 五月婷婷婷| 日本三级中国三级99| 北京熟妇搡BBBB搡BBBB| 99热线观看9| 色五月婷婷五月丁香五月激情五月视频| 婷婷五月天日逼| 色导航色婷婷五月天在线观看| 女人天堂 AV| 色婷婷精品视频| www.天天日| 99色综合久久| 五月天天天综合| 99热日韩| 婷婷丁香六月| 69人妻人人澡人人爽久久| 噜综合| 五月天色丁香| 韩国中文字幕91| 91色噜噜狠狠狠狠色综合| 色五月丁香五月激情五月激情| 战争与艾拉电影免费观看| 激情丁香五月| 婷婷在线中文字幕| 开心五月天私房婷婷| 丁香六月亭亭久久综合| 色婷婷成人做爰A片免费看网站| 九九久久精品國產| 六月丁香婷婷尤物| 国产精品美女| 日本不卡中文字幕| 六月天婷婷| 黑人巨粗进入警花疼哭A片| 色婷婷激情| 婷婷五月色丁香在线看| 少妇高潮呻吟A片免费看软件| 99九九中文字幕视频| 色婷婷AV五月天| 91久久久久久久| 亚洲成人无码片| 六月丁香婷婷网| av在线免费播放| 婷婷黄色五月| 激情五月视频在线婷婷| 丁香性爱在线视频| 丁香伊人激情| 欧美成人AAA片一区国产精品| 婷婷五月天激情电影| 色婷婷六月天在线| 五月激情丁香啪啪| 开心五月婷婷在线视频免费观看| 五月香婷婷| 伊人激情综合网| 六月婷婷开心| 九月av在线| 激情五月婷婷综合色播小说| 欧美色片中文字幕久久久久| 爱草视频在线| 99精品偷自拍| 99精品国产热久久91色欲| 婷婷五月天欧美| 久久婷婷五月综合色和| 色婷婷五月天视频在线| 色五月色五天色情网址| 99综合免费视频| 精品欧美性爱超级爽| 五月色亭丁香| 99超超碰| 狠狠五月天激情| 日韩av手机在线观看| 成人深爱丁香五月| 精品一区二区三区免费毛片爱| 亚洲久热| 99热精品在线在线| 超碰碰碰碰| 色玖玖综合网| 丁香五月天在线视频| 99久久婷婷国产综合精品草原| 色狠狠色综合久久久绯色AⅤ影视| 久久这里只有精品99| 一级性爱大片| 五月婷六月| 97色97干| 久久小视频| 婷婷激情丁香五月天综合| 色色色热| 这里只有国产精品在线| se婷97| 综合激情站| 婷婷国产欧美97| 狠狠干在线| 婷色五月天| 超碰99在线| 樱花99视频| 国自产拍偷拍精品啪啪一区二区| 日日夜夜综合| 综合久久五月天| 狠狠爱综合| 五月婷婷综合网| 五月丁香大香蕉| 婷婷丁香五月激情图片| 色综合播放| 久久99热这里只频精品6学生| 91尤物九色在线| 色99网站| www一区二区三区| 操逼国产91| 日韩亚洲视频| 99色热视频| 99热99思午夜精品| 丁香激情网| site:feetmall.com| 欧美超碰人人| 丁香五月成人| 色爱五月天| 婷婷无码视频| 久久婷婷综合五月| 99热亚洲| 综合综合网| 最新日韩久热免费视频看看| 丁香五月婷婷色| 天天操,夜夜骑| 天堂久久婷婷| 天天色天天操天天射| 草五月| 婷婷第六色| 精品婷婷丁香五| 五月婷婷丁香| 五月婷婷人妻| 丁香六月AV| 久久99草五月婷婷| 久久婷婷伊人| 丁香美女五月天婷婷| 狠狠做五月| 九九综合九色欧美狠狠| 亚洲综合婷婷| 99啪99| 久久性爱视频| 久久天堂女人| 天天综合色| 99热首页| 亚洲综合婷婷| 激情深爱五月婷婷| 婷婷六月综合基地| 成人无码髙潮喷水A片| 91人碰| 欧美天天性| 久久久999精品| 91碰免费视频| 亚洲视频一区| 这里只有精品免费| 国产精品色婷婷99久久精品| 欧洲激情网站| 婷婷天堂视频| 97碰91| www.天天干| 午夜爱爱网站| 激情五月婷婷丁香| 丁香网五月网| 丁香婷婷丁香五月欧美人| pom538精品视频| 99ri网站在线观看| 无人区码一码二码三码医生系列| 五月开心久久| 亚洲综合成人网| 可以免费观看的AV| 日本五月婷| 九九久久99| 色性综合| 操人无码| 影音先锋噜一噜| 婷婷九月丁香天堂丁香天堂| 久久九九亚洲| 超碰97色| 色综合天天网| 女同激情久久av久久| 五月之婷婷| 五月婷婷成人网首页| 国产在线黄色| 99热99久久| 97人人看一| 狠狠狠狠青草| 一级性爱大片| 激情丁香五月天图片| 九九九激情网| 97超喷视频在线观看| 丁香网五月天| 校园春色亚洲色| 欧美情色一区| 亚洲日比视频| 大香蕉太香蕉视频97| 99热 日韩| 99精品国产乱码久久久人妻| 97在线观视频免费观看| 国产XXXX搡XXXXX搡麻豆| av大香蕉| 国产真实乱对白精彩| 欧美 日韩 人妻 高清 中文| 亚洲视频在线观看| 午夜伊人大香蕉| 婷婷五月丁香激情| 天天肏视奸| 996黄色片| 伊人青涩网| 伊人影院久久网| 婷婷五月激情综合啪啪| 麻豆雪千夏| 9久国产| 亚洲综合久| 五月婷婷六月丁香免费| 五月婷伊人| 丁香欧美| 五月天婷婷综合免费| 久久精彩视频| 激情婷婷五月| 密着浓厚中出乚交尾GvG935| 激情婷婷黄色五月| 激情婷婷丁香五月天| 婷婷久久大香蕉| 日韩无码一区二区三区四区| 狠狠狠狠狠操| 狠狠摸狠狠摸| 丁香婷婷激情| 色五月综合激情网| 日熟女| 婷婷在线免费| 色色日韩无码| 天天操综合网| 狠狠操狠狠爱| 99干在线视频| 91超级碰| 五月天激情婷婷小说| 五月丁香婷婷视频| 99热最新| 99久久終合| 99久在线精品99re8| 天天摸,天天爽| 激情五月深爱婷婷| 91丨九色丨43老版熟女| 荫道BBWBBB高潮潮喷| 亚洲区1| 日韩不卡DvD| 天天肏天天插| 伊人网碰碰| 国产精产国品一二三在观看| 色婷婷AⅤ| 大香蕉在线99热| 99免费偷拍视频| 丁香六月开心| 五月婷婷,六月丁香| 五月天色丁香| ady狠狠入| 丁香五月花婷婷开心| 激情五月狠狠| 91色久| 涩 五月 婷婷 狠狠| 色婷婷色五月另类综合| 九九热这里| 99热99在线| 丁香五月激情月| 亚洲avjiujiur91| 成人色图情色成人网 www.5b5b5bcom 五月天| 亚洲黄色影视| 日韩av在线免费观看| 天天操九九插| 9色在线| 99精品丰满| 五月丁了香蕉综合| 99热国内精品| 狠狠色婷| 停停色综合伊人| 97人人操| 亚洲婷婷综合视频| 这里只有精品99www| 色色五月天丁香| 色婷婷小视频| 玖操97| 九九色热| 99免费热视频在线| www夜夜操com| www.超碰97| 亚洲操操| 久久色天堂| 性爱五月婷| 五月激情婷婷色| 五月丁香啪啪啪| 嫩草视频观看| 亚洲va在线∨a天堂va欧美va| 欧美 日韩 人妻 高清 中文| 久思思久视频| 狠狠狠狠狠狠狠狠| 日韩 中文 欧美| 99热这里有精力| 超碰成人黄色网| 少妇真实被内射视频三四区| 欧美色色色| 成人在线日韩欧美| 九热视频精品| www.com五月天| 日韩欧美成人网| 操嫩逼电影| 欧美性生交XXXXX无码小说| www超碰| 五月天激情久久| 成人在线网站| 无码动漫av| 久久亚洲无码| 五月激情小说| 婷婷激情六月综合| 任你操精品免费| 婷婷99丁香| 四色99久久| www.久操| 丁香五月婷婷网| 丁香婷婷五月人体| 99热| 97婷婷狠狠| 综合AV在线| 九月丁香亭亭| 丁香五月人妻| 婷婷丁香五| 蜜桃五月天| 婷婷五月丁香激情色情| 香蕉AV777XXX色综合一区| 亚洲欧洲色色| 97在线观看| 日本九九热| 日韩欧美一级大黄网站| 超碰大香蕉网| 色婷婷色99国产综合精品| 五月婷婷丁香啪啪| 少妇人妻丰满做爰XXX| 婷婷激情五月综合基地| 91碰免费视频| 婷婷五月天视频免费在线观看| 婷婷五月天久久综合88| 五月丁香啪啪激情| 天天色天天爽| 黃色三级三级三级三级 qixing300.shrkbk.com www.jinbozs.com tianmiaosw.com | 五月天开心色情网| 操逼视频网址| 国产精品操| 99视频在线播放大全| 91avse| 九九色影院| 五月丁香亚洲综合网| 69人人操人人爽| 五月天丁香婷婷社区| 色婷婷丁香五月| 激情六月天| 五月天婷网| 久久999久久999久久999久久| 免费亚洲婷婷中文字幕| 久久久久久久久久久久久久人妻视频| 丁香五月婷婷国产av| 俺去也婷婷| 开心五月六月婷婷| 91re色综合视频| 激情久久丁香| AV天堂淫乩| 欧在线一区| 成人国产综合| 精久久色| 殴美日比视频| 亚洲无码影音| 婷婷久久大香蕉| 色婷五月丁香久亚洲| 丁香玖玖视频大全| 日日夜夜干| 狠狠干五月天| 开心五月婷婷六月丁香| 大天天伊人| 免费看欧美成人A片无码| 精品五月天| 久久这里这里有精品免费视频| 色色欧美色色色| 五月丁香婷草| 99热只有这里才是精品| 99热伊人| 成人va在线| 天天做天天爽| 这里有精品| 开心五月色婷| 婷婷色婷婷| 丁香五夜激情四射夜夜夜| 五月婷在线观看| 婷婷六月激情| 五六月丁香激情视频| 任你日视频| 狠狠操狠狠色| 狠狠色噜噜狠狠狠888| 激情五月天综合| 六月丁香啪| 1024操逼视频| 男人的天堂在线婷婷| 久色网| 国产精品电影网| 五月天激情.com| 丁香亭亭久久| 97人凄人人操人人爽| 嫩草哈哈操| 五月激情综合网| 亚洲午夜av| 五月婷婷五月天在线 | 99视频精品全部免费观看| 99综合免费视频| 伊人五月天久久| 国产成人综合亚洲| 99精品视频在线观看| 丁香五月综合婷婷| 婷婷五月在线观看| http://www.sd-xiangsu.com/| 五月婷婷视频啪啪美女| 五月婷婷在线短视频| 五月丁香六月婷婷久久肏| 91人人人人人人人| 极品精品一区二区三区在线| 五月香婷婷| 九九性视频| 在线网黄| www久久艹| 久久天天| 丁香五月偷拍| 色无码| 婷婷网五月天| 五月天色影院| 婷婷六月啪啪| 99久视频| 色婷婷五月天在线观看| 久久性爱视频网站| 天天操天天操天天操天天操天天操天天操天天操天天操天天操 | 婷婷五月丁香91| 色婷婷四色| 色婷婷香蕉丁丁网| 老师把我爽高潮了免费A片| 无码AV大香线蕉伊人| 亚洲五月六月婷婷| 五月婷婷丁香日韩在线| 婷婷中文字幕网站| 日本波多野结衣视频| 丁香五月花影院| 婷婷丁香熟女| 婷婷五月精品| 97AV人人插人人操| 久久99久久久久久久噜噜| 操逼五月天| 91精品视频男人的天堂| 91精品啪| 99热精品观看| 久久久婷| xx色综合| 五月四色色| 国产婷婷五月天| 黄色激情五月天| 人人摸人人干| 激情五月婷婷综合| 五月丁香激情综合| 国产成人精品一区二三区熟女在线| 性av| 色综合99色| 大天天伊人| 91啪啪视频| 色五月婷婷少妇人妻| 欧美熟女乱又伦| 色久激情在线| 开心五月天激情网| 久久只有18视频| 国产精品99久久久久久久女警| 国产黄色在线| 婷婷综合另类| 99精品久久久久久久婷婷| 色五月成人婷婷| 天天操天天操| 亚州色色色| 婷婷九九| 亚洲精品又粗又大又爽A片 | 九九九AAA热视频| 91婷婷搞| 啪啪五月天啪啪| 99精品免费欧美小视频 | 色噜久| 热的国产99热| 色婷婷五月天小说| 久综合色| 全部老头和老太XXXXX| 激情五月狠狠喔| 影音先锋一区二区三区| 丁香六月婷婷综合网| 婷婷婷婷婷婷婷五月丁香| 97超碰人人操| 国产毛片精品一区二区色欲黄A片| 六月丁香开心婷婷欧美| 五月丁香啪啪啪| 婷婷丁香基地在线| 激情久久久久久久久久久| 色综合色| 四色五月视频| 夜夜骑日日操| 五月色丁香| 久久婷综合| 久热天堂| 99热欧| 久久99网| 色五月天综合| 五月丁香六月婷婷色日| 国产精产国品一二三在观看| 97超级操操| 婷婷五月免费观看| 99狠狠色| 超91热| 五月婷丁香| 99热免费精品| 精品无码久久久久久久久| 大伊香蕉玖玖爱| 9久热这里只有精品视频| 国产精品成人AV在线| 五月丁香婷婷五月色| 久草天堂| 色五月影视| 丁香网站| 男女99免费视频| 可以免费看的AV网站| 丁香五月色| 97碰碰视频在线观看免费| 丁香婷婷成人在线播放| 九九亚洲| 中文字幕,综合,91| 丁香五月婷婷欧美成人色图| 亚洲中文字幕av| 99日精品视频| 激情五月色综合| 五月天婷婷综合网| 97在线碰| 青青草成人网| 97超级碰| 丁香五月天婷婷久久综合| 色九网| 91chinese 在线| 99热99re6国产在线播放| www.婷婷五月天| 五月天久久婷婷| 婷婷综合视频| 人人操大| 日日操天天| 亚洲国产精品成人午夜| 丁香香五月激情免费视频| 性欧美日本| 五月婷婷综合性爱噜噜| 丁香六月五月婷婷| 91se视频| 开心五月婷婷激情网| 色五月婷婷中文字幕| 久久99久久99精品免视看婷| 蜜桃人妻无码AV天堂三区| 丁香av网| 狠狠五月激情婷婷直播片| 九九在线视频| 精品99这里有| 99久热这里只有精品| 香蕉操亚洲| 我去色色网五雨天| 九九99热久久精品66中文字幕| 婷婷激情五月色综合| 99se丁香| 色操b| 久9久视频精品| 激情亚洲婷婷六月| 9国产在线视频| 亚洲激情视频网| 97色干在线观看| 在线超碰免费| 狠狠操狠狠狠| 深夜婷婷 丁香| 中国AV性爱观看| 嫩草极品| 好激情在线综合网| 国产高清视频91九九九久久久| 成人精品99| 99情色五月天| 丁香五月婷婷日本| 碰碰人人漕| 亚州操操| 成人午夜无码视频| 五月天婷婷成人网| 免费99情趣网视频| 国产毛多水多女人A片| 丁香伊人激情| 综合网精品99| 五月天激情无码| 丁香五月激情综合婷综| 久草性爱| 人妻狠狠操| 被强行糟蹋的女人A片| 伊人婷婷五月| 五月婷av| 狠狠人妻色综合| 国产亚洲色婷婷久久99精品91| 九九热精品在线| 精品无码人妻一区| 色欲AVV| 丁香六月综合| 婷婷综合在线| 99国产精品久久久久久久久久久| 五月丁香六月合| 亚洲无码九九九| 日韩精品999| www.五月天婷婷.com| www.91av.com| 五月丁香影视| 狠狠色丁香久久久婷| 亚洲国产精品二二三三区| 五月婷婷福利| 91色在线| 99热综合| 韩国三级五月天婷婷。| 国内一级精品| 婷婷五月天基地| 91精品久久久久久综合五月天| www.久久爱.c n| 女人天堂AV| 性生活视频98791| 伊人www22综合色| 禁欲电影完整版在线播放| 狠狠色噜噜| 色婷婷综合久久久久| 女人高潮内射99精品| 激情小说婷婷五月| 久99视频| avh片在线观看| 久久99久久99精品免视看婷| 中文无码精品一区二区三区| 丁香五月婷婷亚洲激情四射| 夜夜夜夜夜操| 日日日天天干| 在线五月婷婷小电影| 丁香啪啪中文字幕| 色婷婷丁香五月天| 婷婷五月天BBw| 狠狠干综合| 婷婷六月久久| 亚洲综合九九| 五月婷婷啪啪| 日韩欧美四五区| 182TV大香蕉| 影音先锋91在线资源站| www999日韩精品| 六月丁香婷婷在线波多 | 日本久久色| 婷婷五月av| 天天射色五月天| 国产中文亚洲欧美日韩性交| 日韩成人综合| 成人做爰A片免费看网站找不到了 噼里啪啦在线观看免费完整版视频 | 操人91| 日本五月天一页| 性色欲情 网站| 密臀av无码人妻精品| 国产精品人成A片一区二区| 国产精品爽爽久久久久久| 激情婷婷五月色| 9l视频自拍9l九色成人| 五月丁香综合久久夜夜| 欧美交换配乱吟粗大25P| 五月婷婷色综图片| 五月天婷婷中文字幕在线播放| 99re在线视频精品,这里只有精品18,| 91日综合欧美| 久草婷婷网| 99热官网| PORNY九色9l自拍视频成人| 久热网在线视频| 色人五月婷婷| 91天天操天天干天天射| 在线99精品| 果冻传媒A片一二三区| 狠狠操狠狠爱| 69精品人人人人| 亚洲欧美婷婷五月色综合| 久久久久人妻精选| 激情综合网激情五月网 | 91久操| 另类 在线| 欧美色色网| 亚洲色色色色| 大波美女VA网站| 97亚洲色 torrent magnet| www.色综合.com| ...婷婷五月综合不卡,国产在线手机| AA片在线观看视频在线播放| 99精品热| www.色99| 伊久久婷婷| 五月丁香啪| 99A片| www99热| 婷婷五月花西瓜| 色欲资源网| 激情婷婷六月| 日日夜夜噜噜爽爽| 涩涩五| 亚洲色情一区二区三区四区| 天天插天天插天天日| 99色色爰| 婷婷成人网五月天| 狠狠做五月| 婷婷九月| 思思久久99热| 99思思在线视频| 丁香五月激情宗合网| www.色婷婷| 六月丁香啪啪| 激情婷婷丁香五月天小说| 欧美99热| 激情综合五月婷| 国产 码在线成人网站| 婷婷激情五月综合| 色五月天.con| 日韩一区二区在线播放| 26uuu国产色| 欧美激情五月天在线观看| 婷婷成人在线| 这里只有精品99www| 5月婷婷六月丁香| 日本不卡五月婷婷丁香| 男人的天堂五月丁香| 五月婷在线播放| 夜夜爽天天爽| 日本啪啪天堂| 五月天成人综合| 中文字幕网伦射乱中文| 狠狠CAO日日穞夜夜穞AV| 婷婷五月激情欧美大胆视频| 五月丁香久久激情综合| 天天肏天天肏| 91肏| 这里只有精品日韩| 五月在在观看| 开心五月天激情网站| 人妻久久人妻久久第一区| 久久婷五月综合| 99热九九热| 成人做爰高潮A片免费视频| 99欧美精品99日本精品| 免费超碰在线| 91狠狠色| 五月丁香直播| 六月婷婷久久| 99热大香蕉| 六月天婷婷| 91女人18毛片水多国产| 日韩精品成人在线| eeuss人妻| 日韩激情人伦人| jiZZdr| 五月天婷婷基地| 色一情一乱一伦一区二区三区| 操日本99| 强伦轩人妻一区二区电影| 五月天婷婷六月激情网| 26uuu91| 色色色五月婷| 婷婷五月天av| 婷婷五月丁香性爱| 超碰女人天堂| 人人干Av| 久久92| 国产人妻人伦精品一区二区| 日韩AV成人电影| 五月丁香啪啪网| 五月婷婷视频ab| 日韩黄色电影| 99亚洲精品| www.久久9| 丁香婷婷五月激情综合| 久热网站| 深爱激情六月天| 久久婷婷五月综合网| 高清视频一区| 婷婷香五月| 99热老网站| 狠狠爱五月婷婷综合六月| 97啪啪| 深爱婷婷丁香五月激情| 六月丁香激情网| 3DAV亚洲香蕉久久 一区二区| 久久久久9999| 色五月首页| 伊人在线视频| 蜜臀99久久精品久久久久| 色色是色N一| 色播五月网| 最新高清无码专区| 在线你懂的亚洲欧| 天天夜夜操| 99在线免费视频| 婷婷九月丁香天堂丁香天堂| 日韩五月天婷婷| 色99日韩| 色五月婷婷91在线| WWW.桔色成人.COM入口| 婷婷综合视频| 97操碰在线97| 激情网站综合五月天| 久久婷婷综合网| 狠狠综合久久综合| 深爱网深爱综合网| 激情av| 五月婷婷六月综合| 五月丁香六月情婷婷久久| 九九视频这里只有精品| 久草五月婷| 先锋av性爱成人电影| 狠狠综合网| av在线观看网站| 橾逼网| 99婷五月| 久久99热这里只有精品23| 丁香色色色| 婷婷丁香五月天大香蕉| 婷婷丁香五月,狠狠综合| 狠狠干综合| 久久久久久综合88| 亚洲综合色网| 亚洲视频另类| 欧美va亚洲va在线播放| 狠狠色色| 色婷婷WWW| 99日本黄站| 五月天婷综合| 草综合14| 啪啪操网| 五月婷婷丁香在线视频| 99re6在线视频精品免费| 婷婷激情小说网| 色欲婷婷五月天| 亚洲精品视频电影| 99热综合网| 69精品无码一区二区三区| 操一操| 99综合五月免费视频色婷婷| 五月婷丁香在线视频在线| 免费黄色片子| 色八月婷婷| 深爱开心激情| 国产亚洲在线观看| 色五月激情综合网| 99精品热视频| 中文字幕AV在线播放| 丁香婷婷91在线观看视频| 五月丁香婷婷综合| www.99热这里精品| 色婷婷久久综合久色综| 东京热人妻一区二区三区在线| 亚洲情a| 欧在线一区| 日韩在线五月天婷婷| 啪啪五月婷婷| 激情婷婷五月综合| 骚逼视频一区2区| 成人性爱精品视频| 久久九九99视频| 99r这里| 色婷婷色丁香色欲av| 就爱射中文字幕资源网| 亚洲AV日韩在线观看| 五月丁香六月婷婷在线播放| WWW嗯嗯啊啊啊啊| 丁香五月亚洲天堂| 婷婷综合伊人| 色色A| 97婷婷丁香| 久99久视频| 九九热在线亚洲免费视频| www.夜夜| 这里只有国产精品在线| 就爱日五月天| 思思精品视频| 猫咪伊人久久| 亚洲色在线观看| 五月天色婷好好| 国产精品日本一区二区在线播放| 99.色| 精品导航在线x不卡| 五月天婷婷激情| 久操大香蕉| av国产精品| 国产精品婷婷午夜在线观看| 久久99免费视屏| 色哟哟www| 天天射夜夜爽| 日韩AV免费电影在线播放| 这里只有免费精品| 色婷婷88| 日本色婷婷| 天天夜夜六月丁香五月婷婷老师| 人人干人人操外国| 日韩无码专区| 97涩涩丁香五月天| 97人人操人人操人人操人人| 激情久久肏屄视频| 99视频久久免费视频| 日韩中出视频| 丁香色综合| 色婷婷丁香五月高清在线| 久久天堂女人| 色综合激情| 玖玖精品资源| 婷婷欧美激情| 97色色网| 五月丁香啪啪伦理电影| av网址在线| 在线成人va| 五月婷婷成人| 99热国内| 狠狠综合区| 五月天桃色深爱网| 激情五月四色| 婷婷天堂站| 大香蕉福利导航| 亚洲区视频| 99精品无码网站| 久热 91| 五月天激情美女久久| 久久婷婷五月综合激情国产 | 国产成人亚洲综合亚洲| 激情伊人五月天| dingxiangtingtingliuyue| 丁香六月婷婷综合| 色99xx| 久久婷婷亚洲|