usb mass storage设备枚举过程

      8月份从PC开发岗位换到底层嵌入式驱动开发来了。接到的第二个活,是在高通8650平台上实现驻留支持SCSI指令。8650平台是高通推出的EVDO RevB的双核平台,和之前6085相比性能更强,软件结构也有了大的变化。就拿我要实现的这个功能来说,之前6085的驻留文件部分,USB部分处理基本可以采用自己逻辑实现。但是8650就不太好处理了,因为它走的是高通的HSU方式。这个新机制的特点就是层次分明:分为硬件层、适配层、逻辑层。每一层分别处理各层的事情。幸好我是从上层应用转下来的,对于抽象、分层这类事情,还比较适应。否则一开始还就傻眼了。不过我开始还是傻眼了,因为没有完整的文档介绍这块东西。后来终于在同事的指导下配置好了Usb mass storage设备。只不过,设备出来的时候,由于不符合usb mass stroage设备的上报规范,导致设备枚举出错。

      后来经过对比其他设备的bushund抓包数据,终于搞清楚了一个usb mass storage设备枚举的过程。枚举过程的细节理论知识,网络上一堆堆的,而且别人描述的应该比我好,所以我就不在此赘述。只记录一下我刚开始没有理解的部分。枚举过程其实很简单:主机首先发送一条获取设备描述符的指令给设备,设备上送设备描述符给主机。接着主机再查询设备配置描述符集。该配置描述符集,除了包含配置描述符外,还包含接口描述符和端点描述符。之前我就是没有搞清楚这一点,总是没有理解什么地方是接口描述符,什么地方是端点描述符。一旦,所有的描述符信息上报符合usb mass storage设备标准后,则设备管理器中会出现一个磁盘设备的图标。如果在这个过程中,设备管理器中出现黄色惊叹号,或是提示需要安装驱动,则说明枚举过程有问题。如果是usb mass storage设备,从bushund中可以看到主机给设备发送setconfig和getmaxlun指令。如果设备是端口,则只会发送setconfig指令。之前由于usb设备处理指令不正确,导致枚举上报为设备描述符不符合usb mass storage设备标准,主机只发送了setconfig指令,并将下面的设备识别为端口。但同时,设备管理器中的“通用串行总线控制器”中还是有一个mass storage设备的图标。所以usb设备枚举过程的指令在驱动中需要注意实现。现在u盘功能已经实现了,接下来就是要处理自己的SCSI指令了。目前碰到的问题是:SCSI指令已经接收到,但是DMA中的数据没有收到。接下来的工作任务就是需要判断为什么DMA的缓冲区数据为什么为空。处理过程和办法,下次再记录。

你可能感兴趣的:(usb mass storage设备枚举过程)