负责的模块
测试程序 zero.c
文件如下: drivers/usb/gadget/legacy/zero.c
其注册函数如上:通过usb_composite_probe去注册函数
重要函数调用:
drivers/usb/gadget/udc/core.c
usb_composite_probe(struct usb_composite_driver *driver)
struct usb_gadget_driver *gadget_driver; //新建 usb gadget
driver->gadget_driver = composite_driver_template; //设置其通用模板
gadget_driver = &driver->gadget_driver;//放到 gadget_driver中
return usb_gadget_probe_driver(gadget_driver);//注册gadget_driver中
list_for_each_entry(udc, &udc_list, list) //从udc list找到udc
ret = udc_bind_to_driver(udc, driver);//绑定其
那目前数据结构就达成了这一步。
那最后就放到了usb_udc
static int udc_bind_to_driver(struct usb_udc *udc, struct usb_gadget_driver *driver)
udc->driver = driver;
ret = driver->bind(udc->gadget, driver);
static int composite_bind(struct usb_gadget *gadget,
struct usb_gadget_driver *gdriver)
struct usb_composite_dev *cdev;//分配一个usb_composite_dev
cdev->gadget = gadget; //设置其硬件上的操作
status = composite->bind(cdev); //
update_unchanged_dev_desc(&cdev->desc, composite->dev);//设置其设备描述符 来自于composite->dev(zero dev)
//需要分析一下bind函数
bind的 zere_bind函数
static struct usb_composite_driver zero_driver = {
.name = "zero",
.dev = &device_desc,
.strings = dev_strings,
.max_speed = USB_SPEED_SUPER,
.bind = zero_bind,
.unbind = zero_unbind,
.suspend = zero_suspend,
.resume = zero_resume,
};
static struct usb_device_descriptor device_desc = {
.bLength = sizeof device_desc,
.bDescriptorType = USB_DT_DEVICE,
/* .bcdUSB = DYNAMIC */
.bDeviceClass = USB_CLASS_VENDOR_SPEC,
.idVendor = cpu_to_le16(DRIVER_VENDOR_NUM), //厂家ID
.idProduct = cpu_to_le16(DRIVER_PRODUCT_NUM) //产品ID
.bNumConfigurations = 2,
};
func_inst_ss = usb_get_function_instance("SourceSink");//获得功能实例。
usb_add_config_only(cdev, &loopback_driver);
usb_add_config_only(cdev, &sourcesink_driver);//添加配置描述符
status = usb_add_function(&loopback_driver, func_lb);//再把功能添加到配置中
list_add_tail(&function->list, &config->functions);//将功能函数加入至配置list中,有可能有多个配置
function->bind(config, function);//再调用功能的bind 函数
ret = usb_assign_descriptors(f, fs_source_sink_descs,
hs_source_sink_descs, ss_source_sink_descs, NULL);
在f_sourcesink.c 中
module_init(sslb_modinit);
ret = usb_function_register(&SourceSinkusb_func);//注册一个功能
DECLARE_USB_FUNCTION(SourceSink, source_sink_alloc_inst,
source_sink_alloc_func);//通过该宏构造SourceSinkusb_func结构体。
#define DECLARE_USB_FUNCTION(_name, _inst_alloc, _func_alloc) \
static struct usb_function_driver _name ## usb_func = { \
.name = __stringify(_name), \
.mod = THIS_MODULE, \
.alloc_inst = _inst_alloc, \
.alloc_func = _func_alloc, \
}; \
MODULE_ALIAS("usbfunc:"__stringify(_name));
//如何注册以及如何使用可以分析一波了。