
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 逻辑单元描述信息数据结构