From b2269b610e5f29d60d637e9b433275646ea3d53e Mon Sep 17 00:00:00 2001
From: mux <freelancer.c@gmail.com>
Date: Sat, 1 Feb 2014 13:26:04 +0200
Subject: [PATCH] Detect VCP line state.

* Detect VCP line state, based on SET_CONTROL_LINE_STATE request
---
 stm/stmusbd/usbd_cdc_vcp.c  | 4 +++-
 stm/stmusbd/usbd_pyb_core.c | 2 +-
 stm/usb.c                   | 5 +++++
 3 files changed, 9 insertions(+), 2 deletions(-)

diff --git a/stm/stmusbd/usbd_cdc_vcp.c b/stm/stmusbd/usbd_cdc_vcp.c
index fc2bbc458..6885f7cff 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 ac51e3ad8..d887b89c6 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 802a70c6d..8f408b7b1 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++) {
-- 
GitLab