USB SCSI协议整个过程简介

原创 2015年07月09日 09:54:52

一.硬件连接

首先,你需要配置你所用芯片的相关USB寄存器值,保证相关功能都已经打开,例如USB PHY 寄存器,USB 中断寄存器等。

Function连接到Host端首先会收到Host端Reset信号,Function进行复位,要进行多次的复位,接着Host会发送Get descriptor(Device)进行首次设备描述符的获取。


二.USB枚举

如果你想确认硬件连接是否正确,可以通过USB协议分析仪,看看Host端是否发送了Get descriptor(Device)命令。Host端发送命令后开始正式的枚举。第一条命令刚才已经提到,当你成功向Host回完你的设备描述符后,Host 会对你的Function进行设置地址,以后就会这个地址进行通信(开始时候默认地址0进行通信)。这里要注意的是,你需要判断Setuppack(定义的请求的命令格式,是一个结构体),Setuppack.wLength与你的报告描述符的长度,因为一般端点Maxpack是64,而设备描述符等需要传输的长度小于64字节,所以你发送的长度应该是两者的小值。长度回应不对会导致Host端没有回应ACK。获取第一次设备描述符获取完毕之后,你就要对Set address请求进行回复,之后会进行这样一个过程:Device->config->Device->config->set config 过程,这里也要注意命令需要回复的长度。
if(setuppack.wLength>sizeof(Config_Description))
setuppack.wLength = sizeof(Config_Description);
最后Host端会发送请求:Get max lun 类请求。这个请求是获取最大逻辑单元。响应为一字节位(0~15)。如果你在BUS HOUND里看到CBW命令包的命令,那么说明前面枚举应该是成功了。
我总结的整个枚举过程应该是:Get descriptor(Device)->Set address(回复一个空包)->Get descriptor(Device)->Get descriptor(Configuration)->Get descriptor(Device)->Get descriptor(Configuration)->Set configuration->Get Max Lun->CBW。

三.USB SCSI(UFI)命令集

之所以我在括号里加了UFI,这是因为我看圈圈的书,在Host其实使用的UFI命令集,但是将接口子协议定义为UFI命令集,Host端电脑又不识别,然后又不是全是UFI命令集,这个比较怪,我也是暂时将他就看做SCSI命令集。关于CBW,CSW命令格式可以在网上查询一下,主要还是看标识头0x53425355。我认为需要的响应的命令主要有inquiry request(0x12),get configuration(0x46),mode sense10(mode sense6)(0x5a(0x1a)),read capacity(0x25),readtoc(0x43),read10(0x28),testunitready(0x00),
其他的命令我均回复了一个空包。这些命令响应全部正确的会,Host端会一直不断的发送testunitready(0x00)命令,我们只要一直响应这个命令就可以了。我是认为只要一直发送testunitready(0x00)就可以稳定的进行数据传输了吧。
这里注意一点,也是我这次第一次写USBSCSI协议最深刻的一点,那就是我将USB_SCSI_CBW处理函数放在了中断函数里去处理,导致会莫名其妙的出现大量的NAK,一直过不了0x28这条命令,我是这样认为的:SCSI协议是批量传输,中断的时间比在主程序while里的慢很多,所以在下一个中断来之前Function一直回复的是NAK,对于FS来说一帧是1ms,而一帧里面可以传输了多个事务,所以会回复大量的NAK(此处还望高人指点)。
最后总结3点:
1.Receive CBW,根据CBWCS[0],判断命令,再根据SCSI协议进行命令响应,最后发CSW。
2.对于命令响应了空包加CSW。
3.Host发完需要响应的命令一直会发送testunitready。
最后我利用公司测试工具进行传输测试,可以进行传输。(注:回调函数,return:终止剩下的程序) 
版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

linux C宏定义实现打印调试信息

本文仅实现了三种宏定义调试     #define LOG(s)                               &...

SCSI 命令构造应用:USB指纹模块

#include #include #include #include #include #include #include #include #include #...

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

SCSI指令格式详解

SCSI指令格式详解   原文地址:http://hi.baidu.com/rui2507/item/cae54dc249855a2847d5c048 UFI 命令 返回值(UFI C...
  • witxjp
  • witxjp
  • 2012-12-06 19:21
  • 12848

USB mass storage协议

主要把在实现“Linux模拟U盘功能”过程中的一些调试过程记录下来,并加以解析。 一、背景知识      1、USB Mass Storage类规范概述         USB 组...

USB与SCSI

USB传输协议中的行为分为四种:控制传输,批量传输,中断传输,同步传输。为什么叫做行为,很简单,因为所有操作USB的协议如:SCSI,HID,UVC协议等等。当然,USB底下的每一种协议都有他的特点,...

USB Mass Storage协议

简介 USB Mass storage Device协议即海量存储设备协议适用于硬盘,U盘等大容量存储设备。协议使用的接口端点有BulkIn、BulkOut和Interrupt端点。该设备类又包含6...

步骤一:申请域名

域名:域名就是地址了,地址得买才可以得到,类似于买房子,好的地段贵,不好的地段便宜,因此域名也有贵和便宜的,像.com .cn.org之类的都不便宜的,当然国内有免费的不好的域名.tk之类的或者二...

USB_SCSI之旅

现在总结一下scsi,scsi协议有很多,所以只总结这次在usb mass storage里面用到的协议,主要包括inquiry,format , read write等等命令。   下面会一个一...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)