aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDamien George <damien.p.george@gmail.com>2018-10-15 12:24:40 +1100
committerDamien George <damien.p.george@gmail.com>2018-10-15 12:24:40 +1100
commit53ccbe6cecb0988070207ac21ec628d364489659 (patch)
treefa458f0d1e809d6d920286575ae826f99cc2561a
parentde71035e02e11bf89b09d2ec6292518d29f0f0e7 (diff)
stm32/usbd_cdc_interface: Handle disconnect IRQ to set VCP disconnected.
pyb.USB_VCP().isconnected() will now return False if the USB is disconnected after having previously been connected. See issue #4210.
-rw-r--r--ports/stm32/usbd_cdc_interface.c5
-rw-r--r--ports/stm32/usbdev/class/inc/usbd_cdc_msc_hid.h1
-rw-r--r--ports/stm32/usbdev/class/src/usbd_cdc_msc_hid.c4
3 files changed, 10 insertions, 0 deletions
diff --git a/ports/stm32/usbd_cdc_interface.c b/ports/stm32/usbd_cdc_interface.c
index 91ae81bb3..f1ec8d8b1 100644
--- a/ports/stm32/usbd_cdc_interface.c
+++ b/ports/stm32/usbd_cdc_interface.c
@@ -81,6 +81,11 @@ uint8_t *usbd_cdc_init(usbd_cdc_state_t *cdc_in) {
return cdc->rx_packet_buf;
}
+void usbd_cdc_deinit(usbd_cdc_state_t *cdc_in) {
+ usbd_cdc_itf_t *cdc = (usbd_cdc_itf_t*)cdc_in;
+ cdc->dev_is_connected = 0;
+}
+
// Manage the CDC class requests
// cmd: command code
// pbuf: buffer containing command data (request parameters)
diff --git a/ports/stm32/usbdev/class/inc/usbd_cdc_msc_hid.h b/ports/stm32/usbdev/class/inc/usbd_cdc_msc_hid.h
index a4f81f10d..4004f196d 100644
--- a/ports/stm32/usbdev/class/inc/usbd_cdc_msc_hid.h
+++ b/ports/stm32/usbdev/class/inc/usbd_cdc_msc_hid.h
@@ -185,6 +185,7 @@ uint8_t USBD_HID_ClearNAK(usbd_hid_state_t *usbd);
// These are provided externally to implement the CDC interface
uint8_t *usbd_cdc_init(usbd_cdc_state_t *cdc);
+void usbd_cdc_deinit(usbd_cdc_state_t *cdc);
int8_t usbd_cdc_control(usbd_cdc_state_t *cdc, uint8_t cmd, uint8_t* pbuf, uint16_t length);
int8_t usbd_cdc_receive(usbd_cdc_state_t *cdc, size_t len);
diff --git a/ports/stm32/usbdev/class/src/usbd_cdc_msc_hid.c b/ports/stm32/usbdev/class/src/usbd_cdc_msc_hid.c
index c5aac037d..4b9e26e5c 100644
--- a/ports/stm32/usbdev/class/src/usbd_cdc_msc_hid.c
+++ b/ports/stm32/usbdev/class/src/usbd_cdc_msc_hid.c
@@ -820,6 +820,8 @@ static uint8_t USBD_CDC_MSC_HID_DeInit(USBD_HandleTypeDef *pdev, uint8_t cfgidx)
if ((usbd->usbd_mode & USBD_MODE_CDC) && usbd->cdc) {
// CDC VCP component
+ usbd_cdc_deinit(usbd->cdc);
+
// close endpoints
USBD_LL_CloseEP(pdev, CDC_IN_EP);
USBD_LL_CloseEP(pdev, CDC_OUT_EP);
@@ -830,6 +832,8 @@ static uint8_t USBD_CDC_MSC_HID_DeInit(USBD_HandleTypeDef *pdev, uint8_t cfgidx)
if ((usbd->usbd_mode & USBD_MODE_CDC2) && usbd->cdc2) {
// CDC VCP #2 component
+ usbd_cdc_deinit(usbd->cdc2);
+
// close endpoints
USBD_LL_CloseEP(pdev, CDC2_IN_EP);
USBD_LL_CloseEP(pdev, CDC2_OUT_EP);