226 lines
		
	
	
		
			9.5 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			226 lines
		
	
	
		
			9.5 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
* Overview
 | 
						|
 | 
						|
  Mass Storage Gadget (or MSG) acts as a USB Mass Storage device,
 | 
						|
  appearing to the host as a disk or a CD-ROM drive.  It supports
 | 
						|
  multiple logical units (LUNs).  Backing storage for each LUN is
 | 
						|
  provided by a regular file or a block device, access can be limited
 | 
						|
  to read-only, and gadget can indicate that it is removable and/or
 | 
						|
  CD-ROM (the latter implies read-only access).
 | 
						|
 | 
						|
  Its requirements are modest; only a bulk-in and a bulk-out endpoint
 | 
						|
  are needed.  The memory requirement amounts to two 16K buffers.
 | 
						|
  Support is included for full-speed, high-speed and SuperSpeed
 | 
						|
  operation.
 | 
						|
 | 
						|
  Note that the driver is slightly non-portable in that it assumes
 | 
						|
  a single memory/DMA buffer will be usable for bulk-in and bulk-out
 | 
						|
  endpoints.  With most device controllers this is not an issue, but
 | 
						|
  there may be some with hardware restrictions that prevent a buffer
 | 
						|
  from being used by more than one endpoint.
 | 
						|
 | 
						|
  This document describes how to use the gadget from user space, its
 | 
						|
  relation to mass storage function (or MSF) and different gadgets
 | 
						|
  using it, and how it differs from File Storage Gadget (or FSG)
 | 
						|
  (which is no longer included in Linux).  It will talk only briefly
 | 
						|
  about how to use MSF within composite gadgets.
 | 
						|
 | 
						|
* Module parameters
 | 
						|
 | 
						|
  The mass storage gadget accepts the following mass storage specific
 | 
						|
  module parameters:
 | 
						|
 | 
						|
  - file=filename[,filename...]
 | 
						|
 | 
						|
    This parameter lists paths to files or block devices used for
 | 
						|
    backing storage for each logical unit.  There may be at most
 | 
						|
    FSG_MAX_LUNS (8) LUNs set.  If more files are specified, they will
 | 
						|
    be silently ignored.  See also “luns” parameter.
 | 
						|
 | 
						|
    *BEWARE* that if a file is used as a backing storage, it may not
 | 
						|
    be modified by any other process.  This is because the host
 | 
						|
    assumes the data does not change without its knowledge.  It may be
 | 
						|
    read, but (if the logical unit is writable) due to buffering on
 | 
						|
    the host side, the contents are not well defined.
 | 
						|
 | 
						|
    The size of the logical unit will be rounded down to a full
 | 
						|
    logical block.  The logical block size is 2048 bytes for LUNs
 | 
						|
    simulating CD-ROM, block size of the device if the backing file is
 | 
						|
    a block device, or 512 bytes otherwise.
 | 
						|
 | 
						|
  - removable=b[,b...]
 | 
						|
 | 
						|
    This parameter specifies whether each logical unit should be
 | 
						|
    removable.  “b” here is either “y”, “Y” or “1” for true or “n”,
 | 
						|
    “N” or “0” for false.
 | 
						|
 | 
						|
    If this option is set for a logical unit, gadget will accept an
 | 
						|
    “eject” SCSI request (Start/Stop Unit).  When it is sent, the
 | 
						|
    backing file will be closed to simulate ejection and the logical
 | 
						|
    unit will not be mountable by the host until a new backing file is
 | 
						|
    specified by userspace on the device (see “sysfs entries”
 | 
						|
    section).
 | 
						|
 | 
						|
    If a logical unit is not removable (the default), a backing file
 | 
						|
    must be specified for it with the “file” parameter as the module
 | 
						|
    is loaded.  The same applies if the module is built in, no
 | 
						|
    exceptions.
 | 
						|
 | 
						|
    The default value of the flag is false, *HOWEVER* it used to be
 | 
						|
    true.  This has been changed to better match File Storage Gadget
 | 
						|
    and because it seems like a saner default after all.  Thus to
 | 
						|
    maintain compatibility with older kernels, it's best to specify
 | 
						|
    the default values.  Also, if one relied on old default, explicit
 | 
						|
    “n” needs to be specified now.
 | 
						|
 | 
						|
    Note that “removable” means the logical unit's media can be
 | 
						|
    ejected or removed (as is true for a CD-ROM drive or a card
 | 
						|
    reader).  It does *not* mean that the entire gadget can be
 | 
						|
    unplugged from the host; the proper term for that is
 | 
						|
    “hot-unpluggable”.
 | 
						|
 | 
						|
  - cdrom=b[,b...]
 | 
						|
 | 
						|
    This parameter specifies whether each logical unit should simulate
 | 
						|
    CD-ROM.  The default is false.
 | 
						|
 | 
						|
  - ro=b[,b...]
 | 
						|
 | 
						|
    This parameter specifies whether each logical unit should be
 | 
						|
    reported as read only.  This will prevent host from modifying the
 | 
						|
    backing files.
 | 
						|
 | 
						|
    Note that if this flag for given logical unit is false but the
 | 
						|
    backing file could not be opened in read/write mode, the gadget
 | 
						|
    will fall back to read only mode anyway.
 | 
						|
 | 
						|
    The default value for non-CD-ROM logical units is false; for
 | 
						|
    logical units simulating CD-ROM it is forced to true.
 | 
						|
 | 
						|
  - nofua=b[,b...]
 | 
						|
 | 
						|
    This parameter specifies whether FUA flag should be ignored in SCSI
 | 
						|
    Write10 and Write12 commands sent to given logical units.
 | 
						|
 | 
						|
    MS Windows mounts removable storage in “Removal optimised mode” by
 | 
						|
    default.  All the writes to the media are synchronous, which is
 | 
						|
    achieved by setting the FUA (Force Unit Access) bit in SCSI
 | 
						|
    Write(10,12) commands.  This forces each write to wait until the
 | 
						|
    data has actually been written out and prevents I/O requests
 | 
						|
    aggregation in block layer dramatically decreasing performance.
 | 
						|
 | 
						|
    Note that this may mean that if the device is powered from USB and
 | 
						|
    the user unplugs the device without unmounting it first (which at
 | 
						|
    least some Windows users do), the data may be lost.
 | 
						|
 | 
						|
    The default value is false.
 | 
						|
 | 
						|
  - luns=N
 | 
						|
 | 
						|
    This parameter specifies number of logical units the gadget will
 | 
						|
    have.  It is limited by FSG_MAX_LUNS (8) and higher value will be
 | 
						|
    capped.
 | 
						|
 | 
						|
    If this parameter is provided, and the number of files specified
 | 
						|
    in “file” argument is greater then the value of “luns”, all excess
 | 
						|
    files will be ignored.
 | 
						|
 | 
						|
    If this parameter is not present, the number of logical units will
 | 
						|
    be deduced from the number of files specified in the “file”
 | 
						|
    parameter.  If the file parameter is missing as well, one is
 | 
						|
    assumed.
 | 
						|
 | 
						|
  - stall=b
 | 
						|
 | 
						|
    Specifies whether the gadget is allowed to halt bulk endpoints.
 | 
						|
    The default is determined according to the type of USB device
 | 
						|
    controller, but usually true.
 | 
						|
 | 
						|
  In addition to the above, the gadget also accepts the following
 | 
						|
  parameters defined by the composite framework (they are common to
 | 
						|
  all composite gadgets so just a quick listing):
 | 
						|
 | 
						|
  - idVendor      -- USB Vendor ID (16 bit integer)
 | 
						|
  - idProduct     -- USB Product ID (16 bit integer)
 | 
						|
  - bcdDevice     -- USB Device version (BCD) (16 bit integer)
 | 
						|
  - iManufacturer -- USB Manufacturer string (string)
 | 
						|
  - iProduct      -- USB Product string (string)
 | 
						|
  - iSerialNumber -- SerialNumber string (sting)
 | 
						|
 | 
						|
* sysfs entries
 | 
						|
 | 
						|
  For each logical unit, the gadget creates a directory in the sysfs
 | 
						|
  hierarchy.  Inside of it the following three files are created:
 | 
						|
 | 
						|
  - file
 | 
						|
 | 
						|
    When read it returns the path to the backing file for the given
 | 
						|
    logical unit.  If there is no backing file (possible only if the
 | 
						|
    logical unit is removable), the content is empty.
 | 
						|
 | 
						|
    When written into, it changes the backing file for given logical
 | 
						|
    unit.  This change can be performed even if given logical unit is
 | 
						|
    not specified as removable (but that may look strange to the
 | 
						|
    host).  It may fail, however, if host disallowed medium removal
 | 
						|
    with the Prevent-Allow Medium Removal SCSI command.
 | 
						|
 | 
						|
  - ro
 | 
						|
 | 
						|
    Reflects the state of ro flag for the given logical unit.  It can
 | 
						|
    be read any time, and written to when there is no backing file
 | 
						|
    open for given logical unit.
 | 
						|
 | 
						|
  - nofua
 | 
						|
 | 
						|
    Reflects the state of nofua flag for given logical unit.  It can
 | 
						|
    be read and written.
 | 
						|
 | 
						|
  Other then those, as usual, the values of module parameters can be
 | 
						|
  read from /sys/module/g_mass_storage/parameters/* files.
 | 
						|
 | 
						|
* Other gadgets using mass storage function
 | 
						|
 | 
						|
  The Mass Storage Gadget uses the Mass Storage Function to handle
 | 
						|
  mass storage protocol.  As a composite function, MSF may be used by
 | 
						|
  other gadgets as well (eg. g_multi and acm_ms).
 | 
						|
 | 
						|
  All of the information in previous sections are valid for other
 | 
						|
  gadgets using MSF, except that support for mass storage related
 | 
						|
  module parameters may be missing, or the parameters may have
 | 
						|
  a prefix.  To figure out whether any of this is true one needs to
 | 
						|
  consult the gadget's documentation or its source code.
 | 
						|
 | 
						|
  For examples of how to include mass storage function in gadgets, one
 | 
						|
  may take a look at mass_storage.c, acm_ms.c and multi.c (sorted by
 | 
						|
  complexity).
 | 
						|
 | 
						|
* Relation to file storage gadget
 | 
						|
 | 
						|
  The Mass Storage Function and thus the Mass Storage Gadget has been
 | 
						|
  based on the File Storage Gadget.  The difference between the two is
 | 
						|
  that MSG is a composite gadget (ie. uses the composite framework)
 | 
						|
  while file storage gadget was a traditional gadget.  From userspace
 | 
						|
  point of view this distinction does not really matter, but from
 | 
						|
  kernel hacker's point of view, this means that (i) MSG does not
 | 
						|
  duplicate code needed for handling basic USB protocol commands and
 | 
						|
  (ii) MSF can be used in any other composite gadget.
 | 
						|
 | 
						|
  Because of that, File Storage Gadget has been removed in Linux 3.8.
 | 
						|
  All users need to transition to the Mass Storage Gadget.  The two
 | 
						|
  gadgets behave mostly the same from the outside except:
 | 
						|
 | 
						|
  1. In FSG the “removable” and “cdrom” module parameters set the flag
 | 
						|
     for all logical units whereas in MSG they accept a list of y/n
 | 
						|
     values for each logical unit.  If one uses only a single logical
 | 
						|
     unit this does not matter, but if there are more, the y/n value
 | 
						|
     needs to be repeated for each logical unit.
 | 
						|
 | 
						|
  2. FSG's “serial”, “vendor”, “product” and “release” module
 | 
						|
     parameters are handled in MSG by the composite layer's parameters
 | 
						|
     named respectively: “iSerialnumber”, “idVendor”, “idProduct” and
 | 
						|
     “bcdDevice”.
 | 
						|
 | 
						|
  3. MSG does not support FSG's test mode, thus “transport”,
 | 
						|
     “protocol” and “buflen” FSG's module parameters are not
 | 
						|
     supported.  MSG always uses SCSI protocol with bulk only
 | 
						|
     transport mode and 16 KiB buffers.
 |