linux usb 架构

来源:互联网 发布:time machine网络备份 编辑:程序博客网 时间:2024/06/05 04:23

系统拓扑结构

对于每个usb系统来说,都有一个称为host 控制器的设备,该host控制器和一个根hub作为一个整体。这个根hub下可以接多级的hub,每个子hub下又可以接子hub。每个usb设备作为一个节点接在不同级别的hub上。每条usb总线上最多可以接127个设备。

usb主控制器-----------------

usb主控制器负责处理主机和设备之间的电气和协议层的互联。常见的usb主控制器规格有:

OHCI---主要是非pc系统上的usb芯片。

UHCI----大多是intel和via主板上的usb控制器芯片。他们都是usb1.1规格的。

EHCI----由intel等几个厂商研发,兼容OHCI,UHCI遵循usb2.0规范。


usb hub------------------

每个usb host控制器都会自带一个usb hub,被称为根hub。这个根hub可以接子hub,每个hub上挂载usb设备。通过外接usb hub,可以插更多的usb设备。当usb设备插入到usb hub或从上面拔出时,都会发出电信号通知系统。


usb设备-------------------

插在usb总线上工作的设备,广义的讲usb hub也算是usb设备。有的usb设备功能单一,直接挂载在usb hub上,而有的usb设备功能复杂,会将多个usb功能结合在一起,成为一个复合设备。

usb协议----软件层次

linux  usb 架构------------------


运行linux的主机                       运行linux的设备


usb设备驱动                            Gadget驱动



usb核心                                   Gadget API



usb主控制器驱动                     UDC驱动

(UHCI,OHCI,EHCI)


USB主控制器                        usb控制器


usb核心----主要实现usb协议的功能。

usb设备驱动程序----比如要接摄像头,就得有个摄像头的驱动程序。

udc驱动-------usb 控制器驱动

gadget api-----内核帮助实现的一套api,gadget--小设备。

gadget驱动----小设备驱动。


usb 设备驱动程序:

它位于不同的内核子系统和usb主控制器之间,usb核心为usb驱动程序提供了一个用于访问和控制usb硬件的软件接口,使得usb设备驱动程序不必考虑usb硬件控制器

驱动程序描述

struct usb_driver

{

    const char *name; 驱动程序名字

    int (*probe) (struct usb_interface *intf,
              const struct usb_device_id *id); 当usb核心发现了该驱动能够处理的usb接口时,调用该函数

    void (*disconnect) (struct usb_interface *intf);  当相应的usb接口被移除时,调用该函数

    int (*ioctl) (struct usb_interface *intf, unsigned int code,
            void *buf);

    int (*suspend) (struct usb_interface *intf, pm_message_t message);
    int (*resume) (struct usb_interface *intf);
    int (*reset_resume)(struct usb_interface *intf);

    int (*pre_reset)(struct usb_interface *intf);
    int (*post_reset)(struct usb_interface *intf);

    const struct usb_device_id *id_table;  usb驱动能够处理的设备列表

    struct usb_dynids dynids;
    struct usbdrv_wrap drvwrap;
    unsigned int no_dynamic_id:1;
    unsigned int supports_autosuspend:1;
    unsigned int soft_unbind:1;

};

usb设备列表

struct usb_device_id {
    /* which fields to match against? */
    __u16        match_flags;

    /* Used for product specific matches; range is inclusive */
    __u16        idVendor;制造商id
    __u16        idProduct;产品id
    __u16        bcdDevice_lo;
    __u16        bcdDevice_hi;

    /* Used for device class matches */
    __u8        bDeviceClass;
    __u8        bDeviceSubClass;
    __u8        bDeviceProtocol;

    /* Used for interface class matches */
    __u8        bInterfaceClass;
    __u8        bInterfaceSubClass;
    __u8        bInterfaceProtocol;

    /* not matched against */
    kernel_ulong_t    driver_info;
};


构造struct usb_device_id利用宏USB_DEVICE(vend,prod)构造一个设备

参数

vend: usb vendor id

prod: usb product id


构造struct usb_device_id利用宏USB_INTERFACE_INFO(cl,sc,pr)构造一类设备

cl:blnterfaceClass value

sc: blnterfaceSubClass value

pr: blnterfaceProtocol value


linux 内核提供函数usb_register来注册USB驱动程序

static inline int usb_register(struct usb_driver *driver)





struct usb_device_driver {
    const char *name;

    int (*probe) (struct usb_device *udev);
    void (*disconnect) (struct usb_device *udev);

    int (*suspend) (struct usb_device *udev, pm_message_t message);
    int (*resume) (struct usb_device *udev, pm_message_t message);
    struct usbdrv_wrap drvwrap;
    unsigned int supports_autosuspend:1;
};


















































原创粉丝点击