##はじめに
Synthesijerで作ったモジュールをMessagePack-RPCで制御する(ZYNQ論理合成編)およびSynthesijerで作ったモジュールをMessagePack-RPCで制御する(Altera SoC論理合成編)の続きです。
今回は、前回インプリメンテーションしたAccumulator_Serverに対して MessagePack-RPC を入出力するためのデバイスドライバ(zptty)に関して説明します。
###zpttyとは
zpttyは、「Synthesijerで作ったモジュールをMessagePack-RPCで制御する(ZYNQ論理合成編)」または「Synthesijerで作ったモジュールをMessagePack-RPCで制御する(Altera SoC論理合成編)」でFPGAに実装したCPU-Accumulator_Server間の通信用IP(PTTY_AXI)をLinuxからはあたかもシリアルポートに見せるためのドライバです。
このドライバを使うことにより、Accumulator_Server との MessagePack-RPC のやりとりは、シリアルポートを介して行うように見えます。
ただ、PTTY_AXIとzpttyドライバは、TTY(TeleTYpe)のような比較的低速な入出力を想定しており、転送速度は高くありません。
とりあえず、MessagePack-RPC の実験用に他のプロジェクトから流用したものです。
数バイト程度のやりとりであれば問題ありませんが、高スループットが必要な場合は別の方法を考える必要があります。
###プロジェクトのリポジトリ
###対応プラットフォーム
- 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 変数を設定してください。
#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論理合成編)」でデザインした時に指定した値を設定します。
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論理合成編)」でデザインした時に指定した値を設定します。
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)
MessagePack for VHDL Examples (https://github.com/ikwzm/msgpack-vhdl-examples)
MessagePack-RPCを使ってFPGAを制御
Synthesijerで作ったモジュールをMessagePack-RPCで制御する(アーキテクチャ編)
Synthesijerで作ったモジュールをMessagePack-RPCで制御する(IP-Package編)
Synthesijerで作ったモジュールをMessagePack-RPCで制御する(ZYNQ論理合成編)
Synthesijerで作ったモジュールをMessagePack-RPCで制御する(Altera SoC論理合成編)
Synthesijerで作ったモジュールをMessagePack-RPCで制御する(リモートサーバー編)