思うところあってLinuxの組み込み応用を学んでみたくなったので、学習用の教材としてAtmelのSAMA5D3 Xplainedボードを購入しました。
低価格のボードですが、円安のためdigikeyで1万円チョイかかりました。
スペック
ここ数年よく見かける「Linuxが移植されたARM v7a SoC マイコンボード」の一つです。この手のボードはいろいろな目的で開発されていますが、SAMA5D3 XplainedはAtmelのSoCマイコンの販売促進用に開発されたようです。ボードのスペックは以下のような感じです。
- SAMA5D36 SoCマイコン
- Cortex-A5 536MHz シングルCPU
- I 32kB/D 32kBキャッシュ
- VFPU搭載。NEON無し
- 256MB DDR2
- 256MB NAND Flash
- 3x USBコネクタ(2Host + 1Device)
- 1x SD/eMMCスロット。microSDのパターンはあるが、スロットは未実装
- Arduino R3シールド互換拡張ヘッダー
- 2x Ethernetコネクタ
- 2x ユーザーLED
- 1x ユーザー・プッシュボタン・スイッチ
中核となるSAMA5D36は最近のSoCマイコンらしく何でもかんでも内蔵しており、周辺チップが非常に少ないボードになっています。搭載されている周辺ICとしては
- 電源コンパニオン・チップACT8865
- NAND Flash
- SDRAM x2
- Ethernet Phy x2
- USB Hub
くらいのものです。そのほか回路図上には
- SPI Flash
- 1 wire EEPROM x2
を見ることが出来ますが、基板には実装されていません。
通電
同梱のマイクロUSBケーブルをつかってPCと接続すると、USB電源で起動します。工場出荷状態ではLinuxがすでにNAND Flashに焼かれていますので、特に苦も無く起動します。Ubuntuの場合は /dev/ttyACMx、Windowsの場合はCOMxを通じて端末を接続できますので、kermitなりTeratermで接続してください。通信回線は115200baud, 8bit, 1 stop bit, non-parityです。
ログインアカウントはrootで、パスワードはありません。
この状態で、基板上の青色LED(D2)が2回光って一回休むという、少し変った点滅をしています(レールの継ぎ目が「ガタンガタン」と音を立てるテンポ)。
回路図上ではこのD2がユーザーLEDであり、隣の赤色LED(D3)が電源LED件ユーザーLEDです。各種ドキュメントをあさるとD3は電源投入と同時に点灯するはずですが、このような気配はみじんもありません。困ったものです。
LEDを操作する
SAMA5D3に搭載されているLinuxでは、LEDを操作するには/sys/class/leds/d2および/sys/class/leds/d3を使用します。
root@sama5d3_xplained:~# cd /sys/class/leds/d3
root@sama5d3_xplained:/sys/class/leds/d3# ls
brightness device max_brightness power subsystem trigger uevent
/sys/class/leds/d3はsysfsとして実装されたLEDの操作用デバイス・ファイルです。いくつかのファイルとディレクトリがありますがまず扱うべきはbrightnessです。このファイルに1を書き込むとLEDが点灯し、0を書き込むとLEDが消灯します。
echo 1 > brightness
echo 0> brightness
次に電源投入時から点滅しているD2を見てみましょう。D2を点滅させているのはタスクでは無く、D2自身の設定です。
root@sama5d3_xplained:/sys/class/leds/d3# cd /sys/class/leds/d2
root@sama5d3_xplained:/sys/class/leds/d2# cat trigger
none nand-disk timer [heartbeat] gpio mmc0 mmc1
/sys/class/leds/LED名/triggerは、LEDを点灯させる条件を指定します。catで内容を表示すると、可能な選択肢の一覧が表示され、そのうち現在選択中のものが[]でくるまれて表示されます。D2は[heartbeat]となっており、つまり電源投入時からのLEDの点滅パターンは「心臓の音」のつもりなのでした。
点滅は以下のコマンドを実行すると停止します。
echo none > trigger
まとめ
当初LEDは/sys/class/gpioで操作するものだと思っていたため、思いの外時間が掛かりました。ファイルシステム上にマッピングしたデバイス操作は、Unixらしい重々しい統一感を感じさせます。