LoginSignup
3
3

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-11-06

はじめに

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で制御する(リモートサーバー編)

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3