自娱自乐3之Linux gadget驱动2(zero中的字符串描述符)

本文深入探讨Linux gadget驱动中的字符串描述符,包括struct usb_string_descriptor和struct usb_gadget_strings的关系。通过分析zero.c、f_sourcesink.c及composite.c中的代码示例,揭示了struct usb_gadget_strings如何包含struct usb_string,并展示了如何在驱动中初始化和使用这些字符串描述符。
摘要由CSDN通过智能技术生成

这个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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值