简介

Zephyr电源域是为了支持公共源供电的设备分组,以通用方式通知电源状态更改
Zephyr上的电源域是可选的,要启用此功能,必须设置选项CONFIG_PM_DEVICE_POWER_DOMAIN
电源域自行打开关闭时,电源域有责任通过PM_DEVICE_ACTION_TURN_ONPM_DEVICE_ACTION_TURN_OFF来通知使用它的所有设备

内部电源域

SoC中的大多数设备都具有独立的电源控制,可以打开关闭这些控制以降低功耗。但是,存在大量的静态电流泄漏,仅使用设备电源管理无法控制。为了解决这个问题,SoC通常被分成几个区域,将通常一起使用的设备分组,以便可以完全关闭未使用的区域以消除这种泄漏。这些区域称为电源域可以存在于层次结构中,并且可以嵌套

外部电源域

SoC外部的设备可以从SoC主电源以外的电源供电。这些外部电源通常是开关稳压器专用电源 IC。可以从同一源为多个设备供电,这种设备分组通常称为电源域

电源域示例

首先,在设备树上充当电源域的设备需要声明power-domain的兼容属性。

  1. gpio_domain: gpio_domain@4 {
  2. compatible = "power-domain";
  3. ...
  4. };

电源域设备需要在挂起和恢复的时候通知整个

  1. static int mydomain_pm_action(const struct device *dev,
  2. enum pm_device_action *action)
  3. {
  4. switch (action) {
  5. case PM_DEVICE_ACTION_RESUME:
  6. /* resume the domain */
  7. ...
  8. /* notify children domain is now powered */
  9. pm_device_children_action_run(dev, PM_DEVICE_ACTION_TURN_ON, NULL);
  10. break;
  11. case PM_DEVICE_ACTION_SUSPEND:
  12. /* notify children domain is going down */
  13. pm_device_children_action_run(dev, PM_DEVICE_ACTION_TURN_OFF, NULL);
  14. /* suspend the domain */
  15. ...
  16. break;
  17. case PM_DEVICE_ACTION_TURN_ON:
  18. /* turn on the domain (e.g. setup control pins to disabled) */
  19. ...
  20. break;
  21. case PM_DEVICE_ACTION_TURN_OFF:
  22. /* turn off the domain (e.g. reset control pins to default state) */
  23. ...
  24. break;
  25. default:
  26. return -ENOTSUP;
  27. }
  28. return 0;
  29. }

属于此域的设备,需要在设备树中声明域:

  1. &gpio0 {
  2. compatible = "zephyr,gpio-emul";
  3. gpio-controller;
  4. power-domain = <&gpio_domain>;
  5. };
  6. &gpio1 {
  7. compatible = "zephyr,gpio-emul";
  8. gpio-controller;
  9. power-domain = <&gpio_domain>;
  10. };

更改状态时,域下的所有设备都将收到通知。这些通知会发送到设备驱动的电源管理函数中。不过,这些通知也可以被忽略。

  1. static int mydev_pm_action(const struct device *dev,
  2. enum pm_device_action *action)
  3. {
  4. switch (action) {
  5. case PM_DEVICE_ACTION_SUSPEND:
  6. /* suspend the device */
  7. ...
  8. break;
  9. case PM_DEVICE_ACTION_RESUME:
  10. /* resume the device */
  11. ...
  12. break;
  13. case PM_DEVICE_ACTION_TURN_ON:
  14. // 域发出的运行操作
  15. /* configure the device into low power mode */
  16. ...
  17. break;
  18. case PM_DEVICE_ACTION_TURN_OFF:
  19. //域发出的挂起操作
  20. /* prepare the device for power down */
  21. ...
  22. break;
  23. default:
  24. return -ENOTSUP;
  25. }
  26. return 0;
  27. }