QEMU-FM3 をMacで動かす

Interface6月号「ARMコア搭載FM3マイコンではじめる組み込み開発」特集で付録にFM3がついてきたので、そちら方面のみなさんは入手されている方も多そうですが、いかんせん組込み方面ではMacは肩身が狭い気がする今日この頃です。

Interface (インターフェース) 2012年 06月号 [雑誌]

Interface (インターフェース) 2012年 06月号 [雑誌]

このFM3もご多分に漏れず、「USB経由でCPU内蔵フラッシュROMも書き換え可能」ということになっているものの、それにはツールが必要で、そのツールもWindows用しか公開されてないわけで……ううむ。悩ましいですね。

というわけで、そっちはあとで何とかすることにして、まずはエミュレータでも動かしてみます。


Interface7月号のDVDに、QEMUに手を入れてFM3のエミュレーションをできるようにしたQEMU-FM3が収録されています。が、こちらに同梱されているqemuの実行ファイルとしてはWindows用のqemu-system-arm.exeしか入っていません。むむむ。

ところが。ありがたいことに、QEMU-FM3はソースでも公開されているのでした。素晴らしいですね! ソースさえあれば自力でビルドできそうです。試してみましょう。

ここのページの2012年7月号「特集 第9章 QEMUへのFM3エミュレーションの実装(前編)」の「QEMUソース一式」(qemu-fm3-1.0.1-pylone1.zip)がそれです。ついでにJava製のGUIと実行用バッチファイルが同梱されている「ビルド済み実行形式&サンプル・プログラム」(QEMU_FM3.zip)もダウンロードしておきます。

ところで、このqemuは1.0.1ベースのようですが、1.0.1は実はMacではビルドできないようです。どうもuint16がOS Xで元々使っているものとバッティングしているのが問題とかのようです。このため、qemu-fm3-1.0.1-pylone1.zipもそのままではビルドできません。

こういう時にぜひ参考にしたいのがmacportsです(まあhomebrewでもいいんですが)。macportsではqemu-1.0.1がすでにサポートされています。これはつまり、macports側でパッチを提供しているわけで、これを利用すればQEMU-FM3もビルドできるようになります。

macportsをインストールしている人は、

にあるファイル、patch-cocoa-uint16-redefined.diffとpatch-configure.diffを使います。

homebrewについても、

を見ると、同じファイルを参照しているようです(diffとったら同じでした)。ここで参照している以下のファイルをダウンロードしてきてもいいでしょう。

パッチファイルを持ってきたら、とりあえず ~/tmp/ にでも置いておきましょう。

以下のようにqemu-fm3-1.0.1-pylone1.zipを展開し、パッチをあててconfigure; makeを実行します。

$ unzip qemu-fm3-1.0.1-pylone1.zip
$ cd qemu-fm3-1.0.1-pylone1
$ patch -p0 < ~/tmp/patch-cocoa-uint16-redefined.diff 
$ patch -p0 < ~/tmp/patch-configure.diff 
$ ./configure --target-list=arm-softmmu
$ make

途中warningが出ますが、無事にビルドできれば完了です。qemu自体は、

$ ./arm-softmmu/qemu-system-arm 

で実行できるようになります。

さっそくFM3用のプログラムを実行してみます。
ついでにQEMU_FM3.zipに入っているGUIも合わせて試してみることにしましょう。

実行するサンプルは、QEMU_FM3.zipに入っているLEDsampleにしてみます。実行ファイルはLEDsample.outとしてビルド済みで、それを動かすためのバッチがLEDsample.batなので、これを元にシェルスクリプトに直します。

QEMU_FM3.zipを展開して、中に入っているLEDsample.batを以下のように変更したファイル、LEDsample.shを作ります。

#!/bin/sh

java -jar FM3_CPU.jar &

QEMUFM3_PORT_MONITOR="1200"
QEMUFM3_PORT_GPIO="1201"
QEMUFM3_PORT_UART0="1202"
QEMUFM3_PORT_UART3="1203"
QEMUFM3_PORT_UART4="1204"

QEMUFM3_MACHINE_NAME="cq-frk-fm3"
##QEMUFM3_MACHINE_NAME=cq-frk-fm3-ex

QEMUFM3_IMAGE_FILE="LEDsample.out"

#QEMUFM3_

./qemu-system-arm \
	-S -M $QEMUFM3_MACHINE_NAME \
	-kernel $QEMUFM3_IMAGE_FILE \
	-nographic \
	-chardev socket,server,host=0.0.0.0,port=$QEMUFM3_PORT_GPIO,id=fm3gpio,nowait \
	-device fm3-gpio-control,chardev=fm3gpio \
	-monitor telnet:0.0.0.0:$QEMUFM3_PORT_MONITOR,server,nowait \
	-serial telnet:0.0.0.0:$QEMUFM3_PORT_UART0,server,nowait \
	-serial telnet:0.0.0.0:$QEMUFM3_PORT_UART3,server,nowait \
	-serial telnet:0.0.0.0:$QEMUFM3_PORT_UART4,server,nowait

さらに、QEMU_FM3を展開したディレクトリに先ほどビルドしたqemu-system-armを同じディレクトリのなかにコピーしておきます。

そして、LEDsample.shを実行します。まとめると、以下のようになります。

$ unzip QEMU_FM3.zip
$ cd QEMU_FM3
$ cp LEDsample.bat LEDsample.sh
$ vi LEDsample.sh   ### 上記のファイルと差し替える
$ chmod 775 LEDsample.sh
$ cp ../qemu-fm3-1.0.1-pylone1/arm-softmmu/qemu-system-arm .  ### 実行ファイルのパスは適当に
$ ./LEDsample.sh

上手くいけば、こんな感じでLEDの点滅(のエミュレート)が実現できます。

また、シェルスクリプトを見て分かる通り、1200番ポートでQEMUのmonitorに接続できます。

$ telnet localhost 1200
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
QEMU 1.0.1 monitor - type 'help' for more information
(qemu) 

ここで「info registers」とか「info mtree」とか、モニタ用のコマンドが使用できます。


といった流れで、一通りMacでもエミュレータで遊ぶことができそうです。めでたしめでたし。