Browse Source

usb: add USB_MSG_PLUG_OUT event

When the core received an USB_MSG_PLUG_OUT event, it will stop all the
classes. This make a chance that the classes could get rid off doing
useless stuff while the USB cable is plugged out.
Grissiom 12 years ago
parent
commit
ed19483cb4

+ 5 - 0
components/drivers/include/drivers/usb_device.h

@@ -146,6 +146,11 @@ enum udev_msg_type
     USB_MSG_DATA_NOTIFY,
     USB_MSG_SOF,
     USB_MSG_RESET,
+    /* we don't need to add a "PLUG_IN" event because after the cable is
+     * plugged in(before any SETUP) the classed have nothing to do. If the host
+     * is ready, it will send RESET and we will have USB_MSG_RESET. So, a RESET
+     * should reset and run the class while plug_in is not. */
+    USB_MSG_PLUG_OUT,
 };
 typedef enum udev_msg_type udev_msg_type;
 

+ 52 - 4
components/drivers/usb/usbdevice/core/core.c

@@ -667,13 +667,13 @@ rt_err_t _sof_notify(udevice_t device)
 }
 
 /**
- * This function will reset all class.
+ * This function will stop all class.
  *
  * @param device the usb device object.
  *
  * @return RT_EOK.
  */
-rt_err_t _reset_notify(udevice_t device)
+rt_err_t _stop_notify(udevice_t device)
 {
     struct rt_list_node *i;
     uclass_t cls;
@@ -681,13 +681,38 @@ rt_err_t _reset_notify(udevice_t device)
     RT_ASSERT(device != RT_NULL);
 
     /* to notity every class that sof event comes */
-    for (i=device->curr_cfg->cls_list.next;
-            i!=&device->curr_cfg->cls_list; i=i->next)
+    for (i  = device->curr_cfg->cls_list.next;
+         i != &device->curr_cfg->cls_list;
+         i  = i->next)
     {
         cls = (uclass_t)rt_list_entry(i, struct uclass, list);
         if(cls->ops->stop != RT_NULL)
             cls->ops->stop(device, cls);
+    }
 
+    return RT_EOK;
+}
+
+/**
+ * This function will run all class.
+ *
+ * @param device the usb device object.
+ *
+ * @return RT_EOK.
+ */
+rt_err_t _run_notify(udevice_t device)
+{
+    struct rt_list_node *i;
+    uclass_t cls;
+
+    RT_ASSERT(device != RT_NULL);
+
+    /* to notity every class that sof event comes */
+    for (i  = device->curr_cfg->cls_list.next;
+         i != &device->curr_cfg->cls_list;
+         i  = i->next)
+    {
+        cls = (uclass_t)rt_list_entry(i, struct uclass, list);
         if(cls->ops->run != RT_NULL)
             cls->ops->run(device, cls);
     }
@@ -695,6 +720,26 @@ rt_err_t _reset_notify(udevice_t device)
     return RT_EOK;
 }
 
+/**
+ * This function will reset all class.
+ *
+ * @param device the usb device object.
+ *
+ * @return RT_EOK.
+ */
+rt_err_t _reset_notify(udevice_t device)
+{
+    struct rt_list_node *i;
+    uclass_t cls;
+
+    RT_ASSERT(device != RT_NULL);
+
+    _stop_notify();
+    _run_notify();
+
+    return RT_EOK;
+}
+
 /**
  * This function will create an usb device object.
  *
@@ -1415,6 +1460,9 @@ static void rt_usbd_thread_entry(void* parameter)
             if (device->state == USB_STATE_ADDRESS)
                 _reset_notify(device);
             break;
+        case USB_MSG_PLUG_OUT:
+            _stop_notify(device);
+            break;
         default:
             rt_kprintf("unknown msg type\n");
             break;