SiFive Freedom E310のサンプルプログラムをArty A7に書き込む

# 記事の概要
フリーのRISC-VプラットフォームSiFive Freedom E310のサンプルプログラムをFPGAボードArty A7に書き込んで、動作確認します。

## 背景
[『フリーのRISC-VプラットフォームSiFive Freedom E310をFPGAボードArty A7に書き込む』](https://qiita.com/Kosuke_Matsui/items/86c17727f7eebe0a3a59)の補足になります

前記事では、フリーのRISC-VプラットフォームSiFive Freedom E310をFPGAボードArty A7に書き込み、freedom-e-sdkのサンプルプログラムをビルドするところまで紹介しました

ビルドしたファイルをArty A7に書き込むためのJTAGツールOlimex ARM-USB-TINY-Hを未購入だったので、実際に動作確認するところまでは紹介できませんでした

今回は、Olimex ARM-USB-TINY-Hの使い方、ビルドしたファイルをArty A7にアップロードする方法、実際に動作しているところまでを紹介いたします


# Olimex ARM-USB-TINY-HとArty A7の接続

JTAGツールはlimex ARM-USB-TINY-Hを使用しました。

[ARM用JTAGデバッガ(ハイスピード対応) ARM-USB-TINY-H](https://strawberry-linux.com/catalog/items?code=15045)（strawberry-linux、1台 5,000円
+プラス消費税）

Olimex ARM-USB-TINY-HとArty A7の接続には[ジャンパーワイヤ（メス-オス）](https://www.amazon.co.jp/%E3%83%87%E3%82%B8%E3%83%91%E3%83%BC%E3%83%84-PX-HD-%E3%83%96%E3%83%AC%E3%83%83%E3%83%89%E3%83%9C%E3%83%BC%E3%83%89%E3%83%BB%E3%82%B8%E3%83%A3%E3%83%B3%E3%83%91%E3%83%BC%E3%83%AF%E3%82%A4%E3%83%A4%EF%BC%88%E3%83%A1%E3%82%B9-%E3%82%AA%E3%82%B9%EF%BC%89%EF%BC%8820cm%EF%BC%8940%E6%9C%AC/dp/B00P9BVKOK/ref=asc_df_B00P9BVKOK/?tag=jpgo-22&linkCode=df0&hvadid=217872786172&hvpos=1o1&hvnetw=g&hvrand=9896670346973678824&hvpone=&hvptwo=&hvqmt=&hvdev=c&hvdvcmdl=&hvlocint=&hvlocphy=1009314&hvtargid=pla-441031574304&psc=1)を使用しました。
Amazonやaitendoで安く購入できます。


[Digilent Arty A7 with Xilinx Artix-7 Implementing SiFive FE310 RISC-V](https://www.digikey.com/eewiki/display/LOGIC/Digilent+Arty+A7+with+Xilinx+Artix-7+Implementing+SiFive+FE310+RISC-V#DigilentArtyA7withXilinxArtix-7ImplementingSiFiveFE310RISC-V-HardwareSetup)の以下の接続図通りに配線してください。


<img width="50%" alt="Olimex ARM-USB-TINY-HとArty A7の接続.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150620/68b8aab9-4ead-296b-92c9-b029674e77e5.png">
（配線図：[Digilent Arty A7 with Xilinx Artix-7 Implementing SiFive FE310 RISC-V](https://www.digikey.com/eewiki/display/LOGIC/Digilent+Arty+A7+with+Xilinx+Artix-7+Implementing+SiFive+FE310+RISC-V#DigilentArtyA7withXilinxArtix-7ImplementingSiFiveFE310RISC-V-HardwareSetup)より引用）

ARM-USB-TINY-Hとの接続にはArty A7のJDコネクタを使用します。1つだけ四角いランドがありますが、それが1番になります。
また、ARM-USB-TINY-Hの赤いLEDが右側に来るように見た時、左下ピンが1番、右上ピンが20番になります。
ジャンパーワイヤで以下のように配線します。

<img width="50%" alt="IMG_1816.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150620/a27a0f18-ef5d-00eb-7fe3-09fbcd37bacb.jpeg">

（何度も抜き差しするようなら接続用の簡易基板を作成しようと思いますが、今のところARM-USB-TINY-Hは他のボードには使用しないので、ジャンパーワイヤで済ませてしまいます。）



PCとARM-USB-TINY-Hの接続には[USBケーブル（タイプAオス - タイプBオス）](https://www.amazon.co.jp/Amazon%E3%83%99%E3%83%BC%E3%82%B7%E3%83%83%E3%82%AF-USB2-0%E3%82%B1%E3%83%BC%E3%83%96%E3%83%AB-4-8m-%E3%82%BF%E3%82%A4%E3%83%97A%E3%82%AA%E3%82%B9-%E3%82%BF%E3%82%A4%E3%83%97B%E3%82%AA%E3%82%B9/dp/B00BCWALHM/ref=asc_df_B00BCWALHM/?tag=jpgo-22&linkCode=df0&hvadid=204298659983&hvpos=1o1&hvnetw=g&hvrand=15165573219396620210&hvpone=&hvptwo=&hvqmt=&hvdev=c&hvdvcmdl=&hvlocint=&hvlocphy=1009314&hvtargid=pla-330352498230&psc=1&th=1&psc=1)も必要になります。家電量販店などでご購入下さい


ちなみに、実際に試してはいませんが、ARM-USB-TINY-Hの代わりにJ-Link BASEも使用できるそうです。

[SiFive Arty FPGA Dev Kit](https://wiki.segger.com/SiFive_Arty_FPGA_Dev_Kit)

# OpenOCDのインストール
これは[前回](https://qiita.com/Kosuke_Matsui/items/86c17727f7eebe0a3a59)の記事の作業をしている方ならば既に済ませているはずです。
本記事だけを読む方の為に、OpenOCDのインストール方法を以下に再掲します

https://www.sifive.com/boards

上記リンク先から、以下のOpenOCDのUbuntu版をインストールしてください。

- OpenOCD — v2019.08.2

ホームディレクトリで.bashrcを編集します。

```console
$ vi ./.bashrc
```

以下を追加してください。

```
export RISCV_OPENOCD_PATH=/home/kosukematsui/riscv-openocd-0.10.0-2018.12.0-x86_64-linux-ubuntu14
```

追加後、新しい端末を開くか、以下を実行して更新を有効化します

```
 $ source ~/.bashrc 
```


# Segger J-Link Softwareのダウンロード

Segger J-Link Softwareをダウンロードします。

[Segger J-Link Software Downloads](https://www.segger.com/downloads/jlink#J-LinkSoftwareAndDocumentationPack)


上記リンクから、lick for downloadsをクリックすると展開される項目の中から自分の環境に合うものを選びます。
私の場合は、「J-Link Software and Documentation pack for Linux, DEB installer, 64-bit」をダウンロードしました。

<img width="40%" alt="Screenshot from 2019-11-05 01-49-35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150620/ee23562e-ab6c-46f7-2bb0-2d96972dbf6f.png">

ダウンロードファイルを実行して、表示メニューのインストールをクリックしてください。

<img width="40%" alt="Screenshot from 2019-11-05 01-54-07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150620/d4e3b4f6-3dc6-ceb9-f365-026ff3c3394b.png">

インストール後は/etc/udev/rules.d/99-openocd.rulesファイルを編集します。

```console
$ sudo vi /etc/udev/rules.d/99-openocd.rules
```

plugdevグループがFPGAボードにアクセスできるようにする為の設定を追加します。

```
# These are for the HiFive1 Board
SUBSYSTEM=="usb", ATTR{idVendor}=="0403",ATTR{idProduct}=="6010", MODE="664", GROUP="plugdev"

SUBSYSTEM=="tty", ATTRS{idVendor}=="0403",ATTRS{idProduct}=="6010", MODE="664", GROUP="plugdev"

# These are for the Olimex Debugger for use with E310 Arty Dev Kit

SUBSYSTEM=="usb", ATTR{idVendor}=="15ba",ATTR{idProduct}=="002a", MODE="664", GROUP="plugdev"

SUBSYSTEM=="tty", ATTRS{idVendor}=="15ba",ATTRS{idProduct}=="002a", MODE="664", GROUP="plugdev"
```

plugdevが使用可能になっていることを確認します。

```console
$ ls /dev/ttyUSB*
/dev/ttyUSB0  /dev/ttyUSB1  /dev/ttyUSB2
```

```console
$ ls -l /dev/ttyUSB0
crw-rw-r-- 1 root plugdev 188, 0 11月  5 01:26 /dev/ttyUSB0
```

次にgroupsにplugdevを登録します。
まず、ユーザー名を確認します。

```console
$ whoami
```

私の場合、ユーザー名はkosukematsuiになります。
調べたユーザー名を使用して、以下のコマンドでplugdev を登録します。

```console
$ sudo usermod -a -G plugdev kosukematsui
```

groupsを実行して、plugdev が含まれているかをご確認ください。

```console
$ groups
kosukematsui adm dialout cdrom sudo dip plugdev lpadmin sambashare
```

# picocomのインストール
シリアル通信をコマンドで簡単に実行できるpicocomというツールをインストールします。
（Interface 2019年12月第7章の記事でもこのツールが使用されていました）


```console
sudo apt-get install picocom
```



# サンプルプログラムのビルド
[前回](https://qiita.com/Kosuke_Matsui/items/86c17727f7eebe0a3a59)の記事の「freedom-e-sdk サンプルプログラムのビルド」を実行して下さい

# サンプルプログラムのアップロード
サンプルのhelloをビルドしたとします。
これをArty A7に以下のコマンドでアップロードします。

Arty A7とARM-USB-TINY-HをPCに接続後、以下のコマンドを実行ください。

```console
$ make [PROGRAM=hello] [TARGET=freedom-e310-arty] [CONFIGURATION=debug] upload
```

正常にアップロードされると以下のようなメッセージが表示されます

```console
$ make [PROGRAM=hello] [TARGET=freedom-e310-arty] [CONFIGURATION=debug] upload
scripts/upload --elf /home/kosukematsui/freedom-e-sdk/software/hello/debug/hello.elf --openocd /home/kosukematsui/riscv-openocd-0.10.0-2019.08.2-x86_64-linux-ubuntu14/bin/openocd --gdb /home/kosukematsui/riscv64-unknown-elf-gcc-8.3.0-2019.08.0-x86_64-linux-ubuntu14/bin/riscv64-unknown-elf-gdb --openocd-config bsp/freedom-e310-arty/openocd.cfg
Open On-Chip Debugger 0.10.0+dev (SiFive OpenOCD 0.10.0-2019.08.2)
Licensed under GNU GPL v2
For bug reports:
	https://github.com/sifive/freedom-tools/issues
adapter speed: 10000 kHz
Info : auto-selecting first available session transport "jtag". To override use 'transport select <transport>'.
Info : ftdi: if you experience problems at higher adapter clocks, try the command "ftdi_tdo_sample_edge falling"
Info : clock speed 10000 kHz
Info : JTAG tap: riscv.cpu tap/device found: 0x20000913 (mfg: 0x489 (SiFive Inc), part: 0x0000, ver: 0x2)
Info : datacount=1 progbufsize=16
Info : Disabling abstract command reads from CSRs.
Info : Examined RISC-V core; found 1 harts
Info :  hart 0: XLEN=32, misa=0x40001105
Info : Listening on port 3333 for gdb connections
Info : Found flash device 'sp s25fl128s' (ID 0x00182001)
cleared protection for sectors 64 through 255 on flash bank 0
Ready for Remote Connections
Info : Listening on port 6666 for tcl connections
Info : Listening on port 4444 for telnet connections
Info : accepting 'gdb' connection on tcp/3333
0x00000000 in ?? ()
Info : JTAG tap: riscv.cpu tap/device found: 0x20000913 (mfg: 0x489 (SiFive Inc), part: 0x0000, ver: 0x2)
JTAG tap: riscv.cpu tap/device found: 0x20000913 (mfg: 0x489 (SiFive Inc), part: 0x0000, ver: 0x2)
cleared protection for sectors 64 through 255 on flash bank 0
cleared protection for sectors 64 through 255 on flash bank 0
Info : JTAG tap: riscv.cpu tap/device found: 0x20000913 (mfg: 0x489 (SiFive Inc), part: 0x0000, ver: 0x2)
Loading section .init, size 0x194 lma 0x20400000
Loading section .text, size 0x4600 lma 0x20400200
Loading section .rodata, size 0x3c0 lma 0x20404800
Loading section .init_array, size 0x4 lma 0x20404bc0
Loading section .data, size 0x770 lma 0x20404bc8
Info : Padding image section 0 at 0x20400194 with 108 bytes
Info : Padding image section 1 at 0x20404bc4 with 4 bytes
Info : Disabling abstract command writes to CSRs.
Info : JTAG tap: riscv.cpu tap/device found: 0x20000913 (mfg: 0x489 (SiFive Inc), part: 0x0000, ver: 0x2)
Start address 0x20400000, load size 21192
Transfer rate: 8 KB/sec, 3532 bytes/write.
shutdown command invoked
shutdown command invoked
A debugging session is active.

	Inferior 1 [Remote target] will be detached.

Quit anyway? (y or n) [answered Y; input not from terminal]
Remote connection closed
```

アップロードに失敗する場合は、Arty A7とARM-USB-TINY-Hを一度PCから外して、再接続すると上手くいくかもしれません。

アップロード完了後、picocomで通信速度57600でUART通信を行うと"hello, world!"と表示されます。
リセットボタンを押下するごとに、"hello, world!"が表示されます。

USBのポート番号は各位の環境に合わせて修正ください。

```console
$ sudo picocom -b 57600 /dev/ttyUSB1
picocom v1.7

port is        : /dev/ttyUSB1
flowcontrol    : none
baudrate is    : 57600
parity is      : none
databits are   : 8
escape is      : C-a
local echo is  : no
noinit is      : no
noreset is     : no
nolock is      : no
send_cmd is    : sz -vv
receive_cmd is : rz -vv
imap is        : 
omap is        : 
emap is        : crcrlf,delbs,

Terminal ready
Hello, World!
```

picocomは、Ctrl-a, Ctrl-xで終了します。

# 次にすること
InterFace 2019年12月号の7章「定番ボードではじめるRISC-Vマイコン」ではHiFiveボードを対象にリアルタイムOS Zephyrの実装、OS上で動作するアプリの作成方法が紹介されていました。
Arty A7上でも同じことができるかを確認したいと思います。
もし雑誌記事の手順以外の作業が必要だった場合は、それらの作業を整理して公開したく思います。