diff --git a/stm/stmusbd/usbd_cdc_vcp.c b/stm/stmusbd/usbd_cdc_vcp.c index fc2bbc4589..6885f7cffe 100644 --- a/stm/stmusbd/usbd_cdc_vcp.c +++ b/stm/stmusbd/usbd_cdc_vcp.c @@ -62,6 +62,8 @@ static uint16_t VCP_Ctrl (uint32_t Cmd, uint8_t* Buf, uint32_t Len); static uint16_t VCP_DataTx (const uint8_t* Buf, uint32_t Len); static uint16_t VCP_DataRx (uint8_t* Buf, uint32_t Len); +extern int dev_is_connected; + CDC_IF_Prop_TypeDef VCP_fops = { VCP_Init, @@ -158,7 +160,7 @@ static uint16_t VCP_Ctrl (uint32_t Cmd, uint8_t* Buf, uint32_t Len) break; case SET_CONTROL_LINE_STATE: - /* Not needed for this driver */ + dev_is_connected = Len & 0x1; //wValue passed in Len break; case SEND_BREAK: diff --git a/stm/stmusbd/usbd_pyb_core.c b/stm/stmusbd/usbd_pyb_core.c index ac51e3ad8e..d887b89c6c 100644 --- a/stm/stmusbd/usbd_pyb_core.c +++ b/stm/stmusbd/usbd_pyb_core.c @@ -648,7 +648,7 @@ static uint8_t usbd_pyb_Setup(void *pdev, USB_SETUP_REQ *req) { // Not a Data request // Transfer the command to the interface layer */ - return VCP_fops.pIf_Ctrl(req->bRequest, NULL, 0); + return VCP_fops.pIf_Ctrl(req->bRequest, NULL, req->wValue); } } else if (req->wIndex == 2) { diff --git a/stm/usb.c b/stm/usb.c index 802a70c6d0..8f408b7b15 100644 --- a/stm/usb.c +++ b/stm/usb.c @@ -20,6 +20,7 @@ extern CDC_IF_Prop_TypeDef VCP_fops; USB_OTG_CORE_HANDLE USB_OTG_Core; static int dev_is_enabled = 0; +int dev_is_connected=0; /* used by usbd_cdc_vcp */ static char rx_buf[64]; static int rx_buf_in; static int rx_buf_out; @@ -41,6 +42,10 @@ bool usb_vcp_is_enabled(void) { return dev_is_enabled; } +bool usb_vcp_is_connected(void) { + return dev_is_connected; +} + void usb_vcp_receive(const char *buf, uint32_t len) { if (dev_is_enabled) { for (int i = 0; i < len; i++) {