一、简介

OTG是On-The-Go的缩写。其设计的初衷是为了两个“外设”在没有PC(Host)的情况下,也可以通过USB进行数据传输。可以理解为,拥有OTG功能的USB设备(OTG设备)既可以做host,也可以做peripheral。

二、OTG基本结构

2.1 OTG硬件结构

一个完整的OTG连接由A-device和B-device组成。A设备(Micro-A)默认作为Host并供电,B设备(Micro-B)默认作为peripheral,B设备可以通过HNP协议进行协商,使自己成为Host。

OTG比普通USB接口多了一条USB_OTG_ID连线。Micro-A插座的USB_OTG_ID接地,而Micro-B插座的USB_OTG_ID悬空。如图所示。

2.2 OTG连接方式

2.2.1 OTG设备和host连接

在这种情况下,OTG设备和PC或嵌入式主机连接。此时,OTG设备满足标准USB外设的所有要求。当OTG设备连接到PC或嵌入式主机时,主机枚举OTG设备并将其视为外围设备。

2.2.2 OTG设备和peripheral连接

在这种情况下, OTG设备作host(A-Device),外接一个peripheral设备(B-Device)。当OTG设备检测到设备已连接时,OTG设备枚举peripheral设备.

2.2.3 OTG设备和OTG设备连接

在这种情况下,默认host(A-Device)首先枚举peripheral(B-Device)。然后user可以控制选择A-Device或B-Device哪个作host。比如,连接carplay时,iphone为B-Device作host;而A-Device需将状态切花挪威peripheral。

2.3 OTG支持协议

OTG支持HNP协议,SRP协议。

2.3.1 HNP协议

HNP(即主机协商协议),实现在不调换Micro-A和Micro-B插座的情况下,Host和Peripheral两种角色在A-Device和B-Device上相互切换;

无论A-device扮演host还是peripheral角色,均由A-device向USB接口供电;

系统初始化,应将A-device默认设置为host。当B设备写入b_bus_req,向A设备发起HNP请求。待A设备响应之后,A设备发送a_set_b_hnp_en,B设备响应之后即进入主机状态,同时发送请求使用A设备set_device,这样A、B设备完成主从交换。

2.3.2 SRP协议

A-device在总线空闲时关闭总线。当一个B-device想要工作时,可向A-device请求开启总线。

A-Device时序图如下

B-Device时序图如下

三、OTG状态机

3.1 OTG状态机状态简介

OTG-A-device状态迁移图如图所示。

OTG-B-device状态迁移图如图所示。

以A-Device为例,主要otg_machine_status如下表所示。

a_idle

A-device starting state

a_wait_vrise

Wait for VBUS to go into regulation

a_wait_bcon

Wait for B-device to signal connection

a_host

Acting as a host

a_suspend

Bus suspend

a_peripheral

Acting as a peripheral

a_wait_vfall

Wait for VBUS to drop to VOTG_VBUS_LKG

a_vbus_err

Wait for recovery from over-current condition

状态机主要输入状态

★id :A-Device为0,否则是B-Device为1。

The identification (id) input is FALSE when a Micro-A plug is inserted in the device’s Micro-AB receptacle. Otherwise, this input is TRUE.

★a_bus_drop :A-Device放弃总线时为1,此时a_bus_req必须为0。

The “A-device bus drop” (a_bus_drop) input is TRUE when the Application running on the A-device wants to power down the bus, and is FALSE otherwise. When this input is TRUE, then the a_bus_req input shall be FALSE.

★a_bus_req   :A-Device申请总线时为1。

The “A-device bus request” (a_bus_req) input is TRUE during the time that the Application running on the A-device wants to use the bus, and is FALSE when the Application no longer wants to use the bus. a_bus_req can also be set to TRUE in response to remote wakeup signaling from the B-device should the A-device decide to resume the bus.

……

3.2 OTG状态机切换流程(A-Device

★启动时,状态机的正确切换流程如下:

(START)->(a_idle)->(a_wait_vrise)->(a_wait_bcon)

★连接仅peripheral的B-Device,状态机的正确切换流程如下:

(a_wait_bcon)->(a_host)

拔出仅peripheral的B-Device,状态机的正确切换流程如下:

(a_host)->(a_wait_bcon)

★插入OTG B-Device,状态机的正确切换流程如下(A-Device为peripheral):

(a_wait_bcon)->(a_host)->(a_suspend)->(a_peripheral)

拔出OTG B-Device,状态机的正确切换流程如下:

(a_peripheral)->(a_wait_bcon)

四、代码分析

OTG代码主要分为硬件层,驱动层和功能层。

硬件层主要source文件:udc.c, host.c

驱动层主要source文件:core.c

功能层主要source文件:otg.c, otg_fsm.c, usb-otg-fsm.c

OTG注册流程图如下

OTG中断处理流程图如下

SRP协议流程图如下

HNP协议流程图如下

附录

SRP

In order to conserve power, an A-device is allowed to leave VBUS turned off when the bus is not being used. The Session Request Protocol (SRP) allows a B-device to request the A-device to turn on the power supply to the USB interface (VBUS) and start a session. A session is defined as the period of time that VBUS is powered. The session ends when VBUS is no longer powered.

HNP

The Host Negotiation Protocol (HNP) allows the host function to be transferred between two directly connected OTG devices and eliminates the need for a user to switch the cable connections in order to allow a change in control of communications between the devices. HNP will typically be initiated in response to input from the user or an Application on the OTG B-device. HNP may only be implemented through the Micro-AB receptacle on a device. The A-device is always responsible for powering the USB interface regardless of whether it is acting in host or peripheral role3.

At the start of a session, the A-device defaults to having the role of host. During a session, the role of host can be transferred back and forth between the A-device and the B-device any number of times, using HNP.

小明哥学linux驱动之USB-OTG(基于gadget框架)相关推荐

  1. 跟着鸟哥学Linux系列笔记1

    跟着鸟哥学Linux系列笔记0-扫盲之概念 跟着鸟哥学Linux系列笔记0-如何解决问题 装完linux之后,接下来一步就是进行相关命令的学习了 第五章:首次登录与在线求助man page 1. X ...

  2. 十五、Linux驱动之USB鼠标驱动

    1. 如何编写USB鼠标驱动 结合十四.Linux驱动之USB驱动分析中的分析,我们开始写一个USB鼠标驱动.      USB的驱动可以分为3类:SoC的USB控制器的驱动,主机端USB设备的驱动, ...

  3. 嵌入式Linux驱动笔记(十八)------浅析V4L2框架之ioctl【转】

    转自:https://blog.csdn.net/Guet_Kite/article/details/78574781 权声明:本文为 风筝 博主原创文章,未经博主允许不得转载!!!!!!谢谢合作 h ...

  4. 【linux驱动】USB子系统分析

    本文针对Linux内核下USB子系统进行分析,主要会涉及一下几个方面: USB基础知识:介绍USB设备相关的基础知识 Linux USB子系统分析:分析USB系统框架,USB HCD/ROOT HUB ...

  5. Linux驱动学习--USB接口wifi/BT芯片开发之BT开发(BlueDroid框架)

    目录 一.引言 二.整体框架分析(结合实际芯片分析) 三.内核中的相关配置 四.厂家驱动分析 五.蓝牙BlueDroid协议 一.引言 之前我们简单分析过BlueDroid框架,今天来结合源码,挑重点 ...

  6. 跟着鸟哥学linux【一】

    今天开始跟着鸟哥学习linux了,这组博客将会成为我跟着鸟哥学习linux的笔记和心得. 虚拟机这个东西之前已经接触过了,环境也配置好了. ctrl+alt+(f1-f9)是切换不同的tty,什么是t ...

  7. arm裸机与嵌入式linux驱动开发,如何编写基于ARM的裸机程序和基于Linux的驱动程序?...

    在嵌入式开发中,ADC应用比较频繁,本文主要讲解ADC的基本原理以及如何编写基于ARM的裸机程序和基于Linux的驱动程序. ARM架构:Cortex-A9Linux内核:3.14 在讲述ADC之前, ...

  8. 第16章 USB主机、设备与Gadget驱动之USB UDC与Gadget驱动(一)

    16.4.1 UDC(USB设备控制器)和Gadget(小配件)驱动的关键数据结构与API USB设备控制器(UDC)驱动指的是作为其他USB主机控制器外设的USB硬件设备上底层硬件控制器的驱动,该硬 ...

  9. linux驱动由浅入深系列:基于高通平台分析触摸屏(TP)、虚拟按键驱动

    触摸屏的触摸板(touch panel简称TP)驱动的基本架构和普通按键驱动基本一致,可以参考文章: linux驱动由浅入深系列:输入子系统之二(编写一个gpio_key驱动).只是其功能稍稍复杂些, ...

最新文章

  1. 刚学计算机先学什么好,计算机语言入门先学什么?
  2. mysql初始化很慢_mysql初始化报错
  3. update 千万数据_mysql学习(四)数据库
  4. 查找算法——折半查找(JAVA)
  5. 传感器工作原理_荧光氧气传感器工作原理简介
  6. 原创:DELPHI7下动态生成DBCHART,可结合上篇博文,动态生成整个CHART图
  7. 原生JS实现各种经典网页特效——Banner图滚动、选项卡切换、广告弹窗等
  8. 大数据的4v特征及思考_大数据智能下数据脱敏的思考
  9. 一款可视化低代码编程平台开源了!
  10. 列举对比【智能建站 自主建站 DIY建站 傻瓜式建站 响应式建站系统哪个好?】
  11. 2019全国大学生电子设计大赛-F题纸张计数
  12. RPG或SLG游戏在线地图编辑器
  13. 罗振宇解读《今日简史》:21个议题就是21个千亿美金的机会
  14. js+json实现哔哩哔哩番剧时间表
  15. 2022新版PMP考试有哪些变化?
  16. Typora+Gitee打造个人云笔记
  17. 间隔层设备和过程层简介
  18. 如何通过文档管理控制合同管理
  19. 小米公司2021秋招面试题目整理
  20. 数值分析-多项式插值方法小结

热门文章

  1. java mp4_java返回mp4
  2. 巨蟹本质-绝种好男人
  3. Codeforces Round #644 (Div. 3) G.A/B Matrix
  4. JavaScript——遍历函数
  5. 计算机网络中的网桥,一个动画看懂网络原理之网桥的工作原理
  6. ios 7 完美越狱总结
  7. 2021年副高考试成绩查询兵团,2021兵团公务员成绩排名查询系统入口
  8. matlab 将图片遮罩处理,matlab - 如何使用交互式网格在matlab上遮罩图像? - 堆栈内存溢出...
  9. 敏捷个人2013.06月份户外活动报道:奥森健步读书分享会
  10. 云之海服务器无限试炼指令,小鸡可掉落神秘物品?!只有1/100人才有的奇遇!...