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

update(class/wireless/usbd_rndis): enable indicate msg for sending connect status

Signed-off-by: sakumisu <1203593632@qq.com>
sakumisu пре 8 месеци
родитељ
комит
d3de69ae38
2 измењених фајлова са 34 додато и 5 уклоњено
  1. 33 4
      class/wireless/usbd_rndis.c
  2. 1 1
      class/wireless/usbd_rndis.h

+ 33 - 4
class/wireless/usbd_rndis.c

@@ -24,6 +24,7 @@ struct usbd_rndis_priv {
     uint32_t net_filter;
     uint32_t net_filter;
     usb_eth_stat_t eth_state;
     usb_eth_stat_t eth_state;
     rndis_state_t init_state;
     rndis_state_t init_state;
+    bool set_rsp_get;
     uint8_t mac[6];
     uint8_t mac[6];
 } g_usbd_rndis;
 } g_usbd_rndis;
 
 
@@ -109,9 +110,13 @@ static int rndis_class_interface_request_handler(uint8_t busid, struct usb_setup
 
 
     switch (setup->bRequest) {
     switch (setup->bRequest) {
         case CDC_REQUEST_SEND_ENCAPSULATED_COMMAND:
         case CDC_REQUEST_SEND_ENCAPSULATED_COMMAND:
+            g_usbd_rndis.set_rsp_get = true;
+
             rndis_encapsulated_cmd_handler(*data, setup->wLength);
             rndis_encapsulated_cmd_handler(*data, setup->wLength);
             break;
             break;
         case CDC_REQUEST_GET_ENCAPSULATED_RESPONSE:
         case CDC_REQUEST_GET_ENCAPSULATED_RESPONSE:
+            g_usbd_rndis.set_rsp_get = false;
+
             *data = rndis_encapsulated_resp_buffer;
             *data = rndis_encapsulated_resp_buffer;
             *len = ((rndis_generic_msg_t *)rndis_encapsulated_resp_buffer)->MessageLength;
             *len = ((rndis_generic_msg_t *)rndis_encapsulated_resp_buffer)->MessageLength;
             break;
             break;
@@ -271,7 +276,7 @@ static int rndis_query_cmd_handler(uint8_t *data, uint32_t len)
             infomation_len = 4;
             infomation_len = 4;
             break;
             break;
         case OID_GEN_MEDIA_CONNECT_STATUS:
         case OID_GEN_MEDIA_CONNECT_STATUS:
-            RNDIS_INQUIRY_PUT_LE32(g_usbd_rndis.link_status);
+            RNDIS_INQUIRY_PUT_LE32(NDIS_MEDIA_STATE_CONNECTED);
             infomation_len = 4;
             infomation_len = 4;
             break;
             break;
         case OID_GEN_RNDIS_CONFIG_PARAMETER:
         case OID_GEN_RNDIS_CONFIG_PARAMETER:
@@ -625,9 +630,33 @@ struct usbd_interface *usbd_rndis_init_intf(struct usbd_interface *intf,
     return intf;
     return intf;
 }
 }
 
 
-void usbd_rndis_set_connect(bool connect)
+int usbd_rndis_set_connect(bool connect)
 {
 {
-    g_usbd_rndis.link_status = connect ? NDIS_MEDIA_STATE_CONNECTED : NDIS_MEDIA_STATE_DISCONNECTED;
+    if (!usb_device_is_configured(0)) {
+        return -USB_ERR_NODEV;
+    }
+
+    if(g_usbd_rndis.set_rsp_get)
+        return -USB_ERR_BUSY;
+
+    rndis_indicate_status_t *resp;
+
+    resp = ((rndis_indicate_status_t *)rndis_encapsulated_resp_buffer);
+    resp->MessageType = REMOTE_NDIS_INDICATE_STATUS_MSG;
+    resp->MessageLength = sizeof(rndis_indicate_status_t);
+    if(connect) {
+        resp->Status = RNDIS_STATUS_MEDIA_CONNECT;
+        g_usbd_rndis.link_status = NDIS_MEDIA_STATE_CONNECTED;
+    } else {
+        resp->Status = RNDIS_STATUS_MEDIA_DISCONNECT;
+        g_usbd_rndis.link_status = NDIS_MEDIA_STATE_DISCONNECTED;
+    }
+    resp->StatusBufferLength = 0;
+    resp->StatusBufferOffset = 0;
+
+    rndis_notify_rsp();
+
+    return 0;
 }
 }
 
 
 __WEAK void usbd_rndis_data_recv_done(uint32_t len)
 __WEAK void usbd_rndis_data_recv_done(uint32_t len)
@@ -638,4 +667,4 @@ __WEAK void usbd_rndis_data_recv_done(uint32_t len)
 __WEAK void usbd_rndis_data_send_done(uint32_t len)
 __WEAK void usbd_rndis_data_send_done(uint32_t len)
 {
 {
     (void)len;
     (void)len;
-}
+}

+ 1 - 1
class/wireless/usbd_rndis.h

@@ -18,7 +18,7 @@ struct usbd_interface *usbd_rndis_init_intf(struct usbd_interface *intf,
                                              const uint8_t in_ep,
                                              const uint8_t in_ep,
                                              const uint8_t int_ep, uint8_t mac[6]);
                                              const uint8_t int_ep, uint8_t mac[6]);
 
 
-void usbd_rndis_set_connect(bool connect);
+int usbd_rndis_set_connect(bool connect);
 
 
 void usbd_rndis_data_recv_done(uint32_t len);
 void usbd_rndis_data_recv_done(uint32_t len);
 void usbd_rndis_data_send_done(uint32_t len);
 void usbd_rndis_data_send_done(uint32_t len);