首页 > 技术文章 > IMX8移植cpufreq子系统

wen123456 2020-11-20 14:30 原文

一.简介
        CPUFreq子系统位于 drivers/cpufreq目录下,负责进行运行过程中CPU频率和电压的动态调整,即DvFS( Dynamic Voltage Frequency Scaling,动态电压频率调整)。运行时进行CPU电压和频率调整的原因是:CMOS电路中的功耗与电压的平方成正比、与频率成正比(P∝fV2)因此降低电压和频率可降低功耗。
        CPUFreq的核心层位于drivers/cpufreq/cpufreq,c下,它为各个SoC的CPUFreq驱动的实现提供了一套统一的接口,并实现了一套notifier机制,可以在 CPUFreq的策略和频率改变的时候向其他模块发出通知。另外,在CPU运行频率发生变化的时候,内核的 loops perify常数也会发生相应变化。
如果要深入了解请参考: CPUFreq驱动
 
二.从kernel 4.4移植到kernel5.4
硬件平台:imx8mq
 
1. 根据平台总线驱动设备模型,首先我们移植driver部分:
drivers/cpufreq/imx8-cpufreq.c
drivers/cpufreq/imx8mq-cpufreq.c
 
2. 再移植device部分,这里用的还不是dts:
drivers/soc/imx/soc-imx8.c
 
3. 加入编译配置
drivers/cpufreq/Kconfig.arm
drivers/cpufreq/Makefile
 
4. 添加kernel config选项
arch/arm64/configs/defconfig
 
三. 编译内核
1.执行编译命令
make defconfig
LDFLAGS="" CC="$CC" make
 
2.遇到的问题, 4.4到5.4的内核函数变化,需要修改
前面是4.4后面是5.4
 
四.烧录后开机
会在sysfs里面生成相应的cpufreq控制节点/sys/devices/system/cpu/cpufreq/policy0

cpuinfo_cur_freq: 当前cpu正在运行的工作频率
cpuinfo_max_freq:该文件指定了处理器能够运行的最高工作频率 (单位: 千赫兹)
cpuinfo_min_freq :该文件指定了处理器能够运行的最低工作频率 (单位: 千赫兹)
cpuinfo_transition_latency:该文件定义了处理器在两个不同频率之间切换时所需要的时间 (单位: 纳秒)
scaling_available_frequencies:所有支持的主频率列表 (单位: 千赫兹)
scaling_available_governors:该文件显示当前内核中支持的所有cpufreq governor类型
scaling_cur_freq:被governor和cpufreq核决定的当前CPU工作频率。该频率是内核认为该CPU当前运行的主频率
scaling_driver:该文件显示该CPU正在使用何种cpufreq driver
scaling_governor:通过echo命令,能够改变当前处理器的governor类型
scaling_max_freq:显示当前policy的上下限 (单位: 千赫兹)需要注意的是,当改变cpu policy时,需要首先设置scaling_max_freq, 然后才是scaling_min_freq
scaling_setspeed:如果用户选择了“userspace” governor, 那么可以设置cpu工作主频率到某一个指定值。

只需要这个值在scaling_min_freq 和 scaling_max_freq之间即可。

 

 

1、查看当前CPU支持的频率档位
cat scaling_available_frequencies
1300000 1235000 1170000 1040000 819000 598000 442000 299000


2、查看当前支持的governor
cat scaling_available_governors
ondemand userspace powersave interactive performance
performance表示不降频,
ondemand表示使用内核提供的功能,可以动态调节频率,
powersvae表示省电模式,通常是在最低频率下运行,
userspace表示用户模式,在此模式下允许其他用户程序调节CPU频率。


3、查看当前选择的governor
cat caling_governor
ondemand

4、查看系统支持多少核数
cat sys/devices/system/cpu/present
0-3

 

5、全开所有cpu ,在实际设置时,还需要(有root权限才可以设置)

"echo 0 > /proc/hps/enabled" (关闭cpu hotplug)
"echo performance > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor" (固定最高频)
echo 1 > /sys/devices/system/cpu/cpuX/online

X表示(0~3,不同平台CPU core 数是不一样的)


6、设置频率(可以先cat 出来当前的频率有哪些)
 "cat /proc/cpufreq/cpufreq_ptpod_freq_volt"
[0] = { .cpufreq_khz = 1300000, .cpufreq_volt = 113750, .cpufreq_volt_org = 1250
00, },
[1] = { .cpufreq_khz = 1235000, .cpufreq_volt = 110000, .cpufreq_volt_org = 1231
25, },
[2] = { .cpufreq_khz = 1170000, .cpufreq_volt = 106250, .cpufreq_volt_org = 1206
25, },
[3] = { .cpufreq_khz = 1040000, .cpufreq_volt = 98750, .cpufreq_volt_org = 1150
00, },
[4] = { .cpufreq_khz = 819000, .cpufreq_volt = 95000, .cpufreq_volt_org = 1100
00, },
[5] = { .cpufreq_khz = 598000, .cpufreq_volt = 95000, .cpufreq_volt_org = 1050
00, },
[6] = { .cpufreq_khz = 442000, .cpufreq_volt = 95000, .cpufreq_volt_org = 1000
00, },
[7] = { .cpufreq_khz = 299000, .cpufreq_volt = 95000, .cpufreq_volt_org = 9500
0, },

"echo 0 >proc/cpufreq/cpufreq_oppidx"

设置后再cat 看一下当前的设置是否成功

 "cat proc/cpufreq/cpufreq_oppidx"
cpufreq_oppidx = 0
OP(1300000, 113750),
OP(1235000, 110000),
OP(1170000, 106250),
OP(1040000, 98750),
OP(819000, 95000),
OP(598000, 95000),
OP(442000, 95000),
OP(299000, 95000),


7、查看当前状态有多少个CPU
cat sys/devices/system/cpu/online

 

 

推荐阅读