msm_cdc_set_supplies_lpm_mode函数
时间: 2023-08-07 20:03:50 浏览: 165
`msm_cdc_set_supplies_lpm_mode` 函数是高通平台上用于设置CDC(Communications Device Class)供电低功耗模式的函数。该函数用于控制USB设备的电源管理,以实现低功耗操作。
以下是一个简单的示例:
```c
#include <linux/usb/cdc.h>
void msm_cdc_set_supplies_lpm_mode(struct usb_interface *intf, bool enable)
{
struct usb_cdc_ether_desc *desc;
struct usb_cdc_ether_rndis *rndis;
struct usb_cdc_notification *event;
struct usb_device *dev;
struct usb_driver *driver;
struct usb_host_interface *iface_desc;
int i;
if (!intf)
return;
iface_desc = intf->cur_altsetting;
if (!iface_desc)
return;
dev = interface_to_usbdev(intf);
if (!dev)
return;
driver = dev->driver;
if (!driver)
return;
desc = (struct usb_cdc_ether_desc *)iface_desc->desc;
if (!desc)
return;
rndis = (struct usb_cdc_ether_rndis *)(desc + 1);
if (!rndis)
return;
event = (struct usb_cdc_notification *)(rndis + 1);
if (!event)
return;
for (i = 0; i < iface_desc->desc.bNumEndpoints; i++) {
struct usb_host_endpoint *ep = &iface_desc->endpoint[i];
if (usb_endpoint_is_int_in(ep->desc))
break;
}
if (i >= iface_desc->desc.bNumEndpoints) {
pr_err("msm_cdc_set_supplies_lpm_mode: No interrupt endpoint found\n");
return;
}
if (enable) {
event->bNotificationType = USB_CDC_NOTIFY_NETWORK_CONNECTION;
event->bNotificationCode = USB_CDC_NOTIFY_NETWORK_CONNECTION_RES;
} else {
event->bNotificationType = USB_CDC_NOTIFY_NETWORK_CONNECTION;
event->bNotificationCode = USB_CDC_NOTIFY_NETWORK_CONNECTION_LOS;
}
usb_interrupt_msg(dev, usb_rcvintpipe(dev, ep->desc.bEndpointAddress),
event, sizeof(*event), NULL, 0, 1000);
}
```
上述示例代码中,函数接受一个 `usb_interface` 结构体指针作为参数,以及一个布尔值 `enable`,用来控制是否启用低功耗模式。函数首先获得相关的USB设备和驱动程序,然后根据接口描述符和端点信息进行设置,最后通过USB中断传输发送通知。
需要注意的是,上述代码只是一个简化的示例,并不是完整的实现。实际使用时,还需要根据具体的平台和需求进行适当的调整和扩展。
阅读全文