序文:
GPIO は私たちの仕事の開発で非常に頻繁に使用されますが、Linux 開発では GPIO に精通し、理解する必要があります。Linux カーネルには、対応するサブシステム pinctrl サブシステムも提供されていますが、この記事ではそれを大きな観点から理解します。
参考学習:Linuxノート教師コース(Pinctrlサブシステム)
https://live.csdn.net/v/219059?spm=1001.2014.3001.5501
https://xuesong.blog.csdn.net/article/details/109522945?spm=1001.2014.3001.5502
https://blog.csdn.net/qq_33487044/article/details/123468166
https://blog.csdn.net/qq_33487044/article/details/110010020
この段階では、まずここを学習し、この部分の内容を具体的な例と組み合わせて、より深い学習と理解を練習します。
1. Pinctrl サブシステムの概要
gpio ピンは通常の入出力ポートとして使用されるほか、他のコントローラーと接続する機能もあります。ただし、ピンの機能割り当てと機能構成は面倒な作業です。この問題を解決するにはどうすればよいでしょうか?
Pinctrl サブシステムは、上記の問題を解決するもので、本体の設定は 2 種類あり、1 つは機能選択で、iic、uart、または通常の gpio として使用できます。もう 1 つは gpio の機能構成、つまりプルアップ、プルダウン、駆動能力、速度の構成です。
要約すると、Linux Pinctrl サブシステムによって提供される機能は次のとおりです。
- システム内のすべての制御可能なピンを管理します。システムの初期化時に、すべての制御可能なピンを列挙し、これらのピンを識別します。
- これらのピンの多重化を管理します (多重化)。SOC の場合、そのピンを通常の GPI0 として構成することに加えて、いくつかのピンで特定の機能を持つピン グループを形成することもできます。すべてのピン グループを管理するピン制御サブシステム。
- これらのピンの特性を設定します。たとえば、ピンのプルアップ抵抗とプルダウン抵抗を有効または無効にし、ピンのドライバ強度を構成します。
2 番目に、Pinctrl の特定のフレームワーク
Pinctrl のドライバー モジュール全体は 4 つの部分に分割できます。
- pinctrl API: 上位レベルのユーザーに提供されるインターフェース
- pinctrl 共通フレームワーク: 上位ユーザーに提供されるインターフェース
- pinctrl ドライバー: プラットフォームが実装する必要があるドライバー
- ボード構成: デバイスのピン構成情報。
- Pinctrl コアには、デフォルト、スリープ、アイドルの 3 つの状態があることがわかります。システムが正常に動作しているときは、最初はデフォルト設定に従うか、アイドル状態になります。システムがスリープ状態に入ると、電力消費を節約するために、デバイス ピンの別の設定セットが必要になります。
- Pinctrl フレームワークは主に pinstate、pinmux、pinconfig の 3 つの関数を扱います。マッピング関係は上図に示されています。
3. Pinctrl dts の設定例
uart0_pins: uart0-pins {
pins = "18", "19";
function = "uart0";
};
uart0_sleep_pins: uart0-pins {
pins = "18", "19";
function = "gpio";
};
...
&uart0 {
pinctrl-names = "default","sleep";
pinctrl-0 = <&uart0_pins>;
pinctrl-1 = <&uart0_sleep_pins>;
status = "okay";
};
pinctrl-0 は上記の uart0 ピンに対応し、ピンはピン 18 および 19 に対応する uart 機能として設定されます。pinctrl-1 は上記の uart0_sleep_pins に対応し、システムがスリープに入ると、ここのピンは gpio 機能として設定されます。