EDA365电子工程师网

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

作者: lukeluck    时间: 2018-5-28 15:56
标题: 求教:安卓手机USB设备插入识别过程?
本帖最后由 lukeluck 于 2018-5-29 08:43 编辑   t0 E! _: U# N) m4 ^2 p3 d! }4 I. ~0 P
! P+ W% Q" o# d
求教:安卓手机USB设备插入识别过程?# Y+ J* x3 f/ u" C# V; }. ~

9 d$ o, p+ `9 d2 S  f8 U+ r9 l% j; M目前做了一个安卓手机的USB设备,前提条件如下:
# m$ g  X$ Z/ R" N2 j& |! N求教各位熟悉USB设备开发的大侠,USB设备插入手机后的识别过程是什么顺序?. e+ u% k5 O1 ?

6 N8 o. X" g& F) I  I3 i0 [" I: ^0 n0 y. y* q0 X/ {
目前已知的资料:. u8 k7 Z1 Z& x+ Q# F7 d0 R3 {
USB设备插入后 因为ID为地,故USB设备工作在Host 模式,手机通过检测ID脚电平输出5V电压至USB设备1 z3 y! V6 b$ x9 s# u
USB设备上电后通过1.5k上拉电阻与手机内置的15k下拉电阻分压使得VD-=3.5V,手机检测到D-电平变化 从而认为USB设备为低速设备。* u3 j0 m: H, L* j

$ u4 |- g7 P1 s6 q' k& B参考资料1:搭个简单电路验证USB主机是如何检测USB设备的插入和拨出动作的9 k; X4 Q  \) g- y$ a
参考资料2:USB OTG插入检测识别
7 z% y  {  q* e/ E3 Y参考资料3USB设备的插入检测机制* _; l3 z2 N' m$ R% K) T7 O

9 |/ f$ w, }. Z2 g9 m# ?
' d7 D) E" j+ p# Q- N& e
作者: czxjuren    时间: 2018-5-28 16:35
学习了
作者: xiáò虫    时间: 2018-5-28 17:07
刚好在找资料,非常感谢;
作者: lukeluck    时间: 2018-5-28 17:16
xiáò虫 发表于 2018-5-28 17:075 L5 @# P8 m$ g3 O
刚好在找资料,非常感谢;
- g; c( F2 o) q* R7 g6 a% C
额,我这是求教贴。。。
! g! U( A0 o. ]. H
作者: ABCDJ    时间: 2018-5-28 22:28
插入时,通过ID确认是host还是device;
" z) B& S  `' C& i$ s+ y然后通过D+/D-上的1.5K上拉电阻,确认是有device挂上设备,并确认了是低速设备还是全速/高速设备;
8 v0 J5 x7 J1 {若为全速/高速设备,host需要再通过一些访问确认是否支持高速模式,支持则切换到高速模式;/ J6 g# J5 r6 ~+ i, G) r
切换后再通过一些枚举操作,识别设备的驱动,并确认是一个什么类型的设备,系统再根据设备类型进行设备挂载。
作者: lukeluck    时间: 2018-5-29 08:41
本帖最后由 lukeluck 于 2018-5-29 08:43 编辑 ! T/ d+ v& V+ C
ABCDJ 发表于 2018-5-28 22:28
9 U: P4 J4 `0 Q6 W7 d" B2 r# O" b插入时,通过ID确认是host还是device;
: [3 U) U- }2 |* P3 I6 _然后通过D+/D-上的1.5K上拉电阻,确认是有device挂上设备,并确认 ...
6 K$ C  X. h& f- Z& f4 f
那看来这个过程还挺复杂的,现在我的做法是:
3 a& I/ o+ V4 t; n8 s% I1 设备测ID接地,则设备作为Host工作,目的仅仅只是为了从手机的USB口取电。4 Y+ W5 S- O- P: P/ a) [
2 设备测D-通过1.5K上拉电阻上拉至5V,目的仅是告诉手机这是一个低速设备1 [& F+ h) \( _( `+ s
3 我的最终目的并不需要建立设备与手机的USB通信,仅仅是想知道当设备插入时候有个状态变化(手机上有一个APP,设备插入后这个APP里有一个标志位置位); C& |1 \- C  g7 q: W% [$ ]5 C% O

4 Q+ z, _+ C4 C! }: T2 B# n# R按照我的理解,当手机上插入设备时,ID脚已经会产生一个下降沿(此后保持低电平),另外D-脚会产生一个上升沿(手机内部D-脚通过15k电阻下拉,此后保持高电平),那么这两个信号已经可以让手机发现有个设备插入了,至于是什么设备后面通过通信获知(我们的情形不需要到这一步,仅仅是发现设备插入就可以了)
/ Y- c1 n/ _* l* A请问大侠能否实现呢?感谢!3 G9 Q6 I, _0 A$ P9 ]4 d
) _1 @! w2 Q& R* E7 s6 [

作者: 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
) W1 b  J3 e8 o* X& `你的USB设备是USB2.0?你说的低速指的是什么意思?USB2.0 Spec有LS,FS和HS,不知道你说的低速全速高速分别 ...
: C( i( D9 _* T3 R
我的接口是MicroUSB接口,D-通过1.5k电阻上拉至5V
& N: {6 w" r. f, `/ @7 p5 r! i

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

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

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


5 g) }: h, I& i; ~- e
作者: 下雨天睡觉    时间: 2018-5-29 22:28
lukeluck 发表于 2018-5-29 18:08
! c3 ?, K( j4 M" x4 O我的接口是MicroUSB接口,D-通过1.5k电阻上拉至5V
6 N: ^8 ~6 l, p( F$ j2 NUSB的插入检测机制:USB端口的D+和D-均用一个15k的电 ...
) P# E# [( _8 j; L
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来进行设备识别的)。* q' F; C( c1 F
附上一些资料,感兴趣可以自己多看看1 l/ Y1 y; ]/ g' E+ T7 t2 K

: R& N' M  W& n% f6 Y# R8 r6 @# a2 b4 k3 S- @) l7 Q% S6 I
2 C' `! h3 {3 q

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:280 H" X- B* l) }5 L% q
USB2.0 Spec对这部分都有详细的描述(chapter 7 electrical部分),仔细看下USB PHY的内部电路结构应该很 ...

: v, D: F: Z$ O0 a. Q, D+ G6 M不错  正如你所说的这样,D-确实需要接上拉电阻,标准上是接1.5k上拉至3-3.6V
& E0 P: e& }, d& O现在我如果接1.5k上拉只5V 则在D-管脚计算得到的电平是4.5V 估计会超出检测范围,实际测量这个电压是3.5V(估计是手机内部有钳位电路),那么如果我调整此电阻为10k,则能够在D-管脚得到3.0V的电平。* x* i0 @6 }2 h1 J0 @
现在我的问题是 手机插入这个USB设备后检测不到。问题不只是硬件方面,还有软件方面的代码。能否帮忙提供下参考呢?1 k$ ~; B- v" `. D) \7 ^& ]6 E' J

作者: xingnuolgsx    时间: 2018-5-30 10:16
学习了
作者: 963    时间: 2018-5-30 11:04

作者: 下雨天睡觉    时间: 2018-5-30 16:22
lukeluck 发表于 2018-5-30 09:57. P3 F$ u; ~5 ~, d1 K
不错  正如你所说的这样,D-确实需要接上拉电阻,标准上是接1.5k上拉至3-3.6V
+ j. Z: `8 c: ?0 x. N现在我如果接1.5k上拉只5V ...
) ?% X7 A6 S  ?4 L8 o' x% Y# b
额,软件方面的东西我就不大了解了,不知道是不是你手机的USB Driver默认不支持USB Low Speed还是怎么回事,,,看样子你的USB设备应该是Low Speed设备,我对Low Speed的Spec还真的不是特别了解,只对USB2.0 HS稍微了解一些。要我debug硬件的话可能会搞个Low Speed的设备接到电脑上先测下设备能正确识别时候的波形,再对比接到手机上测试一下是哪里出了问题,或者看下USB1.1的Spec了解下LS设备到地是怎么识别的。
6 q/ {2 g& S* I& T: q; S- O' r+ r( A5 n; B7 B' i) P3 h

作者: ABCDJ    时间: 2018-5-31 20:28
lukeluck 发表于 2018-5-29 08:41: y$ [- q1 k7 i3 H6 d1 v# E
那看来这个过程还挺复杂的,现在我的做法是:
% F6 k3 R$ c3 `# y  K/ s1 设备测ID接地,则设备作为Host工作,目的仅仅只是为了从 ...

: u4 k, Y4 j8 b, _/ d, A2 n. O1 设备测ID接地,则设备作为Host工作,目的仅仅只是为了从手机的USB口取电。--这个ID接地,是让手机侧的USB工作在HOST模式,一个为是DEVICE供电,另一个是作为HOST才能去识别device;
5 S( ^3 |) I* ?7 m: n- ^2 设备测D-通过1.5K上拉电阻上拉至5V,目的仅是告诉手机这是一个低速设备。--这个电阻目的是告诉手机有设备插入了,且是一个低速设备;
. E2 K0 G; n/ ?3 我的最终目的并不需要建立设备与手机的USB通信,仅仅是想知道当设备插入时候有个状态变化(手机上有一个APP,设备插入后这个APP里有一个标志位置位);--这样,手机能识别到了;6 E1 w5 B# Z' O+ [, R6 t+ i3 t

作者: lukeluck    时间: 2018-6-1 08:58
ABCDJ 发表于 2018-5-31 20:28+ U' }( A; F# S( @( e2 y2 d
1 设备测ID接地,则设备作为Host工作,目的仅仅只是为了从手机的USB口取电。--这个ID接地,是让手机侧的U ...

: Z" B. |9 v2 S4 a: B( h/ W感谢回复,现在我已经理解清楚这个顺序了。手机确实作为Host
5 _- E) ]1 A4 R! ?! HD-的上拉电阻确实是告诉了手机有个低速设备插入。
5 h: X  j/ r0 q6 K# k8 ^! e7 M, cD+/D-由于不会同手机USB通信 因此可以说我的Device不是标准的USB外设,仅仅是从手机USB供电& `$ s9 a$ ~, k8 e, O* n
现在可以确保硬件连接上是没有问题的,只是没有通信!& Q; r& F7 n1 u& @3 A5 w- b' K
9 n% K4 N. X7 E' h
问题是:代码如何实现这个识别过程呢?0 {, q1 {. Z  `; Y, n6 l
附:一个参考代码 https://blog.csdn.net/chy555chy/article/details/52350810
  A8 }" F8 t$ u1 f9 c目前还是没有搞定。
/ P5 i7 D+ P' O1 Y. w3 R' i+ v我插入普通USB数据线,都可以观测到ACTION_USB_STATE =connectd 状态变化,但是连接我自己的设备却没有任何反应!
+ c( p0 S. B  D. c9 u/ H7 d




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