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

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ハードウェアとして使用することが出来るらしい。