Armadillo-X1の拡張I/F(CON8)にはCPUのSPIが3系統ありますが、他の機能で使ったりなどで、
SPIが不足した場合に、GPIOをSPI化して代替することが可能です。
ここでは、spi-gpioで下記表のようにCON8のGPIOをSPI化します。
補足)ここでは例として、SPIのデバイスドライバに、spidevを使用する手順になっています。
CON8ピン番号 | GPIO | SPI化時の信号 |
---|---|---|
CON8_34 | GPIO7_IO10 | SCLK |
CON8_35 | GPIO7_IO11 | MISO |
CON8_36 | GPIO7_IO12 | MOSI |
CON8_37 | GPIO7_IO13 | SS0 |
CON8_38 | GPIO7_IO14 | SS1 |
CON8_39 | GPIO7_IO15 | SS2 |
1. カーネルコンフィギュレーション
SPIのデバイスドライバとして、spidevを使用可能に設定します。
カーネルコンフィギュレーションにて、下記の項目が有効になる(*印がついている)ように設定します。
Device Drivers --->
[*] SPI support --->
<*> GPIO-based bitbanging SPI Master
<*> User mode SPI device driver support
2. spidevドライバの変更
linux-4.9-x1-at[vesion]/drivers/spi/spidev.c
の700行目付近のspidev_dt_idsに、
{ .compatible = "my_spidev" }, /* add my_spidev */
を追加します。
変更後のspidev_dt_ids(spidev.cの700行目付近)抜粋
#ifdef CONFIG_OF
static const struct of_device_id spidev_dt_ids[] = {
{ .compatible = "rohm,dh2228fv" },
{ .compatible = "lineartechnology,ltc2488" },
{ .compatible = "my_spidev" }, /* add my_spidev */
{},
};
MODULE_DEVICE_TABLE(of, spidev_dt_ids);
#endif
3. GPIOをSPI化するデバイスツリーの作成
linux-4.9-x1-at[vesion]/arch/arm/boot/dtsディレクトリに
GPIOをSPI化するデバイスツリー(armadillo_x1-spigpio.dts)を、下記の内容で作成します。
armadillo_x1-spigpio.dts
#include "armadillo_x1.dts"
&iomuxc {
x1_ext {
pinctrl_spi_gpio: spi-gpiogrp {
fsl,pins = <
MX7D_PAD_ENET1_RGMII_TX_CTL__GPIO7_IO10 0x70 /* CON8_34 SCLK */
MX7D_PAD_ENET1_RGMII_TXC__GPIO7_IO11 0x70 /* CON8_35 MISO */
MX7D_PAD_ENET1_TX_CLK__GPIO7_IO12 0x70 /* CON8_36 MOSI */
MX7D_PAD_ENET1_RX_CLK__GPIO7_IO13 0x70 /* CON8_37 SS0 */
MX7D_PAD_ENET1_CRS__GPIO7_IO14 0x70 /* CON8_38 SS1 */
MX7D_PAD_ENET1_COL__GPIO7_IO15 0x70 /* CON8_39 SS2 */
>;
};
};
};
/ {
spi_gpio: spi-gpio {
compatible = "spi-gpio";
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_spi_gpio>;
gpio-sck = <&gpio7 10 GPIO_ACTIVE_HIGH>;
gpio-miso = <&gpio7 11 GPIO_ACTIVE_HIGH>;
gpio-mosi = <&gpio7 12 GPIO_ACTIVE_HIGH>;
num-chipselects = <3>;
cs-gpios = <
&gpio7 13 GPIO_ACTIVE_HIGH
&gpio7 14 GPIO_ACTIVE_HIGH
&gpio7 15 GPIO_ACTIVE_HIGH
>;
status = "okay";
#address-cells = <1>;
#size-cells = <0>;
spidev@0 {
compatible = "my_spidev";
reg = <0>;
spi-max-frequency = <1000000>;
};
spidev@1 {
compatible = "my_spidev";
reg = <1>;
spi-max-frequency = <1000000>;
};
spidev@2 {
compatible = "my_spidev";
reg = <2>;
spi-max-frequency = <1000000>;
};
};
};
4. デバイスツリーのMakefileの変更
手順3のarmadillo_x1-spigpio.dtsのデバイスツリーブロブ(armadillo_x1-spigpio.dtb)を生成するために
linux-4.9-x1-at[vesion]/arch/arm/boot/dts/Makefile
の590行目付近に
armadillo_x1-spigpio.dtb \
を追加します。
変更後のMakefileの590行目付近抜粋
armadillo_x1-extboard-eva01-usbdevice.dtb \
armadillo_x1-spigpio.dtb \
x1-minimal.dtb
上記までの変更を実施後、ビルドします。
5. 動作確認
手順4にて、ビルドして生成されたuImageとarmadillo_x1-spigpio.dtbで、
Armadillo-X1のカーネルとデバイスツリーを書き換えます。
root@armadillo:~# mount -t vfat /dev/mmcblk2p1 /mnt
root@armadillo:~# cp uImage /mnt/uImage
root@armadillo:~# cp armadillo_x1-spigpio.dtb /mnt/armadillo_x1.dtb
root@armadillo:~# umount /mnt
Armadillo-X1を再起動します。
SPIのデバイスファイルがあることを確認します。
ここでは、SPIのデバイスドライバにspidevを使用したので下記のように見えます。
root@armadillo:~# ls /dev/spidev*
/dev/spidev32766.0 /dev/spidev32766.1 /dev/spidev32766.2