2011年09月19日 クロック周波数 on ARMedslack with SL-C860 [長年日記]
_ クロック周波数 on ARMedslack with SL-C860
linux-2.6.36.4の標準機能で、クロック周波数を変えることができる。
この機能を使う場合はカーネルにCPU Frequency scalingを組み込む必要がある。
make menuconfig
CPU Power Management --->
[*] CPU Frequency scaling
[ ] Enable CPUfreq debugging
<*> CPU frequency translation statistics
[ ] CPU frequency translation statistics details
Default CPUFreq governor (performance) --->
(X) performance
( ) powersave
( ) userspace
( ) ondemand
( ) conservative
-*- 'performance' governor
<*> 'powersave' governor
<*> 'userspace' governor for userspace frequency scaling
<*> 'ondemand' cpufreq policy governor
<*> 'conservative' cpufreq governor
[ ] CPU idle PM support
scaling_governor : performance
scaling_governorに"performance"を書き込むと、クロック周波数がscaling_max_freqの示す値に設定される(通常 398MHz)。最高のパフォーマンスを得たい場合に設定する。ただし、消費電力は最も高い。
# echo performance >/sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
scaling_governor : powersave
scaling_governorに"powersave"を書き込むと、クロック周波数がscaling_min_freqの示す値に設定される(通常 99MHz)。消費電力を最も低く抑えたい場合に設定する。ただし、パフォーマンスは最も低い。
# echo powersave >/sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
scaling_governor : userspace
scaling_governorに"userspace"を書き込むと、クロック周波数をscaling_setspeedに書き込んだ任意の値(KHz)に設定できる。ただし、実際にはカーネル内にハードコーディングされた何段階かの値にまるめられて設定されるよう。
# echo userspace >/sys/devices/system/cpu/cpu0/cpufreq/scaling_governor # echo 200000 >/sys/devices/system/cpu/cpu0/cpufreq/scaling_setspeed # cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_setspeed 265400
scaling_governor : conservative
scaling_governorに"conservative"を書き込むと、クロック周波数をシステムの負荷に応じて最適な値に設定してくれる。次の"ondemand"に比べてクロック周波数がゆるやかに変化するアルゴリズムとなっており、バッテリ駆動時に向いているらしい。
# echo conservative >/sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
ただし、この状態でサスペンドさせると復帰(レジューム)できないという問題があるので注意。また、若干システムが不安定になる(動的ライブラリが呼び出せなくなる)ことがあるようす。==> やっぱり不安定。いろんなコマンドでセグメンテーション違反が発生。常用は不可。
scaling_governor : ondemand
scaling_governorに"ondemand"を書き込むと、クロック周波数をシステムの負荷に応じて最適な値に設定してくれる。
ただし、ARMedslack-13.1+linux-2.6.36.4+SL-C860の環境では動作が不安定になって、実質使用不可だった。
オーバークロックの可能性
上記の方法では、クロックの上限は398MHzとなる。linux-2.4.xベースのスペシャルカーネルではオーバークロックを実現しているので、linux-2.6.xベースでも不可能ではないと思う。
おそらく、/usr/src/linux/arch/arm/mach-pxa/cpufreq-pxa2xx.cの、以下の部分に適切なパラメータを書き加えればうまく行くのではないかと想像する。
83 /*
84 * PXA255 definitions
85 */
86 /* Use the run mode frequencies for the CPUFREQ_POLICY_PERFORMANCE policy */
87 #define CCLKCFG CCLKCFG_TURBO | CCLKCFG_FCS
88
89 static pxa_freqs_t pxa255_run_freqs[] =
90 {
91 /* CPU MEMBUS CCCR DIV2 CCLKCFG run turbo PXbus SDRAM */
92 { 99500, 99500, 0x121, 1, CCLKCFG, -1, -1}, /* 99, 99, 50, 50 */
93 {132700, 132700, 0x123, 1, CCLKCFG, -1, -1}, /* 133, 133, 66, 66 */
94 {199100, 99500, 0x141, 0, CCLKCFG, -1, -1}, /* 199, 199, 99, 99 */
95 {265400, 132700, 0x143, 1, CCLKCFG, -1, -1}, /* 265, 265, 133, 66 */
96 {331800, 165900, 0x145, 1, CCLKCFG, -1, -1}, /* 331, 331, 166, 83 */
97 {398100, 99500, 0x161, 0, CCLKCFG, -1, -1}, /* 398, 398, 196, 99 */
98 };
99
100 /* Use the turbo mode frequencies for the CPUFREQ_POLICY_POWERSAVE policy */
101 static pxa_freqs_t pxa255_turbo_freqs[] =
102 {
103 /* CPU MEMBUS CCCR DIV2 CCLKCFG run turbo PXbus SDRAM */
104 { 99500, 99500, 0x121, 1, CCLKCFG, -1, -1}, /* 99, 99, 50, 50 */
105 {199100, 99500, 0x221, 0, CCLKCFG, -1, -1}, /* 99, 199, 50, 99 */
106 {298500, 99500, 0x321, 0, CCLKCFG, -1, -1}, /* 99, 287, 50, 99 */
107 {298600, 99500, 0x1c1, 0, CCLKCFG, -1, -1}, /* 199, 287, 99, 99 */
108 {398100, 99500, 0x241, 0, CCLKCFG, -1, -1}, /* 199, 398, 99, 99 */
109 };
110
111 #define NUM_PXA25x_RUN_FREQS ARRAY_SIZE(pxa255_run_freqs)
112 #define NUM_PXA25x_TURBO_FREQS ARRAY_SIZE(pxa255_turbo_freqs)
とりあえず、スペカのソースを参考にしようと、http://tetsu.homelinux.orgをたずねたが、ここしばらくサーバが落ちているよう。
しばらくググっていたら、http://katastrophos.net/zaurus/mirrors/tetsu.homelinux.org/index_tetsu.homelinux.org.htmlというミーラーサイトを発見。無事SL-C860のスペカカーネルソースをゲットできた。