iis服务器助手广告广告
返回顶部
首页 > 资讯 > 操作系统 >Linux系统中USB驱动程序的工作流程
  • 255
分享到

Linux系统中USB驱动程序的工作流程

2023-06-13 06:06:14 255人浏览 独家记忆
摘要

本篇内容介绍了“linux系统中USB驱动程序的工作流程”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1.USB主机在Linux驱动中,US

本篇内容介绍了“linux系统中USB驱动程序的工作流程”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

Linux系统中USB驱动程序的工作流程

1.USB主机
在Linux驱动中,USB驱动处于最底层的是USB主机控制器硬件,在其之上运行的是USB主机控制器驱动,主机控制器之上为USB核心层,再上层为USB设备驱动层(插入主机上的U盘、鼠标、USB转串口等设备驱动)。

因此,在主机侧的层次结构中,要实现的USB驱动包括两类:USB主机控制器驱动和USB设备驱动,前者控制插入其中的USB设备,后者控制USB设备如何与主机通信。Linux内核USB核心负责USB驱动管理和协议处理的主要工作。主机控制器驱动和设备驱动之间的USB核心非常重要,其功能包括:通过定义一些数据结构、宏和功能函数,向上为设备驱动提供编程接口,向下为USB主机控制器驱动提供编程接口;通过全局变量维护整个系统的USB设备信息;完成设备热插拔控制、总线数据传输控制等。

2.USB设备
Linux内核中USB设备侧驱动程序分为3个层次:UDC驱动程序、Gadget api和Gadget驱动程序。UDC驱动程序直接访问硬件,控制USB设备和主机间的底层通信,向上层提供与硬件相关操作的回调函数。当前Gadget API是UDC驱动程序回调函数的简单包装。Gadget驱动程序具体控制USB设备功能的实现,使设备表现出“网络连接”、“打印机”或“USB Mass Storage”等特性,它使用Gadget API控制UDC实现上述功能。Gadget API把下层的UDC驱动程序和上层的Gadget驱动程序隔离开,使得在Linux系统中编写USB设备侧驱动程序时能够把功能的实现和底层通信分离。

3.层次
在USB设备组织结构中,从上到下分为设备(device)、配置(config)、接口(interface)和端点(endpoint)四个层次。USB设备程序绑定到接口上。
对于这四个层次的简单描述如下:
(1)设备通常具有一个或多个的配置
(2)配置经常具有一个或多个的接口
(3)接口没有或具有一个以上的端点

Linux系统中USB驱动程序的工作流程

4.端点
USB通信最基本的形式是通过端点(USB端点分中断(Interrupt)、批量(Bulk)、等时(ISO)、控制(Control)四种,每种用途不同),USB端点只能往一个方向传送数据,从主机到设备或者从设备到主机,端点可以看作是单向的管道(pipe)。驱动程序把驱动程序对象注册到USB子系统中,稍后再使用制造商和设备标识来判断是否已经安装了硬件。USB核心使用一个列表(是一个包含制造商ID和设备号ID的一个结构体)来判断对于一个设备该使用哪一个驱动程序,热插拨脚本使用它来确定当一个特定的设备插入到系统时该自动执行哪一个驱动程序的Probe。

5. 数据结构
(1)USB设备:对应数据结构struct usb_device
(2)配置:struct usb_host_config (任一时刻,只能有一个配置生效)
(3)USB接口:struct usb_interface (USB 核心将其传递给USB设备驱动,并由USB设备驱动负责后续的控制。一个USB接口代表一个基本功能,每个USB驱动控制一个接口。所以一个物理上的硬件设备可能需要 一个以上的驱动程序。)
(4)端点: struct usb_host_endpoint ,它所包含的真实端点信息在另一个结构中:struct usb_endpoint_descriptor(端点描述符,包含所有的USB特定数据)。

6. USB端点分类
USB 通讯的最基本形式是通过一个称为端点的东西。一个USB端点只能向一个方向传输数据(从主机到设备(称为输出端点)或者从设备到主机(称为输入端点))。端点可被看作一个单向的管道。
USB 端点有 4 种不同类型, 分别具有不同的数据传送方式:
(1)控制CONTROL
控制端点被用来控制对USB设备的不同部分访问. 通常用作配置设备、获取设备信息、发送命令到设备或获取设备状态报告。这些端点通常较小。每个 USB 设备都有一个控制端点称为"端点 0", 被 USB 核心用来在插入时配置设备。USB协议保证总有足够的带宽留给控制端点传送数据到设备.
(2)中断INTERRUPT
每当 USB 主机向设备请求数据时,中断端点以固定的速率传送小量的数据。此为USB 键盘和鼠标的主要的数据传送方法。它还用以传送数据到USB设备来控制设备。通常不用来传送大量数据。USB协议保证总有足够的带宽留给中断端点传送数据到设备.
(3)批量BULK
批量端点用以传送大量数据。这些端点通常比中断端点大得多. 它们普遍用于不能有任何数据丢失的情况。USB 协议不保证传输在特定时间范围内完成。如果总线上没有足够的空间来发送整个BULK包,它被分为多个包进行传输。这些端点普遍用于打印机、USB Mass Storage和USB网络设备上。
(4)等时ISOCHRONOUS
等时端点也批量传送大量数据, 但是这个数据不被保证能送达。这些端点用在可以处理数据丢失的设备中,并且更多依赖于保持持续的数据流。如音频和视频设备等等。
控制和批量端点用于异步数据传送,而中断和等时端点是周期性的。这意味着这些端点被设置来在固定的时间连续传送数据,USB 核心为它们保留了相应的带宽。

7. endpoint

C/C++ Code复制内容到剪贴板

  1. struct usb_host_endpoint{   

  2.     struct usb_endpoint_descriptor desc;//端点描述符   

  3.     struct list_head urb_list;//此端点的URB对列,由USB核心维护   

  4.     void *hcpriv;   

  5.     struct ep_device *ep_dev;   

  6.     unsigned char*extra;  

  7.     int extralen;   

  8.     int enabled;   

  9. };  

当调用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 )

8. urb
所有USB通讯均为请求-->响应模式,USB设备不会主动向Host发送数据。写数据:USB设备驱动发送urb请求给USB设备,USB设备不需要回数据。读数据:USB设备驱动发送urb请求给USB设备,USB设备需要回数据。
USB 设备驱动通过urb和所有的 USB 设备通讯。urb用 struct urb 结构描述(include/linux/usb.h )。
urb 以一种异步的方式同一个特定USB设备的特定端点发送或接受数据。一个 USB 设备驱动可根据驱动的需要,分配多个 urb 给一个端点或重用单个 urb 给多个不同的端点。设备中的每个端点都处理一个 urb 队列, 所以多个 urb 可在队列清空之前被发送到相同的端点。
一个 urb 的典型生命循环如下:
(1)被创建;
(2)被分配给一个特定 USB 设备的特定端点;
(3)被提交给 USB 核心;
(4)被 USB 核心提交给特定设备的特定 USB 主机控制器驱动;
(5)被 USB 主机控制器驱动处理, 并传送到设备;
(6)以上操作完成后,USB主机控制器驱动通知 USB 设备驱动。
urb 也可被提交它的驱动在任何时间取消;如果设备被移除,urb 可以被USB核心取消。urb 被动态创建并包含一个内部引用计数,使它们可以在最后一个用户释放它们时被自动释放。

1 提交 urb
一旦 urb 被正确地创建并初始化, 它就可以提交给 USB 核心以发送出到 USB 设备. 这通过调用函数sb_submit_urb 实现.
int usb_submit_urb(struct urb *urb, gfp_t mem_flags);
参数:
struct urb *urb :指向被提交的 urb 的指针
gfp_t mem_flags :使用传递给 kmalloc 调用同样的参数, 用来告诉 USB 核心如何及时分配内存缓冲
因为函数 usb_submit_urb 可被在任何时候被调用(包括从一个中断上下文), mem_flags 变量必须正确设置. 根据 usb_submit_urb 被调用的时间,只有 3 个有效值可用:
GFP_ATOMIC
只要满足以下条件,就应当使用此值:
1) 调用者处于一个 urb 结束处理例程,中断处理例程,底半部,tasklet或者一个定时器回调函数.
2) 调用者持有自旋或者读写锁. 注意如果正持有一个信号量, 这个值不必要.
3) current->state 不是 TASK_RUNNING. 除非驱动已自己改变 current 状态,否则状态应该一直是TASK_RUNNING .
GFP_NOio
驱动处于块 I/O 处理过程中. 它还应当用在所有的存储类型的错误处理过程中.
GFP_KERNEL
所有不属于之前提到的其他情况
在 urb 被成功提交给 USB 核心之后, 直到结束处理例程函数被调用前,都不能访问 urb 结构的任何成员

2 urb结束处理例程
如果 usb_submit_urb 被成功调用, 并把对 urb 的控制权传递给 USB 核心, 函数返回 0; 否则返回一个负的错误代码. 如果函数调用成功, 当 urb 被结束的时候结束处理例程会被调用一次.当这个函数被调用时, USB 核心就完成了这个urb, 并将它的控制权返回给设备驱动.
只有3 种结束urb并调用结束处理例程的情况:
(1)urb 被成功发送给设备, 且设备返回正确的确认.如果这样, urb 中的status变量被设置为 0.
(2)发生错误, 错误值记录在 urb 结构中的 status 变量.
(3)urb 从 USB 核心unlink. 这发生在要么当驱动通过调用 usb_unlink_urb 或者 usb_kill_urb告知 USB 核心取消一个已提交的 urb,或者在一个 urb 已经被提交给它时设备从系统中去除.

9. 探测和断开
在 struct usb_driver 结构中, 有 2 个 USB 核心在适当的时候调用的函数:
(1)当设备插入时, 如果 USB 核心认为这个驱动可以处理(USB核心使用一个列表(是一个包含制造商ID和设备号ID的一个结构体)来判断对于一个设备该使用哪一个驱动程序),则调用探测(probe)函数,探测函数检查传递给它的设备信息, 并判断驱动是否真正合适这个设备.
(2)由于某些原因,设备被移除或驱动不再控制设备时,调用断开(disconnect)函数,做适当清理.
探测和断开回调函数都在USB集线器内核线程上下文中被调用, 因此它们休眠是合法的. 为了缩短 USB 探测时间,大部分工作尽可能在设备打开时完成.这是因为 USB 核心是在一个线程中处理 USB 设备的添加和移除, 因此任何慢设备驱动都可能使 USB 设备探测时间变长。

1探测函数分析
在探测回调函数中, USB设备驱动应当初始化它可能用来管理 USB 设备的所有本地结构并保存所有需要的设备信息到本地结构, 因为在此时做这些通常更容易.为了和设备通讯,USB 驱动通常要探测设备的端点地址和缓冲大小.     


PS:Linux USB驱动相关细节知识补充
1. 在usb_fill_bulk_urb,usb_fill_int_urb,usb_fill_control_urb都需要指定回调函数,当此URB请求完成时,usb core回调用此函数。
注意:urb 回调函数是在中断上下文运行, 因此它不应做任何内存分配, 持有任何信号量, 或任何可导致进程休眠的事情. 如果从回调中提交 urb 并需要分配新内存块, 需使用 GFP_ATOMIC 标志来告知 USB 核心不要休眠.

urb封装函数:
(1)int usb_bulk_msg(struct usb_device *usb_dev,unsigned int pipe,void*data, int len, int*actual_length,int timeout)
功能:创建批量 urb 并发送到指定的设备, 接着在返回之前等待完成.
参数:
  struct usb_device *usb_dev :目标 USB 设备指针
  unsigned int pipe :目标 USB 设备的特定端点. 必须使用特定的宏创建.
  void *data :如果是 OUT 端点, 指向要发送到设备的数据的指针. 如果是 IN 端点, 这是从设备读取的数据的缓冲区指针.
  int len : data 参数指向的缓冲的长度
  int *actual_length :指向函数放置真实字节数的指针,根据端点方向,这些字节要么是被发送到设备的,要么是从设备中读取的.
  int timeout :时钟嘀哒数, 应等待的时间. 如果为 0, 函数永远等待操作完成.
返回值:成功返回0,actual_length 参数包含被传送或从设备中读取的字节数.否则返回负的错误值.

(2)int usb_control_msg(struct usb_device*dev, unsigned int pipe, __u8 request,__u8 requesttype, __u16 value, __u16 index,void *data, __u16 size,int timeout)
功能:创建控制 urb 并发送到指定的设备, 接着在返回之前等待完成.
参数:
  struct usb_device *usb_dev :目标 USB 设备指针
  unsigned int pipe :目标 USB 设备的特定端点. 必须使用特定的宏创建.
  __u8 request :控制消息的 USB 请求值.
  __u8 requesttype :控制消息的 USB 请求类型.
  __u16 value :控制消息的 USB 消息值.
  __u16 index :控制消息的 USB 消息索引值.
  void *data :如果是 OUT 端点, 指向要发送到设备的数据的指针. 如果是 IN 端点, 这是从设备读取的数据的缓冲区指针.
  __u16 size : data 参数指向的缓冲的长度
  int timeout :时钟嘀哒数, 应等待的时间. 如果为 0, 函数永远等待操作完成.
返回值:成功返回被传送到或从设备读取的字节数.否则返回负的错误值.

(3)int usb_interrupt_msg(struct usb_device*usb_dev, unsigned int pipe,void *data,int len, int *actual_length,int timeout)
功能:创建中断 urb 并发送到指定的设备, 接着在返回之前等待完成.其实就是usb_bulk_msg的包装,所有参数和usb_bulk_msg一样使用

“Linux系统中USB驱动程序的工作流程”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

--结束END--

本文标题: Linux系统中USB驱动程序的工作流程

本文链接: https://www.lsjlt.com/news/266210.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Linux系统中USB驱动程序的工作流程
    本篇内容介绍了“Linux系统中USB驱动程序的工作流程”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1.USB主机在Linux驱动中,US...
    99+
    2023-06-13
  • 操作系统与设备驱动程序的协奏曲
    操作系统:指挥家 操作系统作为系统的核心,负责管理计算机资源、协调任务执行和提供用户界面。它负责以下关键功能: 资源管理:操作系统分配和管理内存、CPU时间和存储空间。 进程调度:操作系统决定哪些进程应该运行以及以什么顺序运行。 文件系...
    99+
    2024-04-02
  • 操作系统性能监控:自动化你的工作流程
    自动化操作系统性能监控 随着IT环境变得越来越复杂,手动监控操作系统性能已变得不可行。自动化是简化、优化和提高操作系统监控效率的关键。 自动数据收集 自动化数据收集消除了手动收集指标的繁琐过程,它可以定期从操作系统中收集关键性能数据,例...
    99+
    2024-03-02
    操作系统监控、自动化、性能优化、工作流程管理、故障排除
  • Linux操作系统启动流程是怎么样的
    这篇文章主要为大家展示了“Linux操作系统启动流程是怎么样的”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Linux操作系统启动流程是怎么样的”这篇文章吧。Linux操作系统启动流程02 Ce...
    99+
    2023-06-15
  • win7系统如何还原驱动程序
    这篇文章给大家分享的是有关win7系统如何还原驱动程序的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、右键点击桌面的计算机,选择属性。二、在弹出的窗口左侧,点击“设备管理器”。三、找到之前更新过的驱动,比如显卡...
    99+
    2023-06-28
  • win7系统怎么还原驱动程序
    1、右键点击桌面上的“计算机”,选择属性,接着就进入到设备管理器; 2、找到之前更新过的硬件,比如说显卡,这时候就可以找到“显示适配器”里面的显卡,双击将其打开; 3、...
    99+
    2023-05-22
    win7 还原 驱动程序
  • 驱动程序的舞蹈:让操作系统与硬件共舞
    驱动程序是操作系统与硬件设备之间的关键桥梁,负责将硬件的低级指令翻译成操作系统能够理解的高级指令。理解驱动程序的运作方式对于确保计算机系统平稳高效运行至关重要。 什么是驱动程序? 驱动程序是软件程序,它允许特定硬件设备与计算机系统交互。每...
    99+
    2024-04-02
  • linux系统的启动流程是什么
    Linux系统的启动流程主要分为以下几个阶段: BIOS/UEFI启动:计算机加电后,首先由基本输入输出系统(BIOS)或统一可...
    99+
    2024-04-02
  • Windows10系统如何更新显卡驱动升级驱动程序
      显卡全称显示接口卡,承担输出显示图形的任务。显卡驱动程序是硬件所对应的软件。Windows10系统如何更新显卡驱动呢?   1、打开计算机管理&mdas      2、选择“自动搜索更新的驱动程序软件&r...
    99+
    2023-06-10
    Win10 显卡 驱动 系统 升级 驱动程序
  • linux中udev的工作流程是什么
    udev是Linux系统中的一个设备管理器,负责检测和处理设备的插拔事件。其工作流程如下: 内核通知:当设备被插入或拔出时,内核...
    99+
    2024-03-05
    linux
  • 操作系统与设备驱动程序的未来:无限可能
    虚拟化和云计算 虚拟化技术允许在单个物理服务器上运行多个虚拟机,这大大提高了资源利用率和灵活性。云计算将虚拟化扩展到互联网上,提供了按需提供计算、存储和网络资源的服务。未来,操作系统和驱动程序将需要支持虚拟化和云计算环境,以提供无缝体验和...
    99+
    2024-04-02
  • Linux系统启动流程(超详细)
    目录 前言 为什么要了解系统启动流程? 正文 linux开机启动流程图 1. 开机自检 (POST, Power On Self Test) 2. 启动顺序 3、主引导记录 MBR( master boot record) 4、启动管理器...
    99+
    2023-09-14
    linux 运维 服务器
  • 设备驱动程序:连接操作系统与世界的桥梁
    作用: 硬件抽象:驱动程序隐藏了硬件设备的底层细节,使其能够与应用软件和操作系统无缝互动。 设备控制:驱动程序允许操作系统读取、写入和配置设备,执行各种操作,如数据传输、电源管理和故障诊断。 中断处理:当硬件设备需要操作系统注意时,驱动...
    99+
    2024-04-02
  • ubuntu中怎么安装linux驱动程序
    这篇“ubuntu中怎么安装linux驱动程序”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“ubuntu中怎么安装linux...
    99+
    2023-07-04
  • Linux系统下如何生成引导盘与驱动程序盘
    这篇文章主要介绍“Linux系统下如何生成引导盘与驱动程序盘”,在日常操作中,相信很多人在Linux系统下如何生成引导盘与驱动程序盘问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Linux系统下如何生成引导盘...
    99+
    2023-06-10
  • 操作系统驱动程序的演变:从单一化到模块化
    单一化驱动程序 早期的操作系统采用单一化驱动程序架构,即所有硬件设备的驱动程序都集成在一个大型的内核模块中。这种架构简单易实现,但存在以下缺点: 耦合性高:设备驱动程序之间高度耦合,一个驱动程序的更改可能影响其他驱动程序的运行。 可扩展...
    99+
    2024-04-02
  • Linux系统启动流程是怎么样的
    这篇文章主要为大家展示了“Linux系统启动流程是怎么样的”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Linux系统启动流程是怎么样的”这篇文章吧。linux启动时我们会看到许多启动信息,Li...
    99+
    2023-06-27
  • win8系统怎么卸载内存驱动程序
    这篇文章主要介绍win8系统怎么卸载内存驱动程序,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、首先回到系统桌面,然后右键点击开始才,接着就会在开始菜单中出现设备管理器,点击进入。在打开的设备管理器窗口中,右键点击...
    99+
    2023-06-28
  • 如何解决win10系统驱动程序问题
    这篇文章将为大家详细讲解有关如何解决win10系统驱动程序问题,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。 对于电脑来说,驱动是不可或缺的。就算有电脑硬件,没有驱动也是无法正常运行。在软件方面...
    99+
    2023-06-27
  • win7如何禁止系统自动安装驱动程序
    用win7的朋友都知道,我们用手机或者U盘连接电脑的时候,系统都会自动搜索和安装驱动程序,这很方便也很人性化。不过,有些时候win7自动搜索的驱动程序和硬件不一定兼容,这就导致我们重新安装驱动的话,就必须到安全模式下把不...
    99+
    2023-05-31
    win7 自动安装驱动程序 系统 驱动程序
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作