arm 唤醒ip核设计--gpio举例【原创】

ARM Cortex-A5 GPIO中断设计对比文档

GPIO中断功能 vs GPIO中断+唤醒功能


目录

  1. 设计概述
  2. 图A:GPIO仅中断功能设计
  3. 图B:GPIO中断+唤醒功能设计
  4. 设计差异对比
  5. 硬件连线详解

设计概述

本文档对比两种ARM Cortex-A5 SoC的GPIO中断设计方案:

  • 方案A:GPIO仅支持中断功能,不支持系统唤醒
  • 方案B:GPIO支持中断+唤醒功能,可在低功耗模式下唤醒系统

核心设计差异在于:

  1. GPIO IP核是否具备唤醒检测电路
  2. 是否引入PMU(电源管理单元)和唤醒源控制器
  3. GPIO信号连线:单路(仅IRQ)vs 双路(IRQ + Wakeup)
  4. 电源域划分:单一电源域 vs Always-On + Switchable电源域

重要技术澄清:GIC的唤醒功能

⚠️ 关键概念修正:

本文档展示了两种极端的设计方案,但实际上GIC v1及后续版本都支持唤醒中断功能。在实际SoC设计中,唤醒方式有以下几种:

方案对比

方案1:通过GIC retention唤醒(图C)

GPIO IRQ → GIC (配置为wakeup interrupt) → GIC.WakeUp_Req → Power Ctrl → 唤醒CPU
         同时GIC pending该中断 → CPU唤醒后立即处理中断
         
优点:统一的中断管理,CPU唤醒后立即知道唤醒源
缺点:GIC retention功耗较高(10-50μA)
适用:对功耗不敏感的场景(手机/平板/车载等有外接电源的设备)

方案2:GIC断电 + Always-On唤醒(图B,大部分嵌入式SoC采用)

GPIO Wakeup → Always-On检测器 → PMU → Power Ctrl → 上电GIC和CPU
         Always-On逻辑保持唤醒信号 → GIC上电后看到pending中断
         
优点:GIC完全断电,睡眠功耗最低(1-10μA级别)
缺点:需要额外的Always-On唤醒逻辑
适用:电池供电设备,对功耗敏感的嵌入式系统

实际设计中常见的分级睡眠:

  • 浅睡眠(WFI/Standby):GIC保持供电 → 使用GIC的WakeUp功能
  • 深睡眠(GIC断电):使用Always-On唤醒检测器 → PMU唤醒(大部分嵌入式SoC)

GIC的关键唤醒相关信号:

GIC接口信号:
  Input:  nIRQ[N:0]     - 中断输入(包括可配置为唤醒源的IRQ)
  Output: nIRQOUT/nFIQOUT - 中断输出到CPU
  Output: WakeUp_Req    - 唤醒请求输出到电源管理单元(GIC retention时使用)
  Input:  nWKUP_ACK     - 唤醒确认(从电源管理单元)

本文档展示了三种方案。实际嵌入式SoC设计中,由于功耗考虑,大部分采用图B方案(GIC断电 + Always-On唤醒逻辑),只有对功耗不敏感的设备才会使用图C方案(GIC retention)。


图A:GPIO仅中断功能设计

SoC内部架构图(ASCII)

+==============================================================================+
|                          ARM Cortex-A5 SoC                                   |
|                     (GPIO Interrupt Only - No Wakeup)                        |
+==============================================================================+
|                                                                              |
|   +-----------------+          +-------------------+       +--------------+  |
|   | External GPIO   |          |   GPIO Controller |       |     GIC      |  |
|   |     Pins        |          |    (GPIO IP Core) |       |   (Generic   |  |
|   |                 |          |                   |       |  Interrupt   |  |
|   | GPIO[0]  o------+--------->| Pin Mux           |       |  Controller) |  |
|   | GPIO[1]  o------+--------->| Direction Control |       |              |  |
|   | GPIO[2]  o------+--------->| Pull-up/down      |       |              |  |
|   | GPIO[3]  o------+--------->| Input Buffer      |       |              |  |
|   |   ...           |          | Output Buffer     |       |              |  |
|   | GPIO[n]  o------+--------->|                   |       |              |  |
|   |                 |          | +--------------+  |       |              |  |
|   +-----------------+          | | Interrupt    |  |       |              |  |
|                                | | Detection    |  | IRQ   |              |  |
|   External World               | | Logic        |  +------>| IRQ[m]       |  |
|                                | +--------------+  |       | Handler      |  |
|                                |   - Edge Detect  |       |              |  |
|                                |   - Level Detect |       | +----------+ |  |
|                                |   - IRQ Enable   |       | | Priority | |  |
|                                |                   |       | | Logic    | |  |
|                                +-------------------+       | +----------+ |  |
|                                                            |      |       |  |
|                                                            |   IRQ/FIQ    |  |
|                                                            +------+-------+  |
|                                                                   |          |
|                                                                   v          |
|                                                      +--------------------+  |
|                                                      | ARM Cortex-A5 Core |  |
|                                                      |                    |  |
|                                                      | +----------------+ |  |
|                                                      | | CPU            | |  |
|                                                      | | IRQ Handler    | |  |
|                                                      | +----------------+ |  |
|                                                      |                    |  |
|                                                      +--------------------+  |
|                                                                              |
|   Power Domain: VDDCORE (All modules in same power domain)                  |
|                                                                              |
+==============================================================================+

信号流向:
  External Pin --> GPIO Controller --> GIC --> CPU Core
                      (IRQ Line)

关键特性

  1. 单一信号路径

    • GPIO检测到中断事件 → 产生IRQ信号
    • IRQ信号送到GIC中断控制器
    • GIC根据优先级调度,发送IRQ/FIQ给CPU
    • CPU执行中断服务程序
  2. 电源域设计

    +---------------------------+
    |      VDDCORE Domain       |
    |  (All modules powered)    |
    |                           |
    |  - GPIO Controller        |
    |  - GIC                    |
    |  - CPU Core               |
    +---------------------------+
    
  3. 局限性

    • 系统进入深度睡眠时,VDDCORE断电
    • GIC和CPU处于掉电状态
    • GPIO中断信号无法唤醒系统
    • 只能在系统完全运行时响应中断
  4. 适用场景

    • 不需要低功耗模式的系统
    • 始终保持运行的嵌入式设备
    • 成本敏感的简单应用

图B:GPIO中断+唤醒功能设计

SoC内部架构图(ASCII)

+========================================================================================+
|                              ARM Cortex-A5 SoC                                         |
|                 (GPIO Interrupt with Wakeup Support)                                   |
+========================================================================================+
|                                                                                        |
|  +-----------------+       +------------------------+         +-----------------+      |
|  | External GPIO   |       |   GPIO Controller      |         |      GIC        |      |
|  |     Pins        |       |   (GPIO IP Core)       |         |   (Generic      |      |
|  |                 |       |   Enhanced with Wakeup |         |   Interrupt     |      |
|  | GPIO[0]  o------+------>| Pin Mux                |         |   Controller)   |      |
|  | GPIO[1]  o------+------>| Direction Control      |         |                 |      |
|  | GPIO[2]  o------+------>| Pull-up/down           |         | +-------------+ |      |
|  | GPIO[3]  o------+------>| Input/Output Buffer    |   IRQ   | | IRQ Handler | |      |
|  |   ...           |       |                        +-------->| | Priority    | |      |
|  | GPIO[n]  o------+------>| +-----------------+    |         | | Logic       | |      |
|  |                 |       | | Interrupt       |    |         | +-------------+ |      |
|  +-----------------+       | | Detection Logic |    |         |       |         |      |
|                            | | - Edge/Level    |    |         |    IRQ/FIQ      |      |
|  External World            | | - IRQ Enable    |    |         +-------+---------+      |
|                            | +-----------------+    |                 |                |
|                            |         |              |                 |                |
|                            | +-----------------+    |                 v                |
|                            | | Wakeup          |    |    +------------------------+    |
|                            | | Detection Logic |    |    |   ARM Cortex-A5 Core   |    |
|                            | | (Always-On)     |    |    |                        |    |
|                            | | - Edge Detect   |    |    | +--------------------+ |    |
|                            | | - Wakeup Enable |    |    | | CPU                | |    |
|                            | +-----------------+    |    | | IRQ Handler        | |    |
|                            |         |              |    | | Active/Sleep Mode  | |    |
|                            |    Wakeup_Req          |    | +--------------------+ |    |
|                            +---------|---------------+    +----------+-------------+    |
|                                      |                               ^                  |
|                                      v                               |                  |
|                      +----------------------------+                  |                  |
|                      |  PMU / Wakeup Source       |                  |                  |
|                      |  Controller                |                  |                  |
|                      |  (Power Management Unit)   |                  |                  |
|                      |  (Always-On Domain)        |                  |                  |
|                      |                            |                  |                  |
|                      | +------------------------+ |                  |                  |
|                      | | Wakeup Source Arbiter | |                  |                  |
|                      | | - GPIO Wakeup         | |                  |                  |
|                      | | - RTC Wakeup          | |                  |                  |
|                      | | - UART Wakeup         | |     Power-Up     |                  |
|                      | | - Other Sources       | |     Signal       |                  |
|                      | +------------------------+ |                  |                  |
|                      |            |               |                  |                  |
|                      |       System_Wakeup        |                  |                  |
|                      +------------|----------------+                  |                  |
|                                   |                                   |                  |
|                                   v                                   |                  |
|                      +----------------------------+                   |                  |
|                      |   Power Controller         |                   |                  |
|                      |   (Clock & Power Gating)   |                   |                  |
|                      |                            |                   |                  |
|                      | +------------------------+ |                   |                  |
|                      | | Power Sequencer       | |                   |                  |
|                      | | - VDDCORE Control     | +-------------------+                  |
|                      | | - Clock Enable        | |                                      |
|                      | | - Reset Release       | +----------------+                     |
|                      | +------------------------+ |                |                     |
|                      |                            |         Clock & Power                |
|                      +----------------------------+         Enable                       |
|                                                                  |                       |
|                                                                  v                       |
|  Power Domains:                                           +-----+-----+                 |
|                                                            | GIC Power |                 |
|  +------------------+     +----------------------+         |  Domain   |                 |
|  | Always-On Domain |     | Switchable Domain    |         +-----------+                 |
|  |                  |     |                      |                                       |
|  | - GPIO Wakeup    |     | - GIC                |                                       |
|  |   Logic          |     | - CPU Core           |                                       |
|  | - PMU            |     | - GPIO IRQ Logic     |                                       |
|  | - Power Ctrl     |     |                      |                                       |
|  +------------------+     +----------------------+                                       |
|                                                                                          |
+==========================================================================================+

信号流向:
  正常模式: External Pin --> GPIO Controller --> GIC --> CPU Core
                              (IRQ Line)
  
  睡眠唤醒: External Pin --> GPIO Wakeup Logic --> PMU --> Power Controller
                              (Wakeup_Req)              --> CPU/GIC Power-Up

关键特性

  1. 双路径信号设计

    路径1:中断路径(系统运行时)

    GPIO Pin --> Interrupt Detection Logic --> IRQ --> GIC --> CPU
    

    路径2:唤醒路径(系统睡眠时)

    GPIO Pin --> Wakeup Detection Logic --> Wakeup_Req --> PMU 
             --> System_Wakeup --> Power Controller --> Power-Up CPU/GIC
    
  2. 电源域划分

    +---------------------------------------------+
    | Always-On Domain (VDDALWAYS)                |
    |  - 始终供电,不受睡眠模式影响                |
    |  - GPIO Wakeup Detection Logic              |
    |  - PMU (Power Management Unit)              |
    |  - Power Controller                         |
    +---------------------------------------------+
    
    +---------------------------------------------+
    | Switchable Domain (VDDCORE)                 |
    |  - 可在睡眠模式下断电                        |
    |  - GPIO Interrupt Detection Logic           |
    |  - GIC (Generic Interrupt Controller)       |
    |  - ARM Cortex-A5 CPU Core                   |
    +---------------------------------------------+
    
  3. GPIO IP核内部结构差异

    图B的GPIO控制器需要额外的硬件逻辑:

    GPIO Controller Internal Architecture (Enhanced):
    
    +------------------------------------------------+
    |            GPIO Controller IP Core             |
    |                                                |
    |  Input Path:                                   |
    |  GPIO Pin --> Pin Mux --> Input Buffer         |
    |                    |                           |
    |          +---------+---------+                 |
    |          |                   |                 |
    |          v                   v                 |
    |  +----------------+  +------------------+      |
    |  | Interrupt      |  | Wakeup Detection |      |
    |  | Detection      |  | Logic            |      |
    |  | (VDDCORE)      |  | (VDDALWAYS)      |      |
    |  |                |  |                  |      |
    |  | - Edge Detect  |  | - Edge Detect    |      |
    |  | - Level Detect |  | - Polarity Set   |      |
    |  | - IRQ Mask     |  | - Wakeup Enable  |      |
    |  +-------+--------+  +--------+---------+      |
    |          |                    |                |
    |          v                    v                |
    |     IRQ Signal          Wakeup_Req             |
    |     (to GIC)            (to PMU)               |
    |                                                |
    |  Register Interface (APB/AHB):                 |
    |  - GPIO_DIR    : Direction Control             |
    |  - GPIO_DATA   : Data Register                 |
    |  - GPIO_IRQ_EN : IRQ Enable                    |
    |  - GPIO_IRQ_STS: IRQ Status                    |
    |  - GPIO_WK_EN  : Wakeup Enable  <-- 新增       |
    |  - GPIO_WK_POL : Wakeup Polarity <-- 新增      |
    |  - GPIO_WK_STS : Wakeup Status   <-- 新增      |
    +------------------------------------------------+
    
  4. 工作模式对比

    正常运行模式(Active Mode)

    Power State:  VDDALWAYS=ON, VDDCORE=ON
    
    GPIO Event --> Interrupt Path:
    ┌─────────────────────────────────────────────┐
    │ GPIO Pin Changes                            │
    │       ↓                                     │
    │ Interrupt Detection (edge/level)           │
    │       ↓                                     │
    │ Set IRQ Status Register                    │
    │       ↓                                     │
    │ Assert IRQ Signal to GIC                   │
    │       ↓                                     │
    │ GIC forwards IRQ/FIQ to CPU                │
    │       ↓                                     │
    │ CPU executes ISR (Interrupt Service)       │
    │       ↓                                     │
    │ Clear IRQ Status Register                  │
    └─────────────────────────────────────────────┘
    

    深度睡眠模式(Deep Sleep Mode)

    Power State:  VDDALWAYS=ON, VDDCORE=OFF
                  (GIC/CPU powered down)
    
    GPIO Event --> Wakeup Path:
    ┌─────────────────────────────────────────────┐
    │ GPIO Pin Changes (e.g., button press)      │
    │       ↓                                     │
    │ Wakeup Detection Logic (Always-On)         │
    │       ↓                                     │
    │ Set Wakeup Status Register                 │
    │       ↓                                     │
    │ Assert Wakeup_Req to PMU                   │
    │       ↓                                     │
    │ PMU arbiter collects wakeup sources        │
    │       ↓                                     │
    │ PMU asserts System_Wakeup                  │
    │       ↓                                     │
    │ Power Controller sequences power-up:       │
    │   1. Enable VDDCORE                        │
    │   2. Enable Clocks                         │
    │   3. Release Reset                         │
    │       ↓                                     │
    │ CPU/GIC powered up and running             │
    │       ↓                                     │
    │ OS reads Wakeup Status Register            │
    │       ↓                                     │
    │ Handle wakeup event in software            │
    │       ↓                                     │
    │ Clear Wakeup Status Register               │
    └─────────────────────────────────────────────┘
    
  5. 硬件成本与复杂度

    • 额外的IP核:PMU、Power Controller
    • GPIO IP增强:Wakeup detection logic(面积增加约15-25%)
    • 电源网络:需要独立的Always-On电源域
    • 时钟树:Always-On时钟源
    • 额外的连线:Wakeup信号总线
  6. 适用场景

    • 需要低功耗待机的移动设备
    • 电池供电的IoT设备
    • 需要快速唤醒响应的系统
    • 智能手机、平板电脑等消费电子产品

图C:通过GIC retention唤醒的方案

SoC内部架构图(ASCII)

GIC保持retention供电,适用于对功耗不敏感的场景

+==================================================================================+
|                          ARM Cortex-A5 SoC                                       |
|            (GPIO Interrupt with GIC Retention Wakeup)                            |
+==================================================================================+
|                                                                                  |
|  +-----------------+      +------------------------+      +------------------+   |
|  | External GPIO   |      |   GPIO Controller      |      |       GIC        |   |
|  |     Pins        |      |    (GPIO IP Core)      |      | (with WakeUp     |   |
|  |                 |      |                        |      |  capability)     |   |
|  | GPIO[0]  o------+----->| Pin Mux                |      |                  |   |
|  | GPIO[1]  o------+----->| Direction Control      |      | +-------------+  |   |
|  | GPIO[2]  o------+----->| Pull-up/down           |      | | IRQ/FIQ     |  |   |
|  | GPIO[3]  o------+----->| Input/Output Buffer    |      | | Controller  |  |   |
|  |   ...           |      |                        |      | +-------------+  |   |
|  | GPIO[n]  o------+----->| +-----------------+    |      |       |          |   |
|  |                 |      | | Interrupt       |    | IRQ  | +-------------+  |   |
|  +-----------------+      | | Detection Logic |    +----->| | Wakeup      |  |   |
|                           | | - Edge/Level    |    |      | | Interrupt   |  |   |
|  External World           | | - IRQ Enable    |    |      | | Config      |  |   |
|                           | +-----------------+    |      | | (per IRQ)   |  |   |
|                           |                        |      | +-------------+  |   |
|                           +------------------------+      |       |          |   |
|                                                           |  WakeUp_Req      |   |
|                      (GIC保持供电或retention供电)         +-------+----------+   |
|                                                                   |              |
|                                                                   v              |
|                           +--------------------------------------------+         |
|                           |        Power Management Unit (PMU)         |         |
|                           |                                            |         |
|                           | +----------------------------------------+ |         |
|                           | | Wakeup Source Controller               | |         |
|                           | | - Receives GIC.WakeUp_Req              | |         |
|                           | | - Receives other wakeup sources        | |         |
|                           | | - Arbitration logic                    | |         |
|                           | +----------------------------------------+ |         |
|                           |                 |                          |         |
|                           |           System_WakeUp                    |         |
|                           +-----------------+---------------------------+         |
|                                             |                                     |
|                                             v                                     |
|                           +--------------------------------------------+          |
|                           |      Power Controller                      |          |
|                           |      (Clock & Power Sequencer)             |          |
|                           |                                            |          |
|                           | Actions when WakeUp asserted:              |          |
|                           | 1. Restore CPU clock (if gated)            |          |
|                           | 2. Restore CPU power (if power-gated)      |          |
|                           | 3. Release CPU reset (if held)             |          |
|                           | 4. Assert WakeUp_Ack to GIC                |          |
|                           +--------------------+-----------------------+          |
|                                                |                                  |
|                                      Clock & Power Restore                        |
|                                                |                                  |
|                                                v                                  |
|                           +--------------------------------------------+          |
|                           |       ARM Cortex-A5 CPU Core               |          |
|                           |                                            |          |
|                           | Exit WFI (Wait For Interrupt) state        |          |
|                           | CPU resumes execution                      |          |
|                           | Immediately handle pending IRQ from GIC    | <--------+
|                           +--------------------------------------------+          |
|                                                ^                                  |
|                                                |                                  |
|                                           IRQ/FIQ (来自GIC的pending中断)          |
|                                                                                   |
|  关键优势:CPU唤醒后,GIC已经有pending的中断,立即进入中断处理,无需查询唤醒源    |
|                                                                                   |
+===================================================================================+

工作流程:
  1. CPU执行WFI指令进入睡眠
  2. Power Controller门控CPU时钟/电源(可选)
  3. GIC保持供电或retention供电,继续监听中断
  4. GPIO事件触发 → 中断信号到GIC
  5. GIC标记该IRQ为pending
  6. GIC检测到这是配置为wakeup的中断 → 发出WakeUp_Req
  7. PMU收到WakeUp_Req → 发出System_WakeUp
  8. Power Controller恢复CPU时钟和电源
  9. CPU退出WFI,立即响应GIC的pending中断
  10. 进入中断服务程序,处理GPIO事件

方案C的关键特性

  1. GIC配置为唤醒控制器

    GIC寄存器配置示例:
    
    GICD_CTLR:          使能GIC
    GICD_ISENABLERn:    使能GPIO中断
    GICD_IPRIORITYRn:   设置中断优先级
    GICD_WAKER:         配置唤醒能力 ⬅️ 关键寄存器
    GICD_ISACTIVERn:    Active状态
    
  2. 电源域设计(简化版)

    +--------------------------------------+
    | Retention Domain (低功耗保持)         |
    |  - GIC状态保持                       |
    |  - GPIO配置保持                      |
    |  - PMU                               |
    +--------------------------------------+
    
    +--------------------------------------+
    | Power-Gated Domain (可完全断电)       |
    |  - CPU Core                          |
    |  - L1 Cache                          |
    +--------------------------------------+
    
    注意:GIC不需要完全断电,只需保持状态
    
  3. 与图B的对比

    特性 图B(绕过GIC) 图C(通过GIC)
    GIC电源 可完全断电 需retention供电
    唤醒延迟 较长(需软件查询) 较短(硬件直达)
    中断响应 唤醒后查询+处理 唤醒即进入ISR
    软件复杂度 高(需查询唤醒源) 低(标准中断流程)
    功耗(睡眠) 最低 稍高(GIC retention)
    适用场景 最深度睡眠 常规睡眠模式
    设计复杂度
  4. Linux内核驱动配置

    /* 通过GIC唤醒的GPIO配置 */
    int gpio_setup_wakeup_irq(unsigned int gpio)
    {
        int irq = gpio_to_irq(gpio);
        
        /* 配置GPIO中断 */
        gpio_direction_input(gpio);
        
        /* 请求中断 */
        request_irq(irq, gpio_irq_handler, 
                    IRQF_TRIGGER_RISING, "gpio-wakeup", NULL);
        
        /* 关键:标记此IRQ为唤醒源 
         * 这会通知GIC和电源管理子系统 */
        enable_irq_wake(irq);  // ⬅️ 关键调用
        
        /* enable_irq_wake()内部会:
         * 1. 调用GIC驱动设置该IRQ为wakeup interrupt
         * 2. 通知PM框架此设备是唤醒源
         * 3. GIC配置GICD_WAKER相关位
         */
        
        return 0;
    }
    
    /* suspend时不需要特殊处理 */
    int gpio_suspend(struct device *dev)
    {
        /* GIC会自动保持wakeup IRQ的监听 */
        /* 不需要额外的唤醒源配置 */
        return 0;
    }
    
    /* resume时CPU已经在中断上下文 */
    irqreturn_t gpio_irq_handler(int irq, void *dev)
    {
        /* CPU被唤醒后直接进入这里 */
        /* 不需要查询唤醒源 */
        handle_gpio_event();
        return IRQ_HANDLED;
    }
    
  5. 优势总结

    • 软件简单:标准的Linux IRQ框架,只需调用enable_irq_wake()
    • 响应快速:CPU唤醒即进入ISR,无需查询
    • 硬件标准:ARM标准GIC功能,无需额外IP
    • 调试方便:标准的中断调试工具都能用
    • 功耗合理:GIC retention功耗通常在uA级别
  6. GIC Retention供电要求

    典型功耗数据:
    - GIC Active mode:    ~2-5 mW
    - GIC Retention mode: ~10-50 uA  ⬅️ 非常低
    - CPU Power-gated:    ~0 uA
    
    总待机功耗:~10-50 uA (主要是GIC retention)
    
    对比图B(GIC完全断电):~1-10 uA
    差异:约10倍,但绝对值都很小,对电池影响不大
    

方案C的适用场景(GIC retention)

  • 手机、平板电脑(有外接充电,对功耗相对不敏感)
  • 笔记本电脑的S3睡眠(AC供电场景)
  • 车载信息娱乐系统(车载供电)
  • 追求软件简单,不在意retention功耗的场景

注意:由于GIC retention功耗较高(10-50μA),实际嵌入式SoC设计中较少采用此方案。

方案B的适用场景(GIC断电,大部分嵌入式SoC采用)

  • IoT传感器节点(电池供电)
  • 可穿戴设备
  • 电池供电的远程设备
  • 智能家居设备
  • 对功耗敏感的嵌入式系统
  • 需要长待机时间的消费电子

说明:这是大部分嵌入式SoC采用的设计方案,通过让GIC完全断电实现最低的睡眠功耗。


深度睡眠唤醒机制详解(重要!)

问题场景:echo mem > /sys/power/state

当执行Linux的suspend-to-RAM(S3睡眠)时,系统进入深度睡眠模式。这时会出现一个关键问题:

如果GIC断电了,唤醒后CPU如何知道是哪个中断唤醒的?

这确实需要特殊的硬件机制来保持和重新注入唤醒中断。

三种实现方案

方案1:GIC Retention供电(适用于功耗不敏感场景)

Deep Sleep流程:

进入睡眠:
  1. CPU执行suspend代码
  2. 保存CPU上下文到RAM
  3. 配置唤醒源(enable_irq_wake的IRQ)
  4. CPU进入WFI,时钟门控
  5. CPU电源门控(可选)
  6. GIC切换到retention模式
     - 保持pending/active状态
     - 保持配置寄存器
     - 功耗:10-50uA(较高,对电池供电不友好)
     
睡眠中:
  GPIO事件 → GIC (retention mode)
  GIC记录pending状态 ⬅️ 状态被保持
  GIC发出WakeUp_Req → PMU
  
唤醒过程:
  PMU → Power Controller → 上电CPU
  GIC从retention切换到active
  GIC中的pending状态依然存在 ⬅️ 关键!
  CPU启动 → 看到GIC的pending IRQ
  立即进入中断服务程序
  
优点:
  ✅ CPU醒来立即知道唤醒源
  ✅ 标准的中断处理流程
  ✅ 软件简单(标准Linux suspend/resume)
  
适用:大多数消费电子产品的S3睡眠

方案2:Always-On中断保持逻辑(大部分嵌入式SoC采用)

这是GIC完全断电时的设计方案,大部分对功耗敏感的嵌入式SoC采用此方案:

硬件架构:

+========================================================================================+
|  GPIO IP              Always-On Wakeup Core            GIC (可断电)        CPU        |
|  =======              ====================             =============       ===        |
|                                                                                        |
|  [GPIO Pin]                                                                            |
|      |                                                                                 |
|      +--------> [Wakeup Detector] ----+                                                |
|      |          (Always-On)           |                                                |
|      |              |                 |                                                |
|      |           [Latch/              |                                                |
|      |            Hold Logic] --------+---> 信号保持直到被清除                          |
|      |              |                 |                                                |
|      |              v                 |                                                |
|      |          Wakeup_Status_Reg     |                                                |
|      |          (Always-On)           |                                                |
|      |              |                 |                                                |
|      |              v                 |                                                |
|      |          [PMU] ----------------+---> System_WakeUp                              |
|      |                                |                                                |
|      |                                v                                                |
|      |                          Power-Up Sequence                                      |
|      |                                |                                                |
|      |                                v                                                |
|      +----------------------> [GIC] <---------+ 关键:唤醒信号重新注入                  |
|                              上电后   |       |                                        |
|                                |      |   [Wakeup-to-IRQ                              |
|                                |      |    Re-injection Logic]                        |
|                                |      |    - 读取Wakeup_Status                        |
|                                |      |    - 重新触发对应的IRQ                         |
|                                |      |    - 或:保持GPIO信号直到                      |
|                                |      |          GIC采样到                            |
|                                v      |                                                |
|                              [CPU] <--+                                                |
|                                                                                        |
+========================================================================================+

详细流程:

进入深度睡眠:
  1. 软件配置GPIO唤醒使能(GPIO_WAKEUP_EN寄存器)
  2. 软件配置对应的IRQ为唤醒源(enable_irq_wake)
  3. 进入suspend,CPU断电
  4. GIC断电 ⬅️ 完全断电,状态丢失!
  5. Always-On的Wakeup Detector保持工作
  
睡眠中:
  GPIO事件 → Wakeup Detector (Always-On)
  Detector锁存(Latch)该事件 ⬅️ 关键:硬件锁存!
  Wakeup_Status寄存器置位(保持在Always-On域)
  发出Wakeup_Req → PMU
  
唤醒过程:
  PMU → Power Controller → 上电序列
  1. 恢复GIC电源
  2. 恢复GIC配置(从保存的上下文)
  3. 恢复CPU电源
  
  然后有两种方式让CPU看到唤醒中断:
  
  ===== 方式A:硬件自动重新注入 =====
  
  [Wakeup-to-IRQ Re-injection Logic] 的工作:
  
    a) 检测到GIC上电完成
    b) 读取Wakeup_Status寄存器(Always-On域)
    c) 将对应的GPIO信号"拉住"(hold)
    d) 这个被hold的信号作为IRQ输入到GIC
    e) GIC看到pending的IRQ
    f) CPU上电后看到GIC有pending IRQ
    g) 进入中断服务程序
    h) ISR中清除中断标志
    i) GPIO信号被释放
  
  硬件实现示例:
  ```verilog
  // 伪代码示意
  always @(posedge clk or negedge rst_n) begin
      if (!rst_n) begin
          irq_hold <= 0;
      end else if (wakeup_detected && !gic_powered) begin
          // 锁存唤醒事件
          irq_hold <= 1;
      end else if (gic_powered && irq_hold) begin
          // GIC上电后,保持IRQ信号
          gpio_irq_to_gic <= 1;  // 拉住IRQ给GIC
      end else if (irq_cleared_by_cpu) begin
          // CPU清除了中断
          irq_hold <= 0;
          gpio_irq_to_gic <= 0;
      end
  end

===== 方式B:软件查询后触发 =====

a) CPU上电后,先进入resume代码
b) resume代码读取Wakeup_Status寄存器
c) 识别唤醒源是GPIO[n]
d) 软件触发一个软件中断或直接调用handler
e) 清除Wakeup_Status

缺点:不是真正的"中断"唤醒,是"轮询"唤醒


#### 方案3:混合方案(支持不同睡眠深度)

实际的SoC通常支持多个睡眠深度:

睡眠级别对比:

+--------------------------------------------------------------------------------+
| 睡眠模式 | CPU状态 | GIC状态 | 唤醒机制 | 唤醒延迟 |
+--------------------------------------------------------------------------------+
| WFI | 时钟门控 | 全功能运行 | GIC直接唤醒CPU | <1μs |
| (浅睡眠) | | | | |
+--------------------------------------------------------------------------------+
| Standby | 断电 | Retention | GIC.WakeUp_Req→PMU | <1ms |
| (中度睡眠) | | (状态保持) | GIC保持pending | |
+--------------------------------------------------------------------------------+
| Suspend | 断电 | Retention或 | 方式1: GIC retention | 1-10ms |
| (S3/mem) | | 断电 | 方式2: Always-On逻辑 | |
+--------------------------------------------------------------------------------+
| Hibernate | 断电 | 断电 | 必须用Always-On逻辑 | 100ms-1s |
| (S4/disk) | | | 需要从存储恢复系统 | |
+--------------------------------------------------------------------------------+

Linux的 echo mem > /sys/power/state 通常对应 Suspend (S3)

不同SoC实现:

  • ARM Versatile/RealView: 通常GIC retention
  • Samsung Exynos: 支持GIC retention和完全断电两种模式
  • Qualcomm Snapdragon: GIC retention (大多数情况)
  • NXP i.MX: 混合方案,根据睡眠深度选择

### 关键硬件设计要点

**如果需要支持GIC断电后的中断唤醒,必须实现:**

1. **Always-On的事件锁存器**

作用:在GIC断电期间保持唤醒事件
位置:Always-On电源域
功能:
- 检测唤醒事件(边沿/电平)
- 锁存事件直到被清除
- 状态寄存器可被CPU读取


2. **唤醒信号保持逻辑(关键设计点)**

作用:确保GIC上电后能看到pending的中断

实现方式:
Option A: 电平保持
- Wakeup logic保持GPIO IRQ信号为高
- 这个信号连接到GIC的IRQ输入
- GIC上电后立即看到pending IRQ
- CPU清除中断后,信号才释放

Option B: 脉冲重新生成
- 检测到GIC上电
- 生成一个IRQ脉冲注入到GIC
- 模拟原始的中断事件


3. **GIC上电后的同步机制**
  • 确保GIC配置完全恢复后才释放IRQ信号
  • 避免GIC配置未完成就收到中断
  • 使用握手信号:GIC_Ready → 释放IRQ

### 实际案例分析

**案例1:树莓派 (BCM2835/BCM2711)**

实现:GIC retention供电
方式:简单的retention模式
功耗:约30-50μA (GIC + 基础外设)


**案例2:高通骁龙 (Snapdragon)**

实现:混合方案

  • 浅睡眠:GIC retention
  • 深睡眠:部分使用Always-On逻辑
  • MPM (Modem Power Manager) 作为Always-On唤醒控制器
    功耗:深睡眠 < 5mA (整机)

**案例3:NXP i.MX6/i.MX8**

实现:多级睡眠

  • WAIT模式:GIC全功能
  • STOP模式:GIC retention
  • SUSPEND模式:GIC断电 + GPC (General Power Controller)
    GPC的作用:
  • 收集所有唤醒源
  • 保持唤醒事件
  • 上电后重新注入到GIC

### Linux驱动实现考虑

```c
/* 深度睡眠的suspend实现 */
static int gpio_suspend_noirq(struct device *dev)
{
    struct gpio_chip *chip = dev_get_drvdata(dev);
    
    /* 如果GIC会断电,需要特殊处理 */
    if (gic_will_poweroff()) {
        /* 配置Always-On的wakeup detector */
        gpio_enable_wakeup_detector(chip);
        
        /* 配置唤醒源到PMU */
        pmu_register_wakeup_source(WAKEUP_GPIO, chip->wakeup_mask);
        
        /* 配置中断重新注入逻辑(如果有硬件支持) */
        gpio_enable_irq_reinjection(chip);
    }
    
    return 0;
}

static int gpio_resume_noirq(struct device *dev)
{
    struct gpio_chip *chip = dev_get_drvdata(dev);
    u32 wakeup_status;
    
    if (gic_was_poweroff()) {
        /* 读取唤醒状态 */
        wakeup_status = gpio_read_wakeup_status(chip);
        
        if (wakeup_status) {
            /* 方式1:如果有硬件重新注入,等待中断触发 */
            if (has_hw_reinjection()) {
                /* 中断会自动触发,无需特殊处理 */
                gpio_clear_wakeup_status(chip, wakeup_status);
            }
            /* 方式2:软件触发对应的中断处理 */
            else {
                int gpio = ffs(wakeup_status) - 1;
                int irq = gpio_to_irq(gpio);
                
                /* 记录唤醒事件 */
                pm_wakeup_event(dev, 0);
                
                /* 手动触发中断处理(不完美的方案) */
                generic_handle_irq(irq);
                
                gpio_clear_wakeup_status(chip, wakeup_status);
            }
        }
    }
    
    return 0;
}

深度睡眠唤醒机制总结

当GIC需要完全断电时,硬件设计需要一个专门的Always-On唤醒IP核来保持唤醒IO信号,确保GIC上电后能够看到pending的中断。这是深度睡眠唤醒的关键设计。

核心机制:

  1. Always-On的Wakeup Detector - 在GIC断电时保持工作
  2. 事件锁存/保持逻辑 - 锁存唤醒事件直到GIC处理完成
  3. IRQ信号保持/重新注入 - 确保GIC上电后能看到pending的中断
  4. 同步握手机制 - 确保正确的时序

这样设计后,即使在echo mem > /sys/power/state导致GIC断电的情况下,CPU醒来后仍然能够:

  • ✅ 知道是哪个GPIO唤醒的
  • ✅ 进入正确的中断服务程序
  • ✅ 保持标准的Linux中断处理流程

设计差异对比

核心差异总结表(三方案对比)

+================================================================================================================+
|  对比项目          |   图A (仅中断)    |   图C (GIC retention) |   图B (GIC断电唤醒)       |
+================================================================================================================+
| GPIO信号输出       | 单路: IRQ→GIC     | 单路: IRQ→GIC        | 双路: IRQ→GIC              |
|                   |                   | GIC输出WakeUp_Req    |      Wakeup_Req→PMU        |
+----------------------------------------------------------------------------------------------------------------+
| GIC作用           | 标准中断控制器     | 中断控制器+唤醒控制   | 仅中断(唤醒时可能断电)     |
+----------------------------------------------------------------------------------------------------------------+
| 电源域划分         | 单一: VDDCORE     | Retention + Gated    | Always-On + Switchable     |
|                   |                   | GIC: retention供电   | GIC: 可完全断电            |
+----------------------------------------------------------------------------------------------------------------+
| GPIO IP复杂度     | 基础中断逻辑       | 基础中断逻辑         | 基础 + 独立唤醒逻辑        |
|                   | 面积: 100%        | 面积: 100%           | 面积: 115-125%             |
+----------------------------------------------------------------------------------------------------------------+
| 额外IP核          | 无                | PMU(标准)            | PMU + 唤醒仲裁器           |
+----------------------------------------------------------------------------------------------------------------+
| 寄存器接口         | 标准GPIO寄存器     | 标准GPIO寄存器       | 标准 + 唤醒控制寄存器      |
|                   | - DIR, DATA       | - DIR, DATA          | - DIR, DATA                |
|                   | - IRQ_EN/STS      | - IRQ_EN/STS         | - IRQ_EN/STS               |
|                   |                   | GIC:GICD_WAKER       | - WK_EN/POL/STS            |
+----------------------------------------------------------------------------------------------------------------+
| 深度睡眠支持       | 不支持            | 支持(CPU可断电)      | 支持(CPU+GIC可断电)        |
+----------------------------------------------------------------------------------------------------------------+
| 唤醒机制          | N/A               | GIC硬件唤醒          | 软件查询唤醒源             |
|                   |                   | CPU醒来即处理中断    | 需要读取状态寄存器         |
+----------------------------------------------------------------------------------------------------------------+
| 唤醒延迟          | N/A               | < 1ms (快)           | 1-10ms (较慢)              |
|                   |                   | 直接进入ISR          | 需要软件查询               |
+----------------------------------------------------------------------------------------------------------------+
| 功耗(睡眠)        | mW级(全供电)       | 10-50μA (GIC ret.)   | 1-10μA (最低)              |
+----------------------------------------------------------------------------------------------------------------+
| 硬件成本          | 低                | 中 (标准ARM方案)     | 中高 (额外唤醒逻辑)        |
+----------------------------------------------------------------------------------------------------------------+
| 软件驱动复杂度     | 简单              | 简单                 | 中等                       |
|                   | 标准IRQ           | enable_irq_wake()    | 唤醒源查询+IRQ             |
+----------------------------------------------------------------------------------------------------------------+
| 调试难度          | 低                | 低 (标准工具)        | 中 (需要额外工具)          |
+----------------------------------------------------------------------------------------------------------------+
| ARM标准兼容性     | 标准              | 标准 (GICv1+)        | 非标准 (厂商自定义)        |
+----------------------------------------------------------------------------------------------------------------+
| 睡眠功耗          | mW级(不适合电池)  | 10-50μA (较高)       | 1-10μA (最低)              |
|                   |                   | GIC retention开销大  | 真正的超低功耗             |
+----------------------------------------------------------------------------------------------------------------+
| 典型应用          | 工控、服务器       | 手机、平板            | 大部分嵌入式SoC            |
|                   | 路由器、网关       | 笔记本(AC供电场景)  | IoT传感器、可穿戴          |
|                   | 始终供电设备       | 对功耗不敏感设备       | 电池供电设备               |
+================================================================================================================+

适用场景说明:
  图A: 适用于无低功耗需求、始终供电的场景
  图C: 适用于对功耗不敏感、追求软件简单的场景(功耗较高,实际较少使用)
  图B: 大部分嵌入式SoC采用的方案,真正实现超低功耗睡眠

信号连接对比

图A - GPIO中断连线:

                     简单单路连接
                     
GPIO IP              GIC              CPU
+------+            +---+            +---+
| IRQ  +----------->|   +----------->|   |
+------+    IRQ     +---+   IRQ/FIQ  +---+
  (1根信号线)

图B - GPIO中断+唤醒连线:

                     双路连接设计
                     
GPIO IP              GIC              CPU
+------+            +---+            +---+
| IRQ  +----------->|   +----------->|   |
+--+---+    IRQ     +-+-+   IRQ/FIQ  +-^-+
   |                  |                |
   | Wakeup_Req       | Power_Req      |
   |                  |                |
   |       +----------+----------------+
   |       | Power Control             |
   v       v                           |
 +-----------+    System_Wakeup        |
 |    PMU    +------------------------+
 +-----------+
  (2根主信号线 + 电源控制)

硬件连线详解

图A的连线设计(简单中断)

物理连接拓扑:

External World          GPIO Controller           GIC                 CPU Core
==============          ===============           ===                 ========

  GPIO Pins              Input Stage
     |                      |
 [Button] ----            [Sync] ----           [Arbiter]           [Exception]
 [Sensor] ----   GPIO     [Filter]    IRQ[31:0] [Priority]  IRQ/FIQ [Handler]
 [Switch] ---- > Pad  --> [Debounce] --------> [Enable]  --------> [Vector]
     |           Mux       [Edge]               [Pending]           [Table]
     |                     [Level]              [Active]
     |                        |
     |                    IRQ Logic
     |                        |
     |                   (VDDCORE Domain - 全部可断电)
     
连线说明:
  1. GPIO Pad → Interrupt Logic:  芯片内部直连
  2. IRQ[n] → GIC:                硬件中断请求线 (Single bit per GPIO)
  3. GIC → CPU:                   IRQ/FIQ exception signals
  
信号特性:
  - IRQ信号: 电平/边沿触发,Active-High
  - 总线宽度: 每个GPIO一根IRQ线,或多个GPIO共享一根IRQ线
  - 同步深度: 2-3级寄存器同步(防止亚稳态)

图B的连线设计(中断+唤醒)

物理连接拓扑(多路径):

External World    GPIO Controller          GIC           PMU           Power Ctrl    CPU
==============    ===============          ===           ===           ==========    ===

  GPIO Pins       Input Stage                                                        
     |               |                                                               
 [Button] ----    [Sync] ----                                                        
 [Sensor] ---- >  [Filter]                                                          
 [Switch] ----    [Debounce]                                                        
     |               |                                                               
     |          +----+----+                                                          
     |          |         |                                                          
     |    (VDDCORE)  (VDDALWAYS)                                                    
     |          |         |                                                          
     |    +-----v----+ +--v------+                                                   
     |    | IRQ      | | Wakeup  |                                                   
     |    | Detection| | Detection|                                                  
     |    | Logic    | | Logic   |                                                   
     |    +-----+----+ +----+----+                                                   
     |          |           |                                                        
     |       IRQ[n]    Wakeup_Req[m]                                                
     |          |           |                                                        
     |          v           v                                                        
     |      +-------+   +---------+      +----------+                               
     |      |  GIC  |   |   PMU   |      |  Power   |                               
     |      |       |   | Wakeup  | ---> | Sequence | ------+                       
     |      |       |   | Arbiter |      | Control  |       |                       
     |      +---+---+   +---------+      +----+-----+       |                       
     |          |                             |             |                       
     |       IRQ/FIQ                    Clock/Power         |                       
     |          |                          Enable            |                       
     |          v                             |             |                       
     |      +---------------------------------------+        |                       
     +----> |         ARM Cortex-A5 CPU Core       | <------+                       
            |   (可被唤醒、可被中断)                |                               
            +---------------------------------------+                               

连线说明:
  Path 1 (正常中断):
    GPIO → IRQ Logic → GIC → CPU
    
  Path 2 (睡眠唤醒):
    GPIO → Wakeup Logic → PMU → Power Ctrl → CPU Power-up
                                           → GIC Power-up
    
电源域划分:
  VDDALWAYS Domain:  GPIO Wakeup Logic, PMU, Power Controller
  VDDCORE Domain:    GPIO IRQ Logic, GIC, CPU Core
  
信号特性:
  - IRQ信号:      同图A,但可在睡眠时被mask
  - Wakeup_Req:   边沿触发,Active-High,异步信号
  - System_Wakeup: 电平信号,保持至系统稳定
  - Power/Clock:  序列化控制,有严格的时序要求

GPIO IP内部连线差异

图A的GPIO IP内部:

Pin → Input Buffer → Interrupt Path → IRQ Output
                          ↓
                    (单一路径,简单)

图B的GPIO IP内部:

                    +---> IRQ Logic (VDDCORE) -----> IRQ[n]
                    |     - Edge/Level Detect
                    |     - IRQ Enable/Status
                    |     - Sync Chain
Pin → Input Buffer -+
                    |
                    +---> Wakeup Logic (VDDALWAYS) -> Wakeup_Req[m]
                          - Edge Detect Only
                          - Wakeup Enable/Status
                          - Async/Sync Crosser
                          
关键点:
  1. 输入信号需要fan-out到两个电源域
  2. Wakeup Logic必须能处理异步输入(系统时钟可能已停)
  3. 需要CDC (Clock Domain Crossing)电路在两个域之间
  4. Wakeup状态寄存器需要在唤醒后能被CPU读取

完整的信号时序示例

图B唤醒过程的信号时序:

时间轴 (μs) →
                                                                       
GPIO Pin     ___________/‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾  (按键按下)
                       ↑
                       t0
                       
Wakeup_Req   _______________/‾‾‾‾‾‾‾\___________  (检测到唤醒事件)
                           ↑       ↑
                           t1      t2 (约1-2μs)
                           
System_Wakeup ________________/‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾  (PMU发起唤醒)
                             ↑
                             t3 (约0.5μs)
                             
VDDCORE      ___________________/‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾  (电源上电)
                               ↑
                               t4 (约100-500μs)
                               
Core_Clock   ____________________/‾\/‾\/‾\/‾\___  (时钟恢复)
                                 ↑
                                 t5 (约10-50μs)
                                 
CPU_Active   _______________________/‾‾‾‾‾‾‾‾‾‾‾  (CPU开始运行)
                                    ↑
                                    t6
                                    
IRQ Signal   ________________________/‾‾‾‾\____  (可选:触发中断)
                                     ↑    ↑
                                     t7   t8

关键时间点:
  t0: GPIO输入变化
  t1: Wakeup Logic检测到事件(约0.5-1μs延迟)
  t3: PMU开始唤醒流程
  t4: 电源上电开始(这是最耗时的部分)
  t5: 时钟稳定
  t6: CPU开始执行(总唤醒延迟约 1-10ms)
  
总唤醒延迟 = t6 - t0 ≈ 1-10ms (取决于电源系统设计)

实现考虑和设计要点

1. 电源域隔离设计

关键技术点:

电源域交互:

VDDALWAYS Domain              VDDCORE Domain
================              ==============

[Wakeup Logic]                [IRQ Logic]
     |                             |
     |  Level Shifter /            |
     |  Isolation Cell             |
     +-----------------------------+
              |
         Input Signal
         
隔离单元设计:
  - 使用Isolation Cell防止浮空信号
  - VDDCORE断电时,Isolation Cell输出固定值(通常为0)
  - Level Shifter处理不同电压域(如1.8V ↔ 1.2V)
  
Retention寄存器:
  - Wakeup配置寄存器需要保持供电
  - 使用Retention Flop或Battery-backed SRAM
  - 唤醒后状态寄存器必须可读

2. 时钟域交叉(CDC)处理

Wakeup Path的CDC设计:

Always-On Clock Domain        System Clock Domain
======================        ===================

[GPIO Input]                  
     |                        
     | (Async)                
     v                        
[Edge Detector] ----------+   
  (Free-running)          |   
                          |   
                    [Sync Chain]
                      (2-3 FF)
                          |
                          v
                    [Wakeup Status]
                          |
                          v
                       [To PMU]

关键设计:
  1. 边沿检测器使用Always-On时钟(通常是32KHz RTC)
  2. 同步链防止亚稳态
  3. 握手协议确保信号传递可靠性
  4. Gray码用于多bit信号的跨时钟域传输

3. 软件驱动差异

图A的驱动代码示例(简化):

/* 简单的GPIO中断驱动 */
int gpio_request_irq(unsigned int gpio, irq_handler_t handler)
{
    /* 配置GPIO为输入 */
    gpio_set_direction(gpio, GPIO_INPUT);
    
    /* 配置中断触发类型 */
    writel(IRQ_EDGE_RISING, GPIO_IRQ_TYPE(gpio));
    
    /* 使能中断 */
    writel(1 << gpio, GPIO_IRQ_ENABLE);
    
    /* 注册中断处理函数 */
    request_irq(gpio_to_irq(gpio), handler, 0, "gpio-irq", NULL);
    
    return 0;
}

/* 中断处理 */
irqreturn_t gpio_irq_handler(int irq, void *dev)
{
    /* 读取中断状态 */
    u32 status = readl(GPIO_IRQ_STATUS);
    
    /* 处理中断 */
    handle_gpio_event(status);
    
    /* 清除中断标志 */
    writel(status, GPIO_IRQ_CLEAR);
    
    return IRQ_HANDLED;
}

图B的驱动代码示例(增强):

/* GPIO中断+唤醒驱动 */
int gpio_request_irq_wakeup(unsigned int gpio, irq_handler_t handler)
{
    /* 基础中断配置(同图A)*/
    gpio_set_direction(gpio, GPIO_INPUT);
    writel(IRQ_EDGE_RISING, GPIO_IRQ_TYPE(gpio));
    writel(1 << gpio, GPIO_IRQ_ENABLE);
    request_irq(gpio_to_irq(gpio), handler, 0, "gpio-irq", NULL);
    
    /* 额外的唤醒配置 */
    writel(WAKEUP_EDGE_RISING, GPIO_WAKEUP_POL(gpio));  // 唤醒极性
    writel(1 << gpio, GPIO_WAKEUP_ENABLE);              // 使能唤醒
    
    /* 标记此IRQ为唤醒源 */
    enable_irq_wake(gpio_to_irq(gpio));
    
    return 0;
}

/* 系统挂起时的处理 */
int gpio_suspend(struct device *dev)
{
    /* 保存IRQ配置 */
    saved_irq_config = readl(GPIO_IRQ_ENABLE);
    
    /* 禁用非唤醒源的IRQ */
    writel(0, GPIO_IRQ_ENABLE);
    
    /* 确保唤醒源已配置 */
    u32 wakeup_mask = readl(GPIO_WAKEUP_ENABLE);
    if (wakeup_mask) {
        /* 配置PMU唤醒源 */
        pmu_enable_wakeup_source(WAKEUP_SOURCE_GPIO);
    }
    
    return 0;
}

/* 系统唤醒后的处理 */
int gpio_resume(struct device *dev)
{
    /* 读取唤醒原因 */
    u32 wakeup_status = readl(GPIO_WAKEUP_STATUS);
    
    if (wakeup_status) {
        /* 记录唤醒源 */
        pm_wakeup_event(dev, 0);
        
        /* 清除唤醒标志 */
        writel(wakeup_status, GPIO_WAKEUP_CLEAR);
    }
    
    /* 恢复IRQ配置 */
    writel(saved_irq_config, GPIO_IRQ_ENABLE);
    
    return 0;
}

4. 硬件验证要点

图A的验证项:

□ GPIO中断功能测试
  □ 上升沿触发
  □ 下降沿触发
  □ 高电平触发
  □ 低电平触发
  □ 中断优先级
  □ 中断嵌套
  
□ 性能测试
  □ 中断延迟测量
  □ 最大中断频率
  □ 多GPIO同时中断

图B的额外验证项:

□ 唤醒功能测试
  □ 深度睡眠唤醒
  □ 浅度睡眠唤醒
  □ 唤醒延迟测量
  □ 唤醒源识别
  □ 多唤醒源仲裁
  
□ 电源管理测试
  □ 电源域切换
  □ Always-On域功耗
  □ 唤醒后状态保持
  □ Retention寄存器验证
  
□ CDC (Clock Domain Crossing)测试
  □ 亚稳态注入测试
  □ 跨时钟域信号完整性
  □ 异步信号可靠性
  
□ 低功耗测试
  □ 待机功耗测量
  □ 唤醒功耗测量
  □ 电池续航测试

5. 成本-功耗-性能权衡

设计选择矩阵:

+================================================================================+
| 应用场景              | 适用方案 | 理由                                            |
+================================================================================+
| 服务器/工作站         | 图A      | 始终供电,不需要低功耗,成本优先                |
+--------------------------------------------------------------------------------+
| 工业控制系统          | 图A      | 可靠性优先,电源稳定,无电池限制                |
+--------------------------------------------------------------------------------+
| 汽车电子(非休眠)      | 图A      | 12V电源充足,不需要复杂电源管理                 |
+--------------------------------------------------------------------------------+
| 智能手机/平板         | 图B      | 电池供电,待机时间关键,必须支持唤醒            |
+--------------------------------------------------------------------------------+
| IoT传感器节点         | 图B      | 电池供电,超低功耗要求,大部分时间休眠          |
+--------------------------------------------------------------------------------+
| 可穿戴设备            | 图B      | 小电池,待机时间长,频繁唤醒                    |
+--------------------------------------------------------------------------------+
| 便携式医疗设备        | 图B      | 电池供电,快速响应,低功耗                      |
+--------------------------------------------------------------------------------+
| 笔记本电脑            | 图B      | 需要睡眠/唤醒,键盘/触摸板唤醒                  |
+================================================================================+

成本对比(相对于图A):
  图B额外成本 ≈ +20% ~ +35%
  - GPIO IP: +15-25%
  - PMU IP: 新增
  - Power Controller: 新增
  - 电源网络: +5-10%
  - PCB布局复杂度: +10%
  
功耗对比(典型值):
  运行模式: 
    图A: 100-200mW (全系统)
    图B: 100-200mW (全系统) - 相同
    
  睡眠模式:
    图A: 10-50mW (需保持核心供电)
    图B: 10-100μW (仅Always-On域) - 节省99%+

总结

核心设计差异(三方案)

  1. 信号路径

    • 图A:单路GPIO → GIC → CPU(无睡眠支持)
    • 图C:GPIO → GIC → CPU,同时GIC.WakeUp_Req → PMU(GIC retention)
    • 图B:双路GPIO → {GIC → CPU, 独立Wakeup → PMU}(大部分嵌入式SoC)
  2. 电源架构

    • 图A:单一VDDCORE域(始终供电)
    • 图C:GIC Retention域 + CPU Power-gated域(功耗较高)
    • 图B:Always-On域 + Switchable域(GIC可完全断电,功耗最低)
  3. GIC的角色

    • 图A:仅中断控制器
    • 图C:中断控制器 + 唤醒控制器(ARM标准,但功耗高)
    • 图B:中断控制器(唤醒时断电,唤醒功能由Always-On逻辑实现)
  4. GPIO IP复杂度

    • 图A:基础中断检测(100%面积)
    • 图C:基础中断检测(100%面积)
    • 图B:中断检测 + 独立唤醒检测(115-125%面积)
  5. 软件复杂度

    • 图A:标准IRQ处理
    • 图C:标准IRQ + enable_irq_wake()最简单的唤醒方案
    • 图B:IRQ处理 + 唤醒源查询 + 状态管理

选型说明

选择图A的情况:

  • 不需要任何低功耗模式
  • 系统始终全速运行
  • AC供电,功耗不敏感
  • 工业控制系统、服务器、路由器
  • 适用场景:始终供电的嵌入式设备

选择图C的情况(GIC retention供电):

  • 对功耗不太敏感的场景
  • 追求软件简单的场景
  • 可以接受10-50μA的GIC retention功耗
  • 注意:实际嵌入式SoC较少采用此方案
  • 适用场景:
    • 手机、平板电脑(外接电源充电场景)
    • 笔记本电脑(S3睡眠)
    • 车载信息娱乐系统(车载供电)
  • 局限性:GIC retention功耗较高,对于电池供电设备不友好

选择图B的情况(GIC可完全断电,大部分嵌入式SoC采用):

  • 电池供电设备(对功耗敏感)
  • 需要真正的超低功耗睡眠(1-10μA级别)
  • 大部分嵌入式SoC的标准设计
  • 适用场景:
    • IoT传感器节点
    • 可穿戴设备
    • 电池供电的远程设备
    • 智能家居设备
    • 工业无线传感器
    • 需要长待机时间的消费电子
  • 设计特点:需要额外的Always-On唤醒逻辑,但换取最低的睡眠功耗

决策流程图(ASCII)

                    开始选择GPIO中断方案
                            |
                            v
              需要系统进入低功耗睡眠模式?
                    /              \
                  否                 是
                  |                  |
                  v                  v
            +----------+      对睡眠功耗敏感吗?
            |  图A     |      (电池供电?)
            | 标准中断  |         /              \
            +----------+       否                 是
            (无低功耗)         |                  |
                              v                  v
                      +-------------+      +----------+
                      |    图C      |      |   图B    |
                      | GIC retention|      | GIC断电  |
                      | (功耗较高)  |      | (超低功耗)|
                      +-------------+      +----------+
                      (手机/平板/   |      (IoT/可穿戴/
                       车载等)      |       传感器等)
                                    |
                            大部分嵌入式SoC采用

注:电池供电设备通常采用图B方案以获得最低睡眠功耗

实现复杂度评估

实现难度评分(1-10分,10最难):

+--------------------------------------------------+
| 设计阶段              | 图A  | 图B  | 增加复杂度  |
+--------------------------------------------------+
| RTL设计               |  3   |  7   |  +133%      |
| 电源网络设计           |  2   |  8   |  +300%      |
| 时钟树设计             |  3   |  7   |  +133%      |
| 物理设计/布局          |  4   |  7   |  +75%       |
| 验证/仿真              |  4   |  8   |  +100%      |
| 软件驱动开发           |  3   |  6   |  +100%      |
| 系统集成测试           |  4   |  8   |  +100%      |
+--------------------------------------------------+
| 平均                  | 3.3  | 7.3  |  +121%      |
+--------------------------------------------------+

结论: 图B的唤醒支持使整体设计复杂度提升约120%,但为现代移动和IoT设备提供了必不可少的低功耗能力。对于需要电池供电的应用,额外的设计投入是完全值得的,因为它可以将待机功耗降低99%以上,显著延长电池寿命。


参考设计规范

相关ARM文档

  • ARM Cortex-A5 Technical Reference Manual
  • ARM Generic Interrupt Controller (GIC) Architecture Specification
  • ARM Power State Coordination Interface (PSCI)

电源管理标准

  • ACPI (Advanced Configuration and Power Interface)
  • Device Tree Power Domain Bindings
  • Linux Kernel PM (Power Management) Framework

设计检查清单

图A实现检查:

□ GPIO中断检测逻辑已实现
□ GIC连接正确配置
□ 中断优先级设置合理
□ 中断服务程序已测试
□ 边沿/电平触发工作正常
□ 去抖动逻辑已实现(如需要)
□ 驱动程序已完成

图B额外检查:

□ Always-On电源域已规划
□ Wakeup检测逻辑已实现
□ PMU集成完成
□ Power Sequencer已验证
□ CDC电路已通过时序检查
□ Isolation Cell已插入
□ Retention寄存器已配置
□ 唤醒延迟满足要求 (<10ms)
□ 待机功耗满足要求 (<100μW)
□ 唤醒源可正确识别
□ suspend/resume流程已测试
□ 电池续航测试已通过

文档版本: v1.0
创建日期: 2025-12-12
适用平台: ARM Cortex-A5 + GIC
作者说明: 本文档使用ASCII字符绘图,便于在纯文本环境下查看和编辑


End of Document

posted @ 2025-12-12 23:33  Sky&Zhang  阅读(0)  评论(0)    收藏  举报