EDA365电子工程师网

标题: 求教:安卓手机USB设备插入识别过程? [打印本页]

作者: lukeluck    时间: 2018-5-28 15:56
标题: 求教:安卓手机USB设备插入识别过程?
本帖最后由 lukeluck 于 2018-5-29 08:43 编辑
0 ]- Z% n- Q# R; Z
: U9 c6 M! K" d+ N0 b. }' n求教:安卓手机USB设备插入识别过程?* L0 q4 O# W' n) B- v" A  [

' z7 I  [2 P8 k) ?6 \目前做了一个安卓手机的USB设备,前提条件如下:
7 D3 [' U; b" W: X$ V3 O4 }8 T求教各位熟悉USB设备开发的大侠,USB设备插入手机后的识别过程是什么顺序?
! l3 W: b$ W' u) m( [8 |$ @
! i; H  F5 O1 w# n4 ~6 X. y  i7 Y4 {; ^- y# h- _' p; `+ k4 X
目前已知的资料:: c* U6 y6 u* h, n! W8 Z( t
USB设备插入后 因为ID为地,故USB设备工作在Host 模式,手机通过检测ID脚电平输出5V电压至USB设备
+ H, y1 [# Y1 B( `USB设备上电后通过1.5k上拉电阻与手机内置的15k下拉电阻分压使得VD-=3.5V,手机检测到D-电平变化 从而认为USB设备为低速设备。' x, e9 b5 `6 p+ O" z. Q8 T

! R! x* N% H3 }5 s参考资料1:搭个简单电路验证USB主机是如何检测USB设备的插入和拨出动作的
  s( q5 y: S; m! I2 k7 g+ h参考资料2:USB OTG插入检测识别- v& s7 |( w1 l' N' P  M: s9 C
参考资料3USB设备的插入检测机制, o6 y  u! K3 v7 A& G2 g" F

9 n$ I: H5 i5 q9 g+ Z( r4 [& b! y( Q* z) U

作者: czxjuren    时间: 2018-5-28 16:35
学习了
作者: xiáò虫    时间: 2018-5-28 17:07
刚好在找资料,非常感谢;
作者: lukeluck    时间: 2018-5-28 17:16
xiáò虫 发表于 2018-5-28 17:075 L( y, _- B( Z0 Z1 B' I
刚好在找资料,非常感谢;

( e/ o1 [' a$ p额,我这是求教贴。。。
: ?0 T. s, Q: \$ ^
作者: ABCDJ    时间: 2018-5-28 22:28
插入时,通过ID确认是host还是device;
! T: w4 O  `5 \3 k% ]) u: L7 r然后通过D+/D-上的1.5K上拉电阻,确认是有device挂上设备,并确认了是低速设备还是全速/高速设备;8 h/ D! k( @$ u3 v* Q
若为全速/高速设备,host需要再通过一些访问确认是否支持高速模式,支持则切换到高速模式;' A4 ?1 h. R  [3 A; @
切换后再通过一些枚举操作,识别设备的驱动,并确认是一个什么类型的设备,系统再根据设备类型进行设备挂载。
作者: lukeluck    时间: 2018-5-29 08:41
本帖最后由 lukeluck 于 2018-5-29 08:43 编辑 % Q- z7 ^. F/ q3 |4 b
ABCDJ 发表于 2018-5-28 22:28
- v  s* |) P+ A7 M插入时,通过ID确认是host还是device;
, p( z8 M( _6 N然后通过D+/D-上的1.5K上拉电阻,确认是有device挂上设备,并确认 ...

6 T2 H+ W6 e, S% s3 G& e7 E那看来这个过程还挺复杂的,现在我的做法是:0 E, i% ]4 P% n8 {
1 设备测ID接地,则设备作为Host工作,目的仅仅只是为了从手机的USB口取电。2 Y( D1 ^5 O$ r3 b
2 设备测D-通过1.5K上拉电阻上拉至5V,目的仅是告诉手机这是一个低速设备
- \! z8 D/ F3 v6 I2 A2 D3 我的最终目的并不需要建立设备与手机的USB通信,仅仅是想知道当设备插入时候有个状态变化(手机上有一个APP,设备插入后这个APP里有一个标志位置位)
# y9 W& G7 C7 q  X5 P$ n& O& f, P* y2 x/ g
按照我的理解,当手机上插入设备时,ID脚已经会产生一个下降沿(此后保持低电平),另外D-脚会产生一个上升沿(手机内部D-脚通过15k电阻下拉,此后保持高电平),那么这两个信号已经可以让手机发现有个设备插入了,至于是什么设备后面通过通信获知(我们的情形不需要到这一步,仅仅是发现设备插入就可以了)0 b3 A- N- U  E
请问大侠能否实现呢?感谢!
. f6 S, E- `2 b
1 Z8 Z$ |/ g3 o. i4 L* S
作者: wistful555    时间: 2018-5-29 09:34
Mark 一下。
作者: 哈士奇的主人    时间: 2018-5-29 09:45
学习
作者: dqwuf2008    时间: 2018-5-29 17:31
学习了
作者: dqwuf2008    时间: 2018-5-29 17:31
MARK
作者: 下雨天睡觉    时间: 2018-5-29 17:52
你的USB设备是USB2.0?你说的低速指的是什么意思?USB2.0 Spec有LS,FS和HS,不知道你说的低速全速高速分别指的那个。
作者: lukeluck    时间: 2018-5-29 18:08
下雨天睡觉 发表于 2018-5-29 17:52
1 p7 O8 M1 s5 K  ?你的USB设备是USB2.0?你说的低速指的是什么意思?USB2.0 Spec有LS,FS和HS,不知道你说的低速全速高速分别 ...
( a1 b! @3 Y: [" ~" Z9 j! Q" [
我的接口是MicroUSB接口,D-通过1.5k电阻上拉至5V% s8 @4 k# d; r+ U

USB的插入检测机制:USB端口的D+和D-均用一个15k的电阻接地,当无设备接入时,均处于低电平;在设备端在D+(表示高速设备或者全速设备)或者D-(表示低速设备)接了一个1.5k的上拉电阻,一旦将设备接入,USB端口的D+或者D-其中一个被拉高为3v,系统识别到外部设备接入。

注意:高速设备首先会被识别为全速设备,然后再通过集线器和设备二者的确认最后切换到高速模式下。

在高速模式下,采用的是电流传输模式,这个时候上拉电阻需要从D+上断开。


( W3 c5 T, A; d$ I1 I
作者: 下雨天睡觉    时间: 2018-5-29 22:28
lukeluck 发表于 2018-5-29 18:08
! S2 @3 n. Y9 S' [& Y  [# C9 ~2 o- L我的接口是MicroUSB接口,D-通过1.5k电阻上拉至5V
( y. H6 ]6 ]  ?' wUSB的插入检测机制:USB端口的D+和D-均用一个15k的电 ...
4 I* p6 o' Q- u3 [/ Q) H
USB2.0 Spec对这部分都有详细的描述(chapter 7 electrical部分),仔细看下USB PHY的内部电路结构应该很容易搞清楚。关于USB设备检测:自动检测的,你应该不需要加其他外围器件才对,Host端和Device端的USB PHY应该有实现这部分电路。Host端的DP&DM默认都是电阻下拉到GND的,所以不加Device时DP&DM都是低电平,而Device端的DP or DM上会有一个上拉到3~3.6V电压的1.5V电阻,Low Speed是上拉在DM端,Full Speed是上拉在DP端,因此通过检测DP和DM上的电平就能判断Device设备有没有接上了(High Speed最初是以Full Speed来进行设备识别的)。# S4 i! n& f. `3 {* a
附上一些资料,感兴趣可以自己多看看7 x7 ^8 r$ N3 W: z  _

1 P* x& }$ S5 V9 n
' K. P% m) @! K0 T$ U3 m8 K" ?5 O1 c; a

Device Cable and Resistor Connections.png (109.63 KB, 下载次数: 0)

Device Cable and Resistor Connections.png

Example High-speed Capable Transceiver Circuit.png (146.36 KB, 下载次数: 0)

Example High-speed Capable Transceiver Circuit.png

usb_20.pdf

6.04 MB, 下载次数: 0, 下载积分: 威望 -5

USB_20_System_Architecture.pdf

6.96 MB, 下载次数: 1, 下载积分: 威望 -5


作者: lukeluck    时间: 2018-5-30 09:57
下雨天睡觉 发表于 2018-5-29 22:28
. `& i1 g$ K% [8 vUSB2.0 Spec对这部分都有详细的描述(chapter 7 electrical部分),仔细看下USB PHY的内部电路结构应该很 ...

% x0 Y1 n5 A) U. q# N# R' c  [不错  正如你所说的这样,D-确实需要接上拉电阻,标准上是接1.5k上拉至3-3.6V
/ }' _+ `& h8 T1 ]. I. F现在我如果接1.5k上拉只5V 则在D-管脚计算得到的电平是4.5V 估计会超出检测范围,实际测量这个电压是3.5V(估计是手机内部有钳位电路),那么如果我调整此电阻为10k,则能够在D-管脚得到3.0V的电平。
& F2 ?& z  D! g现在我的问题是 手机插入这个USB设备后检测不到。问题不只是硬件方面,还有软件方面的代码。能否帮忙提供下参考呢?
$ z! t2 e+ {9 C+ W( ~: O
作者: xingnuolgsx    时间: 2018-5-30 10:16
学习了
作者: 963    时间: 2018-5-30 11:04

作者: 下雨天睡觉    时间: 2018-5-30 16:22
lukeluck 发表于 2018-5-30 09:57
* K& P7 E( Z; C  T1 f不错  正如你所说的这样,D-确实需要接上拉电阻,标准上是接1.5k上拉至3-3.6V. d9 ?* ~1 m0 m; b
现在我如果接1.5k上拉只5V ...

6 t3 B5 e( C9 b% p额,软件方面的东西我就不大了解了,不知道是不是你手机的USB Driver默认不支持USB Low Speed还是怎么回事,,,看样子你的USB设备应该是Low Speed设备,我对Low Speed的Spec还真的不是特别了解,只对USB2.0 HS稍微了解一些。要我debug硬件的话可能会搞个Low Speed的设备接到电脑上先测下设备能正确识别时候的波形,再对比接到手机上测试一下是哪里出了问题,或者看下USB1.1的Spec了解下LS设备到地是怎么识别的。9 W% E' K: G- k6 k4 x. y
& \  |4 z3 g# s. x1 j, Y

作者: ABCDJ    时间: 2018-5-31 20:28
lukeluck 发表于 2018-5-29 08:41
1 R  U$ Y4 O. [那看来这个过程还挺复杂的,现在我的做法是:
  H8 _- ?2 H/ x. e5 k0 }- Y: `1 设备测ID接地,则设备作为Host工作,目的仅仅只是为了从 ...
' Y3 s5 }0 o0 q; M& S
1 设备测ID接地,则设备作为Host工作,目的仅仅只是为了从手机的USB口取电。--这个ID接地,是让手机侧的USB工作在HOST模式,一个为是DEVICE供电,另一个是作为HOST才能去识别device;
" }& A2 i& Y& j2 c3 M0 S' \8 S2 设备测D-通过1.5K上拉电阻上拉至5V,目的仅是告诉手机这是一个低速设备。--这个电阻目的是告诉手机有设备插入了,且是一个低速设备;" l0 W% W: q4 X: t
3 我的最终目的并不需要建立设备与手机的USB通信,仅仅是想知道当设备插入时候有个状态变化(手机上有一个APP,设备插入后这个APP里有一个标志位置位);--这样,手机能识别到了;
; i+ b8 i9 _5 H
作者: lukeluck    时间: 2018-6-1 08:58
ABCDJ 发表于 2018-5-31 20:281 |  i' [/ m4 I' f/ U! R0 }& G
1 设备测ID接地,则设备作为Host工作,目的仅仅只是为了从手机的USB口取电。--这个ID接地,是让手机侧的U ...
9 g5 {: S% j, O7 d
感谢回复,现在我已经理解清楚这个顺序了。手机确实作为Host* e7 x; I6 R7 z& ?7 ~% `9 Z
D-的上拉电阻确实是告诉了手机有个低速设备插入。7 f' p. P8 ^; V! Q2 c5 d0 U
D+/D-由于不会同手机USB通信 因此可以说我的Device不是标准的USB外设,仅仅是从手机USB供电+ q1 s3 L1 u' ]
现在可以确保硬件连接上是没有问题的,只是没有通信!: {1 g# l0 D) s6 y% M, {, j! z0 h1 _

+ A% y1 n6 h/ \问题是:代码如何实现这个识别过程呢?
6 Q+ |; l# T& t# |附:一个参考代码 https://blog.csdn.net/chy555chy/article/details/52350810
/ P) I& D5 i  ~7 G6 E! u- ]目前还是没有搞定。
3 l, n- K; X4 a* G  J我插入普通USB数据线,都可以观测到ACTION_USB_STATE =connectd 状态变化,但是连接我自己的设备却没有任何反应!( b! Z3 J  c6 Z1 _1 A) L





欢迎光临 EDA365电子工程师网 (https://bbs.elecnest.cn/) Powered by Discuz! X3.2