SNSへはこちら

FT90マイコンを使ってみよう(4) - ライブラリの導入

マイコンちゃんが壊れている間に(復旧用に頼んだデバッガが届くのを待っている間に)、ライブラリでも入れていきましょう。

「ライブラリを速攻で入れるなんてお前らしくないな」と思うかもしれませんが、前回の記事で書いた、DFU にエントリーして、書き込みをユーザープログラム中で有効化する必要があるということが導入の一番の理由です。
これやらなきゃ、書いてはデバッガでの復旧作業、という面倒くさいルーティンになってしまいますよ。まあ最初から Windows で WSL 等を駆使してやれば良いんですけどね。でも極力 Mac でやりたいんですよ。負けた気になるから

必要なもの

すみません、ここだけ Windows が必要になってきます。FT9xx Toolchain をインストールしてください。それか exe ファイルを展開できるソフトが有れば、それでも良いです。僕は素直にインストールしました。
すると、C:/Program Files (x86)/Bridgetek に入ると思います。

インストールディレクトリから持ってきてビルド

ここからは Mac でやります。例のディレクトリに Toolchain/hardware があると思います。実はここで FT90 マイコン用ライブラリのソースコードが提供されています。嬉しいね!
さぁ、これを何処かにコピーして持ってきます。

$ pwd
/Volumes/BOOTCAMP/Program Files (x86)/Bridgetek
$ cp -r Toolchain/hardware ~/libft9xx

ではでは、早速ビルドしましょう。デバイスとして FT900 と FT930 で別々のアーカイブが出来るようですが、今回は勿論 FT930 用の物を作ります。
また、最適化レベルの異なる Debug と Release もそれぞれ出来るっぽいですけど、その辺興味ないのでファイルサイズの小さい Release で良いでしょう。

$ cd ~/libft9xx
$ make CONFIG=Release TARGET=ft930
gmkdir -p Release/ft930
ft32-elf-gcc -c -I./include  -fmessage-length=0 -ffunction-sections -Wall -Wextra -std=gnu99  -Os -D__FT930__ -mcompress -mft32b src/adc.c -o Release/ft930/adc.o
...
ft32-elf-ar: creating Release/ft930/libft930.a
...
a - Release/ft930/dlog.o

しゅごい!ということで、~/libft9xx/Release/ft930/libft930.a にそれが出来上がりました。

プロジェクトの作成

では使ってみましょう。此処から先はマイコン用プロジェクトを自分で書くのと手順は全く変わりません。Makefile をこしらえます。

ARCH = ft32-elf
LD = $(ARCH)-gcc
CC = $(ARCH)-gcc
CXX = $(ARCH)-g++
AS = $(ARCH)-as
SIZE = $(ARCH)-size
DUMP = $(ARCH)-objdump
COPY = $(ARCH)-objcopy

ASMS = $(wildcard src/*.s)
CSRCS = $(wildcard src/*.c)
CXXSRCS = $(wildcard *.cpp)

OBJS = $(addprefix obj/,$(notdir $(ASMS:.s=.o)) $(notdir $(CSRCS:.c=.o)) $(notdir $(CXXSRCS:.cpp=.o)))

OPT ?= -Os
LDFLAGS = -Wl,--gc-sections -lnosys -e_start -g -L ~/libft9xx/Release/ft930
LIBS = -lft930

INCLUDES = -Iinc -I ~/libft9xx/include
FLAGS = -fdata-sections -ffunction-sections -mft32b -mcompress -g $(OPT) -Wall -Wextra -D__FT930__
CFLAGS = $(FLAGS) -std=gnu11
CXXFLAGS = -fno-exceptions -fno-non-call-exceptions -fno-rtti -fno-use-cxa-atexit -std=c++2a $(FLAGS)

TARGET = output.elf

all: $(TARGET)
    -$(SIZE) $(TARGET)

$(TARGET): $(OBJS)
    $(LD) $(LDFLAGS) $^ -o $@ $(LIBS)
    $(DUMP) -x $(TARGET) > $(TARGET:.elf=.dmp)
    $(DUMP) -d $(TARGET) >> $(TARGET:.elf=.dmp)
    $(COPY) -O binary $(TARGET) $(TARGET:.elf=.bin)

obj/%.o: src/%.cpp
    $(CXX) $(CXXFLAGS) $(INCLUDES) $^ -c -o $@

obj/%.o: src/%.c
    $(CC) $(CFLAGS) $(INCLUDES) $^ -c -o $@

obj/%.o: src/%.s
    $(AS) $(ASFLAGS) -g $^ -o $@

flash: $(TARGET)
    dfu-util -d 0403:0fcf -a 0 -D output.bin

clean:
    $(RM) $(OBJS) $(TARGET) $(TARGET:.elf=.dmp) $(TARGET:.elf=.bin)

そうしたら src, obj ディレクトリを作った上で、src ディレクトリ下に以下のようなプログラムを書きます。

#include <ft900.h>
#include <ft900_startup_dfu.h>

#define LED_GPIO_NUM 13
int main(void) {
    gpio_dir(LED_GPIO_NUM, pad_dir_output);
    gpio_write(LED_GPIO_NUM, 1);
    delayms(1000 * 10);
    gpio_write(LED_GPIO_NUM, 0);
    GO_DFU();
}
$ make
ft32-elf-gcc -fdata-sections -ffunction-sections -mft32b -mcompress -g -Os -Wall -Wextra -D__FT930__ -std=gnu11 -Iinc -I ~/libft9xx/include src/main.c -c -o obj/main.o
ft32-elf-gcc -Wl,--gc-sections -lnosys -e_start -g -L ~/libft9xx/Release/ft930 obj/main.o -o output.elf -lft930
ft32-elf-objdump -x output.elf > output.dmp
ft32-elf-objdump -d output.elf >> output.dmp
ft32-elf-objcopy -O binary output.elf output.bin
ft32-elf-size output.elf
   text    data     bss     dec     hex filename
  11092     416     776   12284    2ffc output.elf

コツは -D__FT930__ を指定すること(しないと FT900 仕様になる)、$(LIBS) はコマンド最後に記述することですかね。

注意ですが、前回も言ったように、これだけでは動くバイナリは出来ません。DFU に入ることは可能なように書きましたが、そもそも起動すらしないという(ブートローダーの DFU にフォールバックする)。まだこのままバイナリを書き込まない方がいいと思います。僕みたいに冒険してみたい方は是非どうぞ〜

ということで、マイコンくんをデバッガで復旧した後にする準備は出来たと思います。次回以降、色々と謎を解明していきたいなあと思いますので、グダグダですがお付き合い頂ければと。取り敢えずこのシリーズは、割り込みでタイマーが動くぞ!的な内容までにしようかと思います。

ちなみにこの記事を書き終えた時点でデバッガが到着し、Windows で 1-wire 接続をすることで復活しました。確か 1-wire デバッグで接続した後、ウィンドウ左下に Bootloader の Restore 的なボタンがあったので押したら復活しました!