FPGA+SoC+Linux+Device Tree Overlay+FPGA Manager(ZYBO-Examples)

## 注意(2017年9月20日追記)

この記事は Linux Kernel 4.4 時点に投稿したものであり、古い内容が含まれています。Linux Kernel 4.10 以降、FPGA 関連は大きく進歩しました。詳しくは[「Linux Kernel 4.10 でのFPGAのサポート事情」](http://qiita.com/ikwzm/items/2ff7d5429da8ace7c0bd)を参照してください。

## はじめに

[「FPGA+SoC+Linux+Device Tree Overlay+FPGA Manager(ブートイメージの提供) @Qiita」](http://qiita.com/ikwzm/items/cdeb3c9c352776eac683)で、ZYBO 用の Device Tree Overay と FPGA Manager に対応した Linux Kernel と Debian8 RootFS を紹介しました。

ここでは、そのシステム上で動作する実例をいくつか紹介します。
いずれの実例もかつて Qiita に投稿したものです。実例の詳細は記事を参照してください。

## ダウンロード

github から次のようにダウンロードしてください。
現時点の最新バージョンは v0.3.3 です。チェックアウトしてください。
なお、いくつかのイメージファイルはかなり大きいので、Git LFS(Large File Storage)を使っています。
お使いの環境に git-lfs がインストールされている必要があります。


```
shell$ git clone git://github.com/ikwzm/FPGA-SoC-Linux
shell$ cd FPGA-SoC-Linux
shell$ git checkout v0.3.3
shell$ git lfs pull
```

## インストール

target/zynq-zybo/examples-001.tgz にアーカイブされているので、ターゲットシステムのどこかに展開してください。
ここでは、/home/fpga/examples に展開しているものとします。

## udmabuf_test

以下の記事で紹介した実例です。

- [「Linuxでユーザー空間で動作するプログラムとハードウェアがメモリを共有するためのデバイスドライバ」@Qiita](http://qiita.com/ikwzm/items/cc1bb33ff43a491440ea)

udmabuf_test は FPGA 部は使わないので、FPGA Manager は使いません。

スクリプトには ruby の rake を使っています。ここでは Rakefile の説明はしませんので、詳細を知りたい方は Rakefile を見てください。

```
fpga@debian-fpga:~/examples/udmabuf_test$ rake -T
rake test[buffer_size]             # udmabuf test
rake test_all                      # udmabuf test all (buffer_size_list = [...
rake udmabuf:install[buffer_size]  # Install udmabuf
rake udmabuf:uninstall             # Uninstall udmabuf
```

device tree overlay を使うためには super user 権限が必要です。sudo を使って実行してください。

```
fpga@debian-fpga:~/examples/udmabuf_test$ sudo rake test_all
[ 3696.748485] udmabuf amba:udmabuf0: driver probe start.
[ 3696.757511] udmabuf udmabuf0: driver installed
[ 3696.763209] udmabuf udmabuf0: major number   = 245
[ 3696.767922] udmabuf udmabuf0: minor number   = 0
[ 3696.772562] udmabuf udmabuf0: phys address   = 0x1f100000
[ 3696.777910] udmabuf udmabuf0: buffer size    = 1048576
[ 3696.783062] udmabuf amba:udmabuf0: driver installed.
./udmabuf_test
phys_addr=0x1f100000
size=1048576
check_buf()
sync_mode=0, O_SYNC=0, time = 0.491947 sec
sync_mode=0, O_SYNC=1, time = 0.491604 sec
sync_mode=1, O_SYNC=0, time = 0.491924 sec
sync_mode=1, O_SYNC=1, time = 2.134751 sec
sync_mode=2, O_SYNC=0, time = 0.491645 sec
sync_mode=2, O_SYNC=1, time = 1.435540 sec
sync_mode=3, O_SYNC=0, time = 0.491528 sec
sync_mode=3, O_SYNC=1, time = 1.435055 sec
sync_mode=4, O_SYNC=0, time = 0.491507 sec
sync_mode=4, O_SYNC=1, time = 0.491931 sec
sync_mode=5, O_SYNC=0, time = 2.134731 sec
sync_mode=5, O_SYNC=1, time = 2.134084 sec
sync_mode=6, O_SYNC=0, time = 1.434684 sec
sync_mode=6, O_SYNC=1, time = 1.434833 sec
sync_mode=7, O_SYNC=0, time = 1.434657 sec
sync_mode=7, O_SYNC=1, time = 1.434910 sec
clear_buf()
sync_mode=0, O_SYNC=0, time = 0.045331 sec
sync_mode=0, O_SYNC=1, time = 0.045379 sec
sync_mode=1, O_SYNC=0, time = 0.045188 sec
sync_mode=1, O_SYNC=1, time = 0.851686 sec
sync_mode=2, O_SYNC=0, time = 0.045237 sec
sync_mode=2, O_SYNC=1, time = 0.050361 sec
sync_mode=3, O_SYNC=0, time = 0.045287 sec
sync_mode=3, O_SYNC=1, time = 0.050279 sec
sync_mode=4, O_SYNC=0, time = 0.045153 sec
sync_mode=4, O_SYNC=1, time = 0.045099 sec
sync_mode=5, O_SYNC=0, time = 0.851646 sec
sync_mode=5, O_SYNC=1, time = 0.851606 sec
sync_mode=6, O_SYNC=0, time = 0.050234 sec
sync_mode=6, O_SYNC=1, time = 0.050196 sec
sync_mode=7, O_SYNC=0, time = 0.050199 sec
sync_mode=7, O_SYNC=1, time = 0.050185 sec
dtbocfg.rb --remove udmabuf0
[ 3718.839929] udmabuf udmabuf0: driver uninstalled
[ 3718.845018] udmabuf amba:udmabuf0: driver unloaded
[ 3719.263016] udmabuf amba:udmabuf0: driver probe start.
[ 3719.275397] udmabuf udmabuf0: driver installed
[ 3719.279786] udmabuf udmabuf0: major number   = 245
[ 3719.284533] udmabuf udmabuf0: minor number   = 0
[ 3719.289134] udmabuf udmabuf0: phys address   = 0x1f100000
[ 3719.296928] udmabuf udmabuf0: buffer size    = 2097152
[ 3719.302647] udmabuf amba:udmabuf0: driver installed.
./udmabuf_test
phys_addr=0x1f100000
size=2097152
check_buf()
sync_mode=0, O_SYNC=0, time = 0.983583 sec
sync_mode=0, O_SYNC=1, time = 0.983444 sec
sync_mode=1, O_SYNC=0, time = 0.983642 sec
sync_mode=1, O_SYNC=1, time = 4.268731 sec
sync_mode=2, O_SYNC=0, time = 0.983318 sec
sync_mode=2, O_SYNC=1, time = 2.869847 sec
sync_mode=3, O_SYNC=0, time = 0.983497 sec
sync_mode=3, O_SYNC=1, time = 2.869770 sec
sync_mode=4, O_SYNC=0, time = 0.983390 sec
sync_mode=4, O_SYNC=1, time = 0.983825 sec
sync_mode=5, O_SYNC=0, time = 4.268297 sec
sync_mode=5, O_SYNC=1, time = 4.268084 sec
sync_mode=6, O_SYNC=0, time = 2.869399 sec
sync_mode=6, O_SYNC=1, time = 2.869416 sec
sync_mode=7, O_SYNC=0, time = 2.869743 sec
sync_mode=7, O_SYNC=1, time = 2.869450 sec
clear_buf()
sync_mode=0, O_SYNC=0, time = 0.097197 sec
sync_mode=0, O_SYNC=1, time = 0.097964 sec
sync_mode=1, O_SYNC=0, time = 0.098398 sec
sync_mode=1, O_SYNC=1, time = 1.702990 sec
sync_mode=2, O_SYNC=0, time = 0.097596 sec
sync_mode=2, O_SYNC=1, time = 0.100492 sec
sync_mode=3, O_SYNC=0, time = 0.098152 sec
sync_mode=3, O_SYNC=1, time = 0.100473 sec
sync_mode=4, O_SYNC=0, time = 0.098084 sec
sync_mode=4, O_SYNC=1, time = 0.098616 sec
sync_mode=5, O_SYNC=0, time = 1.703060 sec
sync_mode=5, O_SYNC=1, time = 1.702889 sec
sync_mode=6, O_SYNC=0, time = 0.100379 sec
sync_mode=6, O_SYNC=1, time = 0.100378 sec
sync_mode=7, O_SYNC=0, time = 0.100373 sec
sync_mode=7, O_SYNC=1, time = 0.100369 sec
dtbocfg.rb --remove udmabuf0
[ 3763.026470] udmabuf udmabuf0: driver uninstalled
[ 3763.031704] udmabuf amba:udmabuf0: driver unloaded
[ 3763.436120] udmabuf amba:udmabuf0: driver probe start.
[ 3763.453990] udmabuf udmabuf0: driver installed
[ 3763.458355] udmabuf udmabuf0: major number   = 245
[ 3763.463201] udmabuf udmabuf0: minor number   = 0
[ 3763.467737] udmabuf udmabuf0: phys address   = 0x1f100000
[ 3763.473155] udmabuf udmabuf0: buffer size    = 4194304
[ 3763.478240] udmabuf amba:udmabuf0: driver installed.
./udmabuf_test
phys_addr=0x1f100000
size=4194304
check_buf()
sync_mode=0, O_SYNC=0, time = 1.966676 sec
sync_mode=0, O_SYNC=1, time = 1.966749 sec
sync_mode=1, O_SYNC=0, time = 1.966512 sec
sync_mode=1, O_SYNC=1, time = 8.535471 sec
sync_mode=2, O_SYNC=0, time = 1.966281 sec
sync_mode=2, O_SYNC=1, time = 5.737825 sec
sync_mode=3, O_SYNC=0, time = 1.966355 sec
sync_mode=3, O_SYNC=1, time = 5.737796 sec
sync_mode=4, O_SYNC=0, time = 1.966330 sec
sync_mode=4, O_SYNC=1, time = 1.966444 sec
sync_mode=5, O_SYNC=0, time = 8.535642 sec
sync_mode=5, O_SYNC=1, time = 8.535291 sec
sync_mode=6, O_SYNC=0, time = 5.737536 sec
sync_mode=6, O_SYNC=1, time = 5.737562 sec
sync_mode=7, O_SYNC=0, time = 5.737549 sec
sync_mode=7, O_SYNC=1, time = 5.737493 sec
clear_buf()
sync_mode=0, O_SYNC=0, time = 0.198774 sec
sync_mode=0, O_SYNC=1, time = 0.199124 sec
sync_mode=1, O_SYNC=0, time = 0.199739 sec
sync_mode=1, O_SYNC=1, time = 3.405121 sec
sync_mode=2, O_SYNC=0, time = 0.199249 sec
sync_mode=2, O_SYNC=1, time = 0.200841 sec
sync_mode=3, O_SYNC=0, time = 0.198967 sec
sync_mode=3, O_SYNC=1, time = 0.200908 sec
sync_mode=4, O_SYNC=0, time = 0.198965 sec
sync_mode=4, O_SYNC=1, time = 0.198842 sec
sync_mode=5, O_SYNC=0, time = 3.405104 sec
sync_mode=5, O_SYNC=1, time = 3.404993 sec
sync_mode=6, O_SYNC=0, time = 0.200748 sec
sync_mode=6, O_SYNC=1, time = 0.200731 sec
sync_mode=7, O_SYNC=0, time = 0.200737 sec
sync_mode=7, O_SYNC=1, time = 0.200746 sec
dtbocfg.rb --remove udmabuf0
[ 3850.516220] udmabuf udmabuf0: driver uninstalled
[ 3850.521949] udmabuf amba:udmabuf0: driver unloaded
```

## uio_irq_sample

以下の記事で紹介した実例です。

- [「UIO(User space IO)の割り込みの使い方の例」@Qiita](http://qiita.com/ikwzm/items/b22592c31cdbb9ab6cf7)


スクリプトには ruby の rake を使っています。ここでは Rakefile の説明はしませんので、詳細を知りたい方は Rakefile を見てください。

```
fpga@debian-fpga:~/examples/uio_irq_sample$ rake -T
rake devicetree:install    # Install device tree
rake devicetree:uninstall  # Uninstall device tree
rake fpga:install          # Install fpga
rake install               # Install fpga and devicetrees
rake uninstall             # Uninstall fpga and devicetrees
```

rake install で、FPGA と Device Tree をインストールします。
インストールには super user 権限が必要です。sudo を使って実行してください。

```
fpga@debian-fpga:~/examples/uio_irq_sample$ sudo rake install
dd if=design_1_wrapper.bit of=/dev/fpgacfg0 bs=1M
1+1 records in
1+1 records out
2083852 bytes (2.1 MB) copied, 0.0518765 s, 40.2 MB/s
dtbocfg.rb --install uio_irq_sample --dts devicetree.dts
[ 5257.752033] udmabuf amba:pump-udmabuf4: driver probe start.
[ 5257.771542] udmabuf udmabuf4: driver installed
[ 5257.775914] udmabuf udmabuf4: major number   = 245
[ 5257.780743] udmabuf udmabuf4: minor number   = 0
[ 5257.785287] udmabuf udmabuf4: phys address   = 0x1f100000
[ 5257.790707] udmabuf udmabuf4: buffer size    = 4194304
[ 5257.795790] udmabuf amba:pump-udmabuf4: driver installed.
[ 5257.801731] udmabuf amba:pump-udmabuf5: driver probe start.
[ 5257.819306] udmabuf udmabuf5: driver installed
[ 5257.823698] udmabuf udmabuf5: major number   = 245
[ 5257.828442] udmabuf udmabuf5: minor number   = 1
[ 5257.833085] udmabuf udmabuf5: phys address   = 0x1f500000
[ 5257.838424] udmabuf udmabuf5: buffer size    = 4194304
[ 5257.843584] udmabuf amba:pump-udmabuf5: driver installed.
```

サンプルプログラム(sample1,sample2)をコンパイル

```
fpga@debian-fpga:~/examples/uio_irq_sample$ rake
gcc  -o sample1 sample1.c
gcc  -o sample2 sample2.c
```

```
fpga@debian-fpga:~/examples/uio_irq_sample$ ./sample1
time = 0.022111 sec
time = 0.022158 sec
time = 0.022040 sec
time = 0.022147 sec
time = 0.022094 sec
time = 0.022021 sec
time = 0.022118 sec
time = 0.022119 sec
time = 0.022078 sec
time = 0.022076 sec
```

```
fpga@debian-fpga:~/examples/uio_irq_sample$ ./sample2
time = 0.022132 sec
time = 0.022015 sec
time = 0.022190 sec
time = 0.022070 sec
time = 0.022135 sec
time = 0.022116 sec
time = 0.022134 sec
time = 0.022103 sec
time = 0.022103 sec
time = 0.022095 sec
```

終わったら *必ず* uninstall して device tree を削除してください。

```
fpga@debian-fpga:~/examples/uio_irq_sample$ sudo rake uninstall
dtbocfg.rb --remove uio_irq_sample
[ 5559.550963] udmabuf udmabuf5: driver uninstalled
[ 5559.556676] udmabuf amba:pump-udmabuf5: driver unloaded
[ 5559.563018] udmabuf udmabuf4: driver uninstalled
[ 5559.569580] udmabuf amba:pump-udmabuf4: driver unloaded
```

## accumulator

以下の記事で紹介した実例です。

- [「MessagePack-RPCを使ってFPGAを制御」@Qiita](http://qiita.com/ikwzm/items/2644c6e50a7049c75d49)
- [「Synthesijerで作ったモジュールをMessagePack-RPCで制御する(アーキテクチャ編)」@Qiita](http://qiita.com/ikwzm/items/6cb623b057a687ff4a8e)
- [「Synthesijerで作ったモジュールをMessagePack-RPCで制御する(IP-Package編)」@Qiita](http://qiita.com/ikwzm/items/924fc3fd59bdf7da55a2)
- [「Synthesijerで作ったモジュールをMessagePack-RPCで制御する(ZYNQ論理合成編)」@Qiita](http://qiita.com/ikwzm/items/0254f1d49602095b5cde)
- [「Synthesijerで作ったモジュールをMessagePack-RPCで制御する(TTYドライバ編)」@Qiita](http://qiita.com/drafts/533b905f7d1eb2e6c4d5)
- [「Synthesijerで作ったモジュールをMessagePack-RPCで制御する(MessagePack-Ruby編)」@Qiita](http://qiita.com/ikwzm/items/f742e2c9b5d9642d8857)

スクリプトには ruby の rake を使っています。ここでは Rakefile の説明はしませんので、詳細を知りたい方は Rakefile を見てください。

```
fpga@debian-fpga:~/examples/accumulator$ rake -T
rake fpga:install     # Install fpga
rake install          # Install fpga and devicetrees
rake run              # run
rake uninstall        # Uninstall fpga and devicetrees
rake zptty:install    # Install zptty device driver
rake zptty:uninstall  # Unnstall zptty device driver
```

rake install で、FPGA と Device Tree をインストールします。
インストールには super user 権限が必要です。sudo を使って実行してください。

```
fpga@debian-fpga:~/examples/accumulator$ sudo rake install
dd if=design_1_wrapper.bit of=/dev/fpgacfg0 bs=1M
1+1 records in
1+1 records out
2083852 bytes (2.1 MB) copied, 0.0528286 s, 39.4 MB/s
dtbocfg.rb --install zptty0 --dts zptty0-zynq-zybo.dts
[ 6032.783171] zptty 43c10000.zptty: ZPTTY Driver probe start
[ 6032.788851] zptty 43c10000.zptty: driver installed
[ 6032.793622] zptty 43c10000.zptty: device name    = zptty0
[ 6032.798945] zptty 43c10000.zptty: private record = ddfffc00 (332bytes)
[ 6032.805495] zptty 43c10000.zptty: major number   = 246
[ 6032.810574] zptty 43c10000.zptty: minor number   = 0
[ 6032.815567] zptty 43c10000.zptty: regs resource  = [mem 0x43c10000-0x43c10fff flags 0x200]
[ 6032.823806] zptty 43c10000.zptty: regs address   = e15b8000
[ 6032.829325] zptty 43c10000.zptty: irq resource   = [irq 161 flags 0x404]
[ 6032.836047] zptty 43c10000.zptty: tx buf size    = 128
[ 6032.841166] zptty 43c10000.zptty: rx buf size    = 128
```

```
fpga@debian-fpga:~/examples/accumulator$ ruby test.rb
OK : reg = 1; add(6625) => 6626; reg = 6626
OK : reg = 6626; add(9833) => 16459; reg = 16459
OK : reg = 16459; add(7280) => 23739; reg = 23739
OK : reg = 23739; add(3535) => 27274; reg = 27274
OK : reg = 27274; add(5848) => 33122; reg = 33122
OK : reg = 33122; add(9770) => 42892; reg = 42892
OK : reg = 42892; add(2771) => 45663; reg = 45663
      :
    (中略)
      :
OK : reg = -4997637; add(-9940) => -5007577; reg = -5007577
OK : reg = -5007577; add(-3887) => -5011464; reg = -5011464
NoMethodError
ArgumentError
ArgumentError
```

最後の３行のエラーは、メソッド名や引数を間違えたときにエラーになることを検査しているので気にしないでください。

終わったら *必ず* uninstall して device tree を削除してください。

```
fpga@debian-fpga:~/examples/accumulator$ sudo rake uninstall
dtbocfg.rb --remove zptty0
[ 6258.046383] zptty 43c10000.zptty: driver removed
```

## fibonacci

以下の記事で紹介した実例です。

- [「フィボナッチを求める回路をVHDLとMessagePack-RPCでFPGAに実装してみた(ZYNQ編)」@Qiita](http://qiita.com/ikwzm/items/0d608ace0e9a9a872a0b)

スクリプトには ruby の rake を使っています。ここでは Rakefile の説明はしませんので、詳細を知りたい方は Rakefile を見てください。

```
fpga@debian-fpga:~/examples/fibonacci$ rake -T
rake fpga:install     # Install fpga
rake install          # Install fpga and devicetrees
rake run              # run
rake uninstall        # Uninstall fpga and devicetrees
rake zptty:install    # Install zptty device driver
rake zptty:uninstall  # Unnstall zptty device driver
```

rake install で、FPGA と Device Tree をインストールします。
インストールには super user 権限が必要です。sudo を使って実行してください。

```
fpga@debian-fpga:~/examples/fibonacci$ sudo rake install
dd if=design_1_wrapper.bit of=/dev/fpgacfg0 bs=1M
1+1 records in
1+1 records out
2083852 bytes (2.1 MB) copied, 0.140482 s, 14.8 MB/s
dtbocfg.rb --install zptty0 --dts zptty0-zynq-zybo.dts
[ 6688.904316] zptty 43c10000.zptty: ZPTTY Driver probe start
[ 6688.909991] zptty 43c10000.zptty: driver installed
[ 6688.914806] zptty 43c10000.zptty: device name    = zptty0
[ 6688.920124] zptty 43c10000.zptty: private record = ddffac00 (332bytes)
[ 6688.926729] zptty 43c10000.zptty: major number   = 246
[ 6688.931787] zptty 43c10000.zptty: minor number   = 0
[ 6688.936792] zptty 43c10000.zptty: regs resource  = [mem 0x43c10000-0x43c10fff flags 0x200]
[ 6688.945022] zptty 43c10000.zptty: regs address   = e17bc000
[ 6688.950538] zptty 43c10000.zptty: irq resource   = [irq 161 flags 0x404]
[ 6688.957255] zptty 43c10000.zptty: tx buf size    = 128
[ 6688.962341] zptty 43c10000.zptty: rx buf size    = 128
```

```
fpga@debian-fpga:~/examples/fibonacci$ ruby test.rb
0 => 0
1 => 1
2 => 1
3 => 2
4 => 3
5 => 5
6 => 8
7 => 13
8 => 21
9 => 34
10 => 55
11 => 89
12 => 144
13 => 233
14 => 377
15 => 610
16 => 987
17 => 1597
18 => 2584
19 => 4181
20 => 6765
21 => 10946
22 => 17711
23 => 28657
24 => 46368
25 => 75025
26 => 121393
27 => 196418
28 => 317811
29 => 514229
30 => 832040
31 => 1346269
32 => 2178309
33 => 3524578
34 => 5702887
35 => 9227465
36 => 14930352
37 => 24157817
38 => 39088169
39 => 63245986
40 => 102334155
41 => 165580141
42 => 267914296
43 => 433494437
44 => 701408733
45 => 1134903170
46 => 1836311903
47 => 2971215073
48 => 4807526976
49 => 7778742049
50 => 12586269025
51 => 20365011074
52 => 32951280099
53 => 53316291173
54 => 86267571272
55 => 139583862445
56 => 225851433717
57 => 365435296162
58 => 591286729879
59 => 956722026041
60 => 1548008755920
61 => 2504730781961
62 => 4052739537881
63 => 6557470319842
64 => 10610209857723
65 => 17167680177565
66 => 27777890035288
67 => 44945570212853
68 => 72723460248141
69 => 117669030460994
70 => 190392490709135
71 => 308061521170129
72 => 498454011879264
73 => 806515533049393
74 => 1304969544928657
75 => 2111485077978050
76 => 3416454622906707
77 => 5527939700884757
78 => 8944394323791464
79 => 14472334024676221
80 => 23416728348467685
81 => 37889062373143906
82 => 61305790721611591
83 => 99194853094755497
84 => 160500643816367088
85 => 259695496911122585
86 => 420196140727489673
87 => 679891637638612258
88 => 1100087778366101931
89 => 1779979416004714189
90 => 2880067194370816120
```

終わったら *必ず* uninstall して device tree を削除してください。

```
fpga@debian-fpga:~/examples/accumulator$ sudo rake uninstall
dtbocfg.rb --remove zptty0
[ 6813.229984] zptty 43c10000.zptty: driver removed
```

## zundoko

以下の記事で紹介した実例です。

- [「ズンドコキヨシ with VHDL on FPGA」@Qiita](http://qiita.com/ikwzm/items/fb68798172fe980b77b2)

スクリプトには ruby の rake を使っています。ここでは Rakefile の説明はしませんので、詳細を知りたい方は Rakefile を見てください。

```
fpga@debian-fpga:~/examples/zundoko$ rake -T
rake fpga:install     # Install fpga
rake install          # Install fpga and devicetrees
rake run              # run
rake uninstall        # Uninstall fpga and devicetrees
rake zptty:install    # Install zptty device driver
rake zptty:uninstall  # Unnstall zptty device driver
```

rake install で、FPGA と Device Tree をインストールします。
インストールには super user 権限が必要です。sudo を使って実行してください。

```
fpga@debian-fpga:~/examples/zundoko$ sudo rake install
dd if=design_1_wrapper.bit of=/dev/fpgacfg0 bs=1M
1+1 records in
1+1 records out
2083852 bytes (2.1 MB) copied, 0.0517575 s, 40.3 MB/s
dtbocfg.rb --install zptty0 --dts zptty0-zynq-zybo.dts
[ 7031.439152] zptty 43c10000.zptty: ZPTTY Driver probe start
[ 7031.444918] zptty 43c10000.zptty: driver installed
[ 7031.451161] zptty 43c10000.zptty: device name    = zptty0
[ 7031.456487] zptty 43c10000.zptty: private record = ddff7800 (332bytes)
[ 7031.464387] zptty 43c10000.zptty: major number   = 246
[ 7031.470179] zptty 43c10000.zptty: minor number   = 0
[ 7031.475065] zptty 43c10000.zptty: regs resource  = [mem 0x43c10000-0x43c10fff flags 0x200]
[ 7031.484630] zptty 43c10000.zptty: regs address   = e19c0000
[ 7031.490821] zptty 43c10000.zptty: irq resource   = [irq 161 flags 0x404]
[ 7031.497446] zptty 43c10000.zptty: tx buf size    = 128
[ 7031.503876] zptty 43c10000.zptty: rx buf size    = 128
```

```
fpga@debian-fpga:~/examples/zundoko$ ruby zundoko.rb
["ZUN", "ZUN", "DOKO", "ZUN", "ZUN", "ZUN", "ZUN", "DOKO", "KI.YO.SHI!"]
fpga@debian-fpga:~/examples/zundoko$ ruby zundoko.rb
["ZUN", "ZUN", "DOKO", "DOKO", "DOKO", "DOKO", "ZUN", "ZUN", "ZUN", "ZUN", "ZUN", "ZUN", "DOKO", "KI.YO.SHI!"]
fpga@debian-fpga:~/examples/zundoko$ ruby zundoko.rb
["ZUN", "ZUN", "DOKO", "ZUN", "ZUN", "ZUN", "DOKO", "ZUN", "ZUN", "DOKO", "DOKO", "DOKO", "DOKO", "DOKO", "ZUN", "ZUN", "ZUN", "DOKO", "DOKO", "DOKO", "ZUN", "DOKO", "DOKO", "DOKO", "DOKO", "ZUN", "DOKO", "ZUN", "DOKO", "ZUN", "ZUN", "ZUN", "ZUN", "DOKO", "KI.YO.SHI!"]
fpga@debian-fpga:~/examples/zundoko$ ruby zundoko.rb
["DOKO", "ZUN", "ZUN", "DOKO", "DOKO", "DOKO", "ZUN", "DOKO", "DOKO", "ZUN", "DOKO", "ZUN", "ZUN", "ZUN", "DOKO", "DOKO", "DOKO", "ZUN", "ZUN", "ZUN", "DOKO", "ZUN", "DOKO", "ZUN", "ZUN", "ZUN", "ZUN", "DOKO", "KI.YO.SHI!"]
```

終わったら *必ず* uninstall して device tree を削除してください。

```
fpga@debian-fpga:~/examples/zundoko$ sudo rake uninstall
dtbocfg.rb --remove zptty0
[ 7146.706619] zptty 43c10000.zptty: driver removed
```