linux USB 设备基础知识

一个 USB 设备是一个非常复杂的事物, 如同在官方的 USB 文档(可从
http://www.usb.org 中得到)中描述的. 幸运的是, Linux 提供了一个子系统称为 USB
核, 来处理大部分复杂的工作. 这一章描述驱动和 USB 核之间的交互. 图 USB 设备概览
显示了 USB 设备如何包含配置, 接口, 和端点, 以及 USB 驱动如何绑定到 USB 接口,
而不是整个 USB 设备.

端点

USB 通讯的最基本形式是通过某些称为 端点 的. 一个 USB 端点只能在一个方向承载数
据, 或者从主机到设备(称为输出端点)或者从设备到主机(称为输入端点). 端点可看作一
个单向的管道.
一个 USB 端点可是 4 种不同类型的一种, 它来描述数据如何被传送:

CONTROL
控制端点被用来允许对 USB 设备的不同部分存取. 通常用作配置设备, 获取关于
设备的信息, 发送命令到设备, 或者获取关于设备的状态报告. 这些端点在尺寸上
常常较小. 每个 USB 设备有一个控制端点称为"端点 0", 被 USB 核用来在插入时
配置设备. 这些传送由 USB 协议保证来总有足够的带宽使它到达设备.
INTERRUPT
中断端点传送小量的数据, 以固定的速率在每次 USB 主请求设备数据时. 这些端
点对 USB 键盘和鼠标来说是主要的传送方法. 它们还用来传送数据到 USB 设备来
控制设备, 但通常不用来传送大量数据. 这些传送由 USB 协议保证来总有足够的
带宽使它到达设备.
BULK
块端点传送大量的数据. 这些端点常常比中断端点大(它们一次可持有更多的字符).
它们是普遍的, 对于需要传送不能有任何数据丢失的数据. 这些传送不被 USB 协
议保证来一直使它在特定时间范围内完成. 如果总线上没有足够的空间来发送整个
BULK 报文, 它被分为多次传送到或者从设备. 这些端点普遍在打印机, 存储器,
和网络设备上.
ISOCHRONOUS
同步端点也传送大量数据, 但是这个数据常常不被保证它完成. 这些端点用在可以
处理数据丢失的设备中, 并且更多依赖于保持持续的数据流. 实时数据收集, 例如
音频和视频设备, 一直都使用这些端点.
控制和块端点用作异步数据传送, 无论何时驱动决定使用它们. 中断和同步端点是周期性
的. 这意味着这些端点被设置来连续传送数据在固定的时间, 这使它们的带宽被 USB 核
所保留.
USB 端点在内核中使用结构 struct usb_host_endpoint 来描述. 这个结构包含真实的端
点信息在另一个结构中, 称为 struct usb_endpoint_descriptor. 后者包含所有的 USB-
特定 数据, 以设备自身特定的准确格式. 驱动关心的这个结构的成员是:
bEndpointAddress
这是这个特定端点的 USB 地址. 还包含在这个 8-位 值的是端点的方向. 位掩码
USB_DIR_OUT 和 USB_DIR_IN 可用来和这个成员比对, 来决定给这个端点的数据是
到设备还是到主机.
bmAttributes
这是端点的类型. 位掩码 USB_ENDPOINT_XFERTYPE_MASK 应当用来和这个值比对,
来决定这个端点是否是 USB_ENDPOINT_XFER_ISOC, USB_ENDPOINT_XFER_BULK, 或
者是类型 USB_ENDPOINT_XFER_INT. 这些宏定义了同步, 块, 和中断端点, 相应地.

wMaxPacketSize
这是以字节计的这个端点可一次处理的最大大小. 注意驱动可能发送大量的比这个
值大的数据到端点, 但是数据会被分为 wMaxPakcetSize 的块, 当真正传送到设备
时. 对于高速设备, 这个成员可用来支持端点的一个高带宽模式, 通过使用几个额
外位在这个值的高位部分. 关于如何完成的细节见 USB 规范.
bInterval
如果这个端点是中断类型的, 这个值是为这个端点设置的间隔, 即在请求端点的中
断之间的时间. 这个值以毫秒表示.
这个结构的成员没有一个"传统" Linux 内核的命名机制. 这是因为这些成员直接对应于
USB 规范中的名子. USB 内核程序员认为使用规定的名子更重要, 以便在阅读规范时减少
混乱, 不必使这些名子对 Linux 程序员看起来熟悉.

接口

USB 端点被绑在接口中. USB 接口只处理一类 USB 逻辑连接, 例如一个鼠标, 一个键盘,
或者一个音频流. 一些 USB 设备有多个接口, 例如一个 USB 扬声器可能有 2 个接口:
一个 USB 键盘给按钮和一个 USB 音频流. 因为一个 USB 接口表示基本的功能, 每个
USB 驱动控制一个接口; 因此, 对扬声器的例子, Linux 需要 2 个不同的驱动给一个硬
件设备.
USB 接口可能有预备的设置, 是对接口参数的不同选择. 接口的初始化的状态是第一个设
置, 0 号. 预备的设置可用来以不同方式控制单独的端点, 例如来保留不同量的 USB 带
宽给设备. 每个有同步端点的设备使用预备设备给同一个接口.
USB 接口在内核中使用 struct usb_interface 结构来描述. 这个结构是 USB 核传递给
USB 驱动的并且是 USB 驱动接下来负责控制的. 这个结构中的重要成员是:
struct usb_host_interface *altsetting
一个包含所有预备设置的接口结构的数组, 可被挑选给这个接口. 每个 struct
usb_host_interface 包含一套端点配置, 如同由 struct usb_host_endpoint 结
构所定义的. 注意这些接口结构没有特别的顺序.
unsigned num_altsetting
由 altsetting 指针指向的预备设置的数目.
struct usb_host_interface *cur_altsetting
指向数组 altsetting 的一个指针, 表示这个接口当前的激活的设置.
int minor

如果绑定到这个接口的 USB 驱动使用 USB 主编号, 这个变量包含由 USB 核心安
排给接口的次编号. 这只在一次成功地调用 usb_register_dev (本章稍后描述)之
后才有效.
在 struct usb_interface 结构中有其他成员, 但是 USB 驱动不需要知道它们.

配置

USB 接口是自己被捆绑到配置的. 一个 USB 设备可有多个配置并且可能在它们之间转换
以便改变设备的状态. 例如, 一些允许固件被下载到它们的设备包含多个配置来实现这个.
一个配置只能在一个时间点上被使能. Linux 处理多配置 USB 设备不是太好, 但是, 幸
运的是, 它们很少.
linux 描述 USB 配置使用结构 struct usb_host_config 和整个 USB 设备使用结构
struct usb_device. USB 设备驱动通常不会需要读写这些结构的任何值, 因此它们在这
里没有详细定义. 好奇的读者可在内核源码树的文件 include/linux/usb.h 中找到对它
们的描述.
一个 USB 设备驱动通常不得不转换数据从给定的 struct usb_interface 结构到 struct
usb_device 结构, USB 核心需要给很多的函数调用. 为此, 提供有函数
interface_to_usbdev. 在以后, 希望所有的当前需要一个 struct usb_device 的 USB
调用, 将被转换为采用一个 struct usb_interface 参数, 并且不会要求驱动做这个转换.
所以总结, USB 设备是非常复杂的, 并且由许多不同逻辑单元组成. 这些单元之间的关系
可简单地描述如下:
•  设备通常有一个或多个配置.
•  配置常常有一个或多个接口
•  接口常常有一个或多个设置.
•  接口有零或多个端点.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/596960.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VUE3跳转页面时 定时器未清除解决

一,问题 1、在vue中使用setTimeout定时器的时候,可能会遇到关不掉的情况,会存在明明已经在beforeDestroy和destroyed中设置了定时器清除了,但是有时候没生效,定时器还会继续执行。 2、在这里需要说一下setTimeout的使用场景&…

软件体系结构与风格复习一

总结了软件体系结构风格的经典部分。 从软件架构风格的定义,到软件架构模型,到一些经典的软件架构风格。然后是敏捷开发中的软件架构,之后是软件架构风格的设计和实现,最后是软件架构风格的质量和评估。 这是整个课程的开展顺序…

YoloV8改进策略:基于频域多轴表示学习模块|全网首发|高效涨点|代码注释详解

摘要 涨点效果:在我自己的数据集上,改进一的mAP50 由0.986涨到了0.99,mAP50-95由0.737涨到0.749,涨点明显! 本文尝试使用频域多轴表示学习模块改进YoloV8,尝试了4种改进方式,均有不同的涨点。 论文:《医学图像分割中的频域多轴表示学习》 https://arxiv.org/pdf/231…

新能源汽车@2023/24:卷价格、拼智能与生态战

【潮汐商业评论/原创】 2023年末尾,受到大众广泛热议的小米汽车发布会“姗姗来迟”,也为“乱战”中的2023新能源汽车市场画上了一个句号。 然而,在雷军整整三个小时看似平和的演讲与技术讲解中,实则在电机、智驾、智舱等核心技术…

正则表达式速查

正则表达式速查 1、正则表达式2、常用正则表达式速查手册 1、正则表达式 正则表达式是一种强大的文本匹配工具,可以用于在文本中查找特定的模式 正则表达式由不同类型的字符组成,包括普通字符、元字符、分隔符和转义字符等。其中: 普通字符&…

java基础之java8新特性-默认方法

目录 1.默认方法 jdk8之前的接口 jdk8的接口 默认方法的用途 1.默认方法 jdk8之前的接口 在jdk8之前接口(interface)中可以定义变量和方法,变量必须是public,static,final的;方法必须是public&#xf…

初识对抗生成网络(GAN)

在研究语义通信的时候,发现解码端很多都是用GAN或基于GAN来完成的。带着对GAN的好奇,对GAN进行了一个初步学习。这篇文章介绍一下和GAN相关的一些常识吧~   本文围绕以下几个内容展开:     1.什么是GAN?     2.为什么要…

独立看门狗与窗口看门狗

一、简介 STM32F10xxx内置两个看门狗,提供了更高的安全性、时间的精确性和使用的灵活性。两个看门狗设备(独立看门狗和窗口看门狗)可用来检测和解决由软件错误引起的故障;当计数器达到给定的超时值时,触发一个中断(仅适用于窗口型看门狗)或产…

buuctf-Misc 题目解答分解106-108

106.[DDCTF2018]流量分析 提示了私钥 ,无厘头,先不管了,应该是流量加密了,用wireshark 打开 看看,真个数据流量,没有http 直接找到TCP 协议的包追踪一下TCP 找到TCP 不是红色的包追踪,大量的数…

长虹智能电视ZLM60HiS机芯刷机方法及刷机固件,附进维修模式方法

适配机芯:ZLM60HiS 型号:Q1FU、D6000i、U3、D8000ID 软件强制升级方法: 1、下载后解压,找到upgrade_ZLM60HiS_MT5508_V1.00xxx_part.pkg 、chandroid_ota_ZLM60HiS_datapart.zip复制到U盘根目录(不要有任何文件夹&a…

AOP获取方法返回值

我们用Spring的AOP切面做日志收集或者记录的时候,在springboot中用Aspect注解。比如: Aspect public class AdviceTest {Before("execution(* com.abc.service.*.many*(..))")public void permissionCheck(JoinPoint point) {System.out.print…

多交朋友多条路

最近在找工作,然后有个朋友帮我推荐一个公司,很感激他,这个朋友是之前指导过他写简历认识的,然后人家也有给我讲过一些知识,最近帮我推一个公司,不免觉得,其实多交点志同道合的朋友,…

指增的超额来自于哪里,2024的乾坤九法,美股的宏观估值双杀

图片截止到:2024/1/4 上证 周四 -0.43% 市场热点分析 1. 2024元旦后国内外市场都出现了不同程度的下跌。技术面国内市场一直走在72日均线之下,而且没有形成底部,熊市还会延续。宏观方面,12月官方PMI持续向下,小企业更多…

初入职场工作应该怎么干?

上一篇文章说过了,踏入职场和同事和领导关系怎么处,接下来我说说工作怎么干。 初入职场可能对环境,人,事,工作都一脸懵逼,深怕工作干不好之类的,所以我要给你吃定心丸,让你可以驰骋…

DBA技术栈(二):MySQL 存储引擎

2.1 MySQL存储引擎概述 上个业余的图: MyISAM 存储引擎是 MySQL 默认的存储引擎,也是目前 MySQL 使用最为广泛的存储引擎之一。他的前身就是我们在 MySQL 发展历程中所提到的 ISAM,是 ISAM 的升级版本。在 MySQL最开始发行的时候是 ISAM 存…

CentOS上设置中文/英文语言环境

一、在CentOS上设置中文语言环境 1、安装中文字体支持: sudo yum install -y wqy-microhei-fonts2、设置系统默认语言为中文: sudo localectl set-locale LANGzh_CN.UTF-83、重新启动系统,以便应用语言更改: sudo reboot二、在…

解锁无限可能:深入探索Docker的奇妙世界

解锁无限可能:深入探索Docker的奇妙世界 1、Docker的简介: Docker是一个开源的容器化平台,它以轻量级和可移植的方式打包应用程序及其所有依赖项,并提供了一种标准化的部署方式。通过使用Docker,开发人员可以将应用程…

编程语言的发展趋势是什么样的?

随着计算机技术的不断发展,计算机编程语言也在不断更新和发展。 未来编程语言的发展特点趋势是更安全、人性化(可读性、可写性)、跨平台这三个方向进行发展。更加简单易学更加多样性,有更加专业面向某一领域的语言,也…

Lumeical Script------Script Prompt 中的两种输出方式

Lumeical Script------Script Prompt 中的两种输出方式 引言正文方法1方法2 引言 有时候,和众多编程语言一样,我们需要在 Script Prompt 中打印一些我们已经得到的数据,这样可以方便我们调试代码和查看代码中是否有错误。关于在 Script Prom…