/* ---------------------------------------------------------------------------- * ATMEL Microcontroller Software Support * ---------------------------------------------------------------------------- * Copyright (c) 2008, Atmel Corporation * * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the disclaimer below. * * Atmel's name may not be used to endorse or promote products derived from * this software without specific prior written permission. * * DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ---------------------------------------------------------------------------- */ /** \file * \section Purpose * * Logical Unit Number (LUN) used by the Mass Storage driver and the SCSI * protocol. Represents a logical hard-drive. * * \section Usage * -# Initialize Memory related pins (see pio & board.h). * -# Initialize a Media instance for the LUN (see memories). * -# Initlalize the LUN with LUN_Init, and link to the initialized Media. * -# To read data from the LUN linked media, uses LUN_Read. * -# To write data to the LUN linked media, uses LUN_Write. * -# To unlink the media, uses LUN_Eject. */ #ifndef MSDLUN_H #define MSDLUN_H /** \addtogroup usbd_msd *@{ */ /*------------------------------------------------------------------------------ * Headers *------------------------------------------------------------------------------*/ #include #include "memories.h" #include "SBC.h" #include "MSDIOFifo.h" #include "USBD.h" /*------------------------------------------------------------------------------ * Definitions *------------------------------------------------------------------------------*/ /** LUN RC: success */ #define LUN_STATUS_SUCCESS 0x00 /** LUN RC: error */ #define LUN_STATUS_ERROR 0x02 /** Media of LUN is removed */ #define LUN_NOT_PRESENT 0x00 /** LUN is ejected by host */ #define LUN_EJECTED 0x01 /** Media of LUN is changed */ #define LUN_CHANGED 0x10 /** LUN Not Ready to Ready transition */ #define LUN_TRANS_READY LUN_CHANGED /** Media of LUN is ready */ #define LUN_READY 0x11 /*------------------------------------------------------------------------------ * Types *------------------------------------------------------------------------------*/ /** Mass storage device data flow monitor function type * \param flowDirection 1 - device to host (READ10) * 0 - host to device (WRITE10) * \param dataLength Length of data transferred in bytes. * \param fifoNullCount Times that FIFO is NULL to wait * \param fifoFullCount Times that FIFO is filled to wait */ typedef void(*MSDLunDataMonitorFunction)(uint8_t flowDirection, uint32_t dataLength, uint32_t fifoNullCount, uint32_t fifoFullCount); /*------------------------------------------------------------------------------ * Structures *------------------------------------------------------------------------------*/ /** \brief LUN structure */ typedef struct { /** Pointer to a SBCInquiryData instance. */ SBCInquiryData *inquiryData; /** Fifo for USB transfer, must be assigned. */ MSDIOFifo ioFifo; /** Pointer to Media instance for the LUN. */ Media *media; /** Pointer to a Monitor Function to analyze the flow of LUN. * \param flowDirection 1 - device to host (READ10) * 0 - host to device (WRITE10) * \param dataLength Length of data transferred in bytes. * \param fifoNullCount Times that FIFO is NULL to wait * \param fifoFullCount Times that FIFO is filled to wait */ void (*dataMonitor)(uint8_t flowDirection, uint32_t dataLength, uint32_t fifoNullCount, uint32_t fifoFullCount); /** The start position of the media (blocks) allocated to the LUN. */ uint32_t baseAddress; /** The size of the media (blocks) allocated to the LUN. */ uint32_t size; /** Sector size of the media in number of media blocks */ uint16_t blockSize; /** The LUN can be readonly even the media is writable */ uint8_t protected; /** The LUN status (Ejected/Changed/) */ uint8_t status; /** Data for the RequestSense command. */ SBCRequestSenseData requestSenseData; /** Data for the ReadCapacity command. */ SBCReadCapacity10Data readCapacityData; } MSDLun; /*------------------------------------------------------------------------------ * Exported functions *------------------------------------------------------------------------------*/ extern void LUN_Init(MSDLun *lun, Media *media, uint8_t *ioBuffer, uint32_t ioBufferSize, uint32_t baseAddress, uint32_t size, uint16_t blockSize, uint8_t protected, void (*dataMonitor)(uint8_t flowDirection, uint32_t dataLength, uint32_t fifoNullCount, uint32_t fifoFullCount)); extern uint32_t LUN_Eject(MSDLun *lun); extern uint32_t LUN_Write(MSDLun *lun, uint32_t blockAddress, void *data, uint32_t length, TransferCallback callback, void *argument); extern uint32_t LUN_Read(MSDLun *lun, uint32_t blockAddress, void *data, uint32_t length, TransferCallback callback, void *argument); /**@}*/ #endif /*#ifndef MSDLUN_H */