usb suspend

来源:互联网 发布:linux for循环 编辑:程序博客网 时间:2024/05/17 08:04

global suspend
host停止一切传输(包括SOF token),在总线上的每一个usb device看到usb bus上空闲状态超过3ms,就会进入suspend状态。

selective suspend
usb总线通过向hub的某个port发送SetPortFeature(PORT_SUSPEND),这样,这个port上的usb device看到port上空闲状态超过3ms,就会进入suspend状态。

通俗点讲,global suspend就是usb bus停止活动,所有的usb device都进入suspend状态,selective suspend就是usb roothub的某个port停止活动,挂在这个port上的usb device就会进入suspend状态。

ehci host controller suspend的时候会调用到两个函数usb_port_suspend和ehci_bus_suspend

usb_port_suspend    set_port_feature(hub->hdev, port1, USB_PORT_FEAT_SUSPEND);        usb_control_msg(hdev, usb_sndctrlpipe(hdev, 0),            USB_REQ_SET_FEATURE, USB_RT_PORT, feature, port1,            NULL, 0, 1000);        <==>        rh_urb_enqueue            rh_call_control (hcd, urb);                hcd->driver->hub_control (hcd, typeReq, wValue, wIndex,                             tbuf, wLength);                <==>                ehci_hub_control

在ehci_hub_control根据不同的Request字段和RequestType字段,这里是SetPortFeature,并且value字段是USB_PORT_FEAT_SUSPEND,找到那个case,然后往roothub上那个port对应的port_status寄存器(就是PORTSC寄存器)写PORT_SUSPEND,让那个port进入suspend状态。

另外一个函数ehci_bus_suspend,里面会遍历所有的usb port,然后也是写对应port的port_status寄存器的PORT_SUSPEND,依次让所有的port都进入suspend状态。然后填写相关ehci寄存器,让ehci controller也进入suspend状态。

0 0