Armadillo-500を532MHz駆動へ

Armadillo-500はデフォルトが400MHzで動いているのだけど、フリースケールの評価ボードと京都マイクロの評価ボードがそうであるように、この石は532MHzでも動くらしい。
これを変更する設定を探して、上でLinuxの中を探し回ったのだけど、当たり前ながら見つからなかったので、ブートローダのhermitのソースを追っかけてみたら簡単に見つけてしまった。というか、ブートローダの機能として用意されていた(マニュアルには記述されてないっぽい?)やるな…アットマーク…。

const command_t setclock_command =
    {"setclock", "<400/532>", "set mcu_clk", &setclock_cmdfunc};

というのを参考に、hermit上で、

hermit> setclock
clock: 400

setclockしてみると、400MHzに設定されている。これを、

hermit> setclock 532
hermit> setclock
clock: 532

と、すると表記上は532MHzになったっぽい。Linuxを起動して、

# cat /proc/cpu/clocks
----省略----
cpu_clk-0:              533333333, 0, mcu_pll-0
serial_pll-0:           294912032, 0, ckih-0
mcu_pll-0:              533333333, 2, ckih-0
----省略----

となっているので、533MHzで動いているらしい。400MHzの時は、

cpu_clk-0:              400000000, 0, mcu_pll-0
serial_pll-0:           294912032, 0, ckih-0
mcu_pll-0:              400000000, 2, ckih-0

と出ている。
ベンチマークを取ってみた。ソースはこんな感じで、コンパイル時は-O2を"つけない"。

#include <stdio.h>

int main(void){
    int i,j,k=0;

    for(i=0;i<10;i++){
        for(j=0;j<0x0fffffff;j++){
            k++;
        }
    }

    return 0;
}

400MHz

$ time ./bench

real    1m40.801s
user    1m40.790s
sys     0m0.010s

532MHz

$ time ./bench

real    1m15.621s
user    1m15.600s
sys     0m0.010s

ということで、クロックの比通り、75%の時間になっている。533MHzで動いているらしい。

ちなみに、データシートを眺めてみると、

The heart of the i.MX31 and i.MX31L is an ARM1136JF-S core, which can run at speeds up to 665 MHz
and is optimized for minimal power consumption, using the most advanced techniques for power saving
(including DPTC, DVFS, power gating, and clock gating). With 90 nm technology and dual VT, the
i.MX31 and i.MX31L offer an optimum balance of performance versus current leakage.

という記述があるので、600MHzオーバも可能なのか?