Hi, we're having some recent issues recognizing a particular PNY thumbdrive.
We've been using PNY thumbdrives for 3+ years without issues, but they recently changed the controller and they no longer work with our product that has the iMX51 and USB3315 ULPI PHY combo.
The thing is that the thumbdrives work with everything else that we plug them into including our other products (iMX53, PowerPC, Windows, Linux, etc.). We've tried 10 other thumbdrive manufacturers with this combo and they all work. If we plug in a hub first and then this drive to our product then it also works.
It's something about our system that's making us fall on our face with this particular PNY drive.
Basically, there's no chirp from the host after the initial chirp from the device. Scopeshot attached.
We have to fix it, as there's no reason this drive shouldn't work. We've been trying to fix it for 4 weeks now.
I think the hardware team has tried everything from their end. From the software side, we see the issue with Linux 2.6 and 3.14. dts and non-dts. Using the generic phy driver usb-nop-xceiv. I have also tried setting the ulpi registers via viewport to what the phy-ulpi driver sets them to, but no cigar. Those are highlighted in green.
/* * Register Map */
#define ULPI_VENDOR_ID_LOW 0x00
#define ULPI_VENDOR_ID_HIGH 0x01
#define ULPI_PRODUCT_ID_LOW 0x02
#define ULPI_PRODUCT_ID_HIGH 0x03
#define ULPI_FUNC_CTRL 0x04
#define ULPI_IFC_CTRL 0x07
#define ULPI_OTG_CTRL 0x0a
#define ULPI_USB_INT_EN_RISE 0x0d
#define ULPI_USB_INT_EN_FALL 0x10
#define ULPI_USB_INT_STS 0x13
#define ULPI_USB_INT_LATCH 0x14
#define ULPI_DEBUG 0x15
#define ULPI_SCRATCH 0x16
/* Optional Carkit Registers */
#define ULPI_CARCIT_CTRL 0x19
#define ULPI_CARCIT_INT_DELAY 0x1c
#define ULPI_CARCIT_INT_EN 0x1d
#define ULPI_CARCIT_INT_STS 0x20
#define ULPI_CARCIT_INT_LATCH 0x21
#define ULPI_CARCIT_PLS_CTRL 0x22
/* Other Optional Registers */
#define ULPI_TX_POS_WIDTH 0x25
#define ULPI_TX_NEG_WIDTH 0x26
#define ULPI_POLARITY_RECOVERY 0x27
/* Access Extended Register Set */
#define ULPI_ACCESS_EXTENDED 0x2f
/* Vendor Specific */
#define ULPI_VENDOR_SPECIFIC 0x30
/* Extended Registers */
#define ULPI_EXT_VENDOR_SPECIFIC 0x80
Can anyone recommend any other registers to poke, specifically the ones highlighted in yellow. I'm having a hard time finding examples of drivers poking those registers.
If we're on the wrong path please let me know. ANY recommendations will be highly appreciated.
Could you try kernel 4.8.6?
Also, does passing "usbcore.autosuspend=-1" in the kernel command line help?
Thanks for the suggestions Fabio, but unfortunately we can't try 4.x kernel very easily.
Passing usbcore.autosuspend=-1 did not help.
Just to clarify, the 1ms blip on D- is the device chirp, which is correct. What we don’t get is the subsequent chirp sequence from the host.
All this handshake logic is done in silicon so there’s not much we can do from software I don't think, but the fact that this drive works everywhere else is reason for concern.