usb mass storage之旅
前面总结了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 ...
随机推荐
- Linux文件夹执行权限
在Linux中,文件有三种权限--可读,可写,可执行.目录也有三种权限--可读,可写,可执行.但是实际上他们有着不同的意义. 对于文件: 可读 :表示可以读取文件里的数据: 可写 :表示可以改变和删除 ...
- 完整的多项匹配tomcat access日志的正则
<pre name="code" class="html"><pre name="code" class="ht ...
- Java 自定义实现 LRU 缓存算法
背景 LinkedHashMap继承自HashMap,内部提供了一个removeEldestEntry方法,该方法正是实现LRU策略的关键所在,且HashMap内部专门为LinkedHashMap提供 ...
- UGUI实现摇杆(模仿太极熊猫)
核心代码: using UnityEngine; using System.Collections; using UnityEngine.UI; public delegate void Joysti ...
- 表单验证插件jquery.validate的使用方法演示
jQueryValidate表单验证效果 jquery.validate验证错误信息的样式控制 <!--validate验证插件的基础样式--> input.error{border: 1 ...
- Zookeeper学习记录(一):设计与实现
概述 Zookeeper是一个分布式的.开源的分布式应用协调服务.它暴露了一组简单的基础原件,分布式应用可以在这些原件之上实现更高级别的服务,如同步.配置维护.群组.和命名.它被设计成容易编程实现的, ...
- Struts1——从BeanUtils看struts的实现原理2
上一篇博客中我们简单的介绍了BeanUtils的使用.以及其最主要的原理,今天我们进一步的理解这个类在Struts1中的使用. 首先我们先回想一下搭建一个简单的基于Struts1框架的 ...
- CREATE PROCEDURE
1 CREATE PROCEDURE(创建) CREATE PROCEDURE存储过程名(參数列表) BEGIN SQL语句代码块 END 注意: 由括号包围的參数列必须总是存在.假设没有參数,也该使 ...
- ora-24247:网络访问被访问控制列表(ACL)拒绝
用dba账户使用下面脚本授予报错账户访问外部网络服务的权限,以SCOTT为例: BEGIN -- Only uncomment the following line if ACL "netw ...
- maven:安装m2eclipse插件
一.安装maven 1.下载maven:http://pan.baidu.com/s/1hqIbx6s 2.解压并配置path路径(直接替换最新的maven包,即可升级) 3.测试 二.安装m2ecl ...