iMX8MのCPU周波数を下げる方法
一部のアプリケーションではCPU周波数を下げる必要がありますが、当社のBSPやデバイスに慣れていない方は設定の際にサポートが必要かもしれません。
この投稿では、iMX8MP、iMX8MN、iMX8MMで低周波数(100MHz、200MHz、400MHz、600MHz、800MHz、1000MHz)を設定するための構成を共有します。
注意:カーネル6.1.xxで動作します(最も古いBSPではテストされていません)
1- 低い周波数に適切なパラメータを設定するために、PLLドライバーを変更する必要があります。
修正するファイルは「clk-pll14xx.c」です。次の行を追加します:
https://github.com/nxp-imx/linux-imx/blob/770c5fe2c1d1529fae21b7043911cd50c6cf087e/drivers/clk/imx/clk-pll14xx.c#L57
static const struct imx_pll14xx_rate_table imx_pll1416x_tbl[] = {
PLL_1416X_RATE(1800000000U, 225, 3, 0),
PLL_1416X_RATE(1600000000U, 200, 3, 0),
PLL_1416X_RATE(1500000000U, 375, 3, 1),
PLL_1416X_RATE(1400000000U, 350, 3, 1),
PLL_1416X_RATE(1200000000U, 300, 3, 1),
PLL_1416X_RATE(1000000000U, 250, 3, 1),
PLL_1416X_RATE(800000000U, 200, 3, 1),
PLL_1416X_RATE(750000000U, 250, 2, 2),
PLL_1416X_RATE(700000000U, 350, 3, 2),
PLL_1416X_RATE(600000000U, 300, 3, 2),
+ PLL_1416X_RATE(400000000U, 200, 3, 2),
+ PLL_1416X_RATE(200000000U, 200, 3, 3),
+ PLL_1416X_RATE(100000000U, 200, 3, 4),
};
2- pllドライバーを変更したら、使用するデバイスに応じてoppテーブルに値を追加するだけです。
2.1- iMX 8MPの場合:
https://github.com/nxp-imx/linux-imx/blob/lf-6.1.y/arch/arm64/boot/dts/freescale/imx8mp.dtsi
a53_opp_table: opp-table {
compatible = "operating-points-v2";
opp-shared;
+ opp-100000000 {
+ opp-hz = /bits/ 64 <100000000>;
+ opp-microvolt = <850000>;
+ opp-supported-hw = <0x8a0>, <0x7>;
+ clock-latency-ns = <150000>;
+ opp-suspend;
+ };
+ opp-200000000 {
+ opp-hz = /bits/ 64 <200000000>;
+ opp-microvolt = <850000>;
+ opp-supported-hw = <0x8a0>, <0x7>;
+ clock-latency-ns = <150000>;
+ opp-suspend;
+ };
+ opp-400000000 {
+ opp-hz = /bits/ 64 <400000000>;
+ opp-microvolt = <850000>;
+ opp-supported-hw = <0x8a0>, <0x7>;
+ clock-latency-ns = <150000>;
+ opp-suspend;
+ };
+ opp-600000000 {
+ opp-hz = /bits/ 64 <600000000>;
+ opp-microvolt = <850000>;
+ opp-supported-hw = <0x8a0>, <0x7>;
+ clock-latency-ns = <150000>;
+ opp-suspend;
+ };
+ opp-800000000 {
+ opp-hz = /bits/ 64 <800000000>;
+ opp-microvolt = <850000>;
+ opp-supported-hw = <0x8a0>, <0x7>;
+ clock-latency-ns = <150000>;
+ opp-suspend;
+ };
+ opp-1000000000 {
+ opp-hz = /bits/ 64 <1000000000>;
+ opp-microvolt = <850000>;
+ opp-supported-hw = <0x8a0>, <0x7>;
+ clock-latency-ns = <150000>;
+ opp-suspend;
+ };
opp-1200000000 {
opp-hz = /bits/ 64 <1200000000>;
2.2 iMX8MMの場合:
https://github.com/nxp-imx/linux-imx/blob/lf-6.1.y/arch/arm64/boot/dts/freescale/imx8mm.dtsi
a53_opp_table:
opp-table {
compatible = "operating-points-v2";
opp-shared;
+ opp-100000000 {
+ opp-hz = /bits/ 64 <100000000>;
+ opp-microvolt = <850000>;
+ opp-supported-hw = <0xe>, <0x7>;
+ clock-latency-ns = <150000>;
+ opp-suspend;
+ };
+ opp-200000000 {
+ opp-hz = /bits/ 64 <200000000>;
+ opp-microvolt = <850000>;
+ opp-supported-hw = <0xe>, <0x7>;
+ clock-latency-ns = <150000>;
+ opp-suspend;
+ };
+ opp-400000000 {
+ opp-hz = /bits/ 64 <400000000>;
+ opp-microvolt = <850000>;
+ opp-supported-hw = <0xe>, <0x7>;
+ clock-latency-ns = <150000>;
+ opp-suspend;
+ };
+ opp-600000000 {
+ opp-hz = /bits/ 64 <600000000>;
+ opp-microvolt = <850000>;
+ opp-supported-hw = <0xe>, <0x7>;
+ clock-latency-ns = <150000>;
+ opp-suspend;
+ };
+ opp-800000000 {
+ opp-hz = /bits/ 64 <800000000>;
+ opp-microvolt = <850000>;
+ opp-supported-hw = <0xe>, <0x7>;
+ clock-latency-ns = <150000>;
+ opp-suspend;
+ };
+ opp-1000000000 {
+ opp-hz = /bits/ 64 <1000000000>;
+ opp-microvolt = <850000>;
+ opp-supported-hw = <0xe>, <0x7>;
+ clock-latency-ns = <150000>;
+ opp-suspend;
+ };
opp-1200000000 {
opp-hz = /bits/ 64 <1200000000>;
2.3- iMX8MNの場合:
https://github.com/nxp-imx/linux-imx/blob/lf-6.1.y/arch/arm64/boot/dts/freescale/imx8mn.dtsi
compatible = "operating-points-v2";
opp-shared;
+ opp-100000000 {
+ opp-hz = /bits/ 64 <100000000>;
+ opp-microvolt = <850000>;
+ opp-supported-hw = <0xb00>, <0x7>;
+ clock-latency-ns = <150000>;
+ opp-suspend;
+ };
+
+ opp-200000000 {
+ opp-hz = /bits/ 64 <200000000>;
+ opp-microvolt = <850000>;
+ opp-supported-hw = <0xb00>, <0x7>;
+ clock-latency-ns = <150000>;
+ opp-suspend;
+ };
+
+ opp-400000000 {
+ opp-hz = /bits/ 64 <400000000>;
+ opp-microvolt = <850000>;
+ opp-supported-hw = <0xb00>, <0x7>;
+ clock-latency-ns = <150000>;
+ opp-suspend;
+ };
+
+ opp-600000000 {
+ opp-hz = /bits/ 64 <600000000>;
+ opp-microvolt = <850000>;
+ opp-supported-hw = <0xb00>, <0x7>;
+ clock-latency-ns = <150000>;
+ opp-suspend;
+ };
+
+ opp-800000000 {
+ opp-hz = /bits/ 64 <800000000>;
+ opp-microvolt = <850000>;
+ opp-supported-hw = <0xb00>, <0x7>;
+ clock-latency-ns = <150000>;
+ opp-suspend;
+ };
+
+ opp-1000000000 {
+ opp-hz = /bits/ 64 <1000000000>;
+ opp-microvolt = <850000>;
+ opp-supported-hw = <0xb00>, <0x7>;
+ clock-latency-ns = <150000>;
+ opp-suspend;
+ };
+
opp-1200000000 {
opp-hz = /bits/ 64 <1200000000>;
opp-microvolt = <850000>;
その後、Linuxでの変更点を記録してください。
これらのコマンドはシステムおよび現在の設定に関する情報を返します。
• カーネルは特定周波数のみに対応するように事前構成されています。現在サポートされている周波数一覧の
入手先:
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies
• 利用可能なスケーリングガバナーを取得するには:
cat /sys/devices/system/cpu/*/cpufreq/scaling_available_governors
• 現在のCPU周波数を確認する:
cat /sys/devices/system/cpu/*/cpufreq/cpuinfo_cur_freq
周波数は、ガバナーの設定に応じて表示されます。
・最大周波数を確認するには:
cat /sys/devices/system/cpu/*/cpufreq/cpuinfo_max_freq
・最小周波数を確認するには:
cat /sys/devices/system/cpu/*/cpufreq/cpuinfo_min_freq
一定CPU周波数を設定するコマンド:
• 最大周波数を使用する:
echo performance > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
• 現在の周波数を一定周波数として使用する:
echo userspace > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
• 以下2つのコマンドは、スケーリング・ガバナーを指定の周波数に設定します(その周波数がサポートされている場合)。
その周波数がサポートされていない場合、サポートされている周波数で最も近いものが使用されます:
echo userspace > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
echo > /sys/devices/system/cpu/cpu0/cpufreq/scaling_setspeed
i.MX 8M | i.MX 8M Mini | i.MX 8M Nano Linux Re: iMX8MのCPU周波数を下げる方法 これは本当に有用で役立つ情報です。 同様の方法を使ってIMX8M CPUで800 MHz、1 GHz、1.5 GHzを有効化しました。 異なる周波数で動作させた場合、消費電力に変化はありましたか?私の方では変化していません。
記事全体を表示