On Montag, 7. September 2020 17:34:19 CEST Ludwig Nussel wrote:
> Stefan Brüns wrote:
> > [...]
> > requesttype: 0x21 - Class specific request to interface
> > request: 0xA - Set_Idle
> 
> > value: 0xA00 - 0xA * 4ms = 40ms report interval during idle, 0x0:
> applies to
> 
> > all reports
> > 
> > So according to the request, the OTG device should send report at regular
> > intervals even without state changes, but the keyboard poll code times
> 
> out.
> 
> > Maybe an interval is not supported by the gadget code, while U-Boot
> 
> requires
> 
> > it. Would be interesting what a "Get_Idle" request returns.
> 
> I've added debug calls to log the return value and also enabled debug in
> the dwc2 controller code. Logs of the gadget as well as the ps2adapter
> attached.
> 
> In case of the gadget the idle call return -22. For the ps2adapter it's
> zero but that one still doesn't work either.
> 
> cu
> Ludwig


> usb_kbd_probe_dev() USB KBD: set boot protocol
> usb_control_msg() usb_control_msg: request: 0xB, requesttype: 0x21, value
> 0x0 index 0x0 length 0x0 dwc2_submit_control_msg() dwc2_submit_control_msg:
> dev='usb@7e980000', udev=000000003db30210, udev->dev='usb_kbd', portnr=2
> chunk_msg() chunk_msg: msg: pipe 80000403 pid 3 in 0 len 8
> transfer_chunk() transfer_chunk: chunk: pid 3 xfer_len 8 pkts 1
PID: Setup

> wait_for_chhltd() wait_for_chhltd: HCINT=00000023 sub=8 toggle=1
HCINT (*): XFER_COMPLETE | CHANNEL_HALTED | ACK

> chunk_msg() chunk_msg: msg: pipe 80000403 pid 2 in 1 len 0
> transfer_chunk() transfer_chunk: chunk: pid 2 xfer_len 0 pkts 1
PID: Data1 (Status stage) -> OK

> wait_for_chhltd() wait_for_chhltd: HCINT=00000023 sub=0 toggle=0
> usb_kbd_probe_dev() USB KBD: set boot protocol returned 0
> usb_kbd_probe_dev() USB KBD: set idle interval...
> usb_control_msg() usb_control_msg: request: 0xA, requesttype: 0x21, value
> 0xA00 index 0x0 length 0x0 dwc2_submit_control_msg()
> dwc2_submit_control_msg: dev='usb@7e980000', udev=000000003db30210,
> udev->dev='usb_kbd', portnr=2 chunk_msg() chunk_msg: msg: pipe 80000403 pid
> 3 in 0 len 8
> transfer_chunk() transfer_chunk: chunk: pid 3 xfer_len 8 pkts 1
> wait_for_chhltd() wait_for_chhltd: HCINT=00000023 sub=8 toggle=1
Setup, XFER_COMPLETE | CHANNEL_HALTED | ACK

> chunk_msg() chunk_msg: msg: pipe 80000403 pid 2 in 1 len 0
> transfer_chunk() transfer_chunk: chunk: pid 2 xfer_len 0 pkts 1
> wait_for_chhltd() wait_for_chhltd: HCINT=0000000a sub=0 toggle=2
> wait_for_chhltd() wait_for_chhltd: Error (HCINT=0000000a)
Status: CHANNEL_HALTED | STALL

USB 2.0 spec: " STALL indicates that the function
cannot complete the command."

> usb_kbd_probe_dev() USB KBD: set idle 10 returned -22
U-Boot obviously ignores the failing request, and commences as it had 
succeeded. Though, apparently this is only relevant for Linux Gadget mode, as 
the Holtek HID fails silently.

> usb_kbd_probe_dev() USB KBD: enable interrupt pipe...
> dwc2_submit_int_msg() dwc2_submit_int_msg: dev='usb@7e980000',
> udev=000000003db30210
> ...
> chunk_msg() chunk_msg: msg: pipe 40408483 pid 0 in 1 len 8
> transfer_chunk() transfer_chunk: chunk: pid 0 xfer_len 8 pkts 1
> wait_for_chhltd() wait_for_chhltd: HCINT=00000012 sub=8 toggle=0
Status: CHANNEL_HALTED | NACK
"I really have no keyboard status change for you" ...

> Timeout poll on interrupt endpoint
> Failed to get keyboard state from device 1d6b:0104

Kind regards,

Stefan


*) https://elixir.bootlin.com/u-boot/v2020.07/source/drivers/usb/host/
dwc2.h#L648

-- 
Stefan Brüns  /  Bergstraße 21  /  52062 Aachen
home: +49 241 53809034     mobile: +49 151 50412019

Attachment: signature.asc
Description: This is a digitally signed message part.

Reply via email to