Gadget Driver Legacy
Read time: 2 minute(s)
对于 Legacy Gadget Driver 驱动来说,相当于 Configfs Gadget Driver 的一个简化版。
Gadget Driver
Legacy 风格的 gadget driver 的定义:
drivers\usb\gadget\composite.c:staticconststructusb_gadget_drivercomposite_driver_template={.bind=composite_bind,.unbind=composite_unbind,.setup=composite_setup,.reset=composite_disconnect,.disconnect=composite_disconnect,.suspend=composite_suspend,.resume=composite_resume,.driver={.owner=THIS_MODULE,},};
驱动提供了一个注册函数 usb_composite_probe(),以供 composite device
来进行调用:
int usb_composite_probe(struct usb_composite_driver *driver)
{
struct usb_gadget_driver *gadget_driver;
if (!driver || !driver->dev || !driver->bind)
return -EINVAL;
if (!driver->name)
driver->name = "composite";
/* (1) 把传递过来的 `usb_composite_driver` 包装成 `usb_gadget_driver` */
driver->gadget_driver = composite_driver_template;
gadget_driver = &driver->gadget_driver;
gadget_driver->function = (char *) driver->name;
gadget_driver->driver.name = driver->name;
gadget_driver->max_speed = driver->max_speed;
/* (2) 注册 gadget driver,让其和 gadget device 适配 */
return usb_gadget_probe_driver(gadget_driver);
}
EXPORT_SYMBOL_GPL(usb_composite_probe);
Composite Device
没有了 configfs 由用户来创建
composite device
,只能使用一个文件来创建 composite
device
定义其使用哪些 function
和一系列配置。例如:drivers\usb\gadget\legacy\acm_ms.c static struct usb_composite_driver acm_ms_driver = { .name = "g_acm_ms", .dev = &device_desc, .max_speed = USB_SPEED_SUPER, .strings = dev_strings, .bind = acm_ms_bind, .unbind = acm_ms_unbind, }; /* (1) 驱动一开始就调用 usb_composite_probe() 来注册 acm_ms_driver 因为 acm_ms_driver 没有指定 udc_name 所以只能适配第一个 udc */ module_usb_composite_driver(acm_ms_driver); #define module_usb_composite_driver(__usb_composite_driver) \ module_driver(__usb_composite_driver, usb_composite_probe, \ usb_composite_unregister)
在 gadget driver 驱动适配后,调用 bind()
函数:
usb_gadget_probe_driver() → udc_bind_to_driver() → composite_bind() → acm_ms_bind()
在 acm_ms_bind() 函数中创建 composite device
的
Configuration
和 Function/Interface
,并且和 Gadget
Device / UDC 进行绑定。
其他操作和 Configfs Gadget Driver 类似。