------------------------------------------------------------------------------- USB device setup (low-speed signalling) ------------------------------------------------------------------------------- This is an example capture of a USB plugin and setup sequence. Plugin and reset signaling (trace walktrough) --------------------------------------------- The logic analyzer is connected to the D+ and D- signals of the device. As the device ground is not connected to the LA ground, the signal level at the start of the trace is arbitrary. When the cable is plugged in, DM and DP are pulled down by the host side 15k pull-down resistors. Next, the power supply level of the device rises and the 1.5k pull-up resistor signals the connection of a low speed device. The host waits for 100ms, according to the attach debounce interval [USB 2.0 spec, Table 7-14, T_ATTDB] for the connection and device power to become stable. At 240ms the host signals a reset (SE) condition for 50ms [USB 2.0 spec, 7.1.7.5, T_DRSTR]. After the reset, the host issues keep-alives every 1ms (SE0 for 2 bit times), to allow the device to recover. 10ms are required, but the Linux kernel waits at least 100ms. At this time, the host knows the port is enabled and the device is in the DEFAULT state, e.g. it responds to control requests at address 0. It is now possible to request the Device Descriptor. At 398ms, the GET_DEVICE_DESCRIPTOR request is the first condition decoded by the usb_signalling and stacked protocol decoders. After this request, the max packet size for the control endpoint is known. After the request, some buggy devices may be in a bad state (1), thus there is a second reset/device recovery cycle. There follows a sequence of SET_ADDRESS(13) and more GET_DESCRIPTOR requests. After the setup, the polling of the INTERRUPT endpoint (EP1) starts. --- (1) The stack requests 64 bytes of device descriptor because otherwise some devices may return more than requested. Other devices can not cope with this request, and thus a reset is needed. If all devices where compliant, a request of just 8 bytes should return the wanted bMaxPacketSize of the device. Decoding in PulseView --------------------- Add a usb_signalling decoder. Set the signalling to "low-speed", next assign DP to "D+" and DM to "D-". The usb_packet and usb_request PDs can be stacked on top. Creating a PCAP (Wireshark) capture ----------------------------------- 1. Convert the trace with sigrok-cli. $ sigrok-cli -i usb_reset_and_setup_lowspeed.sr \ -P usb_signalling:dp=DP:dm=DM:signalling=low-speed,usb_packet,usb_request \ -B usb_request > usb_reset_and_setup_lowspeed.pcap 2. View with tshark (wireshark command line tool). $ tshark -r usb_reset_and_setup_lowspeed.pcap 1 0.000000 host -> 0.0 USB 64 GET DESCRIPTOR Request DEVICE 2 0.002258 0.0 -> host USB 82 GET DESCRIPTOR Response DEVICE 3 0.154975 host -> 0.0 USB 64 SET ADDRESS Request 4 0.155441 0.0 -> host USB 64 SET ADDRESS Response 5 0.165960 host -> 13.0 USB 64 GET DESCRIPTOR Request DEVICE 6 0.168258 13.0 -> host USB 82 GET DESCRIPTOR Response DEVICE 7 0.168287 host -> 13.0 USB 64 GET DESCRIPTOR Request CONFIGURATION 8 0.169757 13.0 -> host USB 73 GET DESCRIPTOR Response CONFIGURATION 9 0.169781 host -> 13.0 USB 64 GET DESCRIPTOR Request CONFIGURATION 10 0.173834 13.0 -> host USB 98 GET DESCRIPTOR Response CONFIGURATION 11 0.174505 host -> 13.0 USB 64 SET CONFIGURATION Request 12 0.175061 13.0 -> host USB 64 SET CONFIGURATION Response 13 0.175116 host -> 13.0 USBHID 64 SET_IDLE Request 14 0.175506 13.0 -> host USB 64 URB_CONTROL out 15 0.175694 host -> 13.0 USB 64 GET DESCRIPTOR Request Unknown type 34 16 0.181389 13.0 -> host USB 116 GET DESCRIPTOR Response Unknown type 34 17 0.200694 host -> 13.1 USB 64 URB_BULK in