我需要USB专家。我有一个小型硬件,MAX3421作为USB主机。我连接的打印机内部由两个设备组成:打印机本身和扫描仪。两者都通过内置集线器作为独立设备公开。这些设备是全速的。
我已经阅读了大量的USB 2.0手册(http://www.usb.org/developers/docs/usb20_docs),在那里我搜索了如何通过集线器与后面的设备进行通信,但文档缺乏这一重要细节。
我可以按照第11.24.2节的说明向集线器发送命令,例如获取集线器描述符,SET_FEATURE(重置),它重置打印机中的设备,GET_STATUS(Port1)正确返回4个字节集线器中端口1的状态。
但是我如何获得扫描仪的设备描述符?
我已将设备地址1分配给集线器并尝试在设备地址2上与扫描仪/打印机通信(假设它可能在那里)但是当我发送GET_DESCRIPTOR(设备)时MAX3421以JERR错误应答设备地址2虽然两个集线器端口在执行复位后都已上电并启用。
我已经阅读了很多关于SPLIT令牌的内容,但它们似乎只在高速集线器中使用。但我的打印机中的集线器是全速的。
文档没有在任何地方说明如何做到这一点。 这记录在哪里?
答案 0 :(得分:1)
USB端口(根端口或集线器端口)后面的设备枚举过程在外行术语的USB 2.0规范中没有解释,但整个想法都嵌入在DS(下游)的所有状态机中。港口行为。
最初,禁用所有USB端口进行通信。唯一启用的功能是“端口连接”状态。如果多个设备插入多个端口(一次或上电),则不会发生USB通信。上电时所有USB设备都设计为响应DEFAULT地址00.但由于尚未启用任何端口,因此没有人响应任何内容。
然后HOST转到指示“连接”的每个单独端口,从第一个端口开始。主机将端口设置为PORT_RESET模式,并且连接的设备将使用Chirp-K响应,或者什么都不响应,或者它最初具有D-拉动,表明它是LS设备。所有其他设备仍然在禁用端口后面,因此看不到任何活动。
在第一个特定端口获得正确的速度状态后,端口启用,相应的空闲总线流量启动,然后使用DEFAULT ADDRESS 00执行get_descriptor命令。然后主机通过SET_ADDRESS为此设备分配一个非平凡的地址( )。从这一点开始,设备将仅响应此特定的分配地址。
然后主机启用下一个显示附加内容的端口。同样,所有其他非枚举设备都设置为响应00地址,但一次只启用一个新端口。由于第一个设备的地址与默认值00不同,因此不会发生冲突,第一个设备只会忽略发往默认管道00的流量。
对第二个设备重复该过程,首先通过在00地址进行通信,然后将下一个可用的USB地址分配给第二个设备。并且每个显示附加状态的端口都会重复此过程。
要记住的关键字是USB端口没有“启用”,除非主机控制器获取命令“port_reset”到根端口,或者将SET_FEATURE(PORT_RESET)(或类似的东西)发送到连接后面的端口并且已经枚举毂。
答案 1 :(得分:0)
没有答案?似乎是一个棘手的问题。
同时我在这里找到答案: http://www.microchip.com/forums/m523103.aspx#523499
将SET_FEATURE(重置)发送到集线器上的端口后,连接到该端口的设备在USB总线上显示设备地址00 。 然后,您可以通常的方式获取设备描述符,并对该设备执行SET_ADDRESS。
USB规范绝对不完整。