USB Gadget
+ -

Linux Gadget驱动结构关系图

2025-08-13 本文链接为:http://www.usbzh.com/article/detail-1556.html ,欢迎转载,转载请附上本文链接。

Linux Gadget驱动层级如下:

  • Gadget Function驱动/gadget legacy驱动
  • Gadget Compoiste驱动
  • USB UDC驱动(USB Device Control)

Linux Gadget驱动结构关系图

Gadget Function驱动/gadget legacy驱动

  • function, 更加现代化和结构化的 USB 设备功能配置方式,它依赖于 configfs 接口
  • legacy, 传统的 USB 设备功能配置方,主要依赖于 gadgetfs 接口

Gadget Compoiste驱动

Gadget Compoiste驱动依赖于usbstring.o config.o epautoconf.o composite.o functions.o configfs.o u_f.o

obj-$(CONFIG_USB_LIBCOMPOSITE)    += libcomposite.o
libcomposite-y            := usbstring.o config.o epautoconf.o
libcomposite-y            += composite.o functions.o configfs.o u_f.o

USB设备控制器UDC驱动

UDC驱动是USB硬件设备的驱动,其用于驱动设备树DTS中描述的USB设备。

结构互联

165232972172
152418392578

  • usb_udc
  • usb_gadget
  • usb_composite_dev
struct usb_udc {
    struct usb_gadget_driver    *driver;
    struct usb_gadget        *gadget;
    struct device            dev;//device tree
    struct list_head        list;//to udc_list
...
};

struct usb_gadget {
...
    struct usb_udc            *udc;
    const struct usb_gadget_ops    *ops;
    struct usb_ep            *ep0;
    struct list_head        ep_list;    /* of usb_ep */
    struct device            dev; //device tree,driver data指向usb_composite
}

struct usb_composite_dev {
    struct usb_gadget        *gadget;
    struct usb_composite_driver    *driver;
}

usb_gadget与usb_udc

udc驱动如dwc2,dwc3等调用usb_add_gadget_udc(usb_add_gadget_udc_release)

int usb_add_gadget_udc_release(struct device *parent, struct usb_gadget *gadget,
        void (*release)(struct device *dev))
{
    struct usb_udc    * udc;
    ...
    udc = kzalloc(sizeof(*udc), GFP_KERNEL);
    device_initialize(&udc->dev);
    udc->dev.release = usb_udc_release;
    udc->dev.class = udc_class;
    udc->dev.groups = usb_udc_attr_groups;
    udc->dev.parent = parent;

    ret = device_add(&gadget->dev);
    udc->gadget = gadget;
    gadget->udc = udc;

    list_add_tail(&udc->list, &udc_list);  //udc_list global list
    ret = device_add(&udc->dev);
    ...
}

usb_gadget与usb_composite_dev

static int composite_bind(struct usb_gadget *gadget,struct usb_gadget_driver *gdriver)
{
    struct usb_composite_dev *cdev;

    cdev = kzalloc(sizeof *cdev, GFP_KERNEL);

    cdev->gadget = gadget;
    set_gadget_data(gadget, cdev);
}

static inline void set_gadget_data(struct usb_gadget *gadget, void *data)
{ 
    dev_set_drvdata(&gadget->dev, data); 
}
static inline void dev_set_drvdata(struct device *dev, void *data)
{
    dev->driver_data = data;
}

usb_gadget

usb_gadget是承上启下的一个结构

struct usb_composite_dev    *cdev = get_gadget_data(gadget);

static inline void *get_gadget_data(struct usb_gadget *gadget)
{ 
    return dev_get_drvdata(&gadget->dev);
}
static inline void *dev_get_drvdata(const struct device *dev)
{
    return dev->driver_data;
}

驱动

struct usb_composite_driver {
    const char                *name;
    const struct usb_device_descriptor    *dev;
    struct usb_gadget_strings        **strings;
    enum usb_device_speed            max_speed;
    unsigned        needs_serial:1;

    int            (*bind)(struct usb_composite_dev *cdev);
    int            (*unbind)(struct usb_composite_dev *);

    void            (*disconnect)(struct usb_composite_dev *);

    /* global suspend hooks */
    void            (*suspend)(struct usb_composite_dev *);
    void            (*resume)(struct usb_composite_dev *);
    struct usb_gadget_driver        gadget_driver;
};

struct usb_gadget_driver {
    char            *function;
    enum usb_device_speed    max_speed;
    int            (*bind)(struct usb_gadget *gadget,
                    struct usb_gadget_driver *driver);
    void            (*unbind)(struct usb_gadget *);
    int            (*setup)(struct usb_gadget *,
                    const struct usb_ctrlrequest *);
    void            (*disconnect)(struct usb_gadget *);
    void            (*suspend)(struct usb_gadget *);
    void            (*resume)(struct usb_gadget *);
    void            (*reset)(struct usb_gadget *);

    /* FIXME support safe rmmod */
    struct device_driver    driver;

    char            *udc_name;
    struct list_head    pending;
    unsigned                match_existing_only:1;
};
本文链接为:http://www.usbzh.com/article/detail-1556.html ,欢迎转载,转载请附上本文链接。

0 篇笔记 写笔记

USB Gadget CDC-ECM网卡实例
ECM和NCM网卡类似,也需要安装ECM驱动设备兼容ID为:USBClass_02&SubClass_06&Prot_00USBClass_02&SubClass_06USBClass_02创建脚本:#!/bin/bashmodprobe libcompos......
Linux Gadget驱动结构关系图
Linux Gadget驱动层级如下:Gadget Function驱动/gadget legacy驱动Gadget Compoiste驱动USB UDC驱动(USB Device Control)Gadget Function驱动/gadget legacy驱动function, 更加现......
gadget probe过程-以g_audio为例
g_audio中通过如下代码调用usb_composite_probe,其中入参为audio_driverstatic struct usb_composite_driver audio_driver = { .name = "g_audio", ......
configfs文件系统
Linux内核使用CONFIGFS配置项支持可以通过用户创建USB Compoiste Gadget。CONFIG_CONFIGFS_FS项用于支持配置文件系统。Menconfig -> FileSystems -> Psuedo File System -> {M}User......
Gadget legacy和Gadget Function的区别
在 Linux 的 USB Gadget 子系统中,Legacy GadgetGadget Function(FunctionFS 或 configfs) 是两种不同的实现方式,用于将 Linux 设备配置为 USB 外设(如 U 盘、网卡、串口等)。它们的区别主要体现在架构、使用方式和灵活性......
usb_gadget复合HID键盘和U盘实例
#!/bin/bash# 加载模块modprobe libcompositemodprobe usb_f_hidmodprobe usb_f_mass_storage.komount -t configfs none /sys/kernel/config# 创建 Gadgetcd......
usb gadget创建uvc相机脚本实例
#!/bin/bashmodprobe libcompositemodprobe usb_f_uvcmount -t configfs none /sys/kernel/configmkdir -p /sys/kernel/config/usb_gadget/g1cd /sys/kern......
USB Gadget CDC-ACM串口实例
符合USB ACM规范的设备由Windows提供其驱动程序usbser.sysuserser.infLinux Gadget对应的ACM驱动依赖为root@ATK-IMX6U:/sys/kernel/config/usb_gadget/g1# lsmodModule ......
USB Gadget CDC-NCM网卡实例
USG Gadget也提供了CDC-NCM网卡驱动程序,使用USB Gadget CDC-NCM驱动,这样在Windows主机端和Linux设备端都会创建一个USB网卡设备。root@ATK-IMX6U:/lib/modules/4.1.15# ifconfig -ausb0 Lin......
USB Gadget 打印机实例
打印机这一块应该要与实例相连,具体这一块没有研究过。生成的设备如下:设备模块如下:root@ATK-IMX6U:/lib/modules/4.1.15# lsmodModule Size Used byusb_f_printer 1137......
USB Gadget CDC-EEM网卡实例
从理论上来讲,EEM网卡Windows是应该支持的,实际上也确实不用像NCM、ECM需要手动安装驱动,系统会自动匹配兼容ID来进行安装驱动,但是驱动启动失败,这个Linux系统下就没有问题。#!/bin/bashmodprobe libcompositemodprobe usb_f_eemm......
USB Gadget LoopBack实例
Loopback Function 提供的功能简单,它分配了两个 bulk endpoint,所做的就是把 out_ep 接收到的数据转发到 in_ep。#!/bin/bashmodprobe libcompositemodprobe usb_f_ss_lbmount -t configfs......
USB Gadget RNDIS网络适配器实列
和NCM一样,由于兼容ID的问题,RNDIS网络适配器也需要手动安装驱动。其对应的驱动为:netrndis.infrndismp6.sys其创建脚本如下:#!/bin/bashmodprobe libcompositemodprobe usb_f_rndismount -t conf......
USB Gadget实例分析usb_function_instance和usb_function
linux usb gadtet的设备类驱动有两个很重要的概念:usb_function_instance和usb_function从名来上看,usb_function_instance像是usb_function的实例化,但实际是恰恰相反。这里以f_loopback为示例解释:USB设备信息执......
USB Gadget数据收发-批量传输
当执行命令ln -s functions/Loopback.0 configs/c.1之后,会调用loopback_alloc函数创建usb_functionstruct f_loopback { struct usb_function function; struct......
关注公众号
  • HID人机交互
  • Linux&USB
  • UAC音频
  • CDC
  • TYPE-C
  • USB规范
  • USB大容量存储
  • USB百科
  • USB周边
  • UVC摄像头
  • Windows系统USB
  • 音视频博客
  • 取消
    感谢您的支持,我会继续努力的!
    扫码支持
    扫码打赏,你说多少就多少

    打开支付宝扫一扫,即可进行扫码打赏哦

    您的支持,是我们前进的动力!