自娱自乐2之Linux gadget驱动1(linux-3.2.36的composite)

本文介绍了Linux 3.2.36内核中的Composite Gadget驱动,包括struct usb_function和struct usb_configuration等关键结构,讲解如何添加和配置功能。内容涉及函数绑定、速度选择、接口管理和控制请求处理等,为理解和调试USB gadget驱动提供基础。
摘要由CSDN通过智能技术生成

上期说要用之前的模板写udc驱动。事实我已经做了,等待测试。当我要测试时,我发现还是要用gadget驱动去调试udc驱动。虽然有现成的,但是你如果搞不懂的话,出问题你根本不知道在哪。所以调试udc驱动之前我们要看gadget驱动。

我看了linux-2.6.10没有composite的东西。还是直接操作struct usb_gadget_driver。那已经是过去式了。现在我用的linux-3.2.36是composite。首先我们就看composite有哪些东西,接着通过实例分析怎么用。

 

struct usb_function {

       const char                     *name;//

       struct usb_gadget_strings       **strings;//字符串描述附

    //这个struct usb_descriptor_header包涵了接口描述符和端点描述符

    //在zero中

    /*

static structusb_descriptor_header *fs_source_sink_descs[] = {

         (structusb_descriptor_header *) &source_sink_intf,

         (structusb_descriptor_header *) &fs_sink_desc,

         (structusb_descriptor_header *) &fs_source_desc,

          NULL,

};

    */

       struct usb_descriptor_header  **descriptors;//全速

       struct usb_descriptor_header  **hs_descriptors;//高速

       struct usb_descriptor_header  **ss_descriptors;//超速

 

       struct usb_configuration *config;//下面看到这个,usb_add_function会调用

 

    //绑定可用的源,我看sourecesink就是gedget->ep_list获取可用的端点、并获取端//点的wMaxPacketSize、bEndpointAddress。还有高速和超速描述符赋值

       int                 (*bind)(structusb_configuration *,

                                   structusb_function *);

       void               (*unbind)(structusb_configuration *,

                                   structusb_function *);

       //配置接口,sourecesink就是通过gadget的速度来选择对应的structusb_desctiptor_header

       //就是上面的三个


      //set_alt:重配置altsettings

       int                 (*set_alt)(structusb_function *,

                                   unsignedinterface, unsigned alt);

       //get_alt:返回当前活动 altsettings

int                 (*get_alt)(structusb_function *,

                                   unsignedinterface);

    //表示这个function应该disable,原因可能是主机复位、重配置、断开

       void               (*disable)(structusb_function *);

    //setup用于接口特性控制请求

       int                 (*setup)(structusb_function *,

                                   const structusb_ctrlrequest *);

    //suspend和resume不用解释吧

       void               (*suspend)(structusb_function *);

       void               (*resume)(structusb_function *);

 

       //对应主机的GETSTATUS请求

       int                 (*get_status)(structusb_function *);

    //接受到SETFEATURE的USB_INTRF_FUNC_SUSPEND时的回调函数

       int                 (*func_suspend)(structusb_function *,

                                          u8suspend_opt);

 

       struct list_head              list;//下面

       DECLARE_BITMAP(endpoints, 32);

};

 

//把function加入到config中

//就是这句list_add_tail(&function->list,&config->functions);

//然后执行bind(如果有的话),速度标志位赋值

int usb_add_function(struct usb_configuration *config, struct usb_function *function);

 

//这俩个会调用udc中的pull_up,可以多次调用。

//如果deactivate调用三次,那么avtivate要调用三次才能把D+拉高

int usb_function_deactivate(struct usb_function *);

int usb_function_activate(struct

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值