Fixed MIDI class driver blocking on unread events to the host.
void EVENT_USB_Disconnect(void);\r
void EVENT_USB_ConfigurationChanged(void);\r
void EVENT_USB_UnhandledControlPacket(void);\r
- void EVENT_USB_StartOfFrame(void);\r
\r
#endif\r
void EVENT_USB_Disconnect(void);\r
void EVENT_USB_ConfigurationChanged(void);\r
void EVENT_USB_UnhandledControlPacket(void);\r
- void EVENT_USB_StartOfFrame(void);\r
- \r
+\r
#endif\r
.ReportOUTEndpointNumber = GENERIC_OUT_EPNUM,\r
.ReportOUTEndpointSize = GENERIC_EPSIZE,\r
\r
- .ReportBufferSize = GENERIC_REPORT_SIZE,\r
+ .ReportINBufferSize = GENERIC_REPORT_SIZE,\r
\r
.UsingReportProtocol = true,\r
};\r
/* Hardware Initialization */\r
LEDs_Init();\r
USB_Init();\r
+\r
+ /* Millisecond timer initialization, with output compare interrupt enabled for the idle timing */\r
+ OCR0A = ((F_CPU / 64) / 1000);\r
+ TCCR0A = (1 << WGM01);\r
+ TCCR0B = ((1 << CS01) | (1 << CS00));\r
+ TIMSK0 = (1 << OCIE0A);\r
}\r
\r
void EVENT_USB_Connect(void)\r
USB_HID_ProcessControlPacket(&Generic_HID_Interface);\r
}\r
\r
-void EVENT_USB_StartOfFrame(void)\r
+ISR(TIMER0_COMPA_vect, ISR_BLOCK)\r
{\r
- USB_HID_RegisterStartOfFrame(&Generic_HID_Interface);\r
+ if (Generic_HID_Interface.IdleMSRemaining)\r
+ Generic_HID_Interface.IdleMSRemaining--;\r
}\r
\r
uint16_t CALLBACK_USB_HID_CreateNextHIDReport(USB_ClassInfo_HID_t* HIDInterfaceInfo, void* ReportData)\r
void EVENT_USB_Disconnect(void);\r
void EVENT_USB_ConfigurationChanged(void);\r
void EVENT_USB_UnhandledControlPacket(void);\r
- void EVENT_USB_StartOfFrame(void);\r
\r
uint16_t CALLBACK_USB_HID_CreateNextHIDReport(USB_ClassInfo_HID_t* HIDInterfaceInfo, void* ReportData);\r
void CALLBACK_USB_HID_ProcessReceivedHIDReport(USB_ClassInfo_HID_t* HIDInterfaceInfo,\r
.ReportINEndpointNumber = JOYSTICK_EPNUM,\r
.ReportINEndpointSize = JOYSTICK_EPSIZE,\r
\r
- .ReportBufferSize = sizeof(USB_JoystickReport_Data_t),\r
+ .ReportINBufferSize = sizeof(USB_JoystickReport_Data_t),\r
\r
.UsingReportProtocol = true,\r
};\r
LEDs_Init();\r
Buttons_Init();\r
USB_Init();\r
+\r
+ /* Millisecond timer initialization, with output compare interrupt enabled for the idle timing */\r
+ OCR0A = ((F_CPU / 64) / 1000);\r
+ TCCR0A = (1 << WGM01);\r
+ TCCR0B = ((1 << CS01) | (1 << CS00));\r
+ TIMSK0 = (1 << OCIE0A);\r
}\r
\r
void EVENT_USB_Connect(void)\r
USB_HID_ProcessControlPacket(&Joystick_HID_Interface);\r
}\r
\r
-void EVENT_USB_StartOfFrame(void)\r
+ISR(TIMER0_COMPA_vect, ISR_BLOCK)\r
{\r
- USB_HID_RegisterStartOfFrame(&Joystick_HID_Interface);\r
+ if (Joystick_HID_Interface.IdleMSRemaining)\r
+ Joystick_HID_Interface.IdleMSRemaining--;\r
}\r
\r
uint16_t CALLBACK_USB_HID_CreateNextHIDReport(USB_ClassInfo_HID_t* HIDInterfaceInfo, void* ReportData)\r
void EVENT_USB_Disconnect(void);\r
void EVENT_USB_ConfigurationChanged(void);\r
void EVENT_USB_UnhandledControlPacket(void);\r
- void EVENT_USB_StartOfFrame(void);\r
\r
uint16_t CALLBACK_USB_HID_CreateNextHIDReport(USB_ClassInfo_HID_t* HIDInterfaceInfo, void* ReportData);\r
void CALLBACK_USB_HID_ProcessReceivedHIDReport(USB_ClassInfo_HID_t* HIDInterfaceInfo,\r
.ReportOUTEndpointNumber = KEYBOARD_LEDS_EPNUM,\r
.ReportOUTEndpointSize = KEYBOARD_EPSIZE,\r
\r
- .ReportBufferSize = sizeof(USB_KeyboardReport_Data_t),\r
+ .ReportINBufferSize = sizeof(USB_KeyboardReport_Data_t),\r
\r
.IdleCount = 500,\r
};\r
LEDs_Init();\r
Buttons_Init();\r
USB_Init();\r
+\r
+ /* Millisecond timer initialization, with output compare interrupt enabled for the idle timing */\r
+ OCR0A = ((F_CPU / 64) / 1000);\r
+ TCCR0A = (1 << WGM01);\r
+ TCCR0B = ((1 << CS01) | (1 << CS00));\r
+ TIMSK0 = (1 << OCIE0A);\r
}\r
\r
void EVENT_USB_Connect(void)\r
USB_HID_ProcessControlPacket(&Keyboard_HID_Interface);\r
}\r
\r
-void EVENT_USB_StartOfFrame(void)\r
+ISR(TIMER0_COMPA_vect, ISR_BLOCK)\r
{\r
- USB_HID_RegisterStartOfFrame(&Keyboard_HID_Interface);\r
+ if (Keyboard_HID_Interface.IdleMSRemaining)\r
+ Keyboard_HID_Interface.IdleMSRemaining--;\r
}\r
\r
uint16_t CALLBACK_USB_HID_CreateNextHIDReport(USB_ClassInfo_HID_t* HIDInterfaceInfo, void* ReportData)\r
void EVENT_USB_Disconnect(void);\r
void EVENT_USB_ConfigurationChanged(void);\r
void EVENT_USB_UnhandledControlPacket(void);\r
- void EVENT_USB_StartOfFrame(void);\r
\r
uint16_t CALLBACK_USB_HID_CreateNextHIDReport(USB_ClassInfo_HID_t* HIDInterfaceInfo, void* ReportData);\r
void CALLBACK_USB_HID_ProcessReceivedHIDReport(USB_ClassInfo_HID_t* HIDInterfaceInfo,\r
.ReportOUTEndpointNumber = KEYBOARD_OUT_EPNUM,\r
.ReportOUTEndpointSize = HID_EPSIZE,\r
\r
- .ReportBufferSize = sizeof(USB_KeyboardReport_Data_t),\r
+ .ReportINBufferSize = sizeof(USB_KeyboardReport_Data_t),\r
\r
.IdleCount = 500,\r
};\r
.ReportINEndpointNumber = MOUSE_IN_EPNUM,\r
.ReportINEndpointSize = HID_EPSIZE,\r
\r
- .ReportBufferSize = sizeof(USB_MouseReport_Data_t),\r
+ .ReportINBufferSize = sizeof(USB_MouseReport_Data_t),\r
\r
.ReportOUTEndpointNumber = 0,\r
.ReportOUTEndpointSize = 0,\r
/* Hardware Initialization */\r
Joystick_Init();\r
LEDs_Init();\r
- USB_Init(); \r
+ USB_Init();\r
+\r
+ /* Millisecond timer initialization, with output compare interrupt enabled for the idle timing */\r
+ OCR0A = ((F_CPU / 64) / 1000);\r
+ TCCR0A = (1 << WGM01);\r
+ TCCR0B = ((1 << CS01) | (1 << CS00));\r
+ TIMSK0 = (1 << OCIE0A);\r
}\r
\r
void EVENT_USB_Connect(void)\r
USB_HID_ProcessControlPacket(&Mouse_HID_Interface);\r
}\r
\r
-void EVENT_USB_StartOfFrame(void)\r
+ISR(TIMER0_COMPA_vect, ISR_BLOCK)\r
{\r
- USB_HID_RegisterStartOfFrame(&Keyboard_HID_Interface);\r
- USB_HID_RegisterStartOfFrame(&Mouse_HID_Interface);\r
+ if (Keyboard_HID_Interface.IdleMSRemaining)\r
+ Keyboard_HID_Interface.IdleMSRemaining--;\r
+\r
+ if (Mouse_HID_Interface.IdleMSRemaining)\r
+ Mouse_HID_Interface.IdleMSRemaining--;\r
}\r
\r
uint16_t CALLBACK_USB_HID_CreateNextHIDReport(USB_ClassInfo_HID_t* HIDInterfaceInfo, void* ReportData)\r
void EVENT_USB_Disconnect(void);\r
void EVENT_USB_ConfigurationChanged(void);\r
void EVENT_USB_UnhandledControlPacket(void);\r
- void EVENT_USB_StartOfFrame(void);\r
\r
uint16_t CALLBACK_USB_HID_CreateNextHIDReport(USB_ClassInfo_HID_t* HIDInterfaceInfo, void* ReportData);\r
void CALLBACK_USB_HID_ProcessReceivedHIDReport(USB_ClassInfo_HID_t* HIDInterfaceInfo,\r
.ReportINEndpointNumber = MOUSE_EPNUM,\r
.ReportINEndpointSize = MOUSE_EPSIZE,\r
\r
- .ReportBufferSize = sizeof(USB_MouseReport_Data_t),\r
+ .ReportINBufferSize = sizeof(USB_MouseReport_Data_t),\r
};\r
\r
int main(void)\r
LEDs_Init();\r
Buttons_Init();\r
USB_Init();\r
+\r
+ /* Millisecond timer initialization, with output compare interrupt enabled for the idle timing */\r
+ OCR0A = ((F_CPU / 64) / 1000);\r
+ TCCR0A = (1 << WGM01);\r
+ TCCR0B = ((1 << CS01) | (1 << CS00));\r
+ TIMSK0 = (1 << OCIE0A);\r
}\r
\r
void EVENT_USB_Connect(void)\r
USB_HID_ProcessControlPacket(&Mouse_HID_Interface);\r
}\r
\r
-void EVENT_USB_StartOfFrame(void)\r
+ISR(TIMER0_COMPA_vect, ISR_BLOCK)\r
{\r
- USB_HID_RegisterStartOfFrame(&Mouse_HID_Interface);\r
+ if (Mouse_HID_Interface.IdleMSRemaining)\r
+ Mouse_HID_Interface.IdleMSRemaining--;\r
}\r
\r
uint16_t CALLBACK_USB_HID_CreateNextHIDReport(USB_ClassInfo_HID_t* HIDInterfaceInfo, void* ReportData)\r
void EVENT_USB_Disconnect(void);\r
void EVENT_USB_ConfigurationChanged(void);\r
void EVENT_USB_UnhandledControlPacket(void);\r
- void EVENT_USB_StartOfFrame(void);\r
\r
uint16_t CALLBACK_USB_HID_CreateNextHIDReport(USB_ClassInfo_HID_t* HIDInterfaceInfo, void* ReportData);\r
void CALLBACK_USB_HID_ProcessReceivedHIDReport(USB_ClassInfo_HID_t* HIDInterfaceInfo,\r
void EVENT_USB_Disconnect(void);\r
void EVENT_USB_ConfigurationChanged(void);\r
void EVENT_USB_UnhandledControlPacket(void);\r
- void EVENT_USB_StartOfFrame(void);\r
\r
void CALLBACK_USB_RNDIS_ProcessRNDISControlMessage(USB_ClassInfo_RNDIS_t* RNDISInterfaceInfo);\r
\r
void EVENT_USB_Disconnect(void);\r
void EVENT_USB_ConfigurationChanged(void);\r
void EVENT_USB_UnhandledControlPacket(void);\r
- void EVENT_USB_StartOfFrame(void);\r
\r
void EVENT_USB_CDC_LineEncodingChanged(USB_ClassInfo_CDC_t* CDCInterfaceInfo);\r
\r
* LUFA/Drivers/USB/Class/ directory to LUFA/Drivers/USB/HighLevel/ in preperation for the new USB class APIs\r
* - Moved out each demos' functionality library files (e.g. Ring Buffer library) to /Lib directories for a better directory structure\r
* - Removed Tx interrupt from the USBtoSerial demo; now sends characters via polling to ensure more time for the Rx interrupt\r
- * - Added new EVENT_USB_StartOfFrame event in the library to indicate the start of each USB frame (when generated)\r
* - Removed psuedo-scheduler, dynamic memory block allocator from the library (no longer needed and not used respectively)\r
*\r
*\r
{\r
Endpoint_ClearSETUP(); \r
\r
- uint8_t ReportINData[HIDInterfaceInfo->ReportBufferSize];\r
+ uint8_t ReportINData[HIDInterfaceInfo->ReportINBufferSize];\r
uint16_t ReportINSize;\r
\r
memset(ReportINData, 0, sizeof(ReportINData));\r
\r
return true;\r
}\r
-\r
-void USB_HID_RegisterStartOfFrame(USB_ClassInfo_HID_t* HIDInterfaceInfo)\r
-{\r
- if (HIDInterfaceInfo->IdleMSRemaining)\r
- HIDInterfaceInfo->IdleMSRemaining--;\r
-}\r
\r
void USB_HID_USBTask(USB_ClassInfo_HID_t* HIDInterfaceInfo)\r
{\r
if (HIDInterfaceInfo->IdleCount && !(HIDInterfaceInfo->IdleMSRemaining))\r
HIDInterfaceInfo->IdleMSRemaining = HIDInterfaceInfo->IdleCount;\r
\r
- uint8_t ReportINData[HIDInterfaceInfo->ReportBufferSize];\r
+ uint8_t ReportINData[HIDInterfaceInfo->ReportINBufferSize];\r
uint16_t ReportINSize;\r
\r
memset(ReportINData, 0, sizeof(ReportINData));\r
ReportINSize = CALLBACK_USB_HID_CreateNextHIDReport(HIDInterfaceInfo, ReportINData);\r
\r
if (ReportINSize)\r
- {\r
- Endpoint_Write_Stream_LE(ReportINData, ReportINSize\r
- #if !defined(NO_STREAM_CALLBACKS)\r
- , NO_STREAM_CALLBACK\r
- #endif\r
- );\r
- }\r
+ Endpoint_Write_Stream_LE(ReportINData, ReportINSize, NO_STREAM_CALLBACK);\r
\r
Endpoint_ClearIN();\r
}\r
uint8_t ReportOUTData[ReportOUTSize];\r
\r
if (ReportOUTSize)\r
- {\r
- Endpoint_Read_Stream_LE(ReportOUTData, ReportOUTSize\r
- #if !defined(NO_STREAM_CALLBACKS)\r
- , NO_STREAM_CALLBACK\r
- #endif\r
- );\r
- }\r
+ Endpoint_Read_Stream_LE(ReportOUTData, ReportOUTSize, NO_STREAM_CALLBACK);\r
\r
CALLBACK_USB_HID_ProcessReceivedHIDReport(HIDInterfaceInfo, ReportOUTData, ReportOUTSize);\r
\r
uint8_t ReportOUTEndpointNumber; /**< Endpoint number of the HID interface's OUT report endpoint, if used */\r
uint16_t ReportOUTEndpointSize; /**< Size in bytes of the HID interface's OUT report endpoint, if used */\r
\r
- uint8_t ReportBufferSize;\r
+ uint8_t ReportINBufferSize;\r
\r
bool UsingReportProtocol; /**< Indicates if the HID interface is set to Boot or Report protocol mode */\r
uint16_t IdleCount; /**< Report idle period, in ms, set by the host */\r
/* Function Prototypes: */\r
bool USB_HID_ConfigureEndpoints(USB_ClassInfo_HID_t* HIDInterfaceInfo);\r
void USB_HID_ProcessControlPacket(USB_ClassInfo_HID_t* HIDInterfaceInfo);\r
- void USB_HID_RegisterStartOfFrame(USB_ClassInfo_HID_t* HIDInterfaceInfo);\r
void USB_HID_USBTask(USB_ClassInfo_HID_t* HIDInterfaceInfo);\r
\r
uint16_t CALLBACK_USB_HID_CreateNextHIDReport(USB_ClassInfo_HID_t* HIDInterfaceInfo, void* ReportData);\r
return true;\r
}\r
\r
-void USB_MIDI_SendNoteChange(USB_ClassInfo_MIDI_t* MIDIInterfaceInfo, const uint8_t Pitch, const bool OnOff,\r
- const uint8_t CableID, const uint8_t Channel)\r
-{\r
- if (!(USB_IsConnected))\r
- return;\r
- \r
- Endpoint_SelectEndpoint(MIDIInterfaceInfo->DataINEndpointNumber);\r
- while (!(Endpoint_IsReadWriteAllowed()));\r
-\r
- uint8_t Command = ((OnOff)? MIDI_COMMAND_NOTE_ON : MIDI_COMMAND_NOTE_OFF);\r
-\r
- Endpoint_Write_Byte((CableID << 4) | (Command >> 4));\r
-\r
- Endpoint_Write_Byte(Command | Channel);\r
- Endpoint_Write_Byte(Pitch);\r
- Endpoint_Write_Byte(MIDI_STANDARD_VELOCITY);\r
- \r
- Endpoint_ClearIN();\r
-}\r
-\r
void USB_MIDI_SendEventPacket(USB_ClassInfo_MIDI_t* MIDIInterfaceInfo, USB_MIDI_EventPacket_t* Event)\r
{\r
if (!(USB_IsConnected))\r
return;\r
\r
Endpoint_SelectEndpoint(MIDIInterfaceInfo->DataINEndpointNumber);\r
- while (!(Endpoint_IsReadWriteAllowed()));\r
\r
- Endpoint_Write_Stream_LE(Event, sizeof(USB_MIDI_EventPacket_t), NO_STREAM_CALLBACK);\r
- Endpoint_ClearIN();\r
+ if (Endpoint_IsReadWriteAllowed());\r
+ {\r
+ Endpoint_Write_Stream_LE(Event, sizeof(USB_MIDI_EventPacket_t), NO_STREAM_CALLBACK);\r
+ Endpoint_ClearIN();\r
+ }\r
}\r
\r
bool USB_MIDI_ReceiveEventPacket(USB_ClassInfo_MIDI_t* MIDIInterfaceInfo, USB_MIDI_EventPacket_t* Event)\r
* \ref Group_USBManagement documentation).\r
*/\r
void EVENT_USB_Reset(void);\r
- \r
- /** Event for the USB start of frame interrupt, firing once each millisecond in either device or host\r
- * mode, while USB frames are being generated or recieved.\r
- */\r
- void EVENT_USB_StartOfFrame(void);\r
#endif\r
\r
/* Private Interface - For use in library only: */\r
void EVENT_USB_Suspend(void) ATTR_WEAK ATTR_ALIAS(USB_Event_Stub);\r
void EVENT_USB_WakeUp(void) ATTR_WEAK ATTR_ALIAS(USB_Event_Stub);\r
void EVENT_USB_Reset(void) ATTR_WEAK ATTR_ALIAS(USB_Event_Stub);\r
- void EVENT_USB_StartOfFrame(void) ATTR_WEAK ATTR_ALIAS(USB_Event_Stub);\r
#endif\r
#endif\r
\r
\r
EVENT_USB_Reset();\r
}\r
- \r
- if (USB_INT_HasOccurred(USB_INT_SOFI) && USB_INT_IsEnabled(USB_INT_SOFI))\r
- {\r
- USB_INT_Clear(USB_INT_SOFI);\r
-\r
- FrameElapsed = true;\r
- \r
- EVENT_USB_StartOfFrame();\r
- }\r
#endif\r
\r
#if defined(USB_CAN_BE_HOST)\r
\r
USB_ResetInterface();\r
}\r
-\r
- if (USB_INT_HasOccurred(USB_INT_HSOFI) && USB_INT_IsEnabled(USB_INT_HSOFI))\r
- {\r
- USB_INT_Clear(USB_INT_HSOFI);\r
-\r
- FrameElapsed = true;\r
- \r
- EVENT_USB_StartOfFrame();\r
- }\r
#endif\r
\r
#if defined(USB_CAN_BE_BOTH)\r
#if defined(USB_DEVICE_ONLY) \r
USB_INT_Enable(USB_INT_SUSPEND);\r
USB_INT_Enable(USB_INT_EORSTI);\r
- USB_INT_Enable(USB_INT_SOFI);\r
-\r
#if defined(CONTROL_ONLY_DEVICE)\r
UENUM = ENDPOINT_CONTROLEP;\r
#endif\r
\r
USB_INT_Enable(USB_INT_SRPI);\r
USB_INT_Enable(USB_INT_BCERRI);\r
- USB_INT_Enable(USB_INT_HSOFI);\r
#else\r
if (USB_CurrentMode == USB_MODE_DEVICE)\r
{\r
USB_INT_Enable(USB_INT_SUSPEND);\r
USB_INT_Enable(USB_INT_EORSTI);\r
- USB_INT_Enable(USB_INT_SOFI);\r
\r
#if defined(CONTROL_ONLY_DEVICE)\r
UENUM = ENDPOINT_CONTROLEP;\r
\r
USB_INT_Enable(USB_INT_SRPI);\r
USB_INT_Enable(USB_INT_BCERRI);\r
- USB_INT_Enable(USB_INT_HSOFI);\r
}\r
#endif\r
}\r
\r
.ReportINEndpointNumber = KEYBOARD_EPNUM,\r
.ReportINEndpointSize = KEYBOARD_EPSIZE,\r
+ \r
+ .ReportINBufferSize = sizeof(USB_KeyboardReport_Data_t),\r
};\r
\r
int main(void)\r
/* Hardware Initialization */\r
Magstripe_Init();\r
USB_Init();\r
+\r
+ /* Millisecond timer initialization, with output compare interrupt enabled for the idle timing */\r
+ OCR0A = ((F_CPU / 64) / 1000);\r
+ TCCR0A = (1 << WGM01);\r
+ TCCR0B = ((1 << CS01) | (1 << CS00));\r
+ TIMSK0 = (1 << OCIE0A);\r
}\r
\r
void ReadMagstripeData(void)\r
USB_HID_ProcessControlPacket(&Keyboard_HID_Interface);\r
}\r
\r
-void EVENT_USB_StartOfFrame(void)\r
+ISR(TIMER0_COMPA_vect, ISR_BLOCK)\r
{\r
- USB_HID_RegisterStartOfFrame(&Keyboard_HID_Interface);\r
+ if (Keyboard_HID_Interface.IdleMSRemaining)\r
+ Keyboard_HID_Interface.IdleMSRemaining--;\r
}\r
\r
uint16_t CALLBACK_USB_HID_CreateNextHIDReport(USB_ClassInfo_HID_t* HIDInterfaceInfo, void* ReportData)\r
\r
void EVENT_USB_ConfigurationChanged(void);\r
void EVENT_USB_UnhandledControlPacket(void);\r
- void EVENT_USB_StartOfFrame(void);\r
\r
uint16_t CALLBACK_USB_HID_CreateNextHIDReport(USB_ClassInfo_HID_t* HIDInterfaceInfo, void* ReportData);\r
void CALLBACK_USB_HID_ProcessReceivedHIDReport(USB_ClassInfo_HID_t* HIDInterfaceInfo,\r
# Place -D or -U options here for C sources
CDEFS = -DF_CPU=$(F_CPU)UL -DF_CLOCK=$(F_CLOCK)UL -DBOARD=BOARD_$(BOARD)
-CDEFS += -DUSE_NONSTANDARD_DESCRIPTOR_NAMES -DNO_STREAM_CALLBACKS -DUSB_DEVICE_ONLY
+CDEFS += -DUSE_NONSTANDARD_DESCRIPTOR_NAMES -DUSB_DEVICE_ONLY
CDEFS += -DFIXED_CONTROL_ENDPOINT_SIZE=8 -DUSE_SINGLE_DEVICE_CONFIGURATION
CDEFS += -DUSE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"
CDEFS += -DMAG_T1_CLOCK="(1 << 0)"