Part Number: PROCESSOR-SDK-AM57X
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

