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