Howto

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

20.1. Device Treeとは

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

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

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

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

Linuxカーネルのソースコードに含まれている初期出荷状態でのDTS、及び関連するファイルを次に示します。

初期出荷状態でのDTS、及び関連するファイル
  • arch/arm/boot/dts/armadillo-640.dts
  • arch/arm/boot/dts/imx6ull.dtsi
  • arch/arm/boot/dts/imx6ul.dtsi

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

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

20.2.1. イメージをカスタマイズ

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

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

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

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

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

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

    [PC ~/linux-v4.14-at[version]]$ make ARCH=arm armadillo-640_defconfig
    [PC ~/linux-v4.14-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.14-at1 Kernel Configuration
     ------------------------------------------------------------------------------
      ----------------- Linux/arm 4.14-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  [ ]
        -----------------------------------------------------------------------
                 General setup  --->
             [ ] Enable loadable module support  ----
             [*] Enable the block layer  --->
                 System Type  --->
                 Bus support  --->
                 Kernel Features  --->
                 Boot options  --->
                 CPU Power Management  --->
                 Floating point emulation  --->
                 Userspace binary formats  --->
                 Power management options  --->
             [*] Networking support  --->
                 Device Drivers  --->
                 Firmware Drivers  --->
                 File systems  --->
                 Kernel hacking  --->
                 Security options  --->
             -*- Cryptographic API  --->
                 Library routines  --->
             [ ] Virtualization  ----
    
    
    
        -----------------------------------------------------------------------
      ---------------------------------------------------------------------------
               <Select>    < Exit >    < Help >    < Save >    < Load >
[ティップ]

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

  1. ビルド

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

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

    [PC ~/linux-v4.14-at[version]]$ ls arch/arm/boot/uImage
    arch/arm/boot/uImage
    [PC ~/linux-v4.14-at[version]]$ ls arch/arm/boot/dts/armadillo-640.dtb
    arch/arm/boot/dts/armadillo-640.dtb

20.3. Device Treeをカスタマイズする

at-dtwebを利用してDevice Treeをカスタマイズする方法を説明します。at-dtwebでは、Webブラウザ上のマウス操作でDTSおよびDTBを生成することができます。カスタマイズの対象は拡張インターフェース(CON8、CON9、CON14)とLCD拡張インターフェース(CON11)です。

[警告]

at-dtwebを利用したDevice Treeのカスタマイズは linux-4.14-at11 から対応しています。

20.3.1. at-dtwebのインストール

ATDE7 に at-dtweb パッケージをインストールします。

[PC ~]$ sudo apt-get update
[PC ~]$ sudo apt-get install at-dtweb

20.3.2. at-dtwebの起動

  1. at-dtwebの起動開始

    at-dtwebの起動を開始するには、デスクトップ左上のアクティビティから「at-dtweb」と入力し、at-dtwebのアイコンをクリックしてください。

    images/at-dtweb-activity.png

    図20.1 at-dtwebの起動開始


  2. ボードの選択

    ボードを選択します。Armadillo-640を選択して、「OK」をクリックします。

    images/at-dtweb-board-select.png

    図20.2 ボード選択画面


  3. Linuxカーネルディレクトリの選択

    Linuxカーネルディレクトリを選択します。コンフィギュレーション済みのLinuxカーネルディレクトリを選択して、「OK」をクリックします。

    images/at-dtweb-kernel-select.png

    図20.3 Linuxカーネルディレクトリ選択画面


  4. at-dtwebの起動完了

    at-dtwebが起動し、次のように画面が表示されます。

    images/at-dtweb-main.png

    図20.4 at-dtweb起動画面


[ティップ]

Linuxカーネルは、事前にコンフィギュレーションされている必要があります。コンフィギュレーションの手順については「手順:Linuxカーネルをビルド」を参照してください。

20.3.3. Device Treeをカスタマイズ

20.3.3.1. 機能の選択

機能の選択は、ドラッグ&ドロップで行います。画面左側の「Available features」から有効にしたい機能をドラッグし、画面右側の「A6400」の白色に変化したピンにドロップします。例としてCON9 3/5ピンをUART1(RXD/TXD)に設定します。

images/at-dtweb-enable-feature1.png

図20.5 UART1(RXD/TXD)のドラッグ


images/at-dtweb-enable-feature2.png

図20.6 CON9 3/5ピンへのドロップ


20.3.3.2. 機能の削除

全ての機能を削除する場合は、画面右上の「Reset configuration」をクリックします。機能ごとに削除する場合は、画面右側の「A6400」のピンを右クリックして「Remove」をクリックします。

images/at-dtweb-reset-configuration.png

図20.7 全ての機能の削除


images/at-dtweb-remove-configuration.png

図20.8 UART1(RXD/TXD)の削除


20.3.3.3. DTS/DTBの生成

DTSおよびDTBを生成するには、画面右上の「Save」をクリックします。

images/at-dtweb-save-configuration.png

図20.9 DTS/DTBの生成


「Device tree built!」と表示されると、DTSおよびDTBの生成は完了です。

images/at-dtweb-save-complete.png

図20.10 DTS/DTBの生成完了


ビルドが終了すると、arch/arm/boot/dts/以下にDTS/DTBが作成されています。

[PC ~/linux-v4.14-at[version]]$ ls arch/arm/boot/dts/armadillo-640-expansion-interface.dtsi
armadillo-640-expansion-interface.dtsi
[PC ~/linux-v4.14-at[version]]$ arch/arm/boot/dts/armadillo-640-at-dtweb.dtb
armadillo-640-at-dtweb.dtb

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

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

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

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

20.4.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-640を保守モードで起動し、次のようにコマンドを実行してください。

=> setenv optargs overlay
=> saveenv

また、オプションの指定を解除するには次のようにコマンドを実行してください。

=> setenv optargs
=> saveenv
[警告]

overlayfsによる、eMMCへの書き込み保護は linux-4.14-at5, u-boot-a600-v2018.03-at3 から対応しています。

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

[警告]

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

20.5. LCDインターフェースの動作確認

[警告]

LCDオプションセット(7インチタッチパネルWVGA液晶)には Linuxカーネル v4.14-at6 から対応しています。

CON11に接続された LCDオプションセット(7インチタッチパネルWVGA液晶) の動作確認のため、Qt5 のサンプルアプリケーションを利用します。次に示すコマンドでサンプルアプリケーションをインストールし起動してください。

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

サンプルアプリケーションを起動すると、LCD 上に指で絵を描画することができます。 LCDオプションセット(7インチタッチパネルWVGA液晶) のタッチパネルは最大10点のマルチタッチに対応しているので、10本の指で同時に描画できることを確認することができます。

images/lcd-qt5-sample.png

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


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

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

brightness

0(消灯) から max_brightness(最高輝度) までの数値を書き込むことで輝度を変更します。

max_brightness

brightness に書きこむ数値の最大値(最高輝度)が読み出せます。


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

[armadillo ~]# cat /sys/class/backlight/backlight-display/max_brightness
128
[armadillo ~]# echo 128 > /sys/class/backlight/backlight-display/brightness

20.6. eMMC の GPP(General Purpose Partition) を利用する

GPP に squashfs イメージを書き込み、Armadillo の起動時に自動的にマウントする方法を紹介します。

20.6.1. squashfs イメージを作成する

この作業は ATDE7 上で行います。

squashfs-tools パッケージに含まれている mksquashfs コマンドを使用して squashfs イメージを作成します。

squashfs イメージの作成. 

[ATDE]$ mkdir sample
[ATDE]$ echo "complete mounting squashfs on eMMC(GPP)" > sample/README
[ATDE]$ mksquashfs sample squashfs.img

20.6.2. squashfs イメージを書き込む

以降の作業は Armadillo 上で行います。

「squashfs イメージを作成する」で作成した squashfs イメージを、USB メモリ利用するなどして Armadillo-640 にコピーし、GPP に書き込みます。

[警告]

ユーザー領域として使用可能なGPPは /dev/mmcblk0gp2 および /dev/mmcblk0gp3 です。

GPPへの書き込みを行う際は、誤って /dev/mmcblk0gp0 や /dev/mmcblk0gp1 に書き込みを行わないよう、十分に注意してください。

[Armadillo]# mount /dev/sda1 /mnt
[Armadillo]# dd if=/mnt/squashfs.img of=/dev/mmcblk0gp2 conv=fsync
[Armadillo]# umount /mnt

20.6.3. GPP への書き込みを制限する

GPP の全ブロックに対して Temporary Write Protection をかけることにより、GPP への書き込みを制限することができます。 Temporary Write Protection は電源を切断しても解除されません。

Temporary Write Protection をかけるには、mmc-utils パッケージに含まれている mmc コマンドを使用します。

mmc-utilsのインストール. 

[Armadillo]# apt-get install mmc-utils

GPP の全ブロックに対して Temporary Write Protection をかけるには、次のようにコマンドを実行します。

eMMC の GPP に Temporary Write Protection をかける. 

[Armadillo]# mmc writeprotect user get /dev/mmcblk0gp2  1
Write Protect Group size in blocks/bytes: 16384/8388608
Write Protect Groups 0-0 (Blocks 0-16383), No Write Protection
[Armadillo]# mmc writeprotect user set temp 0 16384 /dev/mmcblk0gp2  2

1

/dev/mmcblk0gp2 のブロック数を確認します。コマンドの出力を見ると /dev/mmcblk0gp2 が 16384 ブロックあることがわかります。

2

/dev/mmcblk0gp2 の全ブロックに Temporary Write Protection をかけます。

[ティップ]

Temporary Write Protection を解除するには、次のコマンド実行します。

[Armadillo]# mmc writeprotect user set none 0 16384 /dev/mmcblk0gp2

20.6.4. 起動時に squashfs イメージをマウントされるようにする

/etc/fstab を変更し、起動時に squashfs イメージがマウントされるようにします。

[Armadillo]# mkdir -p /opt/sample  1
[Armadillo]# vi /etc/fstab
:
:(省略)
:
/dev/mmcblk0gp2 /opt/sample squashfs defaults,nofail 0 0  2

1

squashfs イメージをマウントするディレクトリを作成します

2

最終行にこの行を追加します。これで、/dev/mmcblk0gp2/opt/sample にマウントされるようになります。

Armadillo の再起動後、 /opt/sample/README の内容が正しければ完了です。

[Armadillo]# reboot
:
: (省略)
:
Debian GNU/Linux 9 armadillo ttymxc0

armadillo login:
[Armadillo]# ls /opt/sample
README
[Armadillo]# cat /opt/sample/README
complete mounting squashfs on eMMC(GPP)