bulkinterface驱动_【驱动】USB驱动·入门

更新时间:2023-07-18 19:31:22 阅读: 评论:0

bulkinterface驱动_【驱动】USB驱动·⼊门
Preface
USB是⽬前最流⾏的系统总线之⼀。随着计算机周围硬件的不断扩展,各种设备使⽤不同的总线接⼝,导致计算机外部总线种类繁多,管理困难。USB总线正是因此⽽诞⽣的。
USB总线提供了所有外部设备的统⼀连接⽅式,并且⽀持热插拔,⽅便了⼚商开发设备和⽤户使⽤设备。
USB遵循原则
USB的设计⽬标是对现有的PC机体系进⾏扩充,但是⽬前不仅是PC机,许多的嵌⼊式系统都开始⽀持USB总线和接⼝标准。USB设计主要遵循下⾯⼏个原则:易于扩充外部设备:USB⽀持⼀个接⼝最多127个设备。
灵活的传输协议: ⽀持同步和异步数据传输。
设备兼容性好: 可以兼容不同类型的设备。
接⼝标准统⼀:不同的设备之间使⽤相同的设备接⼝。
USB体系概述
USB接⼝标准⽀持主机和外部设备之间进⾏数据传输。
在USB体系结构中,主机预定了各种类型外部设备使⽤的总线带宽。当外部设备和主机在运⾏时,USB总线允许添加、设置、使⽤和拆除外设。
在USB体系结构中,⼀个USB系统可以分成USB互联、USB设备和USB主机三个部分。
USB互联是USB设备和USB主机之间进⾏连接通信的操作,主要包括:总线拓扑结构:USB主机和USB设备之间的连接⽅式。
数据流模式:描述USB通信系统中数据如何从产⽣⽅传递到使⽤⽅。
USB调度:USB总线是⼀个共享连接,对可以使⽤的连接进⾏了调试以⽀持同步数据传输,并且避免优先级判定的开销。
USB的物理连接是⼀个有层次的星形结构。
青春主题演讲稿在⼀个节点上连接多个设备需要使⽤ USB集线器(USB HUB)。
USB体系结构规定,在⼀个 USB系统中,只有唯⼀的⼀个主机。USB和主机系统的接⼝称做主机控制器,主机控制器由主机控制器芯⽚、固件程序和软件共同实现的。
USB设备包括USB集线器和功能器件。其中USB集线器的作⽤是扩展总线端点,向总线提供更多的连接点;功能器件是⽤户使⽤的外部设备,如键盘,⿏标等。
USB设备需要⽀持 USB总线协议,对主机的操作提供反馈并且提供设备性能的描述信息。
USB体系⼯作流程
USB总线采⽤轮询⽅式控制,主机控制设置初始化所有的数据传输。
USB总线每次执⾏传输动作最多可以传输三个数据包。每次开始传输时,主机控制器发送⼀个描述符描述传输动作的种类和⽅向,这个数据包称作标志数据包(Token Packet)。USB设备收到主机发送的标志数据包后解析出数据⾃⼰的数据。
USB数据传输的⽅向只有两种:主机到设备或者设备到主机。
在⼀个数据传输开始时,由标志包标⽰数据的传输⽅向,然后发送端开始发送包含信息的数据。接收端发送⼀个握⼿的数据包表明数据是否传送成功。
在主机和设备之间的USB数据传输可以看做⼀个通道。USB数据传输有流和消息两种通道。消息是有格式的数据,⽽流是没有数据格式的。
USB有⼀个缺省的控制消息通道,在设备启动的时候被创建,因此设备的设置查询和输⼊控制信息都可以使⽤缺省消息控制通道完成。
USB驱动程序框架
Linux内核提供了完整的USB驱动程序框架。
五律
USB总线采⽤树形结构,在⼀条总线上只能有唯⼀的主机设备。
Linux内核从主机和设备两个⾓度观察USB总线结构。
Linux内核USB驱动框架
左侧是主机驱动结构。
主机驱动的最底层是 USB主机控制器,提供了 OHCI/EHCI/UHCI这3种类型的总线控制功能。
在USB控制器的上⼀层是主机控制器的驱动,分别对应OHCI/EHCI/UHCI这3种类型的总线接⼝。
USB核⼼部分连接了 USB控制器驱动和设备驱动,是两者之间的转换接⼝。
USB设备驱动层提供了各种设备的驱动程序。
所有类型的 USB设备都是⽤相同的电⽓接⼝,使⽤的传输协议也基本相同。
向⽤户提供某种特定类型的 USB设备时,需要处理 USB总线协议。内核完成所有的 USB总线协议处理,并且向⽤户提供编程接⼝。右侧是设备驱动结构。
与USB主机类似,USB设备提供了相同的层次结构与之对应。但是在 USB设备⼀侧使⽤名为 Gadget API的结构作为核⼼。
Gadget API是 Linux内核实现的对应 USB设备的核⼼结构。Gadget API屏蔽了 USB设备控制器的细节,控制具体的 USB设备实现。设备
每个 USB设备提供了不同级别的配置信息。
⼀个 USB设备可以包含⼀个或多个配置,不同的配置使设备表现出不同的特点。其中,设备的配置是通过接⼝组成的。
Linux内核定义了 USB设备描述结构如下://源定义在Usb_ch9.h
nd过去式
/* USB_DT_DEVICE: Device descriptor */
struct usb_device_descriptor {
__u8 bLength; //设备描述符长度
__u8 bDescriptorType; //设备类型
__le16 bcdUSB; // USB版本号(使⽤ BCD编码)
__u8 bDeviceClass; // USB设备类型
__u8 bDeviceSubClass; // USB设备⼦类型
__u8 bDeviceProtocol; // USB设备协议号
__u8 bMaxPacketSize0; //传输数据的最⼤包长
__le16 idVendor; //⼚商编号
__le16 idProduct; //产品编号
__le16 bcdDevice; //设备出⼚号
__u8 iManufacturer; //⼚商字符串索引
__u8 iProduct; //产品字符串索引
__u8 iSerialNumber; //产品序列号索引
__u8 bNumConfigurations; //最⼤的配置数量
} __attribute__ ((packed));
从 usb_device_descrptor结构定义看出,⼀个设备描述定义了与 USB设备有关的所有信息。
接⼝
在 USB体系中,接⼝是由多个端点组成的。
⼀个接⼝代表⼀个基本的功能,是 USB设备驱动程序控制的对象。
⼀个 USB设备最少有⼀个接⼝,功能复杂的 USB设备可以有多个接⼝。接⼝描述定义如下:Usb//源定义在 Usb_ch9.h /* USB_DT_INTERFACE: Interface descriptor */
struct usb_interface_descriptor {
__u8 bLength; //描述符长度
__u8 bDescriptorType; //描述符类型
__u8 bInterfaceNumber; //接⼝编号
__u8 bAlternateSetting; //备⽤接⼝编号
__u8 bNumEndpoints; //端点数量
__u8 bInterfaceClass; //接⼝类型
__u8 bInterfaceSubClass; //接⼝⼦类型
__u8 bInterfaceProtocol; //接⼝使⽤的协议
__u8 iInterface; //接⼝索引字符串数值
} __attribute__ ((packed));
端点
端点是 USB总线通信的基本形式,每个 USB设备接⼝可以认为是端点的集合。
主机只能通过端点与设备通信。
USB体系结构规定每个端点都有⼀个唯⼀的地址,由设备地址和端点号决定端点地址。
端点还包括了与主机通信⽤到的属性,如传输⽅式、总线访问频率、带宽和端点号等。
端点的通信是单向的,通过端点传输的数据只能是从主机到设备或者从设备到主机。
端点的定义描述如下:/* USB_DT_ENDPOINT: Endpoint descriptor */
struct usb_endpoint_descriptor {
__u8 bLength; //描述符长度
__u8 bDescriptorType; //描述符类型
__u8 bEndpointAddress; //端点地址
__u8 bmAttributes; //端点属性
__le16 wMaxPacketSize; //端点接收的最⼤数据包长度
__u8 bInterval;
/* NOTE: the two are _only_ in audio endpoints. */
/* u USB_DT_ENDPOINT*_SIZE in bLength, not sizeof. */
__u8 bRefresh;
__u8 bSynchAddress;
} __attribute__ ((packed));
配置
配置是⼀个接⼝的集合。
Linux内核配置的定义如下:struct usb_config_descriptor {
__u8 bLength; //描述符长度
__u8 bDescriptorType; //描述符类型
__le16 wTotalLength; //配置返回数据长度
__u8 bNumInterfaces; //最⼤接⼝数
外甥英语
__u8 bConfigurationValue; //配置参数值
__u8 iConfiguration; //配置描述字符串索引
__u8 bmAttributes; //供电模式
__u8 bMaxPower; //接⼝的最⼤电流
} __attribute__ ((packed));
主机驱动结构
USB主机控制器有三种类型:OHCI,英⽂全称是Open Host Controller Interface。OHCI是⽤于SiS和Ali芯⽚组的USB控制器。
UHCI,英⽂全称是Universal Host Controller Interface。UHCI⽤于Intel和AMD芯⽚组的USB控制器。UHCI类型的控制器⽐OHCI控制器硬件结构要简单,但是需要额外的驱动⽀持,因此从理论上说速度要慢。
EHCI,USB2.0规范提出的⼀种控制器标准,可以兼容UHCI和OHCI。
USB主机控制器驱动
国家公祭日手抄报内容Linux内核使⽤ usb_hcd结构描述 USB主机控制器驱动。
usb_hcd结构描述了 USB主机控制器的硬件信息、状态和操作函数。定义如下://源定义在Hcd.h
审计失败案例
struct usb_hcd { /* usb_bus.hcpriv points to this */
/*
* houkeeping //控制器基本信息
*/
struct usb_bus lf; /* hcd is-a bus */
const char *product_desc; /* product/vendor string */ //⼚商名称字符串
char irq_descr[24]; /* driver + bus # */ //驱动和总线类型
struct timer_list rh_timer; /* drives root-hub polling */ //根 hub轮询时间间隔
struct urb *status_urb; /* the current status urb */ //当前 urb状态
/*
* hardware info/state //硬件信息和状态
*/
const struct hc_driver *driver; /* hw-specific hooks */ //控制器驱动使⽤的回调函数/* Flags that need to be manipulated atomically */
unsigned long flags;
#define HCD_FLAG_HW_ACCESSIBLE 0x00000001
#define HCD_FLAG_SAW_IRQ 0x00000002
unsigned rh_registered:1;/* is root hub registered? */ //是否注册根 hub
/* The next flag is a stopgap, to be removed when all the HCDs
* support the new root-hub polling mechanism. */
明月上高楼
unsigned us_new_polling:1; //是否允许轮询根 hub状态
unsigned poll_rh:1; /* poll for rh status? */
unsigned poll_pending:1; /* status has changed? */ //状态是否改变
int irq; /* irq allocated */ //控制器的中断请求号
void __iomem *regs; /* device memory/io */ //控制器使⽤的内存和 I/O
u64 rsrc_start; /* memory/io resource start */ //控制器使⽤的内存和 I/O起始地址u64 rsrc_len; /* memory/io resource length */ //控制器使⽤的内存和 I/O资源长度unsigned power_budget; /* in mA, 0 = no limit */
#define HCD_BUFFER_POOLS 4
struct dma_pool *pool [HCD_BUFFER_POOLS];
int state;
# define __ACTIVE 0x01
# define __SUSPEND 0x04
# define __TRANSIENT 0x80
# define HC_STATE_HALT 0
# define HC_STATE_RUNNING (__ACTIVE)
# define HC_STATE_QUIESCING (__SUSPEND|__TRANSIENT|__ACTIVE)
# define HC_STATE_RESUMING (__SUSPEND|__TRANSIENT)
# define HC_STATE_SUSPENDED (__SUSPEND)
#define HC_IS_RUNNING(state) ((state) & __ACTIVE)
#define HC_IS_SUSPENDED(state) ((state) & __SUSPEND)
/* more shared queuing code would be good; it should support
* smarter scheduling, handle transaction translators, etc;
* input size of periodic table to an interrupt scheduler.禁毒手抄报简单又漂亮
* (ohci 32, uhci 1024, ehci 256/512/1024).

本文发布于:2023-07-18 19:31:22,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/89/1086722.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:设备   总线   端点   控制器   提供   数据   描述   传输
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图