如何使用平台驱动程序

如何使用平台驱动程序

我有一个树莓派 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()如果需要绝对向上,则显式调用其函数 -精确到微秒的最新信息。我在这里很可能是错的,因为我并不是真正的内核程序员。

相关内容