11.3_从构造描述符的角度理解Gadget框架

负责的模块

测试程序 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));
//如何注册以及如何使用可以分析一波了。

 

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-08 18:56:01       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-08 18:56:01       106 阅读
  3. 在Django里面运行非项目文件

    2023-12-08 18:56:01       87 阅读
  4. Python语言-面向对象

    2023-12-08 18:56:01       96 阅读

热门阅读

  1. SQL(COALESCE)

    2023-12-08 18:56:01       61 阅读
  2. Ant-Design-vue表单的编辑功能数据的回显

    2023-12-08 18:56:01       45 阅读
  3. 区分“基带、宽带、频带”

    2023-12-08 18:56:01       75 阅读
  4. Fabric.js 入门指南

    2023-12-08 18:56:01       66 阅读
  5. 实现el-dialog可拖动

    2023-12-08 18:56:01       53 阅读
  6. 西北大学计算机844考研-最后20天复习重点

    2023-12-08 18:56:01       53 阅读
  7. 纯代码压缩WordPress前端Html

    2023-12-08 18:56:01       58 阅读