1-Wire (w1) 子系统简介

1-wire 总线是一种简单的主从总线,通过单根信号线(加上地线,所以是两根线)进行通信。

设备通过开漏输出将信号拉低到地,并采样信号线的逻辑电平来在总线上进行通信。

w1 子系统提供了管理 w1 主设备和与从设备通信的框架。

所有 w1 从设备都必须连接到 w1 总线主设备。

示例 w1 主设备

  • DS9490 usb 设备

  • W1-over-GPIO

  • DS2482 (i2c 到 w1 的桥接器)

  • 模拟设备,例如 RS232 转换器、并行端口适配器等

w1 子系统做什么?

当 w1 主驱动程序向 w1 子系统注册时,会发生以下情况

  • 创建该 w1 主设备的 sysfs 条目

  • 定期搜索 w1 总线上的新从设备

当在总线上找到设备时,w1 核心会尝试加载其系列的驱动程序并检查是否已加载。 如果已加载,则将系列驱动程序附加到从设备。 如果该系列没有驱动程序,则会分配默认驱动程序,该驱动程序允许执行几乎任何类型的操作。 每个逻辑操作本质上都是一个事务,其中可以包含几个(两个或一个)低级操作。 让我们看看如何读取 EEPROM 上下文:1. 必须写入控制缓冲区,即包含命令字节和两个字节地址的缓冲区。 在此步骤中,总线会被重置,并使用 W1_SKIP_ROM 或 W1_MATCH_ROM 命令选择适当的设备。 然后将提供的控制缓冲区写入导线。 2. 读取。 这将发出读取 eeprom 响应。

在 1 和 2 之间,w1 主线程可能会重置总线以进行搜索,并且从设备甚至会被移除,但在这种情况下,将读取 0xff,因为没有选择任何设备。

W1 设备系列

从设备由为 w1 设备系列编写的驱动程序处理。

系列驱动程序填充一个 struct w1_family_ops(请参阅 w1_family.h)并向 w1 子系统注册。

当前系列驱动程序

w1_therm
  • (ds18?20 热传感器系列驱动程序)提供温度读取功能,该功能绑定到上述 w1_family_ops 结构的 ->rbin() 方法。

w1_smem
  • 用于简单 64 位存储单元的驱动程序提供 ID 读取方法。

您可以通过读取相应的 sysfs 文件来调用上述方法。

w1 主驱动程序需要实现什么?

w1 总线主驱动程序必须至少提供两个函数。

模拟设备必须提供设置输出信号电平 (write_bit) 和采样信号电平 (read_bit) 的能力。

本机支持 1-wire 的设备必须提供写入和采样一位 (touch_bit) 以及重置总线 (reset_bus) 的能力。

大多数硬件都提供更高层次的功能,可以卸载 w1 处理。 有关详细信息,请参阅 w1.h 中的 struct w1_bus_master 定义。

w1 主 sysfs 接口

<xx-xxxxxxxxxxxx>

找到的设备的目录。 格式为 family-serial

bus

(标准) 指向 w1 总线的符号链接

driver

(标准) 指向 w1 驱动程序的符号链接

w1_master_add

(rw) 手动注册从设备

w1_master_attempts

(ro) 尝试搜索的次数

w1_master_max_slave_count

(rw) 一次搜索的最大从设备数

w1_master_name

(ro) 设备名称 (w1_bus_masterX)

w1_master_pullup

(rw) 5V 强上拉,0 为启用,1 为禁用

w1_master_remove

(rw) 手动删除从设备

w1_master_search

(rw) 剩余要执行的搜索次数,-1=连续 (默认)

w1_master_slave_count

(ro) 找到的从设备数量

w1_master_slaves

(ro) 从设备的名称,每行一个

w1_master_timeout

(ro) 搜索之间的延迟(以秒为单位)

w1_master_timeout_us

(ro) 搜索之间的延迟(以微秒为单位)

如果您的 w1 总线永远不会更改(您不添加或删除设备),您可以将模块参数 search_count 设置为较小的正数,以便在初始时进行较少的总线搜索。或者,它可以设置为零,然后通过 w1_master_add 设备文件手动添加从设备序列号。w1_master_add 和 w1_master_remove 文件通常仅在禁用搜索时才有意义,因为搜索会重新检测存在的手动删除的设备,并超时手动添加的不在总线上的设备。

总线搜索按间隔进行,该间隔指定为 timeout 和 timeout_us 模块参数的总和(两者中的任何一个都可能为 0),只要 w1_master_search 保持大于 0 或为 -1 即可。每次搜索尝试都会将 w1_master_search 减 1(降至 0),并将 w1_master_attempts 加 1。

w1 从 sysfs 接口

bus

(标准) 指向 w1 总线的符号链接

driver

(标准) 指向 w1 驱动程序的符号链接

name

设备名称,通常与目录名称相同

w1_slave

(可选) 一个二进制文件,其含义取决于系列驱动程序

rw

(可选) 为没有合适系列驱动程序的从设备创建。 允许读取/写入二进制数据。