linux usb 架构
运行linux的主机 运行linux的设备usb设备驱动
系统拓扑结构
对于每个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;
};
更多推荐
所有评论(0)