国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

RK806中斷處理流程深度解析:從架構到調試實戰

jf_44130326 ? 來源:Linux1024 ? 2026-02-05 13:46 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

RK806作為瑞芯微主流PMIC電源管理芯片),其中斷機制是實現電源鍵響應、電壓異常保護、休眠喚醒、watchdog超時處理等核心功能的基礎。Linux驅動基于regmap_irq框架設計,屏蔽了底層寄存器操作細節,但調試時若不理解中斷流程,往往會陷入現象找不到根源的困境。

本文將從架構基礎全流程拆解典型調試實例三層展開,既講清中斷如何工作,又教你遇到問題怎么修,結合核心代碼與實操命令,讓底層邏輯落地可查、可復現。

wKgZO2kajEeANMZ2AAFZhyckgp0783.png

一、先懂基礎:RK806中斷的硬件與驅動架構

在分析流程前,需先明確硬件載體驅動框架”——這是定位問題的前提。

1.1硬件中斷核心資源(寄存器)

RK806的中斷通過2組狀態寄存器2組掩碼寄存器管理,所有中斷事件均映射到這些寄存器的特定bit位,代碼中雖未直接定義地址,但通過regmap_irq框架關聯:

寄存器類型

框架配置參數

核心作用

關鍵bit示例(對應中斷)

狀態寄存器(讀)

status_base

存儲中斷事件狀態(讀操作自動清0,即ACK

INT_STS00x08bit0PWRON按下;bit4:低電壓(VB_LO

狀態寄存器(讀)

status_base+1

擴展中斷狀態存儲

INT_STS10x0Abit7watchdog超時;bit3SLP1_GPIO喚醒

掩碼寄存器(寫)

mask_base

啟用/禁用中斷(1 =禁用,0 =啟用)

INT_MSK00x09bit0:禁用PWRON按下中斷

掩碼寄存器(寫)

mask_base+1

擴展中斷掩碼控制

INT_MSK10x0Bbit7:禁用watchdog中斷

注:上述地址為代碼隱含邏輯(通過rk806_irq_chipstatus_base=RK806_INT_STS0推導),實際調試需以芯片手冊為準。

1.2驅動框架:regmap_irq的核心設計

RK806未直接操作中斷寄存器,而是通過Linux內核regmap_irq框架實現寄存器bit→Linux虛擬IRQ”的映射,核心結構如下:

核心結構體/數組

作用

代碼示例(rk806-core.c

rk806_irqs數組

定義中斷類型寄存器組→bit映射

REGMAP_IRQ_REG(RK806_IRQ_PWRON_FALL, 0, RK806_INT_STS_PWRON_FALL)PWRON按下對應INT_STS0bit0

rk806_irq_chip結構體

描述中斷芯片屬性

指定名稱("rk806")、狀態寄存器基地址、掩碼寄存器基地址、中斷數量(16個)

struct irq_data *

框架句柄,用于后續獲取虛擬IRQ、控中斷

devm_regmap_add_irq_chip生成,關聯regmap與硬件IRQ

設計優勢:無需手動讀寫寄存器,框架自動完成中斷檢測過濾分發→ACK”,驅動只需關注中斷觸發后的業務邏輯

二、中斷處理全流程:從初始化到清理

RK806的中斷處理分為初始化(probe階段)觸發(硬件事件)分發(框架調度)執行(業務邏輯)清理(ACK5個階段,每個階段均有明確的代碼映射。

中斷處理全流程可視化

wKgZO2kajEeAZemnAAHfS6XbN2w774.png

階段1:中斷初始化(probe階段,核心在rk806_device_init

初始化是中斷可用的前提,需完成極性配置框架注冊喚醒使能三步:

1.中斷極性配置:調用rk806_irq_init,設置中斷引腳為低電平有效(避免高電平噪聲誤觸發);

staticvoidrk806_irq_init(struct rk806 *rk806){ // INT_POL字段(0x7b寄存器bit1)寫0,配置為低電平有效 rk806_field_write(rk806,INT_POL,RK806_INT_POL_LOW);}

1.注冊regmap_irq_chip:將regmapSPI通信層)、硬件IRQ(從設備樹獲取)與rk806_irq_chip綁定,生成irq_data句柄;

ret =devm_regmap_add_irq_chip(  rk806->dev,  rk806->regmap,    // SPI層初始化的regmap(負責寄存器讀寫)  rk806->irq,     // 硬件IRQ號(SPI設備的irq屬性) IRQF_ONESHOT|IRQF_SHARED, // 中斷標志:單次觸發(防重入)+ 可共享 0,  &rk806_irq_chip,   // 中斷芯片配置  &rk806->irq_data   // 輸出:框架句柄,后續用于控中斷);

1.啟用喚醒中斷:調用enable_irq_wake(rk806->irq),將主IRQ標記為喚醒源”——即使系統休眠時禁用主IRQ,該中斷仍能喚醒系統;

2.注冊特定中斷服務函數:對需要自定義邏輯的中斷(如VDC電壓變化),通過devm_request_threaded_irq注冊線程化服務函數(避免中斷上下文阻塞);

// 示例:注冊VDC上升沿中斷(喚醒場景)vdc_irq_rise = regmap_irq_get_virq(rk806->irq_data, RK806_IRQ_VDC_RISE);ret = devm_request_threaded_irq(  rk806->dev,  vdc_irq_rise,  // 虛擬IRQ號(從irq_data獲取)  NULL,      // 快速處理函數(無,直接走線程)  rk806_vdc_irq,  // 線程函數(核心邏輯:通知PM喚醒)  IRQF_TRIGGER_HIGH | IRQF_ONESHOT, // 觸發方式:高電平+單次  "rk806_vdc_rise",// 中斷名稱(用于/proc/interrupts)  rk806      // 傳遞給線程函數的私有數據);enable_irq_wake(vdc_irq_rise); //標記VDC中斷為喚醒源

階段2:中斷觸發(硬件事件發生)

RK806檢測到目標事件,硬件自動完成狀態置位引腳電平變化,觸發系統IRQ

?示例1:用戶按下PWRONINT_STS0RK806_INT_STS_PWRON_FALLbit0)置1→中斷引腳拉低;

?示例2:電池電壓低于閾值INT_STS0RK806_INT_STS_VB_LObit4)置1→中斷引腳拉低;

?示例3:設備插電(VDC恢復)INT_STS0RK806_INT_STS_VDC_RISEbit6)置1→中斷引腳拉低。

階段3:中斷分發(regmap_irq框架自動調度)

系統響應硬件IRQ后,框架無需用戶干預,自動完成篩選映射觸發虛擬IRQ”

1.讀狀態寄存器:框架讀取status_baseINT_STS0)和status_base+1INT_STS1),獲取所有未處理中斷;

2.過濾已掩碼中斷:對比mask_baseINT_MSK0/MSK1),排除已禁用的中斷(掩碼bit=1的中斷不處理);

3.映射虛擬IRQ:遍歷rk806_irqs數組,將寄存器bit”轉換為Linux虛擬IRQ號(如INT_STS0bit0→RK806_IRQ_PWRON_FALL);

4.觸發服務函數:調用generic_handle_irq(virq),調度對應虛擬IRQ的服務函數(如PWRON中斷rk805-pwrkey子設備的服務函數)。

階段4:中斷執行(業務邏輯處理)

不同中斷的處理邏輯不同,驅動通過子設備接管自定義線程函數實現,以下是2個核心場景:

場景AVDC電壓變化中斷(喚醒系統)

VDC中斷用于檢測外部電壓恢復(如插電),觸發系統從休眠喚醒,線程函數rk806_vdc_irq邏輯簡單:

staticirqreturn_trk806_vdc_irq(intirq,void*data){ structrk806*rk806 = data; // 通知PM子系統:保持喚醒狀態2秒(避免系統未就緒就再次休眠) pm_wakeup_dev_event(rk806->dev,2000,false); returnIRQ_HANDLED; // 標記中斷已處理}

場景BPWRON按鍵中斷(電源控制)

PWRON中斷(按下/松開)由rk805-pwrkey子設備接管(在rk806_cells中定義),處理邏輯與系統電源狀態聯動:

?休眠時短按:觸發pm_wakeup喚醒系統;

?工作時長按:調用rk806_regulator_shutdown執行關機序列;

?工作時短按:發送KEY_POWER事件給上層(如亮屏/鎖屏)。

階段5:中斷清理(ACK,框架自動完成)

中斷處理完成后,需清除INT_STSx寄存器的對應bit(避免框架反復觸發),regmap_irq框架通過以下邏輯自動完成:

1.讀取status_base寄存器(觸發ACK的硬件機制);

2.硬件檢測到讀操作后,自動清0已處理的中斷bit

3.框架無需用戶手動寫寄存器(rk806_irq_chip.ack_base = RK806_INT_STS0已配置)。

關鍵聯動:中斷與休眠喚醒的配合

RK806的中斷需適配低功耗場景,核心邏輯在rk806_core_suspend/resume中,流程如下:

三、調試實戰:4個典型中斷問題的定位與解決

理解流程后,遇到中斷相關問題可按現象關聯流程實操驗證三步定位,以下是工程師最常遇到的4個場景。

場景1:電源鍵按下無響應(PWRON中斷失效)

現象

?按下電源鍵,系統無任何反應(既不喚醒也不觸發關機);

?萬用表PWRON引腳電平有變化(排除硬件按鍵故障)。

定位邏輯(關聯流程)

問題出在中斷初始化分發子設備接管環節,可能原因:

1.中斷極性配置錯誤(高電平有效,與硬件引腳電平變化不匹配);

2.PWRON中斷被掩碼(INT_MSK0bit0=1,禁用中斷);

3.rk805-pwrkey子設備未加載(無人處理PWRON中斷);

4.中斷計數未增長(硬件未觸發中斷)。

調試操作(分步驗證)

1.檢查中斷極性:讀0x7b寄存器(GPIO_INT_CONFIG)的INT_POL字段(bit1),確認低電平有效(0):

# 利用rk806的sysfs調試節點(core.c中創建)讀寄存器echo"r 0x7b"> /sys/rk806single/debug# 預期輸出:0x7b 0x02(bit1=0);若為0x03(bit1=1),執行以下命令修正:echo"w 0x7b 0x02"> /sys/rk806single/debug

1.檢查PWRON中斷掩碼:讀0x09寄存器(INT_MSK0)的bit0,確認啟用(0):

echo"r 0x09"> /sys/rk806single/debug# 若bit0=1(禁用),執行命令啟用:echo"w 0x09$((0xff ^ (1<<0)))"> /sys/rk806single/debug # 0xfe,bit0置0

1.查看中斷計數:按下電源鍵后,查/proc/interruptsRK806_IRQ_PWRON_FALL的計數是否增長:

cat/proc/interrupts | grep -E"rk806|RK806_IRQ_PWRON_FALL"# 預期:按下鍵后計數+1;若計數不變→硬件中斷未觸發(查引腳連接);若增長→子設備未加載

1.驗證子設備加載:檢查rk805-pwrkey子設備是否存在:

ls/sys/bus/platform/devices/ | grep rk805-pwrkey# 若無→檢查mfd_add_devices是否成功(core.c中devm_mfd_add_devices調用)

場景2:休眠后無法喚醒(喚醒中斷失效)

現象

?系統執行suspendecho mem > /sys/power/state)后休眠,但觸發喚醒源(插電/按電源鍵)無反應;

?喚醒源硬件正常(VDC電壓變化、電源鍵電平正常)。

定位邏輯(關聯流程)

喚醒依賴喚醒IRQ啟用休眠時未禁用喚醒IRQ,可能原因:

1.喚醒IRQ未標記enable_irq_wake(休眠時被禁用);

2.休眠時誤修改喚醒中斷掩碼(INT_MSK0bit6=1,禁用VDC中斷);

3.喚醒中斷服務函數未執行(未通知PM子系統)。

調試操作

1.檢查喚醒源注冊:查/sys/power/wakeup_sources,確認VDC/PWRON喚醒源已激活:

cat/sys/power/wakeup_sources | grep rk806# 預期輸出:rk806_vdc_rise 0 0 0(已注冊);若無→檢查enable_irq_wake調用

1.驗證休眠前后的中斷掩碼:休眠前/后讀INT_MSK0bit6VDC中斷),確認未被禁用:

# 休眠前讀echo"r 0x09"> /sys/rk806single/debug # 記錄bit6值(0=啟用)# 執行休眠echomem > /sys/power/state# 喚醒后再次讀echo"r 0x09"> /sys/rk806single/debug# 若bit6變為1→休眠時被誤禁用,需檢查rk806_core_suspend是否修改掩碼

1.跟蹤喚醒中斷執行:在rk806_vdc_irq中加調試打印,確認喚醒時是否調用:

staticirqreturn_trk806_vdc_irq(intirq,void*data){ pr_info("[RK806] VDC wakeup irq triggered!n"); // 新增打印 pm_wakeup_dev_event(rk806->dev,2000,false); returnIRQ_HANDLED;}

重新編譯驅動后,喚醒時查看dmesg

dmesg| grep"VDC wakeup irq triggered"# 有打印→執行正常;無打印→中斷未分發(查regmap_irq映射)

場景3:低電壓不觸發關機(VB_LO中斷失效)

現象

?電池電壓低于配置閾值(如3.0V 預設3.4V),但系統未自動關機;

?SYS_STS0x5D)寄存器,VB_LO_STSbit4=1(硬件已檢測到低電壓)。

定位邏輯(關聯流程)

低電壓關機依賴RK806_IRQ_VB_LO中斷,問題可能:

1.VB_LO中斷被掩碼(INT_MSK0bit4=1);

2.VB_LO_ACT配置為僅通知中斷VB_LO_ACT_INT=1),而非自動關機VB_LO_ACT_SD=0);

3.中斷服務函數未調用rk806_vb_force_shutdown_init(未執行關機序列)。

調試操作

1.啟用VB_LO中斷:讀INT_MSK00x09bit4,確認啟用(0):

echo"r 0x09"> /sys/rk806single/debug# 若bit4=1→執行命令啟用:echo"w 0x09$((0xff ^ (1<<4)))"> /sys/rk806single/debug # 0xef,bit4置0

1.配置VB_LO_ACT為關機:讀SYS_CFG00x5Ebit3VB_LO_ACT),確認配置為0SD):

echo"r 0x5e"> /sys/rk806single/debug# 若bit3=1(INT)→改為SD:echo"w 0x5e$((0xff ^ (1<<3)))"> /sys/rk806single/debug # 0xf7,bit3置0

1.驗證關機函數調用:在rk806_vb_force_shutdown_init加打印,確認低電壓時觸發:

staticvoidrk806_vb_force_shutdown_init(struct rk806 *rk806){ pr_info("[RK806] Low voltage detected, start force shutdown!n"); // 原有關機序列配置邏輯...}

低電壓時查看dmesg,若有打印執行正常;若無中斷未分發(查rk806_irqs數組是否包含RK806_IRQ_VB_LO)。

場景4:中斷頻繁觸發(如VDC中斷狂跳)

現象

?dmesg中頻繁打印“VDC irq handled”,每秒數百次;

?無實際電壓變化,/proc/interruptsRK806_IRQ_VDC_RISE計數持續增長。

定位邏輯(關聯流程)

中斷狂跳多因觸發方式不匹配硬件信號噪聲

1.中斷配置為電平觸發IRQF_TRIGGER_HIGH),而VDC引腳信號持續為高;

2.中斷未正確ACKINT_STSxbit未清0,框架反復觸發);

3.VDC檢測引腳接觸不良,存在高頻噪聲。

調試操作

1.修正中斷觸發方式:將電平觸發改為邊沿觸發(僅電壓變化時觸發):

// 錯誤配置(電平觸發)ret = devm_request_threaded_irq(..., IRQF_TRIGGER_HIGH | IRQF_ONESHOT, ...);//正確配置(上升沿觸發,僅電壓從低變高時觸發)ret = devm_request_threaded_irq(..., IRQF_TRIGGER_RISING | IRQF_ONESHOT, ...);

1.驗證中斷ACK:讀INT_STS00x08bit6,確認中斷處理后清0

# 1. 讀當前狀態(記錄bit6值)echo"r 0x08"> /sys/rk806single/debug# 2. 等待1秒后再次讀sleep1 &&echo"r 0x08"> /sys/rk806single/debug# 若bit6持續為1→硬件未支持“讀清”,需修改rk806_irq_chip.ack_type為REGMAP_IRQ_ACK_WRITE(手動寫0清位)

1.排查硬件噪聲:用示波器VDC檢測引腳(如VDC_IN),若存在高頻波動,需在硬件上添加RC濾波電路(1kΩ電阻+ 100nF電容),穩定信號后中斷狂跳問題會消失。

四、總結:中斷流程的調試價值

掌握RK806中斷流程,本質是掌握從現象到根源的定位鏈路,核心價值體現在三點:

1.分層定位:中斷問題無非初始化觸發分發執行清理某環節失效,按流程排查可避免盲目試錯;

2.工具結合:善用/proc/interrupts(計數)、sysfs debug(寄存器讀寫)、dmesg(打印),讓底層狀態可視化;

3.代碼映射:快速關聯問題與代碼(如喚醒失敗enable_irq_wake,按鍵無響應rk805-pwrkey子設備)。

對于嵌入式工程師而言,PMIC中斷調試是底層能力的試金石——吃透本文流程與實例,不僅能解決RK806的問題,更能觸類旁通理解其他PMIC(如RK817RK809)的中斷邏輯,提升底層問題的攻堅效率。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • Linux
    +關注

    關注

    88

    文章

    11758

    瀏覽量

    219004
  • 中斷處理
    +關注

    關注

    0

    文章

    96

    瀏覽量

    11477
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    開關電源pcb設計實例 分析RK806電源方案的PCB設計

    模塊峰值電流表進行知悉,供PCB Layout時評估線寬作用,如下表值得注意的是,不能簡單的全部加起來算成SOC的峰值電流,要評估散熱方案,根據實際場景的工作平均電流進行,表格參數值僅供參考。 本篇內容以RK806電源方案的PCB設計
    的頭像 發表于 08-02 08:41 ?3433次閱讀
    開關電源pcb設計實例 分析<b class='flag-5'>RK806</b>電源方案的PCB設計

    RK3588 EVB開發板原理圖講解【三】

    RK3588 電源管理 ——RK806 介紹 一、RK806 典型應用圖 二、RK806 特征 輸入范圍:2.7V - 5.5V。 待機電流:極低,僅為 10μA 。 通信協議支持
    發表于 02-14 16:13

    RK3588 EVB開發板原理圖講解【七】

    流程? Power Key 開機流程? 關機方式1. RK3588 實際板型開機電路描述2. 長按強制關機和復位的區別探討RK3588 方案
    發表于 02-28 08:51

    RK3128 Android 7.1 進入深度休眠流程分析

    RK3128 Android 7.1 進入深度休眠流程分析RK3128是瑞芯微電子推出的一款低功耗四核Cortex-A7處理器,運行Andr
    發表于 07-22 10:45

    AUTOSAR架構深度解析 精選資料推薦

    AUTOSAR架構深度解析本文轉載于:AUTOSAR架構深度解析目錄AUTOSAR
    發表于 07-28 07:40

    AUTOSAR架構深度解析 精選資料分享

    AUTOSAR架構深度解析本文轉載于:AUTOSAR架構深度解析AUTOSAR的分層式設計,用于
    發表于 07-28 07:02

    8253中斷服務程序流程

    8253中斷服務程序流程圖 希望發電機P =
    發表于 05-03 00:12 ?5173次閱讀
    8253<b class='flag-5'>中斷</b>服務程序<b class='flag-5'>流程</b>圖

    STM32中斷系統的工作流程

    一、前言 在之前的STM32的中斷系統理論基礎知識之基本原理及NVIC,分別中斷的基本原理,中斷的管理機制和中斷
    的頭像 發表于 06-22 09:17 ?4177次閱讀
    STM32<b class='flag-5'>中斷</b>系統的工作<b class='flag-5'>流程</b>

    RK806電源方案的PCB設計注意事項

    的太遠,擺放方向時,盡量優先考慮 RK806的BUCK1、BUCK2、BUCK3、BUCK4這些輸出電流比較大的電源RK3588的信號流向是順暢的。 圖1 整體電源方案圖 RK806
    的頭像 發表于 09-23 07:40 ?2294次閱讀
    <b class='flag-5'>RK806</b>電源方案的PCB設計注意事項

    Bl31中斷處理流程概述

    中斷處理需要軟件和硬件配合完成,GICv3根據中斷分組情況以及系統當前運行的異常等級確定中斷是以IRQ還是FIQ觸發。 CPU通過設置SCR_EL3.IRQ和SCR_EL3.FIQ確定
    的頭像 發表于 11-07 17:43 ?1475次閱讀
    Bl31<b class='flag-5'>中斷</b><b class='flag-5'>處理</b><b class='flag-5'>流程</b>概述

    stm32中斷怎么處理

    STM32是一款非常強大的微控制器系列,具有豐富的外設和功能。中斷是STM32非常重要的部分,能夠幫助我們提高系統的響應速度和效率。本文將詳細介紹STM32中斷處理方法。 一、
    的頭像 發表于 01-02 17:35 ?3979次閱讀

    解決RK806+RK3588休眠異常!硬件特性軟件優化的完整方案

    在嵌入式開發,電源管理的穩定性直接決定了設備的可靠性。近期,RK3588 平臺搭配 RK806 電源管理芯片(PMIC)時,出現了二次休眠異常的問題 —— 第一次休眠喚醒正常,再次休眠后
    的頭像 發表于 02-09 16:46 ?718次閱讀
    解決<b class='flag-5'>RK806+RK</b>3588休眠異常!<b class='flag-5'>從</b>硬件特性<b class='flag-5'>到</b>軟件優化的完整方案

    深度拆解RK806 PMIC電源處理流程SPI通信到DVS動態調壓

    在嵌入式設備,PMIC(電源管理集成電路)是 “能源管家”—— 它不僅為 CPU、內存、外設提供穩定電壓,還需處理休眠喚醒、異常保護、動態調壓等核心邏輯。瑞芯微 RK806 作為一款高集成度
    的頭像 發表于 02-05 13:47 ?1035次閱讀
    <b class='flag-5'>深度</b>拆解<b class='flag-5'>RK806</b> PMIC電源<b class='flag-5'>處理</b><b class='flag-5'>流程</b>:<b class='flag-5'>從</b>SPI通信到DVS動態調壓

    RK?平臺?USB?攝像頭成像調試指南:信號畫質的全流程優化

    信號調試畫質優化的實操方案,助力開發者快速解決成像難題。 一、先搞懂:成像差的核心誘因 USB?攝像頭成像模糊、卡頓、連等問題,本質是?“信號傳輸”?與?“硬件適配”?雙重問題: ?信號層面:USB?眼圖指標不達標、枚舉失敗
    的頭像 發表于 11-26 07:05 ?799次閱讀
    <b class='flag-5'>RK</b>?平臺?USB?攝像頭成像<b class='flag-5'>調試</b>指南:<b class='flag-5'>從</b>信號<b class='flag-5'>到</b>畫質的全<b class='flag-5'>流程</b>優化

    RK3506 MIPI轉HDMI顯示開發實戰硬件驅動全解析

    0 入門 Linux 嵌入式開發!RK3506 開發板實戰教程系列開篇 在嵌入式設備開發,MIPI DSI接口(移動行業處理器接口)廣
    的頭像 發表于 01-06 07:09 ?531次閱讀
    <b class='flag-5'>RK</b>3506 MIPI轉HDMI顯示開發<b class='flag-5'>實戰</b>:<b class='flag-5'>從</b>硬件<b class='flag-5'>到</b>驅動全<b class='flag-5'>解析</b>