日期:2005.3.30
我认为当前的OTG划分成三层来实现是比较合理的。第一层是设备attach/detach时的OTG ID的判断, 第二层是attach后的HNP,第三层是session时的SRP。
首先通过Mini-A或Mini-B connector的ID线来判断接入的是host或client. 说实话在我看来这实在是很笨的设计,这样厂商卖一个OTG设备,就得至少得附带Mini-A to standard A receptacles和Mini-B to standard A plugs两种连接线, 如果想连接另外一个OTG设备,那还得给一个Mini-A to Mini-B的连接线。 三根线,接错了就用不起来。普通不太懂电脑的用户,一下就搞懵了。
我网上看了些资料,目前多数厂家所做的都停留在第一层和第二层,还没看过做到SRP层次的。
由于是自己往里面添加OTG ID判断的代码,所以主要还是算法问题。microsoft的新闻组上关于算法也有过讨论, 有人提出的做法是在host和client两个thread之外,再建立一个统一管理的thread, usb event首先通知到该thread, 然后再由该thread判断分发给host或client的线程. 晕, 自己建立线程和事件……没搞过, 心里没底, 所以用了下文比较保守的方法, 实践证明思路还是对的.
首先系统启动后,host和client的线程保持并发执行, 都在WaitForSingleObject. 因为负责role-switch(哈,这个词也是我发明的)的usb port 2 output controller register(UP2OCR)位于usb device controller里面, 所以首先定下来, 在port上面没有接任何USB设备/主机的时候,默认状态为client(这个是关键点). 当connector接入后, otg id线有所变化, 引起otg中断, 通知到client thread, 开始执行BulUsbDevice::ThreadRun. 然后根据ID线的判断来决定继续执行DevieRole或切换到HostRole.
原先我在必要的地方使用USBOTG_SetRoleHost或USBOTG_SetRoleDevice函数来进行切换。包括
1. 在Host Thread初始化中set role client
2. 在Client Thread初始化中set role client
3. 在Host thread的detach处理中, 判断如果port上没有接设备, 则返回client role状态
4. 在client thread的IST中,判断ID线切换role
后来发现这样做问题很大. 尤其是针对第三点, 必须要求用户每次更换操作必须把mini连接头从port上unplug. 但比如用户使用Mini-A to standard连接鼠标, 然后把鼠标拔下了,mini-a仍然插在port上. 那么此时detach切换到client role, 但OTG ID=0 (ID由连接线决定, 线不拔下ID不变). 那么用户紧接着把keyboard接到standard上, 此时由于ID不变, client的IST里没有检测到ID中断, 因此切换不回HOST状态, 程序就死在那里了.
解决方法是在OTG代码中加入USBOTG_SetRole函数, 即使满足条件调用该函数进行role-switch, 在此函数中仍然读取GPIO PIN LEVEL REG先对ID线进行判断, 然后再进行切换. 这就满足了用户不unplug mini connector的情况.
下面就是HNP层了. 意义就不是那么大了. 只是当使用Mini-A to Mini-B connector连接两个OTG设备时, Mini-A一端可以转变为client而Mini-B一端可以转变为host. 按照我理解, 实际上只要有ID判断, 不互换角色也是能正常工作的. 但这个理解不知道是不是对的, 怕怕.
其实除了写一堆代码来做HNP外, 这件事情也可以简单这样做: 把电缆两头拔下, Mini-A和Mini-B对调一下接到两件设备上. 哈哈,够傻吧.
---------------------------小小分割线-----------------------------
实际上,现在做有线USB的OTG是不合算的,我发现这个添加的协议似乎不太得人心,即使MICROSOFT的工程师对之也了解甚微。我对WUSB的技术比较看好,在后面会对USB市场重新洗牌一次。
Wireless USB,今年刚制定的标准,还在推广期,实际上我搜了一下,WUSB的芯片都还没上市,我个人比较期待USB-IF的核心成员之一PHILPS尽快推出好让我们见识见识
下面随手从USB ORG上抄写了一些WUSB的主要特性
1. 速率:
3米内 480Mb/s = wired usb 2.0 High-speed, 非常可观!
3-10米内 110Mb/s
2. Backward compatibility and seamless legacy support //估计会出个USB STANDARD to WUSB的转接器
3. WUSB Duel-Role device
- limited host and device capabilites
- similar to OTG
//其实现在的OTG根本没市场,操作麻烦,对传统设备的兼容性非常之勉强。WUSB出来后就是整个USB市场重新洗牌了,DUEL-ROLE一步到位
4. Power Management
-The power target for WUSB radio will be less than 300mW at introduction and drive to a target of 100mW over time
-The radio will sleep when possible and wake upon request
//没有POWER MGR就失去了掌上终端的市场,这点上WUSB是很清楚的
5. 一个WUSB HOST可以接入理论最多128个WUSB CLIENT, HUB都省了
//是好事也是坏事, 黑客们又有新课题了.