本章では、Armadillo-X1 のソフトウェアをカスタマイズをする方法などについて説明します。
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」を参照してください。
コンフィギュレーションを変更してLinuxカーネルイメージをカスタマイズする方法を説明します。
手順21.1 イメージをカスタマイズ
Linuxカーネルアーカイブの展開
Linuxカーネルのソースコードアーカイブと、initramfsアーカイブを準備し、Linuxカーネルのソースコードアーカイブを展開します。
initramfsアーカイブへのシンボリックリンク作成
Linuxカーネルディレクトリに移動して、initramfsアーカイブへのシンボリックリンク作成します。
コンフィギュレーション
コンフィギュレーションをします。
カーネルコンフィギュレーションの変更
カーネルコンフィギュレーションを変更後、"Exit"を選択して「Do you wish to save your new kernel configuration ? <ESC><ESC> to continue.」で"Yes"とし、カーネルコンフィギュレーションを確定します。
| |
---|
Linux Kernel Configurationメニューで"/"キーを押下すると、カーネルコンフィギュレーションの検索を行うことができます。カーネルコンフィギュレーションのシンボル名(の一部)を入力して"Ok"を選択すると、部分一致するシンボル名を持つカーネルコンフィギュレーションの情報が一覧されます。
|
ビルド
ビルドするには、次のようにコマンドを実行します。
イメージファイルの生成確認
ビルドが終了すると、arch/arm/boot/ディレクトリとarch/arm/boot/dts/以下に、イメージファイル(LinuxカーネルとDTB)が作成されています。
21.3. ルートファイルシステムへの書き込みと電源断からの保護機能
Armadillo-X1のルートファイルシステムは、標準で eMMC に配置されます。
Linux が稼動している間は、ログや、設定ファイル、各種アプリケーション
によるファイルへの書き込みが発生します。もし、停電等で終了処理を実行できずに
電源を遮断した場合はRAM上に残ったキャッシュがeMMCに書き込まれずに、
ファイルシステムの破綻やファイルの内容が古いままになる状況が発生します。
また、eMMC内部の NAND Flash Memory には消去回数に上限があるため、書き込み
回数を制限することを検討する必要がある場合もあります。
そこで、Armadillo-X1 では、overlayfs を利用して、eMMCへの書き込み保護を行う機能を提供しています。
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を保守モードで起動し、次のようにコマンドを実行してください。
| |
---|
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モジュールを使って2.4GHz帯で通信する使用例
2つの機器をサンプルにAR9462モジュールを使って2.4GHz帯で通信するときの使い方について説明します。
21.4.1. 「BVMCN1101AA」の信号を受信する
Braveridge社製のビーコン「BVMCN1101AA」を例にビーコン信号を受信する方法を説明します。
「BVMCN1101AA」のアドバタイジング・パケットを受信するためには、bluetoothctl
コマンドを使います。
[bluetooth]のプロンプトが表示されたら、scan on
で信号を受信できます。
ご利用の環境によっては、ほかの機器からの信号も受信されます。
スキャンを中止するには、scan off
を実行します。
bluetoothctlを終了するには、exit
を実行します。
TEXAS INSTRUMENTS社製のセンサータグ「CC2650」を例にセンサータグをgatttool
で操作する方法を説明します。
手順21.2 「CC2650」の操作手順
hcitool lescan
を実行して、「CC2650」のMACアドレスを確認します。
ご利用の環境によっては、他の機器も検出されます。
「CC2650」に接続します。
プライマリサービスを確認するには、primary
を実行します。
0x004c~0x0050でハンドルされているプロファイルのUUIDを確認するには、char-desc
を実行します。
プロファイルの情報を読み取るには、char-read-hnd
を実行します。
プロファイルの情報を設定するには、char-write-cmd
を実行します。
操作を終了するには、exit
を実行します。
21.5. sshでArmadillo-X1に接続する
ssh-serverをインストールする
sshでrootのログインを禁止する
/etc/ssh/sshd_config内のPermitRootLogin をnoに設定します。
拡張インターフェース(CON8)の使用例を説明します。
拡張インターフェースは、用途によって機能を選択できるように複数の機能が割り当てられたピンが接続されています。Ethernet、USB、SPI、GPIOなどに使用可能な信号やパワーマネジメントICのON/OFF用信号などが接続されています。
ここでは、拡張インターフェースのハードウェア構成例と、対応するDevice Treeを示します。
拡張インターフェースのEthernetの使用例を説明します。
例として、Ethernet PHYにはMicrosemi製VSC8501XML-03を使います。これはArmadillo-X1本体に搭載されているものと同じです。
拡張インターフェースのEthernetを使うためには、Device Treeとブートローダーをカスタマイズする必要があります。VSC8501のドライバは工場出荷イメージで有効になっているため、Linuxカーネルイメージのカスタマイズは不要です。
ブロック図を図21.1「拡張インターフェースEthernetブロック図」に、信号配列を表21.1「拡張インターフェースEthernet信号配列」に示します。
表21.1 拡張インターフェースEthernet信号配列
CON8ピン番号 | 信号名 | I/O | 説明 |
---|
24 | RD0 | In |
受信データ0
i.MX 7DualのENET1_RGMII_RD0ピンに接続
|
25 | RD1 | In |
受信データ1
i.MX 7DualのENET1_RGMII_RD1ピンに接続
|
26 | RD2 | In |
受信データ2
i.MX 7DualのENET1_RGMII_RD2ピンに接続
|
27 | RD3 | In |
受信データ3
i.MX 7DualのENET1_RGMII_RD3ピンに接続
|
28 | RX_CTL | In |
受信制御
i.MX 7DualのENET1_RGMII_RX_CTLピンに接続
|
29 | RXC | In |
受信クロック
i.MX 7DualのENET1_RGMII_RXCピンに接続
|
30 | TD0 | Out |
送信データ0
i.MX 7DualのENET1_RGMII_TD0ピンに接続
|
31 | TD1 | Out |
送信データ1
i.MX 7DualのENET1_RGMII_TD1ピンに接続
|
32 | TD2 | Out |
送信データ2
i.MX 7DualのENET1_RGMII_TD2ピンに接続
|
33 | TD3 | Out |
送信データ3
i.MX 7DualのENET1_RGMII_TD3ピンに接続
|
34 | TX_CTL | Out |
送信制御
i.MX 7DualのENET1_RGMII_TX_CTLピンに接続
|
35 | TXC | Out |
送信クロック
i.MX 7DualのENET1_RGMII_TXCピンに接続
|
36 | GPIO7_IO12 | In |
VSC8501のMDINTピンに接続
i.MX 7DualのENET1_TX_CLKピンに接続
|
37 | GPIO7_IO13 | Out |
VSC8501のNRESETピンに接続
i.MX 7DualのENET1_RX_CLKピンに接続
|
38 | GPIO7_IO14 | Out |
VSC8501のCOMA_MODEピンに接続
i.MX 7DualのENET1_CRSピンに接続
|
69 | MDC | Out |
MDIOクロック
i.MX 7DualのENET1_MDCピンに接続
|
70 | MDIO | In/Out |
MDIOデータ
i.MX 7DualのENET1_MDIOピンに接続
|
21.6.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にインストールする方法を次に示します。
VSC8501の初期化はブートローダーが行います。工場出荷イメージでは拡張インターフェースに接続されたVSC8501の初期化に対応していないため、カスタマイズが必要です。
次に示す手順で、U-Bootのビルドを行い、VSC8501の初期化に対応したブートローダーイメージを生成します。
手順21.3 VSC8501の初期化に対応したブートローダーイメージの生成
ソースコードの準備
U-Bootのソースコードアーカイブを準備し展開します。
コンフィギュレーションの適用
ビルド
ビルドにはmakeコマンドを利用します。
イメージファイルの生成確認
ビルドが終了すると、U-Bootディレクトリにイメージファイルが作成されています。
生成したブートローダーイメージをQSPIフラッシュメモリにインストールする方法を次に示します。
まず、「Device Treeのカスタマイズ」でインストールしたDTBで起動するために、保守モードで次のようにコマンドを実行します。
| |
---|
DTBの指定を出荷状態に戻すには、次のようにコマンドを実行します。
|
正しくDTBの指定ができた場合は、起動ログに次のような内容が表示されます。
拡張インターフェースのEthernetインターフェースのネットワークデバイス名はeth0
です。「ネットワーク」を参照してネットワーク設定を行ってください。
| |
---|
Armadillo-X1本体のEthernetインターフェースのネットワークデバイス名はeth1 に変更されます。
|
| |
---|
MACアドレスは、出荷時に割り当て済みです。
|
拡張インターフェースのUSB OTG(On-the-Go)の使用例を説明します。
拡張インターフェースのUSB OTGを使うためには、Device Treeをカスタマイズする必要があります。
ブロック図を図21.2「拡張インターフェースUSB OTGブロック図」に、信号配列を表21.2「拡張インターフェースUSB OTG信号配列」に示します。
表21.2 拡張インターフェースUSB OTG信号配列
CON8ピン番号 | 信号名 | I/O | 説明 |
---|
47 | DP | In/Out |
USBプラス側信号
i.MX 7DualのUSB_OTG2_DPピンに接続
|
48 | DN | In/Out |
USBマイナス側信号
i.MX 7DualのUSB_OTG2_DNピンに接続
|
50 | VBUS | In |
VBUS監視
i.MX 7DualのUSB_OTG2_VBUSピンに接続
|
68 | ID | In |
ID信号
i.MX 7DualのSD2_RESET_Bピンに接続
|
100 | GPIO3_IO28 | Out |
TPS2065のENピンに接続
i.MX 7DualのLCD_DAT23ピンに接続
|
21.6.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にインストールする方法を次に示します。
まず、「Device Treeのカスタマイズ」でインストールしたDTBで起動するために、保守モードで次のようにコマンドを実行します。
| |
---|
DTBの指定を出荷状態に戻すには、次のようにコマンドを実行します。
|
正しくDTBの指定ができた場合は、起動ログに次のような内容が表示されます。
ArmadilloにBプラグが接続された場合はUSBホストとして動作します。例としてUSBフラッシュメモリが接続された場合の使用方法については「ストレージ」を参照してください。
ArmadilloにAプラグが接続された場合はUSBデバイスとして動作します。工場出荷イメージで有効になっているガジェットドライバは、CDC Composite Device(Ethernet and ACM)です。ネットワークデバイス名はusb0
、TTYデバイスファイル名は/dev/ttyGS0
です。
拡張インターフェースのI2Cの使用例を説明します。
例として、I2CデバイスにはNXPセミコンダクターズ製の温度センサ(LM75B)を使います。
拡張インターフェースのI2Cを使うためには、Device Treeをカスタマイズする必要があります。LM75B のドライバは工場出荷イメージで有効になっているため、Linux カーネルイメージのカスタマイズは不要です。
21.6.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にインストールする方法を次に示します。
まず、「Device Treeのカスタマイズ」でインストールしたDTBで起動するために、保守モードで次のようにコマンドを実行します。
| |
---|
DTBの指定を出荷状態に戻すには、次のようにコマンドを実行します。
|
正しくDTBの指定ができた場合は、起動ログに次のような内容が表示されます。
/sys/class/i2c-adapter/i2c-0/0-0048/temp1_input
ファイルの値を読み出すことによって、温度を取得することができます。
拡張インターフェースのSPIの使用例を説明します。
例として、SPIデバイスにはMicrochip製ADコンバーター(MCP3202)を使います。
拡張インターフェースのSPIを使うためには、Device Treeをカスタマイズする必要があります。MCP3202 のドライバは工場出荷イメージで有効になっているため、Linux カーネルイメージのカスタマイズは不要です。
ブロック図を図21.4「拡張インターフェースSPIブロック図」に、信号配列を表21.4「拡張インターフェースSPI信号配列」に示します。
表21.4 拡張インターフェースSPI信号配列
CON8ピン番号 | 信号名 | I/O | 説明 |
---|
72 | MISO | In |
マスター入力/スレーブ出力
i.MX 7DualのLCD_CLKピンに接続
|
73 | MOSI | Out |
マスター出力/スレーブ入力
i.MX 7DualのLCD_ENABLEピンに接続
|
74 | SCLK | Out |
シリアルクロック
i.MX 7DualのLCD_HSYNCピンに接続
|
75 | GPIO3_IO3 | Out |
スレーブセレクト
i.MX 7DualのLCD_VSYNCピンに接続
|
21.6.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にインストールする方法を次に示します。
まず、「Device Treeのカスタマイズ」でインストールしたDTBで起動するために、保守モードで次のようにコマンドを実行します。
| |
---|
DTBの指定を出荷状態に戻すには、次のようにコマンドを実行します。
|
正しくDTBの指定ができた場合は、起動ログに次のような内容が表示されます。
/sys/bus/iio/devices/iio:device1/
ディレクトリ以下にあるファイルの値を読み出すことによって、入力電圧を算出することができます。
シングルエンド入力 CH0への入力電圧を算出する例を次に示します。
この例では、シングルエンド入力 CH0への入力電圧は、2.5V (2048 × 1.220703125 [mV])である事がわかります。
| |
---|
awk コマンドを利用して、次のように電源電圧を表示することができます。
|