SNSへはこちら

簡単USBマイコン EZ-USB FX2LP(1) - 環境構築 on Mac/Linux

前々から気になっていた、Cypress の EZ-USB をポチってしまいました。なんでも、このマイコンは USB ペリフェラルがとにかく便利に構成してあるみたいなんですよね。
あまり下調べせずにポチりました。まだデータシートすら見ていませんが、やりながら理解していきたいなあと。例の青いボードです。

それで、China Post から来たんですが、これがおっそいおっそい。もともとここは配達が雑で遅いことが分かっていましたが、僕が注文したタイミングで丁度税関が郵便物の調査を強化したらしく、結局2週間遅れで手元に到着しました。

このマイコンの構成は置いておいて、取り敢えず動かせる環境づくりをします。今後のためにね。

参考サイト

EEPROM

そういえば、このボートにはユーザーが意図する USB 機能を実現させるために EEPROM が載っています。これによって好きなディスクリプタを構成して、デバイスを好きに構成することが出来るらしいです。
ですが、今回はそんな高度なことはせず、とりあえず RAM にロードさせて使うという使用法を採用したいと思いますので、EEPROM につながるジャンパピンは全て取り除くことにします。

使用ツール

コンパイラ

sdcc です。いつものように Homebrew でインストール。

$ brew install sdcc

書き込み

CycFX2Prog を使います。参考サイトの2つ目からダウンロードして make

僕の Mac の場合は以下のように怒られました。

$ make
gcc -pipe -c -O2 -fno-rtti -fno-exceptions -DCYCFX2PROG_VERSION=\"0.47\" -W -Wall -Wformat  cycfx2prog.cc
In file included from cycfx2prog.cc:24:
cycfx2dev.h:18:10: fatal error: usb.h: No such file or directory
   18 | #include <usb.h>
      |          ^~~~~~~
compilation terminated.
make: *** [cycfx2prog.o] Error 1

ふむふむ、libusb が無いんですな。そもそもインストールしてないよ!って人はしてください。

$ brew install libusb-compat

その上で以下のように改造。

CFLAGS = -O2 -fno-rtti -fno-exceptions -DCYCFX2PROG_VERSION=\"$(VERSION)\" \
    -W -Wall -Wformat $(shell pkg-config --cflags libusb)
LDFLAGS = $(shell pkg-config --libs libusb)

これで make をかければコンパイル完了するはずです。出来たバイナリをパスの通ったディレクトリにコピーすれば便利です。

サンプル

hello_world_usb。を動かしてみましょう。ここからダウンロード。

fx2regs.hの改造

なんかやたらエラーで怒られるので、sdcc 仕様にします。ひょっとして古いSDCCではOKだったんかな?

  • xdata__xdata
  • at()__at()
  • sfr__sfr

これらを変えます。Vim だったら以下の Ex コマンドを打ってください。

:%s/ xdata / __xdata /g
:%s/ at \(0x..\)/ __at (\1)/g
:%s/sfr/__sfr/g

42行目を書き換え

#define _AT_(a) __at(a)

以上で OK なはず!続いて hello.c の方も直していきます。

hello.cの改造

21行目。アンダーバーを1つ増やす

#define    NOP     __asm nop __endasm

55行目。xdata__xdata に。

これでコンパイルできるはず。

$ make
sdcc -mmcs51 -I../include hello.c

できた!

あとは make run で以下のように動作したら OK ですね。

$ make run
cycfx2prog prg:hello.ihx run delay:10 dbulk:6,-512,5
Using ID 04b4:8613 on 020.050.
Putting 8051 into reset.
Programming 8051 using "hello.ihx".
Putting 8051 out of reset.
Delay: 10 msec
Reading <=512 bytes from EP adr 0x86
  0x0000 48656c6c6f20776f 726c642120596f75 7220465832206973 2074616c6b696e67    Hello world! Your FX2 is talking
  0x0020 20746f20796f7520 7669612074686520 555342206c696e65 2e202830303029       to you via the USB line. (000)
Reading <=512 bytes from EP adr 0x86
  0x0000 48656c6c6f20776f 726c642120596f75 7220465832206973 2074616c6b696e67    Hello world! Your FX2 is talking
  0x0020 20746f20796f7520 7669612074686520 555342206c696e65 2e202830303129       to you via the USB line. (001)
Reading <=512 bytes from EP adr 0x86
  0x0000 48656c6c6f20776f 726c642120596f75 7220465832206973 2074616c6b696e67    Hello world! Your FX2 is talking
  0x0020 20746f20796f7520 7669612074686520 555342206c696e65 2e202830303229       to you via the USB line. (002)
Reading <=512 bytes from EP adr 0x86
  0x0000 48656c6c6f20776f 726c642120596f75 7220465832206973 2074616c6b696e67    Hello world! Your FX2 is talking
  0x0020 20746f20796f7520 7669612074686520 555342206c696e65 2e202830303329       to you via the USB line. (003)
Reading <=512 bytes from EP adr 0x86
  0x0000 48656c6c6f20776f 726c642120596f75 7220465832206973 2074616c6b696e67    Hello world! Your FX2 is talking
  0x0020 20746f20796f7520 7669612074686520 555342206c696e65 2e202830303429       to you via the USB line. (004)
make: *** [run] Segmentation fault: 11

Blink

調子に乗って僕も簡易的なLチカプログラムを書いてみました。

#include "fx2regs.h"

int main(void) {
    OEA = 1;
    while(1) {
        for(volatile unsigned long long i = 0; i < 100000; i++);
        IOA ^= 1;
    }
}
$ sdcc -mmcs51 -I ../include blink.c
$ cycfx2prog prg:blink.ihx run

PA0 に LED をつないで、ゆっくりチカチカしていれば OK です。

というわけで、今回は環境構築 & 動作確認でした。