USB On-The-Go引脚 说明

USB On-The-Go 是什么

    USB 接口的设备现在是随处可见了,打印机、相机、手机、MP3等几乎目前能想到的消费类电子设备都具有 USB接口。USB传输速率快,接口简单、支持热插拔的特性,使其在诸多接口中脱颖而出,大有统一天下之势。但传统的USB协议(USB2.0)限制了在 这庞大的设备群中必须有一个HOST作为主子,通常是PC。两个外设之间的数据交换必须通过这个主子中转才能完成,效率较低,不大方便。随着嵌入式设备的 爆炸式增长,两个USB设备之间直接进行数据交换的需求越来越强烈,USB On-The-Go就应运而生了。一些手机、PDA和移动设备的厂商在USB2.0的基础上合作开发了USB On-The-Go(OTG)。USB OTG首先解决了USB设备之间点对点的数据交换问题,摆脱了附庸于USB HOST的繁琐。举例来说,有了USB OTG,数码相机可以直接将照片通过打印机打印出来,而不必先将照片拷贝到PC上,再由PC控制打印机打印。

    USB OTG 还有以下几个特性:

n         接口更小巧,有效减 小了电子产品的体积

n         既能充当HOST又 能用做Device,即DRD(Dual-role-devices)

n         OTG 设备依然可以连接到PC上用做普通的外设,即POD(Peripheral-Only Device)

n         功耗更低,以延长采 用电池供电的USB设备的待机时间

USB OTG 接口

    传统的USB设备分为A和B两种。A接口的设备提供电源VBus,用做主子。B接口的设备在通讯过程中作为外设。无论是A接口、B接口还是各自 的Mini接口,虽然外形有些差别,但使用的引脚都遵循以下定义:

    1 脚:VCC电源

    2 脚:D-差分负极

    3 脚:D+差分正极

    4 脚:GND接地

USB OTG 增加了一个ID引脚,它的接口(Mini-AB)定义如下:

1 脚:VBus

2 脚:D-

3 脚:D+

4 脚:ID

5 脚:GND

USB OTG 通过ID信号线来识别是Mini A还是Mini B插头。为了使用方便,不同的接插件颜色不一样:Mini A采用白色,Mini B采用黑色,Mini AB采用灰色。

USB OTG 协议简述

USB OTG 中引入了两个新的协议, SRP(Session Request Protocol)和HNP(Host Negotiation Protocol),即会话请求协议和主机交流协议。

    SRP 用于B设备向A设备请求建立会话和使用总线。OTG系统中的A设备一般采用电池供电,因此,OTG系 统电源管理是非常重要的。为了节省OTG系统的功耗,OTG规定A设备在没有总线活动的时候,可以关掉VBus上的电源。这样,当一个B设备连接到A设备 上之后,就要初始化SRP,并发送给A设备,请求A设备在VBus上提供电流支持,进而进行通信。OTG中,DRD既可作为A设备,也可作为B设备,因此 DRD必须支持初始化SRP和响应SRP,POD只能作B设备,所以只能初始化SRP。B设备有两种方式向A设备发送请求,要求建立SRP:数据线脉冲 (Data-Line Pulsing),一种是VBus脉冲(VBus Pulsing)。任何一个A设备只要求能响应一种SRP方式,而B设备必须能初始化两种SRP方式。这样就能保证,当B设备线初始化一种SRP,A设备 无法响应时,B设备能用另一种SRP方式。

    HNP 用于两个OTG设备互连时角色切换。为了实现HNP,A设备必须首先允许B设备通过OTG最新定义的 Set_Feature命令来控制总线。一旦该请求被A设备接受,B设备就可以对总线进行控制。如果A设备想给B设备一个机会来控制总线,它将中止对总线 的操作,将总线挂起。接着B设备就将D+拉低来终止以前的连接。接着,A设备激活位于D+处的上拉寄存器,完成这个转换。此后,B设备就将作为主控设备使 用,而A设备将作为外围设备使用。同样,B设备也可以通过将总线挂起并激活D+上拉寄存器,A设备探测到总线上的变化后,清除D+上拉寄存器并重新作为主 控设备使用。简而言之,两个OTG设备互连时,可以通过HNP协议协商主从地位。

WinCE 下USB OTG驱动概述

    USB OTG 的软件结构包括3部分:

u       OTG 控制器的驱动:包括SRP和HNP

u       OTG 的外设驱动:实现标准的USB类,来实现特定的USB外设功能

u       OTG 系统HOST驱动:包括HOST驱动、操作系统支持软件和支持外设的类库。

    对于移植这一部分的驱动来说,需要注意ID侦测信号、 VBUS的控制信号,这两个信号一般连接到MCU的GPIO上,根据硬件修改,而SRP和HNP一般由厂商完成,无需修改。我在调试这一部分时碰到的主要 问题是,插入U盘后,OTG驱动检测到U盘插入,并提供了VBUS的供电,但却马上停止通信,无法正常使用U盘,后来经过进一步调试发现是MCU的 OTG_VBUS的供电不足5V导致,不能用时的电压为4.6V左右,连接到5V后就没有问题了,目前USB OTG支持U盘,USB键鼠似乎是不能用的。


OTG 和 EHCI/OHCI/UHCI 是同一类概念吗?

那我们先看一看 OTG 能做些什么。

在 OTG 中,我们一般不把设备叫做主设备或从设备,而称作 A-DEVICE 和 B-DEVICE。一般而言, A-DEVICE 作主, B-DEVICE 作从,但也不能这样绑定, A-DEVICE 也可以作从,这时 A-DEVICE 仍要为总线提供电力。

OTG 设备使用插头中的 ID 引脚来区分 A/B Device , ID 接地被称作为 A-Device, 为连接时候的 USB Host , A-Device 始终为总线提供电力。 ID 悬空被称作为 B-Device,为连接时候的 USB Device( 作从 ) ,设备的 USB Host/USB Device 角色可以通过 HNP 切换。

OTG Device :使用 Micro AB 插座,可以在运行时切换 Host/Device 。 
仅外设 B-Device :仅仅能作为外设的 B-Device (分为插头一体和插头线缆分离的)。

可见, OTG 主要是负责控制器状态的切换,这种切换要根据接入的设备来判断。 OTG主要使用在嵌入式设备中,说到嵌入式不能不提降低功耗了,所以仅有 ID 线的检测还是不够的。

 

OTG 中的三大协议

SRP ( Session Request Protocol ): 
B-Device 使用。通过数据线上的脉冲,请求 A-Device 打开 VBUS 并且开始-个 Session。 Session 为从 VBUS 打开到关闭这一段时间。

支持: A-Device 允许回应 SRP , B-Device (包括仅能作为外设的 B-Device ),允许发起 SRP 。一个能够支持 HNP 的 B- Device 应该能够发起 SRP 。当 A 插头插入时关闭VBus 的 Host 必须支持回应 SRP , VBus 总是打开的 Host 不必响应 SRP 。

 

ADP ( Attach Detection Protocol ):

提供设备检测是否有对端设备插入。

 

HNP ( Host Negotiation Protocol ):

OTG 设备通过 HNP 来切换 Host/Device 角色。

 

OTG 不同连接方式的不同过程

 

OTG Device /Embedded Host 与 仅作为外设的 B-device (带 A 插头型)

Host 端检测到 A 插头插入,停止 ADP ,打开 VBus ,因为 B-Device 的 A 插头与设备作为一体,此时 B-Device 必定与 A 插头连接, Host 检测到外设连接,开始枚举。 
 

OTG Device/Embedded Host 与 仅作为外设的 B-device ( A 插头为线缆连接)

Host 段检测到 A 插头插入,停止 ADP ,打开 VBus ,如果 B-Device 是线缆连接完毕在将 A 插头插入则整个连接过程与上面无异,因为此 时 B-Device 可能还没有插入插头,则设备连接超时, VBus 再次关闭,等待下一次 ADP 的改变(线缆连接完毕),再次打开 VBus ,此时开始正常总 线枚举。

 

OTG Device 与 OTG Device

Host 端检测到插头插入,则打开 VBus ,如果没有外设检测到,则关闭 VBus ,打开ADP Probing , Device 端检测到插头插入,则打开 SRP ,如果线缆没有插入,则 SRP 超时, Device 端开始进行 ADP Probing ,当线缆连接完毕, Device 端侦测到 ADP 变化,发送 SRP 请求 Host 打开 VBus , Host 回应 SRP 并且打开 VBus ,完成设备 连接。

从上面的过程可以看出, ADP 和 SRP 的目的都是为了节能,平时 VBus 上的供电是并没有打开的,而且在空闲一段时间后 VBus 也会自动关闭。在 VBus 不供电的情 况下就需要靠 ADP 和 SRP 来检测外设并打开 VBus 的供电。如果 VBus 上一直有电流供应, ADP和 SRP 就无用武之地了。可见,在嵌入式的世界里,确实要精打细算, ADP 和 SRP 是何等的复杂,这么复杂的设计仅是为了省几毫安的电流。

回来我们前面的问题, OTG 和 EHCI/UHCI/OHCI 是同一类的概念吗?

OTG 的作用只是负责切换主从状态的切换,同时,在功耗方面也有要求, OTG 要求vbus 不能像 PC 那样永远供电,所以这样就需要有一套设备发现机制,这就是 SRP 和ADP 了。 OTG 也允许同进充许同类设备进行数据传输( A TO A ) , 这就是 HNP 发挥作用的时候了。

当 OTG 己经发现设备, VBUS 供电开启,系统处于 HOST 或 DEVICE 状态,这时 OTG的使命就完成了,接下来的工作就交给主控制器( EHCI/OHCI/UHIC )或从控制器了。

所以 OTG 的主要是在设备接入的那一刻起作用,此后 USB 还是要按传统的HOST/DEVICE 的方式来通讯。当然,有些 OTG 控制器会集成一些 HOST 控制器的功能,这些控制器并不符合任何一种标准,一旦遇到这种 OTG 控制器,驱动开发人员就要倒霉了。 USB 系统中最复杂的就是主控制器了,如果与主控制器与 USB 标准有出入,就无法重用大量成熟的控制代码,驱动开发人员就需要重新去研究整个 USB 协义,这无疑是一份耗时耗力不讨好的活。

 

                   Linux 下的 OTG 架构

内核 定义了一个 struct otg_transceiver 的结构体,这个结构体描述的 OTG 需要支持的接口

struct otg_transceiver {

    struct device       *dev;

    const char      *label;

 

    u8          default_a;

    enum usb_otg_state  state; // 记录 OTG 控制器的状态,在实际的处理中这个比较重要。

 

    struct usb_bus      *host;

    struct usb_gadget   *gadget;

 

    /* to pass extra port status to the root hub */

    u16         port_status;

    u16         port_change;

 

    /* bind/unbind the host controller */

    int (*set_host)(struct otg_transceiver *otg,

                struct usb_bus *host);// 这个接口用来启用或禁用主控制器,是关键的接口

 

    /* bind/unbind the peripheral controller */

    int (*set_peripheral)(struct otg_transceiver *otg,

                struct usb_gadget *gadget);

 

    /* effective for B devices, ignored for A-peripheral */

    int (*set_power)(struct otg_transceiver *otg,

                unsigned mA);// 一般用来设置 vbus 上的供电

 

    /* for non-OTG B devices: set transceiver into suspend mode */

    int (*set_suspend)(struct otg_transceiver *otg,

                int suspend);

// 下面是 OTG 的三大高级功能的接口。

    /* for B devices only:  start session with A-Host */

    int (*start_srp)(struct otg_transceiver *otg);

 

    /* start or continue HNP role switch */

    int (*start_hnp)(struct otg_transceiver *otg);

 

    /* b device disconnect during hnp */

    int (*disconnect)(struct otg_transceiver *otg);

 

    /* b device connect */

    int (*connect)(struct otg_transceiver *otg, struct usb_device *udev);

 

    /* host suspend the bus during hnp */

    int     (*host_suspend)(struct otg_transceiver *otg);

 

    /* hand interrupt related to usb otg */

    int (*otg_interrupt)(struct otg_transceiver *otg);// 中断处理接口

};

 

上表的结构体很清晰的描述了 OTG 的功能,只要实现几个重要的接口,就能把你的OTG 控制器和 linux 系统联接起来。

系统中作了如下定义:

   struct otg_transceiver *xceiv;

这个定义就是一个 OTG 控制器的对像,然后使用 otg_set_transceiver 来实现这两者之间的联接。


原文:http://blog.csdn.net/ling1874/article/details/5761181


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值