Get rid of the redundant ATTR_NEVER_INLINE macro which translated to the same as...
[pub/USBasp.git] / Demos / Device / LowLevel / MassStorage / MassStorage.c
index d6345e3..fc66433 100644 (file)
@@ -1,13 +1,13 @@
 /*
              LUFA Library
 /*
              LUFA Library
-     Copyright (C) Dean Camera, 2011.
+     Copyright (C) Dean Camera, 2013.
 
   dean [at] fourwalledcubicle [dot] com
            www.lufa-lib.org
 */
 
 /*
 
   dean [at] fourwalledcubicle [dot] com
            www.lufa-lib.org
 */
 
 /*
-  Copyright 2011  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+  Copyright 2013  Dean Camera (dean [at] fourwalledcubicle [dot] com)
 
   Permission to use, copy, modify, distribute, and sell this
   software and its documentation for any purpose is hereby granted
 
   Permission to use, copy, modify, distribute, and sell this
   software and its documentation for any purpose is hereby granted
@@ -18,7 +18,7 @@
   advertising or publicity pertaining to distribution of the
   software without specific, written prior permission.
 
   advertising or publicity pertaining to distribution of the
   software without specific, written prior permission.
 
-  The author disclaim all warranties with regard to this
+  The author disclaims all warranties with regard to this
   software, including all implied warranties of merchantability
   and fitness.  In no event shall the author be liable for any
   special, indirect or consequential damages or any damages
   software, including all implied warranties of merchantability
   and fitness.  In no event shall the author be liable for any
   special, indirect or consequential damages or any damages
@@ -55,7 +55,7 @@ int main(void)
        SetupHardware();
 
        LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY);
        SetupHardware();
 
        LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY);
-       sei();
+       GlobalInterruptEnable();
 
        for (;;)
        {
 
        for (;;)
        {
@@ -67,19 +67,37 @@ int main(void)
 /** Configures the board hardware and chip peripherals for the demo's functionality. */
 void SetupHardware(void)
 {
 /** Configures the board hardware and chip peripherals for the demo's functionality. */
 void SetupHardware(void)
 {
+#if (ARCH == ARCH_AVR8)
        /* Disable watchdog if enabled by bootloader/fuses */
        MCUSR &= ~(1 << WDRF);
        wdt_disable();
 
        /* Disable clock division */
        clock_prescale_set(clock_div_1);
        /* Disable watchdog if enabled by bootloader/fuses */
        MCUSR &= ~(1 << WDRF);
        wdt_disable();
 
        /* Disable clock division */
        clock_prescale_set(clock_div_1);
+#elif (ARCH == ARCH_XMEGA)
+       /* Start the PLL to multiply the 2MHz RC oscillator to 32MHz and switch the CPU core to run from it */
+       XMEGACLK_StartPLL(CLOCK_SRC_INT_RC2MHZ, 2000000, F_CPU);
+       XMEGACLK_SetCPUClockSource(CLOCK_SRC_PLL);
+
+       /* Start the 32MHz internal RC oscillator and start the DFLL to increase it to 48MHz using the USB SOF as a reference */
+       XMEGACLK_StartInternalOscillator(CLOCK_SRC_INT_RC32MHZ);
+       XMEGACLK_StartDFLL(CLOCK_SRC_INT_RC32MHZ, DFLL_REF_INT_USBSOF, F_USB);
+
+       PMIC.CTRL = PMIC_LOLVLEN_bm | PMIC_MEDLVLEN_bm | PMIC_HILVLEN_bm;
+#endif
 
        /* Hardware Initialization */
        LEDs_Init();
 
        /* Hardware Initialization */
        LEDs_Init();
-       SPI_Init(SPI_SPEED_FCPU_DIV_2 | SPI_ORDER_MSB_FIRST | SPI_SCK_LEAD_FALLING | SPI_SAMPLE_TRAILING | SPI_MODE_MASTER);
        Dataflash_Init();
        USB_Init();
 
        Dataflash_Init();
        USB_Init();
 
+       /* Check if the Dataflash is working, abort if not */
+       if (!(DataflashManager_CheckDataflashOperation()))
+       {
+               LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
+               for(;;);
+       }
+
        /* Clear Dataflash sector protections, if enabled */
        DataflashManager_ResetDataflashProtections();
 }
        /* Clear Dataflash sector protections, if enabled */
        DataflashManager_ResetDataflashProtections();
 }
@@ -111,10 +129,8 @@ void EVENT_USB_Device_ConfigurationChanged(void)
        bool ConfigSuccess = true;
 
        /* Setup Mass Storage Data Endpoints */
        bool ConfigSuccess = true;
 
        /* Setup Mass Storage Data Endpoints */
-       ConfigSuccess &= Endpoint_ConfigureEndpoint(MASS_STORAGE_IN_EPNUM,  EP_TYPE_BULK, ENDPOINT_DIR_IN,
-                                                   MASS_STORAGE_IO_EPSIZE, ENDPOINT_BANK_SINGLE);
-       ConfigSuccess &= Endpoint_ConfigureEndpoint(MASS_STORAGE_OUT_EPNUM, EP_TYPE_BULK, ENDPOINT_DIR_OUT,
-                                                   MASS_STORAGE_IO_EPSIZE, ENDPOINT_BANK_SINGLE);
+       ConfigSuccess &= Endpoint_ConfigureEndpoint(MASS_STORAGE_IN_EPADDR,  EP_TYPE_BULK, MASS_STORAGE_IO_EPSIZE, 1);
+       ConfigSuccess &= Endpoint_ConfigureEndpoint(MASS_STORAGE_OUT_EPADDR, EP_TYPE_BULK, MASS_STORAGE_IO_EPSIZE, 1);
 
        /* Indicate endpoint configuration success or failure */
        LEDs_SetAllLEDs(ConfigSuccess ? LEDMASK_USB_READY : LEDMASK_USB_ERROR);
 
        /* Indicate endpoint configuration success or failure */
        LEDs_SetAllLEDs(ConfigSuccess ? LEDMASK_USB_READY : LEDMASK_USB_ERROR);
@@ -146,7 +162,7 @@ void EVENT_USB_Device_ControlRequest(void)
                                Endpoint_ClearSETUP();
 
                                /* Indicate to the host the number of supported LUNs (virtual disks) on the device */
                                Endpoint_ClearSETUP();
 
                                /* Indicate to the host the number of supported LUNs (virtual disks) on the device */
-                               Endpoint_Write_Byte(TOTAL_LUNS - 1);
+                               Endpoint_Write_8(TOTAL_LUNS - 1);
 
                                Endpoint_ClearIN();
                                Endpoint_ClearStatusStage();
 
                                Endpoint_ClearIN();
                                Endpoint_ClearStatusStage();
@@ -173,7 +189,7 @@ void MassStorage_Task(void)
 
                /* Check direction of command, select Data IN endpoint if data is from the device */
                if (CommandBlock.Flags & MS_COMMAND_DIR_DATA_IN)
 
                /* Check direction of command, select Data IN endpoint if data is from the device */
                if (CommandBlock.Flags & MS_COMMAND_DIR_DATA_IN)
-                 Endpoint_SelectEndpoint(MASS_STORAGE_IN_EPNUM);
+                 Endpoint_SelectEndpoint(MASS_STORAGE_IN_EPADDR);
 
                /* Decode the received SCSI command, set returned status code */
                CommandStatus.Status = SCSI_DecodeSCSICommand() ? MS_SCSI_COMMAND_Pass : MS_SCSI_COMMAND_Fail;
 
                /* Decode the received SCSI command, set returned status code */
                CommandStatus.Status = SCSI_DecodeSCSICommand() ? MS_SCSI_COMMAND_Pass : MS_SCSI_COMMAND_Fail;
@@ -199,13 +215,13 @@ void MassStorage_Task(void)
        if (IsMassStoreReset)
        {
                /* Reset the data endpoint banks */
        if (IsMassStoreReset)
        {
                /* Reset the data endpoint banks */
-               Endpoint_ResetEndpoint(MASS_STORAGE_OUT_EPNUM);
-               Endpoint_ResetEndpoint(MASS_STORAGE_IN_EPNUM);
+               Endpoint_ResetEndpoint(MASS_STORAGE_OUT_EPADDR);
+               Endpoint_ResetEndpoint(MASS_STORAGE_IN_EPADDR);
 
 
-               Endpoint_SelectEndpoint(MASS_STORAGE_OUT_EPNUM);
+               Endpoint_SelectEndpoint(MASS_STORAGE_OUT_EPADDR);
                Endpoint_ClearStall();
                Endpoint_ResetDataToggle();
                Endpoint_ClearStall();
                Endpoint_ResetDataToggle();
-               Endpoint_SelectEndpoint(MASS_STORAGE_IN_EPNUM);
+               Endpoint_SelectEndpoint(MASS_STORAGE_IN_EPADDR);
                Endpoint_ClearStall();
                Endpoint_ResetDataToggle();
 
                Endpoint_ClearStall();
                Endpoint_ResetDataToggle();
 
@@ -217,14 +233,14 @@ void MassStorage_Task(void)
 /** Function to read in a command block from the host, via the bulk data OUT endpoint. This function reads in the next command block
  *  if one has been issued, and performs validation to ensure that the block command is valid.
  *
 /** Function to read in a command block from the host, via the bulk data OUT endpoint. This function reads in the next command block
  *  if one has been issued, and performs validation to ensure that the block command is valid.
  *
- *  \return Boolean true if a valid command block has been read in from the endpoint, false otherwise
+ *  \return Boolean \c true if a valid command block has been read in from the endpoint, \c false otherwise
  */
 static bool ReadInCommandBlock(void)
 {
        uint16_t BytesTransferred;
 
        /* Select the Data Out endpoint */
  */
 static bool ReadInCommandBlock(void)
 {
        uint16_t BytesTransferred;
 
        /* Select the Data Out endpoint */
-       Endpoint_SelectEndpoint(MASS_STORAGE_OUT_EPNUM);
+       Endpoint_SelectEndpoint(MASS_STORAGE_OUT_EPADDR);
 
        /* Abort if no command has been sent from the host */
        if (!(Endpoint_IsOUTReceived()))
 
        /* Abort if no command has been sent from the host */
        if (!(Endpoint_IsOUTReceived()))
@@ -249,7 +265,7 @@ static bool ReadInCommandBlock(void)
        {
                /* Stall both data pipes until reset by host */
                Endpoint_StallTransaction();
        {
                /* Stall both data pipes until reset by host */
                Endpoint_StallTransaction();
-               Endpoint_SelectEndpoint(MASS_STORAGE_IN_EPNUM);
+               Endpoint_SelectEndpoint(MASS_STORAGE_IN_EPADDR);
                Endpoint_StallTransaction();
 
                return false;
                Endpoint_StallTransaction();
 
                return false;
@@ -279,7 +295,7 @@ static void ReturnCommandStatus(void)
        uint16_t BytesTransferred;
 
        /* Select the Data Out endpoint */
        uint16_t BytesTransferred;
 
        /* Select the Data Out endpoint */
-       Endpoint_SelectEndpoint(MASS_STORAGE_OUT_EPNUM);
+       Endpoint_SelectEndpoint(MASS_STORAGE_OUT_EPADDR);
 
        /* While data pipe is stalled, wait until the host issues a control request to clear the stall */
        while (Endpoint_IsStalled())
 
        /* While data pipe is stalled, wait until the host issues a control request to clear the stall */
        while (Endpoint_IsStalled())
@@ -290,7 +306,7 @@ static void ReturnCommandStatus(void)
        }
 
        /* Select the Data In endpoint */
        }
 
        /* Select the Data In endpoint */
-       Endpoint_SelectEndpoint(MASS_STORAGE_IN_EPNUM);
+       Endpoint_SelectEndpoint(MASS_STORAGE_IN_EPADDR);
 
        /* While data pipe is stalled, wait until the host issues a control request to clear the stall */
        while (Endpoint_IsStalled())
 
        /* While data pipe is stalled, wait until the host issues a control request to clear the stall */
        while (Endpoint_IsStalled())
@@ -309,7 +325,8 @@ static void ReturnCommandStatus(void)
                if (IsMassStoreReset)
                  return;
        }
                if (IsMassStoreReset)
                  return;
        }
-       
+
        /* Finalize the stream transfer to send the last packet */
        Endpoint_ClearIN();
 }
        /* Finalize the stream transfer to send the last packet */
        Endpoint_ClearIN();
 }
+