4.2 传输层的实现
传输处理层用于处理命令块,包括主机传输命令块到大容量类设备、主机与大容量设备之间的数据传输和主机接收命令块处理状态。大容量类设备传输协议分为Bulk-Only协议和 CBI-Only协议。该层为命令层提供了命令块处理函数的统一接口,使命令层不需理会当前大容量类设备的传输协议。
传输层接收由协议层包装好的命令块,根据已注册的Mass Storage Class设备的信息,采用单批量(Bulk Only)传输模式从批量输出端点(Bulk Data Out Endpoint)传输出去。类似,也可以从批量输入端点(Bulk Data In Endpoint)接收数据,向上传递到协议层解析。
4.3 USB主机协议栈的实现
在U盘连接到USB电缆上后首先为ISP1160注册一个Root Hub Class,再为U盘注册一个Mass Storage Class的设备。接着,为了检测U盘的连接,启动查询当前状态的Host_Serve的任务。当ISP1160 与U盘连接后,ISP1160通过中断通知20B,20B进入中断服务程序改变当前状态。在Host_Serve任务中检测到状态的改变,开始USB协议的通信。至此,U盘(USB Mass Storage设备)注册完成(大容量类相关代码见程序清单3.1,3.2,表2)。由此以后,FAT32文件系统所要对U盘进行的操作都经过Bulk-Only传输完成。
typedef struct MASS_STORAGE_CLASS
{ unsigned char LUN;/* 该设备的逻辑单元数*/
struct _HMEDLUN *LUN_infor_ptr[MAX_MASS_LUN]; /* 逻辑单元描述信息结构指针 */
device_instance *dvi_ptr;
/*设备信息描述结构指针*/
endpoint_info *setup_epi_ptr;
/*控制端点描述信息结构指针*/
transfer_instance *tr_bulk_in_ptr;
/*批量输入传输描述符*/
transfer_instance *tr_bulk_out_ptr;
/*批量输出传输描述符*/
transfer_instance *tr_int_in_ptr;
/*中断输入传输描述符CBI-Only 使用*/
unsigned char SubclassCode;
/*子类代码*/
unsigned char ProtocolCode;
/*传输协议代码CBI或BULK*/
unsigned char *CBW_BuffPtr;
/*批量传输的命令包缓冲区指针*/
unsigned char RBC_BuffPtr[12];
/*命令设置缓冲区*/
}MassStorageClass,*PMassStorageClass;
程序清单3.1 大容量设备描述信息数据结构
typedef struct _HMEDLUN
{ unsigned char LUN;
//所在大容量设备的逻辑单元号
MassStorageClass *MSC;
//大容量设备的描述信息结构
unsigned char VendorInfo[8];
//厂商信息
unsigned char ProductInfo[16];
//产品信息
unsigned char ProductRev[4];
//产品版本
unsigned int LastLogicalBlookAddress;
//最后逻辑块地址
unsigned int BlockLengthInBytes;
//逻辑块长度
}hMedLUN;
程序清单2.2 逻辑单元描述信息数据结构