【适用范围】
全志平台他Tina系统linux4.9,Tina3.0.1-Tina3.0.3,再往后的版本应该修复了这个问题,此处以R331为例
【问题现象】
选中CPU Power Management 下的 CPU Frequency scaling和改目录下的CPU驱动SUNXI CPUFreq support
编译时报错:
代码语言:javascript复制drivers/built-in.o: In function `sunxi_cpufreq_set_vf':
/home/chenkunyao/workspace/tina2.0/atina/lichee/linux-4.9/drivers/cpufreq/sunxi-cpufreq.c:279: undefined reference to `arisc_dvfs_cfg_vf_table'
make[5]: *** [vmlinux] Error 1
make[5]: Leaving directory `/home/chenkunyao/workspace/tina2.0/atina/lichee/linux-4.9'
make[4]: *** [/home/chenkunyao/workspace/tina2.0/atina/out/bassoon-perf1/compile_dir/target/linux-bassoon-perf1/linux-4.9.56/.image] Error 2
make[4]: Leaving directory `/home/chenkunyao/workspace/tina2.0/atina/target/allwinner/bassoon-perf1'
make[3]: *** [install] Error 2
make[3]: Leaving directory `/home/chenkunyao/workspace/tina2.0/atina/target/allwinner'
make[2]: *** [target/allwinner/install] Error 2
make[2]: Leaving directory `/home/chenkunyao/workspace/tina2.0/atina'
make[1]: *** [/home/chenkunyao/workspace/tina2.0/atina/out/bassoon-perf1/staging_dir/target/stamp/.target_install] Error 2
make[1]: Leaving directory `/home/chenkunyao/workspace/tina2.0/atina'
make: *** [world] 错误 2
#### make failed to build some targets (14:35 (mm:ss)) ####
【问题原因】
没打patch,cpufreq接口没开
【解决方法】
linux4.9目录下打上patch:
代码语言:javascript复制From XXXXXXXXXXXXXXXXX Mon Sep 17 00:00:00 2001
From: XXXXXXX@allwinnertech.com
Date: Thu, 30 Aug 2018 09:45:55 0800
Subject: [PATCH 89/92] sun8iw8p1: boobam_std: support dvfs
Change-Id: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Signed-off-by: XXXXXX <XXXXXXX@allwinnertech.com>
---
arch/arm/boot/dts/sun8iw8p1.dtsi | 74
drivers/cpufreq/sunxi-cpufreq.c | 9 ---
2 files changed, 79 insertions( ), 4 deletions(-)
diff --git a/arch/arm/boot/dts/sun8iw8p1.dtsi b/arch/arm/boot/dts/sun8iw8p1.dtsi
index fa53820..3e1a09a 100644
--- a/arch/arm/boot/dts/sun8iw8p1.dtsi
b/arch/arm/boot/dts/sun8iw8p1.dtsi
@@ -37,6 37,7 @@
};
cpus {
enable-method = "allwinner,sun8iw8p1";
#address-cells = <1>;
#size-cells = <0>;
@@ -44,10 45,83 @@
device_type = "cpu";
compatible = "arm,cortex-a7";
reg = <0x0>;
enable-method = "psci";
clocks = <&clk_pll_cpu>;
clock-latency = <2000000>;
clock-frequency = <1008000000>;
operating-points-v2 = <&cpu_opp_l_table0>;
/*cpu-idle-states = <&CPU_SLEEP_0 &CLUSTER_SLEEP_0 &SYS_SLEEP_0>;*/
};
};
opp_dvfs_table:opp_dvfs_table {
cluster_num = <1>;
opp_table_count = <1>;
cpu_opp_l_table0: opp_l_table0 {
compatible = "allwinner,opp_l_table0";
opp_count = <8>;
opp-shared;
opp00 {
opp-hz = /bits/ 64 <60000000>;
opp-microvolt = <1040000>;
axi-bus-divide-ratio = <3>;
clock-latency-ns = <2000000>;
};
opp01 {
opp-hz = /bits/ 64 <480000000>;
opp-microvolt = <1040000>;
axi-bus-divide-ratio = <3>;
clock-latency-ns = <2000000>;
};
opp02 {
opp-hz = /bits/ 64 <648000000>;
opp-microvolt = <1040000>;
axi-bus-divide-ratio = <3>;
clock-latency-ns = <2000000>;
};
opp03 {
opp-hz = /bits/ 64 <720000000>;
opp-microvolt = <1100000>;
axi-bus-divide-ratio = <3>;
clock-latency-ns = <2000000>;
};
opp04 {
opp-hz = /bits/ 64 <816000000>;
opp-microvolt = <1100000>;
axi-bus-divide-ratio = <3>;
clock-latency-ns = <2000000>;
};
opp05 {
opp-hz = /bits/ 64 <912000000>;
opp-microvolt = <1200000>;
axi-bus-divide-ratio = <3>;
clock-latency-ns = <2000000>;
};
opp06 {
opp-hz = /bits/ 64 <1080000000>;
opp-microvolt = <1200000>;
axi-bus-divide-ratio = <3>;
clock-latency-ns = <2000000>;
};
opp07 {
opp-hz = /bits/ 64 <1200000000>;
opp-microvolt = <1320000>;
axi-bus-divide-ratio = <3>;
clock-latency-ns = <2000000>;
};
};
};
memory@40000000 {
device_type = "memory";
reg = <0x00000000 0x40000000 0x00000000 0x4000000>; /* 64M*/
diff --git a/drivers/cpufreq/sunxi-cpufreq.c b/drivers/cpufreq/sunxi-cpufreq.c
index ff74e07..f0480a2 100644
--- a/drivers/cpufreq/sunxi-cpufreq.c
b/drivers/cpufreq/sunxi-cpufreq.c
@@ -188,8 188,9 @@ static int sunxi_set_cpufreq_and_voltage(struct cpufreq_policy *policy,
struct device *cpu_dev;
cpu_dev = get_cpu_device(policy->cpu);
-
-
#if defined(CONFIG_ARCH_SUN8IW8P1)
freq *= 1000;
#endif
return dev_pm_opp_set_rate(cpu_dev, freq);
}
#endif
@@ -275,9 276,9 @@ static int sunxi_cpufreq_set_vf(struct cpufreq_frequency_table *table,
memcpy((void *)kvir, (void *)cpufreq_dvfs_table,
num * sizeof(struct cpufreq_frequency_table));
__dma_flush_area((void *)kvir, num * sizeof(struct cpufreq_frequency_table));
-
#ifndef CONFIG_ARCH_SUN8IW8P1
arisc_dvfs_cfg_vf_table(0, num, virt_to_phys(kvir));
-
#endif
kfree(kvir);
kvir = NULL;
--
1.9.1
make kernel_menuconfig下的配置如下:
选中CPU Power Management 下的 CPU Frequency scaling
选中几个需要的调频策略,如:
userspace 根据用户的选择调节
往下拉把 CPU驱动SUNXI CPUFreq support选上。
重新编译即可。
烧录后查看cpufreq节点:
cd /sys/devices/system/cpu/cpu0/cpufreq
查看当前cpu频率的办法
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq