トップ «前の日記(2011年09月10日) 最新 次の日記(2011年09月22日)» 編集

Masa's blog

検索キーワード:

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のスペカカーネルソースをゲットできた。