Tool/software: Linux
Hi,
I am trying to run g_audio on AM572x with ti-processor-sdk-linux-am57xx-evm-05.00.00.15.
But it did not work with the default code, I modified the dwc3 driver and built it.
- g_audio_tmp.diff
--- a/drivers/usb/dwc3/gadget.c +++ b/drivers/usb/dwc3/gadget.c @@ -927,7 +927,7 @@ static void __dwc3_prepare_one_trb(struct dwc3_ep *dep, struct dwc3_trb *trb, */ if (speed == USB_SPEED_HIGH) { struct usb_ep *ep = &dep->endpoint; - unsigned int mult = ep->mult - 1; + unsigned int mult = 2; unsigned int maxp = usb_endpoint_maxp(ep->desc); if (length <= (2 * maxp)) @@ -1411,68 +1411,6 @@ static int dwc3_gadget_ep_dequeue(struct usb_ep *ep, if (r == req) { /* wait until it is processed */ dwc3_stop_active_transfer(dwc, dep->number, true); - - /* - * If request was already started, this means we had to - * stop the transfer. With that we also need to ignore - * all TRBs used by the request, however TRBs can only - * be modified after completion of END_TRANSFER - * command. So what we do here is that we wait for - * END_TRANSFER completion and only after that, we jump - * over TRBs by clearing HWO and incrementing dequeue - * pointer. - * - * Note that we have 2 possible types of transfers here: - * - * i) Linear buffer request - * ii) SG-list based request - * - * SG-list based requests will have r->num_pending_sgs - * set to a valid number (> 0). Linear requests, - * normally use a single TRB. - * - * For each of these two cases, if r->unaligned flag is - * set, one extra TRB has been used to align transfer - * size to wMaxPacketSize. - * - * All of these cases need to be taken into - * consideration so we don't mess up our TRB ring - * pointers. - */ - wait_event_lock_irq(dep->wait_end_transfer, - !(dep->flags & DWC3_EP_END_TRANSFER_PENDING), - dwc->lock); - - if (!r->trb) - goto out0; - - if (r->num_pending_sgs) { - struct dwc3_trb *trb; - int i = 0; - - for (i = 0; i < r->num_pending_sgs; i++) { - trb = r->trb + i; - trb->ctrl &= ~DWC3_TRB_CTRL_HWO; - dwc3_ep_inc_deq(dep); - } - - if (r->unaligned || r->zero) { - trb = r->trb + r->num_pending_sgs + 1; - trb->ctrl &= ~DWC3_TRB_CTRL_HWO; - dwc3_ep_inc_deq(dep); - } - } else { - struct dwc3_trb *trb = r->trb; - - trb->ctrl &= ~DWC3_TRB_CTRL_HWO; - dwc3_ep_inc_deq(dep); - - if (r->unaligned || r->zero) { - trb = r->trb + 1; - trb->ctrl &= ~DWC3_TRB_CTRL_HWO; - dwc3_ep_inc_deq(dep); - } - } goto out1; } dev_err(dwc->dev, "request %pK was not queued to %s\n",
Currently, it is working on the AM572x board.
----------------
target$ modprobe -v g_audio
host$ aplay - D plughw: 1,0 test.wav
target$ arecord - f dat - t wav - D plughw: 2, 0 | aplay - D plughw: 0,0
- I can listen test.wav from audio-out on the AM572x board.
host$ arecord - f dat - t wav - D plughw: 1, 0 | aplay - D plughw: 0,0
target$ aplay - D plughw: 2, 0 test.wav
- I can listen test.wav from audio-out on the Host PC.
----------------
I have a few questions.
1. Is the modificatoin of "g_audio_tmp.diff" correct?
In particular, we deleted processing in dwc3_gadget_ep_dequeue(), but is there a problem?
Also, is there any other part to be fixed?
2. When arecord is executed on the Host PC, the Audio Data is transferred with isochronous IN,
at this time, 0-byte data is transferred from the AM572x board at the beginning.
Normal data(not 0-bytes) is transferred in the second and subsequent.
I want to send the normal data (not 0-bytes) from the beginning.
Please teach me how to fix it.
In the g_audio on AM335x(processor-sdk-linux), normal data (not 0 bytes) is transmitted from the beginning.
Best Regards,
Yasun