Linux Regulator Framework(2)_regulator driver

作者:wowo 发布于:2015-4-16 22:18 分类:电源管理子系统

本文从regulator driver的角度,描述怎样基于regulator framework编写regulator驱动。同时,以此为契机,学习、理解regulator有关的物理特性,以便能够更好的使用它们。

阅读全文>>

标签: Linux driver framework regulator

评论(24) 浏览(30122)

Linux Regulator Framework(1)_概述

作者:wowo 发布于:2015-3-20 21:42 分类:电源管理子系统

Regulator,中文名翻译为“稳定器”,在电子工程中,是voltage regulator(稳压器)或者current regulator(稳流器)的简称,指可以自动维持恒定电压(或电流)的装置。

voltage regulator最早应用于功放电路中,主要用于滤除电源纹波(100或者120Hz)和噪声,以及避免“输出电压随负载的变化而变化”的情况。后来,随着IC级别的regulator的出现(便宜了),voltage regulator几乎存在于任何的电子设备中。例如我们常见的嵌入式设备中,基本上每一种电压,都是经过regulator输出的。

相比较voltage regulator的广泛使用,很少见到current regulator的应用场景(相信大多数的嵌入式工程师都没有接触过)。它一般存在于电流源中,除此之外,它广泛存在于近年来新兴的LED照明设备中。current regulator在LED设备中的作用主要有两个:避免驱动电流超出最大额定值,影响其可靠性;获得预期的亮度要求,并保证各个LED亮度、色度的一致性。

虽然原理比较复杂,但从设备驱动的角度看,regulator的控制应该很简单,就是输出的enable/disable、输出电压或电流的大小的控制。那么,linux kernel的regulator framework到底要做什么呢?这就是本文的目的:弄清楚regulator framework背后思考,并总结出其软件架构(和common clock framework类似,consumer/provider/core)。

注1:有关regulator的描述,参考自“http://sound.westhost.com/articles/vi-regulators.html”。

注2:kernel中有关regulator framework的介绍写的相当好(Documentation\power\regulator\*),因此本文大部分内容会参考这些文件。

阅读全文>>

标签: Linux framework regulator 软件架构

评论(18) 浏览(41976)

Linux power supply class(1)_软件架构及API汇整

作者:wowo 发布于:2015-3-13 22:14 分类:电源管理子系统

power supply class为编写供电设备(power supply,后面简称PSY)的驱动提供了统一的框架,功能包括:

1)抽象PSY设备的共性,向用户空间提供统一的API。

2)为底层PSY驱动的编写,提供简单、统一的方式。同时封装并实现公共逻辑,驱动工程师只需把精力集中在和硬件相关的部分即可。

本文将从设计思路、软件架构、API说明以及怎么编写power supply driver四个角度,介绍power supply class。并会在下一篇文章中,分析power supply class的内部逻辑。如果有时间,会在第三篇文章中,以android系统为例,介绍应用软件怎样利用power supply class,监控系统的供电状态。

注:其实所有的class(如input subsystem),思路都是这样的----抽象共性、统一接口、屏蔽细节。我们在“Linux设备模型(7)_Class”中介绍过,本文在介绍power supply class同时,也以此为例,进一步理解设备模型中class的存在意义和使用方法。

阅读全文>>

标签: Linux class psy

评论(43) 浏览(43203)

Linux电源管理(14)_从设备驱动的角度看电源管理

作者:wowo 发布于:2015-3-2 22:53 分类:电源管理子系统

相信工作稍微久一点的linux驱动工程师都深有体会:

在旧时光里,实现某一个设备的电源管理功能,是非常简单的一件事情。大多数设备都被抽象为platform设备,driver只需要提供suspend/resume/shutdown等回调函数,并注册到kernel即可。kernel会在系统电源状态切换的过程中,调用driver提供的回调函数,切换设备的电源状态。

但是在新时代中,设备电源管理有关的操作,被统一封装在struct dev_pm_ops结构中了。该结构包含20多个回调函数,再加上复杂的电源管理机制(常规的suspend/resume、runtime PM等等),使设备驱动的电源管理工作不再那么单纯,工程师(如蜗蜗自己)的思路也不再特别清晰。

因此本文希望能以单一设备的电源管理为出发点,结合kernel的电源管理机制,介绍怎样在设备驱动中添加电源管理功能,并分析设备电源状态切换和系统电源状态切换的关系。

另外,我们在电源管理系列文章中,介绍了很多的电源管理机制,如generic PM、wakeup event framework、wakelock、autosleep、runtime PM、PM domain、等等,本文也算是对它们的梳理和总结。

阅读全文>>

标签: Device driver PM

评论(19) 浏览(28061)

Linux PM QoS framework(3)_per-device PM QoS

作者:wowo 发布于:2015-2-26 22:44 分类:电源管理子系统

per-device PM QoS是针对指定设备的QoS framework,背后的思考如下:

1)resume_latency

Runtime PM的框架下,当device的引用计数减为0的时候,RPM会suspend该device。不过,device进入suspend状态以及从suspend状态resume是需要消耗时间的(相关信息保存在pm domain中),而系统其它实体(如用户空间程序)可能对该设备的响应时间有要求,这就是一种形式的QoS request,称作resume_latency。

per-device PM QoS framework会提供相应的接口,收集指定设备的resume_latency request,并提供给Runtime PM,它在suspend设备时,会考虑这种需求,并决定是否suspend设备。

2)latency_tolerance

一些复杂的设备,在运行状态(active)时,为了节省功耗,也有可能自行进入某些省电状态,相应的,设备的响应速度可能降低。如果该设备足够智能,可能会提供一个回调函数(.set_latency_tolerance,位于dev_pm_info结构中),以便设置最大的延迟容忍时间。这称作latency_tolerance。

对per-device PM QoS来说,需要提供一种机制,收集所有的、针对某个设备的latency_tolerance需求,并汇整出可以满足所有需求的latency_tolerance,通过设备的回调函数告知设备。

3)no power off/remote wakeup

Runtime PM的框架下,设备suspend之后,还可以进一步通过pm domain关闭该设备的供电,以节省功耗。但关闭供电时,除了要考虑对设备resume_latency的需求之外,还要考虑该设备是否允许关闭供电,以及该设备是否需要作为一个唤醒源(remote wakeup)。

这是另一种形式的QoS request,称作per-device PM QoS flag,表示系统其它实体对该设备的一些特定行为的需求。当前的flag有两种:

PM_QOS_FLAG_NO_POWER_OFF,表示不允许设备断电
PM_QOS_FLAG_REMOTE_WAKEUP,表示设备应具备唤醒功能

这两个flag可以通过或操作,同时生效。

因此,per-device PM QoS framework的功能,就是抽象上面两类需求,包括:向requestor提供QoS request的add、update、remove等API,包括内核空间API和用户空间API;汇整、整理这些request;向电源管理有关的service(主要是pm domain framework)提供汇整后的request信息,以便这些service可以做出正确的决定。

下面将会结合source code(位于drivers/base/power/qos.c中),介绍上面的实现逻辑。

阅读全文>>

标签: Linux Kernel pm_qos per-device

评论(9) 浏览(14326)

Linux PM QoS framework(2)_PM QoS class

作者:wowo 发布于:2015-2-10 23:09 分类:电源管理子系统

回顾上一篇文章(Linux PM QoS framework(1)_概述和软件架构),PM QoS framework抽象出4个系统级别的QoS constraint(统称为PM QoS class),分别是cpu&dma latency、network latency、network throughput和memory bandwidth。并提供一系列的接口,动态的搜集、整理系统对这些constraint的需求情况。

阅读全文>>

标签: Linux Kernel pm_qos qos

评论(7) 浏览(31084)

Linux PM QoS framework(1)_概述和软件架构

作者:wowo 发布于:2015-2-4 23:06 分类:电源管理子系统

QOS为Quality Of Service(服务质量)的简称,对PM QoS而言,表示Linux kernel电源管理相关的服务质量。那到底什么是服务质量呢?

我们知道,Linux PM的主要功能,是节省功耗,但同时,会付出一定的性能代价,例如延迟(latency)增加、吞吐量(throughput)下降。可以把PM当作一种服务,把它对性能的影响,类比为服务的质量(QoS)。对性能的影响越大,QoS越低,反之越高。

不过,PM QoS framework的存在,并不是为了定义并测量系统的服务质量(Linux系统对实际的qos没有任何兴趣),而是为了定义一套框架,以满足系统各个实体(如进程、设备驱动等等)对QoS的期望为终极目标。根据实际的场景,这些期望可描述为:xxx不大于某个值;xxx不小于某个值;等等。

这个终极目标,是基于这样的事实:机器是极端的实用主义者。最理想的状况,是刚刚满足系统各个实体对QoS的期望,因而可以在满足需求的同时,最大化的省电。粗俗一点,就是“我能考60分,为什么要多花一点力气去考61分?”。这样的思路,值得我们深思。

本文将基于PM QoS framework整体的软件架构,介绍它的功能、应用场景、使用方式等。

阅读全文>>

标签: Linux PM 电源管理 pm_qos qos

评论(5) 浏览(24334)

Linux cpuidle framework(4)_menu governor

作者:wowo 发布于:2015-1-18 23:14 分类:电源管理子系统

本文以menu governor为例,进一步理解cpuidle framework中governor的概念,并学习governor的实现方法。

在当前的kernel中,有2个governor,分别为ladder和menu(蜗蜗试图理解和查找,为什么会叫这两个名字,暂时还没有答案)。ladder在periodic timer tick system中使用,menu在tickless system中使用。

现在主流的系统,出于电源管理的考量,大多都是tickless system。另外,menu governor会利用pm qos framework(蜗蜗会在后续的文章中分析),在选择策略中加入延迟容忍度(Latency tolerance)的考量。因此本文选取menu governor作为分析对象,至于ladder,就不再分析了。

注:有关periodic timer tick和tickless的知识,可参考本站时间子系统的系列文章。

阅读全文>>

标签: Linux cpuidle menu governor pm_qos

评论(21) 浏览(22382)

Linux cpuidle framework(3)_ARM64 generic CPU idle driver

作者:wowo 发布于:2015-1-6 23:13 分类:电源管理子系统

本文以ARM64平台下的cpuidle driver为例,说明怎样在cpuidle framework的框架下,编写cpuidle driver。另外,本文在描述cpuidle driver的同时,会涉及到CPU hotplug的概念,因此也可作为CPU hotplug的引子。

阅读全文>>

标签: driver arm64 dts cpuidle

评论(13) 浏览(21171)

Linux cpuidle framework(2)_cpuidle core

作者:wowo 发布于:2014-12-30 22:38 分类:电源管理子系统

cpuidle core是cpuidle framework的核心模块,负责抽象出cpuidle device、cpuidle driver和cpuidle governor三个实体,并提供如下功能(可参考“Linux cpuidle framework(1)_概述和软件架构”中的软件架构):

1)向底层的cpuidle driver模块提供cpudile device和cpuidle driver的注册/注销接口。

2)向cpuidle governors提供governor的注册接口。

3)提供全局的cpuidle机制的开、关、暂停、恢复等功能。

4)向用户空间程序提供governor选择的接口。

5)向kernel sched中的cpuidle entry提供cpuidle的级别选择、进入等接口,以方便调用。

本文会以这些功能为线索,逐一展开,分析cpuidle framework的实现思路和实现原理。

阅读全文>>

标签: Linux framework core cpuidle

评论(27) 浏览(30234)

Copyright @ 2013-2015 蜗窝科技 All rights reserved. Powered by emlog