hwmon/Thermal サブシステムの一部として UART から取得した温度データを使用します。

hwmon/Thermal サブシステムの一部として UART から取得した温度データを使用します。

組み込みLinuxを実行している製品にOEMモジュールを統合しようとしています。 UARTを介してのみモジュールと通信でき、モジュールから取得する必要がある最も重要な情報は温度です。

このシステムはARMベースのシステムであり、I2C温度センサーとファン、デバイスツリーを使用して熱設計を行い、すべてがうまく機能します。このモジュールを追加すると、状況が厳しくなり始めます。 OEMモジュールは、特定のシステムに存在する場合とない場合があるオプションです。ハードウェアは、OEMモジュールの存在を検出し、適切なカーネルモジュール/デバイスツリーオーバーレイをロードして、取り付けられているハードウェアの熱管理を有効にする必要があります。

ここで難しいのは、UARTを介して通信するサーマルセンサーがないようです。 SPI用のドライバが見つかりました(LM70)、I2C(LM75)と1行(DS18S20)温度センサーですが、Linuxサーマルサブシステムで非同期シリアルを使用する先例はありません。

私の元の計画は、ユーザー空間の温度を読み取り、それを熱サブシステムに書き込むことでした。カーネル構成でset_emul_tempを有効にしない限り、これは許可されません(適切な理由で)。私は、ユーザー空間コードがすべての温度センサーに書き込まれるようにするため、システムの実際の温度を無視したくないので、他の戦略を追求しています。

計画 2 は、書き込み可能な属性を使用して hwmon サブシステムに「プラグイン」するカーネルモジュールを作成することです。これにより、より高い温度センサーを使用してファンを制御するように熱制御方式を構成できます。マルウェアが OEM モジュールの温度制御を無視している場合、オンボード I2C センサーは依然として正しく読み取られ、温度の読み取りに応じてファンが動作します。これについてもっと詳しく見ると、これが可能かどうかはわかりませんでした。

最後の計画は、カーネルモジュールとユーザースペースTTYドライバ間でUARTを共有する方法を見つけることです。カーネルモジュールは、温度値(4バイト@〜900kボード)にアクセスしたときにhwmonに自分自身を登録し、デバイスドライバロックを取得できるため、温度をサンプリングしないときにユーザースペースアプリケーションで使用できるようにデバイスを開いたままにすることができます。温度値のリフレッシュ期間は重要ではありません。温度が毎秒更新される限り、デバイスを使用するユーザースペースアプリケーションに大きな問題はありません。システムとOEMモジュール間のすべての転送は比較的発生します。小さい(> 500B)。

私は次のいくつかの素晴らしいガイドに基づいてカーネルモジュールの開発を始めました。ロバートW.オリバー2世そしてデリック・モロイ。これにより、後で使用するために記録された値を含むモジュールを作成できます。私が達成したい次のタスクは、これをhwmonに統合する方法です。私をここに連れて行ってくださいLinuxハードウェア監視カーネルAPI

私が経験している問題は、私のcharデバイスに親デバイスがないようで、呼び出すことができないことですdevm_hwmon_device_register_with_info。また、hwmonデバイスとcharデバイスとして登録できないようです。今すぐ内部で呼び出すために、module_platform_driver私のドライバをプラットフォームドライバとして登録することを検討しています。書けなくてもhwmonに「デバイス」が登録されている地点まで行けそうです。devm_hwmon_device_register_with_info.probe()

ユーザー空間でデバイスに書き込む方法がないので、モジュールの一部としてシリアルポートと直接インタフェースする必要があると思いました。これは、I2CやSPIよりもあまり定義されていないように見えるため、より混乱します。私は指示を受けましたロックの本そして、ラインルールはここで考えられる解決策ですが、正しいパスではない場合は調査することを躊躇します。

私がリストした制限を考慮すると、私のオプションの中に正しいパスがあると思いますか?前にもこんなことがありましたか?私よりも先にこの問題を解決した人がいるという証拠が見つからなかったので、カーネル設計に合った詳細を探そうとしています。単にファン速度をより高い速度で無視することができればと思いますが、この機能はユーザースペースでロックされているようです(やはり妥当な理由があります)。

関連情報