第21章 Howto

本章では、Armadillo-X1 のソフトウェアをカスタマイズをする方法などについて説明します。

21.1. Device Treeとは

Device Treeとは、ハードウェア情報を記述したデータ構造体です。ハードウェアの差分をDevice Treeに記述することによって、1つのLinuxカーネルイメージを複数のハードウェアで利用することができるようになります。

Device Treeに対応しているメリットの1つは、ハードウェアの変更に対するソフトウェアの変更が容易になることです。例えば、拡張インターフェース(CON8)に接続する拡張基板を作成した場合、主にC言語で記述されたLinuxカーネルのソースコードを変更する必要は無く、やりたいことをより直感的に記述できるDTS(Device Tree Source)の変更で対応できます。

ただし、Device Treeは「データ構造体」であるため、ハードウェアの制御方法などの「処理」を記述することができない点に注意してください。Device Treeには、CPUアーキテクチャ、RAMの容量、各種デバイスのベースアドレスや割り込み番号などのハードウェアの構成情報のみが記述されます。

Armadillo-X1でのDevice Treeのカスタマイズ例については、「拡張インターフェースを使う」を参照してください。

Device Treeのより詳細な情報については、Linuxカーネルのソースコードに含まれているドキュメント(Documentation/devicetree/)、devicetree.orgで公開されている「Device Tree Specification」を参照してください。

21.2. イメージをカスタマイズする

コンフィギュレーションを変更してLinuxカーネルイメージをカスタマイズする方法を説明します。

手順21.1 イメージをカスタマイズ

  1. Linuxカーネルアーカイブの展開

    Linuxカーネルのソースコードアーカイブと、initramfsアーカイブを準備し、Linuxカーネルのソースコードアーカイブを展開します。

    [PC ~]$ ls
    initramfs_x1-[version].cpio.gz linux-4.9-x1-at[version].tar.gz
    [PC ~]$ tar xf linux-4.9-x1-at[version].tar.gz
    [PC ~]$ ls
    initramfs_x1-[version].cpio.gz linux-4.9-x1-at[version]  linux-4.9-x1-at[version].tar.gz
  2. initramfsアーカイブへのシンボリックリンク作成

    Linuxカーネルディレクトリに移動して、initramfsアーカイブへのシンボリックリンク作成します。

    [PC ~]$ cd linux-4.9-x1-at[version]
    [PC ~/linux-4.9-x1-at[version]]$ ln -s ../initramfs_x1-[version].cpio.gz initramfs_x1.cpio.gz
  3. コンフィギュレーション

    コンフィギュレーションをします。

    [PC ~/linux-4.9-x1-at[version]]$ make ARCH=arm x1_defconfig
    [PC ~/linux-4.9-x1-at[version]]$ make ARCH=arm menuconfig
  4. カーネルコンフィギュレーションの変更

    カーネルコンフィギュレーションを変更後、"Exit"を選択して「Do you wish to save your new kernel configuration ? <ESC><ESC> to continue.」で"Yes"とし、カーネルコンフィギュレーションを確定します。

     .config - Linux/arm 4.9.107-at1 Kernel Configuration
    ------------------------------------------------------------------------
                  Linux/arm 4.9.107-at1 Kernel Configuration
     Arrow keys navigate the menu.  <Enter> selects submenus ---> (or empty
     submenus ----).  Highlighted letters are hotkeys.  Pressing <Y>  
     includes, <N> excludes, <M> modularizes features.  Press <Esc><Esc> to  
     exit, <?> for Help, </> for Search.  Legend: [*] built-in  [ ]
    ------------------------------------------------------------------------
      
         -*- Patch physical to virtual translations at runtime
             General setup  --->
         [*] Enable loadable module support  --->
         [*] Enable the block layer  --->
             System Type  --->
             Bus support  --->
             Kernel Features  --->
             Boot options  --->
             CPU Power Management  --->
             Floating point emulation  --->
    ------------------------------------------------------------------------
           <Select>    < Exit >    < Help >    < Save >    < Load >
    [ティップ]

    Linux Kernel Configurationメニューで"/"キーを押下すると、カーネルコンフィギュレーションの検索を行うことができます。カーネルコンフィギュレーションのシンボル名(の一部)を入力して"Ok"を選択すると、部分一致するシンボル名を持つカーネルコンフィギュレーションの情報が一覧されます。

  5. ビルド

    ビルドするには、次のようにコマンドを実行します。

    [PC ~/linux-4.9-x1-at[version]]$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
    [PC ~/linux-4.9-x1-at[version]]$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- LOADADDR=0x80008000 uImage
  6. イメージファイルの生成確認

    ビルドが終了すると、arch/arm/boot/ディレクトリとarch/arm/boot/dts/以下に、イメージファイル(LinuxカーネルとDTB)が作成されています。

    [PC ~/linux-4.9-x1-at[version]]$ ls arch/arm/boot/uImage
    uImage
    [PC ~/linux-4.9-x1-at[version]]$ ls arch/arm/boot/dts/armadillo_x1.dtb
    armadillo_x1.dtb

21.3. ルートファイルシステムへの書き込みと電源断からの保護機能

Armadillo-X1のルートファイルシステムは、標準で eMMC に配置されます。 Linux が稼動している間は、ログや、設定ファイル、各種アプリケーション によるファイルへの書き込みが発生します。もし、停電等で終了処理を実行できずに 電源を遮断した場合はRAM上に残ったキャッシュがeMMCに書き込まれずに、 ファイルシステムの破綻やファイルの内容が古いままになる状況が発生します。

また、eMMC内部の NAND Flash Memory には消去回数に上限があるため、書き込み 回数を制限することを検討する必要がある場合もあります。

そこで、Armadillo-X1 では、overlayfs を利用して、eMMCへの書き込み保護を行う機能を提供しています。

21.3.1. 保護機能の使用方法

eMMCへの書き込み保護を使うには、kernelの起動オプションに"overlay=50%" ("=50%" は省略可、"overlay"のみ書くとRAMの50%を使用)というパラメタを追加するだけです。

パラメタを追加すると、debian の起動前に initramfs によってルートファイルシステムが upper=RAMディスク(tmpfs)、 lower=eMMC(ext4)としたoverlayfs に切り替えられて、Debianが起動します。

overlayfs の機能によって、起動後のルートファイルシステムに対する差分は、 全てRAMディスク( /overlay/ramdisk にマウント) に記録されるようになりま す。そのため、起動後の情報は保存されませんが、電源を遮断した場合でも、 eMMCは起動前と変らない状態のまま維持されています。

kernelの起動オプションの指定を行うにはArmadillo-X1を保守モードで起動し、次のようにコマンドを実行してください。

=> setenv optargs overlay
=> saveenv

21.3.2. 保護機能を使用する上での注意事項

[警告]

overlayfs は差分を ファイル単位で管理するため、予想以上にRAMディスクを消費する場合があります。 単に、新しいファイルやディレクトリを作れば、その分RAMディスクが消費されるのは想像に難くないと思います。

しかし、「lower=eMMC に既に存在していたファイルの書き換え」をする場合は、upper=RAMディスク に対象のファイル全体をコピーして書き換え」ます。

具体的に、問題になりそうな例を紹介します。 例えば、sqlite はDB毎に1つのファイルでデータ格納します。ここで、1GBのDBを作ってeMMCに保存した後、 overlayfsによる保護を有効にして起動した後に、たった10バイトのレコードを 追加しただけでRAMディスクは 1GB + 10バイト 消費されます。実際には、 Armadilloに1GBもRAMは無いので、追記を開始した時点でRAMディスクが不足します。

[警告]

overlayfsによる、eMMCへの書き込み保護を行う場合、 必ず実際の運用状態でのテストを行い、RAMディスクが不足しないか確認してください。 動作中に書き込むファイルを必要最小限に留めると共に、追記を行う大きなファイルを作らない実装の検討を行ってください。

[警告]

Armadillo-X1 の eMMC の記録方式は出荷時に SLC に設定しており、MLC 方式の eMMC よりも消去回数の上限が高くなっています。 そのため、開発するシステムの構成によってはeMMCへの書き込み保護機能を必要としない可能性があります。

[警告]

eMMCへの書き込み保護機能を有効にすると、eMMCを安全に使用できるというメリットがありますが、その分、使用できるRAMサイズが減る、システム構成が複雑になる、デメリットもあります。 開発・運用したいシステムの構成、eMMCへの書き込み保護機能のメリット・デメリットを十分に考慮・評価したうえで、保護機能を使用する、しないの判断を行ってください。

21.4. AR9462モジュールを使った無線LANアクセスポイントの構築例

[警告]

W53、W56でのAPモードは、Armadillo-X1本体に工事設計認証の証明ラベル(認証番号: 003-170166、007-AE0269 の2つ)が貼られていない場合は使用できません。

[警告]

W53、W56でのAPモードを使用する場合は、Linuxカーネル linux-3.14-x1-atl16 以降(カーネルイメージ uImage-x1-v16.00 以降)である必要があります。

AR9462モジュールを使った無線LANアクセスポイントの構築方法について説明します。

21.4.1. 無線LANアクセスポイントを構築する

無線LANアクセスポイントの構築例として、hostapdを使用したソフトウェアアクセスポイントの構築手順を紹介します。

手順21.2 無線LANアクセスポイントの構築例

  1. hostapdをインストールする

    [armadillo ~]# apt-get update
    [armadillo ~]# apt-get install hostapd
  2. 無線LANインターフェースをNetworkManagerの管理対象から外す

    無線LANインターフェース(wlan0)をNetworkManagerの管理対象から外します。これはhostapdとの競合を避けるためです。

    /etc/NetworkManager/NetworkManager.confに次の内容を追記します。

    [armadillo ~]# vi /etc/NetworkManager/NetworkManager.conf
    :(省略)
    [keyfile]
    unmanaged-devices=interface-name:wlan0

    NetworkManagerを再起動して設定を有効化します。

    [armadillo ~]# service NetworkManager restart
  3. hostapdの設定ファイルを作成する

    hostapdの設定ファイルを作成します。次のコマンドを実行すると、設定ファイルのサンプルが作成されます。

    [armadillo ~]# zcat /usr/share/doc/hostapd/examples/hostapd.conf.gz > /etc/hostapd/hostapd.conf

    無線設定に応じて/etc/hostapd/hostapd.confを編集します。

    [armadillo ~]# vi /etc/hostapd/hostapd.conf
  4. 規制ドメインを指定する

    規制ドメインを指定し、無線デバイスが使用してよい規制範囲の設定を検索できるようにします。日本で利用するには"JP"を指定します。

    [armadillo ~]# vi /etc/default/crda
    :(省略)
    REGDOMAIN=JP
  5. hostapdの設定ファイルを指定する

    /etc/default/hostapdにhostapdの設定ファイルを指定します。ここで指定した設定ファイルはhostapdの自動起動時に読み込まれます。

    [armadillo ~]# vi /etc/default/hostapd
    :(省略)
    DAEMON_CONF="/etc/hostapd/hostapd.conf"
  6. hostapdを起動する

    次のコマンドを実行するとhostapdが起動します。Armadillo-X1を再起動した場合は自動的に起動します。

    [armadillo ~]# service hostapd restart

21.4.2. ネットワークブリッジを作成する

ネットワークブリッジの作成例として、無線LANインターフェースと優先LANインターフェースのブリッジを作成手順を紹介します。

事前に「無線LANアクセスポイントを構築する」を参照して、無線LANアクセスポイントを構築してください。

手順21.3 ネットワークブリッジの作成例

  1. 有線LANインターフェースをNetworkManagerの管理対象から外す

    有線LANインターフェース(eth0)をNetworkManagerの管理対象から外します。

    /etc/NetworkManager/NetworkManager.confを次のように変更します。

    [armadillo ~]# vi /etc/NetworkManager/NetworkManager.conf
    :(省略)
    [keyfile]
    unmanaged-devices=interface-name:wlan0;interface-name:eth0

    NetworkManagerを再起動して設定を有効化します。

    [armadillo ~]# service NetworkManager restart
  2. ネットワークブリッジを作成する

    次のようにネットワークブリッジを作成します。

    [armadillo ~]# ip link add br0 type bridge  1
    [armadillo ~]# ip link set br0 up  2
    [armadillo ~]# ip link set dev eth0 promisc on  3
    [armadillo ~]# ip link set eth0 up  4
    [armadillo ~]# ip link set dev wlan0 promisc on  5
    [armadillo ~]# ip link set wlan0 up  6
    [armadillo ~]# ip link set dev eth0 master br0  7
    [armadillo ~]# ip link set dev wlan0 master br0  8
    [armadillo ~]# ip addr add 192.0.2.10/24 dev br0  9

    1

    br0という名前でブリッジインターフェースを作成します。

    2

    ブリッジインターフェースを活動状態にします。

    3

    有線LANのプロミスキャスモードを有効化します。

    4

    有線LANインターフェースを活動状態にします。

    5

    無線LANのプロミスキャスモードを有効化します。

    6

    無線LANインターフェースを活動状態にします。

    7

    有線LANインターフェースをブリッジに追加します。

    8

    無線LANインターフェースをブリッジに追加します。

    9

    ブリッジインターフェースのIPアドレスを設定します。この例ではIPアドレスを"192.0.2.10"に、マスク長を24bitに設定しています。

21.4.3. hostapd設定ファイルの作成

hostapd設定ファイルのいくつかのサンプルを紹介します。

2.4GHz帯設定サンプルを図21.1「hostapd設定ファイルサンプル(2.4GHz)」に、5GHz帯設定サンプルを図21.2「hostapd設定ファイルサンプル(5GHz)」に示します。

より高度な設定項目や設定の詳細については、/usr/share/doc/hostapd/examples/hostapd.conf.gzを参照してください。

interface=wlan0  1
driver=nl80211  2
ssid=testssid  3
hw_mode=g  4
channel=1  5
ieee80211n=1  6
wpa=2  7
wpa_passphrase=testpassphrase  8
wpa_key_mgmt=WPA-PSK  9
rsn_pairwise=CCMP  10

1

ネットワークインターフェースを指定します。

2

デバイスドライバのインターフェースタイプを指定します。AR9462を利用する場合は必ず"nl80211"を指定します。

3

ESSIDを指定します。ここでは"testssid"を指定しています。

4

動作モードを指定します。ここではIEEE 802.11gを示す"g"を指定しています。

5

チャンネル番号を指定します。1〜13チャンネルが利用可能で、ここでは"1"を指定しています。

6

IEEE 802.11n(HT)の有効/無効を指定します。ここでは有効を示す"1"を指定しています。

7

WPAの有効/無効を指定します。ここではWPA2のみ有効を示す"2"を指定しています。

8

WPA事前共有鍵を指定します。ここでは"testpassphrase"を指定しています。

9

鍵管理アルゴリズムを指定します。ここでは"WPA-PSK"を指定しています。

10

RSN/WPA2の共有鍵暗号化方式を指定します。ここでは"CCMP"を指定しています。

図21.1 hostapd設定ファイルサンプル(2.4GHz)


interface=wlan0  1
driver=nl80211  2
ssid=testssid  3
country_code=JP  4
ieee80211d=1  5
ieee80211h=1  6
hw_mode=a  7
channel=52  8
ieee80211n=1  9
ht_capab=[HT40+][SHORT-GI-40][RX-STBC1]  10
wpa=2  11
wpa_passphrase=testpassphrase  12
wpa_key_mgmt=WPA-PSK  13
rsn_pairwise=CCMP  14

1

ネットワークインターフェースを指定します。

2

デバイスドライバのインターフェースタイプを指定します。AR9462を利用する場合は必ず"nl80211"を指定します。

3

ESSIDを指定します。ここでは"testssid"を指定しています。

4

国名コードを指定します。ここでは日本を示す"JP"を指定しています。

5

IEEE 802.11dの有効/無効を指定します。ここでは有効を示す"1"を指定しています。

6

IEEE 802.11hの有効/無効を指定します。ここでは有効を示す"1"を指定しています。W53またはW56のチャンネルを利用する場合は有効化する必要があります。

7

動作モードを指定します。ここではIEEE 802.11aを示す"a"を指定しています。

8

チャンネル番号を指定します。W52、W53およびW56のチャンネルが利用可能で、ここではW53の52チャンネルを示す"52"を指定しています。

9

IEEE 802.11n(HT)の有効/無効を指定します。ここでは有効を示す"1"を指定しています。

10

拡張設定を指定します。ここでは、チャンネルボンディング有効化("HT40+")、ショートガードインターバル("SHORT-GI-40")、MIMO有効("RX-STBC1")を指定しています。

11

WPAの有効/無効を指定します。ここではWPA2のみ有効を示す"2"を指定しています。

12

WPA事前共有鍵を指定します。ここでは"testpassphrase"を指定しています。

13

鍵管理アルゴリズムを指定します。ここでは"WPA-PSK"を指定しています。

14

RSN/WPA2の共有鍵暗号化方式を指定します。ここでは"CCMP"を指定しています。

図21.2 hostapd設定ファイルサンプル(5GHz)


21.5. AR9462モジュールを使って2.4GHz帯で通信する使用例

2つの機器をサンプルにAR9462モジュールを使って2.4GHz帯で通信するときの使い方について説明します。

21.5.1. 「BVMCN1101AA」の信号を受信する

Braveridge社製のビーコン「BVMCN1101AA」を例にビーコン信号を受信する方法を説明します。

「BVMCN1101AA」のアドバタイジング・パケットを受信するためには、bluetoothctlコマンドを使います。 [bluetooth]のプロンプトが表示されたら、scan onで信号を受信できます。 ご利用の環境によっては、ほかの機器からの信号も受信されます。

[armadillo ~]# bluetoothctl
[NEW] Controller [AA:AA:AA:AA:AA:AA] armadillo [default]
[bluetooth]# scan on
Discovery started
[CHG] Controller [AA:AA:AA:AA:AA:AA] Discovering: yes
[NEW] Device [BB:BB:BB:BB:BB:BB] BBAAEdit
[CHG] Device [BB:BB:BB:BB:BB:BB] RSSI: -67
[CHG] Device [BB:BB:BB:BB:BB:BB] RSSI: -72

スキャンを中止するには、scan offを実行します。

[bluetooth]# scan off
Discovery stopped
[CHG] Controller [AA:AA:AA:AA:AA:AA] Discovering: no

bluetoothctlを終了するには、exitを実行します。

[bluetooth]# exit

21.5.2. 「CC2650」を操作する

外部のセンサーからデータを取得する例として、TEXAS INSTRUMENTS社製のセンサータグ「CC2650」を例にセンサータグをgatttoolで操作する方法を説明します。

手順21.4 「CC2650」の操作手順

  1. hcitool lescanを実行して、「CC2650」のMACアドレスを確認します。 ご利用の環境によっては、他の機器も検出されます。

    [armadillo ~]# hcitool lescan
    LE Scan ...
    [CC:CC:CC:CC:CC:CC] (unknown)
    [CC:CC:CC:CC:CC:CC] CC2650 SensorTag # <- このMACアドレスを確認します。
  2. 「CC2650」に接続します。切断するには、Ctrl+c を入力してください。

    [armadillo ~]# gatttool -b [CC:CC:CC:CC:CC:CC] -I
    [[CC:CC:CC:CC:CC:CC]][LE]> connect
    Attempting to connect to [CC:CC:CC:CC:CC:CC]
    Connection successful
  3. プライマリサービスを確認するには、primaryを実行します。

    [[CC:CC:CC:CC:CC:CC]][LE]> primary
    attr handle: 0x0001, end grp handle: 0x0007 uuid: 00001800-0000-1000-8000-00805f9b34fb
    attr handle: 0x0008, end grp handle: 0x000b uuid: 00001801-0000-1000-8000-00805f9b34fb
    attr handle: 0x000c, end grp handle: 0x001e uuid: 0000180a-0000-1000-8000-00805f9b34fb
    attr handle: 0x001f, end grp handle: 0x0026 uuid: f000aa00-0451-4000-b000-000000000000
    attr handle: 0x0027, end grp handle: 0x002e uuid: f000aa20-0451-4000-b000-000000000000
    attr handle: 0x002f, end grp handle: 0x0036 uuid: f000aa40-0451-4000-b000-000000000000
    attr handle: 0x0037, end grp handle: 0x003e uuid: f000aa80-0451-4000-b000-000000000000
    attr handle: 0x003f, end grp handle: 0x0046 uuid: f000aa70-0451-4000-b000-000000000000
    attr handle: 0x0047, end grp handle: 0x004b uuid: 0000ffe0-0000-1000-8000-00805f9b34fb
    attr handle: 0x004c, end grp handle: 0x0050 uuid: f000aa64-0451-4000-b000-000000000000  # <- ここを詳しく調べます
    attr handle: 0x0051, end grp handle: 0x0058 uuid: f000ac00-0451-4000-b000-000000000000
    attr handle: 0x0059, end grp handle: 0x0060 uuid: f000ccc0-0451-4000-b000-000000000000
    attr handle: 0x0061, end grp handle: 0xffff uuid: f000ffc0-0451-4000-b000-000000000000
  4. 0x004c~0x0050でハンドルされているプロファイルのUUIDを確認するには、char-descを実行します。

    [[CC:CC:CC:CC:CC:CC]][LE]> char-desc 4c 50
    handle: 0x004c, uuid: 00002800-0000-1000-8000-00805f9b34fb
    handle: 0x004d, uuid: 00002803-0000-1000-8000-00805f9b34fb
    handle: 0x004e, uuid: f000aa65-0451-4000-b000-000000000000
    handle: 0x004f, uuid: 00002803-0000-1000-8000-00805f9b34fb
    handle: 0x0050, uuid: f000aa66-0451-4000-b000-000000000000
  5. プロファイルの情報を読み取るには、char-read-hndを実行します。

    [[CC:CC:CC:CC:CC:CC]][LE]> char-read-hnd 50
    Characteristic value/descriptor: 00
  6. プロファイルの情報を設定するには、char-write-cmdを実行します。

    [[CC:CC:CC:CC:CC:CC]][LE]> char-write-cmd 50 01 # <- 「CC2650」のブザーが鳴り、LEDが光ります
    [[CC:CC:CC:CC:CC:CC]][LE]> char-write-cmd 50 01 # <- 「CC2650」のブザーが止まり、LEDが消えます
  7. 操作を終了するには、exitを実行します。

    [[CC:CC:CC:CC:CC:CC]][LE]> exit

21.6. sshでArmadillo-X1に接続する

  1. ssh-serverをインストールする

    [armadillo ~]# apt-get update
    [armadillo ~]# apt-get install -y ssh
  2. sshでrootのログインを禁止する

    /etc/ssh/sshd_config内のPermitRootLogin をnoに設定します。

    [armadillo ~]# vi /etc/ssh/sshd_config
    ...
    # Authentication:
    LoginGraceTime 120
    PermitRootLogin without-password  # -> no に変更
    StrictModes yes
    ...

21.7. 拡張インターフェースを使う

拡張インターフェース(CON8)の使用例を説明します。

拡張インターフェースは、用途によって機能を選択できるように複数の機能が割り当てられたピンが接続されています。Ethernet、USB、SPI、GPIOなどに使用可能な信号やパワーマネジメントICのON/OFF用信号などが接続されています。

ここでは、拡張インターフェースのハードウェア構成例と、対応するDevice Treeを示します。

21.7.1. Ethernet

拡張インターフェースのEthernetの使用例を説明します。

例として、Ethernet PHYにはMicrosemi製VSC8501XML-03を使います。これはArmadillo-X1本体に搭載されているものと同じです。

拡張インターフェースのEthernetを使うためには、Device Treeとブートローダーをカスタマイズする必要があります。VSC8501のドライバは工場出荷イメージで有効になっているため、Linuxカーネルイメージのカスタマイズは不要です。

21.7.1.1. ハードウェア構成

ブロック図を図21.3「拡張インターフェースEthernetブロック図」に、信号配列を表21.1「拡張インターフェースEthernet信号配列」に示します。

拡張インターフェースEthernetブロック図

図21.3 拡張インターフェースEthernetブロック図


表21.1 拡張インターフェースEthernet信号配列

CON8ピン番号信号名I/O説明
24RD0In

受信データ0

i.MX 7DualのENET1_RGMII_RD0ピンに接続

25RD1In

受信データ1

i.MX 7DualのENET1_RGMII_RD1ピンに接続

26RD2In

受信データ2

i.MX 7DualのENET1_RGMII_RD2ピンに接続

27RD3In

受信データ3

i.MX 7DualのENET1_RGMII_RD3ピンに接続

28RX_CTLIn

受信制御

i.MX 7DualのENET1_RGMII_RX_CTLピンに接続

29RXCIn

受信クロック

i.MX 7DualのENET1_RGMII_RXCピンに接続

30TD0Out

送信データ0

i.MX 7DualのENET1_RGMII_TD0ピンに接続

31TD1Out

送信データ1

i.MX 7DualのENET1_RGMII_TD1ピンに接続

32TD2Out

送信データ2

i.MX 7DualのENET1_RGMII_TD2ピンに接続

33TD3Out

送信データ3

i.MX 7DualのENET1_RGMII_TD3ピンに接続

34TX_CTLOut

送信制御

i.MX 7DualのENET1_RGMII_TX_CTLピンに接続

35TXCOut

送信クロック

i.MX 7DualのENET1_RGMII_TXCピンに接続

36GPIO7_IO12In

VSC8501のMDINTピンに接続

i.MX 7DualのENET1_TX_CLKピンに接続

37GPIO7_IO13Out

VSC8501のNRESETピンに接続

i.MX 7DualのENET1_RX_CLKピンに接続

38GPIO7_IO14Out

VSC8501のCOMA_MODEピンに接続

i.MX 7DualのENET1_CRSピンに接続

69MDCOut

MDIOクロック

i.MX 7DualのENET1_MDCピンに接続

70MDIOIn/Out

MDIOデータ

i.MX 7DualのENET1_MDIOピンに接続


21.7.1.2. Device Treeのカスタマイズ

拡張インターフェースのEthernetインターフェースを有効化したDTS(Device Tree Source)を用意します。「ハードウェア構成」に合わせて作成されたサンプルは、Linuxカーネルのソースコードのarch/arm/boot/dts/armadillo_x1-fec1.dtsです。

[ティップ]

DTSではMDINTピンなどのVSC8501制御信号が定義されていますが、Linuxカーネルのドライバからはアクセスしません。GPIOクラスディレクトリなどからアクセスされないようにする目的で定義しています。

DTSをビルドしてDTB(Device Tree Blob)を生成します。「Linuxカーネルをビルドする」に従ってビルドすると、arch/arm/boot/dts/armadillo_x1-fec1.dtbが生成されます。

生成したDTB(Device Tree Blob)をeMMCにインストールする方法を次に示します。

[armadillo ~]# mount -t vfat /dev/mmcblk2p1 /mnt  1
[armadillo ~]# cp armadillo_x1-fec1.dtb /mnt/  2
[armadillo ~]# umount /mnt  3

1

eMMCの第1パーティションを/mnt/ディレクトリにマウントします。

2

DTBを/mnt/ディレクトリにコピーします。

3

/mnt/ディレクトリにマウントしたeMMCの第1パーティションをアンマウントします。

21.7.1.3. ブートローダーのカスタマイズ

VSC8501の初期化はブートローダーが行います。工場出荷イメージでは拡張インターフェースに接続されたVSC8501の初期化に対応していないため、カスタマイズが必要です。

次に示す手順で、U-Bootのビルドを行い、VSC8501の初期化に対応したブートローダーイメージを生成します。

手順21.5 VSC8501の初期化に対応したブートローダーイメージの生成

  1. ソースコードの準備

    U-Bootのソースコードアーカイブを準備し展開します。

    [PC ~]$ ls
    uboot_2016.07-at[version].tar.gz
    [PC ~]$ tar xf uboot_2016.07-at[version].tar.gz
    [PC ~]$ ls
    uboot_2016.07-at[version]  uboot_2016.07-at[version].tar.gz
  2. コンフィギュレーションの適用

    [PC ~]$ cd uboot_2016.07-at[version]
    [PC ~/uboot_2016.07-at[version]]$ make ARCH=arm x1_fec1_en_config
  3. ビルド

    ビルドにはmakeコマンドを利用します。

    [PC ~/uboot_2016.07-at[version]]$ make CROSS_COMPILE=arm-linux-gnueabihf-
  4. イメージファイルの生成確認

    ビルドが終了すると、U-Bootディレクトリにイメージファイルが作成されています。

    [PC ~/uboot_2016.07-at[version]]$ ls u-boot-x1.bin
    u-boot-x1.bin

生成したブートローダーイメージをQSPIフラッシュメモリにインストールする方法を次に示します。

[armadillo ~]# dd if=u-boot-x1.bin of=/dev/mtdblock0 1
282+1 records in
282+1 records out
288816 bytes (289 kB) copied, 5.4582 s, 52.9 kB/s
[armadillo ~]$ sync

1

MTDのブロックデバイスの先頭からブートローダーイメージを書き込みます。

21.7.1.4. 動作確認

まず、「Device Treeのカスタマイズ」でインストールしたDTBで起動するために、保守モードで次のようにコマンドを実行します。

=> setenv fdt_file armadillo_x1-fec1.dtb
=> saveenv
[ティップ]

DTBの指定を出荷状態に戻すには、次のようにコマンドを実行します。

=> setenv fdt_file armadillo_x1.dtb
=> saveenv

正しくDTBの指定ができた場合は、起動ログに次のような内容が表示されます。

GPIO line 204 (VSC8501_MDINT) hogged as input
GPIO line 205 (VSC8501_NRESET) hogged as output/high
GPIO line 206 (VSC8501_COMA_MODE) hogged as output/low
:(省略)
fec 30be0000.ethernet eth0: registered PHC device 0

拡張インターフェースのEthernetインターフェースのネットワークデバイス名はeth0です。「ネットワーク」を参照してネットワーク設定を行ってください。

[ティップ]

Armadillo-X1本体のEthernetインターフェースのネットワークデバイス名はeth1に変更されます。

[ティップ]

MACアドレスは、出荷時に割り当て済みです。

21.7.2. USB OTG

拡張インターフェースのUSB OTG(On-the-Go)の使用例を説明します。

拡張インターフェースのUSB OTGを使うためには、Device Treeをカスタマイズする必要があります。

21.7.2.1. ハードウェア構成

ブロック図を図21.4「拡張インターフェースUSB OTGブロック図」に、信号配列を表21.2「拡張インターフェースUSB OTG信号配列」に示します。

拡張インターフェースUSB OTGブロック図

図21.4 拡張インターフェースUSB OTGブロック図


表21.2 拡張インターフェースUSB OTG信号配列

CON8ピン番号信号名I/O説明
47DPIn/Out

USBプラス側信号

i.MX 7DualのUSB_OTG2_DPピンに接続

48DNIn/Out

USBマイナス側信号

i.MX 7DualのUSB_OTG2_DNピンに接続

50VBUSIn

VBUS監視

i.MX 7DualのUSB_OTG2_VBUSピンに接続

68IDIn

ID信号

i.MX 7DualのSD2_RESET_Bピンに接続

100GPIO3_IO28Out

TPS2065のENピンに接続

i.MX 7DualのLCD_DAT23ピンに接続


21.7.2.2. Device Treeのカスタマイズ

拡張インターフェースのUSB OTGインターフェースを有効化したDTS(Device Tree Source)を用意します。「ハードウェア構成」に合わせて作成されたサンプルは、Linuxカーネルのソースコードのarch/arm/boot/dts/armadillo_x1-usbotg2.dtsです。

DTSをビルドしてDTB(Device Tree Blob)を生成します。「Linuxカーネルをビルドする」に従ってビルドすると、arch/arm/boot/dts/armadillo_x1-usbotg2.dtbが生成されます。

生成したDTB(Device Tree Blob)をeMMCにインストールする方法を次に示します。

[armadillo ~]# mount -t vfat /dev/mmcblk2p1 /mnt  1
[armadillo ~]# cp armadillo_x1-usbotg2.dtb /mnt/  2
[armadillo ~]# umount /mnt  3

1

eMMCの第1パーティションを/mnt/ディレクトリにマウントします。

2

DTBを/mnt/ディレクトリにコピーします。

3

/mnt/ディレクトリにマウントしたeMMCの第1パーティションをアンマウントします。

21.7.2.3. 動作確認

まず、「Device Treeのカスタマイズ」でインストールしたDTBで起動するために、保守モードで次のようにコマンドを実行します。

=> setenv fdt_file armadillo_x1-usbotg2.dtb
=> saveenv
[ティップ]

DTBの指定を出荷状態に戻すには、次のようにコマンドを実行します。

=> setenv fdt_file armadillo_x1.dtb
=> saveenv

正しくDTBの指定ができた場合は、起動ログに次のような内容が表示されます。

ci_hdrc ci_hdrc.2: Device No Response
:(省略)
USB_OTG2_VBUS: 5000 mV

ArmadilloにBプラグが接続された場合はUSBホストとして動作します。例としてUSBフラッシュメモリが接続された場合の使用方法については「ストレージ」を参照してください。

ArmadilloにAプラグが接続された場合はUSBデバイスとして動作します。工場出荷イメージで有効になっているガジェットドライバは、CDC Composite Device(Ethernet and ACM)です。ネットワークデバイス名はusb0、TTYデバイスファイル名は/dev/ttyGS0です。

21.7.3. I2C

拡張インターフェースのI2Cの使用例を説明します。

例として、I2CデバイスにはNXPセミコンダクターズ製の温度センサ(LM75B)を使います。

拡張インターフェースのI2Cを使うためには、Device Treeをカスタマイズする必要があります。LM75B のドライバは工場出荷イメージで有効になっているため、Linux カーネルイメージのカスタマイズは不要です。

21.7.3.1. ハードウェア構成

ブロック図を図21.5「拡張インターフェースI2Cブロック図」に、信号配列を表21.3「拡張インターフェースI2C信号配列」に示します。

拡張インターフェースI2Cブロック図

図21.5 拡張インターフェースI2Cブロック図


表21.3 拡張インターフェースI2C信号配列

CON8ピン番号信号名I/O説明
20SCLIn/Out

I2Cクロック

i.MX 7DualのI2C1_SCLピンに接続

21SDAIn/Out

I2Cデータ

i.MX 7DualのI2C1_SDAピンに接続


21.7.3.2. Device Treeのカスタマイズ

拡張インターフェースのI2C1インターフェースを有効化したDTS(Device Tree Source)を用意します。「ハードウェア構成」に合わせて作成されたサンプルは、Linuxカーネルのソースコードのarch/arm/boot/dts/armadillo_x1-i2c1_lm75b.dtsです。

DTSをビルドしてDTB(Device Tree Blob)を生成します。「Linuxカーネルをビルドする」に従ってビルドすると、arch/arm/boot/dts/armadillo_x1-i2c1_lm75b.dtbが生成されます。

生成したDTB(Device Tree Blob)をeMMCにインストールする方法を次に示します。

[armadillo ~]# mount -t vfat /dev/mmcblk2p1 /mnt  1
[armadillo ~]# cp armadillo_x1-i2c1_lm75b.dtb /mnt/  2
[armadillo ~]# umount /mnt  3

1

eMMCの第1パーティションを/mnt/ディレクトリにマウントします。

2

DTBを/mnt/ディレクトリにコピーします。

3

/mnt/ディレクトリにマウントしたeMMCの第1パーティションをアンマウントします。

21.7.3.3. 動作確認

まず、「Device Treeのカスタマイズ」でインストールしたDTBで起動するために、保守モードで次のようにコマンドを実行します。

=> setenv fdt_file armadillo_x1-i2c1_lm75b.dtb
=> saveenv
[ティップ]

DTBの指定を出荷状態に戻すには、次のようにコマンドを実行します。

=> setenv fdt_file armadillo_x1.dtb
=> saveenv

正しくDTBの指定ができた場合は、起動ログに次のような内容が表示されます。

i2c i2c-0: IMX I2C adapter registered
:(省略)
lm75 0-0048: hwmon0: sensor 'lm75b'

/sys/class/i2c-adapter/i2c-0/0-0048/temp1_inputファイルの値を読み出すことによって、温度を取得することができます。

[armadillo ~]# cat /sys/class/i2c-adapter/i2c-0/0-0048/temp1_input
25000 1

1

温度はミリ°C の単位で表示されます。この例では 25°C を示しています。

21.7.4. SPI

拡張インターフェースのSPIの使用例を説明します。

例として、SPIデバイスにはMicrochip製ADコンバーター(MCP3202)を使います。

拡張インターフェースのSPIを使うためには、Device Treeをカスタマイズする必要があります。MCP3202 のドライバは工場出荷イメージで有効になっているため、Linux カーネルイメージのカスタマイズは不要です。

21.7.4.1. ハードウェア構成

ブロック図を図21.6「拡張インターフェースSPIブロック図」に、信号配列を表21.4「拡張インターフェースSPI信号配列」に示します。

拡張インターフェースSPIブロック図

図21.6 拡張インターフェースSPIブロック図


表21.4 拡張インターフェースSPI信号配列

CON8ピン番号信号名I/O説明
72MISOIn

マスター入力/スレーブ出力

i.MX 7DualのLCD_CLKピンに接続

73MOSIOut

マスター出力/スレーブ入力

i.MX 7DualのLCD_ENABLEピンに接続

74SCLKOut

シリアルクロック

i.MX 7DualのLCD_HSYNCピンに接続

75GPIO3_IO3Out

スレーブセレクト

i.MX 7DualのLCD_VSYNCピンに接続


21.7.4.2. Device Treeのカスタマイズ

拡張インターフェースのECSPI4インターフェースを有効化したDTS(Device Tree Source)を用意します。「ハードウェア構成」に合わせて作成されたサンプルは、Linuxカーネルのソースコードのarch/arm/boot/dts/armadillo_x1-ecspi4_mcp3202.dtsです。

DTSをビルドしてDTB(Device Tree Blob)を生成します。「Linuxカーネルをビルドする」に従ってビルドすると、arch/arm/boot/dts/armadillo_x1-ecspi4_mcp3202.dtbが生成されます。

生成したDTB(Device Tree Blob)をeMMCにインストールする方法を次に示します。

[armadillo ~]# mount -t vfat /dev/mmcblk2p1 /mnt  1
[armadillo ~]# cp armadillo_x1-ecspi4_mcp3202.dtb /mnt/  2
[armadillo ~]# umount /mnt  3

1

eMMCの第1パーティションを/mnt/ディレクトリにマウントします。

2

DTBを/mnt/ディレクトリにコピーします。

3

/mnt/ディレクトリにマウントしたeMMCの第1パーティションをアンマウントします。

21.7.4.3. 動作確認

まず、「Device Treeのカスタマイズ」でインストールしたDTBで起動するために、保守モードで次のようにコマンドを実行します。

=> setenv fdt_file armadillo_x1-ecspi4_mcp3202.dtb
=> saveenv
[ティップ]

DTBの指定を出荷状態に戻すには、次のようにコマンドを実行します。

=> setenv fdt_file armadillo_x1.dtb
=> saveenv

正しくDTBの指定ができた場合は、起動ログに次のような内容が表示されます。

MCP3202_VREF: 5000 mV
:(省略)
spi_imx 30630000.ecspi: probed

/sys/bus/iio/devices/iio:device1/ディレクトリ以下にあるファイルの値を読み出すことによって、入力電圧を算出することができます。

ファイル説明
in_voltage0_rawシングルエンド入力 CH0のAD変換値
in_voltage1_rawシングルエンド入力 CH1のAD変換値
in_voltage_scaleシングルエンド入力の最小入力電圧変動
in_voltage0-voltage1_raw疑似差動入力のAD変換値
in_voltage-voltage_scale疑似差動入力の最小入力電圧変動

シングルエンド入力 CH0への入力電圧を算出する例を次に示します。

[armadillo ~]# cat /sys/bus/iio/devices/iio:device1/in_voltage0_raw
2048
[armadillo ~]# cat /sys/bus/iio/devices/iio:device1/in_voltage_scale
1.220703125

この例では、シングルエンド入力 CH0への入力電圧は、2.5V (2048 × 1.220703125 [mV])である事がわかります。

[ティップ]

awkコマンドを利用して、次のように電源電圧を表示することができます。

[armadillo ~]# adin_raw=`cat /sys/bus/iio/devices/iio:device1/in_voltage0_raw`
[armadillo ~]# adin_scale=`cat /sys/bus/iio/devices/iio:device1/in_voltage_scale`
[armadillo ~]# echo $adin_raw $adin_scale | awk '{printf ("%d",$1*$2)}'
2500

21.8. Armadillo-X1 評価用拡張ボードを使用する

Armadillo-X1 評価用拡張ボードを使用するために必用なソフトウェアのインストール方法と、各デバイスの動作確認方法を説明します。

21.8.1. ソフトウェアのインストール

Armadillo-X1 評価用拡張ボードを使用するために必要なカーネル、DTB(Device Tree Blob)およびブートローダーをインストールする手順を示します。

21.8.1.1. Linuxカーネルのインストール

LinuxカーネルイメージをeMMCにインストールする手順を次に示します。

[armadillo ~]# mount /dev/mmcblk2p1 /mnt
[armadillo ~]# cp uImage-x1-[version] /mnt/uImage
[armadillo ~]# umount /mnt

21.8.1.2. DTB(Device Tree Blob)のインストール

DTB(Device Tree Blob)をインストールする手順について説明します。Armadillo-X1 評価用拡張ボードに対応するDTBを次に示します。

表21.5 Armadillo-X1 評価用拡張ボード対応DTB

ファイル名備考
armadillo_x1-extboard-eva01-usbhost.dtbUSBホスト用
armadillo_x1-extboard-eva01-usbdevice.dtbUSBデバイス用

[注記]

Armadillo-X1 評価用拡張ボードはハードウェアの性質上、USBインターフェースをUSBホストとして使用する場合と、USBデバイスとして使用する場合とで、使用するDTBが分かれています。目的に合わせてDTBを選択してください。

DTBをeMMCにインストールする手順を次に示します。

[armadillo ~]# mount /dev/mmcblk2p1 /mnt
[armadillo ~]# cp armadillo_x1-extboard-eva01-usbhost-[version].dtb /mnt/armadillo_x1-extboard-eva01-usbhost.dtb
[armadillo ~]# cp armadillo_x1-extboard-eva01-usbdevice-[version].dtb /mnt/armadillo_x1-extboard-eva01-usbdevice.dtb
[armadillo ~]# umount /mnt

21.8.1.3. ブートローダーのインストール

ブートローダーをインストールする手順について説明します。Armadillo-X1 評価用拡張ボードに対応するブートローダーイメージを次に示します。

表21.6 Armadillo-X1 評価用拡張ボード対応ブートローダーイメージ

ファイル名コンフィグ名 
u-boot-x1-fec1-en-[version].binx1_fec1_en_config 

評価用拡張ボード対応ブートローダーをインストールするには、次のようにコマンドを実行します。

[armadillo ~]$ x1-bootloader-install u-boot-x1-[version].bin
Erasing /dev/mmcblk2boot0....done
Writing u-boot-x1.bin to /dev/mmcblk2boot0....done

ブートローダーのインストールが完了したら、対応するDTBで起動するよう指定します。保守モードで起動し、次のようにコマンドを実行します。

=> setenv fdt_file armadillo_x1-extboard-eva01-usbhost.dtb
=> saveenv

以降、setenvコマンドで指定したDTBを使って起動するようになります。

[ティップ]

DTBの指定を出荷状態に戻すには、次のようにコマンドを実行します。

=> setenv fdt_file armadillo_x1.dtb
=> saveenv
[注記]

Armadillo-X1 評価用拡張ボードに対応するブートローダーイメージのビルドは、表21.6「Armadillo-X1 評価用拡張ボード対応ブートローダーイメージ」のコンフィグ名を使用し、「ブートローダーをビルドする」を参照して行ってください。また、ソースコードのバージョンはuboot_2016.07-at17以降が対応しています。

21.8.2. 動作確認方法

各デバイスの動作確認方法を説明します。

21.8.2.1. 有線LAN

Armadillo-X1 評価用拡張ボードの有線LANインターフェースのネットワークデバイス名を次に示します。

表21.7 有線LANインターフェースに対応するネットワークデバイス名

有線LANインターフェースネットワークデバイス名
Armadillo-X1 CON1eth1
評価用拡張ボード CON4eth0

[ティップ]

ネットワークデバイス名を永続化するudev rule(/etc/udev/rules.d/70-persistent-net.rules)が存在しない場合に、Armadillo-X1本体の有線LANインターフェースのネットワークデバイス名がeth1に変更されます。

udev ruleで既にArmadillo-X1本体のネットワークデバイス名がeth0に設定されている場合は変更されません。

「ネットワーク」を参照してネットワークの設定を行ったあとに、有線LANで正常に通信が可能か確認します。同じネットワーク内にある「192.0.2.20」というIPアドレスの通信機器とPING通信を行う例を次に示します。

[armadillo ~]# ping 192.0.2.20
[注記]

評価用拡張ボードのLANインターフェース以外のコネクションが有効化されている場合、ネットワーク通信に他のインターフェースが使用される場合があります。確実に接続確認をする場合は、事前に評価用拡張ボードのLANインターフェース以外のコネクションを無効化してください。

21.8.2.2. SD

Armadillo-X1 評価用拡張ボードのSDインターフェース(CON3)にmicroSDカードを接続すると、/dev/mmcblk1としてデバイスファイルが生成されます。

[armadillo ~]# ls /dev/mmcblk1*
/dev/mmcblk1  /dev/mmcblk1p1
[ティップ]

ストレージの詳しい使用方法については、「ストレージ」を参照してください。

21.8.2.3. USB

Armadillo-X1 評価用拡張ボードのUSBインターフェース(CON6)は、使用する評価用拡張ボード対応DTBによって機能が変化します。

USBホストとして起動した場合、microUSB接続のフラッシュメモリやハードディスク等を使用することができます。例えばUSBフラッシュメモリを接続した場合は、/dev/sd*としてデバイスファイルが生成されます。

[armadillo ~]# ls /dev/sd*
/dev/sda  /dev/sda1
[ティップ]

ストレージの詳しい使用方法については、「ストレージ」を参照してください。

USBデバイスとして起動した場合、デフォルトでは「CDC Composite Gadget」が有効になっています。例として、「CDC-ACM(USB Communication Device Class Abstract Control Model)」としての使い方を示します。

USBケーブルでATDEと接続します。Armadillo-X1で/dev/ttyGS0catした状態で、ATDEで"sample"という文字列を/dev/ttyACM0に書き込むと、Armadillo-X1のコンソール上に"sample"という文字列が表示されます。

[armadillo ~]# cat /dev/ttyGS0

[ATDE ~]# echo sample > /dev/ttyACM0

21.8.2.4. LCD

Armadillo-X1 評価用拡張ボードに接続されたLCDとタッチパネルの動作確認のため、Qt5のサンプルアプリケーションを利用します。次に示すコマンドでサンプルアプリケーションをインストールし起動してください。

[armadillo ~]# apt-get update
[armadillo ~]# apt-get install qtbase5-examples qt5-default
[armadillo ~]# cd /usr/lib/arm-linux-gnueabihf/qt5/examples/touch/fingerpaint
[armadillo ~]# export QT_QPA_PLATFORM=linuxfb
[armadillo ~]# export QT_QPA_GENERIC_PLUGINS=evdevtouch:/dev/input/event1
[armadillo ~]# ./fingerpaint

サンプルアプリケーションを起動すると、LCD上に指で絵を描画することができます。

Qt5 サンプルアプリケーション

図21.7 Qt5 サンプルアプリケーション


インプットデバイス対応するデバイスファイルを次に示します。

表21.8 インプットデバイス対応するデバイスファイル

インプットデバイスデバイスファイル
Armadillo-X1 ユーザースイッチSW1/dev/input/event2
評価用拡張ボード LCDタッチパネル/dev/input/event1

[ティップ]

Armadillo-X1 評価用拡張ボードに対応したソフトウェアで起動すると、Armadillo-X1本体のユーザースイッチSW1のデバイスファイルは/dev/input/event0から/dev/input/event1に変更されます。

LCDのLEDバックライト機能は、バックライトクラスとして実装されています。LEDバックライトの輝度変更には、/sys/class/backlight/x1_extboard_eva01_backlight/ディレクトリ以下の、次に示すファイルを使用します。

表21.9 輝度設定に使用するファイル

ファイル説明
brightness0(消灯) 〜 max_brightness(最高輝度)までの数値を書き込むことで輝度を変更します。
max_brightnessbrightnessに書きこむ数値の最大値(最高輝度)が読み出せます。

例として、LEDバックライトの輝度を最大値に設定する手順を次に示します。

[armadillo ~]# cat /sys/class/backlight/x1_extboard_eva01_backlight/max_brightness
9
[armadillo ~]# echo 9 > /sys/class/backlight/x1_extboard_eva01_backlight/brightness