前面总结了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之旅的更多相关文章

  1. 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 ...

  2. usb mass storage device

    Problem adding USB host device to KVM Windows guest machine. Status: CLOSED CURRENTRELEASE   Aliases ...

  3. USB Mass Storage学习笔记-STM32+FLASH实现U盘

    一.内容概述  采用STM32内部自带USB控制器外加大页NAND FLASH K9F1G08U0A实现一个128M的U盘. 1.STM32的USB控制器 STM32F103的MCU自带USB从控制器 ...

  4. USB Mass Storage协议分析

    目录 简介 指令数据和状态协议 CBW指令格式 CSWCommand Status Wrapper状态格式 SCSI命令集 Format Unit Inquiry MODE SELECT 简介 USB ...

  5. USB mass storage协议

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

  6. 实现Linux下的U盘(USB Mass Storage)驱动

    如何实现Linux下的U盘(USB Mass Storage)驱动 版本:v0.7 How to Write Linux USB MSC (Mass Storage Class) Driver Cri ...

  7. 如何实现Linux下的U盘(USB Mass Storage)驱动

    如何实现Linux下的U盘(USB Mass Storage)驱动 版本:v0.7 How to Write Linux USB MSC (Mass Storage Class) Driver Cri ...

  8. USB Mass Storage大容量存储的基本知识

    http://www.crifan.com/files/doc/docbook/usb_disk_driver/release/htmls/ch02_msc_basic.html 目录 2.1. US ...

  9. 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 ...

随机推荐

  1. [Powershell] FTP Download File

    # Config $today = Get-Date -UFormat "%Y%m%d" $LogFilePath = "d:\ftpLog_$today.txt&quo ...

  2. idea

    一. 常用快捷键 搜索class Ctrl+N 搜索文件 Ctrl+Alt+N 当前窗口查找/全工程查找 Ctrl+F/Ctrl+Shift+F,F3/Shift+F3前后移动 上/下一个位置 Ctr ...

  3. 《Java程序员面试笔试宝典》之组合与继承有什么区别

    组合和继承是面向对象中两种代码复用的方式.组合是指在新类里面创建原有类的对象,重复利用已有类的功能.继承是面向对象的主要特性之一,它允许设计人员根据其它类的实现来定义一个类的实现.组合和继承都允许在新 ...

  4. python3-day1(文件操作)

    index: str.fomat() open file str.replace 一.新款str.fomat() 1.>>> '12'.zfill(5) '00012' 2.> ...

  5. 二叉排序树的创建删除中序输出&&平衡树

    #include<iostream> #include<cstdio> #include<cstring> #include<cmath> #inclu ...

  6. 期望dp-hdu-4336-Card Collector

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4336 题目大意: 有n种卡片,每包中至多有一种卡片,概率分别为p1,p2,...pn,可能有的没有卡 ...

  7. [Javascript]3. Improve you speed! Performance Tips

    /** Let inheritance help with memory efficiency */ function SignalFire(ID, startingLogs){ this.fireI ...

  8. SVG Loading

    <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" width="64&qu ...

  9. C# 让textbox 只能输入数字的方法

    使用textBox控件的KeyPress事件 private void textBox_KeyPress(object sender, KeyPressEventArgs e) { if (e.Key ...

  10. lucene评分推导公式

    在进行Lucene的搜索过程解析之前,有必要单独的一张把Lucene score公式的推导,各部分的意义阐述一下.因为Lucene的搜索过程,很重要的一个步骤就是逐步的计算各部分的分数. Lucene ...