rangzh
驱动小牛
驱动小牛
  • 注册日期2005-04-24
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望150点
  • 贡献值0点
  • 好评度115点
  • 原创分0分
  • 专家分0分
阅读:4381回复:3

usb bulkin错误请教

楼主#
更多 发布于:2007-08-22 16:36
BulkIn采用完成函数来读取数据

如果在未开机前将设备插入USB插槽,然后启动计算机,驱动加载,则总是出现错误。第一次的错误是USBD_STATUS_XACT_ERROR(c0000011),之后的错误全部都是USBD_STATUS_BABBLED_DETECTED

奇怪的是,如果先启动计算机,再将设备插入,加载驱动,则一切OK

不知哪位仁兄还碰到过,请指教
rangzh
驱动小牛
驱动小牛
  • 注册日期2005-04-24
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望150点
  • 贡献值0点
  • 好评度115点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2007-08-24 01:34
问题解决了,固件的bug

当随着计算机一起启动时,2.0的控制器枚举时,固件没有返回描述符,可固件却按照2.0来操作,BulkIn最大包长512;而驱动得到的信息则是1.1版本。因此驱动一进行bulkin就产生C0000012
lejianz
驱动中牛
驱动中牛
  • 注册日期2003-03-05
  • 最后登录2023-11-15
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望145点
  • 贡献值0点
  • 好评度116点
  • 原创分0分
  • 专家分0分
  • 社区居民
板凳#
发布于:2007-08-24 09:44
引用第1楼rangzh于2007-08-24 01:34发表的  :
问题解决了,固件的bug

当随着计算机一起启动时,2.0的控制器枚举时,固件没有返回描述符,可固件却按照2.0来操作,BulkIn最大包长512;而驱动得到的信息则是1.1版本。因此驱动一进行bulkin就产生C0000012



没有明白你的问题原因所在. 能否说得更清楚些.
一起交流,共同提高!
rangzh
驱动小牛
驱动小牛
  • 注册日期2005-04-24
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望150点
  • 贡献值0点
  • 好评度115点
  • 原创分0分
  • 专家分0分
地板#
发布于:2007-08-24 18:04
引用第2楼lejianz于2007-08-24 09:44发表的  :



没有明白你的问题原因所在. 能否说得更清楚些.


问题是这样的,一个USB设备:
  • 如果在主机启动前将设备插入主机,然后主机启动,等Windows启动后,发现设备BulkIn错误

  • 如果先不插入设备,等主机启动,WIndows启动后在插入设备则工作正常



为了确认是固件还是驱动的问题,就第一种情况做了几个测试:

  • 1. 不安装驱动,在主机启动前插入设备,等Windows启动后在安装驱动,问题依然

  • 2. 在主机启动前插入设备,等Windows启动后,卸载驱动,确认已经卸载后,在重新安装驱动,问题依然



大致可说明问题跟驱动无关,在驱动运行前下面的设备已经有问题。

出现的BulkIN错误为USBD_STATUS_BABBLE_DETECTED,google了一下,开始时不甚明白网上的说法。

用BUS hound抓了一下,发现出错情况下报告上来的设备描述符版本是1.1;而跟踪固件,发现固件里面却当成是高速设备(2.0)

错误的原因在于固件代码的一个bug:
固件里面维护了一个全局的描述符表,初始化成为2.0。但是在主机读取设备描述符时,固件会根据硬件的一个设备状态寄存器判断是1.1还是2.0;如果是1.1,则把那张全局描述符表改成1.1版的描述符,而如果是2.0,固件却认为默认值就是2.0,所以不用改了。

当设备在主机启动前插入时,大概BIOS会枚举一次,读描述符,此时固件修改全局描述符表为1.1;而Windows起来时,2.0的HC又读描述符,此时虽然固件根据设备状态寄存器判断出是2.0,但是因为全局描述符表已经改成了1.1版的,所以返回的还是1.1的描述符表。如此导致驱动认为设备是1.1,而固件则按照高速设备操作,问题产生。
游客

返回顶部