本系列文章将分析Linux对于OMAP的电源管理功能,以AM33XX作为实例(目前的硬件平台先主要关注AM335xStarterKit开发板),在必要时穿插其他相关内容。

在linux-3.8.1/arch/arm/mach-omap2/board-generic.c中有如下定义(分析某个开发板的内核,自然从board file的machine desc开始):

其中与比较关键的电源管理相关的代码是am33xx_init_early()函数。该函数在linux-3.8.1/arch/arm/mach-omap2/io.c中。

下面我们从am33xx_voltagedomains_init(),am33xx_powerdomains_init(),am33xx_clockdomains_init()等几个函数分析。

下面的文档定义了什么是Voltage Domain【参考TI的PRCM文档SPRUFA5】。

根据这个定义,我们可以得出Voltage Domain的功能包括下面几项:

一个Voltage Domain由一个Voltage Regulator供电

有一个独立的可控开关

不同Voltage Domain可以有不同电压

Voltage Domain的电压可以Scale ,可以基于普通DVFS,或者OPP,当然也可固定

当选定某个电压后,还可用类似SmartReflex的技术微调(软件透明,也可不透明)

可以完全关闭

可以支持唤醒(wake-up)

一个Voltage Domain可以有多个Power Domain

因此,如果要自己设计一个Voltage Domain的结构,可以考虑在其中支持一个voltage_control()的接口,参数可以是0到最大OPP电压,而全范围的OPP可以作为该结构的附加数据提供。不过我们还是先来看Linux的实现如何。

首先是am33xx_voltagedomains_init()的Voltage Domain初始化,在内核的linux-3.8.1/arch/arm/mach-omap2/voltagedomains33xx_data.c。

这里将MPU和CORE分成单独的Voltage Domain。但是实际上,根据《AM335x ARM® Cortex™-A8 Microprocessors (MPUs)》文档在"Power-Up Sequencing"一节中描述,应该可以合并这两个Voltage Domain。

{

When using the ZCZ package option, VDD_MPU and VDD_CORE power inputs may be powered from the same source if the application only uses operating performance points (OPPs) that define a common power supply voltage for VDD_MPU and VDD_CORE. The ZCE package option has the VDD_MPU domain merged with the VDD_CORE domain.

}

每个Voltage Domain由一个struct voltagedomain来表示。

注意,尽管TPS65910的文档上说明了该PMIC支持8个可编程的LDO,且在AM335xStarterKit开发板上的确通过AM335X_I2C0链接了这个PMIC的I2C,但是由于这些LDO连接的都是些常规I/O,限定了要求的电压范围(不可使用DVFS这样的方式来类似调整Voltage Domain的电压一样来调整输出电压),因此这里不把这些LDO看做独立的Voltage Domain。但是,实际上如果这些对应的模块不需要的话,应该还是可以在初始化时将其LDO电源关掉。

再注意到,TPS65910的文档上说明了该PMIC支持通过SmartReflex接口(实际上是独立的I2C接口)来控制Processor Core的Power。但是实际的AM335xStarterKit开发板上却没有连接这个SmartReflex接口。有一点需要注意,TPS65910实现的是SmartReflex Class-3,而AM335x实现的是SmartReflex Class-2B。下面的文字来自TPS65910文档。

关于SmartReflex的支持,可以参考这个GitHub的patch,但是这是针对AM335X EVM或者BeagleBone开发板的。在AM3359 - TMDXIDK3359开发板中,SmartReflex的I2C接口是接上的。

实际上,在TPS65910的文档中还说明了这个PMIC的SmartReflex寄存器是可以通过Control I2C和SmartReflex I2C访问的,但是需要通过Control I2C先配置其DEVCTRL_REG寄存器的SR_CTL_I2C_SEL位来选择。

下面简单分析对struct voltagedomain的管理。

首先是平台初始化代码通过voltdm_init()来把自己支持的Voltage Domain注册到系统中,实际上这是通过调用_voltdm_register()来实现的,并且是将这个struct voltagedomain加入到一个全局的voltdm_list中。从而,也就可以对这个voltdm_list进行查找,所以又有voltdm_lookup()函数。

另外,为了方便起见,还提供一个voltdm_for_each()函数,通过扫描这个voltdm_list,每当发现一个Voltage Domain,就调用指定的函数指针,从而可以实现对所有的Voltage Domain都执行某种操作的功能。由于每个Voltage Domain可以有多个Power Domain,因此voltdm_add_pwrdm()就被用来向一个Voltage Domain添加一个Power Domain(将这些Power Domain连接到这个Voltage Domain的pwrdm_list中)。类似的,还提供了一个voltdm_for_each_pwrdm()来对一个Voltage Domain的所有Power Domain执行指定的操作函数。

对于每个Voltage Domain,由于可以有不同的Scale的方法(比如可以使用Voltage Controller,也可以用Voltage Processor来实现),因此提供omap_change_voltscale_method()来改变相应的Scale方法。其实这一点,如果为了通用起见,应该让平台代码直接实现Scale方法就行了,也就是可以直接用xxx_set_scale_method()就可以。

omap_voltage_register_pmic()被用来设置struct voltagedomain的pmic字段。omap_voltage_get_voltdata()用来返回对应电压的相关数据(这里使用voltage table实现),即OPP数据。omap_voltage_get_volttable()就是用来返回这个voltage table的。voltdm_reset()将这个Voltage Domain的电压设置为当前OPP,实际调用的是voltdm_scale()实现的。voltdm_scale()就是用来实现Voltage Scale功能的,根据参数指定电压,在该Voltage Domain自己的voltage table中找到一项恰好大于该指定电压的"标称电压",用来设置对应的Regulator。voltdm_get_voltage()用来获得该Voltage Domain的当前标称电压nominal_volt。

linux 电源管理源码分析,Linux 3.8.1 电源管理之OMAP Voltage Domain分析相关推荐

  1. linux 网络服务器 源码下载,linux下 各类tcp网络服务器的实现源代码.doc

    linux下 各类tcp网络服务器的实现源代码.doc 还剩 25页未读, 继续阅读 下载文档到电脑,马上远离加班熬夜! 亲,喜欢就下载吧,价低环保! 内容要点: %s", sock, Ge ...

  2. linux下jdk源码安装,Linux JDK 源码安装

    一 环境 1.1 操作系统 [root@host-xxxsoft]# lsb_release -a LSB Version:    :base-4.0-amd64:base-4.0-noarch:co ...

  3. linux下free源码,linux命令free源码解读:Procps free.c

    linux命令free源码解读 linux命令free源码解读:Procps free.c 作者:isayme 发布时间:September 26, 2011 分类:Linux 我们讨论的是linux ...

  4. linux安装源码mysql失败,linux停mysql源码安装

    当前位置:我的异常网» Linux/Unix » linux停mysql源码安装 linux停mysql源码安装 www.myexceptions.net  网友分享于:2013-07-19  浏览: ...

  5. linux c free源码,linux命令free源码解读:Procps free.c

    linux命令free源码解读 linux命令free源码解读:Procps free.c 作者:isayme 发布时间:September 26, 2011 分类:Linux 我们讨论的是linux ...

  6. 【Linux 内核】调度器 ⑧ ( 进程优先级源码 include\linux\sched\prio.h | 进程分类 | 实时进程 | 普通进程 | 进程优先级数值 | 0 ~ 99 实时进程 )

    文章目录 一.Linux 内核进程优先级源码 二.进程分类 三.进程优先级数值 ( 0 ~ 99 实时进程 | 100 ~ 139 普通进程 ) 在之前的博客 [Linux 内核]进程管理 - 进程优 ...

  7. linux源码文件名,Linux中文件名解析处理源码分析

    Linux中文件名解析处理源码分析 前言 Linux中对一个文件进行操作的时候,一件很重要的事情是对文件名进行解析处理,并且找到对应文件的inode对象,然后创建表示文件的file对象.在此,对文件名 ...

  8. Linux内核 eBPF基础:kprobe原理源码分析:源码分析

    Linux内核 eBPF基础 kprobe原理源码分析:源码分析 荣涛 2021年5月11日 在 <Linux内核 eBPF基础:kprobe原理源码分析:基本介绍与使用>中已经介绍了kp ...

  9. Linux内核 eBPF基础:kprobe原理源码分析:基本介绍与使用示例

    Linux内核 eBPF基础 kprobe原理源码分析:基本介绍与使用示例 荣涛 2021年5月11日 kprobe调试技术是为了便于跟踪内核函数执行状态所设计的一种轻量级内核调试技术. 利用kpro ...

最新文章

  1. 敏捷个人纸质书:第一章 源于生活和工作的敏捷个人
  2. Java基础知识强化49:10个实用的但偏执的Java编程技术
  3. filter2D函数
  4. 裸眼3D全攻略3:拍摄3D—瞳距、镜距、视角偏转与空间感
  5. android surfaceview 技术,Android中SurfaceView的理解和使用
  6. linux 文件系统 dfs,分布式文件系统fastDFS 机器硬件要求
  7. 上传身份证照片js_html+css+js 实现拍照预览上传图片功能
  8. android ndk 头文件,笔记:Android源码和NDK目录及头文件
  9. 蚂蚁金服自主研发的三地五中心异地多活解决方案获金融科技创新大奖
  10. linux hook技术
  11. error: implicit declaration of function ‘read‘ [-Werror,-Wimplicit-function-declaration]
  12. hexutil加解密_EncodeUtil(各种格式的编码解码工具类)
  13. 学习笔记——字符串方法整理
  14. python实现钉钉群自动警报
  15. 无源贴片晶振四角引脚_晶振厂家告诉你贴片晶振的脚位方向如何区分 - 中山惠源晶工...
  16. 打造健康的程序员-饮食篇
  17. win7系统安装教程
  18. Java 求解买卖股票时机含冷冻期
  19. 微信小程序_图片连拍_闪光灯_手电筒_录制
  20. 我有一个梦想--读《致员工的一封信》有感(转)

热门文章

  1. OpenStack------Placement组件部署
  2. 任意列+左右两列等高布局,并要求有最小高度
  3. java泛型数组:Type parameter ‘T‘ cannot be instantiated directly
  4. note20220411
  5. git pack文件过大
  6. 锂电快充方案:TypeC-PD/QC诱骗芯片的常用型号,升降压(充电)芯片选型
  7. 华为机试C语言-找到比自己强的人数
  8. tp6 导入excel文件
  9. 哔哩哔哩如何提取封面_如何提取封面
  10. 计算机网络发展趋势多元化,探析计算机网络通信技术现状与未来趋势.doc