打印
[USB接口]

请教有关usb调试问题

[复制链接]
3090|24
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 一骑红尘追梦中 于 2017-12-1 17:05 编辑

本人调试的是基于ThreadX系统下的USB模块,当把目标平台的USB端连接到主机上,其只能在Linux下枚举成功(现在不考虑其他系统),CDC类设备,且枚举默认为高速模式,故想问问大家(需要代码支持的再提供):
1)linux如何定位到USB设备的枚举过程吗?
2)若想将默认的高速改成低速或者全速,有什么方法吗?
问题也需没描述清楚,但有问题可再随时追问,期待各位的帮助,谢谢!

相关帖子

沙发
zhs2007| | 2017-12-3 10:17 | 只看该作者
单片机的USB外设一般可以禁用高速模式

使用特权

评论回复
板凳
一骑红尘追梦中|  楼主 | 2017-12-4 10:33 | 只看该作者
zhs2007 发表于 2017-12-3 10:17
单片机的USB外设一般可以禁用高速模式

首先谢谢您的回复!
其次,cdc类这类USB组合设备,在应用层函数中定义了高速、全速的描述符,我的这个接上主机就默认为高速模式,您说的禁用是怎么实现呢?
还有,USB设备的速率模式是在枚举的过程中被识别出来的,我看了一篇博客,上面似乎表明是通过USB包的同步字段(SYNC)的长度来决定,但这个同步字段是在描述符中定义的吗?

使用特权

评论回复
地板
zhs2007| | 2017-12-6 22:48 | 只看该作者
USB总线速度是在HOST发总线复位时,高速握手成功就高速,握手失败就全速,与同步字段以及描述符无关。设备与主机都使能了高速功能,高速握手才会成功。

使用特权

评论回复
5
zhs2007| | 2017-12-6 22:50 | 只看该作者
例如STM32F405,有一个寄存器配置后就可以禁止高速模式,高速握手就不会成功

使用特权

评论回复
6
一骑红尘追梦中|  楼主 | 2017-12-12 12:59 | 只看该作者
zhs2007 发表于 2017-12-6 22:50
例如STM32F405,有一个寄存器配置后就可以禁止高速模式,高速握手就不会成功 ...

在内核和设备初始化的函数中改了些寄存器,设备接上主机倒是默认全速模式,但枚举却失败,看来得往后看

使用特权

评论回复
7
一骑红尘追梦中|  楼主 | 2017-12-18 18:13 | 只看该作者
本帖最后由 一骑红尘追梦中 于 2017-12-19 17:26 编辑
zhs2007 发表于 2017-12-6 22:50
例如STM32F405,有一个寄存器配置后就可以禁止高速模式,高速握手就不会成功 ...

您好!想向您再请教一下,就是我的目标平台有USB OTG接口和串口接口,由于USB otg接口在应用程序中被定义成CDC类,Windows缺少相应的驱动,故调试方式是将串口连接Windows,USB OTG上接Linux系统。在应用程序中定义了设备框架高速描述符结构体和全速描述符结构体,且都有IAD描述符,连接到Linux时默认高速模式,且只有ACM设备:
[  390.636170] usb 2-3: new high-speed USB device number 3 using ehci-pci
[  390.769236] usb 2-3: config 1 interface 0 altsetting 0 endpoint 0x84 has an invalid bInterval 255, changing to 11
[  390.769247] usb 2-3: config 1 interface 1 altsetting 0 bulk endpoint 0x1 has invalid maxpacket 64
[  390.769256] usb 2-3: config 1 interface 1 altsetting 0 bulk endpoint 0x82 has invalid maxpacket 64
[  390.770227] usb 2-3: New USB device found, idVendor=xxxx, idProduct=xxxx
[  390.770234] usb 2-3: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[  390.770241] usb 2-3: Product: EL Composite device
[  390.770247] usb 2-3: Manufacturer: Expres Logic
[  390.770253] usb 2-3: SerialNumber: 0001
[  390.802450] cdc_acm 2-3:1.0: ttyACM0: USB ACM device
[  390.803234] usbcore: registered new interface driver cdc_acm
[  390.803238] cdc_acm: USB Abstract Control Model driver for USB modems and ISDN adapters
想请教的问题是:
1、如果想验证自己的目标平台是不是硬件支持低速模式,是不是得添加USB低速设备的描述符?
2、如果需要实现多路复用功能,最好是设计成复合设备,还是组合设备呢?
急需您的帮助,希望能得到您的回复,谢谢!

使用特权

评论回复
8
zhs2007| | 2017-12-19 00:47 | 只看该作者
本帖最后由 zhs2007 于 2017-12-19 00:53 编辑
一骑红尘追梦中 发表于 2017-12-18 18:13
您好!想向您再请教一下,就是我的目标平台有USB OTG接口和串口接口,由于USB otg接口在应用程序中被定义 ...

您好。
1. 如果要验证USB HOST是否支持低速模式,可以有下面几个办法:
(1)找个USB 低速DEVICE插上去看看能够识别。
(2)直接将D-用1.5K电阻上拉到3.3V,用示波器或逻分观察D+D-是否有总线复位信号,和1.5Mbps的低速信号翻转。
2. 对于单片机做USB DEVICE,可以通过多个接口来实现多个协议,应该是叫组合设备方式吧,容易混淆。就是一个设备地址,一个配置描述符,多个接口描述符。
另一种符合设备方式,需要USB HUB,但一般单片机不带HUB。
另外,USB总线的速度模式不是由描述符决定的。
设备刚插到USB总线上时,如果设备将D-拉高,主机就认为是低速设备,按照低速1.5Mbps通信。
如果设备将D+拉高,主机就认为是全速或者高速设备。
如果主机和设备都支持高速模式,则之后的高速握手成功,后续按照高速480Mbps通信。
如果有一方不支持高速模式,则之后的高速握手不成功,后续按照全速12Mbps通信。

使用特权

评论回复
9
一骑红尘追梦中|  楼主 | 2017-12-19 09:24 | 只看该作者
zhs2007 发表于 2017-12-19 00:47
您好。
1. 如果要验证USB HOST是否支持低速模式,可以有下面几个办法:
(1)找个USB 低速DEVICE插上去看 ...

感谢您的回复!
对于1:
(1)因为我的目标平台上的USB OTG接口是个mini-usb接口,然后使用串口接口连接上Windows主机,接USB低速设备的话,就算用otg线接一个设备,似乎也没法接到主机上......
(2)拉电阻信号,这个是要在硬件上修改吗?若修改寄存器配置也行的话,有个疑问,在应用程序里只定义了设备框架高速和全速的描述符结构体,若要检测低速,是不是自行添加低速描述符结构体?USB是定义成CDC类,那低速描述符随便找一种设备的描述符就行吗?
协议上虽说从电阻上拉的信号来判定全速和低速,但没有定义低速描述符结构体,设备也可以使用低速模式吗?
对于2,:
现在已经确定是实现组合设备,您做过这方面的试验吗?主要是从修改描述符以及相应设备类的协议入手吗?

使用特权

评论回复
10
zhs2007| | 2017-12-19 09:30 | 只看该作者
你的USB OTG是做HOST还是DEVICE?

使用特权

评论回复
11
一骑红尘追梦中|  楼主 | 2017-12-19 09:54 | 只看该作者
zhs2007 发表于 2017-12-19 09:30
你的USB OTG是做HOST还是DEVICE?

刚想编辑上面的回复说一下,我这个是作为从设备的

使用特权

评论回复
12
一骑红尘追梦中|  楼主 | 2017-12-19 10:29 | 只看该作者
本帖最后由 一骑红尘追梦中 于 2017-12-19 10:41 编辑
zhs2007 发表于 2017-12-19 09:30
你的USB OTG是做HOST还是DEVICE?

对于组合设备和复合设备,真的有点混,我在一篇博客上看到“CDC接口本身是一个由usbccgp.sys以特殊方式设计和处理的复合USB设备”,而Windows下虽然没有驱动,但可以识别出是composite device...在程序中定义的高速和全速中的设备以及配置描述符都不一样,但都定义了相同的IAD和CDC功能描述符,且高速和全速的设备描述符都不一样,但VID与PID都一致,根据协议,这指的就是组合设备吗???请指点迷津,谢谢!

使用特权

评论回复
13
zhs2007| | 2017-12-19 18:12 | 只看该作者
本帖最后由 zhs2007 于 2017-12-19 18:14 编辑

要确定DEVICE是否支持低速,那只有看手册或咨询厂家了
全速与高速描述符不同主要区别应该在于端点最大包长度和USB版本号字段
不用太纠结于容易混淆的组合与复合名称,USB DEVICE可以通过多个接口来实现多个协议功能

使用特权

评论回复
14
一骑红尘追梦中|  楼主 | 2017-12-19 19:48 | 只看该作者
zhs2007 发表于 2017-12-19 18:12
要确定DEVICE是否支持低速,那只有看手册或咨询厂家了
全速与高速描述符不同主要区别应该在于端点最大包长 ...

组合和复合就不纠结了,就是那个描述符有点疑问,高速和全速描述符中,设备和配置描述符是不同的,定义了相同的IAD,且IAD中定义的功能类都是CDC类,并且定义有CDC类功能描述符.....那在接入主机后,如果默认高速模式,是只会在高速和全速描述符结构体其一种提取描述符吗?还是因为是组合设备,会同时在两个结构体中提取描述符?

使用特权

评论回复
15
zhs2007| | 2017-12-20 10:09 | 只看该作者
HOST在获取描述符前,会先进行高速握手,如果握手成功,DEVICE后续就返回高速描述符,如果握手失败,DEVICE后续就返回全速描述符。
两套描述符不会同时使用。

使用特权

评论回复
16
一骑红尘追梦中|  楼主 | 2017-12-20 11:33 | 只看该作者
zhs2007 发表于 2017-12-20 10:09
HOST在获取描述符前,会先进行高速握手,如果握手成功,DEVICE后续就返回高速描述符,如果握手失败,DEVICE ...

在这跟您描述一个现象:
将目标平台用串口与Windows主机连接,主要是需要将整个系统烧录到目标平台里并运行起来,这样的话,当目标平台在通过USB OTG接口与Linux主机或者Windows主机相连时,目标平台才能具备作为一个USB从设备的资源和功能。
当作为从设备与Windows主机连接时,在设备管理器中有USB Composite device,而EL Composite device有感叹号,应该是因为找不到驱动......而根据UsbTreeView软件查看,在一个USB根集线器的一个端口上挂着USB Composite device-EL Composite device,查看其描述符,其首先是提取了高速描述符结构体,而全速描述符结构体除了设备与配置描述符,其他描述符也都被提取,这样可以判断USB Composite device对应着高速描述符结构体,而EL Composite device对应着全速的吗,就是因为缺少EL Composite device的驱动,所以没有全速描述符结构体中的设备与配置描述符.....而之所以两个描述符结构体都被返回,则是因为设置成组合设备......这样对吗?

使用特权

评论回复
17
zhs2007| | 2017-12-20 12:10 | 只看该作者
对于USB DEVICE,全速与高速是两套描述符,根据高速握手结果,只会选择其一。
不同接口使用的是同一种总线速度。

使用特权

评论回复
18
一骑红尘追梦中|  楼主 | 2017-12-20 14:10 | 只看该作者
zhs2007 发表于 2017-12-20 12:10
对于USB DEVICE,全速与高速是两套描述符,根据高速握手结果,只会选择其一。
不同接口使用的是同一种总线 ...

如果是这样,那接在Windows主机上,USB Composite device-EL Composite device驱动怎么还会请求设备返回全速描述符结构体中的IAD、CDC功能、端点以及接口等描述符呢?这处有点疑惑

使用特权

评论回复
19
zhs2007| | 2017-12-20 16:54 | 只看该作者
HOST端获取描述符时,不会指定是获取全速描述符,还是高速描述符,USB协议中也没有这样的字段可以指定。
另外,当一个USB DEVICE插到WINDOWS后,不管是那种协议类型,WINDOWS都会获取设备描述符,配置描述的。
建议你首先确认一下USB总线是工作于全速模式,还是高速模式?插到WINDWOS时你预期返回的描述符是怎样的?实际返回的描述符是怎样的?

使用特权

评论回复
20
一骑红尘追梦中|  楼主 | 2017-12-21 10:06 | 只看该作者
zhs2007 发表于 2017-12-20 16:54
HOST端获取描述符时,不会指定是获取全速描述符,还是高速描述符,USB协议中也没有这样的字段可以指定。
另 ...

昨天用tcpdump和wireshark获取包,分析数据包,发现确实只读取了高速描述符,设备确定是工作在高速模式下
那在这想问下,如果实现组合设备(假设两个USB设备),是不是只能同时实现高速设备,或低速设备呢?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

13

主题

45

帖子

0

粉丝