/*---------------------------------------------------------------------------- * U S B - K e r n e l *---------------------------------------------------------------------------- * Name: MSCUSER.H * Purpose: Mass Storage Class Custom User Definitions * Version: V1.10 *---------------------------------------------------------------------------- * This software is supplied "AS IS" without any warranties, express, * implied or statutory, including but not limited to the implied * warranties of fitness for purpose, satisfactory quality and * noninfringement. Keil extends you a royalty-free right to reproduce * and distribute executable files created using this software for use * on NXP Semiconductors LPC family microcontroller devices only. Nothing * else gives you the right to use this software. * * Copyright (c) 2005-2009 Keil Software. *---------------------------------------------------------------------------*/ #ifndef __MSCUSER_H__ #define __MSCUSER_H__ /* Max In/Out Packet Size */ #define MSC_MAX_PACKET 64 #define MSC_BLOCK_SIZE 512 /* MSC In/Out Endpoint Address */ #define MSC_EP_IN 0x85 #define MSC_EP_OUT 0x05 /* MSC Requests Callback Functions */ extern uint32_t MSC_Reset (void); extern uint32_t MSC_GetMaxLUN (void); /* MSC Bulk Callback Functions */ extern void MSC_GetCBW (void); extern void MSC_SetCSW (void); extern void MSC_BulkIn (void); extern void MSC_BulkOut(void); enum struct Sense_KEY : uint8_t { NO_SENSE, RECOVERED_ERROR, NOT_READY, MEDIUM_ERROR, HARDWARE_ERROR, ILLEGAL_REQUEST, UNIT_ATTENTION, DATA_PROTECT }; enum struct Sense_ASC : uint8_t { NONE = 0x0, LOGICAL_UNIT_NOT_READY = 0x04, CANNOT_READ_MEDIUM = 0x30, MEDIUM_NOT_PRESENT = 0x3A, MEDIA_CHANGED = 0x28 }; enum struct Sense_ASCQ : uint8_t { // ASC: LOGICAL_UNIT_NOT_READY CAUSE_NOT_REPORTABLE = 0x00, UNIT_IS_IN_PROCESS_OF_BECOMING_READY, INITIALIZING_COMMAND_REQUIRED, MANUAL_INTERVENTION_REQUIRED, FORMAT_IN_PROGRESS, DEVICE_IS_BUSY = 0xFF, // ASC: CANNOT_READ_MEDIUM UNKNOWN_FORMAT = 0x01, // ASC: MEDIUM_NOT_PRESENT REASON_UNKNOWN = 0x00, TRAY_CLOSED, TRAY_OPEN, LOADABLE, AUXILIARY_MEMORY_ACCESSIBLE }; struct Sense { Sense() { reset(); } void set(Sense_KEY key_val, Sense_ASC asc_val = Sense_ASC::NONE, Sense_ASCQ ascq_val = Sense_ASCQ::REASON_UNKNOWN) { key = key_val; asc = asc_val; ascq = ascq_val; } void reset() { key = Sense_KEY::NO_SENSE; asc = Sense_ASC::NONE; ascq = Sense_ASCQ::REASON_UNKNOWN; } bool has_sense() { return key != Sense_KEY::NO_SENSE; } Sense_KEY key; Sense_ASC asc; Sense_ASCQ ascq; }; #endif /* __MSCUSER_H__ */