私はRaspberry Pi b +を持っていて、このドライバbcm2835_Thermal.cを介してLinuxカーネルファイルのCPU温度を読みたいです。https://github.com/raspberrypi/linux/blob/rpi-4.19.y/drivers/Thermal/broadcom/bcm2835_Thermal.c。
しかし、このドライバがどのように機能するかを理解するのは難しいです。私の質問は次のとおりです。このドライバコードの呼び出しチェーンは何ですか?温度を取得するには、Linuxファイルでプローブ関数とget_temp関数を呼び出す必要がありますか?
どんな助けでも大変感謝します。
ベストアンサー1
ドライバはLinuxカーネルモジュールで、#include <linux/module.h>
開始とMODULE_*
終了の3行で識別されます。
この関数はbcm2835_thermal_probe()
そのドライバ.probe
内の要素としてリストされているため、ドライバがロードstatic struct platform_driver
されたときにドライバがそのハードウェアに適していることを確認し、その場合はドライバを初期化するためにプローブ機能が自動的に呼び出されることがわかります。bcm2835_thermal_get_temp
できる機能として登録されます。
行#221には呼び出しがあるため、thermal_zone_of_sensor_register()
検出器の出力が下のどこかで利用可能である必要があるとします/sys/class/thermal
。登録関数は、ホットゾーンAPIを介して呼び出すことができるとリストされているドライバ関数bcm2835_thermal_ops
(単一bcm2835_thermal_get_temp()
の関数)を登録します。bcm2835_thermal_ops.get_temp()
ドライバーbcm2835_thermal_debugfs()
には。debugfs
bcm2835_thermal
debugfs
mount -t debugfs none /sys/kernel/debug
ドライバモジュールが正常にロードされ初期化されたら、必要に応じて/sys/kernel/debug/bcm2835_thermal/
ユーザースペースから直接そのセンサーのレジスタにアクセスできるディレクトリといくつかのファイルが必要です。
簡単に言えば、ドライバはカーネルの既存のホットスポットとdebugfs APIに接続され、デバイスツリーはポーリング間隔情報を提供し、ホットスポットサブシステムは自動的に温度を更新します。
ユーザー空間コードに温度情報が必要な場合は、上記のsysfsディレクトリにある必要があります。
カーネルコードで必要な場合は、struct thermal_zone_device
デバイスツリーで適切な温度を見つけ、構造内の適切なセンサーサブ要素から現在の温度を読み取るか、get_temp()
絶対アップが必要な場合はその関数を明示的に呼び出すことができます。 - 最新のマイクロ秒単位の正確な情報。私は実際にカーネルプログラマーではないので、ここで間違っている可能性があります。