Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1379613
  • 博文数量: 860
  • 博客积分: 425
  • 博客等级: 下士
  • 技术积分: 1464
  • 用 户 组: 普通用户
  • 注册时间: 2011-08-20 19:57
个人简介

对技术执着

文章分类

全部博文(860)

文章存档

2019年(16)

2018年(12)

2015年(732)

2013年(85)

2012年(15)

我的朋友

分类: LINUX

2015-03-14 16:47:33

我们的平台usb设备电源是上电后就一直供应的,这样造成了一些上电前插入的USB设备在系统启动后无法识别,必须重新插拔一次.有些设备又可以正常识别.
DEBUG usb 驱动发现,usb驱动在初始化的时候会查询每个端口的状态,并且会尝试枚举设备,但是上电前插入的设备在GetDescriptor的时候会失败,失败后 usb驱动会执行ResetAndPoweronPort,再进行尝试,在失败3次以后就会DisablePort,造成无法识别设备. 重新插拔一次后,在GetDescriptor的时候就可以正常返回,枚举设备成功.
现在硬件已经做好,没有办法通过控制usb电源,或者拉低拉高数据线来模拟usb插拔.有没有人遇到过这种问题,有没有什么通过修改usb驱动的办法能解决它呢.

I am running Windows CE 5.0 with all available QFEs (including January 2008)
on a Samsung SMDK2410 CPU.

I have a problem with the USB OHCI (1.1) Host Controler:
-start device with a USB device attached to the single OHCI (USB 1.1) Host
Controller port
-occasionally (approximately 5-10 times out of 400 starts) the USB device is
not recognized

The problem occurs in the CHub::AttachDevice() function
(…\DRIVERS\USB\HCD\COMMON\cdevice.cpp):
-in the state machine in the
DEVICE_CONFIG_STATUS_SCHEDULING_GET_DEVICE_DESCRIPTOR_TEST step, I get an
USB_DEVICE_NOT_RESPONDING_ERROR (= 0x5).
-now the state machine goes back to the
DEVICE_CONFIG_STATUS_RESET_AND_ENABLE_PORT state and tries 2 more times
-ultimately after the 3 reties get the same error message the attach fails

The only way that I found to fix that problem is:
-physically unplugging the USB device and plugging it back in
-rebooting the system

Both solutions are not an option for me!

I also tried:
-more reties (10)
-timeout (100ms) before each retry
-powering off and repowering USB port between the reties
-making CHub::HubStatusChangeThread() belief the device was unplugged so do
a DetachDevice() and then (even after powering off and repowering the USB
port) let CHub::HubStatusChangeThread() do the AttachDevice() again

With all of these attempts the problem persisted: the device descriptor
could not be retrieved and the attach failed.

Any help is appreciated

Thanks
-Jochen
还有就是用下面这个比较好!: Sleep(m_portBase->HcRhDescriptorA.POTPGT * 2); Sleep(m_portBase->HcRhDescriptorA.POTPGT * 2);
阅读(891) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~