瀏覽代碼

stm32fsdev: Implement dcd_connect.

Nathan Conrad 5 年之前
父節點
當前提交
715c4dbbf8

+ 6 - 0
docs/porting.md

@@ -62,6 +62,8 @@ All of the code for the low-level device API is in `src/portable/<vendor>/<chip
 ##### dcd_init
 ##### dcd_init
 Initializes the USB peripheral for device mode and enables it.
 Initializes the USB peripheral for device mode and enables it.
 
 
+If the MCU has an internal pull-up, this function should leave it disabled.
+
 #### dcd_int_enable / dcd_int_disable
 #### dcd_int_enable / dcd_int_disable
 
 
 Enables or disables the USB device interrupt(s). May be used to prevent concurrency issues when mutating data structures shared between main code and the interrupt handler.
 Enables or disables the USB device interrupt(s). May be used to prevent concurrency issues when mutating data structures shared between main code and the interrupt handler.
@@ -77,6 +79,10 @@ Called when the device received SET_CONFIG request, you can leave this empty if
 ##### dcd_remote_wakeup
 ##### dcd_remote_wakeup
 Called to remote wake up host when suspended (e.g hid keyboard)
 Called to remote wake up host when suspended (e.g hid keyboard)
 
 
+##### dcd_connect / dcd_disconnect
+
+Connect or disconnect the data-line pull-up resistor. Define as a weak function if the MCU has an internal pull-up, otherwise do not define.
+
 #### Special events
 #### Special events
 You must let TinyUSB know when certain events occur so that it can continue its work. There are a few methods you can call to queue events for TinyUSB to process.
 You must let TinyUSB know when certain events occur so that it can continue its work. There are a few methods you can call to queue events for TinyUSB to process.
 
 

+ 4 - 4
src/device/dcd.h

@@ -106,11 +106,11 @@ void dcd_set_config (uint8_t rhport, uint8_t config_num);
 // Wake up host
 // Wake up host
 void dcd_remote_wakeup(uint8_t rhport);
 void dcd_remote_wakeup(uint8_t rhport);
 
 
-// disconnect by disabling internal pull-up resistor on D+/D-
-void dcd_disconnect(uint8_t rhport) TU_ATTR_WEAK;
-
-// connect by enabling internal pull-up resistor on D+/D-
+// Connect or disconnect D+/D- line pull-up resistor.
+// Defined as weak in dcd source if MCU has internal pull-up.
+// Can be strongly defined in BSP.
 void dcd_connect(uint8_t rhport) TU_ATTR_WEAK;
 void dcd_connect(uint8_t rhport) TU_ATTR_WEAK;
+void dcd_disconnect(uint8_t rhport) TU_ATTR_WEAK;
 
 
 //--------------------------------------------------------------------+
 //--------------------------------------------------------------------+
 // Endpoint API
 // Endpoint API

+ 1 - 0
src/device/usbd.c

@@ -332,6 +332,7 @@ bool tud_init (void)
 
 
   // Init device controller driver
   // Init device controller driver
   dcd_init(TUD_OPT_RHPORT);
   dcd_init(TUD_OPT_RHPORT);
+  tud_connect();
   dcd_int_enable(TUD_OPT_RHPORT);
   dcd_int_enable(TUD_OPT_RHPORT);
 
 
   return true;
   return true;

+ 18 - 6
src/portable/st/stm32_fsdev/dcd_stm32_fsdev.c

@@ -239,17 +239,29 @@ void dcd_init (uint8_t rhport)
   }
   }
   USB->CNTR |= USB_CNTR_RESETM | USB_CNTR_SOFM | USB_CNTR_ESOFM | USB_CNTR_CTRM | USB_CNTR_SUSPM | USB_CNTR_WKUPM;
   USB->CNTR |= USB_CNTR_RESETM | USB_CNTR_SOFM | USB_CNTR_ESOFM | USB_CNTR_CTRM | USB_CNTR_SUSPM | USB_CNTR_WKUPM;
   dcd_handle_bus_reset();
   dcd_handle_bus_reset();
+  
+  // Data-line pull-up is left disconnected.
+}
 
 
-  // And finally enable pull-up, which may trigger the RESET IRQ if the host is connected.
-  // (if this MCU has an internal pullup)
+// Define only on MCU with internal pull-up so BSP can override (needed on MCU without internal pull-up)
 #if defined(USB_BCDR_DPPU)
 #if defined(USB_BCDR_DPPU)
-  USB->BCDR |= USB_BCDR_DPPU;
-#else
-  // FIXME: callback to the user to ask them to twiddle a GPIO to disable/enable D+???
-#endif
 
 
+TU_ATTR_WEAK
+void dcd_disconnect(uint8_t rhport)
+{
+  (void) rhport;
+  USB->BCDR &= ~(USB_BCDR_DPPU);
+}
+
+TU_ATTR_WEAK
+void dcd_connect(uint8_t rhport)
+{
+  (void) rhport;
+  USB->BCDR |= USB_BCDR_DPPU;
 }
 }
 
 
+#endif
+
 // Enable device interrupt
 // Enable device interrupt
 void dcd_int_enable (uint8_t rhport)
 void dcd_int_enable (uint8_t rhport)
 {
 {

+ 14 - 0
src/portable/template/dcd_template.c

@@ -45,6 +45,20 @@ void dcd_init (uint8_t rhport)
   (void) rhport;
   (void) rhport;
 }
 }
 
 
+#if HAS_INTERNAL_PULLUP
+// Enable internal D+/D- pullup
+void dcd_connect(uint8_t rhport) TU_ATTR_WEAK
+{
+  (void) rhport;
+}
+
+// Disable internal D+/D- pullup
+void dcd_disconnect(uint8_t rhport) TU_ATTR_WEAK
+{
+  (void) rhport;
+}
+#endif
+
 // Enable device interrupt
 // Enable device interrupt
 void dcd_int_enable (uint8_t rhport)
 void dcd_int_enable (uint8_t rhport)
 {
 {

+ 1 - 0
test/test/device/msc/test_msc_device.c

@@ -199,6 +199,7 @@ void setUp(void)
   if ( !tusb_inited() )
   if ( !tusb_inited() )
   {
   {
     dcd_init_Expect(rhport);
     dcd_init_Expect(rhport);
+    dcd_connect_Expect(rhport);
     tusb_init();
     tusb_init();
   }
   }
 
 

+ 1 - 0
test/test/device/usbd/test_usbd.c

@@ -127,6 +127,7 @@ void setUp(void)
   {
   {
     mscd_init_Expect();
     mscd_init_Expect();
     dcd_init_Expect(rhport);
     dcd_init_Expect(rhport);
+    dcd_connect_Expect(rhport);
     tusb_init();
     tusb_init();
   }
   }
 }
 }