zoukankan      html  css  js  c++  java
  • Linux 3.8.1 电源管理之OMAP Power Domain分析

    前面分析了Voltage Domain的管理,现在开始做Power Domain 分析。首先来看Power Domain的定义【来自OMAP35XX PRCM TRM 】:

    接下来从am33xx_powerdomains_init()函数开始,分析Linux 中对OMAP 的Power Domain的实现。该函数实现在linux-3.8.1/arch/arm/mach-omap2/powerdomains33xx_data.c中。

    首先是pwrdm_register_platform_funcs()函数,位于linux-3.8.1/arch/arm/mach-omap2/powerdomain.c中:

    这里就只是初始化一个全局结构体变量static struct pwrdm_ops *arch_pwrdm;而所注册的struct pwrdm_ops am33xx_pwrdm_operations位于linux-3.8.1/arch/arm/mach-omap2/prm33xx.c中:

    而这个struct pwrdm_ops位于linux-3.8.1/arch/arm/mach-omap2/powerdomain.h:

    在am33xx_powerdomains_init()中接着是pwrdm_register_pwrdms(powerdomains_am33xx)。其中注册的powerdomains_am33xx[]是一个AM335X支持的Power Domain的数组。

    这对应于下表中的所有Power Domain,实际上pwrdm_register_pwrdms()就是调用_pwrdm_register()将这所有的Power Domain都注册给系统。

     

    struct powerdomain定义在linux-3.8.1/arch/arm/mach-omap2/powerdomain.h:

    其中每个字段的介绍如下:

    其实_pwrdm_register()的核心代码如下,通过struct powerdomain中的Voltage Domain的名字,找到对应的Voltage Domain,然后将其保存起来;之后再将这个Power Domain加入到这个Voltage Domain中,并将这个Power Domain加入全局的pwrdm_list中。

    实际上,struct powerdomain中定义的是PRCM中各个Power Domain对应的寄存器相关的东西,例如偏移量,控制掩码等。例如struct powerdomain mpu_33xx_pwrdm定义的值如下:

     

    我们看am33xx_pwrdm_set_mem_onst()的实现如下:

     

    这个am33xx_pwrdm_set_mem_onst()函数实际是想修改PM_MPU_PWRSTCTRL寄存器的MPU_RAM_ONState字段为指定的值(MPU_L1_ONState和MPU_L2_ONState字段都为只读,因此不可修改)。因此,这里的参数bank只能是2,且m = pwrdm->mem_on_mask[bank]得到的值m为AM33XX_MPU_RAM_ONSTATE_MASK (0x3 << 16);即该MPU_RAM_ONState字段的掩码。并且(pwrst << __ffs(m))中的__ffs()得到这个m的第一个被设置的bit位置,自然为16,pwrst <<16即为要设置的该MPU_RAM_ONState字段的值。

    这里实现的这些am33xx_pwrdm_operations函数,说明了Power Domain不仅仅是控制该Domain的Power On和Power Off,还可能包括对该Power Domain的各个模块在各种电源状态下所处的状态进行设置。例如这里就可以设置在该Power Domain处于ON状态时,其中的RAM模块是处于OFF,RET还是ON状态。也就是说,还可以进一步细化对该模块内部的各个模块的电源状态控制。因此,如果我们要抽象一个Generic 的Power Domain实现,除了要对该Power Domain提供一个pwrDomainControl()接口,还应该提供一个更细化的pwrDomainModuleControl()接口。

    am33xx_powerdomains_init()的最后一步是调用pwrdm_complete_init()。这是将所有的Power Domain都设置为PWRDM_POWER_ON状态(其他状态包括PWRDM_POWER_OFF,PWRDM_POWER_RET以及PWRDM_POWER_INACTIVE)。

  • 相关阅读:
    leetcode链表--7、rotate-list(将单链表从右数第k个结点以及之后结点移动到链表最前头)
    10、剑指offer--矩形覆盖
    leetcode链表--6、linked-list-cycle-ii(有环单链表环的入口结点)
    9、剑指offer--变态跳台阶
    8、剑指offer--跳台阶
    leetcode链表--5、linked-list-cycle(单链表是否有环)
    7、剑指offer--斐波那契数列
    Node.js 学习(二) 创建第一个应用
    Node.js 学习(一) 安装配置
    JavaScript 函数调用
  • 原文地址:https://www.cnblogs.com/coryxie/p/2951746.html
Copyright © 2011-2022 走看看