Armadillo-X1:spi-gpioでGPIOをSPI化する(Linux-4.9版)

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
製品: 
Armadillo-X1