CPUFreq驱动随笔(一)
来源:互联网 发布:广数980g76编程实例 编辑:程序博客网 时间:2024/06/05 15:28
CPUfreq核心层注册:
intcpufreq_register_driver(struct cpufreq_driver *driver_data)
struct cpufreq_driver driver_data = {
//cpufreq_verify_within_limits(struct cpufreq_policy *policy, unsigned intmin_freq, unsigned intmax_freq)
// .setpolicy = s3c###_setpolicy //传递一个policy参数,接受一个范围policy->max,policy->min,主要实现自动调节频率。只有少数驱动用此函数
.target = s3c###_target //用于把频率调节到一个指定的值,接受3个参数:policy、target_freq、relation。
//target_freq是目标频率,实际频率总是要设定CPU频率接近target_freq。并且设定的频率必须在policy->max和policy->min之间。
//在设定频率接近target_freq时,relation若为CPUFREQ_REL_L,则暗示设置的频率应该大于或等于target_freq;
//relation若为CPUFREQ_REL_H,则暗示设置的频率应该小于或等于target_freq;
.flag = CPUFREQ_CONST_LOOPS, //表示cpu频率不会因loops_per_jiffy改变而改变
}
根据芯片内部PLL和分频器的关系,ARM SoC一般不具备独立调整CPU频率的能力,往往SoC的CPUFreq驱动会提供一个频率表,
频率在该表的范围内改变,一般实现target函数。
CPUFreq核心提供了辅助函数:
intcpufreq_frequency_table_cpuinfo(struct cpufreq_policy *policy, struct cpufreq_freqency_table *table)
这个函数主要用于init()中将policy->min和policy->max设置为与cpuinfo.min_freq和cpuinfo.max_freq相同的值。
intcpufreq_frequency_table_verify(struct cpufreq_policy *policy, struct cpufreq_freqency_table *table)
它是cpufreq_driver的verify()成员函数的助手,确保至少有1个有效的CPU频率位于policy->min到policy->max的范围
intcpufreq_frequency_table_target(struct cpufreq_policy *policy,
struct cpufreq_frequency_table *table,
unsigned int target_freq,
unsigned int relation,
unsigned int *index);
它主要用于cpufreq_driver的target()成员函数,返回需要设定的频率在频率表中的索引
以下为几个重要的结构体:
struct cpufreq_policy {
struct cpufreq_cpuinfo cpuinfo;
unsigned int cur; //cpu当前频率
................
}
struct cpufreq_cpuinfo {
unsigned int max; //该cpu所支持的最大频率
unsigned int min; //该cpu所支持的最小频率
unsigned int transition_latency; //cpu频率切换时所需要的延迟
}
struct cpufreq_frequency_table{
unsigned int index;
unsigned int frequency;
}
intcpufreq_register_driver(struct cpufreq_driver *driver_data)
struct cpufreq_driver driver_data = {
.owner = THIS_MODULE,
.name =“s3c”
.verify = s3c###_verity //用于对用户的CPUfreq策略设置进行有效性校验和数据修正。该函数常用到://cpufreq_verify_within_limits(struct cpufreq_policy *policy, unsigned intmin_freq, unsigned intmax_freq)
// .setpolicy = s3c###_setpolicy //传递一个policy参数,接受一个范围policy->max,policy->min,主要实现自动调节频率。只有少数驱动用此函数
.target = s3c###_target //用于把频率调节到一个指定的值,接受3个参数:policy、target_freq、relation。
//target_freq是目标频率,实际频率总是要设定CPU频率接近target_freq。并且设定的频率必须在policy->max和policy->min之间。
//在设定频率接近target_freq时,relation若为CPUFREQ_REL_L,则暗示设置的频率应该大于或等于target_freq;
//relation若为CPUFREQ_REL_H,则暗示设置的频率应该小于或等于target_freq;
.flag = CPUFREQ_CONST_LOOPS, //表示cpu频率不会因loops_per_jiffy改变而改变
}
根据芯片内部PLL和分频器的关系,ARM SoC一般不具备独立调整CPU频率的能力,往往SoC的CPUFreq驱动会提供一个频率表,
频率在该表的范围内改变,一般实现target函数。
CPUFreq核心提供了辅助函数:
intcpufreq_frequency_table_cpuinfo(struct cpufreq_policy *policy, struct cpufreq_freqency_table *table)
这个函数主要用于init()中将policy->min和policy->max设置为与cpuinfo.min_freq和cpuinfo.max_freq相同的值。
intcpufreq_frequency_table_verify(struct cpufreq_policy *policy, struct cpufreq_freqency_table *table)
它是cpufreq_driver的verify()成员函数的助手,确保至少有1个有效的CPU频率位于policy->min到policy->max的范围
intcpufreq_frequency_table_target(struct cpufreq_policy *policy,
struct cpufreq_frequency_table *table,
unsigned int target_freq,
unsigned int relation,
unsigned int *index);
它主要用于cpufreq_driver的target()成员函数,返回需要设定的频率在频率表中的索引
以下为几个重要的结构体:
struct cpufreq_policy {
struct cpufreq_cpuinfo cpuinfo;
unsigned int cur; //cpu当前频率
................
}
struct cpufreq_cpuinfo {
unsigned int max; //该cpu所支持的最大频率
unsigned int min; //该cpu所支持的最小频率
unsigned int transition_latency; //cpu频率切换时所需要的延迟
}
struct cpufreq_frequency_table{
unsigned int index;
unsigned int frequency;
}
1 0
- CPUFreq驱动随笔(一)
- CPUFREQ驱动使用方法说明
- CPUFREQ驱动使用方法说明(转载)
- Cpufreq
- cpufreq
- Cpufreq
- 随笔(一)
- 随笔(一)
- 随笔(一)
- 随笔(一)
- 随笔(一)
- WPhone7 随笔 (一)
- 随笔(一)
- 随笔(一)
- 思维随笔(一)
- Fragment随笔(一)
- 随笔(一)
- 随笔(一)
- idea配置maven
- 浅谈动态规划(三)
- C++11老关键字的新含义(auto, using,extern)
- 程序的调用机制及目标文件有什么
- ubuntu14.04上使用glfw
- CPUFreq驱动随笔(一)
- 页面置换算法及磁盘调度算法
- yii2.0目录结构
- 【Luogu】 P1726 上白泽慧音
- 零基础学习wince开发-环境搭建
- A1014. Waiting in Line (30)
- HTTP协议详解
- 数据库范式那些事
- C++设计模式:职责链模式<初探>