ブログ

Armadillo-X1:拡張I/FのSPIを使用する方法

at_kazutaka.bito
2017年3月31日 14時43分

Armadillo-X1の拡張I/F(CON8)のSPIを使用する方法です。
使用するCON8の端子番号と機能の相関は下記のとおりです。
SPI(ECSPI4)
 72:MISO
 73:MOSI
 74:SCLK
 75:SS(GPIO3_IO3)

なお、表題とは関係ないですが、GPIOも使えるようにもしてます。
GPIO
 99:GPIO入力(GPIO3_27)
 100:GPIO出力(GPIO3_28)

下記手順にて、カーネル"linux-3.14-x1-at[version]"の[version]の部分は、 ご使用のカーネルのバージョンに読み替えてください。

1.カーネルのビルド準備

Armadillo-X1製品マニュアル
10.2. Linuxカーネルをビルドする
http://manual.atmark-techno.com/armadillo-x1/armadillo-x1_product_manual_ja-1.1.0/ch10.html#sct.build-linux
を参考に、カーネルをビルドする環境を用意します。

2.カーネルコンフィギュレーション

atmark@atde6:~/linux-3.14-x1-at[version]$ make ARCH=arm x1_defconfig
atmark@atde6:~/linux-3.14-x1-at[version]$ make ARCH=arm menuconfig

と実行して、コンフィギュレーション画面を開いて、下記のように設定します。

Device Drivers --->
  [*] SPI support ---> <SPI>
        *** SPI Master Controller Drivers ***
    -*- Utilities for Bitbanging SPI masters <SPI_BITBANG>
    <*> Freescale i.MX SPI controllers <SPI_MXC>
 
        *** SPI Protocol Masters ***
    <*> User mode SPI device driver support <SPI_SPIDEV>

3.Device Tree Sourceで端子設定

SPI、GPIOの機能を設定したDevice Tree Sourceを準備します。

linux-3.14-x1-at[version]/arch/arm/boot/dts/ に添付の x1_spi_gpio_src_20170210.zip 内の
Makefile
armadillo_x1.dts
armadillo_x1-ecspi4_user1.dts
を置いてください。

補足)
armadillo_x1-ecspi4_user1.dts:標準のソースコードに含まれている
 SPI接続A/Dコンバータ(MCP3204)用のDeviceTree
 linux-3.14-x1-at[version]/arch/arm/boot/dts/armadillo_x1-ecspi4_mcp3202.dts  を改造したものです。
armadillo_x1.dts
 armadillo_x1-ecspi4_user1.dtsで追加したGPIOの設定(&pinctrl_ext_hog_1)を  追加したものです。
 標準のarmadillo_x1.dtsについて、
  pinctrl-0 = <&pinctrl_hog_1>;
 を
  pinctrl-0 = <&pinctrl_hog_1 &pinctrl_ext_hog_1>;
 に変更してます。
Makefile
 armadillo_x1-ecspi4_user1.dtsをビルドすることを追加したものです。
 標準のMakefileについて、
armadillo_x1-ecspi4_mcp3202.dtb \
 の下に
armadillo_x1-ecspi4_user1.dtb \
 を追加しています。

4.ビルド

ビルドします。

atmark@atde6:~/linux-3.14-x1-at[version]$ make CROSS_COMPILE=arm-linux-gnueabihf- ARCH=arm
atmark@atde6:~/linux-3.14-x1-at[version]$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- LOADADDR=0x80008000 uImage

5.Armadillo-X1のカーネル、DeviceTreeの変更

5.1.上記の手順で4ビルドされた
linux-3.14-x1-at[version]/arch/arm/boot/uImage
linux-3.14-x1-at[version]/arch/arm/boot/dts/armadillo_x1-ecspi4_user1.dtb
をArmadillo-X1に置きます。

5.2.カーネルイメージ変更します。

(以下は、ホームディレクトリにuImageを置いてある場合)

root@armadillo:~# mount -t vfat /dev/mmcblk2p1 /mnt
root@armadillo:~# cp uImage /mnt/uImage
root@armadillo:~# umount /mnt

5.3.armadillo_x1-ecspi4_user1.dtb(SPI,GPIOを設定したDTB)を追加します。

(以下は、ホームディレクトリにarmadillo_x1-ecspi4_user1.dtbを置いてある場合)

root@armadillo:~# mount -t vfat /dev/mmcblk2p1 /mnt
root@armadillo:~# cp armadillo_x1-ecspi4_user1.dtb /mnt/
root@armadillo:~# umount /mnt

6.DeviceTreeの選択

保守モードで、armadillo_x1-ecspi4_user1.dtb(SPI,GPIOを設定したDTB)を 選択します。

6.1.電源を落とします。

root@armadillo:~# halt

を実行後、電源を落とします。

6.2.保守モードで起動します。

Armadillo-X1製品マニュアル 図4.8 スライドスイッチの設定 http://manual.atmark-techno.com/armadillo-x1/armadillo-x1_product_manual_ja-1.1.0/ch04.html#sct.about-slide_switch-config を参考に保守モードにスイッチを設定して、電源を入れます。

6.3.armadillo_x1-ecspi4_user1.dtb(SPI,GPIOを設定したDTB)を選択します。

=> setenv fdt_file armadillo_x1-ecspi4_user1.dtb
=> saveenv

6.4.通常モード(オートブートモード)で再起動します。

電源を落とします。

図4.8 スライドスイッチの設定 http://manual.atmark-techno.com/armadillo-x1/armadillo-x1_product_manual_ja-1.1.0/ch04.html#sct.about-slide_switch-config を参考にオートブートモード側にスイッチを設定して、電源を入れます。

以上で、拡張I/F(CON8)で、SPIとGPIOが使用できるようになります。

7.SPIの使い方

上記の手順によって、SPI(ECSPI4)は"/dev/spidev3.0"というデバイスファイルとして見えます。 用法については、 Armadillo実践開発ガイド第3部 2.3. SPI接続A/Dコンバーター が参考になります。

補足)上記資料内のサンプルコードを使用する場合、
図2.44 adc_mcp3204をビルドするmakefile

CROSS := arm-linux-gnueabi
の箇所は、
CROSS := arm-linux-gnueabihf
に置き換える必要があります。

8.GPIOの使い方

今回のDeviceTreeで使えるようにしている
 99:GPIO入力(GPIO3_27)
 100:GPIO出力(GPIO3_28)
を使用する場合で説明します。

GPIOを使用するには、該当のGPIO端子を/sys/class/gpio/にexportして制御します。

8.1.exportするgpio番号を算出します。

GPIO sysfsからのGPIO制御に必要な「GPIO番号」は次のように計算できます。
GPIOx_IOyの場合: (x - 1) * 32 + y

GPIO3_27(CON8_99)の場合: (3 - 1) * 32 + 27 = 91
GPIO3_28(CON8_100)の場合: (3 - 1) * 32 + 28 = 92

8.2.gpioをexportします。

root@armadillo:~# cd /sys/class/gpio
root@armadillo:/sys/class/gpio# echo 91 > export
root@armadillo:/sys/class/gpio# echo 92 > export

8.3.gpioの入出力を設定します。(デフォルトは入力になってます。)

99:GPIO入力(GPIO3_27)の場合

root@armadillo:/sys/class/gpio# echo in > gpio91/direction

100:GPIO出力(GPIO3_28)の場合

root@armadillo:/sys/class/gpio# echo out > gpio92/direction

8.4.GPIO入力を確認する方法

99:GPIO入力(GPIO3_27)の場合

root@armadillo:/sys/class/gpio# cat gpio91/value

で確認。

0:Lowレベル
1:Highレベル

8.5.GPIO出力を制御する方法

100:GPIO出力(GPIO3_28)の場合

root@armadillo:/sys/class/gpio# echo 0 > gpio92/value

で、Lowレベル出力。

root@armadillo:/sys/class/gpio# echo 1 > gpio92/value

で、Highレベル出力。

参考)別の端子のSPI(ECSPI3)を使う方法

上記とは別の端子のSPIを使う方法です。 使用するCON8の端子番号と機能の相関は下記のとおりです。

SPI(ECSPI3)
 20:MISO
 21:MOSI
 22:SCLK
 23:SS

linux-3.14-x1-at[version]/arch/arm/boot/dts/ に添付の x1_spi3_gpio_src_20170331.zip 内の
Makefile
armadillo_x1.dts
armadillo_x1-ecspi3_user1.dts
を置きます。

armadillo_x1-ecspi3_user1.dts:
 上述のSPI(ECSPI4)用の
 armadillo_x1-ecspi4_user1.dts
 をSPI(ECSPI3)の端子用に改造したものです。
armadillo_x1.dts
 armadillo_x1-ecspi4_user1.dtsと同じものです。
 標準のarmadillo_x1.dtsについて、
  pinctrl-0 = <&pinctrl_hog_1>;
 を
  pinctrl-0 = <&pinctrl_hog_1 &pinctrl_ext_hog_1>;
 に変更してます。
Makefile
 armadillo_x1-ecspi3_user1.dtsをビルドすることを追加したものです。
 上述のSPI(ECSPI4)用のMakefileについて、
armadillo_x1-ecspi4_user1.dtb \
 の下に
armadillo_x1-ecspi3_user1.dtb \
 を追加しています。

以降は、手順4~手順6の"ecspi4"を"ecspi3"に読み替えてください。
SPI(ECSPI3)は"/dev/spidev2.0"というデバイスファイルとして見えます。