我有一个树莓派 b+,想通过这个驱动程序 bcm2835_Thermal.c 读取 Linux 内核文件中的 CPU 温度https://github.com/raspberrypi/linux/blob/rpi-4.19.y/drivers/Thermal/broadcom/bcm2835_Thermal.c。
但我很难理解这个驱动程序是如何工作的。这是我的问题:这个驱动程序代码中的调用链是什么?我应该在Linux文件中调用probe函数和get_temp函数来获取温度吗?
任何帮助将不胜感激。
答案1
该驱动程序是一个 Linux 内核模块,由#include <linux/module.h>
开头和MODULE_*
结尾的三行标识。
该bcm2835_thermal_probe()
函数被列为该驱动程序.probe
中的元素static struct platform_driver
,因此据我了解,在加载驱动程序时会自动调用探测函数,以确定该驱动程序是否适用于该硬件,如果适用则初始化该驱动程序是。它将注册bcm2835_thermal_get_temp
为可以的函数
在第 #221 行,有一个对 的调用thermal_zone_of_sensor_register()
,所以我认为探测器的输出应该在 下的某个位置可用/sys/class/thermal
。注册函数将列出的驱动程序函数bcm2835_thermal_ops
(仅一个,bcm2835_thermal_get_temp()
作为bcm2835_thermal_ops.get_temp()
函数)注册为可通过热区域 API 调用。
该驱动程序还有一个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()
如果需要绝对向上,则显式调用其函数 -精确到微秒的最新信息。我在这里很可能是错的,因为我并不是真正的内核程序员。