首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

LINUX驱动学习——内核USB驱动编写八USB的OTG驱动1(转载)(2)

LINUX驱动学习——内核USB驱动编写八USB的OTG驱动1(转载)(2)

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键鼠似乎是不能用的
继承事业,薪火相传
返回列表