前面总结了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. 关于log4net 生成多个文件夹的解决方案。

    解决方案: 在append节点内加入: <param name="lockingModel" type="log4net.Appender.FileAppender ...

  2. hdu 1245 Saving James Bond

    http://acm.hdu.edu.cn/showproblem.php?pid=1245 #include <cstdio> #include <cstring> #inc ...

  3. Latch-up 閂鎖效應 & 靜電放電模式

    * * Latch-up 閂鎖效應, 又稱寄生PNPN效應或可控矽整流器 ( SCR, Silicon Controlled Rectifier ) 效應. 在整體矽的CMOS 管下, 不同極性攙雜的 ...

  4. 关于php-fpm通讯时没有REQUEST_METHOD的问题

    nginx是通过fastcgi协议来和php通讯的!而php-fpm就扮演了这样的角色 fastcgi协议 中文版http://blog.chinaunix.net/uid-380521-id-241 ...

  5. java package 重命名时注意事项

    如果要对包重命名时,需要关注以下方面: 1. java关联类里的重命名(这个一般通过开发工具会自动修正,如eclipse) 2.配置文件,如原先配置为com.abc,现在更名为com.abc123,这 ...

  6. Centos中安装code blocks

    CentOS下面安装Codeblocks不像Ubuntu下面那样轻松,可以直接在软件中心安装.这里好多信赖我们要自己安装,也不是很麻烦. 1.先安装gcc和gcc++,这个可以直接安装 # yum i ...

  7. Android应用开发学习之启动另外一个Activity

    作者:刘昊昱 博客:http://blog.csdn.net/liuhaoyutz 一个Activity可以启动另外一个Activity,以实现比较复杂的功能,我们来看一个例子,其运行效果如下图所示: ...

  8. jsp页面判断文件上传类型

    <script language="javascript" type="text/javascript"> function check_file( ...

  9. 分析NTFS文件系统得到特定文件的内容

    找某一个文件的内容(如要读取文件D:\dir\dir2\text.txt,详细过程例如以下: (1)读取分区表/分区链表信息,找到磁盘F的起始扇区. (2)读取D盘的第一个扇区(分区的BOOTSETO ...

  10. NSSCanner 提取 指定 字符串

    /** *  从msg中提取指定的内容 * *  @param msg 字符串集合 * *  @return 从msg中提取指定的内容 */ -(NSString*)extractBodyFromMe ...