9
0
Fork 0

Fix PIC32 USB double buffer toggle

git-svn-id: https://nuttx.svn.sourceforge.net/svnroot/nuttx/trunk@4492 7fd9a85b-ad96-42d3-883c-3090e2eb8679
This commit is contained in:
patacongo 2012-03-15 22:56:46 +00:00
parent d9c814d791
commit 96775032ad
1 changed files with 16 additions and 15 deletions

View File

@ -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.
*/