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 ...
随机推荐
- [Powershell] FTP Download File
# Config $today = Get-Date -UFormat "%Y%m%d" $LogFilePath = "d:\ftpLog_$today.txt&quo ...
- idea
一. 常用快捷键 搜索class Ctrl+N 搜索文件 Ctrl+Alt+N 当前窗口查找/全工程查找 Ctrl+F/Ctrl+Shift+F,F3/Shift+F3前后移动 上/下一个位置 Ctr ...
- 《Java程序员面试笔试宝典》之组合与继承有什么区别
组合和继承是面向对象中两种代码复用的方式.组合是指在新类里面创建原有类的对象,重复利用已有类的功能.继承是面向对象的主要特性之一,它允许设计人员根据其它类的实现来定义一个类的实现.组合和继承都允许在新 ...
- python3-day1(文件操作)
index: str.fomat() open file str.replace 一.新款str.fomat() 1.>>> '12'.zfill(5) '00012' 2.> ...
- 二叉排序树的创建删除中序输出&&平衡树
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #inclu ...
- 期望dp-hdu-4336-Card Collector
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4336 题目大意: 有n种卡片,每包中至多有一种卡片,概率分别为p1,p2,...pn,可能有的没有卡 ...
- [Javascript]3. Improve you speed! Performance Tips
/** Let inheritance help with memory efficiency */ function SignalFire(ID, startingLogs){ this.fireI ...
- SVG Loading
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" width="64&qu ...
- C# 让textbox 只能输入数字的方法
使用textBox控件的KeyPress事件 private void textBox_KeyPress(object sender, KeyPressEventArgs e) { if (e.Key ...
- lucene评分推导公式
在进行Lucene的搜索过程解析之前,有必要单独的一张把Lucene score公式的推导,各部分的意义阐述一下.因为Lucene的搜索过程,很重要的一个步骤就是逐步的计算各部分的分数. Lucene ...