LinuxZone

LinuxZone.net
Linux系统网——精选每一篇高品质的技术干货
  1. 首页
  2. 开源快讯
  3. 正文

LinuxUSB子系统下的USB总线驱动整体框架进行概述

2023年10月10日 264点热度

1、USB驱动引入

(在此博客以后,进行了更多剖析,见:)

USB(全称UniversalSerialBus,通用串行总线)。USB插口已然成为PC及嵌入式设备中最常用、最方便的通讯插口。LinuxUSB子系统较为庞大,本文主要对Linux系统下的USB总线驱动整体框架进行概述linux apache 虚拟主机,重点的细节待后续文章展开。

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

usb 1-1: new full speed USB device using XXXX-ohci and address 2
usb 1-1: configuration #1 chosen from 1 choice
scsi0 : SCSI emulation for USB Mass Storage devices
scsi 0:0:0:0: Direct-Access  Android Phone    0100 PQ: 0 ANSI: 2
sd 0:0:0:0: [sda] Attached SCSI removable disk

拔出后提示:

usb 1-1: USB disconnect, address 2

1.1USB的硬件结构

如图网桥(USBRootHub)端两条数据线(D+D-),都接有15K的出来阻值usb驱动linux,当无设备接入时,网桥数据线D+D-的电流为低电平。当设备接入时,因为设备的数据线上接有1.5K上拉阻值,致使1根数据线被拉高,网桥按照数据线被拉高得悉有设备接入,并按照D+为高还是D-为高来判定所接入的设备是全速USB设备(D+为高)还是低速USB设备(D-为高)。

1.2USB接入辨识大致过程

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

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

2、USB总线驱动框架

如上,我们大致了解了USB的简单通讯过程,并且哪些是USB总线驱动程序?哪些是USB设备驱动呢?

2.1USB的总线驱动框架

如右图所示:

2.2USBCore

驱动精灵_驱动之家_usb驱动linux

USBCore这个模块是纯软件部份,并不代表一个设备,是独立于硬件的合同栈,它是所有USB设备赖以生存的模块,即USB子系统的核心。代码坐落kernel/drivers/usb/core目录下。USBCore为设备驱动程序提供服务,提供一个用于访问和控制USB硬件的插口,而不用考虑系统当前使用的哪种HOSTController。USBCore将用户的恳求映射到相关的HCD,用户不能直接访问HCD。USBCore就是HCD与USB设备的桥梁。

其Makefile为:

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

2.3USBHCD(HostControllerDriver)

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

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

(2)OHCI:谷歌提供,开放主机控制插口,USB1.0/1.1;

(3)EHCI:提高主机控制插口,USB2.0;

2.4USBDeviceDriver

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.中断传输:可靠suse linux,实时,例如:USB键盘

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

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

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

struct usb_driver {
    const char *name; /*驱动程序名*/
    /* 当USB核心发现了该驱动能够处理的USB接口设备时,调用该函数 */
    int (*probe) (struct usb_interface *intf, const struct usb_device_id *id);
    /* 当相应的USB接口被移除时,调用该函数 */
    void (*disconnect) (struct usb_interface *intf);
    /* USB驱动能够处理的设备列表 */
    const struct usb_device_id *id_table;
}

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

分配/设置usb_driver结构体,实现并填充结构体内容注册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设备驱动框架。后续会针对一些重点知识进行专题剖析。主要包括:

USB设备描述符解析USB四类传输类型USB数据包格式剖析USB键盘设备驱动代码剖析USB初始化代码剖析USB枚举过程代码剖析

未完待续。。。

本作品采用 知识共享署名 4.0 国际许可协议 进行许可
标签: usb接口
最后更新:2023年10月10日

Linux系统网

每日更新,欢迎收藏♥ 不积跬步无以至千里,加油,共勉。

点赞
< 上一篇
下一篇 >

Linux系统网

每日更新,欢迎收藏♥
不积跬步无以至千里,加油,共勉。

最新 热点 随机
最新 热点 随机
Linux内核中的系统调用的标准表示可移植操作系统接口 分区和目录中创建的文件数量有限制 网络攻防干货:显示文件的前10行知识点详解 :Access访问时间函数讲解文件:#include定义函数 嵌入式Linux系统组成部分部分64移植过程 Linux中的文件时间属性可以使用stat命令命令查看 linux 命令 操作系统版本 中标麒麟-内核Linux银河麒麟内核 linux内核移植的主要模块(或组件) Ubuntu下终端默认字体,看起来很舒畅,蛮漂亮的 Linux设备树编译:内核中的dtc工具 服务器配置进行域名解析及域名的解析与解析 安装完linuxredhat5.4,打开浏览器发现显示中文全部成了乱码 linux下mysql英文乱码解决方式(2008-08-22) ubuntu字体安装方法,超实用!!(附详细教程) Linux下USB转串口DB9(RS232)和转换线 Linux上部署Web应用程序时非常常见的做法虚拟主机 (Linux基础知识)Linux用户权限管理 关于Linux发行版本的详细信息和架构信息的说明书 Linux操作系统安装Linux系统的镜像文件导入进去的应用 基于Linux的驱动开发:远见品质Linux内核与品质
Linux上部署Web应用程序时非常常见的做法虚拟主机Linux下USB转串口DB9(RS232)和转换线ubuntu字体安装方法,超实用!!(附详细教程)linux下mysql英文乱码解决方式(2008-08-22)安装完linuxredhat5.4,打开浏览器发现显示中文全部成了乱码服务器配置进行域名解析及域名的解析与解析Linux设备树编译:内核中的dtc工具Ubuntu下终端默认字体,看起来很舒畅,蛮漂亮的linux内核移植的主要模块(或组件)linux 命令 操作系统版本 中标麒麟-内核Linux银河麒麟内核Linux中的文件时间属性可以使用stat命令命令查看嵌入式Linux系统组成部分部分64移植过程:Access访问时间函数讲解文件:#include定义函数网络攻防干货:显示文件的前10行知识点详解分区和目录中创建的文件数量有限制Linux内核中的系统调用的标准表示可移植操作系统接口SHELL编程中使用变量的实验原理和使用技巧和技巧Linux服务器出现CPU负载达到100%居高不下的情况Java代码运行步骤及文档说明--Java代码动态规划软链接使用指令ln-s指令创建软连接文件操作系统
RedHat:红帽企业版Linux(RHEL)从高呼着 科技论文中常见的几种软件,你知道几个? C盘中的文件上传到Linux系统的操作步骤? 远程办公攻略:软件企业如何应对疫情挑战? 传送门:用Python做一个安全攻防工具 Linux命令很强大,安装一个rmm命令和命令环境 Linux系统磁盘存储不足怎么清理系统?利用率 如何使用VirtualBox设置虚拟机程序?|andMac Windows系统上安装JDK1.8.-231的步骤 Linux实时补丁(PREEMPT-RT)测试版已接近GA状态 如何使用SublimeText来连接服务器中的文件下载和上传 如何查看本机的linux使用的是什么shell? 常见字符集vs字符编码的关系及其常见的几个层次 MySQL查询DB2版本(详解如何查询MySQL中的DB2) 关于php中文乱码问题的终极解决方案,分享出来! deepin2014u盘安装教程来咯~下文将演示安装deepin Linux系统如何利用crontab添加定时任务的相关资料介绍? 内核替换编译的步骤及更新启动项grub的说明书 简单的Linux系统安装WiFi驱动程序 ARM嵌入式Linux系统开发详解(第2版)
标签聚合
文件 命令 操作 文件目录 应用 linux服务器 软件 内核 目录 linux系统
书籍
课程
技术群
技术干货大合集↓
  • 2023年12月 / 28篇
  • 2023年11月 / 89篇
  • 2023年10月 / 94篇
  • 2023年9月 / 90篇
  • 2023年8月 / 92篇
  • 2023年7月 / 96篇
  • 2023年6月 / 91篇
  • 2023年5月 / 93篇
  • 2023年4月 / 91篇
  • 2023年3月 / 69篇
友情链接:

Linux书籍 | Linux命令 | Linux系统 | RHCE红帽认证 | Linux软件 | Linux教程 | CentOS系统 | Linux内核 | Linux服务器 | Linux大神 | IT资源 | Linux系统

COPYRIGHT © 2024 LinuxZone.net ALL RIGHTS RESERVED.