命令发送全过程完毕,当需要数据输入/输出时,设置主机发送IN/OUT PID请求,设备按照请求通过BULK-IN/OUT端口传输数据,每次发送的字节数根据设备描述符所定义的端口最大吞吐量。
1.2 CBI设备描述符及枚举过程
按照USB协议,所有USB设备接入主机后,主机进行设备枚举,识别此设备属于USB范畴的哪一类,以及该类型中的哪一子类;然后对此设备进行配置,直到该设备能进行正确读写。这些枚举信息都已固化在USB设备中,主机只进行提取操作。
CBI协议存储设备支持很多描述符,主要且必须支持下列USB描述符:
①设备描述符(device descriptor)
②配置描述符(configuration descriptor)
③接口描述符(interface descriptor) CBI存储设备至少应支持1个数据接口。
④端点描述符(endpoint descriptor) 除用作初始化和命令传输的控制端口Endpoint 0外,CBI存储设备还必须支持批量输入、批量输出、中断3种端点,配置、接口、端口描述符是在主机一次请求时接收的。
当某设备描述符被识别为mass storage device类CBI设备子类后,主机进行第2次枚举,对设备进行相关配置和初始化。具体枚举过程通过第1次枚举所配置的端口,发送相关请求命令,进行初始化的数据输入/输出。具体函数及功能如下:
2 USB 软驱主机程序设计
2.1 开发平台介绍
开发平台主要包括:
①MCU S3C24IOA(绣花机主芯片)
②USB芯片 SL811HS
③开发语言 嵌入式C语言
④编译环境 CodeWarrior for ARM Developer SuiteVl.2
⑤仿真器 Magic-ICE
⑥USB软驱类型 SONY MPF82E-U1磁盘驱动器
2.2.1 USB设备的枚举
USB软驱首先要进行设备枚举,主机通过控制端口0向设备发送DeviceRequest命令。DeviceRequest命令主要有Get_Descriptor,Set_Address,Set_Config,Set_Interface等,而Get_Descriptor描述符又可分为Device_Descriptor、Configuration_Descriptor、Interface_Descrip-tor、Endpoint_Descriptor,枚举阶段所有的请求都是基于setup ID。根据不同的请求命令,配置相应的协议栈。以下是配置接收描述符的部分参数,以设备描述符为例:
配置请求参数完成以后,利用USB数据传输函数usbXfer()来传输该请求。usbXfer()必须完全遵循USBl.1协议。该函数具体算法流程如图1所示。
2.2.2 大容量存储设备的枚举
此阶段任务的中心是对主机发送UFI命令的处理。ADSC请求是UFI命令的前导,通过控制端口0以setup数据包发送,接着仍通过端口0以数据包的形式发送UFI命令包。命令包均为12字节,发送前暂存在ufi[]数组中。以CBI_Read(unsigned long lba,unsigned charlen,unsigned char* pBuffer)函数为例叙述命令发送过程,其他枚举函数实现基本原理相同。CBI_Read()函数读取扇区数据到指定数组,源程序如下: