はじめに
Arria® 10 SoC Development Kit の Hard Processor System(HPS)側の LED は、SPIO Interface(HPS 側の SPI Master から MAX V に対して SPI コマンドで操作)で接続されており、通常の GPIO で構成されているわけではありません。
ただし Linux には spidev という SPI 用のデバイスドライバが用意されており、それを使用することで操作可能です。
使用する Linux Image
SoC FPGA エンベデッド開発スイート(SoC EDS)v18.0 Standard Edition に内包されている Arria® 10 SoC 向け Linux Image
C:\intelFPGA\18.0\embedded\embeddedsw\socfpga\prebuilt_images\Arria10_Linux_SDCard.tar.gz
サンプルコード
https://elixir.bootlin.com/linux/v4.9.78/source/tools/spi
1. SoC EDS 内包の SD カードイメージを SD に書き込む
下記の SD Card Image を tar コマンドで解凍し、Win32DiskImager で SD Card へ書き込みます。
C:\intelFPGA\18.0\embedded\embeddedsw\socfpga\prebuilt_images\Arria10_Linux_SDCard.tar.gz
解凍は Nios II Command Shell からも行うことが可能です。
$ tar xvf Arria10_Linux_SDCard.tar.gz
その後 Win32DiskImager で SD カードに書き込みます。
2. サンプルコードを fat 上にコピー
書き込み後の SD カードを一度 PC に抜き差し、PC 上にドライブとして見えるようにします。下記のように見えているかご確認ください。
下記のリンクから Makefile、spidev_fdx.c、spidev_test.c の 3 ファイルをコピーします。
https://elixir.bootlin.com/linux/v4.9.78/source/tools/spi
今回は spi_test というフォルダーにまとめました。
※ 右クリックで保存すると html 形式で保存されてしまうため、ファイルを作成してコピー&ペーストを行う方法でコピーしてください。
その後 SD カードにコピーします。
3. デバイスツリーを差し替える
SD カード内のデバイスツリーを、添付の socfpga_arria10_socdk_sdmmc.dtb に差し替えます。
こちらの差分は spidev.patch ファイルで差分として残してありますが、
prebuild の SD カード内包の spi では spidev の定義がないため差し替えています。
@@ -883,23 +883,10 @@ rx-dma-channel = <0x1e 0x11>; 32bit_access; - a10_sysctl@0 { - compatible = "altr,a10sycon", "altr,a10sr"; + spidev@0 { + compatible = "spidev"; reg = <0x0>; - interrupt-parent = <0x1f>; - interrupts = <0x5 0x8>; - interrupt-controller; - #interrupt-cells = <0x2>; spi-max-frequency = <0xf4240>; - - gpio-controller { - compatible = "altr,a10sycon-gpio", "altr,a10sr-gpio"; - gpio-controller; - #gpio-cells = <0x2>; - ngpios = <0x10>; - linux,phandle = <0x25>; - phandle = <0x25>; - }; }; };
4. SD カードで起動してサンプルプログラムをビルド
起動後、/dev 下に spidev が見えていることを確認します。
$ ls /dev | grep spidev
SD カードをマウントし、ホームディレクトリーにコピーします。
$ mkdir sd $ mount -t vfat /dev/mmcblk0p1 sd $ ls sd ghrd_10as066n2.core.rbf spi_test ghrd_10as066n2.periph.rbf zImage socfpga_arria10_socdk_sdmmc.dtb $ cp -r sd/spi_test . $ ls sd spi_test $ umount sd
コピーした spi_test フォルダに移動し、サンプルソースをビルドします。
拡張子なしの spidev_fdx と spidev_test ができていることを確認してください。
$ cd spi_test/ $ make gcc spidev_test.c -o spidev_test gcc spidev_fdx.c -o spidev_fdx $ spi_test# ls Makefile spidev_fdx spidev_fdx.c spidev_test spidev_test.c
5. spi_test を使用してコマンドを発行する
USAGE は下記のコードの print_usage を参照してください。
https://elixir.bootlin.com/linux/latest/source/tools/spi/spidev_test.c
Arria® 10 SoC Development Kit の User Guide を見ると、HPS 側 LED を駆動する場合には Instruction Code 0x02 のあとに書き込む値を次の 8bit データのうちの 上位 4 bit で指定します。
そのため、例えば HPS LED 0 と 1 を駆動したい場合は 0xC0 を指定します。
※ HPS LED は Low Active なので 0 で点灯。
$ ./spidev_test -D /dev/spidev32766.0 -O -H -p "\x02\xC0" spi mode: 0x3 bits per word: 8 max speed: 500000 Hz (500 KHz) RX | 00 00 __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ | ..
発行後の Arria® 10 SoC Development Kit を確認し、HPS LED の 0 と 1 が点灯していることを確認します。