mirror of
https://github.com/apache/nuttx.git
synced 2026-06-06 00:14:22 +08:00
SAMV7 USB: More fixes at beginning of testing. Still a long way from working
This commit is contained in:
@@ -98,7 +98,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef CONFIG_DEBUG
|
#ifndef CONFIG_DEBUG
|
||||||
# undef CONFIG_SAMV7_USBDEVHS_REGDEBUG
|
# undef CONFIG_SAMV7_USBHS_REGDEBUG
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Not yet supported */
|
/* Not yet supported */
|
||||||
@@ -396,7 +396,7 @@ struct sam_usbdev_s
|
|||||||
|
|
||||||
/* Register operations ******************************************************/
|
/* Register operations ******************************************************/
|
||||||
|
|
||||||
#ifdef CONFIG_SAMV7_USBDEVHS_REGDEBUG
|
#ifdef CONFIG_SAMV7_USBHS_REGDEBUG
|
||||||
static void sam_printreg(uintptr_t regaddr, uint32_t regval, bool iswrite);
|
static void sam_printreg(uintptr_t regaddr, uint32_t regval, bool iswrite);
|
||||||
static void sam_checkreg(uintptr_t regaddr, uint32_t regval, bool iswrite);
|
static void sam_checkreg(uintptr_t regaddr, uint32_t regval, bool iswrite);
|
||||||
static uint32_t sam_getreg(uintptr_t regaddr);
|
static uint32_t sam_getreg(uintptr_t regaddr);
|
||||||
@@ -436,7 +436,7 @@ static inline void
|
|||||||
sam_req_abort(struct sam_ep_s *privep,
|
sam_req_abort(struct sam_ep_s *privep,
|
||||||
struct sam_req_s *privreq, int16_t result);
|
struct sam_req_s *privreq, int16_t result);
|
||||||
static void sam_req_complete(struct sam_ep_s *privep, int16_t result);
|
static void sam_req_complete(struct sam_ep_s *privep, int16_t result);
|
||||||
static void sam_ep_txrdy(unsigned int epno);
|
static void sam_ep_fifcon(unsigned int epno);
|
||||||
static void sam_req_wrsetup(struct sam_usbdev_s *priv,
|
static void sam_req_wrsetup(struct sam_usbdev_s *priv,
|
||||||
struct sam_ep_s *privep, struct sam_req_s *privreq);
|
struct sam_ep_s *privep, struct sam_req_s *privreq);
|
||||||
static int sam_req_write(struct sam_usbdev_s *priv,
|
static int sam_req_write(struct sam_usbdev_s *priv,
|
||||||
@@ -678,7 +678,7 @@ const struct trace_msg_t g_usb_trace_strings_intdecode[] =
|
|||||||
*
|
*
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
|
|
||||||
#ifdef CONFIG_SAMV7_USBDEVHS_REGDEBUG
|
#ifdef CONFIG_SAMV7_USBHS_REGDEBUG
|
||||||
static void sam_printreg(uintptr_t regaddr, uint32_t regval, bool iswrite)
|
static void sam_printreg(uintptr_t regaddr, uint32_t regval, bool iswrite)
|
||||||
{
|
{
|
||||||
lldbg("%p%s%08x\n", regaddr, iswrite ? "<-" : "->", regval);
|
lldbg("%p%s%08x\n", regaddr, iswrite ? "<-" : "->", regval);
|
||||||
@@ -694,7 +694,7 @@ static void sam_printreg(uintptr_t regaddr, uint32_t regval, bool iswrite)
|
|||||||
*
|
*
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
|
|
||||||
#ifdef CONFIG_SAMV7_USBDEVHS_REGDEBUG
|
#ifdef CONFIG_SAMV7_USBHS_REGDEBUG
|
||||||
static void sam_checkreg(uintptr_t regaddr, uint32_t regval, bool iswrite)
|
static void sam_checkreg(uintptr_t regaddr, uint32_t regval, bool iswrite)
|
||||||
{
|
{
|
||||||
static uintptr_t prevaddr = 0;
|
static uintptr_t prevaddr = 0;
|
||||||
@@ -758,7 +758,7 @@ static void sam_checkreg(uintptr_t regaddr, uint32_t regval, bool iswrite)
|
|||||||
*
|
*
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
|
|
||||||
#ifdef CONFIG_SAMV7_USBDEVHS_REGDEBUG
|
#ifdef CONFIG_SAMV7_USBHS_REGDEBUG
|
||||||
static uint32_t sam_getreg(uintptr_t regaddr)
|
static uint32_t sam_getreg(uintptr_t regaddr)
|
||||||
{
|
{
|
||||||
/* Read the value from the register */
|
/* Read the value from the register */
|
||||||
@@ -785,7 +785,7 @@ static inline uint32_t sam_getreg(uintptr_t regaddr)
|
|||||||
*
|
*
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
|
|
||||||
#ifdef CONFIG_SAMV7_USBDEVHS_REGDEBUG
|
#ifdef CONFIG_SAMV7_USBHS_REGDEBUG
|
||||||
static void sam_putreg(uint32_t regval, uintptr_t regaddr)
|
static void sam_putreg(uint32_t regval, uintptr_t regaddr)
|
||||||
{
|
{
|
||||||
/* Check if we need to print this value */
|
/* Check if we need to print this value */
|
||||||
@@ -807,7 +807,7 @@ static inline void sam_putreg(uint32_t regval, uint32_t regaddr)
|
|||||||
* Name: sam_dumpep
|
* Name: sam_dumpep
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
#if defined(CONFIG_SAMV7_USBDEVHS_REGDEBUG) && defined(CONFIG_DEBUG)
|
#if defined(CONFIG_SAMV7_USBHS_REGDEBUG) && defined(CONFIG_DEBUG)
|
||||||
static void sam_dumpep(struct sam_usbdev_s *priv, int epno)
|
static void sam_dumpep(struct sam_usbdev_s *priv, int epno)
|
||||||
{
|
{
|
||||||
/* Global Registers */
|
/* Global Registers */
|
||||||
@@ -1161,23 +1161,24 @@ static void sam_req_complete(struct sam_ep_s *privep, int16_t result)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Name: sam_ep_txrdy
|
* Name: sam_ep_fifcon
|
||||||
*
|
*
|
||||||
* Description:
|
* Description:
|
||||||
* IN data has been loaded in the endpoint FIFO. Manage the endpoint to
|
* IN data has been loaded in the endpoint FIFO. Manage the endpoint to
|
||||||
* (1) initiate sending of the data and (2) receive the TXRDY interrupt
|
* (1) initiate sending of the data and (2) receive the TXIN interrupt
|
||||||
* when the transfer completes.
|
* when the transfer completes.
|
||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
static void sam_ep_txrdy(unsigned int epno)
|
static void sam_ep_fifcon(unsigned int epno)
|
||||||
{
|
{
|
||||||
/* Clear FIFOCON to indicate that the packet is ready to send (this works even
|
/* Clear FIFOCON to indicate that the packet is ready to send (this works
|
||||||
* for zero length packets). We will get an TXCOMP interrupt with TXRDY
|
* even for zero length packets). We will get an TXIN interrupt with
|
||||||
* cleared. Then we are able to send the next packet.
|
* FIFCON=1 when the transfer completes. Then we are able to send the
|
||||||
|
* next packet.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
sam_putreg(USBHS_DEVEPTINT_FIFOCONI, SAM_USBHS_DEVEPTICR(epno));
|
sam_putreg(USBHS_DEVEPTINT_FIFOCONI, SAM_USBHS_DEVEPTIDR(epno));
|
||||||
|
|
||||||
/* Clear the NAK IN bit to stop NAKing IN tokens from the host. We now
|
/* Clear the NAK IN bit to stop NAKing IN tokens from the host. We now
|
||||||
* have data ready to go.
|
* have data ready to go.
|
||||||
@@ -1212,9 +1213,11 @@ static void sam_req_wrsetup(struct sam_usbdev_s *priv,
|
|||||||
|
|
||||||
epno = USB_EPNO(privep->ep.eplog);
|
epno = USB_EPNO(privep->ep.eplog);
|
||||||
|
|
||||||
/* Write access to the FIFO is not possible if TXDRY is set */
|
/* Write access to the FIFO is not possible if FIFOCON is clear (meaning
|
||||||
|
* that a write is already in progress.
|
||||||
|
*/
|
||||||
|
|
||||||
DEBUGASSERT((sam_getreg(SAM_USBHS_DEVEPTISR(epno)) & USBHS_EPTSTA_TXRDY) == 0);
|
DEBUGASSERT((sam_getreg(SAM_USBHS_DEVEPTISR(epno)) & USBHS_DEVEPTINT_FIFOCONI) != 0);
|
||||||
|
|
||||||
/* Get the number of bytes remaining to be sent. */
|
/* Get the number of bytes remaining to be sent. */
|
||||||
|
|
||||||
@@ -1264,7 +1267,7 @@ static void sam_req_wrsetup(struct sam_usbdev_s *priv,
|
|||||||
* interrupt.
|
* interrupt.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
sam_ep_txrdy(epno);
|
sam_ep_fifcon(epno);
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
@@ -1404,8 +1407,8 @@ static int sam_req_write(struct sam_usbdev_s *priv, struct sam_ep_s *privep)
|
|||||||
/* If we get here, then we sent the last of the data on the
|
/* If we get here, then we sent the last of the data on the
|
||||||
* previous pass and we need to send the zero length packet now.
|
* previous pass and we need to send the zero length packet now.
|
||||||
*
|
*
|
||||||
* A Zero Length Packet can be sent by setting just the TXRDY flag
|
* A Zero Length Packet can be sent by clearing just the FIFOCON flag
|
||||||
* in the USBHS_EPTSETSTAx register
|
* in the USBHS_DEVTEPTIDRx register
|
||||||
*/
|
*/
|
||||||
|
|
||||||
privep->epstate = USBHS_EPSTATE_SENDING;
|
privep->epstate = USBHS_EPSTATE_SENDING;
|
||||||
@@ -1417,7 +1420,7 @@ static int sam_req_write(struct sam_usbdev_s *priv, struct sam_ep_s *privep)
|
|||||||
* transfer complete interrupt.
|
* transfer complete interrupt.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
sam_ep_txrdy(epno);
|
sam_ep_fifcon(epno);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If all of the bytes were sent (including any final zero length
|
/* If all of the bytes were sent (including any final zero length
|
||||||
@@ -1767,7 +1770,7 @@ static void sam_ep0_wrstatus(const uint8_t *buffer, size_t buflen)
|
|||||||
* interrupt.
|
* interrupt.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
sam_ep_txrdy(EP0);
|
sam_ep_fifcon(EP0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
@@ -2545,9 +2548,7 @@ static void sam_ep_interrupt(struct sam_usbdev_s *priv, int epno)
|
|||||||
if (privep->epstate == USBHS_EPSTATE_SENDING ||
|
if (privep->epstate == USBHS_EPSTATE_SENDING ||
|
||||||
privep->epstate == USBHS_EPSTATE_EP0STATUSIN)
|
privep->epstate == USBHS_EPSTATE_EP0STATUSIN)
|
||||||
{
|
{
|
||||||
/* Continue/resume processing the write requests. TXRDY will
|
/* Continue/resume processing the write requests. */
|
||||||
* be disabled when the last transfer completes.
|
|
||||||
*/
|
|
||||||
|
|
||||||
privep->epstate = USBHS_EPSTATE_IDLE;
|
privep->epstate = USBHS_EPSTATE_IDLE;
|
||||||
(void)sam_req_write(priv, privep);
|
(void)sam_req_write(priv, privep);
|
||||||
@@ -3388,9 +3389,7 @@ static int sam_ep_configure_internal(struct sam_ep_s *privep,
|
|||||||
|
|
||||||
if ((SAM_EPSET_DMA & SAM_EP_BIT(epno)) != 0)
|
if ((SAM_EPSET_DMA & SAM_EP_BIT(epno)) != 0)
|
||||||
{
|
{
|
||||||
/* Select AUTO_VALID so that the hardware will manage RXRDY_TXKL
|
/* Select AUTO_VALID so that the hardware will manage FIFCON. */
|
||||||
* and TXRDY.
|
|
||||||
*/
|
|
||||||
|
|
||||||
regaddr = SAM_USBHS_DEVEPTCFG(epno);
|
regaddr = SAM_USBHS_DEVEPTCFG(epno);
|
||||||
regval |= USBHS_DEVEPTCFG_AUTOSW;
|
regval |= USBHS_DEVEPTCFG_AUTOSW;
|
||||||
@@ -3398,7 +3397,7 @@ static int sam_ep_configure_internal(struct sam_ep_s *privep,
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* No DMA... Software will manage RXRDY_TXKL and TXRDY. */
|
/* No DMA... Software will manage FIFOCON. */
|
||||||
|
|
||||||
regval = USBHS_DEVEPTINT_KILLBKI | USBHS_DEVEPTINT_RXSTPI;
|
regval = USBHS_DEVEPTINT_KILLBKI | USBHS_DEVEPTINT_RXSTPI;
|
||||||
sam_putreg(regval, SAM_USBHS_DEVEPTIER(epno));
|
sam_putreg(regval, SAM_USBHS_DEVEPTIER(epno));
|
||||||
|
|||||||
Reference in New Issue
Block a user