CPUFreq驱动随笔(一)

    xiaoxiao2021-03-25  97

    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; }
    转载请注明原文地址: https://ju.6miu.com/read-22107.html

    最新回复(0)