Преглед изворни кода

Merge pull request #332 from pigrew/stm32fsdev-dcdconnect

stm32fsdev: Implement dcd_connect.
Ha Thach пре 5 година
родитељ
комит
07809d03a7

+ 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
 Initializes the USB peripheral for device mode and enables it.
 
+This function should leave an internal D+/D- pull-up in its default power-on state. `dcd_connect` will be called by the USBD core following `dcd_init`.
+
 #### 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.
@@ -77,6 +79,10 @@ Called when the device received SET_CONFIG request, you can leave this empty if
 ##### dcd_remote_wakeup
 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 only if MCU has an internal pull-up. (BSP may define for MCU without internal pull-up.)
+
 #### 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.
 

+ 4 - 4
src/device/dcd.h

@@ -106,11 +106,11 @@ void dcd_set_config (uint8_t rhport, uint8_t config_num);
 // Wake up host
 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 in dcd source if MCU has internal pull-up.
+// Otherwise, may be defined in BSP.
 void dcd_connect(uint8_t rhport) TU_ATTR_WEAK;
+void dcd_disconnect(uint8_t rhport) TU_ATTR_WEAK;
 
 //--------------------------------------------------------------------+
 // Endpoint API

+ 1 - 0
src/device/usbd.c

@@ -332,6 +332,7 @@ bool tud_init (void)
 
   // Init device controller driver
   dcd_init(TUD_OPT_RHPORT);
+  tud_connect();
   dcd_int_enable(TUD_OPT_RHPORT);
 
   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;
   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. BSP can define on MCU without internal PU.
 #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
 
+// Disable internal D+ PU
+void dcd_disconnect(uint8_t rhport)
+{
+  (void) rhport;
+  USB->BCDR &= ~(USB_BCDR_DPPU);
+}
+
+// Enable internal D+ PU
+void dcd_connect(uint8_t rhport)
+{
+  (void) rhport;
+  USB->BCDR |= USB_BCDR_DPPU;
 }
 
+#endif
+
 // Enable device interrupt
 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;
 }
 
+#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
 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() )
   {
     dcd_init_Expect(rhport);
+    dcd_connect_Expect(rhport);
     tusb_init();
   }
 

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

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