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