diff options
author | patacongo <patacongo@7fd9a85b-ad96-42d3-883c-3090e2eb8679> | 2012-03-15 22:56:46 +0000 |
---|---|---|
committer | patacongo <patacongo@7fd9a85b-ad96-42d3-883c-3090e2eb8679> | 2012-03-15 22:56:46 +0000 |
commit | 96775032ada3aab8f7ad321eaba1a0ee131bb8d7 (patch) | |
tree | 1818dd1a3bfc0355cf2ae09f887254733336680e /nuttx | |
parent | d9c814d791eb814fb69f2669905bd9e80af8e6ae (diff) |
Fix PIC32 USB double buffer toggle
git-svn-id: https://nuttx.svn.sourceforge.net/svnroot/nuttx/trunk@4492 7fd9a85b-ad96-42d3-883c-3090e2eb8679
Diffstat (limited to 'nuttx')
-rw-r--r-- | nuttx/arch/mips/src/pic32mx/pic32mx-usbdev.c | 31 |
1 files changed, 16 insertions, 15 deletions
diff --git a/nuttx/arch/mips/src/pic32mx/pic32mx-usbdev.c b/nuttx/arch/mips/src/pic32mx/pic32mx-usbdev.c index b0a73dc206..d50c938abb 100644 --- a/nuttx/arch/mips/src/pic32mx/pic32mx-usbdev.c +++ b/nuttx/arch/mips/src/pic32mx/pic32mx-usbdev.c @@ -2259,31 +2259,17 @@ static void pic32mx_ep0incomplete(struct pic32mx_usbdev_s *priv) { struct pic32mx_ep_s *ep0 = &priv->eplist[EP0]; volatile struct usbotg_bdtentry_s *bdtlast; - volatile struct usbotg_bdtentry_s *bdtnext; int ret; - /* Get the last and the next IN BDT */ + /* Get the last BDT and make sure that we own it. */ bdtlast = ep0->bdtin; - if (bdtlast == &g_bdt[EP0_IN_EVEN]) - { - bdtnext = &g_bdt[EP0_IN_ODD]; - } - else - { - DEBUGASSERT(bdtlast == &g_bdt[EP0_IN_ODD]); - bdtnext = &g_bdt[EP0_IN_EVEN]; - } /* Make sure that we own the last BDT. */ bdtlast->status = 0; bdtlast->addr = 0; - /* Save the next BDT as the current BDT */ - - ep0->bdtin = bdtnext; - /* Are we processing the completion of one packet of an outgoing request * from the class driver? */ @@ -2292,6 +2278,9 @@ static void pic32mx_ep0incomplete(struct pic32mx_usbdev_s *priv) { /* An outgoing EP0 transfer has completed. Update the byte count and * check for the completion of the transfer. + * + * NOTE: pic32mx_wrcomplete() will toggle bdtin to the other buffer so + * we do not need to that for this case. */ pic32mx_wrcomplete(priv, &priv->eplist[EP0]); @@ -2318,6 +2307,18 @@ static void pic32mx_ep0incomplete(struct pic32mx_usbdev_s *priv) else if (priv->ctrlstate == CTRLSTATE_WAITSETUP) { + /* Get the next IN BDT */ + + if (bdtlast == &g_bdt[EP0_IN_EVEN]) + { + ep0->bdtin = &g_bdt[EP0_IN_ODD]; + } + else + { + DEBUGASSERT(bdtlast == &g_bdt[EP0_IN_ODD]); + ep0->bdtin = &g_bdt[EP0_IN_EVEN]; + } + /* Look at the saved SETUP command. Was it a SET ADDRESS request? * If so, then now is the time to set the address. */ |