On i.MX 8 and i.MX 8X:
• 没有硬件低功耗可用
• 所以的电源管理都是通过SCFW来实现
• 当系统挂起时,SCFW关闭集群/ cpu。
由此可见:i.MX8必须使用SCFW来实现电源管理。
查看SCFW相关的信息:
SCFW提供电源控制、时钟控制、复位控制。
电源管理的所有方面,包括电源控制、偏置控制、时钟控制、复位控制和唤醒事件监视,都归在SC电源管理服务中。
•电源控制- SCFW负责对电源控制和外部电源管理设备进行集中管理。它管理功率域的功率状态和电压以及偏置控制。由于电源状态转换,它还可以根据需要重置外围设备。这一切都是通过API来完成的,即通信各个资源的电源状态需求。
•时钟控制- SC固件负责集中管理时钟控制。这包括时钟源,如振荡器和锁相环,以及时钟分频器、muxes和gates。这一切都是通过API来完成的,它通过通信各个资源的时钟需求来实现。
•复位控制- SC固件负责复位控制。这包括启动/重新启动一个分区、获得重置原因以及启动/停止cpu
SCFW提供如下API:
Power Functions
• sc_err_t sc_pm_set_sys_power_mode (sc_ipc_t ipc, sc_pm_power_mode_t mode)
此功能设置系统电源模式.
• sc_err_t sc_pm_set_partition_power_mode (sc_ipc_t ipc, sc_rm_pt_t pt, sc_pm_power_mode_t mode)
此函数设置分区的电源模式。
• sc_err_t sc_pm_get_sys_power_mode (sc_ipc_t ipc, sc_rm_pt_t pt, sc_pm_power_mode_t ∗mode)
此函数获取分区的模式。
• sc_err_t sc_pm_set_resource_power_mode (sc_ipc_t ipc, sc_rsrc_t resource, sc_pm_power_mode_t mode)
此函数设置资源的电源模式。
• sc_err_t sc_pm_set_resource_power_mode_all (sc_ipc_t ipc, sc_rm_pt_t pt, sc_pm_power_mode_t mode, sc -
rsrc_t exclude)
此函数为子分区拥有的所有资源设置power模式。
• sc_err_t sc_pm_get_resource_power_mode (sc_ipc_t ipc, sc_rsrc_t resource, sc_pm_power_mode_t ∗mode)
此函数获取资源的电源模式。
• sc_err_t sc_pm_req_low_power_mode (sc_ipc_t ipc, sc_rsrc_t resource, sc_pm_power_mode_t mode)
该函数请求一些资源可以根据其状态进入的低功耗模式。
• sc_err_t sc_pm_req_cpu_low_power_mode (sc_ipc_t ipc, sc_rsrc_t resource, sc_pm_power_mode_t mode, sc -
pm_wake_src_t wake_src)
这个函数请求CPU/集群资源的低功耗模式。
• sc_err_t sc_pm_set_cpu_resume_addr (sc_ipc_t ipc, sc_rsrc_t resource, sc_faddr_t address)
此函数用于设置CPU的恢复地址。
• sc_err_t sc_pm_set_cpu_resume (sc_ipc_t ipc, sc_rsrc_t resource, sc_bool_t isPrimary, sc_faddr_t address)
该函数用于设置CPU从低功耗模式恢复的参数。
• sc_err_t sc_pm_req_sys_if_power_mode (sc_ipc_t ipc, sc_rsrc_t resource, sc_pm_sys_if_t sys_if, sc_pm -power_mode_t hpm, sc_pm_power_mode_t lpm)
该函数请求系统级接口(包括消息传递单元、互连和内存)的电源模式配置。
Clock/PLL Functions
• sc_err_t sc_pm_set_clock_rate (sc_ipc_t ipc, sc_rsrc_t resource, sc_pm_clk_t clk, sc_pm_clock_rate_t ∗rate)
这个函数设置资源的时钟/锁相环的速率。
• sc_err_t sc_pm_get_clock_rate (sc_ipc_t ipc, sc_rsrc_t resource, sc_pm_clk_t clk, sc_pm_clock_rate_t ∗rate)
此函数获取资源时钟/锁相环的速率。
• sc_err_t sc_pm_clock_enable (sc_ipc_t ipc, sc_rsrc_t resource, sc_pm_clk_t clk, sc_bool_t enable, sc_bool_tautog)
此函数启用/禁用资源的时钟。
• sc_err_t sc_pm_set_clock_parent (sc_ipc_t ipc, sc_rsrc_t resource, sc_pm_clk_t clk, sc_pm_clk_parent_t parent)
这个函数设置资源时钟的父进程。
• sc_err_t sc_pm_get_clock_parent (sc_ipc_t ipc, sc_rsrc_t resource, sc_pm_clk_t clk, sc_pm_clk_parent t ∗parent)
这个函数获取资源时钟的父进程。
Reset Functions
• sc_err_t sc_pm_reset (sc_ipc_t ipc, sc_pm_reset_type_t type)
此函数服务系统.
• sc_err_t sc_pm_reset_reason (sc_ipc_t ipc, sc_pm_reset_reason_t ∗reason)
获取系统服务的原因.
• sc_err_t sc_pm_get_reset_part (sc_ipc_t ipc, sc_rm_pt_t ∗pt)
此函数获取导致重置的分区。
• sc_err_t sc_pm_boot (sc_ipc_t ipc, sc_rm_pt_t pt, sc_rsrc_t resource_cpu, sc_faddr_t boot_addr, sc_rsrc_ t resource_mu, sc_rsrc_t resource_dev)
此函数用于引导分区
• sc_err_t sc_pm_set_boot_parm (sc_ipc_t ipc, sc_rsrc_t resource_cpu, sc_faddr_t boot_addr, sc_rsrc_ t resource_mu, sc_rsrc_t resource_dev)
此函数用于更改分区的启动参数。
• void sc_pm_reboot (sc_ipc_t ipc, sc_pm_reset_type_t type)
此函数用于重新启动调用者的分区。
• sc_err_t sc_pm_reboot_partition (sc_ipc_t ipc, sc_rm_pt_t pt, sc_pm_reset_type_t type)
此函数用于重新启动分区。
• sc_err_t sc_pm_reboot_continue (sc_ipc_t ipc, sc_rm_pt_t pt)
此函数用于继续重新启动分区。
• sc_err_t sc_pm_cpu_start (sc_ipc_t ipc, sc_rsrc_t resource, sc_bool_t enable, sc_faddr_t address)
这个函数用于启动/停止CPU。
• void sc_pm_cpu_reset (sc_ipc_t ipc, sc_rsrc_t resource, sc_faddr_t address)
这个函数用于复位CPU。
• sc_bool_t sc_pm_is_partition_started (sc_ipc_t ipc, sc_rm_pt_t pt)
这个函数返回一个bool,指示是否启动了一个分区
这些函数的API都是在kernel里面调用的,我的选择是写了一个字符型驱动,来调用这些函数,来实现电源控制的目的。
有兴趣的朋友。可以留言一起讨论哦!