Add start of a SDP service table, which will be linked to the Bluetooth SDP code.
[pub/USBasp.git] / LUFA / Drivers / USB / Class / Host / MassStorage.h
index fc3bc66..d2ab970 100644 (file)
@@ -1,21 +1,21 @@
 /*\r
              LUFA Library\r
 /*\r
              LUFA Library\r
-     Copyright (C) Dean Camera, 2009.\r
+     Copyright (C) Dean Camera, 2010.\r
               \r
   dean [at] fourwalledcubicle [dot] com\r
       www.fourwalledcubicle.com\r
 */\r
 \r
 /*\r
               \r
   dean [at] fourwalledcubicle [dot] com\r
       www.fourwalledcubicle.com\r
 */\r
 \r
 /*\r
-  Copyright 2009  Dean Camera (dean [at] fourwalledcubicle [dot] com)\r
+  Copyright 2010  Dean Camera (dean [at] fourwalledcubicle [dot] com)\r
 \r
 \r
-  Permission to use, copy, modify, and distribute this software\r
-  and its documentation for any purpose and without fee is hereby\r
-  granted, provided that the above copyright notice appear in all\r
-  copies and that both that the copyright notice and this\r
-  permission notice and warranty disclaimer appear in supporting\r
-  documentation, and that the name of the author not be used in\r
-  advertising or publicity pertaining to distribution of the\r
+  Permission to use, copy, modify, distribute, and sell this \r
+  software and its documentation for any purpose is hereby granted\r
+  without fee, provided that the above copyright notice appear in \r
+  all copies and that both that the copyright notice and this\r
+  permission notice and warranty disclaimer appear in supporting \r
+  documentation, and that the name of the author not be used in \r
+  advertising or publicity pertaining to distribution of the \r
   software without specific, written prior permission.\r
 \r
   The author disclaim all warranties with regard to this\r
   software without specific, written prior permission.\r
 \r
   The author disclaim all warranties with regard to this\r
   this software.\r
 */\r
 \r
   this software.\r
 */\r
 \r
+/** \file\r
+ *  \brief Host mode driver for the library USB Mass Storage Class driver.\r
+ *\r
+ *  Host mode driver for the library USB Mass Storage Class driver.\r
+ *\r
+ *  \note This file should not be included directly. It is automatically included as needed by the class driver\r
+ *        dispatch header located in LUFA/Drivers/USB/Class/MassStorage.h.\r
+ */\r
+\r
 /** \ingroup Group_USBClassMS\r
  *  @defgroup Group_USBClassMassStorageHost Mass Storage Class Host Mode Driver\r
  *\r
 /** \ingroup Group_USBClassMS\r
  *  @defgroup Group_USBClassMassStorageHost Mass Storage Class Host Mode Driver\r
  *\r
                        extern "C" {\r
                #endif\r
 \r
                        extern "C" {\r
                #endif\r
 \r
+       /* Preprocessor Checks: */\r
+               #if !defined(__INCLUDE_FROM_MS_DRIVER)\r
+                       #error Do not include this file directly. Include LUFA/Drivers/Class/MassStorage.h instead.\r
+               #endif\r
+\r
        /* Public Interface - May be used in end-application: */\r
                /* Macros: */\r
                        /** Error code for some Mass Storage Host functions, indicating a logical (and not hardware) error */\r
                        #define MS_ERROR_LOGICAL_CMD_FAILED              0x80\r
        \r
                /* Type Defines: */\r
        /* Public Interface - May be used in end-application: */\r
                /* Macros: */\r
                        /** Error code for some Mass Storage Host functions, indicating a logical (and not hardware) error */\r
                        #define MS_ERROR_LOGICAL_CMD_FAILED              0x80\r
        \r
                /* Type Defines: */\r
-                       /** Class state structure. An instance of this structure should be made within the user application,\r
+                       /** \brief Mass Storage Class Host Mode Configuration and State Structure.\r
+                        *\r
+                        *  Class state structure. An instance of this structure should be made within the user application,\r
                         *  and passed to each of the Mass Storage class driver functions as the MSInterfaceInfo parameter. This\r
                         *  stores each Mass Storage interface's configuration and state information.\r
                         */\r
                         *  and passed to each of the Mass Storage class driver functions as the MSInterfaceInfo parameter. This\r
                         *  stores each Mass Storage interface's configuration and state information.\r
                         */\r
                                                  */\r
                        } USB_ClassInfo_MS_Host_t;\r
                        \r
                                                  */\r
                        } USB_ClassInfo_MS_Host_t;\r
                        \r
-                       /** SCSI capacity structure, to hold the total capacity of the device in both the number\r
+                       /** \brief SCSI Device LUN Capacity Structure.\r
+                        *\r
+                        *  SCSI capacity structure, to hold the total capacity of the device in both the number\r
                         *  of blocks in the current LUN, and the size of each block. This structure is filled by\r
                         *  the device when the MassStore_ReadCapacity() function is called.\r
                         */\r
                         *  of blocks in the current LUN, and the size of each block. This structure is filled by\r
                         *  the device when the MassStore_ReadCapacity() function is called.\r
                         */\r
                        };\r
        \r
                /* Function Prototypes: */\r
                        };\r
        \r
                /* Function Prototypes: */\r
-                       /** General management task for a given Mass Storage host class interface, required for the correct operation of\r
-                        *  the interface. This should be called frequently in the main program loop, before the master USB management task\r
-                        *  \ref USB_USBTask().\r
-                        *\r
-                        *  \param[in,out] MSInterfaceInfo  Pointer to a structure containing an MS Class host configuration and state\r
-                        */\r
-                       void MS_Host_USBTask(USB_ClassInfo_MS_Host_t* const MSInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1);\r
-                       \r
                        /** Host interface configuration routine, to configure a given Mass Storage host interface instance using the\r
                         *  Configuration Descriptor read from an attached USB device. This function automatically updates the given Mass\r
                         *  Storage Host instance's state values and configures the pipes required to communicate with the interface if it\r
                        /** Host interface configuration routine, to configure a given Mass Storage host interface instance using the\r
                         *  Configuration Descriptor read from an attached USB device. This function automatically updates the given Mass\r
                         *  Storage Host instance's state values and configures the pipes required to communicate with the interface if it\r
                         *  UNit, a logical drive) in the device. This value can then be used in the other functions of the Mass Storage\r
                         *  Host mode Class driver to address a specific LUN within the device.\r
                         *\r
                         *  UNit, a logical drive) in the device. This value can then be used in the other functions of the Mass Storage\r
                         *  Host mode Class driver to address a specific LUN within the device.\r
                         *\r
+                        *  \note Some devices do not support this request, and will STALL it when issued. To get around this,\r
+                        *        on unsupported devices the max LUN index will be reported as zero and no error will be returned\r
+                        *        if the device STALLs the request.\r
+                        *\r
                         *  \param[in,out] MSInterfaceInfo  Pointer to a structure containing a MS Class host configuration and state\r
                         *  \param[out] MaxLUNIndex  Pointer to a location where the highest LUN index value should be stored\r
                         *\r
                         *  \param[in,out] MSInterfaceInfo  Pointer to a structure containing a MS Class host configuration and state\r
                         *  \param[out] MaxLUNIndex  Pointer to a location where the highest LUN index value should be stored\r
                         *\r
                        /** Retrieves the Mass Storage device's inquiry data for the specified LUN, indicating the device characteristics and\r
                         *  properties.\r
                         *\r
                        /** Retrieves the Mass Storage device's inquiry data for the specified LUN, indicating the device characteristics and\r
                         *  properties.\r
                         *\r
+                        *  \note This function must only be called when the Host state machine is in the HOST_STATE_Configured state or the\r
+                        *        call will fail.\r
+                        *\r
                         *  \param[in,out] MSInterfaceInfo  Pointer to a structure containing a MS Class host configuration and state\r
                         *  \param[in] LUNIndex  LUN index within the device the command is being issued to\r
                         *  \param[out] InquiryData  Location where the read inquiry data should be stored\r
                         *  \param[in,out] MSInterfaceInfo  Pointer to a structure containing a MS Class host configuration and state\r
                         *  \param[in] LUNIndex  LUN index within the device the command is being issued to\r
                         *  \param[out] InquiryData  Location where the read inquiry data should be stored\r
 \r
                        /** Retrieves the total capacity of the attached USB Mass Storage device, in blocks, and block size.\r
                         *\r
 \r
                        /** Retrieves the total capacity of the attached USB Mass Storage device, in blocks, and block size.\r
                         *\r
+                        *  \note This function must only be called when the Host state machine is in the HOST_STATE_Configured state or the\r
+                        *        call will fail.\r
+                        *\r
                         *  \param[in,out] MSInterfaceInfo  Pointer to a structure containing a MS Class host configuration and state\r
                         *  \param[in] LUNIndex  LUN index within the device the command is being issued to\r
                         *  \param[out] DeviceCapacity  Pointer to the location where the capacity information should be stored\r
                         *  \param[in,out] MSInterfaceInfo  Pointer to a structure containing a MS Class host configuration and state\r
                         *  \param[in] LUNIndex  LUN index within the device the command is being issued to\r
                         *  \param[out] DeviceCapacity  Pointer to the location where the capacity information should be stored\r
                        /** Retrieves the device sense data, indicating the current device state and error codes for the previously\r
                         *  issued command.\r
                         *\r
                        /** Retrieves the device sense data, indicating the current device state and error codes for the previously\r
                         *  issued command.\r
                         *\r
+                        *  \note This function must only be called when the Host state machine is in the HOST_STATE_Configured state or the\r
+                        *        call will fail.\r
+                        *\r
                         *  \param[in,out] MSInterfaceInfo  Pointer to a structure containing a MS Class host configuration and state\r
                         *  \param[in] LUNIndex  LUN index within the device the command is being issued to\r
                         *  \param[out] SenseData  Pointer to the location where the sense information should be stored\r
                         *  \param[in,out] MSInterfaceInfo  Pointer to a structure containing a MS Class host configuration and state\r
                         *  \param[in] LUNIndex  LUN index within the device the command is being issued to\r
                         *  \param[out] SenseData  Pointer to the location where the sense information should be stored\r
                        /** Issues a PREVENT MEDIUM REMOVAL command, to logically (or, depending on the type of device, physically) lock\r
                         *  the device from removal so that blocks of data on the medium can be read or altered.\r
                         *\r
                        /** Issues a PREVENT MEDIUM REMOVAL command, to logically (or, depending on the type of device, physically) lock\r
                         *  the device from removal so that blocks of data on the medium can be read or altered.\r
                         *\r
+                        *  \note This function must only be called when the Host state machine is in the HOST_STATE_Configured state or the\r
+                        *        call will fail.\r
+                        *\r
                         *  \param[in,out] MSInterfaceInfo  Pointer to a structure containing a MS Class host configuration and state\r
                         *  \param[in] LUNIndex  LUN index within the device the command is being issued to\r
                         *  \param[in] PreventRemoval  Boolean true if the device should be locked from removal, false otherwise\r
                         *  \param[in,out] MSInterfaceInfo  Pointer to a structure containing a MS Class host configuration and state\r
                         *  \param[in] LUNIndex  LUN index within the device the command is being issued to\r
                         *  \param[in] PreventRemoval  Boolean true if the device should be locked from removal, false otherwise\r
                        \r
                        /** Reads blocks of data from the attached Mass Storage device's medium.\r
                         *\r
                        \r
                        /** Reads blocks of data from the attached Mass Storage device's medium.\r
                         *\r
+                        *  \note This function must only be called when the Host state machine is in the HOST_STATE_Configured state or the\r
+                        *        call will fail.\r
+                        *\r
                         *  \param[in,out] MSInterfaceInfo  Pointer to a structure containing a MS Class host configuration and state\r
                         *  \param[in] LUNIndex  LUN index within the device the command is being issued to\r
                         *  \param[in] BlockAddress  Starting block address within the device to read from\r
                         *  \param[in,out] MSInterfaceInfo  Pointer to a structure containing a MS Class host configuration and state\r
                         *  \param[in] LUNIndex  LUN index within the device the command is being issued to\r
                         *  \param[in] BlockAddress  Starting block address within the device to read from\r
                \r
                        /** Writes blocks of data to the attached Mass Storage device's medium.\r
                         *\r
                \r
                        /** Writes blocks of data to the attached Mass Storage device's medium.\r
                         *\r
+                        *  \note This function must only be called when the Host state machine is in the HOST_STATE_Configured state or the\r
+                        *        call will fail.\r
+                        *\r
                         *  \param[in,out] MSInterfaceInfo  Pointer to a structure containing a MS Class host configuration and state\r
                         *  \param[in] LUNIndex  LUN index within the device the command is being issued to\r
                         *  \param[in] BlockAddress  Starting block address within the device to write to\r
                         *  \param[in,out] MSInterfaceInfo  Pointer to a structure containing a MS Class host configuration and state\r
                         *  \param[in] LUNIndex  LUN index within the device the command is being issued to\r
                         *  \param[in] BlockAddress  Starting block address within the device to write to\r
                         */\r
                        uint8_t MS_Host_WriteDeviceBlocks(USB_ClassInfo_MS_Host_t* const MSInterfaceInfo, const uint8_t LUNIndex,\r
                                                          const uint32_t BlockAddress, const uint8_t Blocks, const uint16_t BlockSize,\r
                         */\r
                        uint8_t MS_Host_WriteDeviceBlocks(USB_ClassInfo_MS_Host_t* const MSInterfaceInfo, const uint8_t LUNIndex,\r
                                                          const uint32_t BlockAddress, const uint8_t Blocks, const uint16_t BlockSize,\r
-                                                         void* BlockBuffer) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(6);\r
+                                                         const void* BlockBuffer) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(6);\r
+\r
+               /* Inline Functions: */\r
+                       /** General management task for a given Mass Storage host class interface, required for the correct operation of\r
+                        *  the interface. This should be called frequently in the main program loop, before the master USB management task\r
+                        *  \ref USB_USBTask().\r
+                        *\r
+                        *  \param[in,out] MSInterfaceInfo  Pointer to a structure containing an MS Class host configuration and state\r
+                        */\r
+                       static inline void MS_Host_USBTask(USB_ClassInfo_MS_Host_t* const MSInterfaceInfo);\r
+                       static inline void MS_Host_USBTask(USB_ClassInfo_MS_Host_t* const MSInterfaceInfo)\r
+                       {\r
+                               (void)MSInterfaceInfo;\r
+                       }\r
 \r
        /* Private Interface - For use in library only: */\r
        #if !defined(__DOXYGEN__)\r
 \r
        /* Private Interface - For use in library only: */\r
        #if !defined(__DOXYGEN__)\r
                        #define COMMAND_DIRECTION_DATA_OUT     (0 << 7)\r
                        #define COMMAND_DIRECTION_DATA_IN      (1 << 7)\r
                        \r
                        #define COMMAND_DIRECTION_DATA_OUT     (0 << 7)\r
                        #define COMMAND_DIRECTION_DATA_IN      (1 << 7)\r
                        \r
-                       #define COMMAND_DATA_TIMEOUT_MS        2000\r
+                       #define COMMAND_DATA_TIMEOUT_MS        10000\r
 \r
                        #define MS_FOUND_DATAPIPE_IN           (1 << 0)\r
                        #define MS_FOUND_DATAPIPE_OUT          (1 << 1)\r
                        \r
                /* Function Prototypes: */\r
 \r
                        #define MS_FOUND_DATAPIPE_IN           (1 << 0)\r
                        #define MS_FOUND_DATAPIPE_OUT          (1 << 1)\r
                        \r
                /* Function Prototypes: */\r
-                       #if defined(INCLUDE_FROM_MS_CLASS_HOST_C)               \r
+                       #if defined(__INCLUDE_FROM_MS_CLASS_HOST_C)             \r
                                static uint8_t DComp_NextMSInterface(void* const CurrentDescriptor);\r
                                static uint8_t DComp_NextMSInterfaceEndpoint(void* const CurrentDescriptor);\r
                                \r
                                static uint8_t MS_Host_SendCommand(USB_ClassInfo_MS_Host_t* const MSInterfaceInfo,\r
                                                                   MS_CommandBlockWrapper_t* const SCSICommandBlock,\r
                                static uint8_t DComp_NextMSInterface(void* const CurrentDescriptor);\r
                                static uint8_t DComp_NextMSInterfaceEndpoint(void* const CurrentDescriptor);\r
                                \r
                                static uint8_t MS_Host_SendCommand(USB_ClassInfo_MS_Host_t* const MSInterfaceInfo,\r
                                                                   MS_CommandBlockWrapper_t* const SCSICommandBlock,\r
-                                                                  void* BufferPtr);\r
+                                                                  const void* const BufferPtr);\r
                                static uint8_t MS_Host_WaitForDataReceived(USB_ClassInfo_MS_Host_t* const MSInterfaceInfo);\r
                                static uint8_t MS_Host_SendReceiveData(USB_ClassInfo_MS_Host_t* const MSInterfaceInfo, \r
                                                        MS_CommandBlockWrapper_t* const SCSICommandBlock, void* BufferPtr);\r
                                static uint8_t MS_Host_WaitForDataReceived(USB_ClassInfo_MS_Host_t* const MSInterfaceInfo);\r
                                static uint8_t MS_Host_SendReceiveData(USB_ClassInfo_MS_Host_t* const MSInterfaceInfo, \r
                                                        MS_CommandBlockWrapper_t* const SCSICommandBlock, void* BufferPtr);\r