内核驱动 w1_therm

支持的芯片

  • 基于 Maxim ds18*20 的温度传感器。

  • 基于 Maxim ds1825 的温度传感器。

  • GXCAS GX20MH01 温度传感器。

  • Maxim MAX31850 热电偶接口。

作者:Evgeniy Polyakov <johnpol@2ka.mipt.ru>

描述

w1_therm 为 ds18*20、ds28ea00、GX20MH01 和 MAX31850 设备提供基本的温度转换。

支持的家族代码

W1_THERM_DS18S20

0x10

W1_THERM_DS1822

0x22

W1_THERM_DS18B20

0x28

W1_THERM_DS1825

0x3B

W1_THERM_DS28EA00

0x42

通过 sysfs 条目 w1_slave 提供支持。每个打开和读取序列都会启动温度转换,然后提供两行 ASCII 输出。第一行包含读取的九个十六进制字节以及计算的 crc 值,以及是否匹配的 YES 或 NO。如果 crc 匹配,则保留返回的值。第二行显示保留的值,以及以毫摄氏度为单位的温度,后跟 t=。

或者,可以使用 temperature sysfs 读取温度,它仅返回以毫摄氏度为单位的温度。

可以通过在 w1_bus_master 级别向 therm_bulk_read 条目写入 trigger 来完成对总线上所有设备的批量读取。这将向总线上的所有设备发送转换命令,并且如果总线上检测到寄生供电的设备(并且模块中启用了强上拉),它将在总线上寄生供电的设备所需的较长转换时间内将线路驱动为高电平。读取 therm_bulk_read 如果没有批量转换挂起则返回 0,如果至少有一个传感器仍在转换中则返回 -1,如果转换完成但至少有一个传感器值尚未读取则返回 1。然后通过读取每个设备的 temperature 条目来访问结果温度,如果转换仍在进行中,该条目可能返回空。请注意,如果发送了批量读取,但没有立即读取一个传感器,则下次访问此设备的 temperature 将返回在发出批量读取命令时测量的温度(而不是当前温度)。

如果需要,将在转换期间应用强上拉。

conv_time 用于获取当前转换时间(读取)并对其进行调整(写入)。温度转换时间取决于设备类型及其当前分辨率。默认转换时间由驱动程序根据设备数据表设置。许多原始设备克隆的转换时间偏离了数据表规范。有三种选择:1) 通过向 conv_time 写入一个以毫秒为单位的值来手动设置正确的转换时间;2) 通过向 conv_time 写入 1 来自动测量和设置转换时间;3) 使用 features 来启用轮询以完成转换。选项 2、3 不能在寄生供电模式下使用。要恢复默认转换时间,请向 conv_time 写入 0

w1_slave 写入分辨率值(以位为单位)将更改传感器下次读取的精度。允许的分辨率由传感器定义。当传感器断电重启时,分辨率会重置。

要将当前分辨率存储在 EEPROM 中,请向 w1_slave 写入 0。由于 EEPROM 的写入次数有限 (>50k),因此应明智地使用此命令。

或者,可以使用每个设备上的专用 resolution 条目读取或写入分辨率(如果传感器支持)。

一些非正品的 DS18B20 芯片仅固定在 12 位模式下,因此从芯片读取并验证实际分辨率。

注意:更改分辨率会将转换时间恢复为默认值。

只写 sysfs 条目 eeprom_cmd 是 EEPROM 操作的替代方案。写入 save 将设备 RAM 保存到 EEPROM。写入 restore 将 EEPROM 数据恢复到设备 RAM 中。

ext_power 条目允许检查每个设备的电源状态。如果设备是寄生供电,则读取 0,如果设备是外部供电,则读取 1

Sysfs alarms 允许读取或写入 TH 和 TL(温度高和低)警报。值应以空格分隔,并且在设备范围内(典型值为 -55 摄氏度到 125 摄氏度)。值是整数,因为它们存储在设备中的 8 位寄存器中。最低值会自动放入 TL。设置后,可以在主级别搜索警报。

模块参数 strong_pullup 可以设置为 0 以禁用强上拉,设置为 1 以启用自动检测,设置为 2 以强制强上拉。在自动检测的情况下,驱动程序将使用“读取电源”命令来检查总线上是否有寄生供电的设备。如果有,它将激活主机的强上拉。如果使用此命令检测寄生设备失败(对于某些 DS18S20 似乎是这种情况),则可以强制启用强上拉。

如果启用了强上拉,则在转换发生时,将驱动主机的强上拉,前提是主驱动程序支持强上拉(或者它会回退到上拉电阻)。DS18b20 温度传感器规范列出了 1.5mA 的最大电流消耗,并且 5k 上拉电阻是不够的。强上拉旨在提供所需的额外电流。

DS28EA00 提供了额外的两个引脚来实现序列检测算法。此功能允许您确定芯片在 1-wire 总线中的物理位置,而无需预先了解总线顺序。通过 sysfs w1_seq 提供支持。该文件将包含一行整数值,表示总线中从 0 开始的设备索引。

features sysfs 条目控制每个设备的可选驱动程序设置。寄生模式下功率不足、线路噪声和转换时间不足可能会导致转换失败。原始的 DS18B20 和一些克隆允许检测无效转换。向 features 写入位掩码 1 以启用检查转换是否成功。如果转换后暂存存储器的字节 6 为 0xC 且温度读取值为 85.00(上电值)或 127.94(功率不足),则驱动程序将返回转换错误。位掩码 2 通过在转换开始后在总线上生成读取周期来启用轮询以完成转换(仅限正常电源)。在寄生供电模式下,此功能不可用。功能位掩码可以组合 (OR)。更多详细信息请参见 Documentation/ABI/testing/sysfs-driver-w1_therm

GX20MH01 设备与 DS18*20 共享家族号 0x28。该设备通常与 DS18B20 兼容。添加了配置寄存器中最低的 2-5、2-6 温度位;配置寄存器中的 R2 位,启用 13 位和 14 位分辨率。设备以 14 位分辨率模式启动。数据表中指定的转换时间太短,必须增加。该设备支持驱动程序功能 12

MAX31850 设备与 DS1825 共享家族号 0x3B。该设备通常与 DS1825 兼容。配置寄存器的高 4 位全部读取为 1,表示 15 位,但设备始终以 14 位分辨率模式运行。