这个gadget驱动我会一部分一部分说(你可以对着zero.c看),最后给个完整的。
今天说的是字符串描述符,struct usb_gadget_strings我之前说是字符串描述符并不准确,
真正的描述符是struct usb_string_descriptor
上一篇说的结构体中有很多都包涵了struct usb_gadget_strings,它们是struct usb_function、struct usb_configuration、struct usb_composite_driver三世同堂
struct usb_composite_drive包涵struct usb_configuration包涵struct usb_function
而且zero.c f_souresink.c f_loopback.c(这个我不用就不看了)composite.c都有
string usb_string_descripter结构体,这篇文章就了解一下他们的关系
先看一下这几个结构体
/* USB_DT_STRING: String descriptor */
struct usb_string_descriptor {
__u8 bLength;//描述符长度
__u8 bDescriptorType;//就是USB_DT_STRING 0x03
__le16 wData[1]; /* UTF-16LE encoded */
} __attribute__ ((packed));
//这里可以看出usb_gadget_strings包涵struct usb_string
//实例中的定义会看到
struct usb_gadget_strings {
u16 language; /* 0x0409 for en-us */
struct usb_string *strings;
};
struct usb_string {
u8 id;
const char *s;
};
不过在驱动中我们大部分看到的是struct usb_string
先看zero.c
//首先定义
static const char longname[] = "Gadget gadget_transfer";
static char manufacturer[50];
/* default serial number takes at least two packets */
static char serial[] = "0123456789.0123456789.0123456789";
static struct usb_string strings_dev[] = {
[STRING_MANUFACTURER_IDX].s = manufacturer,
[STRING_PRODUCT_IDX].s = longname,
[STRING_SERIAL_IDX].s = serial,
{ } /* end of list */
};
static struct usb_gadget_strings stringtab_dev = {
.language = 0x0409, /* en-us */
.strings = strings_dev,//包涵struct usb_string
};
static struct usb_gadget_strings *dev_strings[] = {
&stringtab_dev,
NULL,
};
//没什么要解释的吧
//在gadget_transfer_bind()中
//各字符串描述符的引索
id = usb_string_id(cdev);//这个东西之前有说过,就是cdev->next_string_id++返回,怕id冲突
if (id < 0)
return id;
strings_dev[STRING_MANUFACTURER_IDX].id = id;
device_desc.iManufacturer = id;
id = usb_string_id(cdev);
if (id < 0)
return id;
strings_dev[STRING_PRODUCT_IDX].id = id;
device_desc.iProduct = id;
id = usb_string_id(cdev);
if (id < 0)
return id;
strings_dev[STRING_SERIAL_IDX].id = id;
device_desc.iSerialNumber = id;
//manufacturer[50]下面赋值
//本来下面这句就是给manufacturer赋值,可是非要整个init_utsname()
//linux gadget的驱动都有这个,我们看一下吧
/*
.n