{\r
.Config =\r
{\r
- .DataINPipeNumber = 1,\r
- .DataOUTPipeNumber = 2,\r
- .NotificationPipeNumber = 3,\r
+ .DataINPipeNumber = 1,\r
+ .DataINPipeDoubleBank = false,\r
+\r
+ .DataOUTPipeNumber = 2,\r
+ .DataOUTPipeDoubleBank = false,\r
+\r
+ .NotificationPipeNumber = 3,\r
+ .NotificationPipeDoubleBank = false,\r
},\r
};\r
\r
/** Macro for calculating the baud value from a given baud rate when the U2X (double speed) bit is\r
* not set.\r
*/\r
- #define SERIAL_UBBRVAL(baud) (((F_CPU / 16) / baud) - 1)\r
+ #define SERIAL_UBBRVAL(baud) (((F_CPU / 16) / (baud)) - 1)\r
\r
/** Macro for calculating the baud value from a given baud rate when the U2X (double speed) bit is\r
* set.\r
*/\r
- #define SERIAL_2X_UBBRVAL(baud) (((F_CPU / 8) / baud) - 1)\r
+ #define SERIAL_2X_UBBRVAL(baud) (((F_CPU / 8) / (baud)) - 1)\r
\r
/* Pseudo-Function Macros: */\r
#if defined(__DOXYGEN__)\r
{\r
Endpoint_ClearSETUP();\r
\r
- HIDInterfaceInfo->State.UsingReportProtocol = (USB_ControlRequest.wValue != 0x0000);\r
+ HIDInterfaceInfo->State.UsingReportProtocol = ((USB_ControlRequest.wValue & 0xFF) != 0x00);\r
\r
Endpoint_ClearStatusStage();\r
}\r
if (EndpointData->EndpointAddress & ENDPOINT_DESCRIPTOR_DIR_IN)\r
{ \r
Pipe_ConfigurePipe(CDCInterfaceInfo->Config.NotificationPipeNumber, EP_TYPE_INTERRUPT, PIPE_TOKEN_IN,\r
- EndpointData->EndpointAddress, EndpointData->EndpointSize, PIPE_BANK_SINGLE);\r
+ EndpointData->EndpointAddress, EndpointData->EndpointSize,\r
+ CDCInterfaceInfo->Config.NotificationPipeDoubleBank ? PIPE_BANK_DOUBLE : PIPE_BANK_SINGLE);\r
CDCInterfaceInfo->State.NotificationPipeSize = EndpointData->EndpointSize;\r
\r
Pipe_SetInterruptPeriod(EndpointData->PollingIntervalMS);\r
if (EndpointData->EndpointAddress & ENDPOINT_DESCRIPTOR_DIR_IN)\r
{\r
Pipe_ConfigurePipe(CDCInterfaceInfo->Config.DataINPipeNumber, EP_TYPE_BULK, PIPE_TOKEN_IN,\r
- EndpointData->EndpointAddress, EndpointData->EndpointSize, PIPE_BANK_SINGLE);\r
+ EndpointData->EndpointAddress, EndpointData->EndpointSize, \r
+ CDCInterfaceInfo->Config.DataINPipeDoubleBank ? PIPE_BANK_DOUBLE : PIPE_BANK_SINGLE);\r
CDCInterfaceInfo->State.DataINPipeSize = EndpointData->EndpointSize;\r
\r
FoundEndpoints |= CDC_FOUND_DATAPIPE_IN;\r
else\r
{\r
Pipe_ConfigurePipe(CDCInterfaceInfo->Config.DataOUTPipeNumber, EP_TYPE_BULK, PIPE_TOKEN_OUT,\r
- EndpointData->EndpointAddress, EndpointData->EndpointSize, PIPE_BANK_SINGLE);\r
+ EndpointData->EndpointAddress, EndpointData->EndpointSize, \r
+ CDCInterfaceInfo->Config.DataOUTPipeDoubleBank ? PIPE_BANK_DOUBLE : PIPE_BANK_SINGLE);\r
CDCInterfaceInfo->State.DataOUTPipeSize = EndpointData->EndpointSize;\r
\r
FoundEndpoints |= CDC_FOUND_DATAPIPE_OUT;\r
* // Can now access elements of the configuration header struct using the -> indirection operator\r
* \endcode\r
*/\r
- #define DESCRIPTOR_PCAST(DescriptorPtr, Type) ((Type*)DescriptorPtr)\r
+ #define DESCRIPTOR_PCAST(DescriptorPtr, Type) ((Type*)(DescriptorPtr))\r
\r
/** Casts a pointer to a descriptor inside the configuration descriptor into the given descriptor\r
* type (as an actual struct instance rather than a pointer to a struct).\r
#endif\r
\r
#if !defined(CONTROL_ONLY_DEVICE)\r
- #define Endpoint_SelectEndpoint(epnum) MACROS{ UENUM = epnum; }MACROE\r
+ #define Endpoint_SelectEndpoint(epnum) MACROS{ UENUM = (epnum); }MACROE\r
#else\r
#define Endpoint_SelectEndpoint(epnum) (void)epnum\r
#endif\r
\r
- #define Endpoint_ResetFIFO(epnum) MACROS{ UERST = (1 << epnum); UERST = 0; }MACROE\r
+ #define Endpoint_ResetFIFO(epnum) MACROS{ UERST = (1 << (epnum)); UERST = 0; }MACROE\r
\r
#define Endpoint_EnableEndpoint() MACROS{ UECONX |= (1 << EPEN); }MACROE\r
\r
\r
#define Endpoint_GetEndpointInterrupts() UEINT\r
\r
- #define Endpoint_HasEndpointInterrupted(n) ((UEINT & (1 << n)) ? true : false)\r
+ #define Endpoint_HasEndpointInterrupted(n) ((UEINT & (1 << (n))) ? true : false)\r
\r
#define Endpoint_IsINReady() ((UEINTX & (1 << TXINI)) ? true : false)\r
\r
\r
#define Endpoint_GetEndpointDirection() (UECFG0X & ENDPOINT_DIR_IN)\r
\r
- #define Endpoint_SetEndpointDirection(dir) MACROS{ UECFG0X = ((UECFG0X & ~ENDPOINT_DIR_IN) | dir); }MACROE\r
+ #define Endpoint_SetEndpointDirection(dir) MACROS{ UECFG0X = ((UECFG0X & ~ENDPOINT_DIR_IN) | (dir)); }MACROE\r
#endif\r
\r
/* Enums: */\r
#endif\r
\r
#define Endpoint_ConfigureEndpoint(Number, Type, Direction, Size, Banks) \\r
- Endpoint_ConfigureEndpoint_Prv(Number, \\r
- ((Type << EPTYPE0) | Direction), \\r
- ((1 << ALLOC) | Banks | \\r
+ Endpoint_ConfigureEndpoint_Prv((Number), \\r
+ (((Type) << EPTYPE0) | (Direction)), \\r
+ ((1 << ALLOC) | (Banks) | \\r
(__builtin_constant_p(Size) ? \\r
- Endpoint_BytesToEPSizeMask(Size) : \\r
+ Endpoint_BytesToEPSizeMask(Size) : \\r
Endpoint_BytesToEPSizeMaskDynamic(Size))))\r
\r
/* Function Prototypes: */\r
#define USB_Host_VBUS_Auto_Off() MACROS{ OTGCON |= (1 << VBUSRQC); }MACROE\r
#define USB_Host_VBUS_Manual_Off() MACROS{ PORTE &= ~(1 << 7); }MACROE\r
\r
- #define USB_Host_SetDeviceAddress(addr) MACROS{ UHADDR = (addr & 0x7F); }MACROE\r
+ #define USB_Host_SetDeviceAddress(addr) MACROS{ UHADDR = ((addr) & 0x7F); }MACROE\r
\r
/* Enums: */\r
enum USB_Host_WaitMSErrorCodes_t\r
\r
#define USB_OTG_Host_IsHNPReceived() ((OTGCON & (1 << HNPREQ)) ? true : false)\r
\r
- #define USB_OTG_Device_InitiateSRP(type) MACROS{ OTGCON = ((OTGCON & ~(1 << SRPSEL)) | (type | (1 << SRPREQ))); }MACROE\r
+ #define USB_OTG_Device_InitiateSRP(type) MACROS{ OTGCON = ((OTGCON & ~(1 << SRPSEL)) | ((type) | (1 << SRPREQ))); }MACROE\r
#endif\r
\r
#endif\r
\r
#define Pipe_GetCurrentPipe() (UPNUM & PIPE_PIPENUM_MASK)\r
\r
- #define Pipe_SelectPipe(pipenum) MACROS{ UPNUM = pipenum; }MACROE\r
+ #define Pipe_SelectPipe(pipenum) MACROS{ UPNUM = (pipenum); }MACROE\r
\r
- #define Pipe_ResetPipe(pipenum) MACROS{ UPRST = (1 << pipenum); UPRST = 0; }MACROE\r
+ #define Pipe_ResetPipe(pipenum) MACROS{ UPRST = (1 << (pipenum)); UPRST = 0; }MACROE\r
\r
#define Pipe_EnablePipe() MACROS{ UPCONX |= (1 << PEN); }MACROE\r
\r
\r
#define Pipe_GetPipeToken() (UPCFG0X & PIPE_TOKEN_MASK)\r
\r
- #define Pipe_SetToken(token) MACROS{ UPCFG0X = ((UPCFG0X & ~PIPE_TOKEN_MASK) | token); }MACROE\r
+ #define Pipe_SetToken(token) MACROS{ UPCFG0X = ((UPCFG0X & ~PIPE_TOKEN_MASK) | (token)); }MACROE\r
\r
#define Pipe_SetInfiniteINRequests() MACROS{ UPCONX |= (1 << INMODE); }MACROE\r
\r
- #define Pipe_SetFiniteINRequests(n) MACROS{ UPCONX &= ~(1 << INMODE); UPINRQX = n; }MACROE\r
+ #define Pipe_SetFiniteINRequests(n) MACROS{ UPCONX &= ~(1 << INMODE); UPINRQX = (n); }MACROE\r
\r
#define Pipe_IsConfigured() ((UPSTAX & (1 << CFGOK)) ? true : false)\r
\r
#define Pipe_BoundEndpointNumber() ((UPCFG0X >> PEPNUM0) & PIPE_EPNUM_MASK)\r
\r
- #define Pipe_SetInterruptPeriod(ms) MACROS{ UPCFG2X = ms; }MACROE\r
+ #define Pipe_SetInterruptPeriod(ms) MACROS{ UPCFG2X = (ms); }MACROE\r
\r
#define Pipe_GetPipeInterrupts() UPINT\r
\r
- #define Pipe_HasPipeInterrupted(n) ((UPINT & (1 << n)) ? true : false)\r
+ #define Pipe_HasPipeInterrupted(n) ((UPINT & (1 << (n))) ? true : false)\r
\r
#define Pipe_Unfreeze() MACROS{ UPCONX &= ~(1 << PFREEZE); }MACROE\r
\r
* the project and is responsible for the initial application hardware configuration.\r
*/\r
\r
-// TODO: Add in software SPI for lower programming speeds below 125KHz\r
-// TODO: Add reversed/shorted target connector checks\r
-\r
#include "AVRISP.h"\r
\r
/** Main program entry point. This routine contains the overall program flow, including initial\r
{\r
.Config = \r
{\r
- .ControlInterfaceNumber = 0,\r
+ .ControlInterfaceNumber = 0,\r
\r
- .DataINEndpointNumber = CDC_TX_EPNUM,\r
- .DataINEndpointSize = CDC_TXRX_EPSIZE,\r
+ .DataINEndpointNumber = CDC_TX_EPNUM,\r
+ .DataINEndpointSize = CDC_TXRX_EPSIZE,\r
+ .DataINEndpointDoubleBank = false,\r
\r
- .DataOUTEndpointNumber = CDC_RX_EPNUM,\r
- .DataOUTEndpointSize = CDC_TXRX_EPSIZE,\r
+ .DataOUTEndpointNumber = CDC_RX_EPNUM,\r
+ .DataOUTEndpointSize = CDC_TXRX_EPSIZE,\r
+ .DataOUTEndpointDoubleBank = false,\r
\r
- .NotificationEndpointNumber = CDC_NOTIFICATION_EPNUM,\r
- .NotificationEndpointSize = CDC_NOTIFICATION_EPSIZE,\r
+ .NotificationEndpointNumber = CDC_NOTIFICATION_EPNUM,\r
+ .NotificationEndpointSize = CDC_NOTIFICATION_EPSIZE,\r
+ .NotificationEndpointDoubleBank = false,\r
},\r
};\r
\r
{\r
.Config =\r
{\r
- .InterfaceNumber = 0,\r
+ .InterfaceNumber = 0,\r
\r
- .ReportINEndpointNumber = KEYBOARD_EPNUM,\r
- .ReportINEndpointSize = KEYBOARD_EPSIZE,\r
+ .ReportINEndpointNumber = KEYBOARD_EPNUM,\r
+ .ReportINEndpointSize = KEYBOARD_EPSIZE,\r
+ .ReportINEndpointDoubleBank = KEYBOARD_EPSIZE,\r
\r
- .PrevReportINBuffer = PrevKeyboardHIDReportBuffer,\r
- .PrevReportINBufferSize = sizeof(PrevKeyboardHIDReportBuffer),\r
+ .PrevReportINBuffer = PrevKeyboardHIDReportBuffer,\r
+ .PrevReportINBufferSize = sizeof(PrevKeyboardHIDReportBuffer),\r
},\r
};\r
\r
{\r
.Config = \r
{\r
- .ControlInterfaceNumber = 0,\r
+ .ControlInterfaceNumber = 0,\r
\r
- .DataINEndpointNumber = CDC_TX_EPNUM,\r
- .DataINEndpointSize = CDC_TXRX_EPSIZE,\r
+ .DataINEndpointNumber = CDC_TX_EPNUM,\r
+ .DataINEndpointSize = CDC_TXRX_EPSIZE,\r
+ .DataINEndpointDoubleBank = false,\r
\r
- .DataOUTEndpointNumber = CDC_RX_EPNUM,\r
- .DataOUTEndpointSize = CDC_TXRX_EPSIZE,\r
+ .DataOUTEndpointNumber = CDC_RX_EPNUM,\r
+ .DataOUTEndpointSize = CDC_TXRX_EPSIZE,\r
+ .DataOUTEndpointDoubleBank = false,\r
\r
- .NotificationEndpointNumber = CDC_NOTIFICATION_EPNUM,\r
- .NotificationEndpointSize = CDC_NOTIFICATION_EPSIZE,\r
+ .NotificationEndpointNumber = CDC_NOTIFICATION_EPNUM,\r
+ .NotificationEndpointSize = CDC_NOTIFICATION_EPSIZE,\r
+ .NotificationEndpointDoubleBank = false,\r
},\r
};\r
\r