فهرست منبع

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 سال پیش
والد
کامیت
ed19483cb4
2فایلهای تغییر یافته به همراه57 افزوده شده و 4 حذف شده
  1. 5 0
      components/drivers/include/drivers/usb_device.h
  2. 52 4
      components/drivers/usb/usbdevice/core/core.c

+ 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;