自娱自乐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);不懂就看我之前写的udc模板

                //…

        }

        不管怎么样都要调用composite_bind()函数,下面看到

*/

}

static int composite_bind(struct usb_gadget *gadget)//记住这个gadget是udc中的

{

     structusb_composite_dev    *cdev;

     int                status = -ENOMEM;

 

     cdev = kzalloc(sizeof *cdev, GFP_KERNEL);

     if(!cdev)

         returnstatus;

 

     spin_lock_init(&cdev->lock);

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值