文章目录

  • 1.简介
  • 2.U盘(mass storage device)
    • 2.1 描述符
    • 2.2 类特殊请求
      • 2.2.1 Bulk Only Mass Storage Reset
      • 2.2.2 Get Max LUN
      • 2.2.3 伪代码
    • 2.3 Bulk-Only
    • 2.4 SCSI
      • 2.4.1 INQUIRY
      • 2.4.2 READ FORMAT CAPACITIES
      • 2.4.3 READ CAPACITY
      • 2.4.4 READ(10)
      • 2.4.5 WRITE(10)
      • 2.4.6 REQUEST SENSE
      • 2.4.7 TEST UNIT READ
      • 2.4.8 伪代码
  • 3.参考文档

1.简介

  前面我们介绍了USB的枚举,还没真正与产品挂钩,生活中常用的USB设备大家都很熟悉,键盘、鼠标、U盘,USB设备分为5大类:显示器、通信设备、音频设备、人机输入、海量存储。今天我们来看下U盘的使用,即海量存储设备,在4种传输方式中使用批量传输方式。

2.U盘(mass storage device)

2.1 描述符

  在USB协议中规定了大容量存储设备,大容量设备有很多种,U盘就是其中一种,bInterfaceClass字段为0x08,bInterfaceSubClass有好几种,但大部分U盘都使用0x06,即SCSI命令集,bInterfaceProtocol字段有3种:0x00、0x01、0x50,前两种需要使用中断传输,最后一种使用批量传输,一般使用批量传输。用描述符软件查看U盘如下所示,关键字段用了红色方框:

2.2 类特殊请求

  U盘枚举的时候除了有前面说到的标准设备请求外,在Bulk-Only协议中定义了两个类特殊请求:Bulk-Only Mass Storage Reset和Get Max LUN。前者是复位到命令状态的请求,后者是获取最大逻辑单元请求。

2.2.1 Bulk Only Mass Storage Reset

2.2.2 Get Max LUN

2.2.3 伪代码

  接上一节的控制传输流程添加代码:

//控制传输流程
void usb_control_transmit()
{usb_ctl_req req;static int state;if(state == 建立过程){//读8个字节长度请求usb_read_ep0(&req, 8);switch(req.bmRequestType & 0x1f){case DEVICE:SET_ADDRESS:结束流程,没有数据过程;break;                    GET_DESCRIPTOR:设备、配置、接口描述符;state = 数据过程;break;case INTERFACE:switch(req.bmRequestType & 0x60){case Standard:break;case Class:switch (req.bRequest){case Bulk Only Mass Storage Reset:初始化端口状态,准备接收命令。break;case Get Max LUN:返回最大逻辑单元。break;default:break;} break;default:break;   }break;case ENDPOINT:break;default:break;}  }else if(数据过程){发送数据/接收数据;数据发送完成/接收完成结束;}
}

2.3 Bulk-Only

  在接口协议类型中指定了协议使用批量传输Bulk-Only,Bulk-Only协议也有像控制传输的三个过程:命令阶段、数据阶段、状态阶段(相当于封装了3个批量传输),在命令阶段使用命令块封包CBW(Command Block Wrapper),在状态阶段使用CSW(Command Status Wrapper)来回复,它们的格式如下所示:

2.4 SCSI

  我们知道了传输协议Bulk-Only,但还需要知道传输协议的格式scsi是如何的(虽然在接口子类定义的是SCSI,但实际上是使用UFI命令集),U盘中常用的只有几个:INQUIRY、READ CAPACITY、READ、WRITE等。

2.4.1 INQUIRY

命令请求目标设备的一些基本信息。

2.4.2 READ FORMAT CAPACITIES

表示设备智齿最大的格式化容量,容量=块数*每块字节数,通常每块字节数为512。

2.4.3 READ CAPACITY

读容量命令可以让主机读取到当前存储媒介的容量。

2.4.4 READ(10)

读出取存储设备数据。

2.4.5 WRITE(10)

写入存储设备数据。

2.4.6 REQUEST SENSE

用来探测上一个命令执行失败的原因,主机可以在每个命令之后使用该命令来读取命令执行情况。

2.4.7 TEST UNIT READ

TEST UNIT READY命令用来测试设备的某个逻辑单元是否准备好,如果准备好则在状态阶段返回执行成功,如果没准备好则返回执行失败,当主机使用REQUEST SENSE命令来探测错误原因的时候,设置Sense Key为NOT READY。

2.4.8 伪代码

void mssstorage_device(){//1.获取cbw,31字节cbw = get_cbw();//2.判断操作码switch(cbw.optcode){case INQUIRY:break;case READ FORMAT CAPACITIES:break;case READ CAPACITY:break;case READ10:break;case WRITE10:break;case REQUEST SENSE:break;case TEST UNIT READ:break;default:break;}//3.发送csbsend_csb(csb);
}

3.参考文档

USB官网:https://www.usb.org/
usbmass-ufi10.pdf
usbmassbulk_10.pdf

4.USB详解(U盘)相关推荐

  1. 详解C盘Windows文件夹里重要文件的作用

    详解C盘Windows文件夹里重要文件的作用 在整个Windows操作系统中,最重要的莫过于"Windows"文件夹,对电脑进行任何操作几乎都有关.了解这里对于掌握整个系统的运作有 ...

  2. 详解C盘Windows文件夹

    详解C盘Windows文件夹里重要文件的作用 在整个Windows操作系统中,最重要的莫过于"Windows"文件夹,对电脑进行任何操作几乎都有关.了解这里对于掌握整个系统的运作有 ...

  3. 芯片读取设备详解+U盘芯片flash读取分析实录_一篇看够

    当我们在分析 IOT 设备,如智能摄像头.智能门锁.智能路由器等等产品时,采用传统的安全检测手段,如对 APP 的逆向.云端服务器的渗透测试.产品通信的抓包等方式可以获得部分的信息,但如果需要深入分析 ...

  4. 详解u盘装系统启动不了怎么办

    u盘装系统比较简单,也是比较常用的重装系统的方法,但是在使用过程中可能会因为各种问题导致重装失败.最近就有网友说自己的u盘装系统启动不了怎么办,今天小编就给大家分享下u盘装系统无法启动u盘启动项进pe ...

  5. 详解u盘怎么重装系统win7,u盘一键安装win7

    当win7系统出现蓝屏,死机等故障问题无法修复的时候,可以借助u盘重装win7系统的方法修复解决.那么怎么重装系统win7呢?下面就教下大家具体的u盘重装win7系统教程. 1.将制作好的大白菜u盘启 ...

  6. 详解C盘Windows文件夹里重要文件作用

        在整个Windows操作系统中,最重要的莫过于"Windows"文件夹,对电脑进行任何操作几乎都有关.了解这里对于掌握整个系统的运作有很大的作用,如果有兴趣不妨往下看看. ...

  7. 详解U盘怎么装windows7系统

    尽管微软停止了win7系统的更新和服务,但是不少网友习惯使用win7系统,因此想用u盘给电脑安装win7系统.那么U盘怎么装windows7系统呢?我们可以借助工具制作启动盘安装实现,下面小编给大家演 ...

  8. USB详解(二)-电气特性篇

    USB涉及的知识很多,usb2.0协议规范就有650页,英文文档全部读下来也很头大.关于不同同业者应该选取自己领域进行详细阅读.关于USB2.0协议规范中具体包含如下: 综上我们可以看出: 对于USB ...

  9. 1.USB详解(简介)

    文章目录 1.USB简介 2.USB的电气特性 3.USB最小传输单元:包 3.1 usb包的构成 3.2 令牌包,启动一次USB传输 3.3 数据包,数据传输 3.4 握手包,传输是否被对方确认 3 ...

最新文章

  1. micro850通讯协议msg_micro850通讯协议msg_半导体semi通讯的协议SECS/GEM
  2. LeetCode Count Numbers with Unique Digits(计数问题)
  3. wordcloud库
  4. Redis分布式锁解决抢购问题
  5. 进程的控制——获取系统进程信息
  6. 微信生态圈盈­利模式分析
  7. 绘制等压面图_等压面练习
  8. 小白怎么学习云计算?2020云计算学习大纲
  9. [zabbix][问题解决]监控项 Received value [] is not suitable for value type [Numeric(float)]
  10. 【超详细转】VMware 9 安装 Mac OS X 10.8 Mountain Lion 图文全程
  11. 进销存php 百度云盘,fb1334 PHP网络版进销存源码WEB进销存源码含说明
  12. ArduinoUNO实战-第八章-无源蜂鸣器
  13. Python中struct.pack()和struct.unpack()用法详细说明
  14. 商业银行普惠金融可持续发展综合能力呈现梯队化,专项领域各有所长
  15. 阿里云ECS服务器CentOS7上安装服务器安全狗Linux版
  16. GameofMir引擎架设传奇服务器【4:架设微端】
  17. 【excel】利用NETWORKDAYS.INTL函数计算两日期之间的工作日时间
  18. 涉及到第三方支付接口该如何测试?
  19. spring 定时器,时间设置
  20. nginx的location和rewrite

热门文章

  1. BMZ-MISC-word文档
  2. 【无人机】基于PSO-PA和Q-learning机器学习的无人驾驶飞行器 (UAV) 模拟器研究(matlab代码实现)
  3. 操作系统中临界资源与临界区的概念
  4. python图像数独_Python判断有效的数独算法示例
  5. android studio的安装(补充篇gradle失败的问题更新于 2021-03-10)
  6. JAVA学习笔记:concat, StringBuffer ,append,insert
  7. 每日算法-Excel表列名称
  8. 膜拜大佬!微信小程序页面跳转方法总结,大厂内部资料
  9. xbook2操作系统内核,一个新英雄的崛起!
  10. 完美解决-关于ubuntu下dia绘图工具中文输入问题