Linux デバイスドライバーのためのピン制御サブシステムをマスターする
編集者注:組み込み Linux が IoT のバックボーンになりつつある中、デバイスドライバーはアプリケーションとハードウェアの橋渡しです。『Linux Device Drivers Development』の著者 John Madieu が、これらのドライバー構築のための詳細でコード豊富なガイドを提供します。
この抜粋は書籍の第 14 章で、カスタムハードウェアをカーネルとインターフェースする必要がある開発者にとって重要な領域であるピン制御と GPIO に焦点を当てています。第 1 回はピン制御サブシステムを紹介します。
『Linux Device Drivers Development』by John Madieu より翻案。
第 14 章. ピン制御と GPIO サブシステム
By John Madieu
組み込み Linux では、ドライバーはほぼ常に GPIO とやり取りするか、ピン多重化を設定します。「ピン」はコンポーネントの物理出力ラインであり、多くの SoC が同じピンを複数の機能で再利用します。例えば、i.MX6QDL のピン MX6QDL_PAD_SD3_DAT1 は、SD データライン、UART RTS/CTS ライン、FlexCAN Rx ライン、または汎用 GPIO として機能できます。
ピンの機能を選択するプロセスを ピン マルチプレクシング(ピン マキシング) と呼び、これを調整するカーネルコンポーネントが ピン コントローラ です。この章の第 2 部では、一般的なピン機能である汎用入出力(GPIO)サブシステムを探ります。
この章では以下を学びます:
- ピン制御サブシステムを歩き、デバイスツリーでピン制御ノードを宣言する方法を学ぶ
- レガシーな整数ベース GPIO API と新しいディスクリプタベース インターフェースを比較
- 割り込みとしても使用される GPIO を処理
- GPIO 管理専用の sysfs インターフェースを探索
ピン制御サブシステム
pinctrl サブシステムはピン多重化と設定を管理します。特定のピン配置を必要とするデバイスは、その配置をデバイスツリーで記述する必要があります。ピンコントローラドライバーはこれらの記述を解析し、SoC の I/O コントローラをそれに従ってプログラムします。
このサブシステムは以下を提供します:
- ピン多重化 — 単一ピンを複数の役割(UART TX、GPIO、HSI など)でグループ単位またはピン単位で再利用
- ピン設定 — プルアップ/プルダウン、ドライブ強度、デバウンスなどの電気的特性を設定
この書籍はピンコントローラ API の使用に焦点を当てており、ピンコントローラドライバー自体の作成は扱いません。
Pinctrl とデバイスツリー
デバイスツリーでは、ピンコントローラノードがすべての利用可能なピングループと機能を記述します。各グループには整数 ID が割り当てられ、オプションで人間が読める名前を ID にマッピングする pinctrl-name が付随します。
デバイスのバインディングは、必要なピン状態を指定します。2 つのプロパティがデバイスをピン状態にリンクします:
pinctrl-— ピン設定ノードを指すファンドルのリスト。複数エントリで、デバイスを複数のピンコントローラで設定したり、単一コントローラで複数ノードを組み合わせたりできます。pinctrl-name— 各状態 ID に名前を割り当てる並列リスト。状態 0 は通常defaultと命名され、include/linux/pinctrl/pinctrl-state.hで定義される標準リストに従います。
以下は、2 つのデバイスのピン設定を示す典型的なデバイスツリー抜粋です:

各行は <PIN_FUNCTION> <PIN_SETTING> 形式に従います:
MX6QDL_PAD_DISP0_DAT15__GPIO5_IO09 0x80000000
MX6QDL_PAD_EIM_D25__UART3_RX_DATA 0x1b0b1
最初のトークン(MX6QDL_PAD_DISP0_DAT15__GPIO5_IO09)がピン機能を特定し、2 番目のトークン(0x80000000)が設定ビット(プルアップ/ダウン、ドライブ強度など)をエンコードします。これらのマクロは arch/arm/boot/dts/imx6q-pinfunc.h などのアーキテクチャ固有ヘッダーファイルで定義されます。
ドライバーコードでピン状態をプログラムするには、初期化時(通常は probe())に以下の手順を実行します:
struct pinctrl *pinctrl;
pinctrl = devm_pinctrl_get_select_default(&pdev->dev);
if (IS_ERR(pinctrl))
dev_warn(&pdev->dev, "pins are not configured from the driver");
ヘルパー pinctrl_get_select_default() は自動的に default 状態を取得して適用します。デバイスが init 状態を提供する場合、コアは probe() 前にその状態を適用し、その後ドライバーが変更しない限り default に戻ります。
終了時は pinctrl_put(pinctrl) またはリソース管理版 devm_pinctrl_put(pinctrl) でコントローラを解放します。
am335x-evm.dts ファイルからの具体例:
dcan1: d_can@481d0000 {
status = "okay";
pinctrl-names = "default";
pinctrl-0 = <&d_can1_pins>;
};
対応するドライバーでは:
pinctrl = devm_pinctrl_get_select_default(&pdev->dev);
if (IS_ERR(pinctrl))
dev_warn(&pdev->dev, "pins are not configured from the driver");
ドライバーの probe() が実行される頃には、default ピン設定がすでに適用されています。
次の回では GPIO サブシステムを詳細に扱います。
Packt Publishing の許可を得て再録。Copyright © 2017 Packt Publishing
John Madieu はパリ拠点の組み込み Linux およびカーネルエンジニアです。自動化、輸送、医療、エネルギー、防衛分野のクライアント向けにドライバーと BSP を開発。EXPEMB で勤務し、コンピュータ・オン・モジュール設計のパイオニアとして、知識共有がイノベーションを加速すると信じるアクティブなオープンソース推進者です。
モノのインターネットテクノロジー
- 産業用 IoT システムがサイバー攻撃の標的にされる理由とその防御策
- 将来展望:生産卓越性に向けた産業用IoTの推進
- コネクテッドカーの主導権は誰に?──ドライバー視点からの洞察
- 組み込みIoTシステムを保護する6つの実証済みステップ
- 製品開発におけるSaaS採用急増:主要ハードルと機会 — パート2
- SaaS導入が製品開発でティッピングポイント到達-PTCの洞察
- 理想的なIoT開発パートナーの選び方:主要課題と解決策
- 産業用PC:IIoT革命における複雑制御の要
- エンタープライズIoT成功の鍵:Nokiaエキスパートの洞察
- IoTがWebアプリ設計・開発に革命をもたらす理由
- 象牙からベークライトへ:現代プラスチックの進化をたどる