第8章 Linux カーネルデバイスドライバー仕様
本章では、Armadillo-400 シリーズに固有な Linux カーネルのデバイスドライバーの仕様について説明します。
Armadillo-400 シリーズの UART ドライバーは以下の機能を有します。
7/8 bit 送受信
1/2 ストップビット
None/Odd/Even パリティ
XON/XOFF ソフトウェアフローコントロール
CTS/RTS ハードウェアフローコントロール (シリアルインターフェース1 のみ)
モデム信号コントロール (シリアルインターフェース1 のみ)
スタンダード Linux シリアル API
最大ボーレート 230.4Kbps(シリアルインターフェース1) / 4Mbps[] (シリアルインターフェース2, 3)
各シリアルインターフェースとデバイスファイルの対応を、表8.1「シリアルインターフェースとデバイスファイルの対応」に示します。
表8.1 シリアルインターフェースとデバイスファイルの対応
シリアルインターフェース | デバイスファイル |
---|
シリアルインターフェース1 |
/dev/ttymxc1
|
シリアルインターフェース2 |
/dev/ttymxc2
|
シリアルインターフェース3 |
/dev/ttymxc4
|
Armadillo-400 シリーズの Ethernet ドライバーは以下の機能を有します。
AutoNegotiation サポート
CarrierDetect サポート
Ethtool サポート
Armadillo-400 シリーズの SD/MMC/SDIO ホストドライバーは以下の機能を有します。
microSD カードスロットにカードが挿入されると、/dev/mmcblk0
として認識されます。
Armadillo-400 シリーズの USB 2.0 ホストドライバーは以下の機能を有します。
EHCI 準拠
OTG非サポート
USB High Speed ホスト × 1
USB Full Speed ホスト × 1
USB デバイスが検出されると、/dev/sd*
にマップされます。
Armadillo-440 のビデオ出力機能は、フレームバッファデバイスとして実装されています。
フレームバッファデバイスドライバーは以下の機能を有します。
Armadillo-440 液晶モデルの標準では、以下の設定になっています。
解像度 480 × 272 ピクセル
RGB 565 カラー
フレームバッファとデバイスファイルの対応を、表8.2「フレームバッファとデバイスファイルの対応」に示します。
表8.2 フレームバッファとデバイスファイルの対応
フレームバッファ | デバイスファイル |
---|
バックグラウンドプレーン |
/dev/fb0
|
グラフィックウィンドウ |
/dev/fb1
|
Armadillo-440 の LED バックライト機能は、バックライトクラスとして実装されています。
/sys/class/backlight/pwm-backlight
ディレクトリ以下のファイルによって、バックライトの制御を行うことができます。
輝度の調整は、brightness
ファイルによって行うことができます。 brightness
ファイルに 0(消灯)〜255(最高輝度)までの数値を書き込むことにより、輝度を変更することができます。
また、brightness
ファイルを読むことにより現在の輝度を知ることができます。
バックライトの点灯/消灯は、bl_power
ファイルによって行うことができます。bl_power
に 0 を書き込むと消灯になり、1 を書き込むと点灯になります。
Armadillo-440 のタッチスクリーン機能は、インプットデバイスとして実装されており、ユーザーランドとのインターフェースとしてイベントインターフェースを提供しています。
表8.3「タッチスクリーンイベント」に示すイベントが発生します。
表8.3 タッチスクリーンイベント
Type | Code | Value |
---|
EV_KEY(1) | BTN_TOUCH(330) | 0 or 1 |
EV_ABS(3) | ABS_X(0) | 100 〜 4000 |
EV_ABS(3) | ABS_Y(1) | 100 〜 4000 |
EV_ABS(3) | ABS_PRESSURE(24) | 0 or 1 |
Armadillo-440 液晶モデルの標準状態では、タッチスクリーンのイベントデバイスは /dev/input/event1
にマップされます。
| |
---|
イベントデバイスの番号は、検出された順番に割り振られます。そのため、USB キーボードなど他のインプットデバイスが起動時に検出されると、タッチスクリーンのイベントデバイス番号は変わる可能性があります。 |
Armadillo-440 のオーディオ機能は、ALSA デバイスとして実装されています。 ALSA デバイスドライバーは以下の機能を有します。
Playback(2ch) / Capture(1ch)
サンプリング周波数 48k, 32k, 24k, 16k, 12k, 8k Hz
フォーマットSigned 16/20/24 bit, Little-endian
オーディオデバイスの制御は、ALSA ライブラリ (libasound2) を通じて行うことができます。
| |
---|
Armadillo-440 のオーディオドライバーでは、録音と再生を同時に行うことはできません。 |
Armadillo-400 シリーズの GPIO は、generic GPIO として実装されています。
ユーザーランドから GPIO を操作するためのインターフェースとしては、GPIO sysfs と Armadillo-200 シリーズ互換 GPIO ドライバーの2つがあります。標準状態では GPIO sysfs ドライバーが有効になっています。
GPIO sysfsでは、/sys/class/gpio/(GPIO_NAME)
ディレクトリ以下のファイルで入出力方向の設定、出力レベルの設定、入出力レベルの取得を行うことができます。
GPIO_NAME ディレクトリと GPIOピン の対応を表8.4「GPIO_NAME と GPIO ピンの対応」に示します。
表8.4 GPIO_NAME と GPIO ピンの対応
GPIO_NAME | GPIO ピン | 初期入出力方向 | 初期出力レベル |
---|
CON9_1 | CON9 1ピン | 入力 | - |
CON9_2 | CON9 2ピン | 入力 | - |
CON9_11 | CON9 11ピン | 入力 | - |
CON9_12 | CON9 12ピン | 入力 | - |
CON9_13 | CON9 13ピン | 入力 | - |
CON9_14 | CON9 14ピン | 入力 | - |
CON9_15 | CON9 15ピン | 入力 | - |
CON9_16 | CON9 16ピン | 入力 | - |
CON9_17 | CON9 17ピン | 入力 | - |
CON9_18 | CON9 18ピン | 入力 | - |
CON9_21 | CON9 21ピン | 入力 | - |
CON9_22 | CON9 22ピン | 入力 | - |
CON9_23 | CON9 23ピン | 入力 | - |
CON9_24 | CON9 24ピン | 入力 | - |
CON9_25 | CON9 25ピン | 入力 | - |
CON9_26 | CON9 26ピン | 入力 | - |
CON9_27 | CON9 27ピン | 出力 | LOW |
CON9_28 | CON9 28ピン | 出力 | LOW |
/sys/class/gpio/(GPIO_NAME)/direction
ファイルで入出力方向の設定を行うことができます。表8.5「GPIO 入出力方向の設定」に示す設定をdirection
ファイルに書き込むことにより、入出力方向を設定します。また、direction
ファイルを読み込むことで現在の設定を知ることができます。
表8.5 GPIO 入出力方向の設定
設定 | 説明 |
---|
high | 入出力方向を出力に、出力レベルを HIGH レベルに設定します。出力レベルの取得/設定を行うことができます。 |
low | 入出力方向を出力に、出力レベルを LOW レベルに設定します。出力レベルの取得/設定を行うことができます。 |
out | low を設定した場合と同じです。 |
in | 入出力方向を入力に設定します。入力レベルの取得を行うことができます。 |
/sys/class/gpio/(GPIO_NAME)/value
ファイルで出力レベルの設定、入出力レベルの取得を行うことができます。0 が LOW レベルを、1 が HIGH レベルを意味します。
8.9.2. Armadillo-200 シリーズ互換 GPIO ドライバー
Armadillo-200 シリーズ互換 GPIO ドライバーでは、対応するデバイスファイルに対して ioctl を発行することにより、GPIO の操作および状態の取得を行うことができます。
| |
---|
Armadillo-200 シリーズ互換 GPIO ドライバーは標準状態では無効になっています。有効にするには Linux カーネルコンフィギュレーションで、CONFIG_GPIO_SYSFS を無効に、CONFIG_ARMADILLO2X0_GPIO を有効にして、カーネルをビルドする必要があります。 |
Armadillo-200 シリーズ互換 GPIO ドライバーでの GPIO 名と GPIOピンの対応を表8.6「Armadillo-200 シリーズ互換 GPIO ドライバー GPIO 一覧」に示します。
表8.6 Armadillo-200 シリーズ互換 GPIO ドライバー GPIO 一覧
GPIO 名 | GPIO ピン | 初期入出力方向 | 初期出力レベル |
---|
GPIO0 | CON9 21ピン | 入力 | - |
GPIO1 | CON9 22ピン | 入力 | - |
GPIO2 | CON9 23ピン | 入力 | - |
GPIO3 | CON9 24ピン | 入力 | - |
GPIO4 | CON9 25ピン | 入力 | - |
GPIO5 | CON9 26ピン | 入力 | - |
GPIO6 | CON9 27ピン | 出力 | LOW |
GPIO7 | CON9 28ピン | 出力 | LOW |
GPIO8 | CON9 11ピン | 入力 | - |
GPIO9 | CON9 12ピン | 入力 | - |
GPIO10 | CON9 13ピン | 入力 | - |
GPIO11 | CON9 14ピン | 入力 | - |
GPIO12 | CON9 15ピン | 入力 | - |
GPIO13 | CON9 16ピン | 入力 | - |
GPIO14 | CON9 17ピン | 入力 | - |
GPIO15 | CON9 18ピン | 入力 | - |
| |
---|
Armadillo-200 シリーズ互換 GPIO ドライバーでの GPIO 名と対応する GPIO ピンの位置は、Armadillo-200 シリーズと同じになっています。そのため、Armadillo-200 シリーズ互換 GPIO ドライバーではArmadillo-400 シリーズで使用可能な GPIO のうち、一部だけしか操作することができません。
|
デバイスファイルのパラメータは、以下の通りです。
表8.7 Armadillo-200 シリーズ互換 GPIO ドライバーデバイスファイル
タイプ | メジャー番号 | マイナー番号 | デバイスファイル |
---|
キャラクタデバイス | 10 | 185 | /dev/gpio |
ioctl の第1引数には、デバイスファイルのファイルディスクリプタを指定します。第2引数には、GPIOを操作するためのコマンドを指定します。
表8.8 Armadillo-200 シリーズ互換 GPIO ドライバー ioctl コマンド
コマンド | 説明 | 第3引数のType |
---|
PARAM_SET | 第3引数で指定する内容でGPIOの状態を設定します | struct gpio_param |
PARAM_GET | 第3引数で指定する内容でGPIOの状態を取得します | struct gpio_param |
INTERRUPT_WAIT | 第3引数で指定する内容でGPIOの割込みが発生するまでWAITします | struct wait_param |
第3引数には、(カーネルソース)/include/linux/armadillo2x0_gpio.h
に定義されている構造体「struct gpio_param」と「struct wait_param」を使用します。「struct gpio_param」は単方向リストになっているので、複数の GPIO を一度に制御する場合は next メンバを使用してください。また、リストの最後の next メンバには"0(NULL)"を指定してください。GPIO デバイスドライバーの詳細な使用方法については、GPIO 操作アプリケーション(atmark-dist/vendors/AtmarkTechno/Armadillo-440/gpioctrl
)のソースコードを参考にしてください。
Armadillo-400 シリーズの LED ドライバーは、LED クラスドライバーと Armadillo-200 シリーズ互換 LED ドライバーの2つがあります。標準状態では、LED クラスドライバーが有効になっています。
/sys/class/leds/(LED_NAME)
ディレクトリ以下のファイルによって、LED の制御を行うことができます。
点灯/消灯の制御は、/sys/class/leds/(LED_NAME)/brightness
ファイルによって行うことができます。 brightness
ファイルに 0を書き込むと消灯、0以外の数値を書き込むと点灯となります。
LED クラスでは、点滅などの制御はトリガーという仕組みを使用して行います。Armadillo-400 シリーズでは、mmc0、timer、heartbeat、default-on のトリガーを使用することができます。各文字列を、/sys/class/leds/(LED_NAME)/trigger
ファイルに書き込むことでトリガーが有効になります。
mmc0 トリガーを有効にすると MMC/SD カードへの読み書きに連動して LED が点灯/消灯します。
timer トリガーにより、指定した周期で LED を点滅させることができます。 timer トリガーを有効にすると、新しく /sys/class/leds/(LED_NAME)/delay_on
と /sys/class/leds/(LED_NAME)/delay_off
ファイルが作成されます。それぞれのファイルに点灯時間[msec]と消灯時間[msec]を書き込むことで LED が点滅します。
heartbeat トリガーを有効にすると、鼓動のように LED が点滅します。
default-on トリガーを有効にすると、点灯状態で起動します。
LED_NAMEと対応する LED の一覧を表8.9「LED 一覧」に示します。
表8.9 LED 一覧
LED_NAME | 対応する LED | デフォルトトリガー |
---|
red | LED3 | なし |
green | LED4 | default-on |
yellow | LED5 | なし |
8.10.2. Armadillo-200 シリーズ互換 LED ドライバー
Armadillo-200 シリーズ互換 LED ドライバーでは、対応するデバイスファイルに対して ioctl を発行することにより、LED の操作を行うことができます。
| |
---|
Armadillo-200 シリーズ互換 LED ドライバーは標準状態では無効になっています。有効にするには Linux カーネルコンフィギュレーションで、CONFIG_LEDS_GPIO を無効に、CONFIG_ARMADILLO2X0_LED を有効にして、カーネルをビルドする必要があります。 |
LED に対応するデバイスファイルのパラメータは、以下の通りです。
表8.10 LEDノード
タイプ | メジャー番号 | マイナー番号 | デバイスファイル |
---|
キャラクタデバイス | 10 | 215 | /dev/led |
ioctl の第1引数には、デバイスファイルのファイルディスクリプタを指定します。第2引数には、LED を操作するためのコマンドを指定します。
表8.11 LED操作コマンド
コマンド | 説明 | 第3引数のType |
---|
LED_RED_ON | LED3(赤)を点灯します | なし |
LED_RED_OFF | LED3(赤)を消灯します | なし |
LED_RED_STATUS | LED3(赤)の点灯状態を取得します | 状態を保存するバッファ(最小1バイト) |
LED_RED_BLINKON | LED3(赤)の点滅を開始します | なし |
LED_RED_BLINKOFF | LED3(赤)の点滅を停止します | なし |
LED_RED_BLINKSTATUS | LED3(赤)の点滅状態を取得します | 状態を保存するバッファ(最小1バイト) |
LED_GREEN_ON | LED(緑)を点灯します | なし |
LED_GREEN_OFF | LED4(緑)を消灯します | なし |
LED_GREEN_STATUS | LED4(緑)の点灯状態を取得します | 状態を保存するバッファ(最小1バイト) |
LED_GREEN_BLINKON | LED4(緑)の点滅を開始します | なし |
LED_GREEN_BLINKOFF | LED4(緑)の点滅を停止します | なし |
LED_GREEN_BLINKSTATUS | LED4(緑)の点滅状態を取得します | 状態を保存するバッファ(最小1バイト) |
LEDデバイスドライバーの詳細な使用方法については、サンプルのLED制御アプリケーション(atmark-dist/vendors/AtmarkTechno/Armadillo-440/ledctrl
)のソースコードを参考にしてください。
Armadillo-400 シリーズでは、ボタン入力はインプットデバイスとして実装されており、ユーザーランドとのインターフェースとしてイベントインターフェースを提供しています。
Armadillo-440 液晶モデルでは、Armadillo-440 本体にオンボードタクトスイッチ× 1と、LCD 拡張ボードにボタン× 3が実装されています。
それぞれのボタンに対するイベントを、表8.12「Armadillo-440液晶モデルボタンイベント」に示します。
表8.12 Armadillo-440液晶モデルボタンイベント
ボタン | Type | Code | Value |
---|
SW1 | EV_KEY(1) | KEY_ENTER(28) | 0 or 1 |
LCD_SW1 | EV_KEY(1) | KEY_BACK(158) | 0 or 1 |
LCD_SW2 | EV_KEY(1) | KEY_MENU(139) | 0 or 1 |
LCD_SW3 | EV_KEY(1) | KEY_HOME(102) | 0 or 1 |
Armadillo-440 液晶モデルの標準状態では、ボタンのイベントデバイスは /dev/input/event0
にマップされます。
| |
---|
イベントデバイスの番号は、検出された順番に割り振られます。そのため、USB キーボードなど他のインプットデバイスが起動時に検出されると、ボタンのイベントデバイス番号は変わる可能性があります。 |
Armadillo-440 LCD 拡張ボード及びArmadillo-400 RTC オプションモジュールには、リアルタイムクロックが搭載されています。
リアルタイムクロックは、/dev/rtc0
として認識されます。Armadillo-440 液晶モデルに RTC オプションモジュールを接続した場合、RTC オプションモジュールのリアルタイムクロックが /dev/rtc0
となり、LCD 拡張ボードのリアルクロックは /dev/rtc1
として認識されます。
Armadillo-400 シリーズで採用している i.MX25 プロセッサは、内蔵ウォッチドッグタイマーを有しています。
Armadillo-400 シリーズの標準ブートローダーでは、起動直後にこの内蔵ウォッチドッグタイマーを有効にします。標準状態でのタイムアウト時間は 10 秒に設定されます。
Linux カーネルでは、自動でウォッチドッグタイマーをキックします。
もし、何らかの要因で Linux カーネルがフリーズしてウォッチドッグタイマーをキックできなくなりタイムアウトが発生すると、システムリセットが発生します。
Armadillo-400 シリーズは Linux パワーマネジメントのスリープ機能をサポートします。スリープ状態では、アプリケーションの実行は一時停止し、カーネルはサスペンド状態となります。スリープ状態では外部デバイスの動作を停止するため、消費電力を抑えることができます。スリープ状態から実行状態に復帰すると、カーネルのリジューム処理が行われた後、アプリケーションの実行を再開します。
/sys/power/state
ファイルに、standby もしくは mem を書き込むことにより、スリープモードへ移行することができます。また、スリープモード中にウェイクアップ要因による割り込みが発生すると、スリープモードから実行状態へ復帰します。
各モードによる、状態の違いは表8.13「スリープモード」を参照してください。power-on suspend 状態に比べ、suspend-to-RAMの方がより少ない消費電力でスリープすることができます。
表8.13 スリープモード
スリープモード | state ファイルに書き込む文字列 | i.MX25 パワーモード | ウェイクアップ要因 |
---|
power-on suspend | standby | Doze モード | シリアル入力、タッチスクリーン入力、ボタン入力 |
suspend-to-RAM | mem | Stop モード | ボタン入力 |
ウェイクアップ要因になることができるデバイスを、ウェイクアップ要因にするかどうかは、各デバイスに対応する sysfs エントリの power/wakeup
ファイルで指定することができます。power/wakeup
ファイルに enabled と書き込むとウェイクアップ要因になり、 disabled と書き込むとウェイクアップ要因ではなくなります。
表8.14「ウェイクアップ要因の指定」を参照してください。
表8.14 ウェイクアップ要因の指定
デバイス | sysfs ファイル | 初期状態 |
---|
シリアルインターフェース1 | /sys/devices/platform/mxcintuart.1/tty/ttymxc1/power/wakeup | enabled |
シリアルインターフェース2 | /sys/devices/platform/mxcintuart.2/tty/ttymxc2/power/wakeup | disabled |
シリアルインターフェース3 | /sys/devices/platform/mxcintuart.4/tty/ttymxc4/power/wakeup | disabled |
タッチスクリーン | /sys/devices/platform/imx_adc.0/power/wakeup | enabled |
ボタン | /sys/devices/platform/gpio-keys.0/power/wakeup | enabled |
8.14.1. スリープ中の外部デバイスの扱いについて
Armadillo-400 シリーズでは、サスペンド処理で外部デバイスへの電源供給を全て停止します。
そのため、USB デバイスはスリープ状態に移行する前に、安全に取り外しができる状態にしておく必要があります。すなわち、USB メモリは umount しておく必要があります。リジューム時にデバイス検出が再度行われるため、USB デバイスはスリープ中に抜き差しすることができます。
一方で、microSD カードは、mount したままでスリープ状態に移行することができます。これを可能にするために、SD ホストドライバーではリジューム時にプローブ処理を行わず、同じカードが挿入されているものとして扱います。そのため、スリープ中に microSD の抜き差しを行うことはできません。
Ethernet デバイスは実行状態に復帰後、ケーブルを抜き差ししたときと同様の処理が行われるため、Auto-negotiation が有効になっている場合、リジューム後に Auto-negotiation が行われます。
初期状態の設定では、+3.3V_IO 出力はスリープ時に停止します。しかし、シリアルポート 2 および 4 をウェイクアップ要因に指定した場合、スリープ時も +3.3V_IO 出力が供給されます。