经典博客

文章链接
OTG数据线与普通USB数据线有什么区别?https://www.jb51.net/shouji/332556.html
USB OTG简介、与普通USB线的区别https://blog.csdn.net/mao0514/article/details/46345861
linux usb驱动——host与device电路https://www.cnblogs.com/mahj/p/8480085.html
开机自动打开USB调试模式和配置android为USB OTA模式https://blog.csdn.net/longkg/article/details/8626271
USB HOST与 USB OTG的区别及工作原理https://blog.csdn.net/rainbowbirds_aes/article/details/86557077
RK平台下USB_OTG提供的接口和返回的状态https://blog.csdn.net/wangubuntu/article/details/17723793
USB Host、USB Device和USB otg的理论简析https://blog.csdn.net/DIYfashaoyou/article/details/49895111

概念

host、device

usb协议中,设备连接是主从模式,具体定义自行了解usb协议,比较直观的认识,如下:

USB Host是指驱动过后,板子就可以连接USB接口连接的器件,读取和装载数据了。
USB Device是指驱动过后,板子可以当做一个USB移动设备,通过USB连接到电脑上,类似U盘
OTG

手机只有一个外接usb口,为了方便用户使用,如otg上插上一条可以支持U盘插入的线,手机就可以直接访问U盘的内容,不需要经过PC,手机给外设供电。若手机连上PC,PC上的usb口基本为host端,为方便使用,手机端作为device端比较方便合理。因此手机端的usb支持host、device模式的自动切换。OTG即是增加了host、device协商机制的usb口。

识别

host、device

host、device的电路设计不同,定义好角色后不可以转变。如果需要转变,就是下面介绍的OTG。
分别的电路图见上面博客介绍。在实际使用中,若无客制化需求,在linux开发中,驱动都是已经有的。

各自的角色在设备上电后,根据电路自行执行确定的角色驱动。

OTG

otg数据线设计比普通的usb数据线多了一条ID线。OTG连接如下:
在这里插入图片描述
OTG口就是手机端的充电口,usb口接入PC后连接U盘。

usb口接上设备后,在otg口端检测ID脚的电平高低,OTG决定作为host或device端。若id脚为低电平作为host端,对外供电;若id脚悬空,则作为device端。详见博文《https://blog.csdn.net/mao0514/article/details/46345861》。

实际开发中遇到的问题

rk3288平台与linux设备,两个设备连接,android端打开rndis。换了一个设备后,一样的连接,发现rndis开关为灰色,也即没有rndis设备被识别到。为什么?
硬件把另外一端的usb连接线的DET脚电平拉高供电,就能正常使用。
在这里插入图片描述
分析OTG的定义,此处otg端作为了device端。从android设备命令查看:

cat /sys/bus/platform/drivers/usb20_otg/force_usb_mode

值为2,确实被作为device端了。这时通过命令

echo 1 > /sys/bus/platform/drivers/usb20_otg/force_usb_mode

把otg口设置为host端,rndis也无法识别,说明对端就是host端,host与host端是不能通信的。

总结

usb协议只能是host与device间通信。若不能通信,两端都是device或都是host。非OTG口是不能动态设置usb口为host端或者device端,一个确定的开发板,usb的角色由设计电路决定。按照usb协议定义的电气标准,通用usb驱动会自动适配usb驱动。

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐