twitter icon   twitter icon   rss icon

Linux.com Japan

Home Linux Jp チュートリアル MarS: スクリーンを持たない 100 ドル の DIY 用プラットフォーム

MarS: スクリーンを持たない 100 ドル の DIY 用プラットフォーム

原文はこちらです。

mars

MarS シングル ボード コンピューターは、単体で、高価ですが、BeagleBone Black や Raspberry Pi の代わりとして DIY ハードウェア工作に使うことができます。最少構成で、2 列のピンホールからなるヘッダーを 2 つ持っています。遊び倒すには充分です。他の機能として、タッチ スクリーンがあります。これにより、たとえば、タブレットを実現することができます。

MarS のコアは、Freescale iMX6 Cortex-A9 に Vivante GC2000 グラフィックス プロセッサーです。ボードは、1GB RAM、4GB eMMC ストレージ、LVDS (日本語) と HDMI を含む多数のスクリーン出力、複数の USB2.0 ポート、ギガバイト LAN、そして SPI のような入出力のためのヘッダーからなります。MarS キットにとって、一番は LVDS でしょう。9.7 インチ、マルチタッチ スクリーンが提供されています。
組み合わせキットには、MarS ボード、1024x768 ピクセル、マルチタッチ機能付き 9.7インチLCD が含まれます。MarS 自体は約 100 米ドルですが、組合せキットはおよそ 290 ドルです。
9.7 インチのスクリーンは、タブレットへの応用に充分だと思います。シングル LVDS ケーブルは、シグナルと電力供給の両方を行います。マルチタッチ情報は LVDS ケーブルを通してコンピューターに戻されるので、他のケーブルは不要です。
自分用のタブレットを実現したい人や、MarS の外部ヘッダーから他のチップ・ボードにアクセスしたい人向きです。バッテリーと、スクリーン後ろにストラップを付けることで、若干厚さはありますが専用でインクルーシブなタブレットを開発できます。また、LVDS と HDMI のデュアルディスプレイ構成により、外部スクリーンの制御も可能です。

MarS に Android を載せる

4GB の eMMC に何が搭載されているかを確認するため、HDMI にスクリーンを接続、MarS をブートしました。Imx6q 上のモデル番号 ICS AOSP の Android バージョン 4.0.4 でした。電源を落とし、9.7 インチ タッチスクリーンを接続し、電源を入れます。スクリーン枠の右上の赤ライトとバックライトが点灯しましたが、信号が来ません。電源を落とし、HDMI を外してみましたが、状況は変わりません。Android で LVDS スクリーンを使えるようにするには、シリアル コンソールから操作する必要があります。
ネットワーク コネクタの隣にあるミニ USB ポートが、MarS のシリアル コンソールです。ブート前 3 秒内に任意のキーを押すことにより、ブート パラメーターを変更できます。9.7 インチ タッチ スクリーンを動かすためには、ブート中に割り込んで、下記のような変更を行う必要があります。これは、MarS のユーザー マニュアルに記載されています。ユーザー マニュアルには、異なるサイズ (小さ目の LCD、9.7 インチ LVDS タッチ パネル) の外部スクリーンと HDMI 用に 7 つの設定が記載されています。Android 用に、外部スクリーンと HDMI をデュアル ディスプレイで同時に利用する方法も記載されています。この設定は、MarS の不揮発性メモリに書き込まれますが、run clearenv コマンドでデフォルトにリセットできます。

Board: MX6Q-MARSBOARD:[ WDOG]
Boot Device: I2C
I2C:   ready
DRAM:   1 GB
MMC:   FSL_USDHC: 0,FSL_USDHC: 1
...
Net:   got MAC address from IIM: 00:00:00:00:00:00
----enet_board_init: phy reset
FEC0 [PRIME]
Hit any key to stop autoboot:  0 
MX6Q MARSBOARD U-Boot > setenv no_console_suspend 1
MX6Q MARSBOARD U-Boot > setenv bootargs console=ttymxc1,115200 init=/init
  rw video=mxcfb0:dev=ldb,LDB-XGA,if=RGB666 fbmem=10M vmalloc=400M
  androidboot.console=ttymxc1
MX6Q MARSBOARD U-Boot > saveenv
MX6Q MARSBOARD U-Boot > boot

更新後 (リンク先不明のため問い合わせ中) もバージョンは 4.0.4 です。LVDS スクリーンのマルチタッチ機能も期待どおり動作します。ギャラリーのイメージのズームも素敵で反応速度も問題ありません。画像のコピーを繰り返すことで、MarS 用の Android ディストリビューションがきわめてすぐれていることが確認できます。
MarS で Android 実行中に、MarS の OTG ミニ USB ポートに USB ケーブルを挿入し、ケーブルの反対側を Linux デスクトップ マシンに接続しました。MarS をファイルシステムとしてマウントしました。MarS とのデータ交換が簡単にできます。問題が 1 つあります。デバイスがスリープモードに入ったあと、リセット ボタンを押下する以外に元に戻す方法がないようです。スクリーンにはサイドボタン用のポジションがあるので、ハードウェア ボタン以外に Android を復帰させる方法が思いつきません。もちろん、ハードウェアボタンなしで復帰させるためのアプリケーションがあります。

MarS に Linaro をロードする

MarS 用の最新リリースは、Linaro 11.10 (開発ブランチ) です。
MarS マニュアルには、Linux デスクトップマシンを使って Android のバージョン アップや Linaro への変更を行う方法は記載されていません。mfsTool を使って、MarS ボードのフラッシュに Linaro のイメージを書き込みました。このツールは、Embest Tech から入手できます。注意すべきことは、もし、シリアル コンソールからログインしているのであれば、ミニ USB ケーブルを OTG ポート (HDMI ポートの隣) に移動し、mfsTool で MarS を更新できるようにします。私は、USB ケーブルをシリアル ポートに挿したままにしてしばらく悩みました。
イメージをロードするため、MarS のジャンパーのひとつ (D2) をオンにし、ボードをリセットします。書き込み後、ジャンパーをオフにしてリセットします。MarS は新システムで起動します。ユーザー マニュアルの 30 ページ前後に詳細情報が書かれています。
mfsTool には、何ら問題がないので、Linux デスクトップ マシンから MarS 上に Linux イメージを書き込むことは問題ありません。

Linaro でタッチ スクリーンを使用する

MarS 関連ドキュメントには、Linaro で LVDS を使用する方法が書かれていません。上記に記載した Android 用にディスプレイを使用可能にするコマンドが Linaro でも使えることがわかりました。しかし、最初は、タッチ スクリーンを使えませんでした。
MarS 用カーネルの git リポジトリに、下記のコミットを見つけました。

commit 4006c19c6beda96a0bd5855a1ab27a7b2e380cb5
Author: luofuchong 
Date:   Thu Oct 24 15:10:09 2013 +0800
Add single touch support for LCD8000-97C using on ubuntu & emmc fix to mmcblk0.

最新の MarS 用 Linux イメージは、2013 年 9 月 13 日版でしたので、MarS 用の最新カーネルをコンパイルしインストールして、シングル タッチをテストしました。すぐに新しいカーネルが出るでしょうから、もう、タッチ スクリーン機能のためにカーネルをコンパイルすることは不要でしょう。

... The kernel version of the last updated images for the MarS.
$ uname -a
Linux linaro-ubuntu-desktop 3.0.15-01361-g6cd3d53-dirty #2 
SMP PREEMPT Wed Aug 28 13:42:52 CST 2013 armv7l armv7l armv7l GNU/Linux

MarS ユーザー マニュアルによれば、仮想マシンに Ubuntu をインストールして、MarS 用カーネルをクロス コンパイルすることが推奨されています。MarS ボードは、カーネルをコンパイルする力を持っていますから、セルフ コンパイルすることにしました。下記のようなリンクを張り、コンパイラを実行できるようにします。

# ls -l /usr/bin/arm-fsl*
lrwxrwxrwx 1 root root 2 2014-03-27 23:55 /usr/bin/arm-fsl-linux-gnueabi-ar -> ar
lrwxrwxrwx 1 root root 3 2014-03-27 23:52 /usr/bin/arm-fsl-linux-gnueabi-gcc -> gcc
lrwxrwxrwx 1 root root 2 2014-03-27 23:54 /usr/bin/arm-fsl-linux-gnueabi-ld -> ld
lrwxrwxrwx 1 root root 2 2014-03-28 01:17 /usr/bin/arm-fsl-linux-gnueabi-nm -> nm
lrwxrwxrwx 1 root root 7 2014-03-28 01:06 /usr/bin/arm-fsl-linux-gnueabi-objcopy -> objcopy
lrwxrwxrwx 1 root root 7 2014-03-27 23:54 /usr/bin/arm-fsl-linux-gnueabi-objdump -> objdump

下記コマンドを使って、実行中のカーネルと同じブランチから最新のカーネルをダウンロードします。このカーネルは、タッチ インタフェースをサポートしています。これには時間がかかりますし、カーネル コンパイルにも 1 時間以上かかります。ですから、もしカーネル上で何か開発をしているのであれば、クロス コンパイル環境で実行したほうが良いでしょう。

$ git clone https://github.com/embest-tech/linux-imx.git
$ cd ./linux-imx
$ git checkout embest_imx_3.0.15_12.04.01
$ make imx6_defconfig
$ make KALLSYMS_EXTRA_PASS=1 uImage
...
  Image arch/arm/boot/uImage is ready
$ ls -l arch/arm/boot/uImage
-rw-rw-r-- 1 ben ben 3645672 2014-03-28 01:24 arch/arm/boot/uImage

/boot ディレクトリに uImage ファイルがありますが、これは MarS が実行しているカーネルではありません。下記のように MarS 上の 4GB フラッシュ メモリを調べると、使用しているパーティションの前にギャップがあります。このギャップに、ブート ローダーと実行中のカーネルが置かれています。

root@linaro-ubuntu-desktop:~# fdisk -l /dev/mmcblk0
        Device Boot      Start         End      Blocks   Id  System
/dev/mmcblk0p1           20480     7798783     3889152   83  Linux

シリアル ターミナルで、ブート プロセスを調べると、U-Boot ブートローダーが Linux カーネルをロードする正確なアドレスがわかります。下記のように、dd コマンドで現在の Linux カーネルをフラッシュ メモリから取り出し、od コマンドで読みやすい形式に変換します。32 バイト目 (8 進数で 40) から Linux カーネル バージョンが格納されています。

root@linaro-ubuntu-desktop:/tmp# dd if=/dev/mmcblk0 of=test bs=1024 count=10000 skip=1024
10000+0 records in
10000+0 records out
10240000 bytes (10 MB) copied, 0.319027 s, 32.1 MB/s
root@linaro-ubuntu-desktop:/tmp# od -t c test > test.od
^c
root@linaro-ubuntu-desktop:/tmp# vi test.od
...
0000040   L   i   n   u   x   -   3   .   0   .   1   5   -   0   1   3
0000060   6   1   -   g   6   c   d   3   d   5   3   -   d   i   r   t

以下のコマンドで、新しい /boot/uImage を U-Boot がカーネルをロードするフラッシュのアドレスにコピーしました。もちろん、最初に mmcblk0 のバックアップを取っておきます。”L i n u x” とそれに続くバージョン文字列が正しい位置に正しい値でコピーされるように注意して dd コマンドを実行します。実行前に、バックアップと復元の方法を良く考えておいてください。コマンド実行後に MarS がどうなるか、確信がありませんでした。そこで、msfTool を使って MarS のフラッシュに再書き込みができるように準備しておきました。

# dd  if=/boot/uImage of=/dev/mmcblk0 bs=1024 seek=1024

リブート後、新カーネルが起動し、スクリーンのシングル タッチ機能が使えました。Xサーバーを更新し、以下のコマンドを使って、タッチ機能が使えるようにしました。

$ uname -a
Linux linaro-ubuntu-desktop 3.0.15-01365-ge16f9b9 #1 
SMP PREEMPT Fri Mar 28 01:17:29 UTC 2014 armv7l armv7l armv7l GNU/Linux
# apt-get remove xserver-xorg-input-synaptics
# apt-get install xserver-xorg-input-tslib  libts-bin 

この Linux でのシングル タッチ実現方法には、ひとつ問題があります。指でスクリーンを押下し、移動させると、マウスボタンを押下して、マウスをドラッグするのと同じことになります。タブレットのブラウザに慣れている人は、シングル タッチ インタフェースで Firefox のテキスト選択を行う際にちょっと驚くことでしょう。これは、ブラウザにエクステンションを入れることで回避できると思いますが、同じようなこと (スクローリングしないこと) が他のアプリケーションでも起こり得ます。Linaro のソフト キーボードを利用して、スクリーン上で入力してもよいでしょう。一方、このシングル タッチは QtQuick ユーザー インタフェースでは問題なく動作します。

ハードウェアの操作

MarS 上の Linux では、/sys/class/gpio ディレクトリを使って GPIO ピンを操作することができます。これは、BeagleBone Black (日本語) について説明した以前の文献と同じ方法です。GPIOピンの割り込み (日本語) に関することも同様に扱えます。3 つの TWI デバイスが /dev ディレクトリ内に作成されます。/dev/spi (日本語) を作成する方法を探しています。

root@linaro-ubuntu-desktop:~# ls -l /sys/class/gpio/
total 0
--w------- 1 root root 4096 1970-01-01 01:09 export
lrwxrwxrwx 1 root root    0 1970-01-01 01:09 gpiochip0 -> ../../devices/virtual/gpio/gpiochip0
lrwxrwxrwx 1 root root    0 1970-01-01 01:09 gpiochip128 -> ../../devices/virtual/gpio/gpiochip128
lrwxrwxrwx 1 root root    0 1970-01-01 01:09 gpiochip160 -> ../../devices/virtual/gpio/gpiochip160
lrwxrwxrwx 1 root root    0 1970-01-01 01:09 gpiochip192 -> ../../devices/virtual/gpio/gpiochip192
lrwxrwxrwx 1 root root    0 1970-01-01 01:09 gpiochip32 -> ../../devices/virtual/gpio/gpiochip32
lrwxrwxrwx 1 root root    0 1970-01-01 01:09 gpiochip64 -> ../../devices/virtual/gpio/gpiochip64
lrwxrwxrwx 1 root root    0 1970-01-01 01:09 gpiochip96 -> ../../devices/virtual/gpio/gpiochip96
--w------- 1 root root 4096 1970-01-01 01:09 unexport

性能

Bonnie は、ディスク キャッシュの影響を避けるため、システム メモリの 2 倍の大きさのファイルを作成します。MarS は 1GB の RAM を搭載していますが、ストレージに 2GB の余裕がないため、ファイル サイズを数百 MB に制限しました。コマンドを下記に示します。これは、BeagleBone Black (日本語) でフラッシュ ストレージを試験したときと同じコマンドです。

user@mars:~/test$ /sbin/bonnie++ -f -m mars -s 200 -r 100 -d `pwd` 

MarS は、出力が 4.7MB / 秒、再書き込みが 3.5MB / 秒でした。BeagleBone Black が、4.2MB / 秒と 4.5MB / 秒、ODroid-U2 クアッドコア ARM が 16MB / 秒と 12MB / 秒でした。私は、MarS がそこそこ速いマシンであることに少々驚きました。Bonnie の実行後、MarS は 150MB のディスク キャッシュを使用していました。1GM の RAM により、他のマシンよりもディスク キャッシュが効き、スピードにも貢献したものと思います。
Cairo Performance Demosのバージョン 1.0.1  を使って、2d グラフィック性能を測定しました。3 つのテストを含みます。chart は、4 本の線グラフを描画します。fish は、多数の魚が泳ぐ水槽をシミュレーションします。gradient は、画面上を動き回る曲線を描画します。flowers は、画面上を上下しながら回転する多数の花を描画します。1 つは 2560 x 1400、他方は 1080p の 2 個のディスプレイをドライブする NVidia GTX 570 カードを搭載した Intel 2600K CPU デスクトップ マシンと比較しました。MarS が gradient では性能が良いのに対して、fish では非常に悪くなっています。

 

           BBB fps    Mars fps       desktop 2600k/nv570
           at 720p    LVDS at        two screens.
                         1024x768
  
gears         26       18             140
  chart        2          2              16
   fish         4          0.3          188
gradient     10       17            117
flowers       1          2             170

Web ブラウジング性能測定用に、Octane2.0 Javascript benchmark を実行しました。MarS 用 Linaro のアップデートに付いていた Firefox 20.0+build1-0ubuntu0.11.10.3 を利用しました。結果は、Splay は930、Regexp は 60、pdf.js は 1011 でした。残念なことに、Box2DWeb 実行中にテストの実行速度がひどく落ちてしまい、全体的な結果は得られませんでした。BeagleBone Black では、それぞれ 827、88、401 の値が得られています。

消費電力

9.7 インチ LVDS タッチ パネルを接続し、Linaro デスクトップがアイドル状態のとき、おおよそ 5.4W 消費します。Openssl 1.0.1e のビルドを 2 つ実行すると 7.7W に上昇します。9.7 インチ LVDS スクリーンがスリープ状態で、MarS が実行状態のときは、3.3W 消費します。Glxgears がスクリーン オンで実行中のとき、8.9W 消費しているため、3D 関係は 4.5W 消費していると推定できます。
OpenGL の消費電力を見るため、Scythe USB 温度計を使用して、チップ状況を調べました。MarS 付近のテーブルは、32.4C でした。Glxgears をしばらく実行した後の CPU は、62C でした。MarS 自体に温度モニターがないか調べたところ、/sys/devices/virtual/thermal/thermal_zone0/temp というファイルがあり、glxgears 実行中に、61 になっていました。

まとめ

デュアル コア MarS ボードは、1GB RAM、Linaro 搭載後も 1GB 残すオンボード フラッシュ メモリ、および多数のヘッダー ピンを搭載しています。LVDS スクリーンは、ソフトウェアの設定が終われば問題なく使用できます。おもな問題は、Linux でのマルチタッチ入力です。ネットワーク性能を必要とするのであれば、G ビットのネットワークを持つ MarS ボードは良い選択肢です。MarS の CPU は、デュアルコアで、メモリも 1GB あり、BeagleBone Black (日本語) や Raspberry Pi と同等です。もちろん、それらよりも、高価ですが。
Linux カーネルの格納アドレスがわかり、Linaro インストール方法がわかれば、他の Linux カーネルや新しいカーネルを MarS 用に作成するのが面白くなります。今は LVDS と HDMI スクリーンの両者を一緒に使うデスクトップを構築中です。
本文献用に、ハードウエアを提供くださった element14 に感謝します。

 

 

 

Linux Foundationメンバーシップ

30人のカーネル開発者

人気コンテンツ

  1. Today's Linux 2018/07/04 2018年 7月 03日
  2. Today's Linux 2018/07/06 2018年 7月 05日
  3. Today's Linux 2018/07/09 2018年 7月 08日
  4. Today's Linux 2018/07/05 2018年 7月 04日
  5. Today's Linux 2018/07/10 2018年 7月 09日

Linux Foundationについて

Linux Foundation はLinux の普及,保護,標準化を進めるためにオープンソース コミュニティに資源とサービスを提供しています

 

The Linux Foundation Japan

サイトマップ

問い合わせ先

サイトに関するお問い合わせはこちらまで

Linux Foundation Japan

Linux Foundation

Linux Training

提案、要望

Linux.com JAPANでは広く皆様の提案、要望、投稿を受け付ける予定です。

乞うご期待!