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