Browse Source

handle standard request to interface that defined in class

heyuanjie87 12 years ago
parent
commit
a3bde3c4a3
1 changed files with 40 additions and 3 deletions
  1. 40 3
      components/drivers/usb/usbdevice/core/core.c

+ 40 - 3
components/drivers/usb/usbdevice/core/core.c

@@ -355,6 +355,38 @@ static rt_err_t _set_address(struct udevice* device, ureq_t setup)
     return RT_EOK;
 }
 
+/**
+ * This function will handle standard request to 
+ * interface that defined in class-specifics
+ *
+ * @param device the usb device object.
+ * @param setup the setup request.
+ *
+ * @return RT_EOK on successful. 
+ */
+static rt_err_t _request_interface(struct udevice* device, ureq_t setup)
+{
+    uintf_t intf;
+    uclass_t cls;
+    rt_err_t ret;
+
+    /* parameter check */
+    RT_ASSERT(device != RT_NULL);
+    RT_ASSERT(setup != RT_NULL);
+
+    RT_DEBUG_LOG(RT_DEBUG_USB, ("_request_interface\n"));
+    
+    intf = rt_usbd_find_interface(device, setup->index & 0xFF, &cls);
+    if (intf != RT_NULL)
+    {
+        ret = intf->handler(device, cls, setup);
+    }
+    else
+        ret = -RT_ERROR;
+
+    return ret;
+}
+
 /**
  * This function will handle standard request.
  *
@@ -419,9 +451,14 @@ static rt_err_t _standard_request(struct udevice* device, ureq_t setup)
             _set_interface(device, setup);
             break;
         default:
-            rt_kprintf("unknown interface request\n");
-            dcd_ep_stall(device->dcd, 0);
-            break;
+            if (_request_interface(device, setup) != RT_EOK)
+            {
+                rt_kprintf("unknown interface request\n");
+                dcd_ep_stall(device->dcd, 0);
+                return - RT_ERROR;
+            }
+            else
+                break;
         }
         break;
     case USB_REQ_TYPE_ENDPOINT: