前面总结了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. linux最大文件句柄数量总结

    转载:http://jameswxx.iteye.com/blog/2096461 useradd -g gid -G gid1,gid2 user usermod -g gid -G gid1,gi ...

  2. poj3261 -- Milk Patterns

                                                                        Milk Patterns Time Limit: 5000MS ...

  3. uniq详解

    一.简介 报告或删除文件中重复的行. uniq 命令读取由 InFile 参数指定的标准输入或文件.该命令首先比较相邻的行,然后除去第二行和该行的后续副本.重复的行一定相邻.(在发出 uniq 命令之 ...

  4. boost库使用:vs2013下boost::container::vector编译出错解决

    boost版本:boost_1_55_0 bug报告地址 https://svn.boost.org/trac/boost/ticket/9332 出错信息 has_member_function_c ...

  5. 【转】Android用NDK和整套源码下编译JNI的不同

    原文网址:http://www.devdiv.com/android_ndk_jni_-blog-99-2101.html 前些天要写个jni程序,因为才几行代码,想着用ndk开发可能容易些,就先研究 ...

  6. linux环境下java读取sh脚本并执行

    Process process;           String cmd = "/home/ty/t.sh";//这里必须要给文件赋权限 chmod u+x fileName; ...

  7. pyqt sender()学习

    #!/usr/bin/python # -*- coding: utf-8 -*- # sender.py import sys from PyQt4 import QtGui, QtCore cla ...

  8. PHP二分查找(递归和循环)

    二分查找可以通过递归和循环来实现, 思路如下: 将要查找的数和中间数进行比较, 如果相等,则表示找到,返回下标 如果要查找的数小于中间这个数,则说明要查找的数分布在数组左边,修改right边界,使其等 ...

  9. K贪心

    <span style="color:#330099;">/* K - 贪心 基础 Time Limit:1000MS Memory Limit:32768KB 64b ...

  10. git错误:fatal: Not a git repository (or any of the parent directories): .git

    git错误:fatal: Not a git repository (or any of the parent directories): .git 我用git add file添加文件时出现这样错误 ...