Home | History | Annotate | Download | only in UsbMassStorageDxe
      1 /** @file
      2   Definition of the command set of USB Mass Storage Specification
      3   for Bootability, Revision 1.0.
      4 
      5 Copyright (c) 2007 - 2012, Intel Corporation. All rights reserved.<BR>
      6 This program and the accompanying materials
      7 are licensed and made available under the terms and conditions of the BSD License
      8 which accompanies this distribution.  The full text of the license may be found at
      9 http://opensource.org/licenses/bsd-license.php
     10 
     11 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
     12 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     13 
     14 **/
     15 
     16 #ifndef _EFI_USB_MASS_BOOT_H_
     17 #define _EFI_USB_MASS_BOOT_H_
     18 
     19 //
     20 // The opcodes of various USB boot commands:
     21 // INQUIRY/REQUEST_SENSE are "No Timeout Commands" as specified
     22 // by Multi-Media Commands (MMC) set.
     23 // Others are "Group 1 Timeout Commands". That is,
     24 // they should be retried if driver is ready.
     25 //
     26 #define USB_BOOT_INQUIRY_OPCODE         0x12
     27 #define USB_BOOT_REQUEST_SENSE_OPCODE   0x03
     28 #define USB_BOOT_MODE_SENSE10_OPCODE    0x5A
     29 #define USB_BOOT_READ_CAPACITY_OPCODE   0x25
     30 #define USB_BOOT_TEST_UNIT_READY_OPCODE 0x00
     31 #define USB_BOOT_READ10_OPCODE          0x28
     32 #define USB_BOOT_WRITE10_OPCODE         0x2A
     33 
     34 #define USB_SCSI_MODE_SENSE6_OPCODE     0x1A
     35 
     36 //
     37 // The Sense Key part of the sense data. Sense data has three levels:
     38 // Sense key, Additional Sense Code and Additional Sense Code Qualifier
     39 //
     40 #define USB_BOOT_SENSE_NO_SENSE         0x00 ///< No sense key
     41 #define USB_BOOT_SENSE_RECOVERED        0x01 ///< Last command succeed with recovery actions
     42 #define USB_BOOT_SENSE_NOT_READY        0x02 ///< Device not ready
     43 #define USB_BOOT_SNESE_MEDIUM_ERROR     0X03 ///< Failed probably because flaw in the media
     44 #define USB_BOOT_SENSE_HARDWARE_ERROR   0X04 ///< Non-recoverable hardware failure
     45 #define USB_BOOT_SENSE_ILLEGAL_REQUEST  0X05 ///< Illegal parameters in the request
     46 #define USB_BOOT_SENSE_UNIT_ATTENTION   0X06 ///< Removable medium may have been changed
     47 #define USB_BOOT_SENSE_DATA_PROTECT     0X07 ///< Write protected
     48 #define USB_BOOT_SENSE_BLANK_CHECK      0X08 ///< Blank/non-blank medium while reading/writing
     49 #define USB_BOOT_SENSE_VENDOR           0X09 ///< Vendor specific sense key
     50 #define USB_BOOT_SENSE_ABORTED          0X0B ///< Command aborted by the device
     51 #define USB_BOOT_SENSE_VOLUME_OVERFLOW  0x0D ///< Partition overflow
     52 #define USB_BOOT_SENSE_MISCOMPARE       0x0E ///< Source data mis-match while verfying.
     53 
     54 #define USB_BOOT_ASC_NOT_READY          0x04
     55 #define USB_BOOT_ASC_NO_MEDIA           0x3A
     56 #define USB_BOOT_ASC_MEDIA_CHANGE       0x28
     57 
     58 //
     59 // Supported PDT codes, or Peripheral Device Type
     60 //
     61 #define USB_PDT_DIRECT_ACCESS           0x00       ///< Direct access device
     62 #define USB_PDT_CDROM                   0x05       ///< CDROM
     63 #define USB_PDT_OPTICAL                 0x07       ///< Non-CD optical disks
     64 #define USB_PDT_SIMPLE_DIRECT           0x0E       ///< Simplified direct access device
     65 
     66 //
     67 // Other parameters, Max carried size is 512B * 128 = 64KB
     68 //
     69 #define USB_BOOT_IO_BLOCKS              128
     70 
     71 //
     72 // Retry mass command times, set by experience
     73 //
     74 #define USB_BOOT_COMMAND_RETRY          5
     75 
     76 //
     77 // Wait for unit ready command, set by experience
     78 //
     79 #define USB_BOOT_RETRY_UNIT_READY_STALL (500 * USB_MASS_1_MILLISECOND)
     80 
     81 //
     82 // Mass command timeout, refers to specification[USB20-9.2.6.1]
     83 //
     84 // USB2.0 Spec define the up-limit timeout 5s for all command. USB floppy,
     85 // USB CD-Rom and iPod devices are much slower than USB key when reponse
     86 // most of commands, So we set 5s as timeout here.
     87 //
     88 #define USB_BOOT_GENERAL_CMD_TIMEOUT    (5 * USB_MASS_1_SECOND)
     89 
     90 //
     91 // The required commands are INQUIRY, READ CAPACITY, TEST UNIT READY,
     92 // READ10, WRITE10, and REQUEST SENSE. The BLOCK_IO protocol uses LBA
     93 // so it isn't necessary to issue MODE SENSE / READ FORMAT CAPACITY
     94 // command to retrieve the disk gemotrics.
     95 //
     96 #pragma pack(1)
     97 typedef struct {
     98   UINT8             OpCode;
     99   UINT8             Lun;            ///< Lun (high 3 bits)
    100   UINT8             Reserved0[2];
    101   UINT8             AllocLen;
    102   UINT8             Reserved1;
    103   UINT8             Pad[6];
    104 } USB_BOOT_INQUIRY_CMD;
    105 
    106 typedef struct {
    107   UINT8             Pdt;            ///< Peripheral Device Type (low 5 bits)
    108   UINT8             Removable;      ///< Removable Media (highest bit)
    109   UINT8             Reserved0[2];
    110   UINT8             AddLen;         ///< Additional length
    111   UINT8             Reserved1[3];
    112   UINT8             VendorID[8];
    113   UINT8             ProductID[16];
    114   UINT8             ProductRevision[4];
    115 } USB_BOOT_INQUIRY_DATA;
    116 
    117 typedef struct {
    118   UINT8             OpCode;
    119   UINT8             Lun;
    120   UINT8             Reserved0[8];
    121   UINT8             Pad[2];
    122 } USB_BOOT_READ_CAPACITY_CMD;
    123 
    124 typedef struct {
    125   UINT8             LastLba[4];
    126   UINT8             BlockLen[4];
    127 } USB_BOOT_READ_CAPACITY_DATA;
    128 
    129 typedef struct {
    130   UINT8             OpCode;
    131   UINT8             Lun;
    132   UINT8             Reserved[4];
    133   UINT8             Pad[6];
    134 } USB_BOOT_TEST_UNIT_READY_CMD;
    135 
    136 typedef struct {
    137   UINT8             OpCode;
    138   UINT8             Lun;
    139   UINT8             PageCode;
    140   UINT8             Reserved0[4];
    141   UINT8             ParaListLenMsb;
    142   UINT8             ParaListLenLsb;
    143   UINT8             Reserved1;
    144   UINT8             Pad[2];
    145 } USB_BOOT_MODE_SENSE10_CMD;
    146 
    147 typedef struct {
    148   UINT8             ModeDataLenMsb;
    149   UINT8             ModeDataLenLsb;
    150   UINT8             Reserved0[4];
    151   UINT8             BlkDesLenMsb;
    152   UINT8             BlkDesLenLsb;
    153 } USB_BOOT_MODE_SENSE10_PARA_HEADER;
    154 
    155 typedef struct {
    156   UINT8             OpCode;
    157   UINT8             Lun;            ///< Lun (High 3 bits)
    158   UINT8             Lba[4];         ///< Logical block address
    159   UINT8             Reserved0;
    160   UINT8             TransferLen[2]; ///< Transfer length
    161   UINT8             Reserverd1;
    162   UINT8             Pad[2];
    163 } USB_BOOT_READ10_CMD;
    164 
    165 typedef struct {
    166   UINT8             OpCode;
    167   UINT8             Lun;
    168   UINT8             Lba[4];
    169   UINT8             Reserved0;
    170   UINT8             TransferLen[2];
    171   UINT8             Reserverd1;
    172   UINT8             Pad[2];
    173 } USB_BOOT_WRITE10_CMD;
    174 
    175 typedef struct {
    176   UINT8             OpCode;
    177   UINT8             Lun;            ///< Lun (High 3 bits)
    178   UINT8             Reserved0[2];
    179   UINT8             AllocLen;       ///< Allocation length
    180   UINT8             Reserved1;
    181   UINT8             Pad[6];
    182 } USB_BOOT_REQUEST_SENSE_CMD;
    183 
    184 typedef struct {
    185   UINT8             ErrorCode;
    186   UINT8             Reserved0;
    187   UINT8             SenseKey;       ///< Sense key (low 4 bits)
    188   UINT8             Infor[4];
    189   UINT8             AddLen;         ///< Additional Sense length, 10
    190   UINT8             Reserved1[4];
    191   UINT8             Asc;            ///< Additional Sense Code
    192   UINT8             Ascq;           ///< Additional Sense Code Qualifier
    193   UINT8             Reserverd2[4];
    194 } USB_BOOT_REQUEST_SENSE_DATA;
    195 
    196 typedef struct {
    197   UINT8             OpCode;
    198   UINT8             Lun;
    199   UINT8             PageCode;
    200   UINT8             Reserved0;
    201   UINT8             AllocateLen;
    202   UINT8             Control;
    203 } USB_SCSI_MODE_SENSE6_CMD;
    204 
    205 typedef struct {
    206   UINT8             ModeDataLen;
    207   UINT8             MediumType;
    208   UINT8             DevicePara;
    209   UINT8             BlkDesLen;
    210 } USB_SCSI_MODE_SENSE6_PARA_HEADER;
    211 #pragma pack()
    212 
    213 //
    214 // Convert a LUN number to that in the command
    215 //
    216 #define USB_BOOT_LUN(Lun) ((Lun) << 5)
    217 
    218 //
    219 // Get the removable, PDT, and sense key bits from the command data
    220 //
    221 #define USB_BOOT_REMOVABLE(RmbByte) (((RmbByte) & BIT7) != 0)
    222 #define USB_BOOT_PDT(Pdt)           ((Pdt) & 0x1f)
    223 #define USB_BOOT_SENSE_KEY(Key)     ((Key) & 0x0f)
    224 
    225 /**
    226   Get the parameters for the USB mass storage media.
    227 
    228   This function get the parameters for the USB mass storage media,
    229   It is used both to initialize the media during the Start() phase
    230   of Driver Binding Protocol and to re-initialize it when the media is
    231   changed. Althought the RemoveableMedia is unlikely to change,
    232   it is also included here.
    233 
    234   @param  UsbMass                The device to retrieve disk gemotric.
    235 
    236   @retval EFI_SUCCESS            The disk gemotric is successfully retrieved.
    237   @retval Other                  Failed to get the parameters.
    238 
    239 **/
    240 EFI_STATUS
    241 UsbBootGetParams (
    242   IN USB_MASS_DEVICE          *UsbMass
    243   );
    244 
    245 /**
    246   Execute TEST UNIT READY command to check if the device is ready.
    247 
    248   @param  UsbMass                The device to test
    249 
    250   @retval EFI_SUCCESS            The device is ready.
    251   @retval Others                 Device not ready.
    252 
    253 **/
    254 EFI_STATUS
    255 UsbBootIsUnitReady (
    256   IN USB_MASS_DEVICE          *UsbMass
    257   );
    258 
    259 /**
    260   Detect whether the removable media is present and whether it has changed.
    261 
    262   @param  UsbMass                The device to check.
    263 
    264   @retval EFI_SUCCESS            The media status is successfully checked.
    265   @retval Other                  Failed to detect media.
    266 
    267 **/
    268 EFI_STATUS
    269 UsbBootDetectMedia (
    270   IN  USB_MASS_DEVICE       *UsbMass
    271   );
    272 
    273 /**
    274   Read some blocks from the device.
    275 
    276   @param  UsbMass                The USB mass storage device to read from
    277   @param  Lba                    The start block number
    278   @param  TotalBlock             Total block number to read
    279   @param  Buffer                 The buffer to read to
    280 
    281   @retval EFI_SUCCESS            Data are read into the buffer
    282   @retval Others                 Failed to read all the data
    283 
    284 **/
    285 EFI_STATUS
    286 UsbBootReadBlocks (
    287   IN  USB_MASS_DEVICE         *UsbMass,
    288   IN  UINT32                  Lba,
    289   IN  UINTN                   TotalBlock,
    290   OUT UINT8                   *Buffer
    291   );
    292 
    293 /**
    294   Write some blocks to the device.
    295 
    296   @param  UsbMass                The USB mass storage device to write to
    297   @param  Lba                    The start block number
    298   @param  TotalBlock             Total block number to write
    299   @param  Buffer                 Pointer to the source buffer for the data.
    300 
    301   @retval EFI_SUCCESS            Data are written into the buffer
    302   @retval Others                 Failed to write all the data
    303 
    304 **/
    305 EFI_STATUS
    306 UsbBootWriteBlocks (
    307   IN  USB_MASS_DEVICE         *UsbMass,
    308   IN  UINT32                  Lba,
    309   IN  UINTN                   TotalBlock,
    310   IN  UINT8                   *Buffer
    311   );
    312 
    313 /**
    314   Read some blocks from the device by SCSI 16 byte cmd.
    315 
    316   @param  UsbMass                The USB mass storage device to read from
    317   @param  Lba                    The start block number
    318   @param  TotalBlock             Total block number to read
    319   @param  Buffer                 The buffer to read to
    320 
    321   @retval EFI_SUCCESS            Data are read into the buffer
    322   @retval Others                 Failed to read all the data
    323 
    324 **/
    325 EFI_STATUS
    326 UsbBootReadBlocks16 (
    327   IN  USB_MASS_DEVICE       *UsbMass,
    328   IN  UINT64                Lba,
    329   IN  UINTN                 TotalBlock,
    330   OUT UINT8                 *Buffer
    331   );
    332 
    333 /**
    334   Write some blocks to the device by SCSI 16 byte cmd.
    335 
    336   @param  UsbMass                The USB mass storage device to write to
    337   @param  Lba                    The start block number
    338   @param  TotalBlock             Total block number to write
    339   @param  Buffer                 Pointer to the source buffer for the data.
    340 
    341   @retval EFI_SUCCESS            Data are written into the buffer
    342   @retval Others                 Failed to write all the data
    343 
    344 **/
    345 EFI_STATUS
    346 UsbBootWriteBlocks16 (
    347   IN  USB_MASS_DEVICE         *UsbMass,
    348   IN  UINT64                  Lba,
    349   IN  UINTN                   TotalBlock,
    350   IN  UINT8                   *Buffer
    351   );
    352 
    353 
    354 /**
    355   Use the USB clear feature control transfer to clear the endpoint stall condition.
    356 
    357   @param  UsbIo                  The USB I/O Protocol instance
    358   @param  EndpointAddr           The endpoint to clear stall for
    359 
    360   @retval EFI_SUCCESS            The endpoint stall condition is cleared.
    361   @retval Others                 Failed to clear the endpoint stall condition.
    362 
    363 **/
    364 EFI_STATUS
    365 UsbClearEndpointStall (
    366   IN EFI_USB_IO_PROTOCOL    *UsbIo,
    367   IN UINT8                  EndpointAddr
    368   );
    369 
    370 #endif
    371 
    372