/** SPI prescaler mask for SPI_Init(). Divides the system clock by a factor of 32. */\r
#define SPI_SPEED_FCPU_DIV_32 AVR32_SPI_MR_FDIV_MASK\r
\r
+ /** SPI chip selection mode for direct peripheral-to-CS pin connections. */\r
+ #define SPI_CS_4BITDECODER AVR32_SPI_MR_PSDEC_MASK\r
+ \r
+ /** SPI chip selection mode for peripheral CS pin connections through a 4-bit decoder. */\r
+ #define SPI_CS_DIRECT 0\r
+ \r
/** SPI mode mask for SPI_Init(). Indicates that the SPI interface should be initialized into slave mode. */\r
#define SPI_MODE_SLAVE 0\r
\r
* configure these seperately to connect the SPI module to the desired GPIO pins via the\r
* GPIO MUX registers.\r
*\r
- * \param[in] SPIOptions SPI Options, a mask consisting of one of each of the SPI_SPEED_*\r
- * and SPI_MODE_* masks\r
+ * \param[in] SPIOptions SPI Options, a mask consisting of one of each of the SPI_SPEED_*,\r
+ * SPI_CS_* and SPI_MODE_* masks\r
*/\r
static inline void SPI_Init(const uintN_t SPIOptions)\r
{\r
- AVR32_SPI.cr = (AVR32_SPI_CR_SPIEN_MASK | AVR32_SPI_CR_SWRST_MASK);\r
+ AVR32_PM.pbamask = (1 << 5);\r
+\r
+ AVR32_SPI.CR.swrst = true;\r
+ AVR32_SPI.CR.spien = true;\r
AVR32_SPI.mr = SPIOptions;\r
}\r
\r
static inline void SPI_ShutDown(void)\r
{\r
AVR32_SPI.cr = AVR32_SPI_CR_SPIDIS_MASK;\r
+\r
+ AVR32_PM.pbamask &= ~(1 << 5);\r
}\r
\r
/** Sends and receives a transfer through the SPI interface, blocking until the transfer is complete.\r
static inline uint16_t SPI_Transfer(const uint16_t Data) ATTR_ALWAYS_INLINE;\r
static inline uint16_t SPI_Transfer(const uint16_t Data)\r
{\r
- AVR32_SPI.TDR.td = Data;\r
while (!(AVR32_SPI.SR.tdre));\r
- return AVR32_SPI.rdr;\r
+ AVR32_SPI.TDR.td = Data;\r
+\r
+ while ((AVR32_SPI.sr & (AVR32_SPI_SR_RDRF_MASK | AVR32_SPI_SR_TXEMPTY_MASK)) !=\r
+ (AVR32_SPI_SR_RDRF_MASK | AVR32_SPI_SR_TXEMPTY_MASK));\r
+ return AVR32_SPI.RDR.rd;\r
}\r
\r
/** Sends a transfer through the SPI interface, blocking until the transfer is complete. The response\r
static inline void SPI_Send(const uint16_t Data) ATTR_ALWAYS_INLINE;\r
static inline void SPI_Send(const uint16_t Data)\r
{\r
- AVR32_SPI.TDR.td = Data;\r
while (!(AVR32_SPI.SR.tdre));\r
+ AVR32_SPI.TDR.td = Data;\r
}\r
\r
/** Sends a dummy transfer through the SPI interface, blocking until the transfer is complete. The response\r
static inline uint16_t SPI_Receive(void) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT;\r
static inline uint16_t SPI_Receive(void)\r
{\r
- AVR32_SPI.TDR.td = 0x0000;\r
while (!(AVR32_SPI.SR.tdre));\r
+ AVR32_SPI.TDR.td = 0x0000;\r
+\r
+ while ((AVR32_SPI.sr & (AVR32_SPI_SR_RDRF_MASK | AVR32_SPI_SR_TXEMPTY_MASK)) !=\r
+ (AVR32_SPI_SR_RDRF_MASK | AVR32_SPI_SR_TXEMPTY_MASK));\r
return AVR32_SPI.RDR.rd;\r
}\r
\r
case OID_GEN_SUPPORTED_LIST:\r
*ResponseSize = sizeof(AdapterSupportedOIDList);\r
\r
- memcpy_P(ResponseData, AdapterSupportedOIDList, sizeof(AdapterSupportedOIDList));\r
+ #if defined(__AVR32__)\r
+ memcpy(ResponseData, AdapterSupportedOIDList, sizeof(AdapterSupportedOIDList)); \r
+ #elif defined(__AVR__)\r
+ memcpy_P(ResponseData, AdapterSupportedOIDList, sizeof(AdapterSupportedOIDList)); \r
+ #endif\r
\r
return true;\r
case OID_GEN_PHYSICAL_MEDIUM:\r
\r
void USB_INT_ClearAllInterrupts(void)\r
{\r
- #if defined(USB_SERIES_4_AVR) || defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR)\r
- USBINT = 0;\r
- #endif\r
- \r
- #if defined(USB_CAN_BE_HOST)\r
- UHINT = 0;\r
- OTGINT = 0;\r
- #endif\r
- \r
- #if defined(USB_CAN_BE_DEVICE)\r
- UDINT = 0;\r
+ #if defined(__AVR32__)\r
+ AVR32_USBB.USBSTACLR = 0xFFFFFF;\r
+ AVR32_USBB.UHINTCLR = 0xFFFFFF;\r
+ AVR32_USBB.UECONX = \r
+ AVR32_USBB.UDINTCLR = 0xFFFFFF; \r
+ #elif defined(__AVR__)\r
+ #if defined(USB_SERIES_4_AVR) || defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR)\r
+ USBINT = 0;\r
+ #endif\r
+ \r
+ #if defined(USB_CAN_BE_HOST)\r
+ UHINT = 0;\r
+ OTGINT = 0;\r
+ #endif\r
+ \r
+ #if defined(USB_CAN_BE_DEVICE)\r
+ UDINT = 0;\r
+ #endif\r
#endif\r
}\r
\r
#if defined(__AVR32__)\r
#define USB_INT_Enable(int) MACROS{ USB_INT_GET_EN_REG(int) |= USB_INT_GET_EN_MASK(int); }MACROE\r
#define USB_INT_Disable(int) MACROS{ USB_INT_GET_EN_REG(int) &= ~(USB_INT_GET_EN_MASK(int)); }MACROE\r
- #define USB_INT_Clear(int) MACROS{ USB_INT_GET_INT_REG(int) ## CLR |= USB_INT_GET_INT_MASK(int) ## C; }MACROE\r
+ #define USB_INT_Clear(int) MACROS{ USB_INT_GET_INTC_REG(int) |= USB_INT_GET_INTC_MASK(int); }MACROE\r
#define USB_INT_IsEnabled(int) ((USB_INT_GET_EN_REG(int) & USB_INT_GET_EN_MASK(int)) ? true : false)\r
#define USB_INT_HasOccurred(int) ((USB_INT_GET_INT_REG(int) & USB_INT_GET_INT_MASK(int)) ? true : false)\r
\r
- #define USB_INT_GET_EN_REG(a, b, c, d) *((volatile uint32_t*)AVR32_USBB_ ## a)\r
+ #define USB_INT_GET_EN_REG(a, b, c, d) *( (volatile uint32_t*)AVR32_USBB_ ## a )\r
#define USB_INT_GET_EN_MASK(a, b, c, d) AVR32_USBB_ ## b\r
- #define USB_INT_GET_INT_REG(a, b, c, d) *((volatile uint32_t*)AVR32_USBB_ ## c)\r
+ #define USB_INT_GET_INT_REG(a, b, c, d) *( (volatile uint32_t*)AVR32_USBB_ ## c )\r
#define USB_INT_GET_INT_MASK(a, b, c, d) AVR32_USBB_ ## d\r
+ #define USB_INT_GET_INTC_REG(a, b, c, d) *( (volatile uint32_t*)AVR32_USBB_ ## c ## CLR )\r
+ #define USB_INT_GET_INTC_MASK(a, b, c, d) AVR32_USBB_ ## d ## C\r
\r
#define USB_INT_VBUS USBCON, USBCON_VBUSTE_MASK, USBSTA, USBSTA_VBUSTI_MASK\r
- #define USB_INT_IDTI USBCON, USBCON_IDTE_MASK , USBINT, USBCON_IDTI_MASK\r
+ #define USB_INT_IDTI USBCON, USBCON_IDTE_MASK , USBSTA, USBCON_IDTI_MASK\r
#define USB_INT_WAKEUP UDIEN , UDIEN_WAKEUPE_MASK, UDINT , UDIEN_WAKEUPI_MASK\r
#define USB_INT_SUSPEND UDIEN , UDIEN_SUSPE_MASK , UDINT , UDIEN_SUSPI_MASK\r
#define USB_INT_EORSTI UDIEN , UDIEN_EORSTE_MASK , UDINT , UDIEN_EORSTI_MASK\r
#define USB_INT_DDISCI UHIEN , UDIEN_DDISCE_MASK , UHINT , UHIEN_DDISCI_MASK\r
#define USB_INT_HSOFI UHIEN, UHIEN_HSOFE_MASK , UHINT , UHIEN_HSOFI_MASK\r
#define USB_INT_RSTI UHIEN , UHIEN_RSTE_MASK , UHINT , UHIEN_RSTI_MASK\r
- #define USB_INT_RXSTPI UEIENX, UEIENX_RXSTPE_MASK, UEINTX, UEIENX_RXSTPI_MASK \r
- #define USB_INT_BCERRI OTGIEN, OTGIEN_BCERRE_MASK, OTGINT, OTGIEN_BCERRI_MASK\r
- #define USB_INT_VBERRI OTGIEN, OTGIEN_VBERRE_MASK, OTGINT, OTGIEN_VBERRI_MASK\r
- #define USB_INT_SRPI OTGIEN, OTGIEN_SRPE_MASK , OTGINT, OTGIEN_SRPI_MASK\r
+ #define USB_INT_RXSTPI UECONX, UECONX_RXSTPE_MASK, UESTAX, UESTAX_RXSTPI_MASK\r
+ #define USB_INT_BCERRI USBCON, USBCON_BCERRE_MASK, USBSTA, USBSTA_BCERRI_MASK\r
+ #define USB_INT_VBERRI USBCON, USBCON_VBERRE_MASK, USBSTA, USBSTA_VBERRI_MASK\r
+ #define USB_INT_SRPI USBCON, USBCON_SRPE_MASK , USBSTA, USBSTA_SRPI_MASK\r
#elif defined(__AVR__)\r
#define USB_INT_Enable(int) MACROS{ USB_INT_GET_EN_REG(int) |= USB_INT_GET_EN_MASK(int); }MACROE\r
#define USB_INT_Disable(int) MACROS{ USB_INT_GET_EN_REG(int) &= ~(USB_INT_GET_EN_MASK(int)); }MACROE\r
extern USB_Request_Header_t USB_ControlRequest;\r
\r
#if defined(USB_CAN_BE_HOST) || defined(__DOXYGEN__)\r
- #if (!defined(__AVR32__) && !defined(HOST_STATE_AS_GPIOR)) || defined(__DOXYGEN__)\r
+ #if (!defined(__AVR32__) || !defined(HOST_STATE_AS_GPIOR)) || defined(__DOXYGEN__)\r
/** Indicates the current host state machine state. When in host mode, this indicates the state\r
* via one of the values of the \ref USB_Host_States_t enum values.\r
*\r
#endif\r
\r
#if defined(USB_CAN_BE_DEVICE) || defined(__DOXYGEN__)\r
- #if (!defined(__AVR32__) && !defined(DEVICE_STATE_AS_GPIOR)) || defined(__DOXYGEN__)\r
+ #if (defined(__AVR32__) || !defined(DEVICE_STATE_AS_GPIOR)) || defined(__DOXYGEN__)\r
/** Indicates the current device state machine state. When in device mode, this indicates the state\r
* via one of the values of the \ref USB_Device_States_t enum values.\r
*\r
#define USB_Device_SetLowSpeed() MACROS{ AVR32_USBB.UDCON.ls = true; }MACROE\r
#define USB_Device_SetFullSpeed() MACROS{ AVR32_USBB.UDCON.ls = false; }MACROE\r
\r
- #define USB_Device_SetDeviceAddress(addr) MACROS{ AVR32_USBB.UDADDR = (AVR32_USBB_UDCON_ADDEN_MASK | DeviceAddress); }MACROE \r
+ #define USB_Device_SetDeviceAddress(addr) MACROS{ AVR32_USBB.UDCON.uadd = DeviceAddress; AVR32_USBB.UDCON.adden = true; }MACROE \r
#elif defined(__AVR__)\r
#define USB_Device_SetLowSpeed() MACROS{ UDCON |= (1 << LSM); }MACROE\r
#define USB_Device_SetFullSpeed() MACROS{ UDCON &= ~(1 << LSM); }MACROE\r
#error Do not include this file directly. Include LUFA/Drivers/USB/USB.h instead.\r
#endif\r
\r
+ #if defined(__AVR32__) && !defined(__AVR32_EPREG_X)\r
+ #define __AVR32_EPREG_X(x) ((volatile uint32_t*)AVR32_USBB_ ## x)[USB_SelectedEPNumber] \r
+ #endif\r
+\r
/* Public Interface - May be used in end-application: */\r
/* Macros: */\r
#if defined(__AVR32__) || defined(__DOXYGEN__)\r
#if !defined(CONTROL_ONLY_DEVICE)\r
#define Endpoint_GetCurrentEndpoint() USB_SelectedEPNumber\r
#define Endpoint_SelectEndpoint(epnum) MACROS{ USB_SelectedEPNumber = (epnum); }MACROE \r
- #define Endpoint_IsReadWriteAllowed() (__AVR32_EPREG_X(UESTA0) & AVR32_USBB_RWAL_MASK)\r
+ #define Endpoint_IsReadWriteAllowed() (__AVR32_EPREG_X(UESTA0) & AVR32_USBB_RWALL_MASK)\r
#else\r
#define Endpoint_GetCurrentEndpoint() ENDPOINT_CONTROLEP\r
#define Endpoint_SelectEndpoint(epnum) (void)(epnum)\r
#endif\r
\r
- #define Endpoint_ResetFIFO(epnum) MACROS{ AVR32_USBB.UERST |= (AVR32_USBB_EPRST0_MASK << (epnum)); \\r
- AVR32_USBB.UERST &= ~(AVR32_USBB_EPRST0_MASK << (epnum)); }MACROE\r
- #define Endpoint_EnableEndpoint() MACROS{ AVR32_USBB.UERST |= (AVR32_USBB_UERST_EPEN0_MASK << (epen)); }MACROE\r
- #define Endpoint_DisableEndpoint() MACROS{ AVR32_USBB.UERST &= ~(AVR32_USBB_UERST_EPEN0_MASK << (epen)); }MACROE\r
- #define Endpoint_IsEnabled() ((AVR32_USBB.UERST & (AVR32_USBB_UERST_EPEN0_MASK << (epen))) ? true : false)\r
+ #define Endpoint_ResetFIFO(epnum) MACROS{ AVR32_USBB.uerst |= (AVR32_USBB_EPRST0_MASK << (epnum)); \\r
+ AVR32_USBB.uerst &= ~(AVR32_USBB_EPRST0_MASK << (epnum)); }MACROE\r
+ #define Endpoint_EnableEndpoint() MACROS{ AVR32_USBB.uerst |= (AVR32_USBB_UERST_EPEN0_MASK << USB_SelectedEPNumber); }MACROE\r
+ #define Endpoint_DisableEndpoint() MACROS{ AVR32_USBB.uerst &= ~(AVR32_USBB_UERST_EPEN0_MASK << USB_SelectedEPNumber); }MACROE\r
+ #define Endpoint_IsEnabled() ((AVR32_USBB.uerst & (AVR32_USBB_UERST_EPEN0_MASK << USB_SelectedEPNumber)) ? true : false)\r
\r
#define Endpoint_IsConfigured() ((__AVR32_EPREG_X(UESTA0) & AVR32_USBB_UESTA0_CFGOK_MASK) ? true : false)\r
#define Endpoint_GetEndpointInterrupts() (AVR32_USBB.UDINT >> AVR32_USBB_EP0INT)\r
#if !defined(__INCLUDE_FROM_USB_DRIVER)\r
#error Do not include this file directly. Include LUFA/Drivers/USB/USB.h instead.\r
#endif\r
-\r
- #if !defined(F_CLOCK)\r
- #error F_CLOCK is not defined. You must define F_CLOCK to the frequency of the unprescaled input clock in your project makefile.\r
- #endif\r
- \r
- #if (F_CLOCK == 8000000)\r
- #if (defined(__AVR_AT90USB82__) || defined(__AVR_AT90USB162__) || \\r
- defined(__AVR_ATmega8U2__) || defined(__AVR_ATmega16U2__) || \\r
- defined(__AVR_ATmega32U2__))\r
- #define USB_PLL_PSC 0\r
- #elif (defined(__AVR_ATmega16U4__) || defined(__AVR_ATmega32U4__))\r
- #define USB_PLL_PSC 0\r
- #elif (defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB1286__) || defined(__AVR_ATmega32U6__))\r
- #define USB_PLL_PSC ((1 << PLLP1) | (1 << PLLP0))\r
- #elif (defined(__AVR_AT90USB647__) || defined(__AVR_AT90USB1287__))\r
- #define USB_PLL_PSC ((1 << PLLP1) | (1 << PLLP0))\r
- #endif\r
- #elif (F_CLOCK == 16000000)\r
- #if (defined(__AVR_AT90USB82__) || defined(__AVR_AT90USB162__) || \\r
- defined(__AVR_ATmega8U2__) || defined(__AVR_ATmega16U2__) || \\r
- defined(__AVR_ATmega32U2__))\r
- #define USB_PLL_PSC (1 << PLLP0)\r
- #elif (defined(__AVR_ATmega16U4__) || defined(__AVR_ATmega32U4__))\r
- #define USB_PLL_PSC (1 << PINDIV)\r
- #elif (defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB647__) || defined(__AVR_ATmega32U6__))\r
- #define USB_PLL_PSC ((1 << PLLP2) | (1 << PLLP1))\r
- #elif (defined(__AVR_AT90USB1286__) || defined(__AVR_AT90USB1287__))\r
- #define USB_PLL_PSC ((1 << PLLP2) | (1 << PLLP0))\r
+ \r
+ #if defined(__AVR32__)\r
+ #define USB_PLL_PSC 0\r
+ #elif defined(__AVR__)\r
+ #if !defined(F_CLOCK)\r
+ #error F_CLOCK is not defined. You must define F_CLOCK to the frequency of the unprescaled input clock in your project makefile.\r
#endif\r
- #endif\r
\r
- #if !defined(USB_PLL_PSC)\r
- #error No PLL prescale value available for chosen F_CPU value and AVR model.\r
+ #if (F_CLOCK == 8000000)\r
+ #if (defined(__AVR_AT90USB82__) || defined(__AVR_AT90USB162__) || \\r
+ defined(__AVR_ATmega8U2__) || defined(__AVR_ATmega16U2__) || \\r
+ defined(__AVR_ATmega32U2__))\r
+ #define USB_PLL_PSC 0\r
+ #elif (defined(__AVR_ATmega16U4__) || defined(__AVR_ATmega32U4__))\r
+ #define USB_PLL_PSC 0\r
+ #elif (defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB1286__) || defined(__AVR_ATmega32U6__))\r
+ #define USB_PLL_PSC ((1 << PLLP1) | (1 << PLLP0))\r
+ #elif (defined(__AVR_AT90USB647__) || defined(__AVR_AT90USB1287__))\r
+ #define USB_PLL_PSC ((1 << PLLP1) | (1 << PLLP0))\r
+ #endif\r
+ #elif (F_CLOCK == 16000000)\r
+ #if (defined(__AVR_AT90USB82__) || defined(__AVR_AT90USB162__) || \\r
+ defined(__AVR_ATmega8U2__) || defined(__AVR_ATmega16U2__) || \\r
+ defined(__AVR_ATmega32U2__))\r
+ #define USB_PLL_PSC (1 << PLLP0)\r
+ #elif (defined(__AVR_ATmega16U4__) || defined(__AVR_ATmega32U4__))\r
+ #define USB_PLL_PSC (1 << PINDIV)\r
+ #elif (defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB647__) || defined(__AVR_ATmega32U6__))\r
+ #define USB_PLL_PSC ((1 << PLLP2) | (1 << PLLP1))\r
+ #elif (defined(__AVR_AT90USB1286__) || defined(__AVR_AT90USB1287__))\r
+ #define USB_PLL_PSC ((1 << PLLP2) | (1 << PLLP0))\r
+ #endif\r
+ #endif\r
+ \r
+ #if !defined(USB_PLL_PSC)\r
+ #error No PLL prescale value available for chosen F_CLOCK value and AVR model.\r
+ #endif\r
#endif\r
\r
/* Public Interface - May be used in end-application: */\r
*\r
* \note This token is not available on AVR models which do not support both host and device modes.\r
*/\r
- #define USB_MODE_UID 3\r
+ #define USB_MODE_UID 3\r
#endif\r
\r
/** Regulator disable option mask for \ref USB_Init(). This indicates that the internal 3.3V USB data pad\r
*\r
* \note This token is not available on some AVR models which do not support hardware VBUS monitoring.\r
*/\r
- #define USB_VBUS_GetStatus() ((USBSTA & (1 << VBUS)) ? true : false)\r
+ #define USB_VBUS_GetStatus() ((USBSTA & (1 << VBUS)) ? true : false)\r
#endif\r
\r
/** Detaches the device from the USB bus. This has the effect of removing the device from any\r
#error Do not include this file directly. Include LUFA/Drivers/USB/USB.h instead.\r
#endif\r
\r
+ #if defined(__AVR32__) && !defined(__AVR32_EPREG_X)\r
+ #define __AVR32_EPREG_X(x) ((volatile uint32_t*)AVR32_USBB_ ## x)[USB_SelectedEPNumber] \r
+ #endif\r
+\r
/* Public Interface - May be used in end-application: */\r
/* Macros: */\r
/** Mask for \ref Pipe_GetErrorFlags(), indicating that an overflow error occurred in the pipe on the received data. */\r
#define __INCLUDE_FROM_USB_DRIVER\r
#endif\r
\r
- #if defined(__AVR32__)\r
- #define __AVR32_EPREG_X(x) ((volatile uint32_t*)AVR32_USBB_ ## x)[USB_SelectedEPNumber] \r
- #endif\r
-\r
/* Includes: */\r
#include "HighLevel/USBMode.h"\r
\r
* 0x2064\r
* </td>\r
* <td>\r
- * <i>Currently Unallocated</i>\r
+ * Interfaceless Control-Only LUFA Devices\r
* </td>\r
* </tr>\r
*\r