LINUX USB 系统(1) 收藏

2023-05-16

LINUX USB 系统(1) 收藏


1、   简述:

USB 出自豪门,一问世便有 IBM,Microsoft,compaq 等前呼后拥,不红实在是没有道理,以致于连三岁小毛孩都知道买游戏手柄要买 USB 的。

USB 名气这么大,但 USB 是什么呢?要是想找份写驱动的活谋生,常会被问到这样的要求: “ 给我讲讲 USB 。 ”

无论你是谁,遇到这样的问题一定要扭头就跑,不然一定被雷死。

USB 使用方便,硬件设计也简单,但开发人员还是谈 USB 色变。为什么呢,因为 USB 简单方便的外表下面是一个十分复杂的 USB 系统。简单方便和成本低廉的代价就是逻辑上的复杂,这里的逻辑指的就是 USB 协议。 USB 的协议之多之杂在 IT 界内绝对是史无前例的,数据传输的协议,控制协议,主控制器协议,设备相关的协议,硬件接口的协议,这些都要和 USB 扯上关系,都称自己是 USB 协议,以至于有很多人雄心勃勃的研读了几年的 USB 协议才发现所研读的内容和自己要想了解的东西扯不上关系。

在我看来, USB 的成功主得益于两点 :

首先是集成电路技术的发展,使得控制器能集成更复杂的逻辑( USB 协议)的同进价格还能降下来。一个产品要想推广开,首先是要足够便宜,要让大众能买得起用得起,其次是功能强大,集成电路技术的发展给了 usb 这两个条件。

但集成电路的发展带来的好处也被 USB 同时代的其它接口标准(如 1394 )所共享, USB 绝对并成本最低,性格比最高,协议设计的最完美的接口,但 USB 为什么能独霸天下呢?是中国人的都知道,爹妈很重要。这就是 USB 之所以能成名的第二点,出生好。

有了 Intel,IBM,Microsoft,compaq 这群好爹妈的支持,就算是阿斗也能坐上皇位,向况 USB 不是阿斗。这群好爹妈运用自己强大的影响力,给 USB 制定了一系列的标准,要想跟他们混就得尊守这个标准,其它团体也是敢怒不敢言,屁踮屁踮的就奔着 USB 去了。

 

 

USB 系统概述

首先,我们来回答一下面试官的问题, USB 是什么, usb 就是 Universal Serial Bus (通用串行总线)。什么是 Universal Serial Bus 呢。这个用语言就难以表达了,请看下面两张图:                


 
   

 

 

 


 
   


 

 

少 许的艺术细胞加上平时的使用经验就能理解第一张图的含义,一个 USB 主机可以通过 hub 可以连接许多的从设备,组成像树一样的结构。

关键是第二张图,详细的描述的 linux USB 系统的几大板块,这种结构基本上适用所有操作系统的 USB 架构。

可能是 USB 这三个字母看起来比较酷,稍和 USB 沾边的开发人员都会吹自己做过 USB 开发,特别是那些介绍 USB 的垃圾书,从头到尾扯了一通他也没有告诉读者他讲的是 USB 技术的那一部份,在 USB 的整个架构中的作用。

首先 ,USB 分为主从两大体系,一般而言, PC 中的 USB 系统就是作主,而一般的 USB 鼠标, U 盘则是典型的 USB 从系统。即使是一个 USB 鼠标,也不要小看它,它其中也有很精深的 USB 技术。作为 USB 鼠标的第一大生产国,我们实在没有什么好骄傲的,如果从零开始,花个十年八年我们国家也不一定能研发出一个像样的 USB 鼠标。

先说控制器这一块,我们至少要开发出 USB 的主控制器与从控制器,鼠标是低速设备,所需的是最简单的一类从控制器。主控制器则复杂得多,因为太过于复杂了,所以就形成了一些标准。在一个复杂的系统中,标准的好处就是可以让开发者把精力集中在自己负责的一块中来,只需要向外界提供最标准的接口,而免于陷于技术的汪洋大海中。

USB 主控制器主要有 1.1 时代的 OHCI 和 UHCI , 2.0 时代的 EHCI ,这些标准规定了主控制器的功能和接口(寄存器的序列及功能),对我们驱动工程师而言,这样的好处就是只要你的驱动符合标某一标准,你就能轻而易举的驱动所有这个标准的主控制器。要想把主控制器驱动起来,本来是一件很难的事情,估计全球的 IT 工程师没几个能有这样的水平,但有了标准,我们就可以轻松的占有这几个高水平的 IT 工程师的劳动成果。

主控制器和驱动有了,我们还需要 USB 协议栈,这就是整个 USB 系统的软件部分的核心(有的资料中直接把其称为 USB 核心), USB 协议栈一方面向使用 USB 总线的设备驱动提供操作 USB 总线的 API ,另一方面则管理上层驱动传下来的的数据流,按 USB 主控制器的要求放在控制器驱动规定的位置, USB 主控制器会调度这些数据。

 

我们这里用到了调度这个词, USB 主控制器的调度其实和火车的调度 CPU 的调度有相似之处,物理上的通路只有一条,但 USB 中规定的逻辑上的通路却有许多条,有时一个设备就会占用几条逻辑通道,而 USB 系统中又会有多个设备同时运行。这就好像是只有一条铁路线,但来来往往的火车却有许多, USB 主控制器的作用就是调度这些火车,而 USB 协议栈的作用则向上层的 USB 设备驱动提供不同的车次。

有了以上的这些模块,才能为 USB 鼠标设计驱动,这一点上 ps/2 鼠标的驱动和 USB 鼠标的驱动结构基本一样,只不过我们的数据通路是 USB 总线。

USB 系统甚至把设备驱动都给标准化了,只要是支持 USB 的主机,就可以支持任何一个厂商的 USB 鼠标,任何一个厂商的 U 盘,只要是被 USB 系统包函的设备,只要这些设备支持相应的标准,就无需重新设计驱动而直接使用。

下是简单的列出了 USB 设备类型,理想的情况 USB 系统要对这些设备作完整的支持,设备也必须符合 USB 规范中的要求。

 

 

1 - audio :表示一个音频设   备。
   
2 - communication   device :通讯设备,如电话, moden 等等。
   
3 - HID :人机交互设备,如键盘,鼠标等。
   
6 - image 图象设备,如扫描仪,摄像头等,有时数码相    机也可归到这一类。
   
7 -打印机类。如单向,双向打印机等。
   
8 - mass   storage 海量存储类。所有带有一定存储功能的都可以归到这一类。如数码相机大多数都归这一类。
   
9 - hub 类。
   
11 - chip   card/smart   card 。
   
13 -- Content Security
   
14 -- Video  ( Interface )
   
15 -- Personal Healthcare
   
220 -- Diagnostic Device
   
224 -- Wireless Controller  ( Interface )
   
239 -- Miscellaneous
   
254 -- Application Specific  ( Interface )
   
255 - vendor   specific. 厂家的自定义类,主要用于一些特殊的设备。如接口转接卡等。

 
   

理解了这两张图,基本能应付一下面试官了,但我建议还是随身带着这两张张图,因为 USB 系统确实太复杂,言语难以表达,很可能他说的 USB 和你讲的 USB 压根就不是一个东西,只是都和 USB 相关。

但这两张图也不能回答所有的问题,随着 USB 技术的发展, USB 系统中的一些不足也逐渐被承认, OTG 就是这种情况下的主要产物。

现在市面上有些设备(比如一些 MP4 )即能插上电脑当 U 盘使,也能被 U 盘插上读取 U 盘。这样的设备在 USB 系统中是作主还是作从呢?

这就是 OTG(On-The-Go), 即可以作主也可以作从,传说中的雌雄同体。这主要是为嵌入式设备准备的,因为 USB 是一种主从系统,不能支持点对点平等的传输数据, OTG 正是在这种需求下产生的, OTG 不仅支持控制器的主从切换,在一定层度上,也支持相同设备之间的数据交换。


注:转载请注明出处 datangsoc@hotmail.com


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/datangsoc/archive/2010/08/24/5835635.aspx

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

LINUX USB 系统(1) 收藏 的相关文章

  • linux下写入后崩溃

    如果我使用 write 将一些数据写入磁盘上的文件会发生什么 但我的应用程序在刷新之前崩溃了 如果没有系统故障 是否可以保证我的数据最终会刷新到磁盘 如果您正在使用write 并不是fwrite or std ostream write 那
  • pprof 和 ps 之间的内存使用差异

    我一直在尝试分析用 cobra 构建的 cli 工具的堆使用情况 这pprof工具显示如下 Flat Flat Sum Cum Cum Name Inlined 1 58GB 49 98 49 98 1 58GB 49 98 os Read
  • C - 为什么我无法映射较小(256UL 或更小)的内存?

    请告诉我 为什么我的简单应用程序无法映射较小的内存 而且 为什么有这样一个特定的边界 257UL define MAP SIZE 256UL or below fail define MAP SIZE 257UL ok include
  • 从c调用汇编函数

    我试图从 c 调用汇编函数 但我不断收到错误 text globl integrate type integrate function integrate push ebp mov esp ebp mov 0 edi start loop
  • 码头无故停止

    我需要经验丰富的码头用户的建议 我在负载均衡器 亚马逊云 后面维护着 2 台 Linux 机器 使用 Jetty 9 0 3 有时我的 Jetty 容器会被 Thread 2 无故关闭 同时地 显示以下日志并且容器无故停止 没有错误 没有例
  • Linux“屏幕”的 Windows 等效项还是其他替代方案?

    我正在寻找一种在 Windows 环境中控制程序的方法 我希望它与 Linux 软件有点相似 screen 我搜索的原因是我需要使用标识符启动一个程序 在 Windows 上 这样我以后就能够关闭该特定程序 而无需关闭其他任何程序 即使实际
  • 使用 gcc 理解共享库

    我试图理解 C 中共享库的以下行为 机器一 cat one c include
  • Python将文件从Linux复制到WIndows

    我正在构建一个网站 该网站有一个表单 可以捕获用户数据并在用户数据上运行一些cgi cgi 的第一步是需要将文件从 Linux Web 服务器复制到 Windows 计算机 服务器将使用 Active Directory 角色帐户作为复制凭
  • Visual Studio - X11:缺少 DISPLAY 环境变量

    我正在使用 Visual Studio 2019 Enterprise 开发跨平台 Windows Linux x64 GUI 应用程序 在这个 2019 版本中 我们可以使用 Visual Studio调试平台 Windows 本机 和
  • pthread_self() 返回的线程 ID 与调用 gettid(2) 返回的内核线程 ID 不同

    这句话来自于pthread self 的手册页 http linux die net man 3 pthread self 那么 我应该根据什么来决定是否应该使用pthread self or gettid确定哪个线程正在运行该函数 两者都
  • Grep 递归和计数

    需要在具有大量子目录的目录中搜索文件内的字符串 我在用着 grep c r string here 我怎样才能找到总数量 如何仅输出至少具有一个实例的文件 使用 Bash 的进程替换 这给出了我认为是您想要的输出 如果不是 请澄清问题 gr
  • Ctrl-p 和 Ctrl-n 在 Docker 下表现异常

    For the life of me I can t seem to figure out why ctrl p and ctrl n don t work like they re supposed to under the Docker
  • Swift 上的 USB 连接委托

    Swift 中是否有一个代表可以让我的班级知道何时通过计算机的 USB 插入新设备 我想知道我的程序何时可以使用新设备 Eric Aya 的答案已经相当不错了 但这里有一个 Swift 3 的改编 我把大部分丑陋的东西包裹在一个USBWat
  • Apache LOG:子进程 pid xxxx 退出信号分段错误 (11)

    Apache PHP Mysql Linux 注意 子进程 pid 23145 退出信号分段错误 11 tmp 中可能存在 coredump 但 tmp下没有找到任何东西 我怎样才能找到错误 PHP 代码中函数的无限循环导致了此错误
  • 从哪里获取 iostream.h

    我正在尝试在 Linux 中做一些事情 但它抱怨找不到 iostream h 我需要安装什么才能获取此文件 这个标准头的正确名称是iostream没有扩展名 如果您的编译器仍然找不到它 请尝试以下操作 find usr include na
  • 如何指定配置脚本的包含目录

    我的工作场所有一个 Linux 系统 其中包含相当旧的软件包 并且没有 root 访问权限 我正在从源代码编译我需要的包 prefix somewhere in homedir 我的问题是我只是不知道如何说服配置在特定目录中查找头文件 源码
  • 虚拟USB设备的安装与仿真

    我已经读过创建虚拟USB设备 https stackoverflow com questions 5016363 creating a virtual usb device and 虚拟USB设备 https stackoverflow c
  • 如何通过不同的接口路由 TCP/IP 响应?

    我有两台机器 每台机器都有两个有效的网络接口 一个以太网接口eth0和 tun tap 接口gr0 目标是使用接口在机器 A 上启动 TCP 连接gr0但然后让机器 B 的响应 ACK 等 通过以太网接口返回 eth0 因此 机器 A 发出
  • Unix 中的访问时间是多少

    我想知道访问时间是多少 我在网上搜索但得到了相同的定义 读 被改变 我知道与touch我们可以改变它 谁能用一个例子来解释一下它是如何改变的 有没有办法在unix中获取创建日期 时间 stat结构 The stat 2 结构跟踪所有文件日期
  • 如何在 bash_profile 文件中添加导出语句?

    我正在尝试了解是否必须添加导出语句来在 bash profile 文件中设置变量 我该怎么做呢 例如 如果我必须添加 export AX name 那么我应该将其简单地写在文件末尾还是我还需要编写其他内容 简单写一下export AS na

随机推荐

  • ucos ii是怎么实现多任务运行的?很通俗易懂的描述

    问题 xff1a ucos上建立一个任务 xff0c 格式如上图 xff0c 它是一个死循环 xff0c 但如果我建立了五个任务 xff0c 并且五个任务里面没有延时 xff0c 就只是像无操作系统那样写法 xff0c 用死循环让它们一直跑
  • 解决vim中文乱码

    执行 xff1a cd xff5e vim vimrc 将如下文本复制保存退出即可 set fileencodings 61 utf 8 ucs bom gb18030 gbk gb2312 cp936 set termencoding 6
  • nginx开启ssl证书

    修改listen为443 如果你又开启防火墙 xff0c 还需将443端口放开 在server中添加 ssl on ssl session timeout 5m ssl certificate cert 214050429370638 pe
  • 一键安装全局npm模块

    GitHub xff1a https github com flitrue npm install global 简介 当我们使用nvm管理node xff0c 切换node版本时 xff0c 安装在全局的npm包无法共用之前node版本中
  • vscode设置命令行启动

    方法一 xff1a 配置 启动 VS Code打开命令面板 shift 43 ctrl 43 P mac shift 43 cmmand 43 P xff0c 输入 shell command xff0c 找到 Install code c
  • Vue和React的生命周期

    最新的Vue和React生命周期 Vue 生命周期 vue生命周期主要有8个 beforeCreatecreatedbeforeMountmountedbeforeUpdateupdatedbeforeDestroydestroyed Re
  • js实现千位分隔符运算

    方法一 xff1a span class token keyword function span span class token function format span span class token punctuation span
  • 调整浏览器滚动条样式

    我们知道浏览器自带滚动条很丑 xff0c 有时影响整个页面到美观 xff0c 尤其在页面内嵌一个滚动列表 xff0c 显得奇丑无比 xff0c 下面我们根据如下代码调节滚动条样式 span class token punctuation s
  • 视觉SLAM理论入门——(7)视觉里程计之特征点法—对极几何

    提取ORB特征后 xff0c 需要根据点估计相机的运动 根据相机的原理 xff0c 可以分为下面几种情况 xff1a 1 当采用单目相机 xff0c 只知道2D像素坐标 xff0c 需要根据两组2D点估计运动 xff0c 这时用对极几何求解
  • 驱动程序之_1_字符设备_13_USB设备_3_鼠标驱动

    驱动程序之 1 字符设备 13 USB设备 3 鼠标驱动 从上一篇文章知道 xff0c 当我们接入一个USB设备 xff0c USB总线驱动会为我们构建一个device并注册 xff0c 编写驱动程序时只需要构造driver并注册到总线即可
  • 【转帖】驱动程序与应用程序之间的通信

    驱动程序必须与应用程序进行通信 xff0c 才能最终达到应用程序控制设备的目的 xff0c 不然驱动有QIU用 要通信就涉及到3个方面 1 应用程序与驱动程序通信 2 驱动程序与应用程序通信 3 数据传输 下面分别讨论 1 应用程序与驱动程
  • STM32最小系统硬件组成详解

    STM32最小系统硬件组成详解 0组成 xff1a 电源 复位 时钟 调试接口 启动 1 电源 xff1a 一般3 3V LDO供电 加多个0 01uf去耦电容 2 复位 xff1a 有三种复位方式 xff1a 上电复位 手动复位 程序自动
  • 从特效入手,深入了解CSS(一):动态加载特效

    不建议跳跃阅读 xff01 这篇文章将从头开始介绍如何实现一个特效 中间偶尔会穿插一些css3或平时接触不多的css属性 首先看一看这一期的特效 xff1a HTML部分 span class token tag span class to
  • Nuxt.js数据预取

    本文采用的技术框架有 xff1a 后台 xff1a Express 43 MongoDb 前台 xff1a Vue2 js 43 Nuxt js 64 2 9 2 在Nuxt中发送请求有两种方案 xff1a 前后台分离的方案 xff08 数
  • 【matplotlib】matplotlib使用详解 使用python绘制漂亮的论文数据图

    预备知识 Matplotlib 是 Python 中最受欢迎的数据可视化软件包之一 xff0c 支持跨平台运行 xff0c 它是 Python 常用的 2D 绘图库 xff0c 同时它也提供了一部分 3D 绘图接口 Matplotlib 通
  • apt-get指令的autoclean,clean,autoremove的区别

    下面总结一下有关apt get的常用但容易混淆的指令 br strong apt get autoclean strong 如果你的硬盘空间不大的话 xff0c 可以定期运行这个程序 xff0c 将已经删除了的软件包的 deb安装文件从硬盘
  • 2021美团笔试题(第十套)个人解答

    1 淘汰分数 span class token comment 暴力解法 span span class token keyword import span span class token namespace java span clas
  • DeepSOCIAL:基于YOLOv4的人群距离监测!集检测、跟踪以及逆透视映射一体的系统!...

    点击下方 AI算法与图像处理 xff0c 一起进步 xff01 重磅干货 xff0c 第一时间送达 论文 xff1a https doi org 10 3390 app10217514 代码 xff1a https github com D
  • HAL 0.5.10 Specification

    HAL 0 5 10 Specification David Zeuthen lt a href david 64 fubar dk a gt Version 0 5 10 Table of Contents 1 Introduction
  • LINUX USB 系统(1) 收藏

    LINUX USB 系统 1 收藏 1 简述 xff1a USB 出自豪门 xff0c 一问世便有 IBM Microsoft compaq 等前呼后拥 xff0c 不红实在是没有道理 xff0c 以致于连三岁小毛孩都知道买游戏手柄要买 U