LINUX下USB1.1设备学习小记(3)_host与device

开发者福利!热门AI工具限时免费用 购周边即赠Coding Plan Lite,Claude Code、Cursor等20+工具畅享,效率翻倍! 阅读详情
 
LINUX下USB1.1设备学习小记(3)_host与device
 
 
 
各位还记得”任何传输都是由host发起的”这句话么~
在usb设备插入pc中到拔出usb设备,都是由host进行询问的
一个usb鼠标的工作流程可以表达如下:
usb鼠标插入pc中:
主机询问设备:给我你的设备信息(控制传输)
主机根据usb鼠标的设备信息进行驱动配置,配置结束后
主机询问设备:给我你的数据信息(中断传输)
一定的时间间隔之后....
主机询问设备:给我你的数据信息(中断传输)
一定的时间间隔之后...
主机询问设备:给我你的数据信息(中断传输)
.................
直到这个设备被拔出,主机不断要求设备提供鼠标的按键和移动数据
 
因为任何传输都是由host发起的,所以host是我解析的第一对象,而UHCI这个host是我将介绍的对象,目前PC上有3类主机控制器,分别为UHCI,OHCI和EHCI
UHCI和OHCI是低速和全速USB设备的主机控制器,所有高速设备都是EHCI这个主机控制器管理的
为什么选择UHCI而不是OHCI呢~ 很简单,因为我是参考fudan_abc的BLOG进行解析的,他写的是关于UHCI的,呢么我只有写UHCI的,因为很多技术规范只有UHCI的生产商英特尔才知道,包括他的BUG
下面我先简短的介绍一下UHCI
UHCI全称Universal Host Controller Interface,也就是通用主机控制器接口,他的一个重要责任就是发送USB通信中最关键的令牌包,下面我们就看看他是怎么发送令牌包的
在UHCI的软件控制中,最小的处理为一个叫Transfer Descriptor的结构,这个结构为16字节

黄色区域表示主机控制器硬件可以读写的,白色表示主机控制器硬件只能读,不能写
所有字段都能由主机控制器驱动,也就是软件来写
td的这4个字段从上倒下分别为连接字段,控制字段,令牌字段和缓冲字段
呢么这个TD完成一个什么样的功能呢?~
很可惜,从软件上看,这个TD负责完成一个事务的传输,也就是令牌包,数据包和握手包这3个包的传输都由TD来描述,所以单独令牌包的发送是硬件自动完成的,软件是参与不到的,所以我们只能从一个控制传输来看看UHCI是如何完成事务传输的
不过在这之前还需要介绍1个知识,Frame List
Frame List是一个由1024个Frame组成的帧列表,干嘛用呢?~很简单,所有的td都是挂载在Frame上的,然后UHCI分配给每帧1ms的时间做传输,执行Frame上的td队列,
1ms到期后就处理下一帧的td队列
现在我们假定设备的地址为20,使用0号端点,发送一个setup事务,任务为取得大小为18字节的设备描述符
这个setup事务使用一个setup事务,数据阶段使用一个in事务,状态阶段使用一个out事务, 好,现在开始构建td队列

第一个事务为setup事务
1. 首先填充 td令牌字段中的pid字段,setup事务中的令牌包为setup包,setup包的pid为1101,pid效验为0010,则pid字段为0x2D
2. 填充td令牌字段中的地址字段,这里我们使用的地址为20,则填充0x14
3. 填充td令牌字段中的端点字段,这里我们使用的端点为0,则填充0x0
4. 填充td令牌字段中的数据长度字段,setup事务中data的数据大小为8字节,则填充0x8
5. 填充td令牌字段中的数据包类型字段,setup默认为0,这里填充为0
6. 填充td的缓冲字段,这个缓冲字段是一个指针,指向一个DMA地址,UHCI硬件根据事务是写还是读来直接读写这个地址上的数据,不需要CPU的参与,假设我已经为8字节的数据申请了一个DMA地址,为0xFFFF,则填充0xFFFF到缓冲字段
7. 填充td的连接字段,因为还有一个数据阶段的in事务和状态阶段的out事务,这里连接数据阶段的in事务所使用的td地址

第二个事务为数据阶段的in事务
1. 首先填充首先填充 td令牌字段中的pid字段,in事务中的令牌包为in包,in包的pid为1001,pid效验为0110,则pid字段为0x69
2. 填充td令牌字段中的地址字段,这里我们使用的地址为20,则填充0x14
3. 填充td令牌字段中的端点字段,这里我们使用的端点为0,则填充0x0
4. 填充td令牌字段中的数据长度字段,我们所需要的设备描述符的大小为18字节,则这里填写为0x12
5. 填充td令牌字段中的数据包类型字段,因为这是第一个数据包,第一个数据包所使用的类型为data1,这里填充为1
6. 填充td的缓冲字段,这个缓冲字段是一个指针,指向一个DMA地址,UHCI硬件根据事务是写还是读来直接读写这个地址上的数据,不需要CPU的参与,假设我已经为18字节的数据申请了一个DMA地址,为0xCCCC,则填充0xCCCC到缓冲字段
7. 填充td的连接字段,因为还有一个状态阶段的out事务,这里连接状态阶段out事务所使用的td地址

第三个事务为状态阶段所使用的out事务
1. 首先填充首先填充 td令牌字段中的pid字段,out事务中的令牌包为out包,out包的pid为0001,pid效验为1110,则pid字段为0xE1
2. 填充td令牌字段中的地址字段,这里我们使用的地址为20,则填充0x14
3. 填充td令牌字段中的端点字段,这里我们使用的端点为0,则填充0x0
4. 填充td令牌字段中的数据长度字段,状态阶段的数据包中的数据长度为0,这里填充为0x0
5. 填充td令牌字段中的数据包类型字段,因为这是状态阶段的数据包,规定使用的数据包类型为data1,这里填充为1
6. 填充td的缓冲字段,因为该数据包的数据为0,这里填充0
7. 填充td的连接字段,因为后面没有事务了,这里填充停止标志
现在把这3个事务连接到帧上,
形成下图

UHCI如何进行操作呢?~  我形象的比喻一下
1号td(setup事务)-setup阶段
1. 主机:我发setup包了,等一下我还要发个数据包
2. 主机:我发数据包了
3. 设备:我收到了
2号td(in事务)-数据阶段
1:主机:我发in包了,你给我返还一个数据包
2:设备:我发数据包了
3:主机:我收到了
3号td(out事务)-状态阶段
1. 主机:我发out包了,等一下我还要发个数据包
2. 主机:我发数据包了
3. 设备:我收到了
这样,一个控制传输就完成了
是不是觉得很简单呢?~
其实USB真正复杂的地方在于休眠和恢复,这些都是由主机控制器来完成的,平时USB驱动程序是不会接触到的,但在之后的UHCI在LINUX中的驱动中我将尽自己的能力分析,毕竟我的数模电路基础几乎为0,大家多包涵 = 3=

了解了主机端,我们再看看设备端,设备端的工作相对较少,为什么呢?看看前面控制传输的图,可以发现,所有的事务的第一个包都是黄色的,也就是都是由主机发送的,设备所要发送的包类型只有两种,数据包和握手包,处理流程如下
在PDIUSBD12中,应答包是由硬件自动判断的,剩下给软件编程人员的就只剩根据令牌包是否发数据包的权利了,真是悲惨啊~
 
 
 
= 3= 转载请注明转自个人BLOG http://blog.chinaunix.net/u1/57901/
OTG -- STM32F407 OTG ID/VBUS/SOF引脚说明(四) STM32F407 OTG ID/VBUS/SOF引脚说明 阅读详情

相关推荐

USB hostusb deviceUSB OTG的判断

USB hostusb deviceUSB OTG的判断经典博客 经典博客 OTG数据线普通USB数据线有什么区别? https://www.jb51.net/shouji/332556.html USB OTG简介、普通USB线的区别 https://blog.csdn.net/mao0514/article/details/46345861 linux usb驱动——hostdev...

卓越之路 4万+

USB host枚举设备的过程

USB host枚举设备的过程 整理自网络     USB主机在检测到USB设备插入以后,就会对USB设备进行枚举了。枚举就是从设备中读到一些信息,知道设备是什么样的设备,如何进行通信,这样主机就可以根据这些信息加载合适的驱动程序。      首先说说USB的一种传输方式----控制传输。这种传输方式在USB中非常重要。他要保证数据的正确性,在设备的枚举过程中都是使用控制

SDU的专栏 4139

从勒索软件攻击到数据重生:SQL Server MDF文件修复的实战生存指南

本文详细介绍了SQL Server MDF文件在遭遇勒索软件攻击后的修复策略,重点解析了Recovery Toolbox工具链的应用流程。从灾难评估到数据验证,提供分阶段修复操作、高级修复技术及防御加固方案,帮助企业快速恢复数据库并提升安全防护能力。

weixin_28327051的博客 694

新的usb设备和驱动的匹配()

新的usb设备的总线是usb_bus_type,类型是usb_device_type。根据前面root hub设备device和driver的匹配可知,这里的probe函数还是调用的generic_probe。 跟root hub usb设备和驱动的匹配走的流程是一样的: 先选择一个合适的配置,然后调用usb_set_configuration函数去设置; 根据configured可以知道有多少...

Frake的博客 2129

Usb设备被识别流程

Usb设备被识别流程 Usb模块包括usb core,host,hub,device驱动,其中hub会启动一个内核线程名曰:khubd(hub_events一直在查询(hub使用的是中断传输)), 当usb 设备连接在 hub 的某个端口上,hub检测到有设备连接了进来,hub会去调用hub_port_status函数去获取hub端口状态,要是真有设备了,会调用hub_port_connect_

erin45的专栏 763

host 端口_驱动分析之USB(一)的HOSTDEVICE

USB硬件建立连接一般usb有4根线(Vbus 、D+、D- 、GND),数据的D+,D-,供电的Vbus和GND。我们需要知道在集线器的端口上(比如电脑的usb)分别接了一个15K欧姆的下拉电阻到地。usb host端:在集线器的端口悬空时,就被这两个下拉电阻拉到了低电平。usb device端:在D+或者D-上接了1.5K欧姆上拉电阻。(对于全速和高速设备, 上拉电阻是接在D...

weixin_39895684的博客 7507

linux读写usb host,LINUXUSB1.1设备学习小记(3)_hostdevice

各位还记得”任何传输都是由host发起的”这句话么~在usb设备插入pc中到拔出usb设备,都是由host进行询问的一个usb鼠标的工作流程可以表达如下:usb鼠标插入pc中:主机询问设备:给我你的设备信息(控制传输)主机根据usb鼠标的设备信息进行驱动配置,配置结束后主机询问设备:给我你的数据信息(中断传输)一定的时间间隔之后....主机询问设备:给我你的数据信息(中断传输)一定的时间间隔之后....

weixin_29623481的博客 467

s3c2440 devices usb改为host usb 小记

将arm板上的usb设备端改为主设备端: 修改linux-2.6.18.2/drivers/usb/host/Kconfig,末尾添加: /********************add begin************************/ ........ config MAX_ROOT_PORTS     int "Maximum port(s) of RootHub"

zhjixi495的专栏 1008

USB deviceUSB host

USB,英文全称:Universal Serial Bus,即通用串行总线。 常常各种USB芯片同时具有hostdevice两种接口。host就是主的,可以起控制作用;device(slave)就是从,是被控制的。比如PC机的USB口,可以识别U盘或者其他USB设备,起到控制的作用,就是host;而U盘是被控制的,是device(slave)。 只有一个host和一个device(s

u013385925的专栏 1万+

Android实战技巧之四十九:Usb通信之USB Host

USB背景知识USB是一种数据通信方式,也是一种数据总线,而且是最复杂的总线之一。 硬件上,它是用插头连接。一边是公头(plug),一边是母头(receptacle)。例如,PC上的插座就是母头,USB设备使用公头PC连接。 目前USB硬件接口分三种,普通PC上使用的叫Type;原来诺基亚功能机时代的接口为Mini USB;目前Android手机使用的Micro USBHost USB

懒人的技术笔记 5万+

Camera | 2.MIPI、CSI基础

上一篇我们讲解了camera的一些基础概念和知识。我们说了,现在的手机由于高分辨率的要求,现在基本上都是基于MIPI、CSI协议来实现的,本篇讲解MIPI、CSI的一些基础知识。

一口Linux的专栏 1万+

usb 协议简述

原文链接:https://docs.google.com/document/d/1EEPLoyupLXS5vCMVo1E9iZbsxmYarQ79EhDxKsMVsak/edit 2008-5-3   USB,几乎天天在用,俺多普达的水货手机,就是USB的数据线,同时兼作充电, 所以有电脑的地方就有能源..暂时以UHCI为例:Universal Ho

云醉月-楚狼 2959

335x系列平台-usb的模式切换HOST和OTG

实验板子:飞凌FET335xD uboot版本:2011.09 linux内核版本:linux3.2 cpu:Ti的3354 操作系统:linux3.2 文件系统:ubi 335xd平台,默认usb0用作OTG,usb1用作HOST 修改时只需要修改mode模式,低四位控制usb0的模式,高四位控制usb1的模式 例如配置两路usb都用做usb_host ...

一个分享工作中用到的实际内容的博客 1139

2440/2410上将usb device改成usb host

2009-08-11 16:35 之前的开发,要在2440上使用两个usb host口,一个接摄像头,一个接无线网卡。但友善之臂mini2440板子只有一个usb host口,曾想通过外接一个usb hub来解决,无线网卡接hub没有问题,但是摄像头插到hub上总是有错误:           usb 1-1: reset full speed USB device usi

kerson的专栏 6989

linux 切换usb,一种LinuxUSB设备主从切换实现.doc

一种LinuxUSB设备主从切换实现一种LinuxUSB设备主从切换实现   摘 要 USB协议是严格的主从协议,通讯过程中必须有一个做Host,一个做Device。本文阐述了一种在Linux下实现USB HostDevice身份切换的方法。【关键词】USB OTG Host Device1 引言USB协议是严格的主从协议,通讯过程中规定通讯双方必须有一个做Host(比如PC),一个做Dev...

weixin_29151301的博客 1297

USB device/host的实现

随笔记录一些常见知识。 介绍device host USB的实现方案探讨

swithin_he的博客 2231

linux配置usb主从_一种LinuxUSB设备主从切换的实现-2019年文档

一种LinuxUSB设备主从切换的实现1引言USB协议是严格的主从协议,通讯过程中规定通讯双方必须有一个做Host(比如PC),一个做Device(比如U盘)。但是有些设备可能会希望同时具有两种身份,在某个时刻做Host,另外一个时刻做Device,于是USBIF官方制定了OTG协议,规定两个都支持OTG协议的USB设备可以动态地根据需要进行主从切换。但是真正支持OTG协议的设备并没有流行起来...

weixin_31741827的博客 640

MIPI CSI-2笔记(1) -- CSI-2概览和CSI-2的分层架构

这是MIPI CSI-2规范笔记的第一篇笔记。虽然网上有很多CSI-2的文章,但是总觉得太散。于是有了开这个系列的想法,主要是总结学习MIPI CSI-2规范的相关知识,系统地学习一下。

vivo01的专栏 5720
上一篇: LINUX下USB1.1设备学习小记(2)_协议
下一篇: USB控制传输过程 详细解析
ling1874
博客等级 码龄18年 126粉丝 48原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值