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"というデバイスファイルとして見えます。