Linux内核中CPU主频和电压调整 (三)

1970-01-01 08:00

Linux内核中CPU主频和电压调整 (三)

如何开发一个新的CPUFreq driver初始化

首先,在一个 __initcall level 7后者以后的函数中检查内核是否运行在正确的CPU和正确的芯片组上面。

如果正确,则通过cpufreq_register_driver() 函数, 注册一个cpufreq_driver结构体。cpufreq_driver结构体中必须包含: cpufreq_driver.name: 驱动名称 cpufreq_driver.owner: THIS_MODULE

cpufreq_driver.init: 指向per-CPU初始化函数的指针

cpufreq_driver.verify: 指向”verification“函数的指针 cpufreq_driver.setpolicy / cpufreq_driver.target: 详见后面差异性介绍还可以选择性包含:

cpufreq_driver.exit: 指向per-CPU清理函数的指针

cpufreq_driver.resume: 指向per-CPU resume函数的指针。 此函数在中断失能的情况下被调用。并且在 pre-suspend 主频率或policy被恢复成->target 或者->setpolicy前调用。

cpufreq_driver.attr: 指向一个以NULL结尾的列表指针,该列表中的成员类型为 freq_attr结构体。通过此参

数,允许用户导出属性到sysfs中。Per-CPU初始化 当一个新的CPU无论何时被注册到设备模型中时,或者在cpufreq驱动注册自己后, per-CPU初始化函数 cpufreq_driver.init被调用。

该函数接受一个cpufreq_policy结构体作为参数。 如果必要,针对用户CPU类型,使能 CPUfreq支持。 policy->cpuinfo.min_freq / policy->cpuinfo.max_freq: CPU所支持的最小/最大频率。(单位: 千赫兹) policy->cpuinfo.transition_latency CPU在不同频率之间切换时所需要的时间。(单位:纳秒) policy->cur: CPU的当前工作频率

policy->min / policy->maxpolicy->policy / policy->governor: 必须包含针对该CPU的”缺省policy“。随后,cpufreq_driver.verify/cpufreq_driver.setpolicy或

cpufreq_driver.target函数被调用时将使用这些定义值。Verify / 验证

当用户决定使用一个新的policy(包含了policy, governor, min,max等值)时, 该policy必须被验证。

如此,不合适的值将被更正。为了验证这些定义值, 一个频率表辅助函数被使用。必须确保至少有一个有效的工作频率(该频率位于policy->min 和 policy->max 之间)。

如果必要,首先增大policy->max; 如果没有其他办法,才能选择降低 policy->min。target 或 setpolicy 绝大多数cpufreq驱动,甚至大多数cpu倍频算法仅仅允许处理器被设置在一个频率上。

此种情况下,需要使用 ->target 调用。某些具有处理器调频能力的处理器,能够在一定的频率范围内切换频率。 此种情况下,需要使用->setpolicy 调用。target target调用有三个参数: struct cpufreq_policy *policy

unsigned int target_frequency

unsigned int relationCPUFreq驱动必须在被调用的时候设置新的处理器频率。 实际频率必须根据如下规则来确定: 1) 尽量靠近 ”target_freq“ 频率 2)

必须满足条件 policy->min <= new_freq <= policy->max 3) 如果 relation ==

CPUFREQ_REL_L, 尝试选择高于或等于 target_freq的新频率

4) 如果 relation

== CPUFREQ_REL_H, 尝试选择低于或等于target_freq的新频率setpolicy

setpolicy函数仅仅只有一个参数。 struct cpufreq_policy

*policy需要设置处理器低频限到 policy->min, 需要设置处理器高频限到 policy->maxFrequency Table Helpers 大多数的处理器都仅支持设置成几个特定的频率。因此,一张频率表被用来辅助驱动开发。 通过调用函数[cpp] view

plaincopyprint?cpufreq_frequency_table_cpuinfo(struct

cpufreq_policy *policy, span style=\ </span>struct cpufreq_frequency_table *table); cpuinfo->min_freq 被设置为 policy->min,

cpuinfo->max_freq 被设置成 policy->max。下述函数用来验证处理器频率设定。[cpp] view plaincopyprint?int

cpufreq_frequency_table_verify(struct cpufreq_policy *policy, struct cpufreq_frequency_table *table);

针对 ->target 情况, 对应的函数为 [cpp] view plaincopyprint?int

cpufreq_frequency_table_target(struct cpufreq_policy *policy,

struct cpufreq_frequency_table *table,

unsigned int target_freq, unsigned int relation, unsigned int *index);


Linux内核中CPU主频和电压调整 (三).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:如何打造企业自己的培训课程体系.

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: