Synthesijerで作ったモジュールをMessagePack-RPCで制御する(TTYドライバ編)

##はじめに
[Synthesijerで作ったモジュールをMessagePack-RPCで制御する(ZYNQ論理合成編)](http://qiita.com/ikwzm/items/0254f1d49602095b5cde)および[Synthesijerで作ったモジュールをMessagePack-RPCで制御する(Altera SoC論理合成編)](http://qiita.com/ikwzm/items/1e65fe447df72f6fbb5a)の続きです。
今回は、前回インプリメンテーションしたAccumulator_Serverに対して MessagePack-RPC を入出力するためのデバイスドライバ(zptty)に関して説明します。

###zpttyとは

zpttyは、[「Synthesijerで作ったモジュールをMessagePack-RPCで制御する(ZYNQ論理合成編)」](http://qiita.com/ikwzm/items/0254f1d49602095b5cde)または[「Synthesijerで作ったモジュールをMessagePack-RPCで制御する(Altera SoC論理合成編)」](http://qiita.com/ikwzm/items/1e65fe447df72f6fbb5a)でFPGAに実装したCPU-Accumulator_Server間の通信用IP(PTTY_AXI)をLinuxからはあたかもシリアルポートに見せるためのドライバです。
このドライバを使うことにより、Accumulator_Server との MessagePack-RPC のやりとりは、シリアルポートを介して行うように見えます。

ただ、PTTY_AXIとzpttyドライバは、TTY(TeleTYpe)のような比較的低速な入出力を想定しており、転送速度は高くありません。
とりあえず、MessagePack-RPC の実験用に他のプロジェクトから流用したものです。
数バイト程度のやりとりであれば問題ありませんが、高スループットが必要な場合は別の方法を考える必要があります。

###プロジェクトのリポジトリ

 - [msgpack-vhdl-examples (https://github.com/ikwzm/msgpack-vhdl-examples)](https://github.com/ikwzm/msgpack-vhdl-examples)


###対応プラットフォーム

- OS : Linux Kernel Version 3.18 or 4.4
- CPU: ARM(ZYNQ or CycloneV SoC)

##ビルド＆インストール

###ダウンロード
````
shell% git clone git://github.com/ikwzm/msgpack-vhdl-examples
shell% cd msgpack-vhdl-examples
shell% git submodule init
shell% git submodule update
shell% cd PTTY_AXI/src/drivers/zptty
````

###コンパイル

次のような Makefile を用意しています。環境に応じて KERNEL_SRC_DIR　変数を設定してください。

````Makefile
#KERNEL_SRC_DIR=$(HOME)/work/Zynq-Linux/Linux-Digilent-Dev/

obj-m := zptty.o

all:
	make -C $(KERNEL_SRC_DIR) ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- M=$(PWD) modules

clean:
	make -C $(KERNEL_SRC_DIR) ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- M=$(PWD) clean
````

###デバイスツリー

zpttyドライバをZYNQで使う場合は、デバイスツリーに次のような記述が必要です。
regのアドレスと割り込み番号は[「Synthesijerで作ったモジュールをMessagePack-RPCで制御する(ZYNQ論理合成編)」](http://qiita.com/ikwzm/items/0254f1d49602095b5cde)でデザインした時に指定した値を設定します。

````
                zptty@43c10010 {
                        compatible = "ikwzm,zptty-0.10.a";
                        minor-number = <0>;
                        reg = <0x43c10000 0x1000>;
                        interrupt-parent = <0x3>;
                        interrupts = <0x0 0x1d 0x4>;
                };
````

zpttyドライバをAtlas SoC(DE0-Nano-SoC)で使う場合は、デバイスツリーに次のような記述が必要です。
regのアドレスと割り込み番号は[「Synthesijerで作ったモジュールをMessagePack-RPCで制御する(Altera SoC論理合成編)」](http://qiita.com/ikwzm/items/1e65fe447df72f6fbb5a)でデザインした時に指定した値を設定します。

````
                zptty@0xFF202000 {
                        compatible = "ikwzm,zptty-0.10.a";
                        minor-number = <0x0>;
                        reg = <0xff202000 0x1000>;
                        interrupts = <0x0 0x28 0x4>;
                };
````



###インストール

insmodeでzpttyドライバをインストールします。

````
shell# insmod zptty.ko
[18957.643315] zptty 43c10000.zptty: ZPTTY Driver probe start
[18957.649153] zptty 43c10000.zptty: driver installed
[18957.653867] zptty 43c10000.zptty: device name    = zptty0
[18957.659296] zptty 43c10000.zptty: private record = 5de15000 (344bytes)
[18957.665758] zptty 43c10000.zptty: major number   = 245
[18957.670913] zptty 43c10000.zptty: minor number   = 0
[18957.675831] zptty 43c10000.zptty: regs resource  = [mem 0x43c10000-0x43c10fff flags 0x200]
[18957.684103] zptty 43c10000.zptty: regs address   = 6165a000
[18957.689649] zptty 43c10000.zptty: irq resource   = [irq 61 flags 0x404]
[18957.696224] zptty 43c10000.zptty: tx buf size    = 128
[18957.701380] zptty 43c10000.zptty: rx buf size    = 128
shell# ls -la /dev/zptty0
crw-rw---T 1 root dialout 245, 0 11月  6 12:36 /dev/zptty0
````

###デバッグの設定
zpttyをデバッグするときは、debugfs で各種デバッグ情報をログに出力できるようにします。

````
shell# mount -t debugfs none /sys/kernel/debug
shell# echo -n 'module zptty +p' > /sys/kernel/debug/dynamic_debug/control
````


##参照

[MessagePack for VHDL (https://github.com/ikwzm/msgpack-vhdl)](https://github.com/ikwzm/msgpack-vhdl)
[MessagePack for VHDL Examples (https://github.com/ikwzm/msgpack-vhdl-examples)](https://github.com/ikwzm/msgpack-vhdl-examples)
[MessagePack-RPCを使ってFPGAを制御](http://qiita.com/ikwzm/items/2644c6e50a7049c75d49)
[Synthesijerで作ったモジュールをMessagePack-RPCで制御する(アーキテクチャ編)](http://qiita.com/ikwzm/items/6cb623b057a687ff4a8e)
[Synthesijerで作ったモジュールをMessagePack-RPCで制御する(IP-Package編)](http://qiita.com/ikwzm/items/924fc3fd59bdf7da55a2)
[Synthesijerで作ったモジュールをMessagePack-RPCで制御する(ZYNQ論理合成編)](http://qiita.com/ikwzm/items/0254f1d49602095b5cde)
[Synthesijerで作ったモジュールをMessagePack-RPCで制御する(Altera SoC論理合成編)](http://qiita.com/ikwzm/items/1e65fe447df72f6fbb5a)
[Synthesijerで作ったモジュールをMessagePack-RPCで制御する(リモートサーバー編)](http://qiita.com/ikwzm/items/cfde888094c7c73f4ba6)