日期:2014-05-16 浏览次数:20695 次
bind和字符串描述符一样也是有多级关系,首先说一下usb很基础的关系
一个设备可能有多个配置
一个配置可能有多个接口
一个接口可能有多个端点或设置
还记得我在自娱自乐2中说的的结构体吧
我们先变通一下
struct usb_function 相当于接口
struct usb_configuration 相当于配置
struct usb_composite_dev 相当于设备
bind会建立他们的关系,当然bind不止是这层涵义
我们在看它们的bind之前先看看
int usb_composite_probe(struct usb_composite_driver *driver,
int(*bind)(struct usb_composite_dev *cdev))
这玩意也有个绑定
在zero中usb_composite_probe(&gadget_transfer_driver,gadget_transfer_bind);
gadget_transfer_bind()这个函数我在之前已经列出了它的一部分,只是没明说
主要就是分配厂商设备id,获取设备bcd码,生成厂商字符串。定时器初始化话。
还有重要一点就是调用sourcesink_add(loop我们不看)
int usb_composite_probe(structusb_composite_driver *driver,
int(*bind)(struct usb_composite_dev *cdev))
{
//一些判断赋值省去
composite = driver;
composite_gadget_bind = bind;//请记住zero提供的bind函数在此只是赋值
return usb_gadget_probe_driver(&composite_driver, composite_bind);
//composite_driver前面的文章已说过了,这个usb_gadget_probe_drvier不贴全代码了,看一点
/*
//这个udc是从udc_list中找到的
if (udc_is_newstyle(udc)) {//自娱自乐1有说udc_is_newstyle()
ret =bind(udc->gadget);//这个bind是composite_bind,不要搞错
if (ret)
goto err1;
//…
} else {
ret =usb_gadget_start(udc->gadget, driver, bind);//gadget->ops->start(driver, bind);不懂就看我之前写的u