内核驱动 ds2490¶
支持的芯片
基于 Maxim DS2490
作者:Evgeniy Polyakov <johnpol@2ka.mipt.ru>
描述¶
Maxim/Dallas Semiconductor DS2490 芯片允许构建 USB <-> W1 桥接器。
DS9490(R) 是一种 USB <-> W1 总线主设备,集成了 0x81 系列 ID 芯片和 DS2490 低级操作芯片。
注意和限制。
弱上拉电流最小为 0.9mA,最大为 6.0mA。
5V 强上拉支持的最小电流为 5.9mA,最大电流为 30.4 mA。(来自 DS2490.pdf)
硬件将在下次总线(复位?)操作时检测到连接到总线的设备,但只会打印一条消息,因为核心 w1 代码不使用该信息。连接一个设备往往会产生多个新设备通知。
如果将 w1_reset_send 添加到 API 中,则可以减少 USB 总线事务的数量。这个名字只是一个建议。它将接收一个写入缓冲区和一个读取缓冲区(以及大小)作为参数。ds2490 块 I/O 命令支持复位、写入缓冲区、读取缓冲区和强上拉,所有这些都在一个命令中,而不是当前的 1 个复位总线、2 个写入匹配 ROM 命令和从属 ROM ID、3 个块写入和读取数据。写入缓冲区需要在请求的写入缓冲区的前面加上匹配的 ROM 命令和从属 ROM ID,这两者对于驱动程序来说都是已知的。
硬件支持正常、灵活和超速总线通信速度,但仅支持正常速度。
注册的 w1_bus_master 函数未定义错误条件。如果正在进行总线搜索,并且删除了 ds2490,则在总线搜索完成之前可能会产生大量错误输出。
硬件支持检测一些错误条件,例如短路、复位时出现警报,以及复位时不存在,但驱动程序不会查询这些值。
ds2490 规范没有详细介绍短批量读取,但我的观察是,如果请求的字节数少于可用的字节数,则批量读取将返回错误,并且硬件将清除整个批量输入缓冲区。可以读取最大缓冲区大小以避免遇到此错误条件,只有缓冲区中的额外字节是驱动程序中的逻辑错误。代码应匹配读取和写入以及数据大小。读取和写入是串行的,并且状态会验证芯片是否空闲(并且数据可用),然后再执行读取,因此不应发生这种情况。
在 x86_64 2.6.22-rc6 下使用 OHCI 控制器在 qemu 0.9.0 下运行 x86_64 2.6.24 UHCI,在客户机中运行的 ds2490 在 qemu 连接 ds2490 硬件后第一次加载模块时会正常工作,但如果卸载模块,然后重新加载,大多数情况下,批量输出或输入之一,通常是批量输入会失败。qemu 设置了 50 毫秒的超时时间,即使状态显示数据可用,批量输入也会超时。批量输出写入会显示成功完成,但 ds2490 状态寄存器会显示 0 个写入的字节。从 ds2490 硬件分离 qemu 并重新连接可以清除该问题。客户机和主机中的 usbmon 输出并未解释该问题。我猜是 qemu 或主机操作系统中的一个错误,更可能是主机操作系统中的错误。
2008 年 6 月 3 日 David Fries <David@Fries.net>