|
|
|
|
|
|
|
|
|
|
|
/* |
|
|
|
|
|
* MSC Teensy36 USB Host Mass Storage library |
|
|
|
|
|
* Copyright (c) 2017-2019 Warren Watson. |
|
|
|
|
|
* |
|
|
|
|
|
* Permission is hereby granted, free of charge, to any person obtaining |
|
|
|
|
|
* a copy of this software and associated documentation files (the |
|
|
|
|
|
* "Software"), to deal in the Software without restriction, including |
|
|
|
|
|
* without limitation the rights to use, copy, modify, merge, publish, |
|
|
|
|
|
* distribute, sublicense, and/or sell copies of the Software, and to |
|
|
|
|
|
* permit persons to whom the Software is furnished to do so, subject to |
|
|
|
|
|
* the following conditions: |
|
|
|
|
|
* |
|
|
|
|
|
* The above copyright notice and this permission notice shall be |
|
|
|
|
|
* included in all copies or substantial portions of the Software. |
|
|
|
|
|
* |
|
|
|
|
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, |
|
|
|
|
|
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF |
|
|
|
|
|
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND |
|
|
|
|
|
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS |
|
|
|
|
|
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN |
|
|
|
|
|
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN |
|
|
|
|
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
|
|
|
|
|
* SOFTWARE. |
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
// msc.h |
|
|
|
|
|
|
|
|
|
|
|
#ifndef _MSC_H_ |
|
|
|
|
|
#define _MSC_H_ |
|
|
|
|
|
|
|
|
|
|
|
// SCSI Commands (minimal set) |
|
|
|
|
|
#define CBW_SIGNATURE 0x43425355UL |
|
|
|
|
|
#define CSW_SIGNATURE 0x53425355UL |
|
|
|
|
|
#define CMD_DIR_DATA_OUT 0x00 |
|
|
|
|
|
#define CMD_DIR_DATA_IN 0x80 |
|
|
|
|
|
#define CMD_RD_CAPACITY_10 0x25 |
|
|
|
|
|
#define CMD_INQUIRY 0x12 |
|
|
|
|
|
#define CMD_RD_10 0x28 |
|
|
|
|
|
#define CMD_WR_10 0x2A |
|
|
|
|
|
#define CMD_TEST_UNIT_READY 0x00 |
|
|
|
|
|
#define CMD_REQUEST_SENSE 0x03 |
|
|
|
|
|
#define CMD_START_STOP_UNIT 0x1B |
|
|
|
|
|
#define CMD_REPORT_LUNS 0xA0 |
|
|
|
|
|
#define NO_RD_WR 0x00 // transfer type is not read or write blocks. |
|
|
|
|
|
|
|
|
|
|
|
// Command Status Wrapper Error Codes |
|
|
|
|
|
#define MS_CBW_PASS 0 |
|
|
|
|
|
#define MS_CBW_FAIL 1 |
|
|
|
|
|
#define MS_CBW_PHASE_ERROR 2 |
|
|
|
|
|
#define MS_CSW_TAG_ERROR 253 |
|
|
|
|
|
#define MS_CSW_SIG_ERROR 254 |
|
|
|
|
|
#define MS_SCSI_ERROR 255 |
|
|
|
|
|
|
|
|
|
|
|
// SCSI Sense Key codes |
|
|
|
|
|
#define MS_NOT_READY 0x02 |
|
|
|
|
|
#define MS_MEDIUM_ERROR 0x03 |
|
|
|
|
|
#define MS_ILLEGAL_REQUEST 0x05 |
|
|
|
|
|
#define MS_UNIT_ATTENTION 0x06 |
|
|
|
|
|
#define MS_LBA_OUT_OF_RANGE 0x21 |
|
|
|
|
|
#define MS_MEDIA_CHANGED 0x28 |
|
|
|
|
|
#define MS_MEDIUM_NOT_PRESENT 0x3A |
|
|
|
|
|
|
|
|
|
|
|
// SCSI Error Codes |
|
|
|
|
|
#define MS_MEDIA_CHANGED_ERR 0x2A |
|
|
|
|
|
#define MS_NO_MEDIA_ERR 0x28 |
|
|
|
|
|
#define MS_UNIT_NOT_READY 0x23 |
|
|
|
|
|
#define MS_BAD_LBA_ERR 0x29 |
|
|
|
|
|
#define MS_CMD_ERR 0x26 |
|
|
|
|
|
|
|
|
|
|
|
#define MS_INIT_PASS 0 |
|
|
|
|
|
|
|
|
|
|
|
#define MAXLUNS 16 |
|
|
|
|
|
#define MEDIA_READY_TIMEOUT 1000 |
|
|
|
|
|
#define MSC_CONNECT_TIMEOUT 4000 |
|
|
|
|
|
|
|
|
|
|
|
// Command Block Wrapper Struct |
|
|
|
|
|
typedef struct |
|
|
|
|
|
{ |
|
|
|
|
|
uint32_t Signature; |
|
|
|
|
|
uint32_t Tag; |
|
|
|
|
|
uint32_t TransferLength; |
|
|
|
|
|
uint8_t Flags; |
|
|
|
|
|
uint8_t LUN; |
|
|
|
|
|
uint8_t CommandLength; |
|
|
|
|
|
uint8_t CommandData[16]; |
|
|
|
|
|
} __attribute__((packed)) msCommandBlockWrapper_t; |
|
|
|
|
|
|
|
|
|
|
|
// MSC Command Status Wrapper Struct |
|
|
|
|
|
typedef struct |
|
|
|
|
|
{ |
|
|
|
|
|
uint32_t Signature; |
|
|
|
|
|
uint32_t Tag; |
|
|
|
|
|
uint32_t DataResidue; |
|
|
|
|
|
uint8_t Status; |
|
|
|
|
|
} __attribute__((packed)) msCommandStatusWrapper_t; |
|
|
|
|
|
|
|
|
|
|
|
// MSC Device Capacity Struct |
|
|
|
|
|
typedef struct |
|
|
|
|
|
{ |
|
|
|
|
|
uint32_t Blocks; |
|
|
|
|
|
uint32_t BlockSize; |
|
|
|
|
|
} msSCSICapacity_t; |
|
|
|
|
|
|
|
|
|
|
|
// MSC Inquiry Command Reponse Struct |
|
|
|
|
|
typedef struct |
|
|
|
|
|
{ |
|
|
|
|
|
unsigned DeviceType : 5; |
|
|
|
|
|
unsigned PeripheralQualifier : 3; |
|
|
|
|
|
unsigned Reserved : 7; |
|
|
|
|
|
unsigned Removable : 1; |
|
|
|
|
|
uint8_t Version; |
|
|
|
|
|
unsigned ResponseDataFormat : 4; |
|
|
|
|
|
unsigned Reserved2 : 1; |
|
|
|
|
|
unsigned NormACA : 1; |
|
|
|
|
|
unsigned TrmTsk : 1; |
|
|
|
|
|
unsigned AERC : 1; |
|
|
|
|
|
uint8_t AdditionalLength; |
|
|
|
|
|
uint8_t Reserved3[2]; |
|
|
|
|
|
unsigned SoftReset : 1; |
|
|
|
|
|
unsigned CmdQue : 1; |
|
|
|
|
|
unsigned Reserved4 : 1; |
|
|
|
|
|
unsigned Linked : 1; |
|
|
|
|
|
unsigned Sync : 1; |
|
|
|
|
|
unsigned WideBus16Bit : 1; |
|
|
|
|
|
unsigned WideBus32Bit : 1; |
|
|
|
|
|
unsigned RelAddr : 1; |
|
|
|
|
|
uint8_t VendorID[8]; |
|
|
|
|
|
uint8_t ProductID[16]; |
|
|
|
|
|
uint8_t RevisionID[4]; |
|
|
|
|
|
} __attribute__((packed)) msInquiryResponse_t; |
|
|
|
|
|
|
|
|
|
|
|
// Request Sense Response Struct |
|
|
|
|
|
typedef struct |
|
|
|
|
|
{ |
|
|
|
|
|
uint8_t ResponseCode; |
|
|
|
|
|
uint8_t SegmentNumber; |
|
|
|
|
|
unsigned SenseKey : 4; |
|
|
|
|
|
unsigned Reserved : 1; |
|
|
|
|
|
unsigned ILI : 1; |
|
|
|
|
|
unsigned EOM : 1; |
|
|
|
|
|
unsigned FileMark : 1; |
|
|
|
|
|
uint8_t Information[4]; |
|
|
|
|
|
uint8_t AdditionalLength; |
|
|
|
|
|
uint8_t CmdSpecificInformation[4]; |
|
|
|
|
|
uint8_t AdditionalSenseCode; |
|
|
|
|
|
uint8_t AdditionalSenseQualifier; |
|
|
|
|
|
uint8_t FieldReplaceableUnitCode; |
|
|
|
|
|
uint8_t SenseKeySpecific[3]; |
|
|
|
|
|
uint8_t padding[234]; |
|
|
|
|
|
} __attribute__((packed)) msRequestSenseResponse_t; |
|
|
|
|
|
|
|
|
|
|
|
// MSC Drive status/info struct |
|
|
|
|
|
typedef struct { |
|
|
|
|
|
bool connected = false; // Device is connected |
|
|
|
|
|
bool initialized = false; // Device is initialized |
|
|
|
|
|
bool mounted = false; // Device is mounted |
|
|
|
|
|
const char * drvName = 0; |
|
|
|
|
|
uint32_t bufferSize = 0; |
|
|
|
|
|
uint8_t hubNumber; |
|
|
|
|
|
uint8_t hubPort; |
|
|
|
|
|
uint8_t deviceAddress; |
|
|
|
|
|
uint16_t idVendor; |
|
|
|
|
|
uint16_t idProduct; |
|
|
|
|
|
msSCSICapacity_t capacity; |
|
|
|
|
|
msInquiryResponse_t inquiry; |
|
|
|
|
|
} __attribute__((packed)) msDriveInfo_t; |
|
|
|
|
|
|
|
|
|
|
|
#endif //_MSC_H_ |