?lang_form? ?lang_select? ?lang_submit? ?lang_endform?
{HEADER END}
{BLAME START}

library

?curdirlinks? -

Blame information for rev 32

Line No. Rev Author Line
1 32 kaklik /*********************************************************************
2 File Information:
3 FileName: usb_function_msd.h
4 Dependencies: See INCLUDES section below
5 Processor: PIC18, PIC24, or PIC32
6 Compiler: C18, C30, or C32
7 Company: Microchip Technology, Inc.
8  
9 Software License Agreement
10  
11 The software supplied herewith by Microchip Technology Incorporated
12 (the “Company”) for its PICmicro® Microcontroller is intended and
13 supplied to you, the Company’s customer, for use solely and
14 exclusively on Microchip PICmicro Microcontroller products. The
15 software is owned by the Company and/or its supplier, and is
16 protected under applicable copyright laws. All rights are reserved.
17 Any use in violation of the foregoing restrictions may subject the
18 user to criminal sanctions under applicable laws, as well as to
19 civil liability for the breach of the terms and conditions of this
20 license.
21  
22 THIS SOFTWARE IS PROVIDED IN AN “AS IS” CONDITION. NO WARRANTIES,
23 WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT NOT LIMITED
24 TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
25 PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. THE COMPANY SHALL NOT,
26 IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL OR
27 CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
28  
29 Summary:
30 This file contains functions, macros, definitions, variables,
31 datatypes, etc. that are required for use of the MSD function
32 driver. This file should be included in projects that use the MSD
33 \function driver.
34  
35  
36  
37 This file is located in the "\<Install Directory\>\\Microchip\\USB\\MSD
38 Device Driver" directory.
39  
40 Description:
41 USB MSD Function Driver File
42  
43 This file contains functions, macros, definitions, variables,
44 datatypes, etc. that are required for use of the MSD function
45 driver. This file should be included in projects that use the MSD
46 \function driver.
47  
48 This file is located in the "\<Install Directory\>\\Microchip\\USB\\MSD
49 Device Driver" directory.
50  
51 When including this file in a new project, this file can either be
52 referenced from the directory in which it was installed or copied
53 directly into the user application folder. If the first method is
54 chosen to keep the file located in the folder in which it is installed
55 then include paths need to be added so that the library and the
56 application both know where to reference each others files. If the
57 application folder is located in the same folder as the Microchip
58 folder (like the current demo folders), then the following include
59 paths need to be added to the application's project:
60  
61 .
62  
63 ..\\..\\Microchip\\Include
64  
65 If a different directory structure is used, modify the paths as
66 required. An example using absolute paths instead of relative paths
67 would be the following:
68  
69 C:\\Microchip Solutions\\Microchip\\Include
70  
71 C:\\Microchip Solutions\\My Demo Application
72  
73 Change History:
74 Rev Description
75 ---- ------------------------------------------
76 2.6- No Change
77 2.7a
78  
79 ********************************************************************/
80 #ifndef MSD_H
81 #define MSD_H
82  
83 /** I N C L U D E S **********************************************************/
84 #include "Compiler.h"
85 #include "GenericTypeDefs.h"
86 #include "MDD File System\FSDefs.h"
87 //#include "SD Card/sdcard.h"
88  
89 /** D E F I N I T I O N S ****************************************************/
90  
91 /* MSD Interface Class Code */
92 #define MSD_INTF 0x08
93  
94 /* MSD Interface Class SubClass Codes */
95 //Options - from usb_msc_overview_1[1].2.pdf
96 // Supported
97 #define SCSI_TRANSPARENT 0x06
98 // Not-Supported
99 #define RBC 0x01 // Reduced Block Commands (RBC) T10 Project 1240-D
100 #define SSF_8020i 0x02 // C/DVD devices typically use SSF-8020i or MMC-2
101 #define MMC_2 0x02
102 #define QIC_157 0x03 // Tape drives typically use QIC-157 command blocks
103 #define UFI 0x04 // Typically a floppy disk drive (FDD) device
104 #define SSF_8070i 0x05 // Typically a floppy disk drive uses SSF-8070i commands
105  
106 #define MSD_INTF_SUBCLASS SCSI_TRANSPARENT
107 //#define MSD_INTF_SUBCLASS RBC
108  
109 /* MSD Interface Class Protocol Codes */
110 #define MSD_PROTOCOL 0x50
111  
112 /* Class Commands */
113 #define MSD_RESET 0xff
114 #define GET_MAX_LUN 0xfe
115  
116 #define BLOCKLEN_512 0x0200
117  
118 #define STMSDTRIS TRISD0
119 #define STRUNTRIS TRISD1
120 #define STMSDLED LATDbits.LATD0
121 #define STRUNLED LATDbits.LATD1
122 #define ToggleRUNLED() STRUNLED = !STRUNLED;
123  
124 //**********************************************************DOM-IGNORE-BEGIN
125 //Various States of Mass Storage Firmware (MSDTasks)
126 //**********************************************************DOM-IGNORE-END
127  
128 //MSD_WAIT is when the MSD state machine is idle (returned by MSDTasks())
129 #define MSD_WAIT 0x00
130 //MSD_DATA_IN is when the device is sending data (returned by MSDTasks())
131 #define MSD_DATA_IN 0x01
132 //MSD_DATA_OUT is when the device is receiving data (returned by MSDTasks())
133 #define MSD_DATA_OUT 0x02
134 //MSD_SEND_CSW is when the device is waiting to send the CSW (returned by MSDTasks())
135 #define MSD_SEND_CSW 0x03
136  
137 //States of the MSDProcessCommand state machine
138 #define MSD_COMMAND_WAIT 0xFF
139 #define MSD_COMMAND_ERROR 0xFE
140 #define MSD_COMMAND_RESPONSE 0xFD
141 #define MSD_COMMAND_RESPONSE_SEND 0xFC
142 #define MSD_COMMAND_STALL 0xFB
143  
144 /* SCSI Transparent Command Set Sub-class code */
145 #define MSD_INQUIRY 0x12
146 #define MSD_READ_FORMAT_CAPACITY 0x23
147 #define MSD_READ_CAPACITY 0x25
148 #define MSD_READ_10 0x28
149 #define MSD_WRITE_10 0x2a
150 #define MSD_REQUEST_SENSE 0x03
151 #define MSD_MODE_SENSE 0x1a
152 #define MSD_PREVENT_ALLOW_MEDIUM_REMOVAL 0x1e
153 #define MSD_TEST_UNIT_READY 0x00
154 #define MSD_VERIFY 0x2f
155 #define MSD_STOP_START 0x1b
156  
157 #define MSD_READ10_WAIT 0x00
158 #define MSD_READ10_BLOCK 0x01
159 #define MSD_READ10_SECTOR 0x02
160 #define MSD_READ10_TX_SECTOR 0x03
161 #define MSD_READ10_TX_PACKET 0x04
162  
163 #define MSD_WRITE10_WAIT 0x00
164 #define MSD_WRITE10_BLOCK 0x01
165 #define MSD_WRITE10_SECTOR 0x02
166 #define MSD_WRITE10_RX_SECTOR 0x03
167 #define MSD_WRITE10_RX_PACKET 0x04
168  
169 //Define MSD_USE_BLOCKING in order to block the code in an
170 //attempt to get better throughput.
171 //#define MSD_USE_BLOCKING
172  
173 #define MSD_CSW_SIZE 0x0d // 10 bytes CSW data
174 #define MSD_CBW_SIZE 0x1f // 31 bytes CBW data
175  
176 #define INVALID_CBW 1
177 #define VALID_CBW !INVALID_CBW
178  
179 /* Sense Key Error Codes */
180  
181 #define S_NO_SENSE 0x0
182 #define S_RECOVERED_ERROR 0x1
183 #define S_NOT_READY 0x2
184 #define S_MEDIUM_ERROR 0x3
185 #define S_HARDWARE_ERROR 0X4
186 #define S_ILLEGAL_REQUEST 0x5
187 #define S_UNIT_ATTENTION 0x6
188 #define S_DATA_PROTECT 0x7
189 #define S_BLANK_CHECK 0x8
190 #define S_VENDOR_SPECIFIC 0x9
191 #define S_COPY_ABORTED 0xa
192 #define S_ABORTED_COMMAND 0xb
193 #define S_OBSOLETE 0xc
194 #define S_VOLUME_OVERFLOW 0xd
195 #define S_MISCOMPARE 0xe
196  
197 #define S_CURRENT 0x70
198 #define S_DEFERRED 0x71
199  
200 /* ASC ASCQ Codes for Sense Data (only those that we plan to use) */
201 // with sense key Illegal request for a command not supported
202 #define ASC_INVALID_COMMAND_OPCODE 0x20
203 #define ASCQ_INVALID_COMMAND_OPCODE 0x00
204  
205 // from SPC-3 Table 185
206 // with sense key Illegal Request for test unit ready
207 #define ASC_LOGICAL_UNIT_NOT_SUPPORTED 0x25
208 #define ASCQ_LOGICAL_UNIT_NOT_SUPPORTED 0x00
209  
210 // with sense key Not ready
211 #define ASC_LOGICAL_UNIT_DOES_NOT_RESPOND 0x05
212 #define ASCQ_LOGICAL_UNIT_DOES_NOT_RESPOND 0x00
213  
214 #define ASC_MEDIUM_NOT_PRESENT 0x3a
215 #define ASCQ_MEDIUM_NOT_PRESENT 0x00
216  
217 #define ASC_LOGICAL_UNIT_NOT_READY_CAUSE_NOT_REPORTABLE 0x04
218 #define ASCQ_LOGICAL_UNIT_NOT_READY_CAUSE_NOT_REPORTABLE 0x00
219  
220 #define ASC_LOGICAL_UNIT_IN_PROCESS 0x04
221 #define ASCQ_LOGICAL_UNIT_IN_PROCESS 0x01
222  
223 #define ASC_LOGICAL_UNIT_NOT_READY_INIT_REQD 0x04
224 #define ASCQ_LOGICAL_UNIT_NOT_READY_INIT_REQD 0x02
225  
226 #define ASC_LOGICAL_UNIT_NOT_READY_INTERVENTION_REQD 0x04
227 #define ASCQ_LOGICAL_UNIT_NOT_READY_INTERVENTION_REQD 0x03
228  
229 #define ASC_LOGICAL_UNIT_NOT_READY_FORMATTING 0x04
230 #define ASCQ_LOGICAL_UNIT_NOT_READY_FORMATTING 0x04
231  
232 #define ASC_LOGICAL_BLOCK_ADDRESS_OUT_OF_RANGE 0x21
233 #define ASCQ_LOGICAL_BLOCK_ADDRESS_OUT_OF_RANGE 0x00
234  
235 #define ASC_WRITE_PROTECTED 0x27
236 #define ASCQ_WRITE_PROTECTED 0x00
237  
238 /** S T R U C T U R E S ******************************************************/
239 /********************** ******************************************************/
240  
241 typedef struct _USB_MSD_CBW //31 bytes total Command Block Wrapper
242 {
243 DWORD dCBWSignature; // 55 53 42 43h
244 DWORD dCBWTag; // sent by host, device echos this value in CSW (associated a CSW with a CBW)
245 DWORD dCBWDataTransferLength; // number of bytes of data host expects to transfer
246 BYTE bCBWFlags; // CBW flags, bit 7 = 0-data out from host to device,
247 // = 1-device to host, rest bits 0
248 BYTE bCBWLUN; // Most Significant 4bits are always zero, 0 in our case as only one logical unit
249 BYTE bCBWCBLength; // Here most significant 3bits are zero
250 BYTE CBWCB[16]; // Command block to be executed by the device
251 } USB_MSD_CBW;
252  
253 typedef struct { // Command Block for Read 10 (0x28)& Write 10 (0x2a)commands
254 BYTE Opcode;
255 BYTE Flags; // b7-b5 RDProtect, b4 DPO, b3 FUA, b2 Reserved, b1 FUA_NV, b0 Obsolete
256 DWORD_VAL LBA; //
257 BYTE GroupNumber; // b4-b0 is Group Number rest are reserved
258 WORD_VAL TransferLength;
259 BYTE Control;
260 } ReadWriteCB;
261  
262 typedef struct { // Inquiry command format
263 BYTE Opcode;
264 BYTE EVPD; // only b0 is enable vital product data
265 BYTE PageCode;
266 WORD AllocationLength;
267 BYTE Control;
268 } InquiryCB;
269  
270 typedef struct { // Read Capacity 10
271 BYTE Opcode;
272 BYTE Reserved1;
273 DWORD LBA; // Logical Block Address
274 WORD Reserved2;
275 BYTE PMI; // Partial medium Indicator b0 only
276 BYTE Control;
277 } ReadCapacityCB;
278  
279 typedef struct { // Request Sense 0x03
280 BYTE Opcode;
281 BYTE Desc;
282 WORD Reserved;
283 BYTE AllocationLength;
284 BYTE Control;
285 } RequestSenseCB;
286  
287 typedef struct { // Mode Sense 0x1a
288 BYTE Opcode;
289 BYTE DBD; // actually only b3 is used as disable block descriptor
290 BYTE PageCode; // b7,b6 PC=Page Control, b5-b0 PageCode
291 // Page Control bits 00=> CurrentValue, 01=>Changeable Values,10=>Default Value, 11=>Saved Values
292 BYTE SubPageCode;
293 BYTE AllocationLength;
294 BYTE Control;
295 } ModeSenseCB;
296  
297 typedef struct { // PREVENT_ALLOW_MEDIUM_REMOVAL 0x1e
298 BYTE Opcode;
299 BYTE Reserved[3];
300 BYTE Prevent; // only b1-b0 is prevent, rest reserved
301 BYTE Control;
302 } PreventAllowMediumRemovalCB;
303  
304 typedef struct { // TEST_UNIT_READY 0x00
305 BYTE Opcode;
306 DWORD Reserved;
307 BYTE Control;
308 } TestUnitReadyCB;
309  
310 typedef struct { // VERIFY 10 Command 0x2f
311 BYTE Opcode;
312 BYTE VRProtect; // b7-b5 VRProtect, b4 DPO, b3-b2,Reserved, b1 BYTCHK, b0 Obsolete
313 DWORD LBA;
314 BYTE GroupNumber; // b4-b0 Group Number, rest reserved
315 WORD VerificationLength;
316 BYTE Control;
317 } VerifyCB;
318  
319 typedef struct { // STOP_START 0x1b
320 BYTE Opcode;
321 BYTE Immed;
322 WORD Reserved;
323 BYTE Start; // b7-b4 PowerCondition, b3-b2reserved, b1 LOEJ, b0 Start
324 BYTE Control;
325 } StopStartCB;
326  
327  
328 typedef struct _USB_MSD_CSW // Command Status Wrapper
329 {
330 DWORD dCSWSignature; // 55 53 42 53h Signature of a CSW packet
331 DWORD dCSWTag; // echo the dCBWTag of the CBW packet
332 DWORD dCSWDataResidue; // difference in data expected (dCBWDataTransferLength) and actual amount processed/sent
333 BYTE bCSWStatus; // 00h Command Passed, 01h Command Failed, 02h Phase Error, rest obsolete/reserved
334 } USB_MSD_CSW;
335  
336 typedef struct
337 {
338 BYTE Peripheral; // Peripheral_Qualifier:3; Peripheral_DevType:5;
339 BYTE Removble; // removable medium bit7 = 0 means non removable, rest reserved
340 BYTE Version; // version
341 BYTE Response_Data_Format; // b7,b6 Obsolete, b5 Access control co-ordinator, b4 hierarchical addressing support
342 // b3:0 response data format 2 indicates response is in format defined by spec
343 BYTE AdditionalLength; // length in bytes of remaining in standard inquiry data
344 BYTE Sccstp; // b7 SCCS, b6 ACC, b5-b4 TGPS, b3 3PC, b2-b1 Reserved, b0 Protected
345 BYTE bqueetc; // b7 bque, b6- EncServ, b5-VS, b4-MultiP, b3-MChngr, b2-b1 Obsolete, b0-Addr16
346 BYTE CmdQue; // b7-b6 Obsolete, b5-WBUS, b4-Sync, b3-Linked, b2 Obsolete,b1 Cmdque, b0-VS
347 char vendorID[8];
348 char productID[16];
349 char productRev[4];
350 } InquiryResponse;
351  
352 typedef struct {
353 BYTE ModeDataLen;
354 BYTE MediumType;
355 unsigned Resv:4;
356 unsigned DPOFUA:1; // 0 indicates DPO and FUA bits not supported
357 unsigned notused:2;
358 unsigned WP:1; // 0 indicates not write protected
359 BYTE BlockDscLen; // Block Descriptor Length
360 } tModeParamHdr;
361  
362 /* Short LBA mode block descriptor (see Page 1009, SBC-2) */
363 typedef struct {
364 BYTE NumBlocks[4];
365 BYTE Resv; // reserved
366 BYTE BlockLen[3];
367 } tBlockDescriptor;
368  
369 /* Page_0 mode page format */
370 typedef struct {
371  
372 unsigned PageCode:6; // SPC-3 7.4.5
373 unsigned SPF:1; // SubPageFormat=0 means Page_0 format
374 unsigned PS:1; // Parameters Saveable
375  
376 BYTE PageLength; // if 2..n bytes of mode parameters PageLength = n-1
377 BYTE ModeParam[]; // mode parameters
378 } tModePage;
379  
380 typedef struct {
381 tModeParamHdr Header;
382 tBlockDescriptor BlockDsc;
383 tModePage modePage;
384 } ModeSenseResponse;
385  
386  
387 /* Fixed format if Desc bit of request sense cbw is 0 */
388 typedef union __attribute__((packed)){
389 struct
390 {
391 BYTE _byte[18];
392 };
393 struct __attribute__((packed)){
394 unsigned ResponseCode:7; // b6-b0 is Response Code Fixed or descriptor format
395 unsigned VALID:1; // Set to 1 to indicate information field is a valid value
396  
397 BYTE Obsolete;
398  
399 unsigned SenseKey:4; // Refer SPC-3 Section 4.5.6
400 unsigned Resv:1;
401 unsigned ILI:1; // Incorrect Length Indicator
402 unsigned EOM:1; // End of Medium
403 unsigned FILEMARK:1; // for READ and SPACE commands
404  
405 BYTE InformationB0; // device type or command specific (SPC-33.1.18)
406 BYTE InformationB1; // device type or command specific (SPC-33.1.18)
407 BYTE InformationB2; // device type or command specific (SPC-33.1.18)
408 BYTE InformationB3; // device type or command specific (SPC-33.1.18)
409 BYTE AddSenseLen; // number of additional sense bytes that follow <=244
410 DWORD_VAL CmdSpecificInfo; // depends on command on which exception occured
411 BYTE ASC; // additional sense code
412 BYTE ASCQ; // additional sense code qualifier Section 4.5.2.1 SPC-3
413 BYTE FRUC; // Field Replaceable Unit Code 4.5.2.5 SPC-3
414  
415 BYTE SenseKeySpecific[3]; // msb is SKSV sense-key specific valied field set=> valid SKS
416 // 18-n additional sense bytes can be defined later
417 // 18 Bytes Request Sense Fixed Format
418 };
419 } RequestSenseResponse;
420  
421 /**************************************************************************
422 Summary:
423 LUN_FUNCTIONS is a structure of function pointers that tells the stack
424 where to find each of the physical layer functions it is looking for.
425 This structure needs to be defined for any project for PIC24F or PIC32.
426 Description:
427 LUN_FUNCTIONS is a structure of function pointers that tells the stack
428 where to find each of the physical layer functions it is looking for.
429 This structure needs to be defined for any project for PIC24F or PIC32.
430  
431 Typical Usage:
432 <code>
433 LUN_FUNCTIONS LUN[MAX_LUN + 1] =
434 {
435 {
436 &amp;MDD_SDSPI_MediaInitialize,
437 &amp;MDD_SDSPI_ReadCapacity,
438 &amp;MDD_SDSPI_ReadSectorSize,
439 &amp;MDD_SDSPI_MediaDetect,
440 &amp;MDD_SDSPI_SectorRead,
441 &amp;MDD_SDSPI_WriteProtectState,
442 &amp;MDD_SDSPI_SectorWrite
443 }
444 };
445 </code>
446  
447 In the above code we are passing the address of the SDSPI functions to
448 the corresponding member of the LUN_FUNCTIONS structure. In the above
449 case we have created an array of LUN_FUNCTIONS structures so that it is
450 possible to have multiple physical layers by merely increasing the
451 MAX_LUN variable and by adding one more set of entries in the array.
452 Please take caution to insure that each function is in the the correct
453 location in the structure. Incorrect alignment will cause the USB stack
454 to call the incorrect function for a given command.
455  
456 See the MDD File System Library for additional information about the
457 available physical media, their requirements, and how to use their
458 associated functions.
459 **************************************************************************/
460 typedef struct
461 {
462 //Function pointer to the MediaInitialize() function of the physical media
463 // being used.
464 MEDIA_INFORMATION* (*MediaInitialize)();
465 //Function pointer to the ReadCapacity() function of the physical media
466 // being used.
467 DWORD (*ReadCapacity)();
468 //Function pointer to the ReadSectorSize() function of the physical media
469 // being used.
470 WORD (*ReadSectorSize)();
471 //Function pointer to the MediaDetect() function of the physical media
472 // being used.
473 BYTE (*MediaDetect)();
474 //Function pointer to the SectorRead() function of the physical media being
475 // used.
476 BYTE (*SectorRead)(DWORD sector_addr, BYTE* buffer);
477 //Function pointer to the WriteProtectState() function of the physical
478 // media being used.
479 BYTE (*WriteProtectState)();
480 //Function pointer to the SectorWrite() function of the physical media
481 // being used.
482 BYTE (*SectorWrite)(DWORD sector_addr, BYTE* buffer, BYTE allowWriteToZero);
483 } LUN_FUNCTIONS;
484  
485 /** Section: Externs *********************************************************/
486 extern volatile USB_MSD_CBW msd_cbw;
487 extern volatile USB_MSD_CSW msd_csw;
488 extern volatile char msd_buffer[512];
489 extern BOOL SoftDetach[MAX_LUN + 1];
490 extern volatile CTRL_TRF_SETUP SetupPkt;
491 extern volatile BYTE CtrlTrfData[USB_EP0_BUFF_SIZE];
492  
493  
494 /** Section: Public Prototypes ***********************************************/
495 void USBCheckMSDRequest(void);
496 BYTE MSDTasks(void);
497 void USBMSDInit(void);
498  
499 /**************************************************************************
500 Function:
501 void LUNSoftDetach(BYTE LUN)
502  
503 Summary:
504  
505 Description:
506  
507 Parameters:
508 LUN - logical unit number to detach
509  
510 Return Values:
511 None
512  
513 Remarks:
514 Once a soft detached is initiated a soft attached, LUNSoftAttach(),
515 on the same LUN must be performed before the device will re-attach
516  
517 **************************************************************************/
518 #define LUNSoftDetach(LUN) SoftDetach[LUN]=TRUE;
519  
520 /**************************************************************************
521 Function:
522 void LUNSoftAttach(BYTE LUN)
523  
524 Summary:
525  
526 Description:
527  
528 Parameters:
529 LUN - logical unit number to detach
530  
531 Return Values:
532 None
533  
534 Remarks:
535 Once a soft detached is initiated a soft attached, LUNSoftAttach(),
536 on the same LUN must be performed before the device will re-attach
537  
538 **************************************************************************/
539 #define LUNSoftAttach(LUN) SoftDetach[LUN]=FALSE;
540  
541  
542 #endif
{BLAME END}
{FOOTER START}

Powered by WebSVN v2.8.3