USB Host Shield 2.0
masstorage.h
Go to the documentation of this file.
1 /* Copyright (C) 2011 Circuits At Home, LTD. All rights reserved.
2 
3 This program is free software; you can redistribute it and/or modify
4 it under the terms of the GNU General Public License as published by
5 the Free Software Foundation; either version 2 of the License, or
6 (at your option) any later version.
7 
8 This program is distributed in the hope that it will be useful,
9 but WITHOUT ANY WARRANTY; without even the implied warranty of
10 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 GNU General Public License for more details.
12 
13 You should have received a copy of the GNU General Public License
14 along with this program; if not, write to the Free Software
15 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
16 
17 Contact information
18 -------------------
19 
20 Circuits At Home, LTD
21 Web : http://www.circuitsathome.com
22 e-mail : support@circuitsathome.com
23  */
24 
25 #if !defined(__MASSTORAGE_H__)
26 #define __MASSTORAGE_H__
27 
28 // Cruft removal, makes driver smaller, faster.
29 #ifndef MS_WANT_PARSER
30 #define MS_WANT_PARSER 0
31 #endif
32 
33 #include "Usb.h"
34 
35 #define bmREQ_MASSOUT USB_SETUP_HOST_TO_DEVICE|USB_SETUP_TYPE_CLASS|USB_SETUP_RECIPIENT_INTERFACE
36 #define bmREQ_MASSIN USB_SETUP_DEVICE_TO_HOST|USB_SETUP_TYPE_CLASS|USB_SETUP_RECIPIENT_INTERFACE
37 
38 // Mass Storage Subclass Constants
39 #define MASS_SUBCLASS_SCSI_NOT_REPORTED 0x00 // De facto use
40 #define MASS_SUBCLASS_RBC 0x01
41 #define MASS_SUBCLASS_ATAPI 0x02 // MMC-5 (ATAPI)
42 #define MASS_SUBCLASS_OBSOLETE1 0x03 // Was QIC-157
43 #define MASS_SUBCLASS_UFI 0x04 // Specifies how to interface Floppy Disk Drives to USB
44 #define MASS_SUBCLASS_OBSOLETE2 0x05 // Was SFF-8070i
45 #define MASS_SUBCLASS_SCSI 0x06 // SCSI Transparent Command Set
46 #define MASS_SUBCLASS_LSDFS 0x07 // Specifies how host has to negotiate access before trying SCSI
47 #define MASS_SUBCLASS_IEEE1667 0x08
48 
49 // Mass Storage Class Protocols
50 #define MASS_PROTO_CBI 0x00 // CBI (with command completion interrupt)
51 #define MASS_PROTO_CBI_NO_INT 0x01 // CBI (without command completion interrupt)
52 #define MASS_PROTO_OBSOLETE 0x02
53 #define MASS_PROTO_BBB 0x50 // Bulk Only Transport
54 #define MASS_PROTO_UAS 0x62
55 
56 // Request Codes
57 #define MASS_REQ_ADSC 0x00
58 #define MASS_REQ_GET 0xFC
59 #define MASS_REQ_PUT 0xFD
60 #define MASS_REQ_GET_MAX_LUN 0xFE
61 #define MASS_REQ_BOMSR 0xFF // Bulk-Only Mass Storage Reset
62 
63 #define MASS_CBW_SIGNATURE 0x43425355
64 #define MASS_CSW_SIGNATURE 0x53425355
65 
66 #define MASS_CMD_DIR_OUT 0 // (0 << 7)
67 #define MASS_CMD_DIR_IN 0x80 //(1 << 7)
68 
69 /*
70  * Reference documents from T10 (http://www.t10.org)
71  * SCSI Primary Commands - 3 (SPC-3)
72  * SCSI Block Commands - 2 (SBC-2)
73  * Multi-Media Commands - 5 (MMC-5)
74  */
75 
76 /* Group 1 commands (CDB's here are should all be 6-bytes) */
77 #define SCSI_CMD_TEST_UNIT_READY 0x00
78 #define SCSI_CMD_REQUEST_SENSE 0x03
79 #define SCSI_CMD_FORMAT_UNIT 0x04
80 #define SCSI_CMD_READ_6 0x08
81 #define SCSI_CMD_WRITE_6 0x0A
82 #define SCSI_CMD_INQUIRY 0x12
83 #define SCSI_CMD_MODE_SELECT_6 0x15
84 #define SCSI_CMD_MODE_SENSE_6 0x1A
85 #define SCSI_CMD_START_STOP_UNIT 0x1B
86 #define SCSI_CMD_PREVENT_REMOVAL 0x1E
87 /* Group 2 Commands (CDB's here are 10-bytes) */
88 #define SCSI_CMD_READ_FORMAT_CAPACITIES 0x23
89 #define SCSI_CMD_READ_CAPACITY_10 0x25
90 #define SCSI_CMD_READ_10 0x28
91 #define SCSI_CMD_WRITE_10 0x2A
92 #define SCSI_CMD_SEEK_10 0x2B
93 #define SCSI_CMD_ERASE_10 0x2C
94 #define SCSI_CMD_WRITE_AND_VERIFY_10 0x2E
95 #define SCSI_CMD_VERIFY_10 0x2F
96 #define SCSI_CMD_SYNCHRONIZE_CACHE 0x35
97 #define SCSI_CMD_WRITE_BUFFER 0x3B
98 #define SCSI_CMD_READ_BUFFER 0x3C
99 #define SCSI_CMD_READ_SUBCHANNEL 0x42
100 #define SCSI_CMD_READ_TOC 0x43
101 #define SCSI_CMD_READ_HEADER 0x44
102 #define SCSI_CMD_PLAY_AUDIO_10 0x45
103 #define SCSI_CMD_GET_CONFIGURATION 0x46
104 #define SCSI_CMD_PLAY_AUDIO_MSF 0x47
105 #define SCSI_CMD_PLAY_AUDIO_TI 0x48
106 #define SCSI_CMD_PLAY_TRACK_REL_10 0x49
107 #define SCSI_CMD_GET_EVENT_STATUS 0x4A
108 #define SCSI_CMD_PAUSE_RESUME 0x4B
109 #define SCSI_CMD_READ_DISC_INFORMATION 0x51
110 #define SCSI_CMD_READ_TRACK_INFORMATION 0x52
111 #define SCSI_CMD_RESERVE_TRACK 0x53
112 #define SCSI_CMD_SEND_OPC_INFORMATION 0x54
113 #define SCSI_CMD_MODE_SELECT_10 0x55
114 #define SCSI_CMD_REPAIR_TRACK 0x58
115 #define SCSI_CMD_MODE_SENSE_10 0x5A
116 #define SCSI_CMD_CLOSE_TRACK_SESSION 0x5B
117 #define SCSI_CMD_READ_BUFFER_CAPACITY 0x5C
118 #define SCSI_CMD_SEND_CUE_SHEET 0x5D
119 /* Group 5 Commands (CDB's here are 12-bytes) */
120 #define SCSI_CMD_REPORT_LUNS 0xA0
121 #define SCSI_CMD_BLANK 0xA1
122 #define SCSI_CMD_SECURITY_PROTOCOL_IN 0xA2
123 #define SCSI_CMD_SEND_KEY 0xA3
124 #define SCSI_CMD_REPORT_KEY 0xA4
125 #define SCSI_CMD_PLAY_AUDIO_12 0xA5
126 #define SCSI_CMD_LOAD_UNLOAD 0xA6
127 #define SCSI_CMD_SET_READ_AHEAD 0xA7
128 #define SCSI_CMD_READ_12 0xA8
129 #define SCSI_CMD_PLAY_TRACK_REL_12 0xA9
130 #define SCSI_CMD_WRITE_12 0xAA
131 #define SCSI_CMD_READ_MEDIA_SERIAL_12 0xAB
132 #define SCSI_CMD_GET_PERFORMANCE 0xAC
133 #define SCSI_CMD_READ_DVD_STRUCTURE 0xAD
134 #define SCSI_CMD_SECURITY_PROTOCOL_OUT 0xB5
135 #define SCSI_CMD_SET_STREAMING 0xB6
136 #define SCSI_CMD_READ_MSF 0xB9
137 #define SCSI_CMD_SET_SPEED 0xBB
138 #define SCSI_CMD_MECHANISM_STATUS 0xBD
139 #define SCSI_CMD_READ_CD 0xBE
140 #define SCSI_CMD_SEND_DISC_STRUCTURE 0xBF
141 /* Vendor-unique Commands, included for completeness */
142 #define SCSI_CMD_CD_PLAYBACK_STATUS 0xC4 /* SONY unique */
143 #define SCSI_CMD_PLAYBACK_CONTROL 0xC9 /* SONY unique */
144 #define SCSI_CMD_READ_CDDA 0xD8 /* Vendor unique */
145 #define SCSI_CMD_READ_CDXA 0xDB /* Vendor unique */
146 #define SCSI_CMD_READ_ALL_SUBCODES 0xDF /* Vendor unique */
147 
148 /* SCSI error codes */
149 #define SCSI_S_NOT_READY 0x02
150 #define SCSI_S_MEDIUM_ERROR 0x03
151 #define SCSI_S_ILLEGAL_REQUEST 0x05
152 #define SCSI_S_UNIT_ATTENTION 0x06
153 #define SCSI_ASC_LBA_OUT_OF_RANGE 0x21
154 #define SCSI_ASC_MEDIA_CHANGED 0x28
155 #define SCSI_ASC_MEDIUM_NOT_PRESENT 0x3A
156 
157 /* USB error codes */
158 #define MASS_ERR_SUCCESS 0x00
159 #define MASS_ERR_PHASE_ERROR 0x02
160 #define MASS_ERR_UNIT_NOT_READY 0x03
161 #define MASS_ERR_UNIT_BUSY 0x04
162 #define MASS_ERR_STALL 0x05
163 #define MASS_ERR_CMD_NOT_SUPPORTED 0x06
164 #define MASS_ERR_INVALID_CSW 0x07
165 #define MASS_ERR_NO_MEDIA 0x08
166 #define MASS_ERR_BAD_LBA 0x09
167 #define MASS_ERR_MEDIA_CHANGED 0x0A
168 #define MASS_ERR_DEVICE_DISCONNECTED 0x11
169 #define MASS_ERR_UNABLE_TO_RECOVER 0x12 // Reset recovery error
170 #define MASS_ERR_INVALID_LUN 0x13
171 #define MASS_ERR_WRITE_STALL 0x14
172 #define MASS_ERR_READ_NAKS 0x15
173 #define MASS_ERR_WRITE_NAKS 0x16
174 #define MASS_ERR_WRITE_PROTECTED 0x17
175 #define MASS_ERR_NOT_IMPLEMENTED 0xFD
176 #define MASS_ERR_GENERAL_SCSI_ERROR 0xFE
177 #define MASS_ERR_GENERAL_USB_ERROR 0xFF
178 #define MASS_ERR_USER 0xA0 // For subclasses to define their own error codes
179 
180 #define MASS_TRANS_FLG_CALLBACK 0x01 // Callback is involved
181 #define MASS_TRANS_FLG_NO_STALL_CHECK 0x02 // STALL condition is not checked
182 #define MASS_TRANS_FLG_NO_PHASE_CHECK 0x04 // PHASE_ERROR is not checked
183 
184 #define MASS_MAX_ENDPOINTS 3
185 
186 struct Capacity {
187  uint8_t data[8];
188  //uint32_t dwBlockAddress;
189  //uint32_t dwBlockLength;
190 } __attribute__((packed));
191 
192 struct BASICCDB {
193  uint8_t Opcode;
194 
195  unsigned unused : 5;
196  unsigned LUN : 3;
197 
198  uint8_t info[12];
199 } __attribute__((packed));
200 
202 
203 struct CDB6 {
204  uint8_t Opcode;
205 
206  unsigned LBAMSB : 5;
207  unsigned LUN : 3;
208 
209  uint8_t LBAHB;
210  uint8_t LBALB;
212  uint8_t Control;
213 
214 public:
215 
216  CDB6(uint8_t _Opcode, uint8_t _LUN, uint32_t LBA, uint8_t _AllocationLength, uint8_t _Control) :
217  Opcode(_Opcode), LBAMSB(BGRAB2(LBA) & 0x1f), LUN(_LUN), LBAHB(BGRAB1(LBA)), LBALB(BGRAB0(LBA)),
218  AllocationLength(_AllocationLength), Control(_Control) {
219  }
220 
221  CDB6(uint8_t _Opcode, uint8_t _LUN, uint8_t _AllocationLength, uint8_t _Control) :
222  Opcode(_Opcode), LBAMSB(0), LUN(_LUN), LBAHB(0), LBALB(0),
223  AllocationLength(_AllocationLength), Control(_Control) {
224  }
225 } __attribute__((packed));
226 
227 typedef CDB6 CDB6_t;
228 
229 struct CDB10 {
230  uint8_t Opcode;
231 
232  unsigned Service_Action : 5;
233  unsigned LUN : 3;
234 
235  uint8_t LBA_L_M_MB;
236  uint8_t LBA_L_M_LB;
237  uint8_t LBA_L_L_MB;
238  uint8_t LBA_L_L_LB;
239 
240  uint8_t Misc2;
241 
242  uint8_t ALC_MB;
243  uint8_t ALC_LB;
244 
245  uint8_t Control;
246 public:
247 
248  CDB10(uint8_t _Opcode, uint8_t _LUN) :
249  Opcode(_Opcode), Service_Action(0), LUN(_LUN),
251  Misc2(0), ALC_MB(0), ALC_LB(0), Control(0) {
252  }
253 
254  CDB10(uint8_t _Opcode, uint8_t _LUN, uint16_t xflen, uint32_t _LBA) :
255  Opcode(_Opcode), Service_Action(0), LUN(_LUN),
256  LBA_L_M_MB(BGRAB3(_LBA)), LBA_L_M_LB(BGRAB2(_LBA)), LBA_L_L_MB(BGRAB1(_LBA)), LBA_L_L_LB(BGRAB0(_LBA)),
257  Misc2(0), ALC_MB(BGRAB1(xflen)), ALC_LB(BGRAB0(xflen)), Control(0) {
258  }
259 } __attribute__((packed));
260 
261 typedef CDB10 CDB10_t;
262 
263 struct CDB12 {
264  uint8_t Opcode;
265 
266  unsigned Service_Action : 5;
267  unsigned Misc : 3;
268 
269  uint8_t LBA_L_M_LB;
270  uint8_t LBA_L_L_MB;
271  uint8_t LBA_L_L_LB;
272 
273  uint8_t ALC_M_LB;
274  uint8_t ALC_L_MB;
275  uint8_t ALC_L_LB;
276  uint8_t Control;
277 } __attribute__((packed));
278 
279 typedef CDB12 CDB12_t;
280 
281 struct CDB_LBA32_16 {
282  uint8_t Opcode;
283 
284  unsigned Service_Action : 5;
285  unsigned Misc : 3;
286 
287  uint8_t LBA_L_M_MB;
288  uint8_t LBA_L_M_LB;
289  uint8_t LBA_L_L_MB;
290  uint8_t LBA_L_L_LB;
291 
292  uint8_t A_M_M_MB;
293  uint8_t A_M_M_LB;
294  uint8_t A_M_L_MB;
295  uint8_t A_M_L_LB;
296 
297  uint8_t ALC_M_MB;
298  uint8_t ALC_M_LB;
299  uint8_t ALC_L_MB;
300  uint8_t ALC_L_LB;
301 
302  uint8_t Misc2;
303  uint8_t Control;
304 } __attribute__((packed));
305 
306 struct CDB_LBA64_16 {
307  uint8_t Opcode;
308  uint8_t Misc;
309 
310  uint8_t LBA_M_M_MB;
311  uint8_t LBA_M_M_LB;
312  uint8_t LBA_M_L_MB;
313  uint8_t LBA_M_L_LB;
314 
315  uint8_t LBA_L_M_MB;
316  uint8_t LBA_L_M_LB;
317  uint8_t LBA_L_L_MB;
318  uint8_t LBA_L_L_LB;
319 
320  uint8_t ALC_M_MB;
321  uint8_t ALC_M_LB;
322  uint8_t ALC_L_MB;
323  uint8_t ALC_L_LB;
324 
325  uint8_t Misc2;
326  uint8_t Control;
327 } __attribute__((packed));
328 
330  uint8_t DeviceType : 5;
331  uint8_t PeripheralQualifier : 3;
332 
333  unsigned Reserved : 7;
334  unsigned Removable : 1;
335 
336  uint8_t Version;
337 
338  unsigned ResponseDataFormat : 4;
339  unsigned HISUP : 1;
340  unsigned NormACA : 1;
341  unsigned TrmTsk : 1;
342  unsigned AERC : 1;
343 
345  //uint8_t Reserved3[2];
346 
347  unsigned PROTECT : 1;
348  unsigned Res : 2;
349  unsigned ThreePC : 1;
350  unsigned TPGS : 2;
351  unsigned ACC : 1;
352  unsigned SCCS : 1;
353 
354  unsigned ADDR16 : 1;
355  unsigned R1 : 1;
356  unsigned R2 : 1;
357  unsigned MCHNGR : 1;
358  unsigned MULTIP : 1;
359  unsigned VS : 1;
360  unsigned ENCSERV : 1;
361  unsigned BQUE : 1;
362 
363  unsigned SoftReset : 1;
364  unsigned CmdQue : 1;
365  unsigned Reserved4 : 1;
366  unsigned Linked : 1;
367  unsigned Sync : 1;
368  unsigned WideBus16Bit : 1;
369  unsigned WideBus32Bit : 1;
370  unsigned RelAddr : 1;
371 
372  uint8_t VendorID[8];
373  uint8_t ProductID[16];
374  uint8_t RevisionID[4];
375 } __attribute__((packed));
376 
378  uint32_t dCBWSignature;
379  uint32_t dCBWTag;
381  uint8_t bmCBWFlags;
382 public:
383 
385  }
386 
387  CommandBlockWrapperBase(uint32_t tag, uint32_t xflen, uint8_t flgs) :
389  }
390 } __attribute__((packed));
391 
393 
394  struct {
395  uint8_t bmCBWLUN : 4;
396  uint8_t bmReserved1 : 4;
397  };
398 
399  struct {
400  uint8_t bmCBWCBLength : 4;
401  uint8_t bmReserved2 : 4;
402  };
403 
404  uint8_t CBWCB[16];
405 
406 public:
407  // All zeroed.
408 
411  for(int i = 0; i < 16; i++) CBWCB[i] = 0;
412  }
413 
414  // Generic Wrap, CDB zeroed.
415 
416  CommandBlockWrapper(uint32_t tag, uint32_t xflen, uint8_t flgs, uint8_t lu, uint8_t cmdlen, uint8_t cmd) :
417  CommandBlockWrapperBase(tag, xflen, flgs),
418  bmCBWLUN(lu), bmReserved1(0), bmCBWCBLength(cmdlen), bmReserved2(0) {
419  for(int i = 0; i < 16; i++) CBWCB[i] = 0;
420  // Type punning can cause optimization problems and bugs.
421  // Using reinterpret_cast to a dreinterpretifferent object is the proper way to do this.
422  //(((BASICCDB_t *) CBWCB)->LUN) = cmd;
423  BASICCDB_t *x = reinterpret_cast<BASICCDB_t *>(CBWCB);
424  x->LUN = cmd;
425  }
426 
427  // Wrap for CDB of 6
428 
429  CommandBlockWrapper(uint32_t tag, uint32_t xflen, CDB6_t *cdb, uint8_t dir) :
430  CommandBlockWrapperBase(tag, xflen, dir),
431  bmCBWLUN(cdb->LUN), bmReserved1(0), bmCBWCBLength(6), bmReserved2(0) {
432  memcpy(&CBWCB, cdb, 6);
433  }
434  // Wrap for CDB of 10
435 
436  CommandBlockWrapper(uint32_t tag, uint32_t xflen, CDB10_t *cdb, uint8_t dir) :
437  CommandBlockWrapperBase(tag, xflen, dir),
438  bmCBWLUN(cdb->LUN), bmReserved1(0), bmCBWCBLength(10), bmReserved2(0) {
439  memcpy(&CBWCB, cdb, 10);
440  }
441 } __attribute__((packed));
442 
444  uint32_t dCSWSignature;
445  uint32_t dCSWTag;
446  uint32_t dCSWDataResidue;
447  uint8_t bCSWStatus;
448 } __attribute__((packed));
449 
451  uint8_t bResponseCode;
452  uint8_t bSegmentNumber;
453 
454  uint8_t bmSenseKey : 4;
455  uint8_t bmReserved : 1;
456  uint8_t bmILI : 1;
457  uint8_t bmEOM : 1;
458  uint8_t bmFileMark : 1;
459 
460  uint8_t Information[4];
466  uint8_t SenseKeySpecific[3];
467 } __attribute__((packed));
468 
470 protected:
471  static const uint8_t epDataInIndex; // DataIn endpoint index
472  static const uint8_t epDataOutIndex; // DataOUT endpoint index
473  static const uint8_t epInterruptInIndex; // InterruptIN endpoint index
474 
476  uint8_t bAddress;
477  uint8_t bConfNum; // configuration number
478  uint8_t bIface; // interface value
479  uint8_t bNumEP; // total number of EP in the configuration
480  uint32_t qNextPollTime; // next poll time
481  bool bPollEnable; // poll enable flag
482 
484 
485  uint32_t dCBWTag; // Tag
486  //uint32_t dCBWDataTransferLength; // Data Transfer Length
487  uint8_t bLastUsbError; // Last USB error
488  uint8_t bMaxLUN; // Max LUN
489  uint8_t bTheLUN; // Active LUN
490  uint32_t CurrentCapacity[MASS_MAX_SUPPORTED_LUN]; // Total sectors
491  uint16_t CurrentSectorSize[MASS_MAX_SUPPORTED_LUN]; // Sector size, clipped to 16 bits
492  bool LUNOk[MASS_MAX_SUPPORTED_LUN]; // use this to check for media changes.
495 
496 
497  // Additional Initialization Method for Subclasses
498 
499  virtual uint8_t OnInit() {
500  return 0;
501  };
502 public:
503  BulkOnly(USB *p);
504 
505  uint8_t GetLastUsbError() {
506  return bLastUsbError;
507  };
508 
509  uint8_t GetbMaxLUN() {
510  return bMaxLUN; // Max LUN
511  }
512 
513  uint8_t GetbTheLUN() {
514  return bTheLUN; // Active LUN
515  }
516 
517  bool WriteProtected(uint8_t lun);
518  uint8_t MediaCTL(uint8_t lun, uint8_t ctl);
519  uint8_t Read(uint8_t lun, uint32_t addr, uint16_t bsize, uint8_t blocks, uint8_t *buf);
520  uint8_t Read(uint8_t lun, uint32_t addr, uint16_t bsize, uint8_t blocks, USBReadParser *prs);
521  uint8_t Write(uint8_t lun, uint32_t addr, uint16_t bsize, uint8_t blocks, const uint8_t *buf);
522  uint8_t LockMedia(uint8_t lun, uint8_t lock);
523 
524  bool LUNIsGood(uint8_t lun);
525  uint32_t GetCapacity(uint8_t lun);
526  uint16_t GetSectorSize(uint8_t lun);
527 
528  // USBDeviceConfig implementation
529  uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed);
530  uint8_t ConfigureDevice(uint8_t parent, uint8_t port, bool lowspeed);
531 
532  uint8_t Release();
533  uint8_t Poll();
534 
535  virtual uint8_t GetAddress() {
536  return bAddress;
537  };
538 
539  // UsbConfigXtracter implementation
540  void EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep);
541 
542  virtual bool DEVCLASSOK(uint8_t klass) {
543  return (klass == USB_CLASS_MASS_STORAGE);
544  }
545 
546  uint8_t SCSITransaction6(CDB6_t *cdb, uint16_t buf_size, void *buf, uint8_t dir);
547  uint8_t SCSITransaction10(CDB10_t *cdb, uint16_t buf_size, void *buf, uint8_t dir);
548 
549 private:
550  uint8_t Inquiry(uint8_t lun, uint16_t size, uint8_t *buf);
551  uint8_t TestUnitReady(uint8_t lun);
552  uint8_t RequestSense(uint8_t lun, uint16_t size, uint8_t *buf);
553  uint8_t ModeSense6(uint8_t lun, uint8_t pc, uint8_t page, uint8_t subpage, uint8_t len, uint8_t *buf);
554  uint8_t GetMaxLUN(uint8_t *max_lun);
555  uint8_t SetCurLUN(uint8_t lun);
556  void Reset();
557  uint8_t ResetRecovery();
558  uint8_t ReadCapacity10(uint8_t lun, uint8_t *buf);
559  void ClearAllEP();
560  void CheckMedia();
561  bool CheckLUN(uint8_t lun);
562  uint8_t Page3F(uint8_t lun);
563  bool IsValidCBW(uint8_t size, uint8_t *pcbw);
564  bool IsMeaningfulCBW(uint8_t size, uint8_t *pcbw);
565 
566  bool IsValidCSW(CommandStatusWrapper *pcsw, CommandBlockWrapperBase *pcbw);
567 
568  uint8_t ClearEpHalt(uint8_t index);
569 #if MS_WANT_PARSER
570  uint8_t Transaction(CommandBlockWrapper *cbw, uint16_t bsize, void *buf, uint8_t flags);
571 #endif
572  uint8_t Transaction(CommandBlockWrapper *cbw, uint16_t bsize, void *buf);
573  uint8_t HandleUsbError(uint8_t error, uint8_t index);
574  uint8_t HandleSCSIError(uint8_t status);
575 
576 };
577 
578 #endif // __MASSTORAGE_H__
#define USB_CLASS_MASS_STORAGE
Definition: UsbCore.h:78
static const uint8_t epInterruptInIndex
Definition: masstorage.h:473
void EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep)
Definition: masstorage.cpp:550
uint8_t bLastUsbError
Definition: masstorage.h:487
bool bPollEnable
Definition: masstorage.h:481
uint8_t bTheLUN
Definition: masstorage.h:489
uint32_t qNextPollTime
Definition: masstorage.h:480
uint8_t MediaCTL(uint8_t lun, uint8_t ctl)
Definition: masstorage.cpp:137
virtual uint8_t GetAddress()
Definition: masstorage.h:535
virtual uint8_t OnInit()
Definition: masstorage.h:499
uint8_t Write(uint8_t lun, uint32_t addr, uint16_t bsize, uint8_t blocks, const uint8_t *buf)
Definition: masstorage.cpp:195
uint8_t Read(uint8_t lun, uint32_t addr, uint16_t bsize, uint8_t blocks, uint8_t *buf)
Definition: masstorage.cpp:161
uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed)
Definition: masstorage.cpp:333
uint8_t Poll()
Definition: masstorage.cpp:676
BulkOnly(USB *p)
Definition: masstorage.cpp:229
uint32_t GetCapacity(uint8_t lun)
Definition: masstorage.cpp:43
USB * pUsb
Definition: masstorage.h:475
uint8_t bMaxLUN
Definition: masstorage.h:488
uint8_t bNumEP
Definition: masstorage.h:479
uint32_t CurrentCapacity[MASS_MAX_SUPPORTED_LUN]
Definition: masstorage.h:490
uint32_t dCBWTag
Definition: masstorage.h:485
bool WriteProtected(uint8_t lun)
Definition: masstorage.cpp:77
virtual bool DEVCLASSOK(uint8_t klass)
Definition: masstorage.h:542
uint8_t Release()
Definition: masstorage.cpp:598
static const uint8_t epDataOutIndex
Definition: masstorage.h:472
uint8_t bAddress
Definition: masstorage.h:476
static const uint8_t epDataInIndex
Definition: masstorage.h:471
bool LUNOk[MASS_MAX_SUPPORTED_LUN]
Definition: masstorage.h:492
uint16_t CurrentSectorSize[MASS_MAX_SUPPORTED_LUN]
Definition: masstorage.h:491
bool LUNIsGood(uint8_t lun)
Definition: masstorage.cpp:67
uint8_t ConfigureDevice(uint8_t parent, uint8_t port, bool lowspeed)
Definition: masstorage.cpp:258
uint8_t bConfNum
Definition: masstorage.h:477
uint8_t GetLastUsbError()
Definition: masstorage.h:505
uint8_t SCSITransaction6(CDB6_t *cdb, uint16_t buf_size, void *buf, uint8_t dir)
Definition: masstorage.cpp:90
uint8_t bIface
Definition: masstorage.h:478
void PrintEndpointDescriptor(const USB_ENDPOINT_DESCRIPTOR *ep_ptr)
uint16_t GetSectorSize(uint8_t lun)
Definition: masstorage.cpp:55
uint8_t GetbTheLUN()
Definition: masstorage.h:513
uint8_t LockMedia(uint8_t lun, uint8_t lock)
Definition: masstorage.cpp:121
EpInfo epInfo[MASS_MAX_ENDPOINTS]
Definition: masstorage.h:483
uint8_t SCSITransaction10(CDB10_t *cdb, uint16_t buf_size, void *buf, uint8_t dir)
Definition: masstorage.cpp:106
uint8_t GetbMaxLUN()
Definition: masstorage.h:509
bool WriteOk[MASS_MAX_SUPPORTED_LUN]
Definition: masstorage.h:493
Definition: UsbCore.h:212
#define BGRAB1(__usi__)
Definition: macros.h:57
#define BGRAB2(__usi__)
Definition: macros.h:58
#define BGRAB0(__usi__)
Definition: macros.h:56
#define BGRAB3(__usi__)
Definition: macros.h:59
#define MASS_CBW_SIGNATURE
Definition: masstorage.h:63
CDB6 CDB6_t
Definition: masstorage.h:227
BASICCDB BASICCDB_t
Definition: masstorage.h:201
#define MASS_MAX_ENDPOINTS
Definition: masstorage.h:184
CDB12 CDB12_t
Definition: masstorage.h:279
CDB10 CDB10_t
Definition: masstorage.h:261
#define MASS_MAX_SUPPORTED_LUN
Definition: settings.h:79
unsigned unused
Definition: masstorage.h:195
unsigned LUN
Definition: masstorage.h:196
uint8_t Opcode
Definition: masstorage.h:193
uint8_t info[12]
Definition: masstorage.h:198
uint8_t Misc2
Definition: masstorage.h:240
uint8_t ALC_MB
Definition: masstorage.h:242
unsigned LUN
Definition: masstorage.h:233
uint8_t ALC_LB
Definition: masstorage.h:243
uint8_t LBA_L_L_MB
Definition: masstorage.h:237
uint8_t LBA_L_L_LB
Definition: masstorage.h:238
uint8_t Control
Definition: masstorage.h:245
uint8_t LBA_L_M_LB
Definition: masstorage.h:236
CDB10(uint8_t _Opcode, uint8_t _LUN)
Definition: masstorage.h:248
CDB10(uint8_t _Opcode, uint8_t _LUN, uint16_t xflen, uint32_t _LBA)
Definition: masstorage.h:254
uint8_t LBA_L_M_MB
Definition: masstorage.h:235
uint8_t Opcode
Definition: masstorage.h:230
unsigned Service_Action
Definition: masstorage.h:232
uint8_t ALC_L_MB
Definition: masstorage.h:274
uint8_t Control
Definition: masstorage.h:276
uint8_t ALC_L_LB
Definition: masstorage.h:275
uint8_t LBA_L_L_MB
Definition: masstorage.h:270
uint8_t ALC_M_LB
Definition: masstorage.h:273
uint8_t LBA_L_M_LB
Definition: masstorage.h:269
uint8_t Opcode
Definition: masstorage.h:264
unsigned Service_Action
Definition: masstorage.h:266
uint8_t LBA_L_L_LB
Definition: masstorage.h:271
unsigned Misc
Definition: masstorage.h:267
unsigned LBAMSB
Definition: masstorage.h:206
uint8_t LBALB
Definition: masstorage.h:210
uint8_t AllocationLength
Definition: masstorage.h:211
uint8_t LBAHB
Definition: masstorage.h:209
uint8_t Control
Definition: masstorage.h:212
CDB6(uint8_t _Opcode, uint8_t _LUN, uint32_t LBA, uint8_t _AllocationLength, uint8_t _Control)
Definition: masstorage.h:216
unsigned LUN
Definition: masstorage.h:207
uint8_t Opcode
Definition: masstorage.h:204
CDB6(uint8_t _Opcode, uint8_t _LUN, uint8_t _AllocationLength, uint8_t _Control)
Definition: masstorage.h:221
uint8_t ALC_L_LB
Definition: masstorage.h:300
uint8_t A_M_L_MB
Definition: masstorage.h:294
uint8_t LBA_L_L_LB
Definition: masstorage.h:290
uint8_t Misc2
Definition: masstorage.h:302
uint8_t LBA_L_M_MB
Definition: masstorage.h:287
unsigned Misc
Definition: masstorage.h:285
uint8_t ALC_M_LB
Definition: masstorage.h:298
uint8_t A_M_L_LB
Definition: masstorage.h:295
unsigned Service_Action
Definition: masstorage.h:284
uint8_t LBA_L_L_MB
Definition: masstorage.h:289
uint8_t ALC_M_MB
Definition: masstorage.h:297
uint8_t Opcode
Definition: masstorage.h:282
uint8_t A_M_M_MB
Definition: masstorage.h:292
uint8_t Control
Definition: masstorage.h:303
uint8_t LBA_L_M_LB
Definition: masstorage.h:288
uint8_t ALC_L_MB
Definition: masstorage.h:299
uint8_t A_M_M_LB
Definition: masstorage.h:293
uint8_t LBA_M_M_MB
Definition: masstorage.h:310
uint8_t ALC_L_LB
Definition: masstorage.h:323
uint8_t Opcode
Definition: masstorage.h:307
uint8_t LBA_L_L_LB
Definition: masstorage.h:318
uint8_t LBA_M_L_MB
Definition: masstorage.h:312
uint8_t LBA_L_L_MB
Definition: masstorage.h:317
uint8_t Misc
Definition: masstorage.h:308
uint8_t ALC_M_LB
Definition: masstorage.h:321
uint8_t LBA_L_M_LB
Definition: masstorage.h:316
uint8_t LBA_L_M_MB
Definition: masstorage.h:315
uint8_t Misc2
Definition: masstorage.h:325
uint8_t ALC_M_MB
Definition: masstorage.h:320
uint8_t ALC_L_MB
Definition: masstorage.h:322
uint8_t LBA_M_L_LB
Definition: masstorage.h:313
uint8_t Control
Definition: masstorage.h:326
uint8_t LBA_M_M_LB
Definition: masstorage.h:311
uint8_t data[8]
Definition: masstorage.h:187
CommandBlockWrapperBase(uint32_t tag, uint32_t xflen, uint8_t flgs)
Definition: masstorage.h:387
uint32_t dCBWDataTransferLength
Definition: masstorage.h:380
uint8_t CBWCB[16]
Definition: masstorage.h:404
CommandBlockWrapper(uint32_t tag, uint32_t xflen, CDB6_t *cdb, uint8_t dir)
Definition: masstorage.h:429
CommandBlockWrapper(uint32_t tag, uint32_t xflen, CDB10_t *cdb, uint8_t dir)
Definition: masstorage.h:436
CommandBlockWrapper(uint32_t tag, uint32_t xflen, uint8_t flgs, uint8_t lu, uint8_t cmdlen, uint8_t cmd)
Definition: masstorage.h:416
uint32_t dCSWSignature
Definition: masstorage.h:444
uint32_t dCSWDataResidue
Definition: masstorage.h:446
Definition: address.h:39
uint8_t ProductID[16]
Definition: masstorage.h:373
unsigned NormACA
Definition: masstorage.h:340
unsigned PROTECT
Definition: masstorage.h:347
uint8_t RevisionID[4]
Definition: masstorage.h:374
unsigned CmdQue
Definition: masstorage.h:364
unsigned WideBus16Bit
Definition: masstorage.h:368
unsigned SCCS
Definition: masstorage.h:352
unsigned ThreePC
Definition: masstorage.h:349
unsigned ACC
Definition: masstorage.h:351
unsigned RelAddr
Definition: masstorage.h:370
unsigned HISUP
Definition: masstorage.h:339
unsigned MULTIP
Definition: masstorage.h:358
unsigned ENCSERV
Definition: masstorage.h:360
unsigned WideBus32Bit
Definition: masstorage.h:369
unsigned ResponseDataFormat
Definition: masstorage.h:338
uint8_t Version
Definition: masstorage.h:336
uint8_t PeripheralQualifier
Definition: masstorage.h:331
unsigned Res
Definition: masstorage.h:348
unsigned Removable
Definition: masstorage.h:334
unsigned Reserved
Definition: masstorage.h:333
uint8_t DeviceType
Definition: masstorage.h:330
uint8_t AdditionalLength
Definition: masstorage.h:344
unsigned Linked
Definition: masstorage.h:366
unsigned MCHNGR
Definition: masstorage.h:357
unsigned Sync
Definition: masstorage.h:367
unsigned SoftReset
Definition: masstorage.h:363
uint8_t VendorID[8]
Definition: masstorage.h:372
unsigned AERC
Definition: masstorage.h:342
unsigned TPGS
Definition: masstorage.h:350
unsigned ADDR16
Definition: masstorage.h:354
unsigned TrmTsk
Definition: masstorage.h:341
unsigned Reserved4
Definition: masstorage.h:365
unsigned BQUE
Definition: masstorage.h:361
uint8_t Information[4]
Definition: masstorage.h:460
uint8_t bAdditionalSenseCode
Definition: masstorage.h:463
uint8_t SenseKeySpecific[3]
Definition: masstorage.h:466
uint8_t bAdditionalSenseQualifier
Definition: masstorage.h:464
uint8_t CmdSpecificInformation[4]
Definition: masstorage.h:462
uint8_t bFieldReplaceableUnitCode
Definition: masstorage.h:465
uint8_t bAdditionalLength
Definition: masstorage.h:461