みつきんのメモ

組み込みエンジニアです。Interface誌で「Yocto Projectではじめる 組み込みLinux開発入門」連載中

Longan nanoをUbuntu 18.04のPlatformIOでLチカ

はじめに

安価なRISC-Vボードとして国内でも比較的入手が簡単なLongan nanoを入手した。 開発環境としては当ブログでもおなじみのPlatformIOに対応している。

国内で入手が容易なせいか日本語の情報も多いが、Windows環境での動作報告記事が多いので、ここではUbuntu 18.04上でPlatformIOで動かした事例を紹介する。

PlatformIO

PlatformIOはpipコマンドでインストールするが、環境を汚さないためにuserインストールする。

$ pip install platformio --user

環境変数を通すために~/.bashrcに下記を追加する。

PATH="${HOME}/.local/bin:${PATH}"

端末を開き直すか次のコマンドを実行し、環境変数を読み直す。

$ source ~/.bashrc

whichコマンドで次のようになればOK。

~$ which platformio
/home/xxxxx/.local/bin/platformio

プロジェクトの作成

とりあえず作業用ディレクトリを次のように作成する。

$ mkdir -p ~/pio/longan
$ cd ~/pio/longan

PlatformIOでLongan nanoのボード名を確認する。

$ pio boards | grep longan
sipeed-longan-nano  GD32VF103CBT6  108MHz       128KB    32KB   Sipeed Longan Nano

次にlongan向けのプロジェクトを作成する。

$ pio init -b sipeed-longan-nano
$ ls
include  lib  platformio.ini  src  test

これでプロジェクトの作成は完了

プログラムの作成

main.cpp

src/main.cppを次の内容で作成する。

#include <Arduino.h>

void setup()
{
  pinMode(LED_BUILTIN, OUTPUT);
}

void loop()
{
  digitalWrite(LED_BUILTIN, HIGH);
  delay(1000);
  digitalWrite(LED_BUILTIN, LOW);
  delay(1000);
}

一般的なArduinoのLチカのコード。

platformio.ini

Arduinoのライブラリを使用する場合、frameworkをarduinoに設定する必要がある。

また、ファームウェアの書き込みにdfuを使用するので、platformio.iniを次の内容に編集する。

[env:sipeed-longan-nano]
platform = gd32v
board = sipeed-longan-nano
framework = arduino
upload_protocol = dfu

udevルールの編集

DFUを使用してファームウェアを書き込むには、Longan nanoをDFUモードで接続する必要がある。

Ubuntu 18.04というか、LinuxマシンにLongan nanoをDFUモードで接続するためにはまずudevルールを追加する。

/etc/udev/rules.d/99-platformio-udev.rulesに次の内容を追加する。

# Longan Nano
ATTRS{idVendor}=="28e9", ATTRS{idProduct}=="0189", MODE="0666" 

次のコマンドでudevルールを読み込ませる。

$ sudo udevadm trigger

Longan nanoをDFUで接続

Longan nanoをDFUモードで接続するには、BOOT0ボタンを押しながらUSBケーブルを接続する。

基板をケースに入れていない場合はシルクで確認できるが、基板のType-Cコネクタを左にした時に下側にあるボタンがBOOT0ボタンとなる。 反対側のボタンはリセット。

f:id:mickey_happygolucky:20191221065223p:plain
基板

DFUモードで接続できた場合、基板のBOOT0側の赤いLEDだけが光っている状態になるのでおそらくわかるが、確実に確認したい場合はdmesgコマンドを使用し、次のメッセージが表示されていることを確認する。

[26877.865188] usb 1-2: new full-speed USB device number 8 using xhci_hcd
[26878.201184] usb 1-2: device descriptor read/64, error -71
[26878.459003] usb 1-2: New USB device found, idVendor=28e9, idProduct=0189, bcdDevice=10.00
[26878.459008] usb 1-2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[26878.459012] usb 1-2: Product: GD32 0x418 DFU Bootloade
[26878.459015] usb 1-2: Manufacturer: GDMicroelectronics
[26878.459017] usb 1-2: SerialNumber: 䌳䩂

これでファームウェアの書き込みが可能となる。

ビルドと書き込み

次のコマンドでファームウェアをビルドする。

$ pio run

次のコマンドで書き込む。

$ pio run -t upload

次のように「dfu-util: dfuse_download: libusb_control_transfer returned -1」というエラーが表示される。

Opening DFU capable USB device...
ID 28e9:0189
Run-time device DFU version 011a
Claiming USB DFU Interface...
Setting Alternate Setting #0 ...
Determining device status: state = dfuERROR, status = 10
dfuERROR, clearing status
Determining device status: state = dfuIDLE, status = 0
dfuIDLE, continuing
DFU mode device DFU version 011a
Device returned transfer size 2048
GD32 flash memory access detected
Device model: GD32VF103CB
Memory segment (0x08000000 - 0801ffff)(rew)
Erase size 1024, page count 128
Downloading to address = 0x08000000, size = 8268

Download    [                         ]   0%            0 bytes
Download    [                         ]   0%            0 bytes
Download    [======                   ]  24%         2048 bytes
Download    [============             ]  49%         4096 bytes
Download    [==================       ]  74%         6144 bytes
Download    [======================== ]  99%         8192 bytes
Download    [=========================] 100%         8268 bytes
Download done.
File downloaded successfully
dfu-util: dfuse_download: libusb_control_transfer returned -1
*** [upload] Error 74
================== [FAILED] Took 2.52 seconds ==================

ここによれば、

That message is unrelated. I recall reading that this was a failure (or perhaps a permissions problem) for a post-transfer operation, I think related to a post-transfer reset, but I forget where I read it. It doesn’t affect the actual flashing of the firmware, so far as I can tell.

とのことで書き込み結果には関係ないらしい。

まとめ

Longan nanoの開発環境をUbuntu 18.04上に構築し、無事に動かすことができた。

PlatformIOなので基本的にはWindowsmacOSでもほぼ変わらない手順で動くとは思うが、デバイスを認識させる手順などがおそらく異なる。

面白そうな基板なのでもう少し遊びたい。