| 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 Companys 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 | &MDD_SDSPI_MediaInitialize, |
||
| 437 | &MDD_SDSPI_ReadCapacity, |
||
| 438 | &MDD_SDSPI_ReadSectorSize, |
||
| 439 | &MDD_SDSPI_MediaDetect, |
||
| 440 | &MDD_SDSPI_SectorRead, |
||
| 441 | &MDD_SDSPI_WriteProtectState, |
||
| 442 | &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 |
Powered by WebSVN v2.8.3