久久亚洲成a人片熟女精品色一区二区三区|国产精品视频第一精品视频|av天堂热无码手机版|亚洲?v无码久久无遮挡|国产精品偷伦视频免费观看国产|麻豆国产自产精品丰满熟妇|av无码av不卡一区二区|久久亚洲精品中文字

ARTICLE DETAIL

資訊詳情

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

Linux中斷子系統(tǒng)與設(shè)備樹(shù)映射:驅(qū)動(dòng)移植必知的中斷排查指南

Linux中斷子系統(tǒng)與設(shè)備樹(shù)映射:驅(qū)動(dòng)移植必知的中斷排查指南 1. 移植驅(qū)動(dòng)前先搞清楚中斷子系統(tǒng)到底在幫你做什么做驅(qū)動(dòng)移植最怕拿到一份源碼就開(kāi)干改改寄存器地址、換換時(shí)鐘頻率結(jié)果中斷死活不觸發(fā)或者一觸發(fā)就死機(jī)。我見(jiàn)過(guò)太多人卡在中斷上本質(zhì)問(wèn)題不是代碼寫錯(cuò)了而是對(duì)整個(gè)中斷子系統(tǒng)缺少一張地圖——不知道中斷從硬件引腳到CPU執(zhí)行回調(diào)函數(shù)中間到底經(jīng)過(guò)了哪些環(huán)節(jié)、每一層由誰(shuí)負(fù)責(zé)、移植時(shí)哪些東西必須跟著SoC變化、哪些東西是內(nèi)核幫你擋掉的。先說(shuō)個(gè)場(chǎng)景。你在A平臺(tái)的開(kāi)發(fā)板上跑得好好的驅(qū)動(dòng)換到B平臺(tái)系統(tǒng)起來(lái)后cat /proc/interrupts看不到你的中斷號(hào)或者能看到號(hào)但計(jì)數(shù)永遠(yuǎn)不漲又或者中斷風(fēng)暴直接把CPU打滿。這時(shí)候如果你腦子里沒(méi)有中斷子系統(tǒng)的整體框架排查起來(lái)就是瞎貓碰死耗子一會(huì)懷疑設(shè)備樹(shù)寫錯(cuò)了一會(huì)懷疑寄存器配置不對(duì)一會(huì)又懷疑是內(nèi)核版本差異。而實(shí)際上問(wèn)題可能只是中斷控制器Interrupt Controller的映射關(guān)系沒(méi)對(duì)上或者中斷類型電平觸發(fā)、邊沿觸發(fā)在硬件上根本配不出來(lái)。所以這篇我打算把Linux中斷子系統(tǒng)的整體框架掰開(kāi)揉碎講一遍并且站在“驅(qū)動(dòng)移植”的視角——重點(diǎn)不是你從頭寫一個(gè)中斷子系統(tǒng)而是當(dāng)你把驅(qū)動(dòng)從一個(gè)平臺(tái)搬到另一個(gè)平臺(tái)時(shí)哪些環(huán)節(jié)最容易出問(wèn)題、為什么出問(wèn)題、該怎么定位??蚣芨忝靼琢艘浦策^(guò)程中的九成中斷問(wèn)題你都能自己判斷個(gè)大概。先給一張總覽圖后面逐個(gè)環(huán)節(jié)拆硬件中斷源外設(shè)→ 中斷控制器GIC等→ CPU的IRQ引腳內(nèi)核側(cè)irq domain負(fù)責(zé)把硬件中斷號(hào)翻譯成Linux內(nèi)部中斷號(hào)virqirq_desc每個(gè)virq對(duì)應(yīng)一個(gè)描述符存放回調(diào)函數(shù)、標(biāo)志位、線程化信息中斷流控層handle_irq系列處理不同觸發(fā)類型的中斷流驅(qū)動(dòng)回調(diào)request_irq/devm_request_irq注冊(cè)的handler最終被執(zhí)行通俗點(diǎn)說(shuō)中斷子系統(tǒng)就是一套“硬件中斷事件 → 內(nèi)核事件分發(fā) → 驅(qū)動(dòng)處理函數(shù)”的管道系統(tǒng)。移植驅(qū)動(dòng)的過(guò)程就是讓這套管道在你新的硬件平臺(tái)上重新暢通。2. 硬件中斷號(hào)怎么變成Linux的irq號(hào)從GIC到virq的映射邏輯2.1 GIC是絕大多數(shù)SoC中斷的起點(diǎn)無(wú)論是高通、海思、瑞芯微還是全志主流ARM SoC的中斷控制器基本都走ARM GICGeneric Interrupt Controller架構(gòu)。GIC的版本從GIC-400、GIC-500到GIC-600系列差異主要在支持的CPU核數(shù)、中斷數(shù)、親和性配置上但基本概念一致。GIC把中斷分為三類SGISoftware Generated Interrupt軟件觸發(fā)的中斷用于核間通信0~15號(hào)。PPIPrivate Peripheral Interrupt私有外設(shè)中斷每個(gè)CPU核獨(dú)享比如每個(gè)核的local timer16~31號(hào)。SPIShared Peripheral Interrupt共享外設(shè)中斷所有核都能收到32號(hào)往上一般到幾百號(hào)。在設(shè)備樹(shù)里你經(jīng)??吹筋愃七@樣的節(jié)點(diǎn)uart0: serialff580000 { compatible rockchip,rk3399-uart; reg 0x0 0xff580000 0x0 0x100; interrupts GIC_SPI 115 IRQ_TYPE_LEVEL_HIGH; };這里的GIC_SPI 115就是指SPI中斷硬件中斷號(hào)是115。注意這個(gè)115是GIC視角的硬件編號(hào)不是Linux內(nèi)部使用的irq號(hào)。從GIC的115到Linux的irq號(hào)中間隔著一個(gè)關(guān)鍵的數(shù)據(jù)結(jié)構(gòu)——irq domain。2.2 irq domain就是一張翻譯表在老版本內(nèi)核里硬件中斷號(hào)和Linux irq號(hào)經(jīng)常是線性對(duì)應(yīng)的irq 32 hw_irq之類的簡(jiǎn)單公式就能算出來(lái)。但后來(lái)中斷控制器層級(jí)變多、需要?jiǎng)討B(tài)分配內(nèi)核引入了irq domain機(jī)制。每一個(gè)中斷控制器注冊(cè)一個(gè)irq_domain通過(guò)irq_domain_ops里的map和translate回調(diào)實(shí)現(xiàn)硬件中斷號(hào)到virq的轉(zhuǎn)換。驅(qū)動(dòng)移植中最常見(jiàn)的一個(gè)問(wèn)題就是你板子上的外設(shè)中斷在設(shè)備樹(shù)里寫的硬件號(hào)是GIC視角的號(hào)而內(nèi)核跑起來(lái)之后你cat /proc/interrupts看到的號(hào)是virq。這兩者往往不一致。比如某外設(shè)硬件中斷號(hào)是211在/proc/interrupts里卻顯示為86這都是正常的由irq domain和分配順序決定。以經(jīng)典GIC驅(qū)動(dòng)為例注冊(cè)的irq_domain大概是這個(gè)流程gic_init_bases(...) - irq_domain_add_linear(gic-base, gic-irq_nr, gic_irq_domain_ops, gic)irq_domain_add_linear創(chuàng)建線性映射域gic_irq_domain_ops里核心是兩個(gè)回調(diào)gic_irq_domain_map把GIC硬件中斷號(hào)映射成irq_desc并設(shè)置irq_chipgic_irq_domain_translate解析設(shè)備樹(shù)interrupts屬性里的GIC_SPI 115 IRQ_TYPE_LEVEL_HIGH三元組移植驅(qū)動(dòng)時(shí)你要清楚一件事設(shè)備樹(shù)里你寫的中斷號(hào)是給GIC翻譯用的翻譯完之后的virq才是驅(qū)動(dòng)里真正注冊(cè)使用的號(hào)。你在驅(qū)動(dòng)代碼里寫irq platform_get_irq(pdev, 0)拿到的是這個(gè)virq。2.3 移植中最常見(jiàn)的三類映射錯(cuò)誤第一類設(shè)備樹(shù)中斷號(hào)寫錯(cuò)。比如芯片手冊(cè)里說(shuō)某個(gè)外設(shè)中斷是SPI 118結(jié)果你寫成118后驅(qū)動(dòng)始終不觸發(fā)查手冊(cè)發(fā)現(xiàn)在另一個(gè)中斷控制器域下或者實(shí)際要減去偏移。尤其當(dāng)SoC內(nèi)部有多個(gè)中斷控制器級(jí)聯(lián)時(shí)設(shè)備樹(shù)里寫的號(hào)必須參照該控制器域的定義。第二類interrupt-parent指錯(cuò)。多控制器SoC上外設(shè)節(jié)點(diǎn)要用interrupt-parent指定掛在哪個(gè)中斷控制器下。如果漏寫或者指到錯(cuò)誤的父節(jié)點(diǎn)內(nèi)核會(huì)用默認(rèn)域的翻譯方式去解析出來(lái)的號(hào)可能對(duì)不上硬件實(shí)際接的那條線。第三類觸發(fā)類型不匹配。設(shè)備樹(shù)里寫IRQ_TYPE_LEVEL_HIGH但硬件外設(shè)的實(shí)際中斷輸出是低電平有效、需要IRQ_TYPE_LEVEL_LOW。這種問(wèn)題在/proc/interrupts里能看到中斷號(hào)但計(jì)數(shù)不漲因?yàn)殡娖揭恢睕](méi)被拉低中斷控制器采樣不到有效信號(hào)。3. 驅(qū)動(dòng)側(cè)的中斷注冊(cè)流程從request_irq到回調(diào)執(zhí)行的完整鏈路3.1 platform_get_irq與request_irq之間的微妙關(guān)系寫驅(qū)動(dòng)時(shí)標(biāo)準(zhǔn)流程一般是static int foo_probe(struct platform_device *pdev) { int irq; irq platform_get_irq(pdev, 0); if (irq 0) return irq; ret devm_request_threaded_irq(pdev-dev, irq, foo_irq_handler, foo_irq_thread_fn, IRQF_TRIGGER_HIGH, foo, dev); return ret; }很多人不清楚platform_get_irq到底做了什么。函數(shù)內(nèi)部經(jīng)歷大致是解析設(shè)備樹(shù)節(jié)點(diǎn) → 走of_irq_get→ 找到interrupt-parent對(duì)應(yīng)的irq domain→ 調(diào)用irq_create_of_mapping把硬件中斷號(hào)翻譯成virq→ 返回。注意platform_get_irq拿到virq后中斷還沒(méi)有真正被請(qǐng)求。驅(qū)動(dòng)此時(shí)只是拿到了一個(gè)“令牌”真正把我們的處理函數(shù)掛到中斷管道上是后續(xù)的request_irq或devm_request_irq完成的。移植時(shí)經(jīng)常遇到的情況probe里platform_get_irq返回-ENXIO也就是拿不到中斷號(hào)。排查思路按順序來(lái)設(shè)備樹(shù)節(jié)點(diǎn)是否存在interrupts屬性。設(shè)備樹(shù)節(jié)點(diǎn)是否設(shè)置了正確的interrupt-parent。對(duì)應(yīng)中斷控制器的驅(qū)動(dòng)是否已經(jīng)初始化完成probe順序問(wèn)題經(jīng)常被人忽略。of_irq_get解析時(shí)是否因?yàn)橛|發(fā)類型字段非法而失敗。3.2 top half和bottom half為什么你的回調(diào)不能干重活Linux中斷處理函數(shù)跑在中斷上下文它有幾個(gè)硬性約束不能睡眠、不能調(diào)用可能睡眠的APImutex_lock、kmalloc帶GFP_KERNEL都不行、不能做太耗時(shí)的操作。因?yàn)橹袛嗌舷挛睦顲PU不參與調(diào)度你在里面轉(zhuǎn)5毫秒整個(gè)系統(tǒng)就卡5毫秒。于是有了bottom half機(jī)制。傳統(tǒng)做法是tasklet現(xiàn)在更推薦用threaded irq也就是上面代碼里的devm_request_threaded_irq。這種模式下中斷觸發(fā)時(shí)先跑handler如果handler返回IRQ_WAKE_THREAD內(nèi)核會(huì)喚醒一個(gè)內(nèi)核線程去執(zhí)行thread_fn而thread_fn運(yùn)行在普通進(jìn)程上下文可以睡眠、可以加鎖、可以調(diào)用各種胖接口。移植驅(qū)動(dòng)的經(jīng)驗(yàn)之談如果外設(shè)中斷處理里要操作i2c或者spi總線讀取狀態(tài)寄存器就強(qiáng)烈建議用threaded irq。因?yàn)閕2c控制器本身也是中斷驅(qū)動(dòng)的中斷上下文里再去等它的中斷完成很容易死鎖而在線程化上下文里i2c傳輸可以正常睡眠等待。3.3 中斷標(biāo)志位IRQF_TRIGGER_*與設(shè)備樹(shù)觸發(fā)類型是一致的嗎request_irq里第四個(gè)參數(shù)IRQF_TRIGGER_HIGH/LOW/RISING/FALLING指定觸發(fā)類型。在設(shè)備樹(shù)已經(jīng)寫了觸發(fā)類型的前提下驅(qū)動(dòng)里再指定一次兩者到底聽(tīng)誰(shuí)的這里有坑。GIC這類現(xiàn)代中斷控制器設(shè)備樹(shù)里的觸發(fā)類型最終會(huì)下發(fā)到硬件層GIC配置對(duì)應(yīng)中斷的觸發(fā)方式和優(yōu)先級(jí)。驅(qū)動(dòng)里request_irq的IRQF_TRIGGER_*是Linux中斷子系統(tǒng)的軟件標(biāo)志但如果底層irq_chip已經(jīng)根據(jù)設(shè)備樹(shù)完成了硬件配置驅(qū)動(dòng)里的標(biāo)志可能被忽略或覆蓋不同內(nèi)核版本行為不一樣。我的建議設(shè)備樹(shù)里明確寫觸發(fā)類型驅(qū)動(dòng)里request_irq直接傳0或IRQF_TRIGGER_NONE不要讓兩個(gè)地方出現(xiàn)沖突。尤其移植時(shí)原始平臺(tái)設(shè)備樹(shù)寫的是IRQ_TYPE_EDGE_RISING新平臺(tái)換成IRQ_TYPE_LEVEL_HIGH而驅(qū)動(dòng)代碼里還保留老標(biāo)志這就會(huì)埋雷。4. 中斷控制器驅(qū)動(dòng)與irq_chip移植時(shí)真正要?jiǎng)拥兜牡胤?.1 irq_chip是中斷控制器在內(nèi)核里的抽象irq_chip封裝了中斷控制器的硬件操作包括irq_mask/irq_unmask屏蔽/使能某個(gè)中斷源irq_ack中斷應(yīng)答irq_set_type設(shè)置觸發(fā)類型irq_set_wake使能喚醒irq_set_affinity設(shè)置CPU親和性每個(gè)irq_desc里掛著一個(gè)irq_chip指針驅(qū)動(dòng)調(diào)用enable_irq、disable_irq、irq_set_irq_type時(shí)最終都會(huì)落到對(duì)應(yīng)irq_chip的回調(diào)上。在GIC驅(qū)動(dòng)的實(shí)現(xiàn)里gic_handle_irq是最核心的函數(shù)它做的事是讀GICC_IAR寄存器拿到硬件中斷號(hào) → 如果小于16SGI做核間處理如果是PPI/SPI調(diào)用generic_handle_irq分發(fā)到對(duì)應(yīng)virq的處理流程。移植驅(qū)動(dòng)到新平臺(tái)時(shí)如果新平臺(tái)的中斷控制器不是標(biāo)準(zhǔn)GIC比如有些國(guó)產(chǎn)SoC用了私有中斷控制器或者經(jīng)過(guò)了一層自定義的級(jí)聯(lián)封裝你就需要看這個(gè)芯片廠商是否提供了對(duì)應(yīng)的irq_chip實(shí)現(xiàn)。如果廠商沒(méi)提供驅(qū)動(dòng)里任何中斷都無(wú)法正常工作因?yàn)閕rq_set_type、irq_mask這些操作都沒(méi)有落點(diǎn)。4.2 irq domain層級(jí)級(jí)聯(lián)時(shí)怎么排查有些SoC內(nèi)部不止一個(gè)中斷控制器。典型例子主GIC外掛一個(gè)GPIO控制器而GPIO控制器本身又作為中斷控制器把多路GPIO中斷匯聚成一路SPI中斷送往GIC。這種層級(jí)關(guān)系在設(shè)備樹(shù)里表現(xiàn)為gpio2: gpioff790000 { compatible rockchip,gpio-bank; reg 0x0 0xff790000 0x0 0x100; interrupt-controller; #interrupt-cells 2; interrupts GIC_SPI 116 IRQ_TYPE_LEVEL_HIGH; };此時(shí)一個(gè)外設(shè)掛了gpio2的第5號(hào)引腳作為中斷源foo_device { interrupt-parent gpio2; interrupts 5 IRQ_TYPE_EDGE_RISING; };of_irq_get解析時(shí)就會(huì)先走到gpio2的irq domain把5翻譯成gpio2域的virq與此同時(shí)gpio2本身作為中斷源又掛在GIC的116號(hào)上形成一個(gè)鏈外設(shè)中斷 → GPIO控制器 → GIC → CPU。移植時(shí)這種層級(jí)最容易出問(wèn)題。常見(jiàn)的坑interrupt-controller和#interrupt-cells屬性遺漏導(dǎo)致外設(shè)節(jié)點(diǎn)無(wú)法解析。GPIO控制器里某個(gè)引腳的中斷和別的外設(shè)沖突/proc/interrupts里能看到gpio底下所有中斷事件歸屬同一個(gè)virq計(jì)數(shù)。層次多了之后觸發(fā)類型可能被某一層的irq_chip改變。比如外設(shè)和GPIO控制器申請(qǐng)的是邊沿觸發(fā)但GPIO控制器匯入GIC時(shí)如果只支持電平觸發(fā)內(nèi)核會(huì)自動(dòng)做一次轉(zhuǎn)換嗎不會(huì)。所以你必須保證每層中斷控制器的觸發(fā)類型配置都合理否則邊緣觸發(fā)的外設(shè)在GIC層采樣不到。排查這種層級(jí)問(wèn)題時(shí)我一般會(huì)在設(shè)備樹(shù)里臨時(shí)加interrupts-extended來(lái)跳過(guò)中間層直接指定上層控制器快速確認(rèn)問(wèn)題是出在中間層還是最終層。4.3 percpu中斷和共享中斷在移植中的區(qū)別處理中斷還有一種分類方式是否per-CPU的以及是否可共享。PPI中斷比如每核的local timer就是per-CPU的。設(shè)備樹(shù)里你會(huì)看到類似arch_timer { interrupts GIC_PPI 13 (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_LOW); };注意這里中斷號(hào)是GIC_PPI 13而且多了一個(gè)GIC_CPU_MASK_SIMPLE(4)來(lái)指定中斷發(fā)給哪些CPU核。移植這種設(shè)備時(shí)如果有人把PPI當(dāng)成SPI去注冊(cè)或者request_percpu_irq和request_irq用混了就亂了。PPI必須用request_percpu_irq配合enable_percpu_irq處理函數(shù)里訪問(wèn)per-CPU變量也有一套固定寫法。而共享中斷IRQF_SHARED是多個(gè)設(shè)備共用一個(gè)中斷號(hào)。這類中斷在request_irq時(shí)必須傳入設(shè)備ID指針內(nèi)核觸發(fā)時(shí)會(huì)逐個(gè)調(diào)用注冊(cè)在同一virq上的handler直到某個(gè)handler返回IRQ_HANDLED。移植時(shí)如果驅(qū)動(dòng)里沒(méi)用IRQF_SHARED卻在設(shè)備樹(shù)里和別的設(shè)備共用了中斷號(hào)request_irq會(huì)直接失敗返回-EBUSY。5. 從硬件觸發(fā)到回調(diào)執(zhí)行的瞬間中斷流控層與desc處理流程5.1 handle_irq系列函數(shù)到底做了什么中斷流控層是不少人忽略的環(huán)節(jié)。在generic_handle_irq被調(diào)用后內(nèi)核會(huì)根據(jù)中斷的觸發(fā)類型和是否喚醒等屬性調(diào)用不同的流控函數(shù)。最??吹降挠衕andle_level_irq電平觸發(fā)中斷走這個(gè)handle_edge_irq邊沿觸發(fā)中斷走這個(gè)handle_fasteoi_irqGIC這種支持EOIEnd of Interrupt的控制器走這個(gè)handle_simple_irq某些不做硬件屏蔽的控制器用這些函數(shù)的職責(zé)是管理中斷的屏蔽/使能狀態(tài)、處理中斷嵌套和pending狀態(tài)、調(diào)用irq_desc里注冊(cè)的action鏈也就是驅(qū)動(dòng)注冊(cè)的handler。移植時(shí)你不需要改這些流控函數(shù)但你必須理解它們的差異。最常見(jiàn)的現(xiàn)象電平觸發(fā)的中斷如果handler里沒(méi)做irq_ack或者中斷源沒(méi)有被真正清掉handle_level_irq會(huì)在handler返回后立刻再次觸發(fā)導(dǎo)致中斷風(fēng)暴。邊沿觸發(fā)的中斷則容易丟中斷如果中斷觸發(fā)時(shí)irq_desc正被屏蔽邊沿信號(hào)不會(huì)像電平信號(hào)那樣被鎖存恢復(fù)使能后可能就丟了。5.2 實(shí)測(cè)中最容易翻車的場(chǎng)景中斷風(fēng)暴與丟失中斷我實(shí)際移植一個(gè)網(wǎng)卡驅(qū)動(dòng)時(shí)遇到過(guò)這么一件事設(shè)備樹(shù)里寫的中斷觸發(fā)類型是IRQ_TYPE_LEVEL_HIGH但實(shí)際上網(wǎng)卡芯片的中斷輸出引腳在空閑時(shí)本來(lái)就是高電平只有產(chǎn)生中斷時(shí)才短暫拉低。結(jié)果驅(qū)動(dòng)一旦enable_irqGIC采樣到高電平就一直認(rèn)為有中斷中斷風(fēng)暴瞬間打滿CPU。當(dāng)時(shí)的排查過(guò)程很有代表性/proc/interrupts里該中斷的計(jì)數(shù)在瘋狂暴漲CPU0的si時(shí)間百分比飆到90%以上但驅(qū)動(dòng)里的handler卻進(jìn)得很少——因?yàn)轱L(fēng)暴中斷全被流控層攔截處理了。后來(lái)把設(shè)備樹(shù)里的觸發(fā)類型改成IRQ_TYPE_LEVEL_LOW一次問(wèn)題就沒(méi)了。另一個(gè)方向是丟中斷。用邊沿觸發(fā)時(shí)外設(shè)產(chǎn)生中斷的脈沖非常窄如果在GIC采樣到之前信號(hào)就消失了這個(gè)中斷就丟了。這類問(wèn)題在低速總線的外設(shè)上尤其明顯——外設(shè)快、主機(jī)慢兩個(gè)時(shí)鐘域之間的脈沖寬度不足。排查手段是在驅(qū)動(dòng)里做一次“虛假中斷檢測(cè)”handler里讀外設(shè)中斷狀態(tài)寄存器如果發(fā)現(xiàn)沒(méi)有對(duì)應(yīng)中斷標(biāo)志就返回IRQ_NONE讓內(nèi)核把該virq標(biāo)記為可疑中斷/proc/interrupts旁邊會(huì)出現(xiàn)[NMI]之類的錯(cuò)誤提示。5.3 irq_desc里的action鏈表多個(gè)handler怎么排隊(duì)一個(gè)virq可以掛多個(gè)action這正是共享中斷的實(shí)現(xiàn)基礎(chǔ)。request_irq時(shí)傳入的dev_id就是用來(lái)區(qū)分不同action的。當(dāng)handle_*_irq運(yùn)行時(shí)會(huì)遍歷irq_desc的action鏈表逐個(gè)調(diào)用handler直到有一個(gè)返回IRQ_HANDLED。這里有個(gè)性能考慮共享中斷鏈越長(zhǎng)每個(gè)中斷觸發(fā)需要遍歷的handler就越多。所以移植時(shí)如果發(fā)現(xiàn)某個(gè)中斷號(hào)和多個(gè)設(shè)備共享性能敏感的場(chǎng)景下最好在硬件層面錯(cuò)開(kāi)中斷源或者確認(rèn)每個(gè)handler開(kāi)頭都能快速判斷“這個(gè)中斷是不是我的”。6. 設(shè)備樹(shù)里中斷相關(guān)的關(guān)鍵屬性移植時(shí)逐項(xiàng)核對(duì)清單6.1 interrupt-parent、interrupts、interrupt-names的配合設(shè)備樹(shù)中斷屬性三板斧是interrupt-parent指定中斷控制器父節(jié)點(diǎn)告訴內(nèi)核該設(shè)備的某個(gè)引腳接到哪個(gè)中斷控制器的哪個(gè)輸入上。interrupts一般是中斷類型 中斷號(hào) 觸發(fā)類型或中斷號(hào) 觸發(fā)類型取決于父控制器的#interrupt-cells。interrupt-names給每個(gè)中斷起個(gè)名字配合platform_get_irq_byname使用。多中斷設(shè)備很常見(jiàn)比如一個(gè)觸摸屏控制器有觸摸中斷和喚醒中斷兩個(gè)引腳touch38 { interrupt-parent gpio1; interrupts 5 IRQ_TYPE_EDGE_FALLING, 6 IRQ_TYPE_EDGE_FALLING; interrupt-names touch, wakeup; };驅(qū)動(dòng)里用platform_get_irq_byname(pdev, touch)去拿對(duì)應(yīng)中斷號(hào)。移植時(shí)改名會(huì)導(dǎo)致platform_get_irq_byname返回-EINVAL而很多人排查時(shí)老是檢查interrupts卻忘了interrupt-names對(duì)應(yīng)不上。6.2 中斷控制器節(jié)點(diǎn)的關(guān)鍵屬性中斷控制器節(jié)點(diǎn)自身也有幾個(gè)屬性決定它如何被內(nèi)核識(shí)別interrupt-controller空屬性聲明該節(jié)點(diǎn)是一個(gè)中斷控制器。#interrupt-cells聲明子節(jié)點(diǎn)里interrupts需要幾個(gè)單元格來(lái)描述。GIC是3個(gè)類型、號(hào)、觸發(fā)方式GPIO控制器是2個(gè)引腳號(hào)、觸發(fā)方式。interrupts聲明這個(gè)中斷控制器本身接到上級(jí)控制器的哪個(gè)中斷上級(jí)聯(lián)時(shí)才有。interrupt-parent指向更上一級(jí)的控制器。移植新板子時(shí)如果外設(shè)中斷完全不可用我一般會(huì)先檢查控制器節(jié)點(diǎn)這4個(gè)屬性是否齊全。這里有個(gè)隱蔽的問(wèn)題部分SoC的設(shè)備樹(shù)里GPIO節(jié)點(diǎn)的interrupt-controller屬性會(huì)被注釋掉或者缺失因?yàn)镚PIO IP在芯片內(nèi)部不是傳統(tǒng)意義上的“中斷控制器”但驅(qū)動(dòng)里如果某個(gè)外設(shè)把它當(dāng)父控制器用解析就失敗。6.3 中斷映射失敗時(shí)內(nèi)核日志怎么看設(shè)備樹(shù)解析中斷失敗時(shí)串口日志里一般能看到類似could not get irq或failed to get interrupt resource的信息。但更早的解析錯(cuò)誤提示很模糊。定位手段一個(gè)是打開(kāi)動(dòng)態(tài)調(diào)試echo 1 /sys/kernel/debug/tracing/tracing_on echo irq:* /sys/kernel/debug/tracing/set_event另一個(gè)更直接的辦法是查/sys/kernel/debug/irq/irqs/下的每個(gè)irq_desc信息確認(rèn)設(shè)備樹(shù)映射后virq對(duì)應(yīng)的irq_chip是不是你預(yù)期的那顆控制器cat /sys/kernel/debug/irq/irqs/86如果irq_chip顯示的是gic而設(shè)備樹(shù)里你接的是gpio2的域說(shuō)明級(jí)聯(lián)映射沒(méi)有生效問(wèn)題基本出在interrupt-parent。7. 中斷號(hào)查詢與映射調(diào)試把/proc/interrupts讀成診斷書7.1 /proc/interrupts每一列怎么讀驅(qū)動(dòng)移植調(diào)中斷/proc/interrupts是第一現(xiàn)場(chǎng)。它的基本格式CPU0 CPU1 16: 1234 0 GICv3 49 Level arch_timer 86: 56789 321 gpio 20 Edge fdd40000.ethernet第一列是virq號(hào)后面每列是一個(gè)CPU核上該中斷觸發(fā)的次數(shù)然后是中斷控制器名稱和硬件內(nèi)部分組接著是硬件中斷號(hào)、觸發(fā)類型最后是request_irq時(shí)注冊(cè)的設(shè)備名。判斷標(biāo)準(zhǔn)計(jì)數(shù)一直為0中斷根本沒(méi)到控制器或沒(méi)被使能。計(jì)數(shù)暴漲觸發(fā)類型或清中斷邏輯有問(wèn)題。多個(gè)中斷源的計(jì)數(shù)都?xì)w到一個(gè)virq下共享中斷需要靠寄存器判斷是哪路外設(shè)。計(jì)數(shù)在兩個(gè)CPU核間來(lái)回跳動(dòng)說(shuō)明中斷被設(shè)置了親和性或GIC做了負(fù)載均衡正?,F(xiàn)象。7.2 驅(qū)動(dòng)注冊(cè)成功但中斷不觸發(fā)時(shí)的排查順序如果/proc/interrupts里能看到你的virq、設(shè)備名也對(duì)但計(jì)數(shù)一直0我一般按這個(gè)順序排查確認(rèn)外設(shè)確實(shí)產(chǎn)生了中斷信號(hào)。用示波器或者直接在驅(qū)動(dòng)里臨時(shí)寫一個(gè)測(cè)試IO觸發(fā)外設(shè)發(fā)送中斷后再讀外設(shè)的中斷狀態(tài)寄存器確認(rèn)硬件層面中斷標(biāo)志有沒(méi)有置起來(lái)。檢查中斷控制器的屏蔽狀態(tài)。/sys/kernel/debug/irq/irqs/86里能看到irq_data的state確認(rèn)IRQ_MASKED標(biāo)志是否置位。檢查觸發(fā)類型。/proc/interrupts里顯示的觸發(fā)類型是否和硬件實(shí)際信號(hào)匹配。檢查時(shí)鐘。沒(méi)有外設(shè)時(shí)鐘外設(shè)根本不會(huì)工作更不會(huì)產(chǎn)生中斷。這個(gè)聽(tīng)著很傻但確實(shí)在移植中踩過(guò)好多次。我的一個(gè)具體案例某傳感器中斷一直不觸發(fā)排查到最后發(fā)現(xiàn)設(shè)備樹(shù)里給它配的時(shí)鐘源沒(méi)有通過(guò)clk_prepare_enable打開(kāi)傳感器壓根沒(méi)跑起來(lái)自然不會(huì)有中斷。7.3 線程化中斷在/proc/interrupts里的表現(xiàn)線程化中斷在/proc/interrupts里會(huì)看到一個(gè)配套的內(nèi)核線程名字一般是irq/86-fdd40000.ethernet之類的。中斷觸發(fā)時(shí)handler只做快速處理真正的業(yè)務(wù)邏輯在irq/86-xxx線程里執(zhí)行。調(diào)這類問(wèn)題時(shí)除了看/proc/interrupts的計(jì)數(shù)變化還要看線程的調(diào)度狀態(tài)ps -eo pid,comm,state | grep irq/如果線程處于D狀態(tài)不可中斷睡眠長(zhǎng)期不返回多半是thread_fn里阻塞在了某個(gè)等待隊(duì)列或鎖上。這在移植時(shí)很常見(jiàn)因?yàn)樵计脚_(tái)的外設(shè)寄存器延遲和時(shí)序和新平臺(tái)不同原本毫秒級(jí)的等待變成幾十毫秒或者直接超時(shí)了。8. 移植后的中斷驗(yàn)證與踩坑復(fù)盤8.1 冒煙測(cè)試中斷鏈路的壓測(cè)腳本思路移植完之后我一般會(huì)做一個(gè)簡(jiǎn)單的冒煙驗(yàn)證不是只觸發(fā)一次中斷看看handler進(jìn)沒(méi)進(jìn)而是壓一輪高頻中斷# 模擬高頻中斷事件例如用perf觸發(fā)大量定時(shí)器中斷或者IRQ stress-ng --timer 32 --timeout 30 cat /proc/interrupts觀察幾個(gè)點(diǎn)中斷計(jì)數(shù)和中斷源觸發(fā)次數(shù)是否線性匹配允許少量合理丟失但不能差一個(gè)數(shù)量級(jí)。CPU的si軟中斷和hi硬中斷占比是否正常正常情況下不應(yīng)持續(xù)高位。驅(qū)動(dòng)handler是否出現(xiàn)超時(shí)報(bào)錯(cuò)內(nèi)核日志里有沒(méi)有IRQ handler type mismatch或nobody cared這類字樣。cat /proc/interrupts時(shí)如果發(fā)現(xiàn)某中斷觸發(fā)了可觀的次數(shù)但handler沒(méi)有任何反應(yīng)優(yōu)先懷疑IRQF_TRIGGER_*配置。如果使用threaded irq建議也在壓測(cè)期間觀察ps里對(duì)應(yīng)的irq/xxx線程的CPU占用率正常情況下它應(yīng)該能跟上中斷頻率。如果線程CPU占滿而實(shí)際業(yè)務(wù)沒(méi)完成說(shuō)明thread_fn里存在忙等或者頻繁輪詢的問(wèn)題移植時(shí)尤其要注意。8.2 兩種移植場(chǎng)景的處理差異原樣替換和跨內(nèi)核版本移植中斷相關(guān)代碼時(shí)有兩種典型場(chǎng)景一是原廠BSP提供了完整的內(nèi)核和驅(qū)動(dòng)你只是把某個(gè)外設(shè)驅(qū)動(dòng)移到自己的板卡上。這種情況基礎(chǔ)設(shè)施多半是好的重點(diǎn)檢查設(shè)備樹(shù)、時(shí)鐘、IO復(fù)用和中斷引腳。中斷相關(guān)代碼需要?jiǎng)拥目赡苄圆淮蟪荢oC中斷控制器本身變了。二是跨內(nèi)核版本移植比如把4.19的驅(qū)動(dòng)往6.1內(nèi)核上搬。這時(shí)中斷子系統(tǒng)API變化比較明顯最典型的是of_irq_get和platform_get_irq的返回值語(yǔ)義在老內(nèi)核里可能是0表示成功新內(nèi)核里0表示無(wú)效且失敗返回值是負(fù)數(shù)。如果你用老驅(qū)動(dòng)的判斷邏輯在新內(nèi)核上會(huì)誤判。devm_request_threaded_irq的引入時(shí)間、request_percpu_irq的語(yǔ)義變化。老內(nèi)核里handle_irq的入口行為和新內(nèi)核不同部分自定義irq_chip在舊平臺(tái)還能工作新平臺(tái)因?yàn)槿鄙賗rq_set_affinity或者irq_set_wake的調(diào)用上下文直接報(bào)錯(cuò)。這類場(chǎng)景下建議先把老驅(qū)動(dòng)的中斷請(qǐng)求段完整分析一遍確認(rèn)每一處API在當(dāng)前內(nèi)核版本下的行為再動(dòng)手改設(shè)備樹(shù)。8.3 我總結(jié)的七條中斷移植注意事項(xiàng)這幾條不是教科書上的原話是踩了不少坑之后我自己定的檢查順序先確認(rèn)硬件電氣連接再談軟件配置。GPIO復(fù)用的pinmux沒(méi)配好中斷引腳根本到不了控制器。設(shè)備樹(shù)里interrupt-parent一定顯式寫別依賴默認(rèn)值不同內(nèi)核版本的默認(rèn)解析邏輯很不一樣。觸發(fā)類型雙層核對(duì)設(shè)備樹(shù)寫一次request_irq里保持一致不要copy老代碼時(shí)帶上舊平臺(tái)的標(biāo)志。中斷處理函數(shù)里不要做總線操作除非你用threaded irq或者確認(rèn)總線控制器支持中斷上下文使用。移植后先跑高頻中斷壓力測(cè)試別只測(cè)一次觸發(fā)。中斷丟失和死鎖往往在高頻下才現(xiàn)原形。/sys/kernel/debug/irq/和/proc/interrupts配合使用一個(gè)看靜態(tài)配置一個(gè)看動(dòng)態(tài)計(jì)數(shù)。千萬(wàn)別在中斷handler里加調(diào)試打印尤其串口打印。串口本身也是中斷驅(qū)動(dòng)的中斷上下文里打串口很容易把系統(tǒng)鎖死要打印就記錄標(biāo)志位thread_fn里統(tǒng)一處理。9. 最后再補(bǔ)一個(gè)定位中斷問(wèn)題的野路子很多中斷問(wèn)題表面上是“驅(qū)動(dòng)注冊(cè)失敗”或者“中斷計(jì)數(shù)不對(duì)”實(shí)際根源在別的驅(qū)動(dòng)或者系統(tǒng)初始化順序上。比如之前遇到一次某個(gè)外設(shè)的probe成功、中斷注冊(cè)也成功但一使能外部中斷整機(jī)就重啟。查到最后發(fā)現(xiàn)是另一個(gè)驅(qū)動(dòng)把GIC的某種電源域關(guān)了導(dǎo)致GIC在處理該中斷時(shí)訪問(wèn)了未上電的寄存器直接觸發(fā)總線錯(cuò)誤。所以移植驅(qū)動(dòng)時(shí)如果中斷問(wèn)題怎么都查不通不妨回頭看看這幾件事該外設(shè)的電源域和reset GPIO在目標(biāo)平臺(tái)上的配置是否和原平臺(tái)一致。內(nèi)核里CONFIG_ARM_GIC_V3這類中斷控制器配置項(xiàng)是否和實(shí)際SoC匹配。配置不對(duì)的話中斷控制器可能只初始化了一部分。啟動(dòng)日志里GIC相關(guān)的初始化信息確認(rèn)它識(shí)別的中斷范圍是否覆蓋了你外設(shè)使用的硬件中斷號(hào)。中斷子系統(tǒng)是一個(gè)典型的“一榮俱榮、一損俱損”的鏈條。驅(qū)動(dòng)側(cè)代碼再正確只要中間任何一環(huán)沒(méi)對(duì)齊——硬件連接、設(shè)備樹(shù)解析、控制器配置、流控機(jī)制——整個(gè)鏈條就斷了。把這套框架裝進(jìn)腦子里移植時(shí)按圖索驥比盲目改代碼高效得多。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
色色九区| 91色宗合| 国产综合在线视频网站| 精品人妻一区| 人妻一区二区三区四区视频| 久久久神马影院| 水澄无码AV| 欧美亚洲一级在线观看| 日韩无码视频黄色| 四虎免费在线观看| 综合亚洲欧美| 亚洲AV在线资源| 啊啊啊啊二区好大| 又大又黄国产| 久久黄黄| 亚洲一二三四区机械| 大香网伊人久久综合| 先锋影音av先锋一区| 久久久久久久9999| 欧美牲| 温婉少妇玩3p| www.伪伪| 日本高清视频xxxx| 国产精品人妻无码久久久老鸭窝| 夜夜夜夜久久久久| 久久熟女精品不卡一区| 97se综合| 激情欧美97| 国产精品久久久午夜夜伦鲁鲁| 丰满搜索结果 -第18页- 久久高清无码 | 91高跟美女在线播放| 日韩一级二级| 清柠毛片| 在线天堂999| 午夜精品久久久久久久男人的天堂 | 亚洲熟女中文字幕在线| 久久精品一区二区三区不卡| 日韩免费人妻色情网站| 熟妇精品juliaannAV| 鸥美精品一区二区久久婷婷| 极品粉嫩少妇视频| 亚洲日韩熟女人妻高清在线| 亚洲。天堂。日本在线观看| 区自美91| 综合亚州欧美| 女性91网站| 国产97色在线 | 亚洲| 欧美激情一| 揉揉揉夜夜| 天天欧美| 影音先锋新男人| 国产亚洲深夜激情| 精品无码人妻一区二区免费蜜桃| www.男人天堂| 日日摸日日弄日日拍| 97久久综合网| 国产一区在线播放| 国产综合在线视频网站| 黄色区免费观看中文字幕| 在线综合色| 加勒比久久综合网高清| 久久综合九九| 伊人网在线观看| 亚洲一区二区 麻豆传媒| 日韩精品影视| 大香蕉淫人网| 浪人综合网| 国内精品伊人久久久久影院会| 婷婷99狠狠| 欧美熟女少妇| 大乔未久88一区| 少妇内射视频| 91亚洲人| 色色色综合网| 日韩无码久久熟女一级片| 午夜视频久久久| 麻豆视频一区二区| 性爱视频啪啪啪啪| 动漫av中文| 大香蕉伊人久久| 久久亚洲天天做| 日韩高清一二三| 成人怡红院| 一区二区三区 日韩欧美| 色色国产| 91丝袜人妻| A级片日韩欧美国产欧美视频精选观看| 一级做a爰片久久毛片图片| 免费一级视频特黄色大片| 老色69| 91黑丝操| 最新啪啪视频| 五月天欧美色图| 东京热双插| 96久久精品一二三区色欲| 99色悠悠| 免费视频观看60秒| 日韩免费看黄片| 午夜啊啊啊| 91人妻人人澡人人爽人人精品| 久操com| 熟女丰满人妻一区| 久久蜜桃一区二区| 日韩AV熟女乱伦| 久草资源欧美在线视频| 亚洲无线观看久久| 伊色综合天堂色97| 久久精品国产亚洲av水密被窝| 奇米四色网| 久久亚洲影院一区二区| 91骚熟女| 天天操狠狠日夜夜干超碰撸com视频在线观看 | 五月丁香婷婷综合| 中日韩久久久免费看| 欧美片第一页| 午夜天天碰综合视频| 高颜值美女口爆高潮浪叫| 日本 色 导航| 香蕉视频精品亚洲一区二区三区在线播| 国产精品一区av在线| 小草精彩毛片| 91在线视频国产网站| 日本免费中文一区二区三区四区| 综合亚州欧美| 高潮内射在线| 欧美成熟性爱精品| 婷婷精品国产欧美精品亚洲人人爽| 91人妻最真实刺激绿帽| 97超碰免费人人性爱| 色色色日本| 人妻在线中出视频| 久草尤物| 亚州熟妇精品| 成人性爱全视频观看| 色娱乐色呦呦夜夜夜夜av| 国内亚洲精彩视频在线| 午夜AV污污污| 日韩一级欧美一级在线观看| 91精品婷婷国产综合久久| www黄片免费看com| 97超碰大| 欧美亚洲激情小说| 国产精品视频白浆免费| 精品性爱| 羞答答AV中文字| 在线强奷到舒服的无码视频| 亚州Av天美传媒| 97最新在线播放视频| 99草精| 丰满人妻一区二区三区在线| 黄色激情电影在线观看| 爱逼综合| 欧美亚洲成人在线一区二区三区| 91在线无码精品秘 软件| 色噜噜人妻av中文字幕| 嗯嗯嗯嗯啊啊啊好紧好大| 久久久性| 91AV天美在线视频| 丁香五月婷婷五月| www.久久最新地址| 亚洲男人天堂AV| 亚洲精品一二三四区| 国产精品麻豆免费视频| 亚洲成人帖图| 日本中文字幕高跟| 大鸡吧尹人在线| 中文人妻av高清一区| 91高清日| 中文字幕88av在线| 97九色人妻| 国产性爱在线视频一区二区| 久久久久99999| AV在线资源| 无套内射性感少妇视频| 国产三级在线现体验区| 国产免费内射视频| 91熟女丨91老女人| 久偷拍欧美日韩三区| 六月丁丁香| 26uuu性| 夜夜躁狠狠躁日日躁av| 99re99视频在线免费观看| 九九热视频在线观看| 久久久久久久久久va| 91国产丝袜美女| 7月婷婷综合| 青青在线视频日韩欧美| 欧美性夜| 日韩不卡av一二三| 操逼操逼视频操逼| 91一区二区三区蜜桃| 日1区2区3区2020| 久久久久9999妇女| 国产视频一区二区在线| 日本天天吊| 久久婷婷精品| 婷婷伊人綜合中文字幕小说| 国产亚州精品美女久久久免费| 日韩无码视频黄色| 2023天天操夜夜操| 久久久96| 综合网 欧美| 亚洲素人综合| 无码九九| 欧美激色| 超碰是碰在线观看| 亚洲欧美国产其他二区| 亚洲制服aⅴ中文字幕| 欧洲性爱无码区| 97超碰人妻| 久久国产乱子伦精品免费女,网站| 风骚少妇视频中文字幕| 色香91| 玖玖爱伊人玖玖爱| 97精品全部| 久久国产精品视频| 91欧洲入口| 怡红院亚洲怡春院av| 欧美亚州综合图片| 亚洲色天堂九9| 亚洲另类综合欧美| 四季AV综合网址| 熟妇视频一区二区三区在线观看| 观看视频图片一区二区三区| 一及黄久一点| 免费网色网站| 青青久草| 婷婷操视频| 免费农村成人少妇人妻Aa一区二区视频| 五月丁香六月激情综合| 精品射1999| 亚洲色香| 噜噜噜噜久久久精品免费| 好涩综合| 18禁中文字幕| 久久久婷| 殴洲老熟女| 欧美黑人168页欧美黑人167| 青女偷拍网| 一起草三级AV电影在线观看| 三级激情网站| 精品精品精品| 欧美日韩国产人人| 玖草在线视频| 欧美日韩国产高清在线一二三区 | 久久久久久亚洲中文| 乱论91| 天天干美少妇一区| 日本A级视频| 天天天堂影视日韩亚洲91| 在线天堂资源亚洲| 国产在线视视频有精品| 极品久久久久久久久久久久久久| 91久久国产精品| 可免费观看的av毛片中日美韩| 精品国产无码中文| 开心婷婷五月| 久久久久久无码人妻中文字幕| 九九九九九精品视频| 91深夜夜| 国产乱弄免费在线视频。| 91狠狠狠| 国产麻豆福利av在线播放| 天天日日夜夜| 一区二区三区四区五区久久久久久| 国产 码在线成人网站| 激情露脸爱| 91模特在线观看| 69XX一中文字幕人妻91 | 久久人妻熟女一区二区| 人妻人人做人人澡人人爽欧美一区| 蜜臀av一区二区三区免费观看| 精品96久久| 久久精品—区二区三区内射| 无码日韩网站| 丝袜天堂网| 中国一级操逼视频| 亚洲 中文 女同| 蜜桃天美传媒AV一区二区三区| 一二三四视频中文字幕在线看| 久久综合99| 亚洲不卡一| 91社操逼| 国产久久久久影院老熟女| 国产综合色精品在线观看| 一区二区三区精品视频| 2000亚洲男人天堂| 日韩在线欧美精品一区二区| 女人妻一区| 久久香蕉国产线看观看亚洲女人 | 2018天天干在线视频| 极品丝袜无码| 永久免费观看的毛片的网站| 亚洲 综合 欧美| 久久伊人影院| 日本三级黄页| 凹凸精品熟女在线观看| 草b在线| 亚洲**2021在线观看| 男人的天堂2018东京热啪啪啪| 日日骚一区二区三区| 免费强奸av| 大香蕉在线SuP| 欧美午夜视频| α√在线| 国产精品白丝AV| 97伦综合| 97在线免费看| 国产探花精品在线| 国产精品久久久久999| 久久成人国产| 久久精品国产97欧美精品亚洲 | 婷婷亚洲综合| 96久久久| 亚洲大色堂| 免费精品人妻一区二区三| 亚洲欧美日韩电影网站一区 | 国语精品内射在线观看| 美女骚尻视频| 欧美一级三级| 伊人黄色片| 国产青青美女玩逼视频| 国产视频一区二区免费| 亚洲精品电影| 久久亚州高清| 婷婷丁香五月激情啪啪| AA级电影三区| 一区二区播放| 亚洲。日韩。欧美| 亚洲一区二区中文字幕| 青青久久艹| 国产五码丝袜屁眼| 婷婷五月天影院| Julia在线播放亚洲久久| 亚洲中文字幕精品一区| AV色五月| 一区,二区,三区视频| 国产亚州高清国产拍精| 天天澡天天爽日日AV| 亚洲色91C| 五月天婷婷色| 蜜乳av一区二区| 久久香蕉国产线看观看亚洲女人| 国产农村妇女精品一| 日韩黄色一区二区三区| 边做饭边操逼逼| 99精品无码| 91撸色网 玖玖网 欧美| 亚洲天堂,男人| 黄色无码高清黄色无码网站| 欧美瑟综合| 国产乱弄免费在线视频。| 日韩激情啪啪| 国产精品一区午夜福利| 一区二区三区高清 | 欧美日韩亚洲一区二区在线观看| 欧美亚洲首页| 老女人91| 色狠狠综合噜一二三区| 老司机午夜精品福利视频一区二区| 黄色工厂这里只有精品| 国产av高清版| 天天干天天干天天| 亚洲乱码国产乱码精网站| 日韩电影在线观看网址| 另类欧美综合| 午夜精品人妻二区三区| 欧美中文字幕一区| 99在线精品观看视频中文| 天天欧美色| 婷婷久久网| 欧美日韩性爱无码| 九月激情婷婷| 亚洲男人天堂av| 超碰吊日色| 天堂av最新电影网| rivers-china.com| 97视频在线观看网站| 啊啊啊好湿久久| 婷婷伊人一区| 久久精品人体| 久久欧美1卡2卡3| 99综合| 激情综合网五月婷婷五月天| 91社区拍啪人妻| 欧美爱三级日韩久久| 91精品人| 中文字幕在线观看永久| 人妻啪| 国产对白刺激视频| 影音先锋乱伦资源| 欧美78P| 熟女91网站| 蜜臀99久久精品久久久久久| 超碰色大香蕉| 人人妻人人爱人人玩| 97超碰欧美精品| 啊啊啊啊操死我| 亚洲天堂精品日韩电影| 日韩操逼性鲍| 大香蕉专区| 丰满人妻一区二区三区大胸懂色| 另类一区| 激情五月婷婷| 2000亚洲男人天堂| 风月影院男女十八禁| 伊人久大| 超碰97人人乐| 校园春色 欧美| 婷婷色综合欧美日韩| 国产乱码久久| 性色av一区二区| 欧美色日| 免费a v| 午夜亚洲国产理论秋霞| 日韩人妻制服丝袜av| 精品国产一级久久| 大香蕉宗合网在线| 美女干逼2| 3级毛片一二| 久久激情婷婷| 亚洲中文一区二区三区| 极品极品色影院| 欧美三级一级| av天堂加勒比| 青娱乐淫乱1314| 国产精品成人福利在线| 亚洲激情AV| 久久久久久久久久久久黄色| 正宗无毛一线天嫩逼| 免费观看一区| 国产精品无码论坛| 大香蕉在线视频15| 极品人妻少妇综合| 在线a v| 五月婷婷无码| 蜜桃臀一区二区三区久久| 91熟女丨91老女人| 欧美顶级黄片AAAAA在线免费看| 女人天堂AV五区在线| 亚洲精品白丝| 国产亚洲深夜激情| 欧美国产日韩清纯唯美| 91精品国产长腿丝袜美女| 综合伊人网12色| 亚洲最大无码中文字幕网站 | 亚洲激情深爱文学小说网站| 亚洲欧美国产中文视频| 天堂精品在线| 亚洲欧美综合网站| 日韩 欧美 另类 人妻| 熟妇乱伦一区二区| 中文字幕一区日韩精| 色偷偷色偷偷欧美日韩| 国产偷人伦激情在线观看| AV电影在线播放| 东方亚洲在线操逼天堂| 亚洲男人久久综合天堂| 久久蜜桃综合网| 久草久日| 爱av免费| 狠狠97| 亚洲午夜福利在线影院| 另类专区加勒比| 岛国大片在线观看网站入口| 国产自产91区13区| 精品蜜乳AV免费观看| 五月综合激情网| 欧美草草高清日韩视频| www.99色| 色色97爱| 男人的天堂亚洲| 91无码人妻精品一区二区三区蜜桃 | 久久怡红院| 18禁久久| 91欧美| 99热欧美| 九九黄色网| 日日不卡av| 91九九| 日韩情色一区二区| 综合网,亚洲,欧美| 97这里只有精品| 青娱乐导航AV| 国产无马在线| 欧美夜色| 99精品成人免费看| 东京男人天堂| 白丝1区2区3区| 91操操操操| 久久亚洲不卡一区二区三区| 亚洲毛片一级带毛片基地| 福利一级版子| 人妻少妇久久久| 日日干夜夜欢| 久久久久久久人妻| 91啦人妻| 91国产在线精品| 2020国产精品| 老司机午夜精品视频| 午夜欧美J进J出白浆流出久久久 | 有码免费观看| 天天天天天天天天天天干美女| 97视频一区| 久久思思热| 国产操逼视频在线观看| 婷婷五月天无码| 日本污ww视频网站| a男人的天堂久久一级A毛片| 亚洲精品1区| 97碰在线视频| 精品人妻一区二区视频| 风间由美日韩欧美久久| 自拍欧美| 超碰狠狠操| 懂色中文一区二区三区| 日韩欧美女求操每天更新| 亚欧精品久久久久久久久久久| 亚洲欧美精品国产一区二区| 久久华人网| 综合网,亚洲,欧美| 97国产成人精品免费视频| 大香蕉99999| 色综合99999| 偷拍欧美激情| 1769精品一区二区三区| 黄片qw| 超碰97人妻自拍| 色网在线| 台湾大香蕉99热| 天天操天天舔| 特级毛片特黄久久免费看| 青娱乐休闲视频在线观看| 久久日本熟妇熟色高清| 首页亚洲国产高跟丝袜诱惑视频| 欧美一级黄色18片免费看| 国内毛片国产欧美拍| 这里只有97精品| 夜夜骑操视频| 天天色怡春院| 日韩精品人妻系列无码天堂| 殴美牲| 一区二区三区激情在线观看| 日韩综合无码色欲vv| 亚洲中字幕日本一区二区三区| 精品人妻一区二区蜜桃视频| 久湿久久| 97久久国产亚洲精品超碰热| 欧美在线l亚洲| 蜜桃在线观看一区二区三区| 激情四射婷婷四五月天| 青青草中文-久久青草精品一区二区三| 国产精品一二三在线看| 国产亚洲日韩欧| 国产免费黄色一级大片| 国产无码精品久久久久久| 欧美性夜| 亚洲乱妇p22| 激情小说亚洲图片| 欧美日本不卡| 啊啊啊啊在线播放| 性色av一区二区| 欧美亚洲丝袜美女电影| 天天日天天射天天干| 国产馆极品诱惑| 国模限制级电影| 91亚洲精品青草| 麻豆天美国美国产AV| 99久久久| 麻豆视频test| 欧美午夜色妇色鬼| 久久av网| 风骚少妇视频中文字幕| 天天操人人操骚逼网站| 色网在线| 久久风骚城市人| 色97干| 男人天堂导航| 欧综合网| 久久中文字幕一区不卡| 国产日韩色综合| 高清无码在线播放网站| 国模无码一区二区三区在线| 久久久久国产一区二| www.色婷婷色综合| 国产av白丝| 国产白嫩精品久久| 性色高清在线| 一区,二区,三区网站| 综合网色| 麻豆久久视频在线地址| 日日橹狠狠爱欧美超碰| 好屌色综合| 欧美综合天堂| 亚洲啪AⅤ永久无码| 岛国网址国产 | 天天摸夜夜摸| 中文字幕、久久精品国产2020、久久综合久久自在自线精品自、亚洲 | 青青草视频在线观看一区二区| 一区,二区,三区网站| 中文字幕十五区| 丰满人妻-区二区三区免费看| 亚洲欧洲激情卡通另类文学四射小说网站 | 国产精品久久成人免费| 麻豆60秒| 日韩精品影视| 日本精品一级二级三级| 国产99久久99热这里只有精品15 | 深夜激情| 青青免费在线视频一区| 亚洲图片偷拍视频区| 亚洲天堂女优在线| 尤物视频新赏网鲜网色诱网| 中日韩一区二区三区欧美| 女人午夜视频777| 日本久久久久久久久| 1000午夜黄色| 国产免费内射视频| 国产精品毛片?v一区二区三区 | 青娱乐91| 色综合久久88色综合久久天天| 国产天美欧美| 久久九九久精品国产尤物|国产精品爽黄69天堂A片潘金莲,国产亚洲精品第一综合 | 大香交| 粉嫩av久久一区二区三区| 在线99热| 天干天干天干天天做| 欧美日日操| 电影69乱码96| 欧美性夜| 丁香五月天啪啪| A级在线视频| 色婷婷综合视频| 综合大香蕉美。| 秋霞一集毛片观看| 欧美超碰9798| 91精品91久久久中77777| 成人八戒网站| 啊啊啊不要啊啊受不了了视频在线| 青青草久草| 最新国产精品久久精品| 久久中出在线| 五月亭亭六月丁香| 久久极品一区二区| 美女性91| 日本国产欧美高清在线| 久久人妻无码毛片A片麻豆| 国产精品又黄又猛又粗| 96久久精品一二三区色欲| 偷拍网站久久男女男| 亚洲少妇视频| 色九九综合| 国产夫妻性生活视频| 户外裸露刺激视频第一区| 97视频新免费| 精品久久久久av影院| 亚热日本熟女| 韩国成人精品久久久免费看| 日本加勒比无码专区一二三| 每日更新AV| 国产熟码AV| av九九| 亚洲色图亚洲| 日韩精品高清资源在线| 岛国免费黄色网址| 天堂av最新电影网| 美女自卫慰黄网站免费| 亚洲欧美黄| 夜夜高潮夜夜爽高清视频一| 综合伊人网12色| 久久亚洲天天做| 亚洲人妻中文高清| 亚洲欧美啪啪| 日韩午夜啪啪视频| 国产又黄又爽| 蜜臀AV一区二区三区激情综合| 加勒比综合88| 顶级少妇BT天堂| 翔田千里Av在线| 亚洲丝袜色图| 黄色电影观看久久9| 制服丝袜第二页| 日韩无码黄色片| 欧美亚洲清纯| 青青草视频久久| 精品久久久久久无码| 久久精品成人一区二区三区蜜臀| 高清无码国产亚洲| 操国产高清| 丝袜翘臀后入欧美校园亚洲自拍另类小说一区中文字幕少妇诱惑 | 嗯嗯嗯,草死我| 老司机老司机午夜影院| 一二三区精品视频| 亚洲天堂情色| 97碰在线视频| 综合色91| 精品综合久久久久久97| 日韩精品三区四区| 一本大道不卡一二三区| 日比av无码| 国产精品久久久久久久久久久久久久久 | 亚洲国产一区二区日韩专区| 啊啊啊啊无码| 欧美日韩国产电影| 六月婷激情福利天堂69| 亚洲欧美国产成人综合不卡| 欧美天天弄| 国产精品3| 青青草精品| 大香焦A片| 伊人久久AV诱惑悠悠| 屁股久久久久久久久| 久久9精品视频| 日韩亚洲Av人人夜夜澡人人爽| 亚洲春色一区二区三区| AV色女综合| 久久这里| 中文字幕天天操| 久悠悠av| 色综合九九| 欧美精品日韩久久久九| 日韩免费中文字幕视频| 婷婷爽人人婷婷爽视频| 欧美综合自拍亚洲综合图| 国产久久一区二区| 国产美女口爆吞精| 五月天丁香网| 成人八戒网站| av午夜影院在线播放| 日韩性爱小视频| 午夜在线播放| 色与欲影视天天看综合网| 男人的天堂激情| 五月综合久久| 亚洲成人免费电影| 久久精品亚洲成a人天堂| 午夜.DJ高清在线观看免费7| 农村女一级毛卡片| 天天爽天天操| 婷婷亚洲综合| 蜜桃臀av在线观看| 99色视频| 920日本午夜免费| 6080yy午夜理论三级一区二区三区无码| JULIA一区二区三区在线播放| 免费精品中文字幕| 五月婷婷六月丁香网址| 十八禁成人网站在线观看| 深夜国产一区二区三区在线看| 你懂的在线观看区国产| 欧美十八禁视频| 天天色天天干天天爱| 97资源久久| 美女裸体无遮挡永久免费观看网站 | 青青草原成人| 后入人妻无码| 免费观看一区| 久久精品国产亚洲AV高清演员表| av爱爱爱| 日本视频在线观看污污污| 激情视屏国产乱伦强奸| 男人a天堂手机在线版| 日本色色色视频| 99操逼| 免费一级毛片在线视频观看| 免费一级视频特黄色大片| 吻戏激情性巴克| 欧美美女在线高潮999| 男人天堂久久日韩| 亚洲网污污污污| 一本大道青青| 神马久久午夜| 伊人五月天婷婷| 无色无码| 91在线欧色| 狠狠夜色午夜久久综合在线| 亚洲色图 图片| 91精品人妻一品二品三品| 91天堂| 日韩国产不卡在线视频| 欧亚乱色熟女一区二区| 久超碰在| 天天射夜夜| 18精品一二区| 亚洲春色欧美激情自拍| 日韩美女操b| 国产精品久久伊人| 天天综合在线4| 又大又黄国产| 亚洲人久久久网| 白丝一区| 亚洲精美粉嫩嫩泬在线观看| 国产乱伦性爱AV| 亚洲情色1区| 国产精品久久久久无码Av网曝门 | 亚洲城人男人的天堂| 人乳av| 乱欲视频| 黄色性爱网网| 久久9精品视频| 97综合久第一页| 超碰97欧美| 成人免费不卡在线视频| 天天爽人人综合免费7799| 中文字幕免费观看| 操死我了啊啊啊| 精品国产乱码久久久久久免费| 人人操人人色网| A片 AV一级在线播放观看免费| 高潮内射在线| 国产精品97超碰| 国产日韩欧美中文在线播放| 另类天堂| 亚洲狠狠入| 久久久国产av美女私房| www国产天美久久久| 久久思思热| 五月天亚洲网| 亚欧无码在线| 神马久久久久久久久久久久| 欧美色图91| 欧美精品自慰系列寂寞少妇| 性爱AV天堂| 2023天天操夜夜操| 成人 日韩欧美一区| AV男人天堂网| 激情无码日韩| 久久久久久欧美精品se一二三四| 射欧美综合| 91丝袜在线观看| 无码日韩网站| 91激情综合| 最新av中文字幕高清| 精品久久久高清无码| 日本三级小说中文字幕| 欧美美女视频| 五月丁香大香蕉| 欧美肥臀在线| 日韩欧美亚洲一区二区三区影院| 97视频900| 麻豆精品一区二区三区四区免费观看| 国产成人网站在线观看| 男人的天堂VA| 大香蕉五月天| 97色综合中文网| 91狠狠综合久久久久久| 久一区久久蜜桃| 超碰在线99| 丰满熟妇大乳做爰| 激情五月激情综合网| 欧美高清16| 99性爱| 不卡在线观看视频| 亚洲一二三四区机械| 亚洲熟女av中文字幕| 激情文学网伊人| 亚洲色综合| 91精品人妻一区二区三区蜜桃臀| 国产成年女人免费视频播放a| 成人色女网| 日韩亚洲中文有码视频| 亚欧美综合| 国产日本久久免费精品| 后入综合久久| 色一情一乱一乱一区91Av| 男人的天堂2018| 顶级少妇BT天堂| 婷婷激情丁香| av情色影音| 狠日操| 欧亚三区动漫| 首页中文字幕中文字幕免费| 激情文学亚洲| 思思热在线观看| 素人一区二区三区日韩| 久久久久久久久久久久久久久久9| 亚洲中文一区二区三区| 麻豆熟妇乱妇熟色A片在线看| 骚逼高潮久久精品| 人人爱人人乐人人操| 国产精品熟女AV中文字幕在线播放| 香蕉国产精品麻豆亚洲欧美日韩| 国产精品午夜福利视频| 强奸xx国产| 囯产精品久久久久久久久久梁医生| 九九成人精品| 国产一级操B视频| 国产精品久久久久久久久久久久久久吹| 男人天堂久久精品| 免费观看网黄| 欧美日韩精品久久| 一级性爱aaaa| 大学生美女口爆| 中国黄色特级精品一区二区三区片| 久久成人国产| 久久东京热久久| 人妻少妇三级| 日韩一性一交一A片俄罗斯| 日本大片日本一区二区免费高清| 国产日韩欧美操逼视频| 欧美性色欧美| 99精品人妻| 天天精品| 欧美性Fer办公室秘书| 久久久久久久久久精| 手机看片91人妻| 97综合在线观看| 精品国产一区二区三区久久久蜜臀 | 18禁看网站一区| 久久爱97| 欧美乱妇狂野欧美在线视频| 夜夜嗨一区二区| 国产精品呦一区二区三区| 欧美精品成人一区二区在线观看 | 黄色片A级一区二区三区| 蜜色网色哟哟| 国产精品香蕉热久久新品| 天天α片| 國產尤物AV尤物在線觀看| 青久操| 国产黄色在线播放观看| 国产精品不卡一区二区三区| 成全在线观看免费观看| 五月天激情网图片| 72av视频| …中文字幕亚洲乱,97人妻无码费视…| 亚洲色图欧美色图制服丝袜| 婷婷深爱五月| 国产福利在线视频网站| 婷婷av在线中文字幕| 亚洲熟女av中文字幕| 91国产丝袜白虎| 青青草国产一区二区三区| 超碰在线97国产| AV一二区| 高清不卡一二三区视频......| 天天爽天天| 91 刺激在线| www久| 色色色综合网| 黄色操人| 国产精品午夜福利亚洲综合网| 成人免费性爱视视| 国产乱子伦一区二区三区在线观看| 高精欧美色| 久久粉色| 日韩精品人妻一区二区| 欧美另类丝袜熟女| 秋霞一区二区三区四区五区六区七区| 一区 欧美 日韩 麻豆| 91人人爽人人爽| 人妻天天爽夜夜爽爽| 国产伦精品| 国产精品久久久久9999小说| 亚洲第一视频 欧美风情 日韩| 韩日欧亚a级| 精品久9| 偷拍视频青青草在线视频| 欧美日韩在线小说| 偷拍精品一区二区三区| 欧洲亚洲国产综合在线| 日本成人A片免费看| 亚洲欧美国产中文视频| 国产免a费看黄片在线| 国产探花精品在线| 久久精品性| 99这里有精品| 麻豆2区1区天美| 欲射影视| 97国产中文| 2020中文字幕在线观看| 欧美黄页| 99国内熟女露脸视频| 大香蕉日亚洲日本亚大 | 9999久久久| 日韩高清黄片| 国产精品婬乱一级毛片彝族| www.99热| 97视频7| 欧美综合777| 九九九九精品九九九九| 亚洲无线码欧洲精品区别| 再深点灬舒服灬太大了添视频| 在线观看不卡一区二区三区| 九九精品无码专区免费| 亚洲成人一区二区精品| 一二三四免费视频| 91美女在线视频| 成人情色综合网| 福利视频合集| 精品久久久久av影院| 日韩亚洲美女一区久久| 日韩精品系列| 久久久久久9| 青青伊人这里只有精品| www.婷婷六月天| 白丝少妇一区二区| 最近二区三区视频大全| 一区二区三区国产在线播放| 久操网视频| 九九热免费国产视频婷婷伊人五月| 久久精品免视看国产成人﹣蜜臀av一区. 久久精品免视看国产成人,蜜臀av一区 | 北条麻妃性愛视频| 78精品| 国产av美女被艹的乱叫| 成人片在线播放| 91九九九小逼| 青青草一区二区高清无码视频 | 素颜老阿姨乱情色| 99热国产| 乱伦熟女专区| 色色婷婷五月天| 超碰一区二区| 亚洲黄色| 在线观看精品国产免费| 亚洲三级网址久久最新| 亚洲AV不卡在线观看| 欧美的性爱网站免费| 屁股久久久久久久久久| 777琪琪午夜免费A片| 性爱av在线免费观看| 四虎免费看黄| 97国产人人| 97人人草| 成人精品电影| 五月天欧美色图| 美女视频尤物网在线看| 大香蕉97久久| 久操电影网| 黄色免费一级在线毛片| 日韩人妻精品久久久久| 九九九九九九成人| 国产v亚洲v日韩v欧美v片另类| 精品人妻一区二区三区四区石在线 | 日本高清一区二区在线| 白丝jkav| 国产午夜精品理论片一二三区区| 亚码激情| 精品午夜福利导航| 玖玖视频在线资源一区二区三区| 欧美性高潮| 激情五月丁香五月| 国产怡红院在线| 91丨九色丨43老版熟女| 色吊丝 日日骚 清纯唯美| 91精品无码人妻系列| 欧美综合第一| 国产欧美在线观看免费观看| 狠狠躁AV| 92性色国产午夜福利在线661| 国产亚卅97| 色悠久| 67914亚洲精品| 国产偷拍网站| 青青草在线视频人人想人人上 | 黄色性爱网网| 日日骚网站| 少妇蜜汁| 亚洲性爱成人| 日韩情色AV| 加勒比在线观看一区二区| AV在线资源| 思思视频免费看网站| 大香蕉综合久久| 亚洲成人激情小说视频| 东北女人被操| 人人操人人操人人操人人操人人操人人人11.CM | AV一区观看| 夜夜狠狠躁日日躁色视频| 秋霞成人一级在线观看| 情色日播放AV| 欧美牲| 九九久久国产精品| 亚洲国产午夜真人一级片中文字幕精品黄网站 | 俺去久久| 国产精品女久久久久av爽| 97超碰精品图片| 亚洲综合色男人网| 久久社区一区二区三区| 伊人9| 韩国久久97| 国产一级内射无挡观看| 91亚洲图片| 欧美暴力猛交| 曰韩成人免费视频| 中文字幕99999| 美女丝袜激情小说| 综合熟女| 日本一级婬片试看三分钟| 97国产精品一区| 黄色高清久久无码依人| 人人爱人人操人人性| 手机看片91人妻| 色盈盈影院| 欧美视频在线视频免费va| 99re这里只有| 激情终合网| av在线资源| 日本性爱欧美性爱| 大香蕉淫人网| 男人网站婷婷| 欧美性爱五月天| 久操免费在线| www.色五月| 午夜激情成人在线观看| 男人的天堂com| 亚洲91极品| 国产高清亚洲日韩一区| 物尤视频一区二区| 色爱国产| 久久国产精品91| 欧美日韩操操操| 97天堂| 性欧美999| 熟女露脸激情自拍视频| 鸥美插入视频| 又黑又大又粗 | 欧美精品久久久久久久丰满| 久久亚洲日韩熟女精品| 中国黄色特级精品一区二区三区片| 台湾佬激情综合| 精品国产精品一区二区| 欧美色性爱| 久久亚洲欧美中文字幕国语| 97伊人网| 有码专区最新中文字幕有码| 综合激情一一91| 亚洲图片欧美91N| 91精品伊人久久久大香线蕉91| 乱欲视频| 五月香婷婷| 国产欧美精选自拍一区| 精品欧美不卡在线播放| 日本幼女18+| 欧美在线综合| 日韩少妇在线视频| 欧美天天谢综合网| 亚洲精品日日夜夜52| 亚洲暴力强奸AV| 曰本人妻人人澡人人夹| 国产又黄又粗的视频| 精品人妻一区二区三区四区不卡在| 久久久555| 97国产精品久久久久| 九九九影院| 91性感网站| 天天拍天| 久久久久久大| 91人人爽人人爽人人人,gav福利视频导航,日韩欧美亚洲国产字幕四区 | 综合 青草 伊久久 影院 综合 | AA丁香综合激情| 丁香五月色| 色色色99| 久久精品国产亚洲AV高级北京| 91露脸熟女专区| 欧美日日操| 国产欧美成人第一页在线观看| 乱性AV| jk白丝没脱就开始啪啪| 91欧美综合|