Explorar o código

replace dcd_xfer_complete by dcd_xfer_complete()

hathach %!s(int64=7) %!d(string=hai) anos
pai
achega
55427606ef

+ 4 - 4
src/class/msc/msc_device.c

@@ -304,7 +304,7 @@ tusb_error_t mscd_xfer_cb(uint8_t rhport, uint8_t ep_addr, tusb_event_t event, u
       // Complete IN while waiting for CMD is usually Status of previous SCSI op, ignore it
       if(ep_addr != p_msc->ep_out) return TUSB_ERROR_NONE;
 
-      TU_ASSERT( event == TUSB_EVENT_XFER_COMPLETE  &&
+      TU_ASSERT( event == DCD_XFER_SUCCESS  &&
                  xferred_bytes == sizeof(msc_cbw_t) && p_cbw->signature == MSC_CBW_SIGNATURE, TUSB_ERROR_INVALID_PARA );
 
       p_csw->signature    = MSC_CSW_SIGNATURE;
@@ -434,7 +434,7 @@ tusb_error_t mscd_xfer_cb(uint8_t rhport, uint8_t ep_addr, tusb_event_t event, u
               }
 
               // simulate an transfer complete with adjusted parameters --> this driver callback will fired again
-              dcd_xfer_complete(rhport, p_msc->ep_out, xferred_bytes-nbytes, true);
+              dcd_event_xfer_complete(rhport, p_msc->ep_out, xferred_bytes-nbytes, DCD_XFER_SUCCESS, false);
 
               return TUSB_ERROR_NONE; // skip the rest
             }
@@ -483,7 +483,7 @@ tusb_error_t mscd_xfer_cb(uint8_t rhport, uint8_t ep_addr, tusb_event_t event, u
     if ( dcd_edpt_stalled(rhport,  p_msc->ep_in) || dcd_edpt_stalled(rhport,  p_msc->ep_out) )
     {
       // simulate an transfer complete with adjusted parameters --> this driver callback will fired again
-      dcd_xfer_complete(rhport, p_msc->ep_out, 0, true);
+      dcd_event_xfer_complete(rhport, p_msc->ep_out, 0, DCD_XFER_SUCCESS, false);
     }
     else
     {
@@ -545,7 +545,7 @@ static void proc_read10_cmd(uint8_t rhport, mscd_interface_t* p_msc)
   else if ( nbytes == 0 )
   {
     // zero means not ready -> simulate an transfer complete so that this driver callback will fired again
-    dcd_xfer_complete(rhport, p_msc->ep_in, 0, true);
+    dcd_event_xfer_complete(rhport, p_msc->ep_in, 0, DCD_XFER_SUCCESS, false);
   }
   else
   {

+ 0 - 3
src/common/tusb_types.h

@@ -197,9 +197,6 @@ typedef enum
   TUSB_EVENT_XFER_COMPLETE,
   TUSB_EVENT_XFER_ERROR,
   TUSB_EVENT_XFER_STALLED,
-
-  TUSB_EVENT_BUS_RESET, // TODO refractor
-  TUSB_EVENT_SETUP_RECEIVED,
 }tusb_event_t;
 
 enum {

+ 20 - 6
src/device/dcd.h

@@ -49,6 +49,13 @@
  extern "C" {
 #endif
 
+enum
+{
+  DCD_XFER_SUCCESS = 0,
+  DCD_XFER_FAILED,
+  DCD_XFER_STALLED
+};
+
 typedef enum
 {
   DCD_EVENT_BUS_RESET = 1,
@@ -103,15 +110,22 @@ void dcd_disconnect       (uint8_t rhport) ATTR_WEAK;
 /* Event Function
  * Called by DCD to notify USBD
  *------------------------------------------------------------------*/
-void dcd_xfer_complete    (uint8_t rhport, uint8_t ep_addr, uint32_t xferred_bytes, bool succeeded);
+void dcd_event_handler(dcd_event_t const * event, bool in_isr);
 
-static inline void dcd_control_complete(uint8_t rhport, uint32_t xferred_bytes)
+static inline void dcd_event_xfer_complete(uint8_t rhport, uint8_t ep_addr, uint32_t xferred_bytes, uint8_t result, bool in_isr)
 {
-  // all control complete is successful !!
-  dcd_xfer_complete(rhport, 0, xferred_bytes, true);
-}
+  dcd_event_t event =
+  {
+   .rhport   = 0,
+   .event_id = DCD_EVENT_XFER_COMPLETE,
+  };
 
-void dcd_event_handler(dcd_event_t const * event, bool in_isr);
+  event.xfer_complete.ep_addr = ep_addr;
+  event.xfer_complete.len     = xferred_bytes;
+  event.xfer_complete.result  = result;
+
+  dcd_event_handler(&event, true);
+}
 
 /*------------------------------------------------------------------*/
 /* Endpoint API

+ 17 - 29
src/device/usbd.c

@@ -164,7 +164,7 @@ static osal_queue_t _usbd_q;
 
 /*------------- control transfer semaphore -------------*/
 static osal_semaphore_def_t _usbd_sem_def;
-/*static*/ osal_semaphore_t _usbd_ctrl_sem;
+osal_semaphore_t _usbd_ctrl_sem;
 
 //--------------------------------------------------------------------+
 // INTERNAL FUNCTION
@@ -532,34 +532,6 @@ static void mark_interface_endpoint(uint8_t const* p_desc, uint16_t desc_len, ui
 //--------------------------------------------------------------------+
 // USBD-DCD Callback API
 //--------------------------------------------------------------------+
-void dcd_xfer_complete(uint8_t rhport, uint8_t ep_addr, uint32_t xferred_bytes, bool succeeded)
-{
-  if (ep_addr == 0 )
-  {
-    // Control Transfer
-    (void) rhport;
-    (void) succeeded;
-
-    // only signal data stage, skip status (zero byte)
-    if (xferred_bytes) osal_semaphore_post( _usbd_ctrl_sem, true);
-  }else
-  {
-    dcd_event_t event =
-    {
-        .rhport   = rhport,
-        .event_id = DCD_EVENT_XFER_COMPLETE,
-    };
-
-    event.xfer_complete.ep_addr = ep_addr;
-    event.xfer_complete.len     = xferred_bytes;
-    event.xfer_complete.result  = succeeded ? TUSB_EVENT_XFER_COMPLETE : TUSB_EVENT_XFER_ERROR;
-
-    osal_queue_send(_usbd_q, &event, true);
-  }
-
-  TU_ASSERT(succeeded, );
-}
-
 void dcd_event_handler(dcd_event_t const * event, bool in_isr)
 {
   uint8_t const rhport = event->rhport;
@@ -603,6 +575,22 @@ void dcd_event_handler(dcd_event_t const * event, bool in_isr)
       osal_queue_send(_usbd_q, event, in_isr);
     break;
 
+    case DCD_EVENT_XFER_COMPLETE:
+      if (event->xfer_complete.ep_addr == 0)
+      {
+        // only signal data stage, skip status (zero byte)
+        if (event->xfer_complete.len)
+        {
+          (void) event->xfer_complete.result; // TODO handle control error/stalled
+          osal_semaphore_post( _usbd_ctrl_sem, true);
+        }
+      }else
+      {
+        osal_queue_send(_usbd_q, event, true);
+      }
+      TU_ASSERT(event->xfer_complete.result == DCD_XFER_SUCCESS,);
+    break;
+
     default: break;
   }
 }

+ 7 - 9
src/portable/nordic/nrf5x/dcd_nrf5x.c

@@ -414,14 +414,12 @@ void USBD_IRQHandler(void)
     }
   }
 
-  dcd_event_t event = { .rhport = 0 };
-
   /*------------- Interrupt Processing -------------*/
   if ( int_status & USBD_INTEN_USBRESET_Msk )
   {
     bus_reset();
 
-    event.event_id = DCD_EVENT_BUS_RESET;
+    dcd_event_t event = { .rhport = 0, .event_id = DCD_EVENT_BUS_RESET };
     dcd_event_handler(&event, true);
   }
 
@@ -439,7 +437,7 @@ void USBD_IRQHandler(void)
         NRF_USBD->WINDEXL       , NRF_USBD->WINDEXH , NRF_USBD->WLENGTHL, NRF_USBD->WLENGTHH
     };
 
-    event.event_id = DCD_EVENT_SETUP_RECEIVED;
+    dcd_event_t event = { .rhport = 0, .event_id = DCD_EVENT_SETUP_RECEIVED };
     memcpy(&event.setup_received, setup, 8);
 
     dcd_event_handler(&event, true);
@@ -461,7 +459,7 @@ void USBD_IRQHandler(void)
       }else
       {
         // Control IN complete
-        dcd_control_complete(0, _dcd.control.actual_len);
+        dcd_event_xfer_complete(0, 0, _dcd.control.actual_len, DCD_XFER_SUCCESS, true);
       }
     }
   }
@@ -475,7 +473,7 @@ void USBD_IRQHandler(void)
     }else
     {
       // Control OUT complete
-      dcd_control_complete(0, _dcd.control.actual_len);
+      dcd_event_xfer_complete(0, 0, _dcd.control.actual_len, DCD_XFER_SUCCESS, true);
     }
   }
 
@@ -506,7 +504,7 @@ void USBD_IRQHandler(void)
         xfer->total_len = xfer->actual_len;
 
         // BULK/INT OUT complete
-        dcd_xfer_complete(0, epnum, xfer->actual_len, true);
+        dcd_event_xfer_complete(0, epnum, xfer->actual_len, DCD_XFER_SUCCESS, true);
       }
     }
 
@@ -535,7 +533,7 @@ void USBD_IRQHandler(void)
         } else
         {
           // Bulk/Int IN complete
-          dcd_xfer_complete(0, epnum | TUSB_DIR_IN_MASK, xfer->actual_len, true);
+          dcd_event_xfer_complete(0, epnum | TUSB_DIR_IN_MASK, xfer->actual_len, DCD_XFER_SUCCESS, true);
         }
       }
     }
@@ -563,7 +561,7 @@ void USBD_IRQHandler(void)
   // SOF interrupt
   if ( int_status & USBD_INTEN_SOF_Msk )
   {
-    event.event_id = DCD_EVENT_SOF;
+    dcd_event_t event = { .rhport = 0, .event_id = DCD_EVENT_SOF };
     dcd_event_handler(&event, true);
   }
 }

+ 11 - 11
src/portable/nxp/lpc43xx_lpc18xx/dcd_lpc43xx.c

@@ -398,10 +398,11 @@ void xfer_complete_isr(uint8_t rhport, uint32_t reg_complete)
 
         if (p_qtd->int_on_complete)
         {
-          bool succeeded = ( p_qtd->xact_err || p_qtd->halted || p_qtd->buffer_err ) ? false : true;
+          uint8_t result = p_qtd->halted  ? DCD_XFER_STALLED :
+                           ( p_qtd->xact_err ||p_qtd->buffer_err ) ? DCD_XFER_FAILED : DCD_XFER_SUCCESS;
 
           uint8_t ep_addr = edpt_phy2addr(ep_idx);
-          dcd_xfer_complete(rhport, ep_addr, p_qtd->expected_bytes - p_qtd->total_bytes, succeeded); // only number of bytes in the IOC qtd
+          dcd_event_xfer_complete(rhport, ep_addr, p_qtd->expected_bytes - p_qtd->total_bytes, result, true); // only number of bytes in the IOC qtd
         }
       }
     }
@@ -418,13 +419,12 @@ void hal_dcd_isr(uint8_t rhport)
 
   if (int_status == 0) return;// disabled interrupt sources
 
-  dcd_event_t event = { .rhport = rhport };
 
   if (int_status & INT_MASK_RESET)
   {
     bus_reset(rhport);
 
-    event.event_id = DCD_EVENT_BUS_RESET;
+    dcd_event_t event = { .rhport = rhport, .event_id = DCD_EVENT_BUS_RESET };
     dcd_event_handler(&event, true);
   }
 
@@ -434,7 +434,7 @@ void hal_dcd_isr(uint8_t rhport)
     { // Note: Host may delay more than 3 ms before and/or after bus reset before doing enumeration.
       if ((lpc_usb->DEVICEADDR >> 25) & 0x0f)
       {
-        event.event_id = DCD_EVENT_SUSPENDED;
+        dcd_event_t event = { .rhport = rhport, .event_id = DCD_EVENT_SUSPENDED };
         dcd_event_handler(&event, true);
       }
     }
@@ -445,7 +445,7 @@ void hal_dcd_isr(uint8_t rhport)
 //	{
 //	  if ( !(lpc_usb->PORTSC1_D & PORTSC_CURRENT_CONNECT_STATUS_MASK) )
 //	  {
-//      event.event_id = DCD_EVENT_UNPLUGGED;
+//      dcd_event_t event = { .rhport = rhport, .event_id = DCD_EVENT_UNPLUGGED };
 //      dcd_event_handler(&event, true);
 //	  }
 //	}
@@ -463,7 +463,7 @@ void hal_dcd_isr(uint8_t rhport)
       // 23.10.10.2 Operational model for setup transfers
       lpc_usb->ENDPTSETUPSTAT = lpc_usb->ENDPTSETUPSTAT;// acknowledge
 
-      event.event_id = DCD_EVENT_SETUP_RECEIVED;
+      dcd_event_t event = { .rhport = rhport, .event_id = DCD_EVENT_SETUP_RECEIVED };
       event.setup_received = p_dcd->qhd[0].setup_request;
 
       dcd_event_handler(&event, true);
@@ -480,10 +480,10 @@ void hal_dcd_isr(uint8_t rhport)
 
       if ( p_qtd->int_on_complete )
       {
-        bool succeeded = ( p_qtd->xact_err || p_qtd->halted || p_qtd->buffer_err ) ? false : true;
-        (void) succeeded;
+        uint8_t result = p_qtd->halted  ? DCD_XFER_STALLED :
+                        ( p_qtd->xact_err ||p_qtd->buffer_err ) ? DCD_XFER_FAILED : DCD_XFER_SUCCESS;
 
-        dcd_control_complete(rhport, p_qtd->expected_bytes - p_qtd->total_bytes);
+        dcd_event_xfer_complete(rhport, 0, p_qtd->expected_bytes - p_qtd->total_bytes, result, true);
       }
     }
 
@@ -496,7 +496,7 @@ void hal_dcd_isr(uint8_t rhport)
 
   if (int_status & INT_MASK_SOF)
   {
-    event.event_id = DCD_EVENT_SOF;
+    dcd_event_t event = { .rhport = rhport, .event_id = DCD_EVENT_SOF };
     dcd_event_handler(&event, true);
   }