Part Number:AM6548
Tool/software: Linux
Hi TI experts,
We have a custom board that using a AM6548 soc, and has a embeded usb2.0 hub usb2514b connected to the USBSS0, the hub is self-powered so only D+/D- are connected to the SOC, and during Linux boot, the usb hub cannot be enumerated.
Then we tried another usb2514b board that shares the same hardware disign with the usb part of our custom board, but this time connected it to the EVM usb2.0 port, the problem is still there.
Our hardware design:
1. USBSS0 as USB2.0 mode, only the DM/DP of the USB2.0 phy are pinned out.
2. usb2514b hub's upstream DM/DP are connected to usb2.0 phy of the controller.
3. usb2514b is self-powered, so the VBUS is connected directly to 3.3V, we don't use the DRVVBUS pin to control the VBUS on/off.
4. the ID pin is grounded so the USBSS0 controller works as host.
from the kernel log, it seems after the usb driver probe, it tried to perform a "port reset", but never succeeded:
[ 7.589651] xhci-hcd xhci-hcd.0.auto: xhci_hub_status_data: stopping port polling.
[ 7.641321] hub 1-0:1.0: hub_activation_type 2
[ 7.641411] hub 1-0:1.0: state 7 ports 1 chg 0002 evt 0000
[ 7.641433] usb usb1-port1: [port_event]: connect_change 0001
[ 7.641456] xhci-hcd xhci-hcd.0.auto: get port status, actual port 0 status = 0x6e1
[ 7.641463] xhci-hcd xhci-hcd.0.auto: Get port status returned 0x101
[ 7.641509] usb usb1-port1: [port_event]: portstatus 0101, portchange 0000
[ 7.641516] usb usb1-port1: status 0101, change 0000, 12 Mb/s
[ 7.641621] xhci-hcd xhci-hcd.0.auto: set port reset, actual port 0 status = 0x6f1
[ 7.649276] xhci-hcd xhci-hcd.0.auto: xhci_hub_status_data: stopping port polling.
[ 7.709376] xhci-hcd xhci-hcd.0.auto: get port status, actual port 0 status = 0x200e03
[ 7.709388] xhci-hcd xhci-hcd.0.auto: Get port status returned 0x100503
[ 7.709453] xhci-hcd xhci-hcd.0.auto: clear port reset change, actual port 0 status = 0xe03
[ 7.769349] usb 1-1: new high-speed USB device number 2 using xhci-hcd
[ 7.776138] xhci-hcd xhci-hcd.0.auto: set port reset, actual port 0 status = 0x2602a0
[ 7.841366] xhci-hcd xhci-hcd.0.auto: get port status, actual port 0 status = 0x2602a0
[ 7.841380] xhci-hcd xhci-hcd.0.auto: Get port status returned 0x130100
[ 7.841420] usb usb1-port1: not reset yet, waiting 60ms
[ 7.909356] xhci-hcd xhci-hcd.0.auto: get port status, actual port 0 status = 0x2602a0
[ 7.909368] xhci-hcd xhci-hcd.0.auto: Get port status returned 0x130100
[ 7.909408] usb usb1-port1: not reset yet, waiting 200ms
[ 8.117368] xhci-hcd xhci-hcd.0.auto: get port status, actual port 0 status = 0x2602a0
[ 8.117380] xhci-hcd xhci-hcd.0.auto: Get port status returned 0x130100
[ 8.117445] usb usb1-port1: not reset yet, waiting 200ms
[ 8.325326] xhci-hcd xhci-hcd.0.auto: get port status, actual port 0 status = 0x2602a0
[ 8.325338] xhci-hcd xhci-hcd.0.auto: Get port status returned 0x130100
[ 8.325384] usb usb1-port1: not reset yet, waiting 200ms
[ 8.533314] xhci-hcd xhci-hcd.0.auto: get port status, actual port 0 status = 0x2602a0
[ 8.533324] xhci-hcd xhci-hcd.0.auto: Get port status returned 0x130100
[ 8.533367] usb usb1-port1: not reset yet, waiting 200ms
[ 8.533381] xhci-hcd xhci-hcd.0.auto: clear port reset change, actual port 0 status = 0x602a0
[ 8.533411] xhci-hcd xhci-hcd.0.auto: disable port, actual port 0 status = 0x602a0
[ 8.533493] xhci-hcd xhci-hcd.0.auto: disable port, actual port 0 status = 0x602a0
[ 8.533536] hub 1-0:1.0: state 7 ports 1 chg 0000 evt 0002
[ 8.533562] usb usb1-port1: [port_event]: connect_change 0000
[ 8.533572] xhci-hcd xhci-hcd.0.auto: get port status, actual port 0 status = 0x602a0
[ 8.533578] xhci-hcd xhci-hcd.0.auto: Get port status returned 0x30100
[ 8.533601] usb usb1-port1: [port_event]: portstatus 0100, portchange 0003
[ 8.533611] xhci-hcd xhci-hcd.0.auto: clear port connect change, actual port 0 status = 0x402a0
[ 8.533636] xhci-hcd xhci-hcd.0.auto: clear port enable/disable change, actual port 0 status = 0x2a0
[ 8.533657] usb usb1-port1: status 0100, change 0003, 12 Mb/s
[ 8.533668] xhci-hcd xhci-hcd.0.auto: get port status, actual port 0 status = 0x2a0
[ 8.533674] xhci-hcd xhci-hcd.0.auto: Get port status returned 0x100
[ 8.569320] xhci-hcd xhci-hcd.0.auto: get port status, actual port 0 status = 0x2a0
[ 8.569329] xhci-hcd xhci-hcd.0.auto: Get port status returned 0x100
[ 8.605289] xhci-hcd xhci-hcd.0.auto: get port status, actual port 0 status = 0x2a0
[ 8.605295] xhci-hcd xhci-hcd.0.auto: Get port status returned 0x100
[ 8.641324] xhci-hcd xhci-hcd.0.auto: get port status, actual port 0 status = 0x2a0
[ 8.641338] xhci-hcd xhci-hcd.0.auto: Get port status returned 0x100
[ 8.677309] xhci-hcd xhci-hcd.0.auto: get port status, actual port 0 status = 0x2a0
[ 8.677318] xhci-hcd xhci-hcd.0.auto: Get port status returned 0x100
[ 8.677353] usb usb1-port1: debounce total 100ms stable 100ms status 0x100
[ 8.677415] hub 1-0:1.0: hub_suspend
[ 8.677464] xhci-hcd xhci-hcd.0.auto: xhci_hub_status_data: stopping port polling.
[ 8.773274] xhci-hcd xhci-hcd.0.auto: xhci_hub_status_data: stopping port polling.
And other observations:
1. If perform a reset to the hub, then the hub can be enumerated and everything goes well.
2. If perform a reconnection to the usb connector, then the hub can be enumerated and everything goes well.
We checked the usb2514b, it seems after power up, it will wait for the SE0 signal for 3ms, if no SE0 signal then it goes to sleep, but Linux is not able to boot in 3ms, so after the USB driver loaded, the usb hub is in sleep mode.
3. Connect the usb2514b to PC, all seems good.
So it seems a compatible issue between usb2514b and USB3SS0 controller, do you have any thoughts or suggestions?
Also I have checked the "AM65x/DRA80x Schematic Checklist" @ http://www.ti.com/lit/an/spraci9/spraci9.pdf, and it says:
If you are including a USB hub, have you connected the USB signals correctly? USBx_DP and
USBx_DM should be connected directly to the USB hub upstream port. The hub then distributes these
signals to the downstream ports as needed. The connector ID should be grounded to enable host
mode. The USBx_DRVVBUS should be unconnected. The USBx_VBUS should be connected to the
output of the 5-V VBUS power source. It is also connected to the VBUS detect on the hub, which then
allows the hub to selectively enable or disable, typically through a power switch to each downstream
port.
seems everything is satisfied, except the VBUS_DET pin of the usb2514b hub, instead a 5-v power source, we use a 3V3 because the hub's datasheet suggest us to do such. but still I have a question, why "The USBx_DRVVBUS should be unconnected", I observed that if connect this pin to a switch that controlled the VBUS, then only after the usb driver is loaded, this pin close the switch so that downstram devices are powered, so we are considering a workaround solution to use the DRVVBUS to control the hub's VBUS, but get confused by this checkpoint...
BTW, we noticed that the reset value of IF/MUX register of the SERDES0 is 0, which is usb3, but since we don't use usb3 for USB3SS0, and we observed that the serdes phy is disturbing the usb2.0, so we just set that register to 1, which is pcie, to avoid the serdes0 phy disturbing. but here is the question, if we don't use the serdes0 at all, how do we treat this register, set to 3?