FC2カウンター FPGAの部屋 デバイスドライバ udmabuf を使用する1

FPGAやCPLDの話題やFPGA用のツールの話題などです。 マニアックです。 日記も書きます。

FPGAの部屋

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。Xilinx ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。

デバイスドライバ udmabuf を使用する1

ikwzm さんのLinuxでユーザー空間で動作するプログラムとハードウェアがメモリを共有するためのデバイスドライバ udmabuf を使うことにした。

今までは、”並列ステレオカメラによる距離の測定8(Ubuntuで動作するアプリケーションを作る1)”の zynq-zybo.dts の frame_buffer_bmdc@0x17800000 エントリを作って、CMA領域の 0x17800000 の領域を確保した。
CMA領域は予約されているが、ドライバがインストールされて使用されるか?わからない。そのため、CMA領域の途中から自分のハードウェア用のDMA領域(画像データのフレームバッファ)を使用していたが、やはり不確実だ。
そこで、ikwzm さんのLinuxでユーザー空間で動作するプログラムとハードウェアがメモリを共有するためのデバイスドライバudmabuf(User space mappable DMA Buffer) を使うことにした。

まずは、ZYBO のLinux カーネルのバージョンを調べてみよう。
uname -r コマンドで調べると、3.14.0 だった。
udmabuf_13_160121.png

次に、パソコンの VirtualBox 上のUbuntu 14.04 を起動する。
ここには、”ZYBO用のEmbedded Linux チュートリアル7(Linuxカーネルのビルド)”や、”Vivado and zybo linux勉強会資料3”に示したDigilent Linux のビルド環境を設定してある。

~/ZYBO/Digilent_Linux_Tutrilal に入って
git clone https://github.com/ikwzm/udmabuf
で、ikwzm さんの udmabuf をクローンした。
udmabuf_2_160121.png

cd udmabuf
ls

で udmabuf ディレクトリのファイルを見た。
udmabuf_3_160121.png

gedit Makefile
で、Makefile を編集した。”ZYBO用のEmbedded Linux チュートリアル10(myLedのドライバの構築とデバイス・ツリーへの追加)”を参考にして、Makefile を書き換えた。
udmabuf_4_160121.png

obj-m := udmabuf.o

all:
    make -C ../Linux-Digilent-Dev/ M=$(PWD) modules

clean:
    make -C ../Linux-Digilent-Dev/ M=$(PWD) clean


make ARCH=arm CROSS_COMPILE=arm-xilinx-linux-gnueabi-
を実行して、make を行った。
ls
で見ると、udmabuf.ko ができていた。
udmabuf_5_160121.png

次に、gFTP を立ち上げて、192.168.3.62 のZYBO にコネクトし、/home/linaro に udmabuf.ko をアップロードした。
udmabuf_6_160121.png


これからはZYBO 上のLinux に移動した。これからはZYBO 上のLinux での作業となる。
最初に udmabuf.ko カーネル・ドライバをロードする。

いろいろとトライしてしまっているが、結局
sudo insmod udmabuf.ko udmabuf0=0x57E400
を実行した。udmabuf 領域は、0x57E400 だ。これは16進で入力したが、10進で 5760000 と書いてもOKのようだ。これは、800 ピクセル x 600 ライン x 4 バイト x 3 画面分のフレームバッファを確保している。
udmabuf_7_160121.png

ls -l /dev/udma*
を実行すると /dev/udmabuf0 ができていた。
ls -l /sys/class/udambuf
を実行すると、/sys/devices/virtual/udmabuf/udmabuf0 にリンクされているようだった。
udmabuf_8_160121.png

そこで、
cd /sys/devices/virtual/udmabuf/udmabuf0
を実行して、
ls -l
でファイルを見た。
udmabuf_9_160121.png

いろいろなデバイスファイルが生成されていた。一つ一つ、cat コマンドで表示してみた。
udmabuf_10_160121.png
udmabuf_11_160121.png

linaro@linaro-ubuntu-desktop:/sys/devices/virtual/udmabuf/udmabuf0$ cat phys_addr
0x18900000
linaro@linaro-ubuntu-desktop:/sys/devices/virtual/udmabuf/udmabuf0$ cat size
5760000
linaro@linaro-ubuntu-desktop:/sys/devices/virtual/udmabuf/udmabuf0$ cat dev
244:0
linaro@linaro-ubuntu-desktop:/sys/devices/virtual/udmabuf/udmabuf0$ cat sync_direction
0
linaro@linaro-ubuntu-desktop:/sys/devices/virtual/udmabuf/udmabuf0$ cat sync_for_cpu
0
linaro@linaro-ubuntu-desktop:/sys/devices/virtual/udmabuf/udmabuf0$ cat sync_for_device
0
linaro@linaro-ubuntu-desktop:/sys/devices/virtual/udmabuf/udmabuf0$ cat sync_mode
1
linaro@linaro-ubuntu-desktop:/sys/devices/virtual/udmabuf/udmabuf0$ cat sync_offset
0x0
linaro@linaro-ubuntu-desktop:/sys/devices/virtual/udmabuf/udmabuf0$ cat sync_owner
0
linaro@linaro-ubuntu-desktop:/sys/devices/virtual/udmabuf/udmabuf0$ cat sync_size
5760000
linaro@linaro-ubuntu-desktop:/sys/devices/virtual/udmabuf/udmabuf0$ cat uevent
MAJOR=244
MINOR=0
DEVNAME=udmabuf0
linaro@linaro-ubuntu-desktop:/sys/devices/virtual/udmabuf/udmabuf0$ cat debug_vma
0


phys_addr は 0x18900000 から物理アドレスが確保されていることを示す。
size は、5760000 バイト確保されていることを示す。
その他のデバイスファイルは主にキャッシュの制御に用いられる。詳しくは、”Linuxでユーザー空間で動作するプログラムとハードウェアがメモリを共有するためのデバイスドライバ(キャッシュのフラッシュと無効化を追加)”を参照のこと。

sudo rmmod udmabuf
で udmabuf を削除したところ、/dev/udmabuf0 は無くなった。
udmabuf_12_160121.png
  1. 2016年01月22日 04:33 |
  2. Linux
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック URL
http://marsee101.blog19.fc2.com/tb.php/3373-c2a384b0
この記事にトラックバックする(FC2ブログユーザー)