前面总结了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. Codeforces 229D Towers

    http://codeforces.com/problemset/problem/229/D 题意:有n(1<=n<=5,000)座塔排在一条直线上,从左到右每个塔的高度分别为hi(1&l ...

  2. c# 编程添加控件

    Button b = new Button();//创建一个新的按钮 b.Text = "test"; //添加到panel1中 panel1.Controls.Add(b);

  3. Uva11183-Teen Girl Squad(有向图最小生成树朱刘算法)

    解析: 裸的有向图最小生成树 代码 #include<cstdio> #include<cstring> #include<string> #include< ...

  4. UVA1218--树形DP

    没有看书和题解做的一道树形DP题,思路很清晰..只是debug上花了很久的时间才发现看错了条件..并不是每个点都只能和一台服务器相邻,而是非服务器的点只能和一台服务器相邻..看错了一个条件差距大了去了 ...

  5. phpcms 内部检测用户名长度更改

    <?php /*1.js部分ajax就不说了,很好改...把min  max更改下就行了具体在三个地方更改: inputValidator({min:2,max:40, //默认是20 1.会员 ...

  6. js记录用户行为浏览记录和停留时间(转)

    演示地址:http://weber.pub/demo/160902/test.html 测试源码下载:http://pan.baidu.com/s/1nvPKbSP 密码:r147 解决问题所使用的知 ...

  7. [Hapi.js] Serving static files

    hapi does not support serving static files out of the box. Instead it relies on a module called Iner ...

  8. Cts框架解析(8)-IBuildProvider

    IBuildProvider接口中定义了三个方法 /* * Copyright (C) 2010 The Android Open Source Project * * Licensed under ...

  9. hdu 5071 Chat(模拟|Splay)

    Chat Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) Total Sub ...

  10. [core java学习笔记][第四章对象与类]

    4.3 用户自定义类 4.3.1 类数组的声明 需要两次new Employee[]=staff=new Employedd[3]; staff[0]=new Employedd(参数列表); sta ...