Linux USB总线驱动框架分析

article/2025/7/18 20:05:00

1、USB驱动引入

USB(全称 Universal Serial Bus,通用串行总线),已经成为PC及嵌入式设备中最常用、最便捷的通信接口。Linux USB子系统较为庞大,本文主要对Linux系统下的USB总线驱动框架进行概述,重点的细节待后续文章展开。

首先来看一个现象,插入USB设备后linux系统打印如下日志:

 

拔出后提示:usb 1-1: USB disconnect, address 2

1.1 USB的硬件结构

如图集线器(USB Root Hub)端两条数据线(D+D-),都接有15K的下拉电阻,当无设备接入时,集线器数据线D+D-的电压为低电平。当设备接入时,由于设备的数据线上接有1.5K上拉电阻,使得1根数据线被拉高。集线器根据数据线被拉高得知有设备接入,并根据D+为高还是D-为高来判断所接入的设备是全速USB设备(D+为高)还是低速USB设备(D-为高)。

1.2 USB接入识别大致过程

当识别出有USB设备插入后,linux内的USB总线驱动程序发出命令至该设备,与设备对话,并询问设备信息(描述符),设备收到请求后,回复设备描述符给总线驱动程序。且总线驱动程序会为该设备分配一个地址,如上地址为2,当后期访问某个USB设备时,均会通过这个地址编号,当新接入的USB设备被第一次访问时,以地址0来访问。当USB总线驱动程序识别出设备后,会为其找到该USB设备驱动程序,如键盘,鼠标,U盘。

 

USB通信过程均为主从结构,USB主机发起通信请求,设备进行数据回复,USB设备不具备主动向主机通信的能力。

2、USB总线驱动框架

如上,我们大致了解了USB的简单通信过程,那么什么是USB总线驱动程序?什么是USB设备驱动呢?

2.1 USB的总线驱动框架     

USB总线框架总结为如下图:

 

2.2 USB Core

USB Core这个模块是纯软件部分,并不代表一个设备,是独立于硬件的协议栈,它是所有USB设备赖以生存的模块,即USB子系统的核心。代码位于kernel/drivers/usb/core目录下。

 

USB Core为设备驱动程序提供服务,提供一个用于访问和控制USB硬件的接口,而不用考虑系统当前使用的哪种HOST Controller。USB Core将用户的请求映射到相关的HCD,用户不能直接访问HCD。USB Core就是HCD与USB设备的桥梁。

 

其Makefile为:

USB的初始化函数在kernel/drivers/usb/core/usb.c中定义,主要完成bus_register(USB总线注册)、usb_major_init(注册usb主控器字符设备)、usb_register(注册usbfs驱动)、usb_hub_init(USB Hub初始化,注册hub驱动、创建内核守护线程来监测hub端口的状态变化)等工作,后续具体分析。

 

2.3 USB HCD(Host Controller Driver)

硬件主机控制器Host Controller之上运行的是HCD,是对主机控制器硬件的一个抽象,实现核心层与控制器之间的对话接口,USB HCD包含多种USB接口规范:

(1)UHCI:Intel提供,通用主机控制接口,USB1.0/1.1;

(2)OHCI:微软提供,开放主机控制接口,USB1.0/1.1;

(3)EHCI:增强主机控制接口,USB2.0;

2.4 USB Device Driver

USB设备驱动框架如下图所示:

USB设备是由一些配置(configuration)、接口(interface)和端点(endpoint)组成,,即一个USB设备可以含有一个或多个配置,在每个配置中可含有一个或多个接口,在每个接口中可含有若干个端点。一个USB设备驱动可能包含多个子驱动。一个USB设备子驱动程序对应一个USB接口,而非整个USB设备。

 

USB设备使用各种描述符来说明其设备架构,包括设备描述符、配置描述符、接口描述符、端点描述符、字符串描述符。后面单独讨论USB设备描述符。

 

USB传输的对象为端点(endpoint),每一个端点都有传输类型,传输方向,除了端点0外,每一个端点只支持一个方向的数据传输,端点0用于控制传输,既能输出也能输入。输入(IN)、输出(OUT) "都是" 基于USB主机的立场说的。比如鼠标的数据是从鼠标传到PC机, 对应的端点称为"输入端点"。

USB的传输类型:

a. 控制传输:可靠,时间有保证,比如:USB设备的识别过程

b. 批量传输: 可靠, 时间没有保证, 比如:U盘

c. 中断传输:可靠,实时,比如:USB鼠标

d. 实时传输:不可靠,实时,比如:USB摄像头

 

针对不同类型的USB设备,需要实现特定的USB驱动程序。如HID(Human Interface Device), 属于人机交互类的设备,如USB鼠标,USB键盘等。该类设备必须遵循HID设计规范。

 

在Linux内核中,使用 struct usb_driver结构体来描述一个USB驱动,通过usb_register在USB驱动中注册进内核。

 

因此USB设备驱动开发,主要包含如下两个部分:

  1. 分配/设置usb_driver结构体,实现并填充结构体内容

  2. 注册usb_driver

    后续将对USB鼠标驱动进行详细分析,其代码在kernel/drivers/hid/usbhid/usbmouse.c

3、USB设备识别过程

通过以上分析,USB设备驱动模型可以概括为如下图。

主要包含三个部分:USB控制器驱动,USB核心,USB设备驱动。如上图khubd是USB守护进程,当USB设备插入的时候,守护进程监测到,USB主机控制器就会产生一个hub_irq中断,控制器调用hub的探测函数,来解析设备信息。

下面分析一下USB设备的识别过程。

以上显示了设备插入到USB设备驱动被调用的函数流程,后面将拿出一章具体分析函数内部实现来进一步分析USB设备识别中做了哪些事情。

4、总结

通过以上内容,我们从整体上认识了USB硬件识别过程,USB总线框架及USB设备驱动框架。后续会针对一些重点知识进行专题分析。主要包括:

  1. USB设备描述符解析

  2. USB四类传输类型

  3. USB数据包格式分析

  4. USB鼠标设备驱动代码分析

  5. USB初始化代码分析

  6. USB枚举过程代码分析

     

    -END-


http://chatgpt.dhexx.cn/article/MwKI3nHh.shtml

相关文章

Django框架详解

一、MVC框架 1、MVC框架核心思想: 分工和解耦 2、web MVC举例: 以通过浏览器注册用户信息为例: M:Model,模型, 和数据库进行交互。V:View,视图, 产生html页面。C:Controller,控制器, 接收请求,进行处…

几种数据可视化框架分析

根据下面各个框架本身的特性,以及各自的优缺点,推荐使用D3或者ECharts作为数据可视化的首选框架,某些小特性可以辅用其他小框架实现。具体每个框架的说明和分析如下: D3.js D3是指数据驱动文档(Data-Driven Documents)。D3.js是一…

常见威胁建模框架分析与比较

1 概述 威胁建模的方法最初是为了帮助开发更多的安全的操作系统,但已经开发的大量威胁建模方法,有些只关注软件发展,有些仅涵盖业务或组织的风险和威胁,另有一些可能是技术性的,不同的威胁模型都在基于不同的目的而开…

某商城框架分析

开篇 最近做了一个商城系统,从系统的需求,到系统的选型以及框架和各种技术的研究和使用,我都参与其中,所以,分享一下这个系统. 框架 框架如下: 说明: 表现层 用户分为两种,PC端用户和移动端用户; 其中PC端包括 商城首页,商品类目,购物车,订单,商品展示,会员中心等…

Cgroup框架分析

cgroups概念扫盲 关于cgroups本文主要分析的是cgroups整体框架,不涉及对各个子系统的介绍和cgroupsfs的介绍,在分析cgroup整体框架的时候,首先我们需要对cgroups中的一些概念有所深刻认识,只有在这个基础上,才能明白为…

音视频常见播放器框架分析

音视频面试必问:如何设计一个播放器 1.常见播放器框架分析 2.如何解决播放端延迟的问题 3.音视频如何做同步 4.快进、快退、逐帧播放如何实现 音视频开发技术精讲《常见播放器框架分析》 播放器框架 SDL2播放音频 使用SDL播放解码后的音频数据,SDL播放…

商业分析经典框架

商业分析经典框架 文章目录 商业分析经典框架1.行业怎么盈利现状分析PEST分析产业链分析 2.行业里谁在挣钱竞争分析标杆公司分析竞争格局分析细分机会分析 3.企业还能盈利么发展分析商业化模式演变新技术/产品新用户新市场 总结 1.行业怎么盈利 现状分析 PEST分析 这个行业在…

Linux内核4.14版本——alsa框架分析(1)—alsa简介

目录 一,ALSA声音编程介绍 二,ALSA历史 三,数字音频基础 四,ALSA基础 五,ALSA体系结构 六,设备命名 七,声音缓存和数据传输 八,Over and Under Run 九,一个典型…

sFuzz源代码框架分析

sFuzz是发表在软件工程顶会ICSE2020年论文(sFuzz:An Efficient Adaptive Fuzzer for Solidity Smart Contracts)中实现的工具。sFuzz通过基于距离的启发式策略的模糊测试技术实现对合约漏洞检测。 sFuzz基于C实现,集成了以太坊和模…

Linux V4L2 框架分析

背景 Read the fucking source code! --By 鲁迅A picture is worth a thousand words. --By 高尔基 说明: Kernel版本:4.14ARM64处理器,Contex-A53,双核使用工具:Source Insight 3.5, Visio 1. 概述 V…

IM即时通讯项目框架分析

1 IM即时通讯项目框架分析和部署 1. 即时通讯框架分析和部署 2. 登录服务器和消息服务器设计 3. 路由服务器设计 4. 数据库代理服务器设计 5. 文件服务器和docker部署 6. 性能测试和k8s上云发布 1.1 即时通讯应用场景 即时通讯技术应用非常广泛,涉及教育、电商、金融、…

框架分析--框架驱动

使用pomelo开发应用时,我们一直关注的是给框架填入相应的回调,给app配置一些上下文。而没有太多关心整个框架的驱动力量。 在我们启动应用的时候,我们会在game-server目录下执行pomelo start,然后就能看到很多log信息,…

二、小程序框架分析

2.1小程序框架 2.1.1基本框架 1)逻辑层 用来处理业务逻辑 JavaScript 2)视图层 用来渲染页面 视图层描述语言WXML 视图样式WXSS 2.1.2目录结构 1)框架全局文件 ①app.js 定义全局数据和函数的使用 指定微信小程序的生命周期函数 onLa…

多属性决策模型 matlab代码及例子

多属性决策模型 通过层次分析模型得到的 权重与属性值相乘 再找最优 层次分析方法 请看上篇博客层次分析法 例子然后各项指标的重要性创建比较矩阵,通过层次分析法得到各权重。 利用各项指标权值与每个公司对应数据相乘再相加得到的总值对比。

多属性决策模型

多属性决策模型 一、多属性决策模型(1)特点(2)属性值的归一化①效益型②成本型③固定型④偏离型⑤区间型⑥偏离区间型 二、例题及步骤①建立数学模型②属性值归一化③对不同的属性构建成对比较矩阵并计算属性权重④计算每个公司的…

数学建模 02多属性决策 归一化处理

多属性决策 什么是多属性决策 它指的是利用已有的决策信息通过移动的方式对一组(有限个)备选方案进行排序或者择优。它的主要组成部分有如下2种: 1、获取决策信息:属性权重和属性值(实数、区间数和语言)…

基于离差最大化的多属性决策方法及matlab应用

1.基于离差最大化的多属性决策方法 若所有方案在属性uj下的属性值差异越小,则说明属性对方案决策所起的作用越小;反之越重要。从对方案进行排序的角度考虑,方案属性值偏差越大的属性应该赋予较大的权重。 步骤1 对于多属性决策问题,构造决策矩阵A,并利用适当方法规范化处…

多属性决策的权重确定方法及matlab 程序

本文介绍11种多属性决策权重确定方法及matlab 程序。 1.列和求逆归一化方法(NHM) 1 2.行和归一化方法(NRA) 1 3.和积法(ANC) 1 4.方根法(NGM) 1 5. 特征向量法(EM) 2 6.上三角梯度特征向量法HGEM 2 7.下三角梯度特征向量法LGEM 2 8.综合梯度特征向量法HLGEM 2 9.加权最…

数学建模 多属性决策模型

转载博客来自:https://blog.csdn.net/zxiang248/article/details/72828742 多属性决策介绍 多属性决策是现代决策科学的一个重要组成部分,它的理论和方法在工程设计、经济、管理和军事等诸多领域中有着广泛的应用,如:投资决策、…

数模(2)——多属性决策模型

原创为b站视频:https://www.bilibili.com/video/av20238704 定义: 利用已有的决策信息通过一定的方式对一组备选方案进行排序或择优。 步骤: (1)获取决策信息:属性权重和属性值 (2&#xf…