02-01-2016 04:25 AM
I have a problem with a custom Zynq board, which is copied from the ZC702 USB implementation (using USB3320 ULPI transceiver connected to USB0 on the Zynq). Kernel is upgraded to the xilinx-v2015.4.01 tag in Git to see if that helped (it didn't).
The board works correctly in USB device mode - it enumerates on the host, I can load the USB ethernet gadget stack and SSH into the board. But now I need the hardware to work in USB host mode (eventually OTG, but one at a time). The drivers for this all load, and lsusb shows the USB bus existing, but devices connected do not enumerate and never appear in the lsusb output. The lsusb output is always
Bus 001 Device 001: ID 1d6b:0002
with no other devices listed.
This seems a lot like https://forums.xilinx.com/t5/Embedded-Linux/Petalinux-2015-2-1-usb-not-working/td-p/654349 so I have worked through everything there. In particular I have tried both compatible = "ulpi-phy"; and compatible = "usb-nop-xceiv"; with the corresponding kernel configuration options
I know that the USB3320 is being initialised, because (with drv-vbus; in the device tree) the CPEN line goes high when the system starts up, and low when it shuts down. This enables the 5V supply controller (bq24196) to be switched on (I2C register write) and supply 5V to the port (measured this, definitely there).
Connected to the USB port is a USB OTG adaptor (to standard A female connector), an in-line USB meter and a USB memory stick. The USB meter shows 5V being supplied to the port, and about 70mA being drawn by the USB key (the port has 1.3A available if required!). The same voltage and current are measured when the meter and memory stick are plugged in to a PC and work correctly.
The ID line in the USB connector is pulled low when the cable is plugged in, as it should be, and goes high when the OTG adaptor is removed.
The following messages from the kernel are produced duing boot:
e0002000.phy0 supply vcc not found, using dummy regulator
ehci_hcd: USB 2.0 'Enhanced' Host Controller (EHCI) Driver usbcore: registered new interface driver cdc_acm cdc_acm: USB Abstract Control Model driver for USB modems and ISDN adapters usbcore: registered new interface driver usb-storage e0002000.usb supply vbus not found, using dummy regulator ci_hdrc ci_hdrc.0: ChipIdea HDRC found, revision: 22, lpm: 0; cap: 60144100 op: 60144140 ci_hdrc ci_hdrc.0: It is OTG capable controller ci_hdrc ci_hdrc.0: EHCI Host Controller ci_hdrc ci_hdrc.0: new USB bus registered, assigned bus number 1 ci_hdrc ci_hdrc.0: USB 2.0 started, EHCI 1.00 usb usb1: New USB device found, idVendor=1d6b, idProduct=0002 usb usb1: New USB device strings: Mfr=3, Product=2, SerialNumber=1 usb usb1: Product: EHCI Host Controller usb usb1: Manufacturer: Linux 4.0.0-xilinx ehci_hcd usb usb1: SerialNumber: ci_hdrc.0 hub 1-0:1.0: USB hub found hub 1-0:1.0: 1 port detected
usbcore: registered new interface driver usbhid usbhid: USB HID core driver
note that I do not get the message Driver chipidea-usb2 requests probe deferral which other people have been having problems with, because I have the Phy driver loaded sucessfully.
What should I do next to try and find out why this does not work?
02-01-2016 08:24 AM
After enabling debugfs, dynamic debugging, and then turning on USB debug from the kernel command line, I get some more USB output messages, in particular
usb_phy_generic e0002000.phy0: Can't get phy clock: -2 e0002000.phy0 supply vcc not found, using dummy regulator
this doesn't look good, but according to linux-xilinx-v2015.4.01/Documentation/devicetree/bindings/usb/usb-nop-xceiv.txt this property is optional?
02-01-2016 09:13 AM
More to the point, there is a 24MHz crystal fitted to the USB3320 (configured by pin strap), so the Phy doesn't need an external clock - it's generating one, and for that matter providing the 60MHz ULPI bus clock! Again, this works fine in device mode, but not at all in host mode.