前面总结了usb hid keyboard,现在总结usb mass storage,在枚举阶段没什么好总结的,hid和mass storage差不多,都是同样的枚举过程,但是在他们的配置描述符、接口描述符、端点描述符,也许还有之类描述符是不同的,需要按照usb mass storage的协议来配置,下面是列出usb的相关描述符。
const usb_device_descriptor device_desc = { .length = USB_DEVICE_DESC_SIZE, .type = USB_DEVICE_DESCRIPTOR_TYPE, .usb_spec_lo =0x00, .usb_spec_hi =0x02, .device_class = 0x00, .device_subclass = 0x00, .device_protocol = 0x00, .max_packet_size = USB_MAX_PACKET0, .vendor_lo = 0x51, .vendor_hi = 0xC2, .product_lo = 0x03, .product_hi = 0x20, .device_lo =0x00, .device_hi = 0x01, .manufacturer_str = 0x01, .product_str= 0x02, .serial_number_str = 0x03, .number_configurations = 0x01, // }; typedef struct usb_scsi_hid_config { const usb_configuration_descriptor config; const usb_interface_descriptor scsi_inter; const usb_endpoint_descriptor scsi_endpoint_in; const usb_endpoint_descriptor scsi_endpoint_out; }USB_CON_INT_ENDP_DESCRIPTOR_STRUCT; #define USB_CON_INT_ENDP_DESCRIPTOR_STRUCT_LENGTH (sizeof(USB_CON_INT_ENDP_DESCRIPTOR_STRUCT)) const USB_CON_INT_ENDP_DESCRIPTOR_STRUCT usb_scsi_hid_con_int_endp = { { .length= USB_CONFIGUARTION_DESC_SIZE, .type = USB_CONFIGURATION_DESCRIPTOR_TYPE, .total_length_lo = USB_CON_INT_ENDP_DESCRIPTOR_STRUCT_LENGTH&0xff, .total_length_hi = (USB_CON_INT_ENDP_DESCRIPTOR_STRUCT_LENGTH>>)&0xff, .number_interfaces = 0x02, .configuration_id = 0x01, .configuration_str = 0x00, .attributes = USB_CONFIG_BUS_POWERED, .max_power = USB_CONFIG_POWER_MA() }, { .length = USB_INTERFACE_DESC_SIZE, .type = USB_INTERFACE_DESCRIPTOR_TYPE, .interface_id = 0x01, .alternate_setting = 0x00, .number_endpoints = 0x02, .interface_class = USB_DEVICE_CLASS_STORAGE, .interface_subclass = 0x06, .interface_protocol = 0x50, .interface_str = 0x04 }, { .length = USB_ENDPOINT_DESC_SIZE, .type = USB_ENDPOINT_DESCRIPTOR_MSD_TYPE, .endpoint = USB_ENDPOINT_IN(), .attributes = USB_ENDPOINT_TYPE_BULK, .max_packet_lo = 0x40, .max_packet_hi =0x00, .interval = 0x00, }, { .length = USB_ENDPOINT_DESC_SIZE, .type = USB_ENDPOINT_DESCRIPTOR_MSD_TYPE, .endpoint = USB_ENDPOINT_OUT(), .attributes = USB_ENDPOINT_TYPE_BULK, .max_packet_lo = 0x40, .max_packet_hi =0x00, .interval = 0x00, }, };
1:usb mass storage是用来传送大量数据的,在usb里面一共有四种传输:控制传输、中断传输、批量传输、等时传输。控制和批量端点用于异步的数据传输,驱动需要他们就立马工作。中断和等时端点是周期性的,即在固定时间段连续的传输数据。如果还有疑问请百度或者google,也可以看看ldd3。在前面总结的hid keyboard就是用的中断传输,而现在则需要批量传输,毕竟我们是大量的传输数据。
2:前面说了枚举,在这里就省略枚举,但是有一点需要注意在set config,set config就需要和hid有不同的配置,具体硬件怎么工作,请参考自己的硬件手册。
3:如果set config和set interface通过的话,那么就应该出现了GET MAX LUN命令,这里又是一个知识点。LUN其实就是有几个存储设备,一般而言u盘只有一个LUN(logical unit number.),fudan ABC说:logical unit number.通常在谈到scsi设备的时候不可避免的要说起LUN.关于LUN,曾几何时,一位来自Novell(SUSE)的参与开发Linux内核中usb子系统的工程师这样对我说,一个lun就是一个device中的一个drive.换言之,usb中引入lun的目的在于,举例来说,有些读卡器可以有多个插槽,比如就是两个,其中一个支持CF卡,另一个支持SD卡,那么这种情况要区分这两个插槽里的冬冬,就得引入lun这么一个词.这叫逻辑单元.很显然,像U盘这样简单的设备其LUN必然是一个.有时候,人们常把U盘中一个分区当作一个LUN,这样说可能对小学三年级以下的朋友是可以接受的,但是作为一个成年人,不应该这么理解.哈,有他们解释,我就不用解释了。
4:好了usb mass storage的枚举已经完成了,枚举是完成了,但是scsi才刚开始,下回请看usb旅途之scsi。
usb mass storage之旅的更多相关文章
-
Android USB Connections Explained: MTP, PTP, and USB Mass Storage
Android USB Connections Explained: MTP, PTP, and USB Mass Storage Older Android devices support USB ...
-
usb mass storage device
Problem adding USB host device to KVM Windows guest machine. Status: CLOSED CURRENTRELEASE Aliases ...
-
USB Mass Storage学习笔记-STM32+FLASH实现U盘
一.内容概述 采用STM32内部自带USB控制器外加大页NAND FLASH K9F1G08U0A实现一个128M的U盘. 1.STM32的USB控制器 STM32F103的MCU自带USB从控制器 ...
-
USB Mass Storage协议分析
目录 简介 指令数据和状态协议 CBW指令格式 CSWCommand Status Wrapper状态格式 SCSI命令集 Format Unit Inquiry MODE SELECT 简介 USB ...
-
USB mass storage协议
这一节主要把在实现“linux模拟U盘功能”过程中的一些调试过程记录下来,并加以解析. 一.背景知识 1.USB Mass Storage类规范概述 USB 组织在univers ...
-
实现Linux下的U盘(USB Mass Storage)驱动
如何实现Linux下的U盘(USB Mass Storage)驱动 版本:v0.7 How to Write Linux USB MSC (Mass Storage Class) Driver Cri ...
-
如何实现Linux下的U盘(USB Mass Storage)驱动
如何实现Linux下的U盘(USB Mass Storage)驱动 版本:v0.7 How to Write Linux USB MSC (Mass Storage Class) Driver Cri ...
-
USB Mass Storage大容量存储的基本知识
http://www.crifan.com/files/doc/docbook/usb_disk_driver/release/htmls/ch02_msc_basic.html 目录 2.1. US ...
-
USB Mass Storage communication with PassThrough / more than 64K data length
http://social.msdn.microsoft.com/Forums/windowsdesktop/zh-CN/35620a05-43be-46a8-8cbe-846bc8295d85/us ...
随机推荐
-
Scrum Planning Card
最近用Swift写了个小工具Scrum Planning Card,如果你也用scrum管理项目, 或许用这个工具可以提高你的工作效率. 另外欢迎提建议和反馈,谢谢. 欢迎关注我的微信公众号 Hope ...
-
CORS 跨域
跨域请求一直是网页编程中的一个难题,在过去,绝大多数人都倾向于使用JSONP来解决这一问题.不过现在,我们可以考虑一下W3C中一项新的特性——CORS(Cross-Origin Resource Sh ...
-
[精读]Spationtemporal Saliency Detection Using Textural Contrast and Its Applications
Spationtemporal Saliency Detection Using Textural Contrast and Its Applications Last Edit 2013/12/3 ...
-
站点系统压力測试Jmeter+Badboy
近期项目须要压力測试,因此搜了几款试用,首选的是LoadRunner这款大名鼎鼎的測试软件: LoadRunner11 下载请猛戳这里 传送门LoadRunner破解文件 下载请猛戳这里 传送门Loa ...
-
Android jni编辑.so库
引自:http://www.cnblogs.com/sevenyuan/p/4202759.html 1. 在Eclipse中创建项目:TestJNI 2. 新创建一个class:TestJNI.ja ...
-
【方法】如何限定IP访问Oracle数据库
[方法]如何限定IP访问Oracle数据库 1.1 BLOG文档结构图 1.2 前言部分 1.2.1 导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知 ...
-
Gym - 101102C线段树
Judge Bahosain was bored at ACM AmrahCPC 2016 as the winner of the contest had the first rank from t ...
-
PyQt4 的部件 -- CheckBox 单选框
单选框具有两种状态:被选中或未被选中. 当用户选择或者取消选择时,单选框就会发射一个stateChanged()信号 # QCheckBox 单选框 # 本例创建一个用来改变窗口标题的单选框 impo ...
-
canvas的使用方法
了解canvas:canvas标签是用作图形绘制,但是通过js脚本来实现的,canvas标签其实只是一个容器 ,最终实现绘制功能肯定是通过js脚本实现. 首先肯定要定义一个canvas标签当做容器 & ...
-
spring cloud(Greenwich.M2) hystrix dashboard 报/actuator/hystrix.stream 404 Not Found的问题
consumer端不引用spring-boot-starter-actuator的情况 Consumer端会报Unable to connect to Command Metric Stream.新建 ...