Linux USB基础之端点(二)
Linux USB基础之端点(二)
1 USB端点分类
USB 通讯的最基本形式是通过端点。一个USB端点只能向一个方向传输数据(从主机到设备(称为输出端点)或者从设备到主机(称为输入端点))。端点可被看作一个单向的管道。
USB 端点有 4 种不同类型, 分别具有不同的数据传送方式:
1.1 控制传输
控制端点被用来控制对USB设备的不同部分访问. 通常用作配置设备、获取设备信息、发送命令到设备或获取设备状态报告。这些端点通常较小。每个 USB 设备都有一个控制端点称为"端点 0", 被 USB 核心用来在插入时配置设备。USB协议保证总有足够的带宽留给控制端点传送数据到设备.
/*** struct usb_ctrlrequest - SETUP data for a USB device control request* @bRequestType: matches the USB bmRequestType field* @bRequest: matches the USB bRequest field* @wValue: matches the USB wValue field (le16 byte order)* @wIndex: matches the USB wIndex field (le16 byte order)* @wLength: matches the USB wLength field (le16 byte order)** This structure is used to send control requests to a USB device. It matches* the different fields of the USB 2.0 Spec section 9.3, table 9-2. See the* USB spec for a fuller description of the different fields, and what they are* used for.** Note that the driver for any interface can issue control requests.* For most devices, interfaces don't coordinate with each other, so* such requests may be made at any time.*/
struct usb_ctrlrequest {__u8 bRequestType;__u8 bRequest;__le16 wValue;__le16 wIndex;__le16 wLength;
} __attribute__ ((packed));
1)bmRequestType(向谁请求)
D7:传输方向
0=主机至设备;1=设备至主机
D6…5:命令类型
D6D5=00:标准请求命令; D6D5=01:类请求命令;
D6D5=10:用户定义命令; D6D5=11:保留。
D4…0:接受者类型
0=设备;1=接口 ;
2=端点;3=其它
这个域表明此请求的特性。特别地,这个域表明了第二阶段控制传输方向。如果wLength域被设作0的话,表明没有数据传送阶段,那Direction位就会被忽略.
USB说明定义了一系列所有设备必须支持的标准请求。这些请求见下面的表。另外,一个设备类可定义更多的请求。设备厂商也可定义设备支持的请求.
请求可被导引到设备,设备接口,或某一个设备端结点(endpoint)上。这个请求域也指定了接收者。当指定的是接口或端结点(endpoint)时,wIndex域指出那个接口或端节点。
2) bmRequest(什么请求)
这个域标识特别的请求。bmRequestType域的Type字段可修改此域的含义。本文仅定义Type 字段为0即标准设备请求时bRequest域值的含义。
3) wValue域
此域用来传送当前请求的参数,随请求不同而变。
4) wIndex域
当bmRequestType的Recipient字段为接口或端点时,wIndex域用来表明是哪一个接口或端结。
5) wLength域
这个域表明第二阶段的数据传输长度。传输方向由bmRequstType域的Direction位指出。wLength域为0则表明无数据传输。在输入请求下,设备返回的数据长度不应多于wLength,但可以少于。在输出请求下,wLength指出主机发出的确切数据量。如果主机发送多于wLength的数据,设备做出的响应是无定义的。
1.1.1 标准设备请求
1.1.2 标准请求码(bRequest)
1.1.3 描述符类型
1.2 中断传输
每当 USB 主机向设备请求数据时,中断端点以固定的速率传送小量的数据。此为USB 键盘和鼠标的主要的数据传送方法。它还用以传送数据到USB设备来控制设备。通常不用来传送大量数据。USB协议保证总有足够的带宽留给中断端点传送数据到设备.
1.3 批量传输
批量端点用以传送大量数据。这些端点通常比中断端点大得多. 它们普遍用于不能有任何数据丢失的情况。USB 协议不保证传输在特定时间范围内完成。如果总线上没有足够的空间来发送整个BULK包,它被分为多个包进行传输。这些端点普遍用于打印机、USB Mass Storage和USB网络设备上。
1.4 等时传输
等时端点也批量传送大量数据, 但是这个数据不被保证能送达。这些端点用在可以处理数据丢失的设备中,并且更多依赖于保持持续的数据流。如音频和视频设备等等。
控制和批量端点用于异步数据传送,而中断和等时端点是周期性的。这意味着这些端点被设置来在固定的时间连续传送数据,USB 核心为它们保留了相应的带宽。
struct usb_host_endpoint{struct usb_endpoint_descriptor desc;//端点描述符struct list_head urb_list;//此端点的URB对列,由USB核心维护void *hcpriv;struct ep_device *ep_dev; /* For sysfs info */unsigned char*extra;/* Extra descriptors */int extralen;int enabled;
};
当调用USB设备驱动调用usb_submit_urb提交urb请求时,将调用int usb_hcd_link_urb_to_ep(struct usb_hcd *hcd, struct urb *urb)把此urb增加到urb_list的尾巴上。(hcd: Host Controller Driver,对应数据结构struct usb_hcd )。
Linux USB基础之端点(二)相关推荐
- LINUX学习基础篇(二十二)硬盘结构
LINUX学习基础篇(二十二)文件系统管理 硬盘 磁盘结构 硬盘接口 硬盘 磁盘结构 扇区是磁盘的最小存储单位,每个扇区的大小是固定的,为512Byte.硬盘里有多个磁盘,每个磁盘中,有多个同心圆,这 ...
- LINUX学习基础篇(二十六)swap分区
LINUX学习基础篇(二十六)swap分区 swap分区 查看swap分区大小 分配swap分区 格式化swap分区 增加swap分区 swap分区 Linux中的swap分区相当于Windows中的 ...
- Linux USB 驱动开发(二)—— USB 驱动几个重要数据结构
前面我们学习了USB 驱动的一个描述符,下面来学习 USB 驱动的几个重要数据结构 一.struct usb_interface 接口函数 [cpp] view plaincopy struct u ...
- Linux常用基础命令之二(cat,head,tail,chmod,chown,echo,df,du)
9,cat命令详解 cat命令主要用于查看文件内容,用法为cattest.txt,可以查看test.txt内容,常用参数详解如下: 用法: cat [选项]... [文件]... 作用为将[文件]或标 ...
- 在linux系统环境中 常用的关机命令,Linux常用基础命令整理:关机命令、查看目录下文件命令等...
整理了一些Linux常用基础命令,欢迎指正. 首先记住四个热键,学会这四个键,收益一辈子. Tab按键---命令补齐功能 Ctrl+c按键---停掉正在运行的程序 Ctrl+d按键---相当于exit ...
- USB基础---设备、配置、接口、端点和字符串描述符
USB设备用描述符报告他们的属性,一个描述符是一个已定义格式的数据结构体.每个描述符以一个表示描述符长度的字节和一个表示描述符类型的字节开始. USB描述符信息存储在USB设备中,在枚举过程中,USB ...
- Linux中的基础IO(二)
Linux中的基础IO(二) 文章目录 Linux中的基础IO(二) 一.基本接口 二.文件描述符 三.文件描述符的分配规则 四.重定向 五.dup2系统调用 六.minishell 一.基本接口 i ...
- linux来源usb驱动在哪下载,Linux USB驱动程序基础
非常好的linux驱动入门,介绍详尽 Linux USB驱动程序基础 来源: ChinaUnix博客日期:2008.04.10 23:55(共有条评论) 我要评论 ( Linux USB Driver ...
- Linux系统基础(二)
Linux系统基础(二) 一.linux系统结构 1.linux系统结构是倒树型 2. /bin##二进制可执行文件也就是系统命令 /sbin##系统管理命令存放位置 /boo ...
最新文章
- 收藏 | 数据分析师最常用的10个机器学习算法!(附图解)
- python各进制、字节串间的转换
- python3 deque(双向队列)
- 130506datafile和tablespace offline区别
- usaco1.2.2 transform
- 一个经典实例理解继承与多态原理与优点(附源码)---面向对象继承和多态性理解得不够深刻的同学请进...
- rsync实时同步服务部署
- 本地修改PHP修改文件,PHP脚本批量修改本地文件名
- 打印快递面单pdf_如何开通使用拼多多电子面单?
- 深入理解DRM(三)——MediaDRM和MediaCrypto
- Shopee开店首站有哪些站点?虾皮入驻规则
- NET 2.0(C#)调用ffmpeg处理视频的方法
- 内核参数tcp_tw_reuse=2,对高并发的服务有影响吗?
- 已成功拿下字节、腾讯、脉脉offer,这原因我服了
- c 语言学习大全 值得收藏的文章
- selenium 实战模拟登陆
- 就离谱!使用机器学习预测2022世界杯:小组赛挺准,但冠亚季军都错了 ⛵
- Vue数据可视化组件库,类阿里DataV,提供SVG的边框及装饰,图表,飞线图等组件,简单易用,持续更新...
- 3GPP R18确定27个研究项目,看看包含哪些?
- 【STC89C52】点阵屏显示爱心
热门文章
- python字典一键多值_python一键多值
- 电脑软件能截图无法发送(钉钉截图无法发送,微信能截图但是发送带虚线obj的文件,看不了照片)
- 试穿APP的NABCD
- 【领域泛化论文阅读】Semantic-Aware Domain Generalized Segmentation
- chromecast 协议_如何删除Chromecast的网络范围内的Android通知
- cve-2019-0192一把梭
- Linux/UNIX系统编程手册gg
- MotionLayout,一篇文章带你了解Android最新的动画布局
- 基于php+mysql的手机销售管理系统
- 一位游戏大厂测试的一些知识分享