Fix direction logic in the submit method

git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@2204 42af7a65-404d-4744-a932-0658087f49c3
This commit is contained in:
patacongo 2009-10-31 19:14:00 +00:00
parent 4f239a2fa7
commit 54d8372694

View File

@ -1857,8 +1857,8 @@ static void stm32_ep0setup(struct stm32_usbdev_s *priv)
* 1. The setup request was successfully handled above and a response packet * 1. The setup request was successfully handled above and a response packet
* must be sent (may be a zero length packet). * must be sent (may be a zero length packet).
* 2. The request was successfully handled by the class implementation. In * 2. The request was successfully handled by the class implementation. In
* case, the response has already been sent and the local variable 'handled' * case, the EP0 IN response has already been queued and the local variable
* will be set to TRUE; * 'handled' will be set to TRUE;
* 3. An error was detected in either the above logic or by the class implementation * 3. An error was detected in either the above logic or by the class implementation
* logic. In either case, priv->state will be set DEVSTATE_STALLED * logic. In either case, priv->state will be set DEVSTATE_STALLED
* to indicate this case. * to indicate this case.
@ -1872,9 +1872,13 @@ static void stm32_ep0setup(struct stm32_usbdev_s *priv)
} }
else if ((priv->ctrl.type & USB_REQ_DIR_IN) != 0) else if ((priv->ctrl.type & USB_REQ_DIR_IN) != 0)
{ {
/* Check if the class driver already handled the IN response */
if (!handled) if (!handled)
{ {
/* Restrict the data length to requested length */ /* NO.. Then we will respond. First, restrict the data length to
* the length requested in the setup packet
*/
if (nbytes > len.w) if (nbytes > len.w)
{ {
@ -2800,9 +2804,12 @@ static int stm32_epsubmit(struct usbdev_ep_s *ep, struct usbdev_req_s *req)
ret = -EBUSY; ret = -EBUSY;
} }
/* Handle IN (device-to-host) requests */ /* Handle IN (device-to-host) requests. NOTE: If the class device is
* using the bi-directional EP0, then we assume that they intend the EP0
* IN functionality.
*/
else if (USB_ISEPIN(ep->eplog)) else if (USB_ISEPIN(ep->eplog) || USB_EPNO(ep->eplog) == EP0)
{ {
/* Add the new request to the request queue for the IN endpoint */ /* Add the new request to the request queue for the IN endpoint */