USB开发-USB从启动到运行
USB从启动到运行
- 一、从代码运行流程讲USB设备如何被识别的
- 1.OTG设备作为HOST是如何识别插入的usb 设备
- 2.JK信号识别
- 3.枚举
- 二、代码实现流程图
- 1.主流程图
- 2.中断
序:最近在调USB驱动,使用的控制器是Candence USB2.0 High speed Contrller,这是一个支持otg的控制器,有感于usb庞大的知识体系,给同样入坑的同学一点启发,USB在处理细节上会由于硬件和操作系统的不同,但是其大体的流程是一致的。个人水平有限,难免有错欢迎拍砖交流,内容随心情更新…
时间有限,这里不会涉及到一些基础概念的讲解。
知识点1:一个支持otg的usb控制器端做host还是device除了软件支持外,是由ID线决定的 (当然一个支持otg的控制器硬件上必然存在ID线,但是有没有引出来就是硬件设计的问题了)。前提,你要清楚的是你的usb控制器是不是支持otg或者是单host还是单device控制器,没有确认这个,你单纯看外接的usb 连接器类型确认控制器端是做host还是device是错误的。
知识点2:otg设备ID线一般默认条件下ID为高,也就是自身默认是一个device的状态。
举个例子:电脑usb均为只是TYPE A座不存在ID线,一般我们理解只做host端,但是其内部usb controller可能也支持otg,只是强制只做host了,这里的强制指的是比如其ID线内部强制拉低。
type c口手机,存在ID线,当手机接电脑时(准确的说是手机通过外接type c转 type usb A公头接电脑),电脑端不存在ID线,双方依据ID线状态决定了手机为device,电脑为host。
而u盘插入手机(准确的说是u盘通过将存在ID线且为低电平的转接线接入手机type c座),由于手机端id线拉低,故手机知道自己做host,识别u盘。
知识点3(这个我不确定,希望没误导!):otg设备识别自身是host还是device,一旦连接建立(这里说的是硬件连线不断开),就一直是该身份,除非拔了线重新插了ID线反状态其身份才可能发生改变。
一、从代码运行流程讲USB设备如何被识别的
硬件上为了支持作为host,板子是通过mini AB座外接一根mini usb OTG数据线实现的。
下图1和图2 是usb2.0 OTG状态机转换图,其中的id表示usb的ID线,Vbus即usb的电源供电。这个图不着急你立马能看懂,OTG状态机是一个硬件寄存器,其状态是自动切换的。部分讲解中的概念这里说明下:
复位信号:usb的复位是指D+和D-信号线处于拉低的状态。
mini usb OTG数据线:其实就是mini usb B头转TYPE A USB座,但是其内部ID线与GND线进行了短接,所以当该线接入mini usb 座后,ID线会被拉低从而可以做host。
图-1
图-2
1.OTG设备作为HOST是如何识别插入的usb 设备
1)程序上电运行 ->使能 otg中断和复位中断(注:otg中断是由于状态机的改变而出发的一些中断,而复位中断对于host模式下是当复位结束后产生的中断),由于状态机默认是A_ILDE,上电后ID线在未接入设备一般是上拉状态,所以一旦程序运行,是一个B_ILDE或B_XXX的状态。
2)插入usb设备,这里以U盘为例,usb控制器ID线(phy的ID线)被拉低,因为B_ILDE->A_ILDE状态机的改变而触发otg空闲中断,在该中断中对vbus进行上电。
3)vbus上电后,U盘设备供电,那么U盘的D+或D-其中一根上拉电平会使得D+或D-其中一根高电平,这就是识别usb设备是full还是low设备的检测机制。状态机会因此进入A_HOST状态并触发A_HOST中断。状态机进入A_HOST后usb控制器会自动发送复位信号,也就是拉低D+/D-,不同控制器持续时间不同和,比如这个控制器默认复位时间为55ms。
4)复位期间通过JK信号检测,确认usb设备是FULL speed还是HIGH speed设备,将识别的设备speed类型更新到speed ctrl寄存器。
5)复位结束后,host会触发复位(完成)中断 //复位后的设备地址为0,因此之后host通过地址0与设备通信
6)接下来就是枚举过程了,具体的枚举过程后面讲。
所以简而言之,从程序运行,到执行复位的流程就是:程序运行,还能中断->插入设备,触发空闲中断,Vbus上电->上电后D+/D-触发状态机切换->引起复位->枚举->设备识别可用
我们不能忽视一种情况,就是也许设备在程序运行前就已经插着了,就像U盘电脑没上电前就插着这种情况,程序的执行逻辑是:
程序上电运行->检测是否是A_ILDE状态(ID线默认是高,A_ILDE表面插入了设备拉低了ID),如果是,Vbus供电->使能 otg中断和复位中断。->3)->4)->5)。所以实际的代码逻辑在1)使能 otg中断和复位中断前有状态机的判断。
2.JK信号识别
这是控制器与设备之间通过JK信号确认设备是FULL还是HIghspeed的过程,有空再写这个,待续
3.枚举
枚举过程简单而言就是初始化设备的一个过程,枚举是通过端点0控制传输方式通信的,经过枚举后该设备才真正起效。
1)host发送获取设备描述符。
//在设置device地址之前,有的控制器可能会再次复位设备(可选)
2)host设置设备地址(在此之前是用广播地址0通信) //具体设置设备地址流程是:首先host发送设置设备地址指令、地址(数据过程),设备返回ACK;然后host会发送IN请求device输入,直到device返回一个空数据域的数据包,然后host返回ACK后,当device收到这个ACK,device才真正开始启用新的设备地址。注意这里的IN过程是必须的,是host与device间确认新的地址是否起效的过程。
3)host使用新的设备地址获取设备描述符(以后都使用该设备地址通信),可获得配置描述符个数。
4)获取第i个配置描述符(获取数据长度9字节),配置描述符含有该配置下的配置、接口、端点描述符的总长度
5)获取第i个配置描述符(长度为包含该配置、接口、端点描述符的总长度)
//注:如果有多个配置描述符,循环4)->5)直到获取完
6)获取idproduct索引字符串描述符
7)获取idpmanufacturer索引字符串描述符
8)获取idserial numbert索引字符串描述符
9)设置配置描述符(也就是启用某个配置,因为可能多个配置)
设置完配置描述符,枚举过程结束,通用类usb设备设置识别完成。(当设置完配置描述符后,非0端点才开始可以启用)
//这里没有说SOF包,SOF包是控制器复位完成后1ms后,host自动每ms(FULL speed)或125us(HIGH speed)发送的令牌包,没有应答。所以枚举期间会看到该包,所以这个包并不属于枚举的某个必然过程,并且SOF包是广播包,所有设备都可以收到。
至于再具体的分类,比如是U盘还是HID设备等等,会在该枚举后,遵循对应类型的具体协议再通过控制传输方式获取具体信息后,对应的设备才真正算可以用了。
下面是逻辑分析仪抓到的usb 控制包:
1)获取设备描述符
2)设置设备地址
3)使用设备地址获取设备描述符
4)获取配置描述符(获取数据长度9字节)
5)获取配置描述符
6)获取idproduct索引字符串描述符
7)获取idpmanufacturer索引字符串描述符
8)获取idserial numbert索引字符串描述符
9)设置配置描述符
后续:具体分类,比如u盘设备接下来会根据BULK-ONLY协议发送GET MAX LUN等具体类请求,在应用处理上使用在BULK-ONLY协议基础上SCSI协议实现U盘数据的读写 。针对HID类设备根据该类具体协议操作,就要再研究具体类的实现了。
另外,文章写的主要是host模式,device模式的软件流程很好理解,因为usb流程都是host发起的,device只是被动接受。
二、代码实现流程图
这里的控制器是使用DMA进行数据传输的,当然不使用DMA也是可以的,主要该usb控制器内部集成了DMA控制器。DMA的作用毕竟在大数据传输时体现其高效性,不用白不用。
1.主流程图
cusbhUsbhDeviceAdd()接口实现对通用设备的枚举:
2.中断
这里的usb主要使用了otg中断和DMA中断来逻辑处理:
USB开发-USB从启动到运行相关推荐
- USB开发-USB基础知识
1.一个usb 控制器下最多挂载多少usb 设备? 答:127个,这是由usb数据协议中设备地址位数决定的,地址位总共7bit,其中0地址是用来给未初始化设备使用的. 2.SE0状态是如何定义的? 答 ...
- 用WDM开发USB驱动程序
摘要:本文简单介绍了WDM和USB的一些基本概念,给出了开发USB驱动程序的流程和基本步骤,同时对开发USB设备的接口软件结构和驱动程序作了介绍.最后给出了PC机对USB设备的应用程序实现 关键词:W ...
- 用DriverStudio开发USB驱动程序
很多写Windows Device Driver的开发人员基本上都是使用Windows DDK进行开发的.但是,现在也有不少人都开始借助一些辅助工具.笔者去年开始接触到DriverStudio,发现它 ...
- Android USB 开发详解
Android USB 开发详解 先附上 Android USB 官方文档 Android通过两种模式支持各种 USB 外设和 Android USB 附件(实现Android附件协议的硬件):USB ...
- 安卓USB开发教程 四 安卓 AOA
Android 开放性配件协议(AOA) Android 开放性配件协议(AOA)支持允许外部 USB 硬件(Android USB 配件)与工作在配件模式下的 Android 设备进行交互.当处于配 ...
- 【安卓USB开发】让手机与物联网设备鹊桥相会
安卓USB开发详解 一.前言 1.是什么 2.为什么 3.怎么做 二.简析USB 1.外部总线标准 2.主从结构星型拓扑 3.自.总供电模式 4.OTG 5.数据传输模式 6.小结 三.安卓USB开发 ...
- STM32 USB 开发(二)HID Slave 通信 --- 简单上位机开发
文章目录 前言 一.准备数据 二.在VS中开发上位机 1.引入国外大神写的USB通讯库HidLibary 2.新建HID管理类 CustomHIDManager.cs 3.运行结果 总结 前言 在网上 ...
- WDF开发USB设备驱动教程(1)
PDF下载地址(1.2版):链接地址 CY001开发板讨论帖:链接地址 注:本文档新版本已出,请在博客中查找,或下载PDF全文文档. 链接地址WDF开发USB设备驱动教程 by 张佩 文档说明 作者写 ...
- Jetson Nano从USB外部存储设备启动系统
Jetson Nano量产版配置eMMC只有16GB,如果在eMMC上安装SDK开发环境,容量就所剩无几了,如果可以让系统从USB设备(大容量U盘,移动硬盘)进行启动,满足我们对容量的要求.下面介绍如 ...
最新文章
- HOG可视化 opencv
- [OpenJudge] 百练2754 八皇后
- android左侧固定导航栏,Android使用fragment实现左侧导航
- matlab的数学函数,matlab中常见数学函数的使用
- C#通用类库--短信猫操作类1(原始AT命令)
- Mysql过长的Sql语句优化:在循环中调用存储过程运行动态语句
- 《C++ Primer Plus(第六版)》(30)(第十四章 C++中的代码重用 编程题答案)
- Ajax请求步骤(十)
- 蓝桥杯 ALGO-129 算法训练 特殊的数字四十
- 数据驱动的智慧城市 中兴通讯推进“沈阳模式”落地
- 数学猜想验证步骤_10大仍未解开的数学难题
- Excel小技巧之:如何在表格内插入水印
- 数据结构---列表[pf]
- C#调用cplex出现引发类型为“ILOG.Concert.Exception”的异常
- Leetcode-数据结构-118. 杨辉三角
- Python matplotpy颜色表
- Linux基础命令-pstree树状显示进程信息
- 好用的标签云在线生成工具
- (清华毕业生)大佬总结的“大数据”学习路线+教程
- 3 亿岗位或被取代?程序员躺枪,多个行业迎来新时代!
热门文章
- Selenium自动化测试入门(基于Python)
- 【Office文档在线编辑和预览服务搭建】
- USACO 4.1.3 篱笆回路 (floyd找最小环)
- panda提取时间戳中的日期_《我在时间尽头等你》中的文案,总有一个戳中你的泪点...
- Python的strip()函数
- QByteArray转换为任意格式/结构体
- 【Linux-操作系统】
- 一些无线通信系统模型的概念
- 计算机听评课会议记录,研修评课议课会议记录
- c语言年历显示主要思路,c语言程序设计年历显示分析.doc