个人技术分享

一、电源管理子系统是干什么的,有什么用

硬件电路板的CPU和外设的电源集中管理控制中心

1.1 系统电源管理

负责CPU的休眠和唤醒

1.2 设备电源管理

负责外设的电源上下电,休眠和运行模式管理

1.3 设备有几种状态

序号

类别

状态

定义

备注

1

系统

运行时

RUNTIME

休眠

SUSPEND

2

外设

休眠

PM_DEVICE_ACTION_SUSPEND

恢复

PM_DEVICE_ACTION_RESUME

关机

PM_DEVICE_ACTION_TURN_OFF

开机

PM_DEVICE_ACTION_TURN_ON

二、在应用层怎么调用

2.1 通过shell 执行电源管理

2.1.1 外设电源管理指令

uart:~$ device list
- buttons (active)
uart:~$ pm suspend buttons
uart:~$ device list
uart:~$ devices:
- buttons (suspended)

2.2 API汇总

序号

分类

功能

API

1

系统PM接口

强制改变系统状态,可以让系统休眠。目前我们项目用到了这个接口

bool pm_state_force(uint8_t cpu, const struct pm_state_info *info)

系统状态改变的回调函数注册

pm_notifier_register(struct pm_notifier *notifier)

查询下一个状态

const struct pm_state_info *pm_state_next_get(uint8_t cpu)

2

外设驱动PM接口

注册外设名字到PM,把状态的实际执行函数注册进去

PM_DEVICE_DEFINE(dev_id, pm_action_cb, ...)

通过设备树给PM标识

PM_DEVICE_DT_DEFINE(node_id, pm_action_cb, ...)

3

外设PM接口

启动指定外设

int pm_device_runtime_enable (const struct device *dev)

关闭指定外设

int pm_device_runtime_disable(const struct device *dev)

恢复休眠的外设

int pm_device_runtime_get(const struct device *dev)

让指定的外设进入休眠

int pm_device_runtime_put(const struct device *dev)

查询指定设备开关状态

bool pm_device_runtime_is_enabled(const struct device *dev)

三、驱动和系统需要支持那些功能

3.1 每个外设驱动都需要实现设备的状态切换

#define DT_DRV_COMPAT dummy_device

static int dummy_driver_pm_action(const struct device *dev,
                                  enum pm_device_action action)
{
    switch (action) {
    case PM_DEVICE_ACTION_SUSPEND:
        /* suspend the device */
        ...
        break;
    case PM_DEVICE_ACTION_RESUME:
        /* resume the device 恢复数据*/
        ...
        break;
    case PM_DEVICE_ACTION_TURN_ON:
        /*
         * powered on the device, used when the power
         * domain this device belongs is resumed.
         */
        ...
        break;
    case PM_DEVICE_ACTION_TURN_OFF:
        /*
         * power off the device, used when the power
         * domain this device belongs is suspended.
         */
        ...
        break;
    default:
        return -ENOTSUP;
    }

    return 0;
}
//设备的电源管理
PM_DEVICE_DT_INST_DEFINE(0, dummy_driver_pm_action);

DEVICE_DT_INST_DEFINE(0, &dummy_init,
    PM_DEVICE_DT_INST_GET(0), NULL, NULL, POST_KERNEL,
    CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, NULL);