Explorar el Código

Merge pull request #975 from hathach/max-endpoint

Add DCD Attribute for Max endpoint
Ha Thach hace 4 años
padre
commit
e971a4332d
Se han modificado 5 ficheros con 196 adiciones y 29 borrados
  1. 13 0
      src/device/dcd.h
  2. 160 0
      src/device/dcd_attr.h
  3. 8 7
      src/device/usbd.c
  4. 2 5
      src/device/usbd.h
  5. 13 17
      src/tusb_option.h

+ 13 - 0
src/device/dcd.h

@@ -30,11 +30,24 @@
 #include "common/tusb_common.h"
 #include "common/tusb_common.h"
 #include "osal/osal.h"
 #include "osal/osal.h"
 #include "common/tusb_fifo.h"
 #include "common/tusb_fifo.h"
+#include "dcd_attr.h"
 
 
 #ifdef __cplusplus
 #ifdef __cplusplus
  extern "C" {
  extern "C" {
 #endif
 #endif
 
 
+//--------------------------------------------------------------------+
+// Configuration
+//--------------------------------------------------------------------+
+
+#ifndef CFG_TUD_ENDPPOINT_MAX
+  #define CFG_TUD_ENDPPOINT_MAX   DCD_ATTR_ENDPOINT_MAX
+#endif
+
+//--------------------------------------------------------------------+
+// MACRO CONSTANT TYPEDEF PROTYPES
+//--------------------------------------------------------------------+
+
 typedef enum
 typedef enum
 {
 {
   DCD_EVENT_INVALID = 0,
   DCD_EVENT_INVALID = 0,

+ 160 - 0
src/device/dcd_attr.h

@@ -0,0 +1,160 @@
+/*
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2021, Ha Thach (tinyusb.org)
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ * This file is part of the TinyUSB stack.
+ */
+
+#ifndef TUSB_DCD_ATTR_H_
+#define TUSB_DCD_ATTR_H_
+
+#include "tusb_option.h"
+
+// Attribute includes
+// - ENDPOINT_MAX: max (logical) number of endpoint
+// - ENDPOINT_EXCLUSIVE_NUMBER: endpoint number with different direction IN and OUT aren't allowed,
+//                              e.g EP1 OUT & EP1 IN cannot exist together
+// - PORT_HIGHSPEED: mask to indicate which port support highspeed mode, bit0 for port0 and so on.
+
+//------------- NXP -------------//
+#if   TU_CHECK_MCU(LPC11UXX) || TU_CHECK_MCU(LPC13XX) || TU_CHECK_MCU(LPC15XX)
+  #define DCD_ATTR_ENDPOINT_MAX   5
+
+#elif TU_CHECK_MCU(LPC175X_6X) || TU_CHECK_MCU(LPC177X_8X) || TU_CHECK_MCU(LPC40XX)
+  #define DCD_ATTR_ENDPOINT_MAX   16
+
+#elif TU_CHECK_MCU(LPC18XX) || TU_CHECK_MCU(LPC43XX)
+  // TODO USB0 has 6, USB1 has 4
+  #define DCD_ATTR_ENDPOINT_MAX   6
+
+#elif TU_CHECK_MCU(LPC51UXX)
+   #define DCD_ATTR_ENDPOINT_MAX   5
+
+#elif TU_CHECK_MCU(LPC54XXX)
+  // TODO USB0 has 5, USB1 has 6
+  #define DCD_ATTR_ENDPOINT_MAX   6
+
+#elif TU_CHECK_MCU(LPC55XX)
+  // TODO USB0 has 5, USB1 has 6
+  #define DCD_ATTR_ENDPOINT_MAX   6
+
+#elif TU_CHECK_MCU(MIMXRT10XX)
+  #define DCD_ATTR_ENDPOINT_MAX   8
+
+#elif TU_CHECK_MCU(MKL25ZXX)
+  #define DCD_ATTR_ENDPOINT_MAX   16
+
+//------------- Nordic -------------//
+#elif TU_CHECK_MCU(NRF5X)
+  // 8 CBI + 1 ISO
+  #define DCD_ATTR_ENDPOINT_MAX   9
+
+//------------- Microchip -------------//
+#elif TU_CHECK_MCU(SAMD21) || TU_CHECK_MCU(SAMD51) || TU_CHECK_MCU(SAME5X) || \
+      TU_CHECK_MCU(SAMD11) || TU_CHECK_MCU(SAML21) || TU_CHECK_MCU(SAML22)
+  #define DCD_ATTR_ENDPOINT_MAX   8
+
+#elif TU_CHECK_MCU(SAMG)
+  #define DCD_ATTR_ENDPOINT_MAX   6
+  #define DCD_ATTR_ENDPOINT_EXCLUSIVE_NUMBER
+
+#elif TU_CHECK_MCU(SAMX7X)
+  #define DCD_ATTR_ENDPOINT_MAX   10
+  #define DCD_ATTR_ENDPOINT_EXCLUSIVE_NUMBER
+
+//------------- ST -------------//
+#elif TU_CHECK_MCU(STM32F0) || TU_CHECK_MCU(STM32F1) || TU_CHECK_MCU(STM32F3) || \
+      TU_CHECK_MCU(STM32L0) || TU_CHECK_MCU(STM32L1) || TU_CHECK_MCU(STM32L4)
+  // F1: F102, F103
+  // L4: L4x2, L4x3
+  #define DCD_ATTR_ENDPOINT_MAX   8
+
+#elif TU_CHECK_MCU(STM32F2) || TU_CHECK_MCU(STM32F4) || TU_CHECK_MCU(STM32F3)
+  // F1: F105, F107 only has 4
+  // L4: L4x5, L4x6 has 6
+  // For most mcu, FS has 4, HS has 6
+  #define DCD_ATTR_ENDPOINT_MAX   6
+
+#elif TU_CHECK_MCU(STM32F7)
+  // FS has 6, HS has 9
+  #define DCD_ATTR_ENDPOINT_MAX   9
+
+#elif TU_CHECK_MCU(STM32H7)
+  #define DCD_ATTR_ENDPOINT_MAX   9
+
+//------------- Sony -------------//
+#elif TU_CHECK_MCU(CXD56)
+  #define DCD_ATTR_ENDPOINT_MAX   7
+  #define DCD_ATTR_ENDPOINT_EXCLUSIVE_NUMBER
+
+//------------- TI -------------//
+#elif TU_CHECK_MCU(MSP430x5xx)
+  #define DCD_ATTR_ENDPOINT_MAX   8
+
+//------------- ValentyUSB -------------//
+#elif TU_CHECK_MCU(VALENTYUSB_EPTRI)
+  #define DCD_ATTR_ENDPOINT_MAX   16
+
+//------------- Nuvoton -------------//
+#elif TU_CHECK_MCU(NUC121) || TU_CHECK_MCU(NUC126)
+  #define DCD_ATTR_ENDPOINT_MAX   8
+
+#elif TU_CHECK_MCU(NUC120)
+  #define DCD_ATTR_ENDPOINT_MAX   6
+
+#elif TU_CHECK_MCU(NUC505)
+  #define DCD_ATTR_ENDPOINT_MAX   12
+
+//------------- Espressif -------------//
+#elif TU_CHECK_MCU(ESP32S2) || TU_CHECK_MCU(ESP32S3)
+  #define DCD_ATTR_ENDPOINT_MAX   6
+
+//------------- Dialog -------------//
+#elif TU_CHECK_MCU(DA1469X)
+  #define DCD_ATTR_ENDPOINT_MAX   4
+
+//------------- Raspberry Pi -------------//
+#elif TU_CHECK_MCU(RP2040)
+  #define DCD_ATTR_ENDPOINT_MAX   16
+
+//------------- Silabs -------------//
+#elif TU_CHECK_MCU(EFM32GG) || TU_CHECK_MCU(EFM32GG11) || TU_CHECK_MCU(EFM32GG12)
+  #define DCD_ATTR_ENDPOINT_MAX   7
+
+//------------- Renesas -------------//
+#elif TU_CHECK_MCU(RX63X) || TU_CHECK_MCU(RX65X)
+  #define DCD_ATTR_ENDPOINT_MAX   10
+
+//#elif TU_CHECK_MCU(MM32F327X)
+//  #define DCD_ATTR_ENDPOINT_MAX not knwon yet
+
+#else
+  #warning "DCD_ATTR_ENDPOINT_MAX is not defined for this MCU, default to 8"
+  #define DCD_ATTR_ENDPOINT_MAX   8
+#endif
+
+// Default to fullspeed if not defined
+//#ifndef PORT_HIGHSPEED
+//  #define DCD_ATTR_PORT_HIGHSPEED 0x00
+//#endif
+
+#endif

+ 8 - 7
src/device/usbd.c

@@ -33,12 +33,12 @@
 #include "device/usbd_pvt.h"
 #include "device/usbd_pvt.h"
 #include "device/dcd.h"
 #include "device/dcd.h"
 
 
-#ifndef CFG_TUD_TASK_QUEUE_SZ
-#define CFG_TUD_TASK_QUEUE_SZ   16
-#endif
+//--------------------------------------------------------------------+
+// USBD Configuration
+//--------------------------------------------------------------------+
 
 
-#ifndef CFG_TUD_EP_MAX
-#define CFG_TUD_EP_MAX          9
+#ifndef CFG_TUD_TASK_QUEUE_SZ
+  #define CFG_TUD_TASK_QUEUE_SZ   16
 #endif
 #endif
 
 
 //--------------------------------------------------------------------+
 //--------------------------------------------------------------------+
@@ -65,7 +65,7 @@ typedef struct
   uint8_t speed;
   uint8_t speed;
 
 
   uint8_t itf2drv[16];     // map interface number to driver (0xff is invalid)
   uint8_t itf2drv[16];     // map interface number to driver (0xff is invalid)
-  uint8_t ep2drv[CFG_TUD_EP_MAX][2]; // map endpoint to driver ( 0xff is invalid )
+  uint8_t ep2drv[CFG_TUD_ENDPPOINT_MAX][2]; // map endpoint to driver ( 0xff is invalid )
 
 
   struct TU_ATTR_PACKED
   struct TU_ATTR_PACKED
   {
   {
@@ -74,7 +74,7 @@ typedef struct
     volatile bool claimed : 1;
     volatile bool claimed : 1;
 
 
     // TODO merge ep2drv here, 4-bit should be sufficient
     // TODO merge ep2drv here, 4-bit should be sufficient
-  }ep_status[CFG_TUD_EP_MAX][2];
+  }ep_status[CFG_TUD_ENDPPOINT_MAX][2];
 
 
 }usbd_device_t;
 }usbd_device_t;
 
 
@@ -1151,6 +1151,7 @@ void usbd_defer_func(osal_task_func_t func, void* param, bool in_isr)
 bool usbd_edpt_open(uint8_t rhport, tusb_desc_endpoint_t const * desc_ep)
 bool usbd_edpt_open(uint8_t rhport, tusb_desc_endpoint_t const * desc_ep)
 {
 {
   TU_LOG2("  Open EP %02X with Size = %u\r\n", desc_ep->bEndpointAddress, desc_ep->wMaxPacketSize.size);
   TU_LOG2("  Open EP %02X with Size = %u\r\n", desc_ep->bEndpointAddress, desc_ep->wMaxPacketSize.size);
+  TU_ASSERT(tu_edpt_number(desc_ep->bEndpointAddress) < DCD_ATTR_ENDPOINT_MAX);
 
 
   switch (desc_ep->bmAttributes.xfer)
   switch (desc_ep->bmAttributes.xfer)
   {
   {

+ 2 - 5
src/device/usbd.h

@@ -24,18 +24,15 @@
  * This file is part of the TinyUSB stack.
  * This file is part of the TinyUSB stack.
  */
  */
 
 
-/** \ingroup group_usbd
- *  @{ */
-
 #ifndef _TUSB_USBD_H_
 #ifndef _TUSB_USBD_H_
 #define _TUSB_USBD_H_
 #define _TUSB_USBD_H_
 
 
+#include "common/tusb_common.h"
+
 #ifdef __cplusplus
 #ifdef __cplusplus
 extern "C" {
 extern "C" {
 #endif
 #endif
 
 
-#include "common/tusb_common.h"
-
 //--------------------------------------------------------------------+
 //--------------------------------------------------------------------+
 // Application API
 // Application API
 //--------------------------------------------------------------------+
 //--------------------------------------------------------------------+

+ 13 - 17
src/tusb_option.h

@@ -32,9 +32,11 @@
 #define TUSB_VERSION_REVISION  1
 #define TUSB_VERSION_REVISION  1
 #define TUSB_VERSION_STRING    TU_STRING(TUSB_VERSION_MAJOR) "." TU_STRING(TUSB_VERSION_MINOR) "." TU_STRING(TUSB_VERSION_REVISION)
 #define TUSB_VERSION_STRING    TU_STRING(TUSB_VERSION_MAJOR) "." TU_STRING(TUSB_VERSION_MINOR) "." TU_STRING(TUSB_VERSION_REVISION)
 
 
-/** \defgroup group_mcu Supported MCU
- * \ref CFG_TUSB_MCU must be defined to one of these
- *  @{ */
+//--------------------------------------------------------------------+
+// Supported MCUs
+// CFG_TUSB_MCU must be defined to one of following value
+//--------------------------------------------------------------------+
+#define TU_CHECK_MCU(_m)            (CFG_TUSB_MCU == OPT_MCU_##_m)
 
 
 #define OPT_MCU_NONE                0
 #define OPT_MCU_NONE                0
 
 
@@ -119,18 +121,16 @@
 // Mind Motion
 // Mind Motion
 #define OPT_MCU_MM32F327X        1500 ///< Mind Motion MM32F327
 #define OPT_MCU_MM32F327X        1500 ///< Mind Motion MM32F327
 
 
-/** @} */
+//--------------------------------------------------------------------+
+// Supported OS
+//--------------------------------------------------------------------+
 
 
-/** \defgroup group_supported_os Supported RTOS
- *  \ref CFG_TUSB_OS must be defined to one of these
- *  @{ */
 #define OPT_OS_NONE       1  ///< No RTOS
 #define OPT_OS_NONE       1  ///< No RTOS
 #define OPT_OS_FREERTOS   2  ///< FreeRTOS
 #define OPT_OS_FREERTOS   2  ///< FreeRTOS
 #define OPT_OS_MYNEWT     3  ///< Mynewt OS
 #define OPT_OS_MYNEWT     3  ///< Mynewt OS
 #define OPT_OS_CUSTOM     4  ///< Custom OS is implemented by application
 #define OPT_OS_CUSTOM     4  ///< Custom OS is implemented by application
 #define OPT_OS_PICO       5  ///< Raspberry Pi Pico SDK
 #define OPT_OS_PICO       5  ///< Raspberry Pi Pico SDK
 #define OPT_OS_RTTHREAD   6  ///< RT-Thread
 #define OPT_OS_RTTHREAD   6  ///< RT-Thread
-/** @} */
 
 
 // Allow to use command line to change the config name/location
 // Allow to use command line to change the config name/location
 #ifdef CFG_TUSB_CONFIG_FILE
 #ifdef CFG_TUSB_CONFIG_FILE
@@ -139,10 +139,6 @@
   #include "tusb_config.h"
   #include "tusb_config.h"
 #endif
 #endif
 
 
-/** \addtogroup group_configuration
- *  @{ */
-
-
 //--------------------------------------------------------------------
 //--------------------------------------------------------------------
 // RootHub Mode Configuration
 // RootHub Mode Configuration
 // CFG_TUSB_RHPORTx_MODE contains operation mode and speed for that port
 // CFG_TUSB_RHPORTx_MODE contains operation mode and speed for that port
@@ -277,7 +273,7 @@
 
 
   //------------- HUB CLASS -------------//
   //------------- HUB CLASS -------------//
   #if CFG_TUH_HUB && (CFG_TUSB_HOST_DEVICE_MAX == 1)
   #if CFG_TUH_HUB && (CFG_TUSB_HOST_DEVICE_MAX == 1)
-    #error there is no benefit enable hub with max device is 1. Please disable hub or increase CFG_TUSB_HOST_DEVICE_MAX
+    #error There is no benefit enable hub with max device is 1. Please disable hub or increase CFG_TUSB_HOST_DEVICE_MAX
   #endif
   #endif
 
 
   #ifndef CFG_TUH_ENUMERATION_BUFSIZE
   #ifndef CFG_TUH_ENUMERATION_BUFSIZE
@@ -288,12 +284,11 @@
 #endif // TUSB_OPT_HOST_ENABLED
 #endif // TUSB_OPT_HOST_ENABLED
 
 
 //--------------------------------------------------------------------+
 //--------------------------------------------------------------------+
-// Port Options
-// TUP for TinyUSB Port (can be renamed)
+// Port Specific
+// TUP stand for TinyUSB Port (can be renamed)
 //--------------------------------------------------------------------+
 //--------------------------------------------------------------------+
 
 
-// TUP_ARCH_STRICT_ALIGN if arch cannot access unaligned memory
-
+//------------- Unaligned Memory -------------//
 
 
 // ARMv7+ (M3-M7, M23-M33) can access unaligned memory
 // ARMv7+ (M3-M7, M23-M33) can access unaligned memory
 #if (defined(__ARM_ARCH) && (__ARM_ARCH >= 7))
 #if (defined(__ARM_ARCH) && (__ARM_ARCH >= 7))
@@ -312,6 +307,7 @@
   #define TUP_MCU_STRICT_ALIGN   0
   #define TUP_MCU_STRICT_ALIGN   0
 #endif
 #endif
 
 
+
 //------------------------------------------------------------------
 //------------------------------------------------------------------
 // Configuration Validation
 // Configuration Validation
 //------------------------------------------------------------------
 //------------------------------------------------------------------