上期说要用之前的模板写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