Linux驱动(3)- LInux USB驱动层次

在Linux系统中,提供了主机侧和设备侧USB驱动框架。

从主机侧,需要编写USB驱动包括主机控制器驱动,设备驱动两类,USB

主机控制驱动程序控制插入其中的USB设备。

USB设备驱动程序控制该设备如何作为从设备与主机进行通信。

1.主机侧与设备侧USB驱动

USB采用树状拓扑结构,主机侧和设备侧的USB控制器分别为主机控制器和USB

设备控制器,每条总线上只有一个主机控制器,负责协调主机与设备间的通讯,而设备不能主动向主机发送任何数据。

从主机侧看,要实现的USB驱动包括两类:USB主机控制器驱动和USB设备驱动。

USB设备驱动MASS storage/CDC/HID控制USB设备如何与主机通信
USB核心

负责USB驱动管理和协议处理的主要工作。

1.通过定义一些数据结构,宏和函数功能,向上为设备驱动提供编程接口,向下为USB主机控制器驱动提供编程接口。

2.维护整个系统的USB设备信息。

3.完成设备热插拔控制,总线数据传输控制

USB主机控制器驱动OHCI/EHCI/UHCI控制插入其中的USB设备
主机控制器只有一个主机控制器,负责协调主机与设备间的通讯

从设备上看,

Gardget Function 驱动(Mass storage/serial...)具体控制USB功能的实现,使设备表现出“网络连接”,“打印机”或者“USB Mass Storage”
Gadet Function APIUDC驱动函数的简单包装
UDC驱动(omap/pxa2xx)直接访问硬件,控设备和主机间的地层通信
USB设备控制器
2.设备,配置,接口,端点

 在USB设备逻辑中,包含设备,配置,接口和端点4个层次。

 

接口       

1.代表一个节本功能,是USB设备驱动程序控制对象,一个复杂的USB设备可以有多个接口。

2.每个配置有多个接口,而设备接口是端点的汇集。

一个配置中所有接口都可以同时有效,并且被不同的驱动程序连接。

端点

是USB通信的最基本形式,每个USB设备接口在主机看来就是一个端点的集合。

主机只能通过端点与设备进行通信,以使用设备功能。

每个端点都有一定的属性,包括传述方向,总线访问频率,贷款,端点好,数据包的最大容量等。

一个端点只能一个方向上成在数据,从主机到设备(输入端点),或者从设备到主机(输出端点),因此端点可看作一个单向的管道。

 设备通常有一个或者多个配置

配置通常有一个或者多个接口

接口通常有一个或者多个配置

接口有0个或者多个端点。


这种层次花配置信息在设备中通过一组标准的描述符来描述。

设备描述符

1.关于设备的通用信息,例如供应商 ID,产品ID,修订ID,支持设备类,自类和适合协议以及默认端点的最大包大小。

2.在LInux内核中,USB设备用usb_device结构体来描述,USB

设备描述符定义为usb_device_descriptor结构体。

配置描述符

此配置中的接口,支持的刮起和恢复的能力以及功率的要求。USB配置在内核中使用usb_host_config接口体描述,USB配置描述定义为结构体usb_config_descriptor

接口描述符

接口类,子类和使用的协议,接口备用配置的数目和端点数目。

USB接口在内核中使用usb_interface结构体描述。

端点描述符端点地址,方向和类型,支持的最大报打包大小,如果是中断类型的端点侧包括轮询频率。使用usb_host)endpoint接口体来描述。

 

设备描述符定义为usb_device_descriptor结构体

/* USB_DT_DEVICE: Device descriptor */
struct usb_device_descriptor { //usb设备描述符__u8  bLength;//长度__u8  bDescriptorType;//描述符类型__le16 bcdUSB;//usb SPEC的版本__u8  bDeviceClass;//设别类型__u8  bDeviceSubClass;//设备子类型__u8  bDeviceProtocol;//协议__u8  bMaxPacketSize0;//最大传输大小__le16 idVendor;//厂商ID__le16 idProduct;//设备ID__le16 bcdDevice;//设备版本号__u8  iManufacturer;//描述厂商字符串的索引__u8  iProduct;//描述产品字符串的索引__u8  iSerialNumber;//序列号__u8  bNumConfigurations;//设备当前速度模式下支持的配置数量。有的设备可以在多个速度模式下操作,这里包括的只是当前速度模式下的配置数目,不是总的配置数目
} __attribute__ ((packed));

 配置描述符:用结构体usb_config_descriptor描述。

struct usb_config_descriptor { //配置描述符__u8  bLength;//描述符长度__u8  bDescriptorType;//配置描述符的类型__le16 wTotalLength;//使用GET_DESCRIPTOR请求从设备里获得配置描述符信息时,返回的数据长度__u8  bNumInterfaces;//这个配置包含的接口数量__u8  bConfigurationValue;//对于拥有多个配置的设备来说,可以拿这个值为参数,使用SET_CONFIGURATION请求来改变正在被使用的 USB配置,bConfigurationValue就指明了将要激活哪个配置。咱们的设备虽然可以有多个配置,但同一时间却也只能有一个配置被激活。捎带着提一下,SET_CONFIGURATION请求也是标准的设备请求之一,专门用来设置设备的配置。__u8  iConfiguration;//描述配置信息的字符串描述符的索引值__u8  bmAttributes;//这个字段表征了配置的一些特点,比如bit 6为1表示self-powered,bit 5为1表示这个配置支持远程唤醒。另外,它的bit 7必须为1__u8  bMaxPower;//设备正常运转时,从总线那里分得的最大电流值,以2mA为单位。设备可以使用这个字段向hub表明自己需要的的电流,但如果设备需求过于旺盛,请求的超出了hub所能给予的,hub就会直接拒绝还记得struct usb_device结构里的bus_mA吗?它就表示hub所能够给予的。计算机的usb端口可以提供最多500mA的电流
} __attribute__ ((packed));

接口描述符:用usb_interface_descriptor结构体描述

/* USB_DT_INTERFACE: Interface descriptor */
struct usb_interface_descriptor {__u8  bLength;//接口描述符长度__u8  bDescriptorType;//接口描述符类型__u8  bInterfaceNumber;//接口号。每个配置可以包含多个接口,这个值就是它们的索引值。__u8  bAlternateSetting;//接口使用的是哪个可选设置。协议里规定,接口默认使用的设置总为0号设置。__u8  bNumEndpoints;//接口拥有的端点数量。这里并不包括端点0,因为端点0是控制传输,是所有的设备都必须提供的,所以这里就没必要多此一举的包括它了。对于hub,因为它的传输是中断传输,所以此值为1(不包括端点0)__u8  bInterfaceClass;//接口类型__u8  bInterfaceSubClass;//接口子类型__u8  bInterfaceProtocol;//接口所遵循的协议__u8  iInterface;//描述该接口的字符串索引值
} __attribute__ ((packed));

端点描述符:定义为usb_endpoint_descriptor结构体 

/* USB_DT_ENDPOINT: Endpoint descriptor */
struct usb_endpoint_descriptor {//USB 端点描述符(每个USB设备最多有16个端点)__u8  bLength;//描述符的字节长度__u8  bDescriptorType;//描述符类型,对于端点就是USB_DT_ENDPOIN__u8  bEndpointAddress;//bit0~3表示端点地址,bit8 表示方向,输入还是输出__u8  bmAttributes;//属性(bit0、bit1构成传输类型,00--控制,01--等时,10--批量,11--中断)__le16 wMaxPacketSize;//端点一次可以处理的最大字节数__u8  bInterval;//希望主机轮询自己的时间间隔/* NOTE:  these two are _only_ in audio endpoints. *//* use USB_DT_ENDPOINT*_SIZE in bLength, not sizeof. */__u8  bRefresh;__u8  bSynchAddress;//对于同步传送的端点,此域必须为1
} __attribute__ ((packed));

可以通过lsusb -v查看usb节电信息

Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Couldn't open device, some information will be missing
Device Descriptor:bLength                18bDescriptorType         1bcdUSB               3.10bDeviceClass            9 HubbDeviceSubClass         0 bDeviceProtocol         3 bMaxPacketSize0         9idVendor           0x1d6b Linux FoundationidProduct          0x0003 3.0 root hubbcdDevice            6.05iManufacturer           3 Linux 6.5.0-35-generic xhci-hcdiProduct                2 xHCI Host ControlleriSerial                 1 0000:03:00.4bNumConfigurations      1Configuration Descriptor:bLength                 9bDescriptorType         2wTotalLength       0x001fbNumInterfaces          1bConfigurationValue     1iConfiguration          0 bmAttributes         0xe0Self PoweredRemote WakeupMaxPower                0mAInterface Descriptor:bLength                 9bDescriptorType         4bInterfaceNumber        0bAlternateSetting       0bNumEndpoints           1bInterfaceClass         9 HubbInterfaceSubClass      0 bInterfaceProtocol      0 Full speed (or root) hubiInterface              0 Endpoint Descriptor:bLength                 7bDescriptorType         5bEndpointAddress     0x81  EP 1 INbmAttributes            3Transfer Type            InterruptSynch Type               NoneUsage Type               DatawMaxPacketSize     0x0004  1x 4 bytesbInterval              12bMaxBurst               0

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

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

相关文章

Attention相关问题笔试解析。

Attention相关问题笔试解析。 题目描述一:【选择】题目描述二:【简答】题目描述三:【代码】Scaled Dot-Product Attention:下面是用PyTorch实现的一个Attention机制的代码。这个实现包括一个简单的Scaled Dot-Product Attention机…

XX数字中台技术栈及能力

XX数字中台技术栈及能力 1 概述 XX数字中台面向数据开发者、数据管理者和数据应用者,提供数据汇聚、融合、治理、开发、挖掘、共享、可视化、智能化等能力,实现数据端到端的全生命周期管理,以共筑数字基础底座,共享数据服务能力…

Java核心: 脚本引擎和动态编译

静态语言和动态语言的在相互吸收对方的优秀特性,取人之长补己之短。脚本引擎和动态编译就是其中一个关键特性,扩展了Java的能力边界。这一篇我们主要讲两个东西: ScriptEngine,执行脚本语言代码,如JavaScript、Groovy JavaCompile…

插入排序(概述)

描述 插入排序为将一个数插入到以排序好的数组中 目录 描述 原理 特性 代码 原理 我们以升序为例 先将新数插入到数组的最后一位,记录下新数的值 从新数的位置开始往前遍历,如果前一位大于新数的值 则将当前位置修改为前一位的值 如果前一位小…

爬虫案例:有道翻译python逆向

pip install pip install requestspip install base64pip install pycrytodome tools 浏览器的开发者工具,重点使用断点,和调用堆栈 工具网站:https://curlconverter.com/ 简便请求发送信息 flow 根据网站信息,preview,respon…

php之sql代码审计

1 SQL注入代码审计流程 1.1 反向查找流程 通过可控变量(输入点)回溯危险函数 查找危险函数确定可控变量 传递的过程中触发漏洞 1.2 反向查找流程特点 暴力:全局搜索危险函数 简单:无需过多理解目标网站功能与架构 快速:适用于自动化代码审…

RK3588 opencv maliGPU图像拼接

1 左边图 图像大小:1920*1080 2右边图 图像大小:1920*1080 3拼接好的图像 图像大小&#xff1a;1920 *1080 4代码 #include <iostream> #include <opencv2/opencv.hpp> #include <opencv2/highgui.hpp>//图像融合 #include <opencv2/xfeatures2d.…

基于SpringBoot和Mybatis实现的留言板案例

目录 一、需求及界面展示 二、准备工作 引入依赖 .yml文件相关配置 数据库数据准备 三、编写后端代码 需求分析 代码结构 Model Mapper Service Controller 前端代码 四、测试 一、需求及界面展示 需求&#xff1a; 1. 输入留言信息&#xff0c;点击提交&…

qt-C++笔记之使用QtConcurrent异步地执行槽函数中的内容,使其不阻塞主界面

qt-C笔记之使用QtConcurrent异步地执行槽函数中的内容&#xff0c;使其不阻塞主界面 code review! 文章目录 qt-C笔记之使用QtConcurrent异步地执行槽函数中的内容&#xff0c;使其不阻塞主界面1.QtConcurrent::run基本用法基本用法启动一个全局函数或静态成员函数使用 Lambda…

iOS--锁的学习

iOS--锁的学习 锁的介绍线程安全 锁的分类自旋锁和互斥锁OSSpinLockos_unfair_lockpthread_mutexpthread_mutex的属性 NSLockNSRecursiveLockNSConditionNSConditionLockdispatch_semaphoredispatch_queuesynchronizedatomicpthread_rwlock&#xff1a;读写锁dispatch_barrier_…

摸鱼大数据——Hive基础理论知识——Hive基础架构

1、Hive和MapReduce的关系 1- 用户在Hive上编写数据分析的SQL语句&#xff0c;然后再通过Hive将SQL语句翻译成MapReduce程序代码&#xff0c;最后提交到Yarn集群上进行运行 2- 大家可以将Hive理解成有道词典&#xff0c;帮助你翻译英文 2、Hive架构 用户接口: 包括 CLI、JDBC/…

Java+Swing+Mysql实现飞机订票系统

一、系统介绍 1.开发环境 操作系统&#xff1a;Win10 开发工具 &#xff1a;Eclipse2021 JDK版本&#xff1a;jdk1.8 数据库&#xff1a;Mysql8.0 2.技术选型 JavaSwingMysql 3.功能模块 4.数据库设计 1.用户表&#xff08;users&#xff09; 字段名称 类型 记录内容…

脑机接口习题

9-12章习题 填空题 EEG电极分为 主动电极 和 被动电极 &#xff0c;其中 被动电极 直接与放大器连接&#xff0c; 主动电极 包含一个1~10倍的前置放大。除抗混淆滤波器&#xff0c;放大系统也包含由电阻器、电容器构成的模拟滤波器&#xff0c;把信号频率内容限制在一个特定的…

B树与B+树区别

B树和B树是常见的数据库索引结构&#xff0c;都具有相较于二叉树层级较少&#xff0c;查找效率高的特点&#xff0c;它们之间有以下几个主要区别&#xff1a; 1.节点存储数据的方式不同 B树的叶子结点和非叶子节点都会存储数据&#xff0c;指针和数据共同保存在同一节点中B树…

当标签中出现输入了字母或者数字直接在一行上,没有换行的 情况时怎么办

当标签块中输入的是包含字母或者数字的时候&#xff0c;他不会换行&#xff0c;在一行上显示滚动条的形式&#xff0c;而我们想让他走正常文档流&#xff0c;该换行的时候换行 想要的如下效果 给相应的元素块添加该代码即可 word-break: break-all; .card-content { …

酷开科技大屏营销,多元需求唤醒“客厅经济”

随着科技的发展和消费者习惯的变化&#xff0c;OTT大屏营销正逐渐成为客厅经济的新风向。OTT不仅改变了人们获取信息和娱乐的方式&#xff0c;也为品牌营销提供了新的机遇和挑战&#xff0c;OTT大屏营销已经成为客厅经济的重要组成部分。酷开科技通过其自主研发的智能电视操作系…

一文了解 - GPS/DR组合定位技术

GPS Global Position System 全球定位系统这个大家都很熟悉&#xff0c; 不做太多介绍。 DR Dead Reckoning 车辆推算定位法&#xff0c; 一种常用的辅助的车辆定位技术。 DR系统的优点&#xff1a; 不需要发射和接收信号&#xff1b; 不受电磁波干扰。 DR系统的缺点&#x…

项目管理-质量管理

目录 一、质量管理概述 1.1 GB/T16260.1-2006 定义 1.2 GB/T19000-ISO 9000(2000)系列标准定义 二、软件质量模型 2.1 软件全生命周期质量模型 2.1.1 内部和外部质量的质量模型 2.1.2 使用质量的质量模型 2.1.3 McCall 质量模型 2.1.4 质量特性度量 2.1.5 相关概念 三…

【全开源】多功能投票小程序(ThinkPHP+FastAdmin+Uniapp)

打造高效、便捷的投票体验 一、引言 在数字化快速发展的今天&#xff0c;投票作为一种常见的决策方式&#xff0c;其便捷性和效率性显得尤为重要。为了满足不同场景下的投票需求&#xff0c;我们推出了这款多功能投票小程序系统源码。该系统源码设计灵活、功能丰富&#xff0…