SNSへはこちら

Longan NanoでRISC-Vチャレンジ(4) - 書き込みツールの導入

前回の記事で「なんかプログラムが動かないことがある」なんて言いましたが、今回はその原因が分かりました。

ズバリ、書き込み用ツールとして使っていた dfu-util が GD32VF マイコンに対応していなかったということです。なんか怪しかったんだよなぁ...

発見の経緯

前に述べたかと思いますが、Mac は GD32VF マイコン開発用として公式に存在する Platformio のツールチェインが使えません。ダウンロードしようとしてもエラーになります。
そこで、公式に使用できる Linux マシン(自宅の Ubuntu を入れた MacBook Air)で実行・書き込みをしてみたところ、こちらも時折動く、くらいの状況でした。コンパイラに不備はないし...
つまり、できたプログラム自体には不具合はないのではないかと思ったわけです。

GD32VF マイコンのツールたちを見ているとこちらに dfu-util の専用 fork があるんですね。ひょっとして...
これをビルドして Mac で作ったバイナリと Ubuntu で作ったバイナリをそれぞれ書き込んでみたところ、どちらも正常に動作するという結果になったのでした。。。

というわけで

上のツール(GD32 DFU Utils) をビルドしましょう。Mac で libusb を使う必要があるのですが、一癖あります。

$ brew install libusb
$ git clone https://github.com/riscv-mcu/gd32-dfu-utils
$ cd gd32-dfu-utils

ここまで来ても configure できません。「Version 1.0.0 以上の libusb が必要なんだけど(怒」と言われるのですが、さっきインストールしたはずです。

configure の改造

そこで、強行突破してしまいましょう。4137 行目と 4141 行目のエラー処理をコメントアウトして、エラーを握りつぶします。

    # as_fn_error $? "*** Required libusb-1.0 >= 1.0.0 not installed ***" "$LINENO" 5

これで、configure だけはできるようになります。

$ ./configure

Makefile の改造

エラーを握りつぶしてしまったので、この後実際に make しようとしてもできません。こちらも Makefile を改造する必要があります。
まずは src ディレクトリに入ります。

$ cd src

まず、そのままだと libusb のヘッダが見つからんと怒られてしまうので COMPILE 変数の中身に、-I を強引に追加します。121 行目。

COMPILE = $(CC) -I /usr/local/Cellar/libusb/1.0.23/include/libusb-1.0 $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
    $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)

ここのバージョンはみなさんがインストールしたものに合わせてください。

続いてリンク時にも dylib が無いと怒られるので、こちらも LINK 変数に追加。128 行目。

LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@  -L /usr/local/Cellar/libusb/1.0.23/lib -lusb-1.0 -lusb-1.0.0

これで OK。あとは make して、dfu-util dfu-prefix dfu-suffix を取り出せば良いのです。パスの通ったところに置きましょう。

書き込みしてみよう

ふぅ、これでやっとこれまでどうしても動かなかった delay_1ms 関数とかが使えるようになります(というか、そもそもバイナリを正常に書き込むことができるようになります)。
公式のファームウェアもそのまま使えるので、これでやっとスタートラインに立てたということになります。

まずは前回 src/startup.s でコメントアウトした部分を戻します。そして、main.c を以下のようにしてみました。

#include <gd32vf103.h>
#include <systick.h>

int main(void){
    rcu_periph_clock_enable(RCU_GPIOC);
    gpio_init(GPIOC, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_ALL);

    while(1) {
        delay_1ms(1000);
        GPIO_OCTL(GPIOC) ^= GPIO_PIN_13;
    }
    return 0;
}

しかし、このままでは delay_1ms がうまく動いてくれず、ディレイ時間がよく分からないことになります。そこで以下のコードを start.s に追加します。

    /* argc = argv = 0 */
    call _init # ADD ME
    li a0, 0
    li a1, 0
    call main
    tail exit

これで make && make flash とすればいいです。お疲れさまでした。
こういうのって夜中に解決するのよね...眠い...

コメント

  1. smihica より:

    同じ環境でいじってみており、大いに参考にさせていただいております。
    ありがとうございます。

    ↑のmacでの問題ですが、 configure を見ると、pkg-config がないと、pkg_failed=yes になってしまい、configure: error: *** Required libusb-1.0 >= 1.0.0 not installed *** になってしまうようです。
    私の mac では brew install libusb pkg-config をやったあとに ./configure && make でできました。同じ現象かはわかりませんが、ご参考まで。

    • shima-529 より:

      アドバイスありがとうございます。
      私の Mac の方でも pkg-config が入っているのですが、どうやら認識されないようで、pkg-config --libs libusb が見つからないと起こられるんですよねー...

      肝心の pkg-config は /usr/local/lib/pkgconfig にある .pc ファイルを読み込むようで、何故だかデフォルトではこのパスを探しに行かない...
      なので ./configure と make それぞれのコマンド先頭に PKG_CONFIG_PATH=/usr/local/lib/pkgconfig を付けることで解決しました。

      おかげさまで色々と勉強になりました。