本章では、Armadillo-610 のソフトウェアをカスタマイズする方法などについて説明します。
Device Treeとは、ハードウェア情報を記述したデータ構造体です。ハードウェアの差分をDevice Treeに記述することによって、1つのLinuxカーネルイメージを複数のハードウェアで利用することができるようになります。
Device Treeに対応しているメリットの1つは、ハードウェアの変更に対するソフトウェアの変更が容易になることです。例えば、拡張インターフェース(Armadillo-610: CON2)に接続する拡張基板を作成した場合、主に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-610-extboard-eva-lcd.dts
-
arch/arm/boot/dts/armadillo-610-extboard-eva-grove.dts
-
arch/arm/boot/dts/armadillo-610-extboard-eva-common.dtsi
-
arch/arm/boot/dts/armadillo-610.dtsi
-
arch/arm/boot/dts/imx6ull.dtsi
-
arch/arm/boot/dts/imx6ul.dtsi
コンフィギュレーションを変更してLinuxカーネルイメージをカスタマイズする方法を説明します。
Linuxカーネルアーカイブの展開
Linuxカーネルのソースコードアーカイブを準備し、Linuxカーネルのソースコードアーカイブを展開します。
[ATDE ~]$ ls
initramfs_a600-[version].cpio.gz linux-v4.14-at[version].tar.gz
[ATDE ~]$ tar xf linux-v4.14-at[version].tar.gz
[ATDE ~]$ ls
initramfs_a600-[version].cpio.gz linux-v4.14-at[version] linux-v4.14-at[version].tar.gz
initramfs アーカイブへのシンボリックリンク作成
Linux カーネルディレクトリに移動して、initramfs アーカイブへのシンボリックリンク作
成します。
[ATDE ~]$ cd linux-v4.14-at[version]
[ATDE ~/linux-v4.14-at[version]]$ ln -s ../initramfs_a600-[version].cpio.gz initramfs_a600.cpio.gz
コンフィギュレーション
コンフィギュレーションをします。
[ATDE ~/linux-v4.14-at[version]]$ make ARCH=arm armadillo-640_defconfig
[ATDE ~/linux-v4.14-at[version]]$ make ARCH=arm menuconfig
カーネルコンフィギュレーションの変更
カーネルコンフィギュレーションを変更後、"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"を選択すると、部分一致するシンボル名を持つカーネルコンフィギュレーションの情報が一覧されます。 |
ビルド
[ATDE ~/linux-v4.14-at[version]]$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- LOADADDR=0x82000000 uImage
[ATDE ~/linux-v4.14-at[version]]$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
イメージファイルの生成確認
ビルドが終了すると、arch/arm/boot/ディレクトリと、arch/arm/boot/dts/以下にイメージファイル(LinuxカーネルとDTB)が作成されています。
[ATDE ~/linux-v4.14-at[version]]$ ls arch/arm/boot/uImage
arch/arm/boot/uImage
[ATDE ~/linux-v4.14-at[version]]$ ls arch/arm/boot/dts/armadillo-610-extboard-eva-lcd.dtb
arch/arm/boot/dts/armadillo-610-extboard-eva-lcd.dtb
[ATDE ~/linux-v4.14-at[version]]$ ls arch/arm/boot/dts/armadillo-610-extboard-eva-grove.dtb
arch/arm/boot/dts/armadillo-610-extboard-eva-grove.dtb
20.3. Device Treeをカスタマイズする
at-dtwebを利用してDevice Treeをカスタマイズする方法を説明します。at-dtwebでは、Webブラウザ上のマウス操作でDTSおよびDTBを生成することができます。
Armadillo-610 のカスタマイズの対象は拡張インターフェース(Armadillo-610: CON2)です。
ATDE8 に at-dtweb パッケージをインストールします。
[ATDE ~]$ sudo apt-get update
[ATDE ~]$ sudo apt-get install at-dtweb
at-dtwebの起動開始
at-dtwebの起動を開始するには、デスクトップ左上のアクティビティから「at-dtweb」と入力し、at-dtwebのアイコンをクリックしてください。
ボードの選択
ボードを選択します。Armadillo-610を選択して、「OK」をクリックします。
Linuxカーネルディレクトリの選択
Linuxカーネルディレクトリを選択します。コンフィギュレーション済みのLinuxカーネルディレクトリを選択して、「OK」をクリックします。
at-dtwebの起動完了
at-dtwebが起動し、次のように画面が表示されます。
20.3.3. Device Treeをカスタマイズ
機能の選択は、ドラッグ&ドロップで行います。画面左上の「Available features」から有効にしたい機能をドラッグし、画面右側の「Armadillo-610」の白色に変化したピンにドロップします。例としてCON2 83/85ピンをUART1(RXD/TXD)に設定します。
| |
---|
何も機能が選択されていないピンには GPIO の機能が割り当てられます。 |
いくつかの機能にプロパティを設定することができます。画面右側の「Armadillo-610」に選択した機能を左クリックすると、画面左下の「Properties」からプロパティを選択することができます。
例としてCON2 88/89ピンのI2C4(SCL/SDA)のclock-frequencyプロパティを設定します。
設定したプロパティを確定させるには「Apply」をクリックします。
全ての機能を削除する場合は、画面右上の「Reset configuration」をクリックします。機能ごとに削除する場合は、画面右側の「Armadillo-610」のピンを右クリックして「Remove」をクリックします。
DTSおよびDTBを生成するには、画面右上の「Save」をクリックします。
「Device tree built!」と表示されると、DTSおよびDTBの生成は完了です。
ビルドが終了すると、arch/arm/boot/dts/以下にDTS/DTBが作成されています。
[ATDE ~/linux-v4.14-at[version]]$ ls arch/arm/boot/dts/armadillo-610-expansion-interface.dtsi
arch/arm/boot/dts/armadillo-610-expansion-interface.dtsi
[ATDE ~/linux-v4.14-at[version]]$ ls arch/arm/boot/dts/armadillo-610-at-dtweb.dtb
arch/arm/boot/dts/armadillo-610-at-dtweb.dtb
20.4. ルートファイルシステムへの書き込みと電源断からの保護機能
Armadillo-610のルートファイルシステムは、標準でeMMCに配置されます。
Linuxが稼働している間は、ログや、設定ファイル、各種アプリケーションによるファイルへの書き込みが発生します。もし、停電等で終了処理を実行できずに電源を遮断した場合は、RAM上に残ったキャッシュがeMMCに書き込まれずに、ファイルシステムの破綻やファイルの内容が古いままになる状況が発生します。
また、eMMC内部のNAND Flash Memoryには消去回数に上限があるため、書き込み回数を制限することを検討する必要がある場合もあります。
そこで、Armadillo-610 では、overlayfsを利用して、eMMCへの書き込み保護を行う機能を提供しています。
eMMCへの書き込み保護を行うには、kernelの起動オプションに"overlay=50%"("=50%"は省略可、"overlay"のみ書くとRAMを256MByte使用)というパラメータを追加するだけです。
パラメータを追加すると、debianの起動前にinitramfsよってルートファイルシステムがupper=RAMディスク(tmpfs)、lower=eMMC(ext4)としたoverlayfsに切り替えられて、Debianが起動します。
overlayfsの機能によって、起動後のルートファイルシステムに対する差分は、全てRAMディスク(/overlay/ramdiskにマウント)に記録されるようになります。そのため、起動後の情報は保存されませんが、電源を遮断した場合でも、eMMCは起動前と変わらない状態のまま維持されています。
kernelの起動オプションの指定を行うにはArmadillo-610を保守モードで起動し、次のようにコマンドを実行してください。
=> setenv optargs overlay
=> saveenv
また、オプションの指定を解除するには次のようにコマンドを実行してください。
=> setenv optargs
=> saveenv
| |
---|
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-610のeMMCの記録方式は出荷時にSLCに設定しており、MLC方式のeMMCよりも消去回数の上限が高くなっています。そのため、開発するシステムの構成によってはeMMCへの書き込み保護機能を必要としない可能性があります。 |
| |
---|
eMMCへの書き込み保護機能を有効にすると、eMMCを安全に使用できるというメリットがありますが、その分、使用できるRAMサイズが減る、システム構成が複雑になる、デメリットもあります。 開発・運用したいシステムの構成、eMMCへの書き込み保護機能のメリット・デメリットを十分に考慮・評価したうえで、保護機能を使用する、しないの判断を行ってください。 |
20.5. eMMC の GPP(General Purpose Partition) を利用する
GPP に squashfs イメージを書き込み、Armadillo の起動時に自動的にマウントする方法を紹介します。
20.5.1. squashfs イメージを作成する
この作業は ATDE8 上で行います。
squashfs-tools パッケージに含まれている mksquashfs コマンドを使用して squashfs イメージを作成します。
20.5.2. squashfs イメージを書き込む
以降の作業は Armadillo 上で行います。
「squashfs イメージを作成する」で作成した squashfs イメージを、USB メモリ利用するなどして Armadillo-610 にコピーし、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
GPP の全ブロックに対して Temporary Write Protection をかけることにより、GPP への書き込みを制限することができます。
Temporary Write Protection は電源を切断しても解除されません。
Temporary Write Protection をかけるには、mmc-utils パッケージに含まれている mmc コマンドを使用します。
GPP の全ブロックに対して Temporary Write Protection をかけるには、次のようにコマンドを実行します。
|
/dev/mmcblk0gp2 のブロック数を確認します。コマンドの出力を見ると /dev/mmcblk0gp2 が 16384 ブロックあることがわかります。
|
|
/dev/mmcblk0gp2 の全ブロックに Temporary Write Protection をかけます。
|
| |
---|
Temporary Write Protection を解除するには、次のコマンド実行します。 [armadillo]# mmc writeprotect user set none 0 16384 /dev/mmcblk0gp2 |
20.5.4. 起動時に squashfs イメージをマウントされるようにする
/etc/fstab
を変更し、起動時に squashfs イメージがマウントされるようにします。
[armadillo]# mkdir -p /opt/sample
[armadillo]# vi /etc/fstab
:
:(省略)
:
/dev/mmcblk0gp2 /opt/sample squashfs defaults,nofail 0 0
|
squashfs イメージをマウントするディレクトリを作成します
|
|
最終行にこの行を追加します。これで、/dev/mmcblk0gp2 が /opt/sample にマウントされるようになります。
|
Armadillo の再起動後、 /opt/sample/README
の内容が正しければ完了です。
[armadillo]# reboot
:
: (省略)
:
Debian GNU/Linux 10 armadillo ttymxc0
armadillo login:
[armadillo]# ls /opt/sample
README
[armadillo]# cat /opt/sample/README
complete mounting squashfs on eMMC(GPP)
20.6. Armadillo-610 拡張ボードのSD インターフェースを利用する
Armadillo-610 拡張ボードのSD インターフェース(Armadillo-610 拡張ボード: CON1)を利用する方法を紹介します。
Armadillo-610 開発セットの標準状態では、SD インターフェース(Armadillo-610: CON1)が有効になっています。そのため、SD インターフェース(Armadillo-610 拡張ボード: CON1)を利用するためにはDevice Tree をカスタマイズする必要があります。Device Treeをカスタマイズする方法については、まず「Device Treeをカスタマイズする」 を参照してください。
コンソールの選択
コンソールとして、UART1(RXD/TXD)をシリアルインターフェース(Armadillo-610 拡張ボード: CON3)に該当する83,85ピンに割り当てます。
uSDHC2の選択
USDHC2をSD インターフェース(Armadillo-610 拡張ボード: CON1)に該当する70〜74,76,91,92ピンに割り当てます。
レギュレータの選択
レギュレータをArmadillo-610 拡張ボードに搭載されたパワースイッチに該当する86ピンに割り当てます。
レギュレータの割り当て
uSDHC2のレギュレータを割り当てます。「vmcc-supply」にreg_86と入力した後、「Apply」をクリックします。
生成したDTB(arch/arm/boot/dts/armadillo-610-at-dtweb.dtb
)をArmadillo-610に書き込むと、Armadillo-610 拡張ボードのSD インターフェースが利用可能になります。
20.7. Armadillo-610 拡張ボードのLCD インターフェースを利用する
Armadillo-610 拡張ボードのLCD インターフェース(Armadillo-610 拡張ボード: CON11)を利用する方法を紹介します。ここでは例として「LCDオプションセット(7インチタッチパネルWVGA液晶)」を利用します。
「DTBの書き換え」を参照して、DTBを armadillo-610-extboard-eva-lcd-v4.14-at[version].dtb
に書き換えてください。
再起動後、LCDが利用可能になります。
20.8. wxWidgets を利用して GUI アプリケーションを開発する
wxWidgets は C++で開発されているクロスプラットフォームの GUIツールキットです。Python、Perl、Ruby などの
スクリプト言語のラッパーも用意されており、これらを使って開発することも可能です。
ここでは wxWidgets で開発したサンプルアプリケーションと、Python ラッパーである wxPython で開発したサンプルアプリケーションを紹介します。
事前に「Armadillo-610 拡張ボードのLCD インターフェースを利用する」を参照して LCD を利用可能にする必要があります。
| |
---|
GUIアプリケーションの動作を確認するためには、LCDオプションセット(7インチタッチパネルWVGA液晶)が必要です。 |
20.8.1. wxWidgets を直接利用して GUI アプリケーションを開発する
ラッパーを利用せず、wxWidgets を直接利用して開発したサンプルアプリケーションを紹介します。
20.8.1.1. wxWidgets のインストール
開発に必要なパッケージをインストールします。
[armadillo ~]# apt-get update
[armadillo ~]# apt-get install build-essential xorg libwxgtk3.0-dev
20.8.1.2. サンプルアプリケーションのダウンロード
次に示すコマンドでサンプルアプリケーションをダウンロードします。
[armadillo ~]# wget https://download.atmark-techno.com/sample/a600-wxwidgets-howto/wxwidgets_led-v1.1.tar.gz
[armadillo ~]# tar zxf wxwidgets_led.tar.gz
20.8.1.3. サンプルアプリケーションのビルドと起動
ダウンロードしたサンプルアプリケーションのディレクトリへ移動しビルドを実行します。
[armadillo ~]# cd wxwidgets_led
[armadillo ~/wxwidgets_led]# make
[armadillo ~/wxwidgets_led]# ls
Makefile led.h led_controller.h main_frame.h
led led.o led_controller.o main_frame.o
led.cpp led_controller.cpp main_frame.cpp resources
次に示すコマンドでサンプルアプリケーションを起動します。LCDオプションセット(7インチタッチパネルWVGA液晶)が接続済みであるとします。
[armadillo ~/wxwidgets_led]# export DISPLAY=:0
[armadillo ~/wxwidgets_led]# X -retro -r &
[armadillo ~/wxwidgets_led]# ./led
サンプルアプリケーション上の YELLOW ボタンを押すと、Armadillo-610 上の LED5 が点灯・消灯します。
[armadillo ~/wxwidgets_led]# ls
Makefile led.h led_controller.h main_frame.h
led.cpp led_controller.cpp main_frame.cpp resources
|
アプリケーション本体です。
|
|
Armadillo-610 上の LED を操作するための処理を実装しているソースです。
|
|
UIに関する処理を実装しているソースです。
|
| |
---|
wxWidgets には公式に多くのサンプルアプリケーションがあり、それらを参考にしながら開発することもできます。
サンプルアプリケーションを取得するには、次のコマンドを実行します。 [armadillo ~]# apt-get install wx3.0-examples
[armadillo ~]# cd /usr/share/doc/wx3.0-examples/examples
[armadillo /usr/share/doc/wx3.0-examples/examples]# ./unpack_examples.sh samples/ ~/wx3.0-examples
[armadillo /usr/share/doc/wx3.0-examples/examples]# cd ~/wx3.0-examples/samples
[armadillo ~/wx3.0-examples/samples]# 上記のディレクトリに多種多様なサンプルアプリケーションが入っており、
ビルド後に起動して動作を確認することができます。 |
20.8.2. wxPython を利用して GUI アプリケーションを開発する
先に説明したとおり wxWidgets には Python 向けラッパーがあり、それが wxPython です。スクリプト言語という特性を活かして、
wxWidgets を直接利用するよりも素早く GUIアプリケーションの開発ができます。
さらに、 C言語と組み合わせることにより、ハードウェアの制御も可能となります。
ここでは wxPython で開発したサンプルアプリケーションを紹介します。(アプリケーションの内容は「サンプルアプリケーションのビルドと起動」で説明したものと同じです。)
20.8.2.1. Python と wxPython のインストール
開発に必要なパッケージをインストールします。
[armadillo ~]# apt-get update
[armadillo ~]# apt-get install build-essential xorg python-dev python-wxgtk3.0-dev
20.8.2.2. サンプルアプリケーションのダウンロード
次に示すコマンドでサンプルアプリケーションをダウンロードします。
[armadillo ~]# wget https://download.atmark-techno.com/sample/a600-wxwidgets-howto/wxpython_led-v1.1.tar.gz
[armadillo ~]# tar zxf wxpython_led.tar.gz
20.8.2.3. サンプルアプリケーションのビルドと起動
ダウンロードしたサンプルアプリケーションのディレクトリへ移動し、必要なモジュールをビルドします。ここでビルドするモジュールとは C言語で記述された Python から
ハードウェアを制御するためのプログラムです。
[armadillo ~]# cd wxpython_led
[armadillo ~/wxpython_led]# make
[armadillo ~/wxpython_led]# ls
Makefile led.o led_wrapper.c ledmodule.so
led.c led.py led_wrapper.o resources
次に示すコマンドでサンプルアプリケーションを起動します。LCDオプションセット(7インチタッチパネルWVGA液晶)が接続済みであるとします。
[armadillo ~/wxpython_led]# export DISPLAY=:0
[armadillo ~/wxpython_led]# X -retro -r &
[armadillo ~/wxpython_led]# python led.py
サンプルアプリケーション上の YELLOW ボタンを押すと、Armadillo-610 上の LED5 が点灯・消灯します。
ハードウェア(LED5)を制御する部分を C言語で実装しているため、C言語のソースファイルも含んでいます。
[armadillo ~/wxpython_led]# ls
Makefile led.c led.py led_wrapper.c resources
|
Armadillo-610 上の LED を操作するための処理を実装している C言語プログラムです
|
|
Python で記述されたアプリケーション本体です
|
|
led.c で実装している処理を Python 側から呼び出すためのブリッジとなる処理を実装している C言語プログラムです
|
| |
---|
wxPython パッケージには多くのサンプルアプリケーションが含まれており、それらを参考にしながら開発することもできます。
サンプルアプリケーションを取得するには、次のコマンドを実行します。 [armadillo ~]# apt-get source python-wxgtk3.0
[armadillo ~]# cd wxpython3.0-3.0.2.0+dfsg/wxPython/
[armadillo ~/wxpython3.0-3.0.2.0+dfsg/wxPython]# 上記のディレクトリ内にある demo 、 samples ディレクトリに多種多様なサンプルアプリケーションが入っており、
起動して動作を確認することができます。 |