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从启动到运行相关推荐

  1. USB开发-USB基础知识

    1.一个usb 控制器下最多挂载多少usb 设备? 答:127个,这是由usb数据协议中设备地址位数决定的,地址位总共7bit,其中0地址是用来给未初始化设备使用的. 2.SE0状态是如何定义的? 答 ...

  2. 用WDM开发USB驱动程序

    摘要:本文简单介绍了WDM和USB的一些基本概念,给出了开发USB驱动程序的流程和基本步骤,同时对开发USB设备的接口软件结构和驱动程序作了介绍.最后给出了PC机对USB设备的应用程序实现 关键词:W ...

  3. 用DriverStudio开发USB驱动程序

    很多写Windows Device Driver的开发人员基本上都是使用Windows DDK进行开发的.但是,现在也有不少人都开始借助一些辅助工具.笔者去年开始接触到DriverStudio,发现它 ...

  4. Android USB 开发详解

    Android USB 开发详解 先附上 Android USB 官方文档 Android通过两种模式支持各种 USB 外设和 Android USB 附件(实现Android附件协议的硬件):USB ...

  5. 安卓USB开发教程 四 安卓 AOA

    Android 开放性配件协议(AOA) Android 开放性配件协议(AOA)支持允许外部 USB 硬件(Android USB 配件)与工作在配件模式下的 Android 设备进行交互.当处于配 ...

  6. 【安卓USB开发】让手机与物联网设备鹊桥相会

    安卓USB开发详解 一.前言 1.是什么 2.为什么 3.怎么做 二.简析USB 1.外部总线标准 2.主从结构星型拓扑 3.自.总供电模式 4.OTG 5.数据传输模式 6.小结 三.安卓USB开发 ...

  7. STM32 USB 开发(二)HID Slave 通信 --- 简单上位机开发

    文章目录 前言 一.准备数据 二.在VS中开发上位机 1.引入国外大神写的USB通讯库HidLibary 2.新建HID管理类 CustomHIDManager.cs 3.运行结果 总结 前言 在网上 ...

  8. WDF开发USB设备驱动教程(1)

    PDF下载地址(1.2版):链接地址 CY001开发板讨论帖:链接地址 注:本文档新版本已出,请在博客中查找,或下载PDF全文文档. 链接地址WDF开发USB设备驱动教程 by 张佩 文档说明 作者写 ...

  9. Jetson Nano从USB外部存储设备启动系统

    Jetson Nano量产版配置eMMC只有16GB,如果在eMMC上安装SDK开发环境,容量就所剩无几了,如果可以让系统从USB设备(大容量U盘,移动硬盘)进行启动,满足我们对容量的要求.下面介绍如 ...

最新文章

  1. HOG可视化 opencv
  2. [OpenJudge] 百练2754 八皇后
  3. android左侧固定导航栏,Android使用fragment实现左侧导航
  4. matlab的数学函数,matlab中常见数学函数的使用
  5. C#通用类库--短信猫操作类1(原始AT命令)
  6. Mysql过长的Sql语句优化:在循环中调用存储过程运行动态语句
  7. 《C++ Primer Plus(第六版)》(30)(第十四章 C++中的代码重用 编程题答案)
  8. Ajax请求步骤(十)
  9. 蓝桥杯 ALGO-129 算法训练 特殊的数字四十
  10. 数据驱动的智慧城市 中兴通讯推进“沈阳模式”落地
  11. 数学猜想验证步骤_10大仍未解开的数学难题
  12. Excel小技巧之:如何在表格内插入水印
  13. 数据结构---列表[pf]
  14. C#调用cplex出现引发类型为“ILOG.Concert.Exception”的异常
  15. Leetcode-数据结构-118. 杨辉三角
  16. Python matplotpy颜色表
  17. Linux基础命令-pstree树状显示进程信息
  18. 好用的标签云在线生成工具
  19. (清华毕业生)大佬总结的“大数据”学习路线+教程
  20. 3 亿岗位或被取代?程序员躺枪,多个行业迎来新时代!

热门文章

  1. Selenium自动化测试入门(基于Python)
  2. 【Office文档在线编辑和预览服务搭建】
  3. USACO 4.1.3 篱笆回路 (floyd找最小环)
  4. panda提取时间戳中的日期_《我在时间尽头等你》中的文案,总有一个戳中你的泪点...
  5. Python的strip()函数
  6. QByteArray转换为任意格式/结构体
  7. 【Linux-操作系统】
  8. 一些无线通信系统模型的概念
  9. 计算机听评课会议记录,研修评课议课会议记录
  10. c语言年历显示主要思路,c语言程序设计年历显示分析.doc