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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值