16.78MHz -4ページ目

Linux上でStellaris LM3S811開発環境を整える

Stellaris LM3S811昨年Texas Instruments社に買収されたLuminary Micro社が2006年にリリースしたARMマイコン。USB接続のJTAGハードウェアがオンボードで搭載された評価ボード(96x16モノクロOLEDディスプレイ付き)がDigiKey5000円程で売られている。

Stellarisは内蔵フラッシュメモリにバイナリを書き込んで実行するPICやAVRが幅を利かせているスケールのマイコンだが、小さくてもARM、50MHzで動作するCortexM3コアは32bit整数同士の乗算を1クロックで実行出来る強力な命令セットを備え、一般的な8bitマイコンでは難しい複雑かつ高速な処理を実現できる。

WinARMの作者によると、 LM3S811評価ボードのJTAGハードウェアはOpenOCDからアクセスすることが出来、内蔵フラッシュメモリの書き込みに特別な(ほぼ確実にWindows専用の)ソフトウェアは必要ないらしい。Arduino同様Linux環境からいじれるマイコンのようなので買ってみることにした。

というわけで、arm-none-eabi用のクロスコンパイル環境を整える。
先ほどの記事ではCodesourceryのgccを使っているが、Thumb2サポートは既に本家のgccに含まれているため本家のgccで問題ない。
# export ARM_TOOLCHAIN_DIR="/path/to/toolchaindir"
# export PATH="$PATH:$ARM_TOOLCHAIN_DIR/bin"

本家のgccを使う場合の構築手順はArduinoの場合と殆ど同じで、まずこのあたりから最新のbinutilsをダウンロードする。
# cd binutils-2.20.1
# ./configure --prefix=$ARM_TOOLCHAIN_DIR --target=arm-none-eabi
# make
# make install

次にgccをここからダウンロードしてきてビルドする。C++標準ライブラリのビルドにnewlibのヘッダを使うのでここからダウンロードして展開しておく。
# cd gcc-4.4.3
# mkdir build
# cd build
# ../configure --disable-libssp --prefix=$ARM_TOOLCHAIN_DIR --enable-long-long --enable-c99 --disable-werror --enable-languages=c,c++ --target=arm-none-eabi --enable-interwork --enable-multilib --disable-nls --with-newlib --with-headers=<newlibソースディレクトリ>/newlib/libc/include/ --disable-threads --disable-shared --with-gc=page --with-flat=soft
# make
# make install

続いてnewlib本体をビルドする。
# cd newlib-1.18.0
# mkdir build
# cd build
# ../configure --prefix=$ARM_TOOLCHAIN_DIR --target=arm-none-eabi --enable-interwork --enable-multilib --with-float=soft
# make
# make install

JTAGハードウェアと会話するためにOpenOCDここからダウンロードしてくる。また、OpenOCDをFTDI JTAGハードウェアに対応させるためにはlibftdiが必要なので、ここからダウンロードする。この2つはARM GCCツールチェイン専用のソフトウェアというわけではないので/usr/localあたりに入れておくと良いかもしれない。
# cd libftdi-0.17
# ./configure --prefix=/usr/local --disable-debug --enable-shared --sysconfdir=/etc --localstatedir=/var
# make
# make install
# cd ../openocd-0.4.0
# ./configure --prefix=/usr/local --disable-debug --enable-shared --sysconfdir=/etc --localstatedir=/var --enable-ft2232_libftdi
# make
# make install
# cat <<EOF >openocd.cfg
> source [find interface/luminary-lm3s811.cfg]
> source [find board/ek-lm3s811.cfg]
> source [find target/lm3s811.cfg]
> EOF

これでクロスコンパイル環境が出来上がったので、正常に動くかどうか試しておく。
ここにLM3S811用のldscriptやスタートアップルーチンを同梱したサンプルプログラムが置かれているので、ダウンロードしてきてビルドする。
$ cd lm3s811_evalboard/src
$ make
$ cd ../ev-lm3s811/hello
$ make

問題がなければmain.binという名前でバイナリが出来上がっている。
さて、まだ基板が手元にないのでこのバイナリを実機に転送して試すことは出来ないのだが、
$ qemu-system-arm -M ?
Supported machines are:
syborg Syborg (Symbian Virtual Platform)
musicpal Marvell 88w8618 / MusicPal (ARM926EJ-S)
mainstone Mainstone II (PXA27x)
n800 Nokia N800 tablet aka. RX-34 (OMAP2420)
n810 Nokia N810 tablet aka. RX-44 (OMAP2420)
cheetah Palm Tungsten|E aka. Cheetah PDA (OMAP310)
sx1 Siemens SX1 (OMAP310) V2
sx1-v1 Siemens SX1 (OMAP310) V1
tosa Tosa PDA (PXA255)
akita Akita PDA (PXA270)
spitz Spitz PDA (PXA270)
borzoi Borzoi PDA (PXA270)
terrier Terrier PDA (PXA270)
connex Gumstix Connex (PXA255)
verdex Gumstix Verdex (PXA270)
lm3s811evb Stellaris LM3S811EVB
lm3s6965evb Stellaris LM3S6965EVB
realview ARM RealView Emulation Baseboard (ARM926EJ-S)
versatilepb ARM Versatile/PB (ARM926EJ-S)
versatileab ARM Versatile/AB (ARM926EJ-S)
integratorcp ARM Integrator/CP (ARM926EJ-S) (default)

LM3S811評価ボードは密かにQEMUエミュレートすることが出来る。ここで、QEMU 0.12.xではStellarisのサポートは今のところすごくテキトーなので、QEMU 0.11.x以前を使う。QEMUで先ほどのバイナリを実行するには以下のようにする。
$ qemu-system-arm -M lm3s811evb -kernel main.bin -serial stdio
16.78MHz-LM3S811 on QEMU起動するとこんなのが出てくる。シリアルには標準入出力からアクセス出来る。QEMUのドキュメントによるとADコンバータにも対応しているらしいので、何らかの方法で評価ボードに搭載されているサムホイールを操作出来るはずなのだが、どうやって操作するのかは不明。

ちなみにここから入手できるマニュアルによると、この評価ボードの右端から出ている端子はJTAGで、ここに別のマイコンを接続するとボード上のLM3S811がバイパスされ、単なるJTAGハードウェアとして使用することが出来るらしい。

LinuxでArduino開発環境を整える

Arduinoに搭載されているAVRにはUSB経由でフラッシュメモリにバイナリを書き込むためのブートローダーがあらかじめ書き込まれている。この手のブートローダーと会話する書き込みツールは多くの場合Windows専用で、Linux環境から書き込むためにはJTAGを使う必要がある場合が多いのだが、ありがたいことにArduino開発環境はLinux環境をサポートしている

Linux環境でArduino開発環境を整える手順は以下の通り。

Arduino開発環境はAVRバイナリを生成するためにLinuxユーザにはお馴染みのgcc+binutilsを使うため、まずはAVR用のクロスコンパイラを用意する。
# export AVR_TOOLCHAIN_DIR="/path/to/toolchaindir"
# export PATH="$PATH:$AVR_TOOLCHAIN_DIR/bin"

このあたりから最新のbinutilsをダウンロードする。
# cd binutils-2.20.1
# ./configure --prefix=$AVR_TOOLCHAIN_DIR --target=avr
# make
# make install

次にgccをコンパイルするが、現時点で最新のgcc-4.4系を使用するとArduinoのシリアル通信がハングする問題を回避するため、gcc-4.3系の最新版をこのへんからダウンロードしてくる。Arduino開発環境はg++を使うため、C++サポートを有効にしてコンパイルしなければならない。
# cd gcc-4.3.4
# mkdir build
# cd build
# ../configure --disable-libssp --prefix=$AVR_TOOLCHAIN_DIR --enable-long-long --enable-c99 --disable-werror --enable-languages=c,c++ --target=avr
# make
# make install


Arduino開発環境のライブラリはavr-libcに依存しているので、ここからダウンロードしてくる。
# cd avr-libc-1.6.8
# ./configure --prefix=/opt/avr/ --build=`./config.guess` --host=avr
# make
# make install


Arduino開発環境のGUIはJavaで書かれている。もしシステムにJavaランタイム環境がインストールされていないのであればここからダウンロードしてきてインストールする。
# chmod u+x jre-6u18-linux-i586.bin
# ./jre-6u18-linux-i586.bin

Arduino開発環境はここからダウンロードできる。ソースからビルドしたい場合はここを参考に。バイナリをインストールする場合は単純に展開すれば良いが、毎回フルパスで呼び出すのは面倒なので、パスの通ったところに起動スクリプトを置いておく。Arduino開発環境はバイナリの呼び出し名をもとに必要なファイルを探すディレクトリを決定しているため、シンボリックリンクでは正常に動作しない点に注意。
# tar xzf arduino-0018.tgz
# mv arduino-0018 $AVR_TOOLCHAIN_DIR
# cat <<EOF >$AVR_TOOLCHAIN_DIR/bin/arduino
> #!/bin/sh
> $AVR_TOOLCHAIN_DIR/arduino-0018/arduino
> EOF
# chmod 755 $AVR_TOOLCHAIN_DIR/bin/arduino

これでArduino開発環境は整ったが、もしかすると必要なカーネルドライバが無いためにArduinoを接続しても開発環境のTool->Serial Portに/dev/ttyUSB[0-9]+が現れないかもしれない。その場合カーネルコンフィグのDevice Drivers->USB support->USB Serial Converter supportの中のUSB FTDI Single Port Serial Driverを有効にしてカーネルを再構築すれば良い。

Arduino

*NIXナードにはお馴染みのオライリーが強く推しているマイコンボードArduino
ArduinoはイマドキのLinuxががつがつ動くマイコンボードと比較すると性能面では圧倒的に劣る反面、スタートアップルーチンやライブラリ、バイナリ転送プログラムといったマイコンプログラミングで手間のかかる部分が一通り整っておりハードウェアがとてつもなくシンプルであることもあって、思いついたネタを短時間で仕上げるようなマイコンプログラミングにもってこいである。
というわけで、Strawberry Linuxで注文していたArduino MEGAが届いたので軽くつついてみた
float pos;

void setup() {
pos = 0.0f;
}

void loop() {
unsigned char duty = 127 * sin( pos ) + 127;
analogWrite( 13, duty );
delayMicroseconds( 62 );
pos += 0.001;
}

Arduino MEGAにはオンボードLEDが搭載されており、13番ピンに接続されている。このピンはGPIO又はPWMとして使用することが出来るため、オンボードLEDはGPIOで単純にスイッチすることもPWMで明るさを調節することも可能になっている。ここではPWMを使ってLEDの明るさを周期的に変化させている。

Arduinoを使って音の出るデバイスを作ろうと考えているが、手元に余っている圧電スピーカーがないので今日のところはLEDだけで我慢。

追記: 13番ピンにPWMが繋がっていないArduino Duemilanoveでも動くようにしてみた。
float pos;

void setup() {
pos = 0.0f;
pinMode( 13, OUTPUT );
}
void loop() {
unsigned char duty = 62 * sin( pos ) + 62;
digitalWrite( 13, HIGH );
delayMicroseconds( 4 + duty );
digitalWrite( 13, LOW );
delayMicroseconds( 128 - duty );
pos += 0.002;
}

Tower System

Freescaleからちょっと変わったマイコンキット、Tower System
m68kの亡霊ColdFireプロセッサ(80MHz)を積んだコントローラボードと好みのペリフェラルボードを左右のエレベータボードを介してスタックすることで目的に合った機能を持ったデバイスを素早く作ることが出来る、というもの。高い拡張性を持ったマイコンボードとしてはGumstixなんてのが既にあるが、Tower SystemはGumstixと比べて

遅い
安い
そびえ立つ

といった特徴がある。
ボード間の通信はまさかのPCI Expressで行われている。80MHzの組み込みマイコンにはオーバースペックな気がするが、FreescaleはTower規格で様々なコントローラボードを出すつもりのようなので、今後もっと強力なコントローラボードが出てくるのかもしれない

Tower SystemはFreescaleにしては珍しく1枚から直販で購入可能。
コントローラボード、シリアルボード、エレベータボードがセットになったすぐに始められるセット$99から$119

Tegra2

SIGGRAPH ASIAnvidiaブースには何故か全く展示されていなかった同社のポータブルデバイス向けプロセッサ、Tegra新型がそのすぐ後のCESで発表された。
TegraシリーズはARMプロセッサをコアにnvidia自慢のグラフィックアクセラレータを組み込んで極端に高いグラフィック処理性能を持たせた製品。
CESで発表されたTegra 250デュアルコアARM CortexA9 1GHzにGeForce7800クラスの3Dアクセラレータ(最大解像度1920x1080)、 最大12メガピクセルまでのカメラ入力を処理するイメージングプロセッサ、1080p対応H.264エンコーダ/デコーダと従来のARM SoCとは一線をかくす性能を0.5Wという冗談のようなTDPで実現したシステムになっている。
さて、従来のTegraといえばフルHD対応など魅力的な性能を備えていながら対応デバイスがなかなか出てこず、やっと出たと思ったら日本ではリリースされないZuneHDなど、個人レベルでいじれるチャンスが殆ど無い一品だったわけだが、Engadgetによると既に50以上のTegra 250採用製品が開発中であり、IDCからは既にTegra 250搭載Androidタブレットの仕様が発表されているなど年内にTegra 250を搭載したタブレットPCが次々出てきそうな雰囲気になっている。

今年は昨年にもまして小さなデバイスから目が離せない年になりそうだ。