USB驱动学习系列之一:硬件原理解析

· 作为Linux驱动的学习者,我看到USB驱动的时候,真的是有种大海捞针的感觉。USB驱动代码太大,且层次复杂,难以理解。这其实是由于USB协议仍然在不断发展,我们的内核工程师还没有找到对应的规律来提供更简洁的架构给我们使用,但是我们仍然要尽力去理解这些源码的由来,本人刚好遇到的这方面的问题,想将自己总结的经验分享出来,降低大家的学习难度。
· 在学习USB驱动开发的过程中,我遇到了很多困难,首先是讲USB驱动的书比较少,例如我的枕边书:宋宝华老师的《linux设备驱动开发详解》中USB驱动只有47页,而使用广泛的OTG设备只有区区3页,这点我非常理解,作为一本将整个驱动方面的书,在某一个点上不能过分展开。而几位大牛写的《linux那些事儿之我是USB》非常对我的胃口,但是很可惜,没有讲到OTG协议,因此本人就自告奋勇来把这一块梳理一遍,帮助大家尽快上手。
废话不多说,本篇先讲硬件基础,后续会深入代码分析。本系列只研究适用于嵌入式设备USB OTG控制器和应用广泛的USB2.0协议。
· 首先介绍一下OTG协议,知道的可以跳过此段,传统的USB设备区分为USB主机和USB设备,对应的USB主机控制器和USB设备控制器也区分明确,但是这些只适用于PC这种大型设备,对于更灵活嵌入式设备来说,有时候想当主机,有时候想当设备,比如我们的手机既可以做主机接摄像头、U盘等设备,也可以作为设备角色接电脑,怎么办呢,OTG协议应运而生,它使得在不用改变接线方式,就可以实现USB主机和设备之间的角色切换。
· 下面干货来了:

1.OTG设备的线缆区别

· 与传统USB2.0的4芯线缆不同,OTG设备采用micro-USB的5芯线缆,相比于USB2.0,多了一根ID线,依据ID引脚状态来判断角色是什么设备。当ID是高电平,就是B设备,要ID是低电平,就是A设备。
而且约定了当OTG设备连接到USB主机时,只能工作在USB设备模式。
· 比如我们手机充电线可以用来连电脑,所以这micro-USB接口中的ID引脚肯定是高电平,这样microUSB就能兼容USB2.0,因为手机连电脑必然手机是从机。而有的OTG设备想一直作为A设备,可以固定
· 把这个引脚置为低电平,然后其他引脚组成USB2.0的4芯接口。

2.OTG设备的协议区别

2.1 角色
· OTG使用了两种角色:A设备和B设备,通过ID引脚来区别,每一组线缆两端规定了一个为A设备,一个为B设备。后续通过状态转换图再更细致了解。

2.2 协议
· OTG协议中包含了3个兼容的协议,包括会话请求协议(SRP)、主机角色协商协议(HNP)、连接检测协议(ADP)。这3个协议不用过多理解,通过后续的状态迁移图理解用处就行。

2.3 状态迁移
· 将OTG的状态迁移之前,先将USB2.0的状态迁移解释一下。内容都在图中,粗体是解释状态的,其它是解释过程的。
在这里插入图片描述
图1 USB2.0状态迁移图(加粗表示状态解释,不加粗是过程解释)
· 由上图可以看到,usb设备真是个爱节约的好宝宝,特别注重省电,只要上电,要是没活干,就立刻挂起。
· 在USB2.0中,状态变迁都是由主机发起的请求所触发;
· 下面要讲到OTG各个状态的迁移,我们要知道OTG协议是兼容USB2.0的,所以需要将上面的图和下图结合来看,进一步深入理解:
在这里插入图片描述
图2 USB OTG状态迁移图(图中的顿号表示或)

· 上图准确描述的各个状态迁移的条件,由此可以知道OTG设备非常的灵活,既可以作为A设备,也可以作为B设备,AB设备都可以作为主机进行传输,只不过A设备在大部分时期起到主导作用,而B设备需要在转换为主机模式前,发送HNP请求,这就是OTG最重要的部分。而SRP协议和ADP协议只用于A设备和B设备的角色切换和初始化阶段。
· 在基本了解了上述的图之后,对于我们驱动开发就基本足够了,如果对协议细节和硬件要求感兴趣的同学,可以查询本文的参考资料。
· 若本文有所遗漏或各位对本文有所疑问,欢迎各位留言!

参考资料:
《微控制器USB的信号和协议实现》工业和信息化部人才交流中心 恩智浦(中国)管理有限公司 编著

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值