Skip to main content

K230 PMU使用指南

1. 功能介绍

PMU模块提供了6个输入和2个输出端口,每个端口功能如下:

  1. INT0被默认用作开关机按键,支持长按开机、长按关机事件上报、超长按强制关机、电平或边沿事件上报,支持去抖动,两种长按时间可配
  2. INT1支持电平或边沿检测、边沿计数检测,均支持触发开机和上报事件,支持去抖动,边沿计数值可配(建议不要同时打开两种检测模式,边沿检测功能会被覆盖)
  3. INT2支持电平或边沿检测,支持触发开机和上报事件,支持去抖动
  4. INT3支持电平或边沿检测,支持触发开机和上报事件,支持去抖动
  5. INT4支持电平或边沿检测,支持触发开机和上报事件(建议使用边沿检测)
  6. INT5支持电平或边沿检测,支持触发开机和上报事件(建议使用边沿检测)
  7. OUTPUT0用于控制PMIC
  8. OUTPUT1暂未使用

PMU模块还提供了64Byte的log存储功能,其中最后4Byte被驱动使用,剩余60Byte留给用户

2. 用户控制

用户可通过设备树和sysfs来控制PMU,系统启动时通过设备树来配置PMU,启动后用户还可通过sysfs动态配置PMU

2.1 PMU设备树配置

pmu: pmu@0x91000000 {
compatible = "kendryte, k230-pmu";
reg = <0x0 0x91000000 0x0 0xb0>;
interrupt-parent = <&intc>;
interrupts = <175>;
status = "disabled";
/*
int0 {
force-powerdown-value = <320000>;
power-event-value = <96000>;
debounce-value = <256>;
type = <IRQ_TYPE_EDGE_RISING>;
wakeup;
event;
};
int1 {
debounce-value = <256>;
edge-cnt-type = <IRQ_TYPE_EDGE_RISING>;
edge-cnt-value = <1>;
edge-cnt-wakeup;
edge-cnt-event;
type = <IRQ_TYPE_EDGE_RISING>;
wakeup;
event;
};
int2 {
debounce-value = <256>;
type = <IRQ_TYPE_EDGE_RISING>;
wakeup;
event;
};
int3 {
debounce-value = <256>;
type = <IRQ_TYPE_EDGE_RISING>;
wakeup;
event;
};
int4 {
type = <IRQ_TYPE_EDGE_FALLING>;
wakeup;
event;
};
int5 {
type = <IRQ_TYPE_EDGE_RISING>;
wakeup;
event;
};
rtc {
alarm-wakeup;
alarm-event;
tick-wakeup;
tick-event;
};
*/
};

主要字段含义:

  • force-powerdown-value 超长按强制关机时间
  • power-event-value 长按开机及长按关机事件时间
  • debounce-value 去抖动时间
  • type 检测类型,支持上升沿、下降沿、高电平、低电平
  • wakeup 使能开机唤醒红能
  • event 使能事件上报功能
  • edge-cnt-type 检测类型,支持上升沿、下降沿
  • edge-cnt-value 边沿计数值

所有时间以(1/32768)秒为单位,例如327680代表10秒

2.2 PMU文件控制

PMU sysfs位于/sys/devices/platform/soc/91000000.pmu目录下,文件结构如下:

.
|-- driver -> ../../../../bus/platform/drivers/k230-pmu
|-- driver_override
|-- int0
| |-- debounce_value
| |-- event
| |-- force_powerdown_value
| |-- power_event_value
| |-- type
| `-- wakeup
|-- int1
| |-- debounce_value
| |-- edge_cnt_event
| |-- edge_cnt_type
| |-- edge_cnt_value
| |-- edge_cnt_wakeup
| |-- event
| |-- type
| `-- wakeup
|-- int2
| |-- debounce_value
| |-- event
| |-- type
| `-- wakeup
|-- int3
| |-- debounce_value
| |-- event
| |-- type
| `-- wakeup
|-- int4
| |-- event
| |-- type
| `-- wakeup
|-- int5
| |-- event
| |-- type
| `-- wakeup
|-- modalias
|-- of_node -> ../../../../firmware/devicetree/base/soc/pmu@0x91000000
|-- pmu
| |-- pmu_logs
| |-- pmu_regs
| |-- pmu_status
| `-- wakeup_source
|-- rtc
| |-- alarm_event
| |-- alarm_wakeup
| |-- tick_event
| `-- tick_wakeup
|-- subsystem -> ../../../../bus/platform
`-- uevent

主要文件功能:

  • pmu/pmu_status PMU状态(只读)
    • PMU_RESET PMU被断电
    • SOC_FORCE_PD SoC被强制断电
    • SOC_NORMAL_PD SoC被正常断电
    • SOC_RESET SoC被复位
  • pmu/wakeup_source 系统唤醒源(只读) INT0,INT1,INT2,INT3,INT4,INT5,RTC_ALARM,RTC_TICK
  • pmu/pmu_logs 用户LOG文件(二进制文件,读写需要4字节对齐)
  • pmu/pmu_regs PMU调试(二进制文件,读写需要4字节对齐)
  • int0/force_powerdown_value 超长按强制关机时间
  • int0/power_event_value 长按开机及长按关机事件时间
  • int1/edge_cnt_type 检测类型,有效值”rising”、”falling”
  • int1/edge_cnt_value 边沿计数值
  • */debounce_value 去抖动时间
  • */type 检测类型,有效值”rising”、”falling”、”low”、”high”
  • */*wakeup 开机唤醒,有效值”enabled”、”disabled”
  • */*event 事件上报,有效值”enabled”、”disabled”

例如使能INT1上升沿开机唤醒:

cd /sys/devices/platform/soc/91000000.pmu/int1
echo rising > type
echo enabled > wakeup

例如使能INT2下降沿事件上报:

cd /sys/devices/platform/soc/91000000.pmu/int2
echo falling > type
echo enabled > event

2.3 PMU事件上报

PMU上报事件使用input子系统,上报事件码为EV_KEY,用户可在收到相应事件后进行业务处理。例如收到KEY_POWER键值,用户可以执行关机准备和调用poweroff命令关机

可以使用evtest工具进行测试,事件表如下:

动作按键值
INT0长按关机KEY_POWER
INT0电平或边沿BTN_0
INT1电平或边沿或边沿计数BTN_1
INT2电平或边沿BTN_2
INT3电平或边沿BTN_3
INT4电平或边沿BTN_4
INT5电平或边沿BTN_5
RTC_ALARMBTN_6
RTC_TICKBTN_7

2.4 PMU关机控制

  1. 使用poweroff命令关机
  2. 通过超长按INT0按键来强制关机(不推荐,除非系统宕机。系统宕机后强制关机,会导致不能PMU唤醒

3. 硬件连接

使用PMU时需要按照以下方式设置EVB板

  1. 使用跳线帽连接J1接口的PIN13(OUT0)和PIN14(PW_EN),注意要断开PIN15(SYS_SW)和PIN16(PW_EN)

  2. 根据使用不同的唤醒源使用跳线连接PIN2(SYS_ON_OFF)与对应的PIN,这时按键K1可控制INT的状态,按下按键为高电平,松开为低电平

    唤醒源PIN标签
    INT01INT0
    INT13INT1
    INT25INT2
    INT37INT3
    INT49INT4
    INT511INT5

使用INT0用作唤醒源的连接示意图:

top_view

bottom_view

4. 注意事项

  1. PMU模块在设备树中默认是未使能的,如果需要使用请在设备树中使能
  2. 使用PMU模块时一定要通过任意INT唤醒PMU模块,否则kernel初始化驱动时会卡死