MEMRORY STICK标准综述
表4.2 DFU功能描述符
4.2
DFU模式描述符
在主机和设备达成一致执行DFU操作后,主机重新列举设备。这个时候设备使用的就是DFU模式下的描述符,包含有: ? DFU设备描述符 ? 单独的配置描述符
? 单独的接口描述符(包括了描述符和交替设置) ? 单独的功能描述符
设备只有在重新配置以后才会使用这些描述符。原因就是为阻止主机操作系统加载其他设备驱动。
4.2.1
DFU模式设备描述符
这个描述符只在DFU模式描述符状态中出现。
普天信息技术研究院 机密
第 10 页
MEMRORY STICK标准综述
表4.3 DFU设备描述符
4.2.2
DFU模式配置描述符
DFU模式配置描述符是同USB1.0规范中定义的标准配置描述符是一样的,除了bNumInterfaces域必须包含值01h外。 4.2.3
DFU模式接口描述符
这个接口描述符只存在于DFU模式操作时。所以bInterfaceNumber域总是为0。
普天信息技术研究院 机密
第 11 页
MEMRORY STICK标准综述
表4.4 DFU模式接口描述符
4.2.4
DFU功能描述符
这个描述符同运行DFU功能描述符是一样的,细节见4.1.3。
5
重配置阶段
操作者通过执行主机上的应用程序开始固件升级的操作。这个应用程序要求操作者指出需要升级的设备和将要传输到设备中的固件映像文件。也就是说,操作者需要告知应用程序“下载哪个文件到哪个设备”。
更多关于文件后缀和文件同设备兼容的内容请参阅附录B。
一旦操作者指定了设备和文件后缀以后,主机和设备即同意执行升级。其流程为: ? 主机通过控制端点EP0发出DFU_DETACH请求。 ? 主机向设备发出USB重置请求。
? 设备列举出DFU模式下的描述符,如前所述。
5.1
DFU_DETACH请求
当bmAttributes(bitWillDetach)的bit 3设定为1时,设备接收到请求,将在总线上产生一个detach-attach序列(表明此时主机不能发出USB重置的请求,设备正在执行其他的操作)。否则,设备启动一个定时器开始计时,以毫秒为单位,在wDetachTimeout域。如果设备在定时器运行的时候检测到一个USB重置的请求,切换到DFU操作模式,例如当USB重置信号检测到,设备将切换到DFU模式并且停止计时器。
* wTimeout域以毫秒为单位,表示设备在放弃和中止操作前等待USB重置请求的时间。WTimeout的值不能大于wDetachTimeout中的值。
普天信息技术研究院 机密
第 12 页
MEMRORY STICK标准综述
图5 在重配置阶段一个状态转变的示例
6
传输阶段
设备处理完USB重置并且设备使用DFU模式下的描述符以后,传输阶段开始。无论是固件下载还是固件上传都在这一阶段发生。
6.1
下载
设备的固件映像文件由卖方定义。目的地址、大小和一些支持升级的其他相关信息都压缩在固件映像文件中。保证设备能够使用这些压缩数据是设备生产商和固件开发商的责任。除了DFU的文件后缀,固件映像文件的内容同主机是不相关的。主机只是简单的将映像文件分割成N份,并通过在默认控制端点上的控制写操作这样的方法将它们发送出去。 N= ( ( F-S ) / O ) + 1
其中,F是文件大小,单位为字节,S为后缀大小,单位为字节,O为传输的大小,单位为字节。
主机通过发送有效载荷数据包传输,直到整个文件全部传完或者设备出错。
设备使用标准的NAK机制来进行流程控制,在不变地址上的内容升级的时候。当设备报错时,它通过发出一个停止握手来通知主机。然后主机发送一个DFU类规范请求,称为DFU_GETSTATUS,来确定问题的性质。
设备从主机接收固件下载有三种普通机制:
1 第一种机制将接收整个映像文件放到内存中,并在显示阶段执行实际的程序。 2 第二种机制是累积一个块大小的固件数据,擦除一块相同大小的块内存,将固件数据向擦除内存中写入。
3 第三种机制是第二种机制的变化形式。在第三种方法中,一份大的内存被擦除,小块的固件被一次一块的写入到擦除的内存中。当等待更新的文件大小大于缓存的大小,无法一次将程序文件写入存储空间,就使用较小的缓存一次次搬运程序文件,边接收,边写入。
这三种机制的运用与取舍由主机驱动程序状态图,动态状态问讯时间间隔,和缓存有效记录次数三个因素决定。关于bwPollTimeout,的更多内容请参考DFU_GETSTATUS请求。关于DFU文件后缀的更多内容请参阅附录B。
6.1.1
DFU_DNLOAD请求
第 13 页
普天信息技术研究院 机密
MEMRORY STICK标准综述
主机发出DFU_DNLOAD类规范请求,将固件映像通过控制写操作进行传输下载。设备在功能描述符的wTransferSize域规定了每次传输的最大字节数。主机在一个控制写传输中发送给设备的数据大小在bMaxPacketSize0和wTransferSize字节之间。在每次下载一个块大小后,主机通过发出DFU_GETSTATUS请求查看设备状态。 在最后一个块传送给设备并且设备进行状态检查后,主机发送一个DFU_DNLOAD请求,这个请求的wLength域清除为0,然后重新再检查一次状态。如果状态为设备已经准备好,并且没有错误,这样传输阶段就算完成,显示阶段开始。然而,一些设备可能会缓存整个固件映像文件,在dfuMANIFEST状态时进行程序运行。在显示阶段,可能一些设备在执行重编译操作的时候不能进行USB通信。BmAttributes域的bitManifestationTolerant位需要清零来告知主机并阻止主机向设备发送数据在显示阶段。
* wBlockNum域记录的是块数字,当传输完一块后,wBlockNum增加1。范围是从0到65,535。用来给DFU装载提供有用的信息。 **wLength域表明了传输的总的字节数,在USB规范中定义。这个值不能超过wTransferSize域中的值。
图6.1 使用DFU_DNLOAD来发起一个传输的状态转变的示例
6.1.1.1 0长度DFU_DNLOAD请求
主机向设备发送一个DFU_DNLOAD请求,wLength域清零来表示已经完成固件映像文件的传输。这是下载操作的最后一个有效负载数据包。
图6.2 使用0长度的DFU_DNLOAD来中止下载
普天信息技术研究院 机密
第 14 页