日期:2014-05-16  浏览次数:20695 次

自娱自乐4之Linux gadget驱动3(bind过程)

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