CPUFreq驱动随笔(一)

来源:互联网 发布:广数980g76编程实例 编辑:程序博客网 时间:2024/06/05 15:28
CPUfreq核心层注册:
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
原创粉丝点击