1. 简介
做USB 这么长时间以来,一直埋头在各种gadget, android framework以及芯片bug,很少涉及到usb core层,今天有机会,正好看了suspend/resume, 下面就以一个具体的实例来回顾下usb suspend/resume。
从上图可以看出,这个实例用的是 Synopsys的usb控制器(dwc),下面来具体介绍下suspen/resume
2. suspend
2.1. suspend U盘
usb_dev_suspend --> usb_suspend --> usb_suspend_both
从usb_suspend_both的code中可以看出我们前面提到了一个原则 “先suspend interface, 然后是设备本身"
1168 static int usb_suspend_both(struct usb_device *udev, pm_message_t msg)
1169 {
1170 int status = 0;
1171 int i = 0, n = 0;
1172 struct usb_interface *intf;
1173
1174 if (udev->state == USB_STATE_NOTATTACHED ||
1175 udev->state == USB_STATE_SUSPENDED)
1176 goto done;
1177
1178 /* Suspend all the interfaces and then udev itself */
1179 if (udev->actconfig) {
1180 n = udev->actconfig->desc.bNumInterfaces;
1181 printk("%s interface:%d\n", __func__, n);
1182 for (i = n - 1; i >= 0; --i) {
1183