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