博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
USB OTG & WUSB
阅读量:7062 次
发布时间:2019-06-28

本文共 2738 字,大约阅读时间需要 9 分钟。

 我认为当前的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都省了

//是好事也是坏事, 黑客们又有新课题了.

本文转自Walzer博客园博客,原文链接:http://www.cnblogs.com/walzer/archive/2006/02/05/325564.html,如需转载请自行联系原作者

你可能感兴趣的文章
超燃!Apache Flink 全球顶级盛会强势来袭
查看>>
约你一起来写作
查看>>
修改arcgis infowindow 放大和缩小的模板
查看>>
ASP.NET 2.0+Atlas编写鼠标拖放程序(2)
查看>>
JavaScript返回上一页代码区别
查看>>
EntityFramework 如何进行异步化(关键词:async·await·SaveChangesAsync·ToListAsync)
查看>>
百度编辑器ueditor每次编辑后多一个空行的解决办法
查看>>
C#扇形的绘制与Hittest交互、图种制作
查看>>
【MVC 4】5.SportsSore —— 一个真实的应用程序
查看>>
Lucene.Net:构造搜索表达式简化搜索
查看>>
Hadoop - Zeppelin 使用心得
查看>>
Android GIS开发系列-- 入门季(2) MapView与图层介绍
查看>>
爪哇国新游记之二十五----图及其遍历查找
查看>>
Windows Live Writer Technical Preview 公布下载
查看>>
iphone:使用NSFileManager取得目录下所有文件(遍历所有文件)
查看>>
IPK僵尸网络 看看其传播手法
查看>>
Visual Studio DSL 入门 14---用Wix制作安装程序
查看>>
SQL Server 各种查询语句执行返回结果
查看>>
Visual Studio 2017 针对移动开发的新特性介绍
查看>>
自定义Notification
查看>>