FM3

2012-04

FM3付録基板

/ATMEL_AVR/jpg/FM3img.jpg

とりあえず

  • armon/armboot(のUSBカスタムデバイス版)を移植してみる。



FM3開発環境の入手(gcc)

  • Maple IDE に 安定版(おすすめ)の CodeSourcery G++ Liteが含まれています
  • 下記ページから


  • をクリックして、maple-ide-0.0.12-windowsxp32.zip をダウンロードします。
  • OS環境がWindowsでない場合は、適宜それぞれのバイナリーを入手してください。

入手したら、(例えば)D:\ドライブ直下に展開します。

  • そうすると、以下のディレクトリにgccの実行ファイル(arm-none-eabi-gcc.exeなど)が出来ます。
    D:\maple-ide-0.0.12-windowsxp32\hardware\tools\arm\bin\
  • そのディレクトリに実行パスを通します。
    D:\> path D:\maple-ide-0.0.12-windowsxp32\hardware\tools\arm\bin;%PATH%
         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  • 実行パスの通し方は、コントロールパネル->システム->詳細設定->環境変数 を選んで、ユーザーの環境変数PATH を新規に作成して、値を
    D:\maple-ide-0.0.12-windowsxp32\hardware\tools\arm\bin
  • にするか、上記の下線部を書いた短いファイル名のバッチファイルを、すでに実行パスが通っている場所に置いて、DOSプロンプトを開いた後で実行するか、どちらでもOKです。

FM3開発環境でのコンパイルのしかた。

  • 下記のfm3vcom.zipを入手して、同じようにD:\ドライブ直下に展開してください。
  • そしてDOSプロンプトから、該当のディレクトリに移動します。
    D:> cd \fm3vcom\src
    D:> cs-make
  • cs-makeでは、最初に .dep/ ディレクトリが無いというエラーが出る場合がありますので、そのときは、
    D:> cd \fm3vcom\src
    D:> mkdir .dep
    D:> cs-make
  • という風に .depという名前の依存ファイル用のテンポラリディレクトリを用意しておくとうまくいきます。
  • cs-make以外の、普通のGNU make( MinGWやWinAVRなどに付属のもの)では .depは自動作成されるようです。






USBカスタムファーム・ダウンロード

これは、FM3基板をUSBカスタム(BULK)デバイスにしてしまうファームウェアです

ファームウェア(16kB)、Windows用クライアント(コマンドラインツール)、ソースファイル一式


  • 急ごしらえなので、微妙にだめなところも残っています。
    • 例えば、printfの結果をPCに転送する処理がバルク転送対応出来ていないのでuser関数のprintとか動きません。 ---動いているみたいです。
  • なぜかarmboot.exeまで動いています。不思議。3時間のやっつけ仕事なのに・・・
  • コマンドラインツールの実行例です。
    E:\armboot\src>armon
    TARGET DEV_ID=f3 VER=1.1(Bootloader) FLASH USED=7560,TOTAL=100000
    ARM> d
    00000000 00 ff 00 20 5d 03 00 00  01 02 00 00 05 02 00 00
    00000010 09 02 00 00 0d 02 00 00  11 02 00 00 15 02 00 00
    00000020 19 02 00 00 1d 02 00 00  21 02 00 00 25 02 00 00
    00000030 29 02 00 00 2d 02 00 00  31 02 00 00 35 02 00 00
    00000040 39 02 00 00 3d 02 00 00  41 02 00 00 45 02 00 00
    00000050 49 02 00 00 4d 02 00 00  51 02 00 00 55 02 00 00
    00000060 59 02 00 00 5d 02 00 00  61 02 00 00 65 02 00 00
    00000070 69 02 00 00 6d 02 00 00  71 02 00 00 75 02 00 00
    ARM> l 35c
    0000035c b508           push    {r3, lr}
    0000035e 4b22           ldr     r3, [pc, #136]  ; r3 = #$1fff0238
    00000360 4a22           ldr     r2, [pc, #136]  ; r2 = #$55aa0f00
    00000362 6819           ldr     r1, [r3, #0]
    00000364 4291           cmp     r1, r2
    00000366 d10c           bne.n   $00000382
    00000368 6858           ldr     r0, [r3, #4]
    0000036a 3201           adds    r2, #1
    0000036c 4290           cmp     r0, r2
    0000036e d108           bne.n   $00000382
    00000370 6899           ldr     r1, [r3, #8]
    00000372 3201           adds    r2, #1
    00000374 4291           cmp     r1, r2
    00000376 d104           bne.n   $00000382
    00000378 68d8           ldr     r0, [r3, #12]
    0000037a 2100           movs    r1, #0
    0000037c 6019           str     r1, [r3, #0]
    0000037e 6843           ldr     r3, [r0, #4]
    00000380 4798           blx     r3
    00000382 2069           movs    r0, #105
    ARM> p
      FM3_GPIO.PDIR0(0x40033300)     0x03bf 00000011_10111111
      FM3_GPIO.PDIR1(0x40033304)     0xfffe 11111111_11111110
      FM3_GPIO.PDIR2(0x40033308)     0x03ff 00000011_11111111
      FM3_GPIO.PDIR3(0x4003330c)     0xffff 11111111_11111111
      FM3_GPIO.PDOR0(0x40033400)     0x0000 00000000_00000000
      FM3_GPIO.PDOR1(0x40033404)     0x0000 00000000_00000000
      FM3_GPIO.PDOR2(0x40033408)     0x0000 00000000_00000000
      FM3_GPIO.PDOR3(0x4003340c)     0x0000 00000000_00000000
    ARM> q
    Bye.
  • メモリーダンプ、逆アセンブル、ポート参照/変更など出来ます。

コマンドラインツール:ブートローダーの使い方

  • 4000番地〜に作成したプログラム(HEXファイル)をFLASHに転送して実行する。
    D:> armboot -r FM3-4000.hex


  • 既に書き込み済みのプログラム(4000番地)を起動する。
    D:> armboot -r
  • もしくは
    D:> armon
    ARM> boot 4000
  • armonのコマンドでは、任意の番地から始まる(そこにvectorを置いている)ファームウェアを起動できます。
  • ただし、armbootで書き込むときは、ページ単位でEraseされますので、vectorの開始番地はFLASHのページ先頭に置かないと消されてしまう場合があります。
FLASHのページ先頭アドレスサイズ
016kB
0x400016kB
0x800096kB
0x20000128kB
0x40000128kB
0x60000128kB
0x80000128kB
0xa0000128kB
0xc0000128kB
0xe0000128kB


  • ブートローダーを4000番地あるいはそれ以外の番地から始まるようにビルドしたアプリケーションを試している場合であれば、ブートローダーとアプリケーションを互いにbootコマンドで行き来できます。
    D:> armon
    TARGET DEV_ID=f3 VER=1.1(Bootloader) FLASH USED=7560,TOTAL=100000
    ARM> boot 4000  <===アプリケーションを起動する。
    bye
    D:> armon
    TARGET DEV_ID=f3 VER=1.1(Application) FLASH USED=7560,TOTAL=100000
    ARM> boot 0  <===ブートローダーに戻る。
    bye


  • アプリケーションが起動している状態からでも、4000番地以降のアプリの書き換えが出来ます。
    D:> armboot -r FM3-4000.hex
  • これは、実際には内部的にboot 0 を実行した後、USB再接続して4000番地〜のFLASH書き換えと実行を行ないます。
  • ただし、アプリケーションはブートローダーと同じプロトコルを解するUSBカスタムデバイスの機能を持っている必要があります。(単に番地を変えてビルドするだけで可能です。)


Linuxでの使用

  • ファームウェアはLinux上でも普通にビルドできます。
  • FLASH USB Direct ProgrammerはWindows版しか提供されていないため、WindowsかWineのようなもので焼きこむしかありません。
  • Windows側コマンドラインツールは、そのままLinuxでビルドできます。(libusb-devなどを導入する必要があります)
  • armon/armbootを実行する場合はusbデバイスのアクセス権が必要です。
    • root権限で、/etc/udev/rules.d/95-my-permissions.rules に以下の内容を書き込むか、あるいは直接rootユーザーでarmon/armbootを起動してください。
SUBSYSTEM=="usb",SYSFS{idVendor}=="04c5",SYSFS{idProduct}=="4242",MODE="0666"
$ sudo /etc/init.d/udev restart
  • 実在Linuxでない場合、たとえばVMWarePlayer内のLinuxからはアクセスがうまくいきませんが今のところ原因は分かっていません。


残念なお知らせ。

  • VectorTableのベースアドレスを設定するVTORレジスタの存在を見落としていました。
  • VTORを使用するように修正すれば、上記r2,r3破壊問題は簡単に解決します。
  • ついでにブートローダーのコードサイズは512byte以上縮めることも可能です。 ---処置しました。

VectorTableのベースアドレスを設定するレジスタはてっきりNVIC内にあるものだと思い込んでいました。





その2:仮想COMポート作成サンプル

ダウンロード

  • これも急ごしらえです。
  • (いろいろブートローダー系のコードが残ったままです。)--修正済み
  • 富士通謹製のサンプル mb9bf506r-usbfunc-msc-v11.zip (MSCデバイス)を基に作成しています。






その3:FM3でprintfを使ってみる

上記のFM3カスタムファームウェアを使用します。

ファームウェア(16kB)、Windows用クライアント(コマンドラインツール)、ソースファイル一式

  • 上記zipファイルを D:\ に展開します。
  • armboot/src/FM3-0000.hex を GUIの「USB Direct Programmer」(富士通サイトから入手)により焼きこみます。
  • BOOTジャンパーをoffにして、リセットします。
  • armboot/monitor/armon.exe を起動して、FM3基板に接続できることを確認しておきます。
  • mapleIDEをダウンロードして、ARM用gccが使えるようにしておいてください。
  • では、ビルドを行なってみます。
    D:\armboot\src\> cs-make     (もしくは MinGWをインストールしているなら make)
    D:\armboot\src\> w.bat         (FM3-4000.hex をブートローダー経由でFM3基板に書き込んで、即実行します)
    
    D:\armboot\src\> a.bat         (armon.exeを起動して、script というテキストファイルに書かれた処理を実行します)
    D:\armboot\src\>..\monitor\armon.exe -i script
    TARGET DEV_ID=f3 VER=1.1(Application) FLASH USED=106b0,TOTAL=10000
    ARM> user
    * Start Program
    Hello World
    Hello : !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQ
    Hello : !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQ
    p=0x1fff9120
    q=0x1fff9528
    sin(                0 ) =                0
    sin(         0.628319 ) =         0.587785
    sin(          1.25664 ) =         0.951057
    ・・・
  • printfを行なっているプログラムは、armboot/src/monitor/usercmd.c にあります。
  • I/Oポートのコントロールは pinMode(),digitalRead(),digitalWrite()という関数が用意されているので、 それらを呼び出すことで簡単な処理を書くことも出来ます。
  • make , w.bat (FLASH書き込み) , a.bat (armonによるユーザー関数の実行) を一連に実行するようなバッチファイル を用意することで、Arduino風(プログラムを書き換えて即実行)のコマンドラインな開発が出来ます。






予定稿1:Lチカサンプルを書いてみる?

  • USBファンクションを取り去った状態で、Arduinoっぽい関数(digitalWriteなど)を実装して、最小限のLEDブリンクを書いてみました。

ダウンロード

  • KEILとかIARの環境では、startupがアセンブリで書かれていて融通が利かないため、ここをC言語(crt0.c)で書いてメンテしやすくしております。
  • ビルドには、gcc ( CodeSourcery G++ Lite を推奨 ) とmakeを使用します。






予定稿2:VGA出力テスト。

  • はたして気力が続くかどうか・・・

???






以下、雑談

  • せっかくFujitsuなので、FM8とかFM7のエミュレータを動かしてみたいのだけれど、バイナリー持ってません。
  • 当時のMZ-****とかPC-8***とかのバイナリーもほとんど持ってないです。
  • バイナリー持っていたとして、エミュを書いたとしても、BIOS ROMの抜き取りするためにはどうしても実機が必要になります。

そういうわけでエミュ遊びはおあずけです。


せっかくだからLuaとかgforceとか動かしてみようかなとか思ったのですが、

  • LuaはWindows版がうまく使いこなせなかったのでパス。(もともとPascal好きじゃないし)
  • Forthは昔やってたけれど、やっぱり人間が読むコードじゃない感じなのでパス。(実行速度は速いんだけどねぇ・・・)
  • 文法的にはC言語に良く似ていて、内部的にはForthインタプリタの slang あたりが一番良いのかなぁ・・・とっつきやすさ的には。





参考リンク

電子工作マスターへの歩み jujurouさん


流石、対応速いです。




独り言:

  • こちらでも、一応1MB Flash対応のflash/nor/fm3.cは書いてみました。(つもり)
  • だけど、この石、USB bootloaderのROMが載っているので、OpenOCDは要らないのでした。
  • armon/armbootのブートローダーでごちゃごちゃやってます。(NXP用語で言うところのISP/IAP (In Application Programing)ってやつ)