Hi Shimodaさん

> From: Yoshihiro Shimoda
> Sent: Tuesday, May 07, 2019 5:17 AM
> > For the most part, the RZ/A2 has the same USB 2.0 host and device
> > HW as the R-Car Gen3, so we can reuse a lot of the code.
> >
> > However, there are a couple extra register bits, and the CFIFO
> > register 8-bit access works a little different (weird, no idea why).
> 
> This is just my gut feeling, but if we set the BIGEND bit in the CFIFOSEL
> of RZ/A2M (R-Car Gen3 doesn't have such a bit though), could the original
> code work correctly?

I just tried to set CFIFOSEL.BIGEND = 1

 * Set CFIFOSEL.BIGEND = 1
 * Write 8-bit values to CFIFO (same method as R-Car)
 * Set CFIFOSEL.BIGEND = 0

The result is bad.


But, then I tried this:
 * Set CFIFOSEL.MBW = 0   (CFIFO port access = 8-bit)
 * Write 8-bit values to CFIFO
 * Set CFIFOSEL.MBW = 2   (CFIFO port access = 32-bit)

Code:
u16 cfifosel = usbhs_read(priv, fifo->sel);

usbhs_write(priv, fifo->sel, cfifosel & 0xF3FF); // MBW = 8-bit

                for (i = 0; i < len; i++)
                        iowrite8(buf[i], addr); //same address each time

usbhs_write(priv, fifo->sel, cfifosel); // MBW = 32-bit


This method works good.

  (I assume this method would work with R-Car also)

But...then we have extra register reads and writes.
Register accesses are slower, so performance is lower.

So, I prefer my original method:
        if (usbhsc_flags_has(priv, USBHSF_CFIFO_BYTE_ADDR))
                for (i = 0; i < len; i++)
                        iowrite8(buf[i], addr + (i & 0x03));
        else
                for (i = 0; i < len; i++)
                        iowrite8(buf[i], addr + (0x03 - (i & 0x03)));


Do you agree?

Chris

Reply via email to