SAM4E: Fix a few more UDP bring-up bugs. Still not working

This commit is contained in:
Gregory Nutt
2014-03-18 11:00:20 -06:00
parent d5364f85b2
commit 7e2436d4cc
2 changed files with 34 additions and 29 deletions
+1 -1
View File
@@ -86,7 +86,7 @@
#define SAM_UDP_ISR_OFFSET 0x001c /* UDP Interrupt Status Register */ #define SAM_UDP_ISR_OFFSET 0x001c /* UDP Interrupt Status Register */
#define SAM_UDP_ICR_OFFSET 0x0020 /* UDP Interrupt Clear Register */ #define SAM_UDP_ICR_OFFSET 0x0020 /* UDP Interrupt Clear Register */
/* 0x0024: Reserved */ /* 0x0024: Reserved */
#define SAM_UDP_RSTEP_OFFSET 0x001c /* UDP Reset Endpoint Register */ #define SAM_UDP_RSTEP_OFFSET 0x0028 /* UDP Reset Endpoint Register */
/* 0x002c: Reserved */ /* 0x002c: Reserved */
/* Endpoint registers */ /* Endpoint registers */
+33 -28
View File
@@ -1,5 +1,5 @@
/**************************************************************************** /****************************************************************************
* arch/arm/src/sam34/sam_udphs.c * arch/arm/src/sam34/sam_udp.c
* *
* Copyright (C) 2014 Gregory Nutt. All rights reserved. * Copyright (C) 2014 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.orgr> * Author: Gregory Nutt <gnutt@nuttx.orgr>
@@ -101,7 +101,7 @@
/* Endpoint definitions (Assuming 8 endpoints) */ /* Endpoint definitions (Assuming 8 endpoints) */
#define EP0 (0) #define EP0 (0)
#define SAM_EPSET_ALL (0xff) /* All endpoints */ #define SAM_EPSET_ALL (0xff) /* All endpoints */
#define SAM_EPSET_NOTEP0 (0xfe) /* All endpoints except EP0 */ #define SAM_EPSET_NOTEP0 (0xfe) /* All endpoints except EP0 */
#define SAM_EP_BIT(ep) (1 << (ep)) #define SAM_EP_BIT(ep) (1 << (ep))
#define SAM_EP0_MAXPACKET (64) /* EP0 Max. packet size */ #define SAM_EP0_MAXPACKET (64) /* EP0 Max. packet size */
@@ -399,7 +399,7 @@ static void sam_ep0_setup(struct sam_usbdev_s *priv);
static void sam_ep_bankinterrupt(struct sam_usbdev_s *priv, static void sam_ep_bankinterrupt(struct sam_usbdev_s *priv,
struct sam_ep_s *privep, uint32_t csr, int bank); struct sam_ep_s *privep, uint32_t csr, int bank);
static void sam_ep_interrupt(struct sam_usbdev_s *priv, int epno); static void sam_ep_interrupt(struct sam_usbdev_s *priv, int epno);
static int sam_udphs_interrupt(int irq, void *context); static int sam_udp_interrupt(int irq, void *context);
/* Endpoint helpers *********************************************************/ /* Endpoint helpers *********************************************************/
@@ -739,14 +739,14 @@ static void sam_dumpep(struct sam_usbdev_s *priv, uint8_t epno)
/* Global Registers */ /* Global Registers */
lldbg("Global Registers:\n"); lldbg("Global Registers:\n");
lldbg(" FRMNUM: %04x\n", sam_getreg(SAM_UDP_FRMNUM)); lldbg(" FRMNUM: %08x\n", sam_getreg(SAM_UDP_FRMNUM));
lldbg("GLBSTAT: %04x\n", sam_getreg(SAM_UDP_GLBSTAT)); lldbg("GLBSTAT: %08x\n", sam_getreg(SAM_UDP_GLBSTAT));
lldbg(" FADDR: %04x\n", sam_getreg(SAM_UDP_FADDR)); lldbg(" FADDR: %08x\n", sam_getreg(SAM_UDP_FADDR));
lldbg(" IMR: %04x\n", sam_getreg(SAM_UDP_IMR)); lldbg(" IMR: %08x\n", sam_getreg(SAM_UDP_IMR));
lldbg(" ISR: %04x\n", sam_getreg(SAM_UDP_ISR)); lldbg(" ISR: %08x\n", sam_getreg(SAM_UDP_ISR));
lldbg(" RSTEP: %04x\n", sam_getreg(SAM_UDP_RSTEP)); lldbg(" RSTEP: %08x\n", sam_getreg(SAM_UDP_RSTEP));
lldbg(" TXVC: %04x\n", sam_getreg(SAM_UDP_TXVC)); lldbg(" TXVC: %08x\n", sam_getreg(SAM_UDP_TXVC));
lldbg(" CSR[%d]: %04x\n", epno, sam_getreg(SAM_UDPEP_CSR(epno))); lldbg(" CSR[%d]: %08x\n", epno, sam_getreg(SAM_UDPEP_CSR(epno)));
} }
#endif #endif
@@ -2177,14 +2177,14 @@ static void sam_ep_interrupt(struct sam_usbdev_s *priv, int epno)
} }
/**************************************************************************** /****************************************************************************
* Name: sam_udphs_interrupt * Name: sam_udp_interrupt
* *
* Description: * Description:
* Handle the UDP interrupt * Handle the UDP interrupt
* *
****************************************************************************/ ****************************************************************************/
static int sam_udphs_interrupt(int irq, void *context) static int sam_udp_interrupt(int irq, void *context)
{ {
/* For now there is only one USB controller, but we will always refer to /* For now there is only one USB controller, but we will always refer to
* it using a pointer to make any future ports to multiple UDP controllers * it using a pointer to make any future ports to multiple UDP controllers
@@ -2217,12 +2217,13 @@ static int sam_udphs_interrupt(int irq, void *context)
if ((pending == UDP_INT_RXSUSP) != 0) if ((pending == UDP_INT_RXSUSP) != 0)
{ {
usbtrace(TRACE_INTDECODE(SAM_TRACEINTID_DETSUSPD), (uint16_t)pending); usbtrace(TRACE_INTDECODE(SAM_TRACEINTID_DETSUSPD),
(uint16_t)pending);
/* Enable wakeup interrupts */ /* Enable wakeup interrupts */
sam_putreg(UDP_INT_RXSUSP, SAM_UDP_IDR); sam_putreg(UDP_INT_RXSUSP, SAM_UDP_IDR);
sam_putreg(UDP_INT_WAKEUP, SAM_UDP_IER); sam_putreg(UDP_INT_WAKEUP | UDP_INT_RXRSM, SAM_UDP_IER);
/* Acknowledge interrupt */ /* Acknowledge interrupt */
@@ -2246,24 +2247,27 @@ static int sam_udphs_interrupt(int irq, void *context)
{ {
/* Acknowledge interrupt */ /* Acknowledge interrupt */
usbtrace(TRACE_INTDECODE(SAM_TRACEINTID_INTSOF), (uint16_t)pending); usbtrace(TRACE_INTDECODE(SAM_TRACEINTID_INTSOF),
(uint16_t)pending);
sam_putreg(UDP_INT_SOF, SAM_UDP_ICR); sam_putreg(UDP_INT_SOF, SAM_UDP_ICR);
} }
/* Resume */ /* Resume */
else if ((pending & UDP_INT_WAKEUP) != 0) else if ((pending & UDP_INT_WAKEUP | UDP_INT_RXRSM) != 0)
{ {
usbtrace(TRACE_INTDECODE(SAM_TRACEINTID_WAKEUP), (uint16_t)pending); usbtrace(TRACE_INTDECODE(SAM_TRACEINTID_WAKEUP),
(uint16_t)pending);
sam_resume(priv); sam_resume(priv);
/* Acknowledge interrupt */ /* Acknowledge interrupt */
sam_putreg(UDP_INT_WAKEUP | UDP_INT_RXSUSP, SAM_UDP_ICR); sam_putreg(UDP_INT_WAKEUP | UDP_INT_RXRSM | UDP_INT_RXSUSP,
SAM_UDP_ICR);
/* Enable suspend interrupts */ /* Enable suspend interrupts */
sam_putreg(UDP_INT_WAKEUP, SAM_UDP_IDR); sam_putreg(UDP_INT_WAKEUP | UDP_INT_RXRSM, SAM_UDP_IDR);
sam_putreg(UDP_INT_RXSUSP, SAM_UDP_IER); sam_putreg(UDP_INT_RXSUSP, SAM_UDP_IER);
} }
@@ -2294,7 +2298,8 @@ static int sam_udphs_interrupt(int irq, void *context)
if ((pending & UDP_ISR_ENDBUSRES) != 0) if ((pending & UDP_ISR_ENDBUSRES) != 0)
{ {
usbtrace(TRACE_INTDECODE(SAM_TRACEINTID_ENDRESET), (uint16_t)pending); usbtrace(TRACE_INTDECODE(SAM_TRACEINTID_ENDRESET),
(uint16_t)pending);
/* Handle the reset */ /* Handle the reset */
@@ -2472,7 +2477,7 @@ static void sam_resume(struct sam_usbdev_s *priv)
* Name: sam_ep_reset * Name: sam_ep_reset
* *
* Description * Description
* Reset and disable a set of endpoints. * Reset and disable one endpoints.
* *
****************************************************************************/ ****************************************************************************/
@@ -2504,10 +2509,6 @@ static void sam_ep_reset(struct sam_usbdev_s *priv, uint8_t epno)
privep->halted = false; privep->halted = false;
privep->zlpneeded = false; privep->zlpneeded = false;
privep->zlpsent = false; privep->zlpsent = false;
/* Re-enable endpoint interrupt */
sam_putreg(UDP_INT_EP(epno), SAM_UDP_IER);
} }
/**************************************************************************** /****************************************************************************
@@ -2533,7 +2534,7 @@ static void sam_epset_reset(struct sam_usbdev_s *priv, uint16_t epset)
if ((epset & bit) != 0) if ((epset & bit) != 0)
{ {
/* Yes.. reset it */ /* Yes.. reset and disable it */
sam_ep_reset(priv, epno); sam_ep_reset(priv, epno);
epset &= ~bit; epset &= ~bit;
@@ -2675,6 +2676,10 @@ static int sam_ep_configure_internal(struct sam_ep_s *privep,
sam_putreg(UDP_INT_EP(epno), SAM_UDP_IDR); sam_putreg(UDP_INT_EP(epno), SAM_UDP_IDR);
/* Wait for the endpoint to come out of reset */
while ((sam_getreg(SAM_UDP_RSTEP) & UDP_RSTEP(epno)) != 0);
/* Configure and enable the endpoint */ /* Configure and enable the endpoint */
regval = (((uint32_t)dirin << UDPEP_CSR_DIR_SHIFT) | UDPEP_CSR_EPEDS); regval = (((uint32_t)dirin << UDPEP_CSR_DIR_SHIFT) | UDPEP_CSR_EPEDS);
@@ -3759,7 +3764,7 @@ void up_usbinitialize(void)
* them when we need them later. * them when we need them later.
*/ */
if (irq_attach(SAM_IRQ_UDP, sam_udphs_interrupt) != 0) if (irq_attach(SAM_IRQ_UDP, sam_udp_interrupt) != 0)
{ {
usbtrace(TRACE_DEVERROR(SAM_TRACEERR_IRQREGISTRATION), usbtrace(TRACE_DEVERROR(SAM_TRACEERR_IRQREGISTRATION),
(uint16_t)SAM_IRQ_UDP); (uint16_t)SAM_IRQ_UDP);