Removed all user pipe/endpoint interrupt APIs, added internal library support for interrupt driven control endpoints when in device mode by defining INTERRUPT_CONTROL_ENDPOINT token and passing it to the compiler via the -D switch.
This commit is contained in:
parent
0d5baf9bb3
commit
32f0f605ef
22 changed files with 48 additions and 342 deletions
|
|
@ -39,10 +39,7 @@
|
|||
/* Scheduler Task List */
|
||||
TASK_LIST
|
||||
{
|
||||
#if !defined(INTERRUPT_CONTROL_ENDPOINT)
|
||||
{ .Task = USB_USBTask , .TaskStatus = TASK_STOP },
|
||||
#endif
|
||||
|
||||
{ .Task = USB_HID_Report , .TaskStatus = TASK_STOP },
|
||||
};
|
||||
|
||||
|
|
@ -75,30 +72,13 @@ int main(void)
|
|||
Scheduler_Start();
|
||||
}
|
||||
|
||||
/** Event handler for the USB_Reset event. This fires when the USB interface is reset by the USB host, before the
|
||||
* enumeration process begins, and enables the control endpoint interrupt so that control requests can be handled
|
||||
* asynchronously when they arrive rather than when the control endpoint is polled manually.
|
||||
*/
|
||||
EVENT_HANDLER(USB_Reset)
|
||||
{
|
||||
#if defined(INTERRUPT_CONTROL_ENDPOINT)
|
||||
/* Select the control endpoint */
|
||||
Endpoint_SelectEndpoint(ENDPOINT_CONTROLEP);
|
||||
|
||||
/* Enable the endpoint SETUP interrupt ISR for the control endpoint */
|
||||
USB_INT_Enable(ENDPOINT_INT_SETUP);
|
||||
#endif
|
||||
}
|
||||
|
||||
/** Event handler for the USB_Connect event. This indicates that the device is enumerating via the status LEDs and
|
||||
* starts the library USB task to begin the enumeration and USB management process.
|
||||
*/
|
||||
EVENT_HANDLER(USB_Connect)
|
||||
{
|
||||
#if !defined(INTERRUPT_CONTROL_ENDPOINT)
|
||||
/* Start USB management task */
|
||||
Scheduler_SetTaskMode(USB_USBTask, TASK_RUN);
|
||||
#endif
|
||||
|
||||
/* Indicate USB enumerating */
|
||||
UpdateStatus(Status_USBEnumerating);
|
||||
|
|
@ -111,10 +91,7 @@ EVENT_HANDLER(USB_Disconnect)
|
|||
{
|
||||
/* Stop running HID reporting and USB management tasks */
|
||||
Scheduler_SetTaskMode(USB_HID_Report, TASK_STOP);
|
||||
|
||||
#if !defined(INTERRUPT_CONTROL_ENDPOINT)
|
||||
Scheduler_SetTaskMode(USB_USBTask, TASK_STOP);
|
||||
#endif
|
||||
|
||||
/* Indicate USB not ready */
|
||||
UpdateStatus(Status_USBNotReady);
|
||||
|
|
@ -298,32 +275,3 @@ TASK(USB_HID_Report)
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
#if defined(INTERRUPT_CONTROL_ENDPOINT)
|
||||
/** ISR for the general Pipe/Endpoint interrupt vector. This ISR fires when an endpoint's status changes (such as
|
||||
* a packet has been received) on an endpoint with its corresponding ISR enabling bits set. This is used to send
|
||||
* HID packets to the host each time the HID interrupt endpoints polling period elapses, as managed by the USB
|
||||
* controller.
|
||||
*/
|
||||
ISR(ENDPOINT_PIPE_vect, ISR_BLOCK)
|
||||
{
|
||||
/* Save previously selected endpoint before selecting a new endpoint */
|
||||
uint8_t PrevSelectedEndpoint = Endpoint_GetCurrentEndpoint();
|
||||
|
||||
/* Check if the control endpoint has received a request */
|
||||
if (Endpoint_HasEndpointInterrupted(ENDPOINT_CONTROLEP))
|
||||
{
|
||||
/* Clear the endpoint interrupt */
|
||||
Endpoint_ClearEndpointInterrupt(ENDPOINT_CONTROLEP);
|
||||
|
||||
/* Process the control request */
|
||||
USB_USBTask();
|
||||
|
||||
/* Handshake the endpoint setup interrupt - must be after the call to USB_USBTask() */
|
||||
USB_INT_Clear(ENDPOINT_INT_SETUP);
|
||||
}
|
||||
|
||||
/* Restore previously selected endpoint */
|
||||
Endpoint_SelectEndpoint(PrevSelectedEndpoint);
|
||||
}
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -68,9 +68,6 @@
|
|||
};
|
||||
|
||||
/* Event Handlers: */
|
||||
/** Indicates that this module will catch the USB_Reset event when thrown by the library. */
|
||||
HANDLES_EVENT(USB_Reset);
|
||||
|
||||
/** Indicates that this module will catch the USB_Connect event when thrown by the library. */
|
||||
HANDLES_EVENT(USB_Connect);
|
||||
|
||||
|
|
|
|||
|
|
@ -60,12 +60,5 @@
|
|||
* <td>This token defines the size of the device reports, both sent and received. The value must be an
|
||||
* integer ranging from 1 to 255.</td>
|
||||
* </tr>
|
||||
* <tr>
|
||||
* <td>INTERRUPT_CONTROL_ENDPOINT</td>
|
||||
* <td>Makefile CDEFS</td>
|
||||
* <td>When defined, this causes the demo to enable interrupts for the control endpoint,
|
||||
* which services control requests from the host. If not defined, the control endpoint
|
||||
* is serviced via polling using the task scheduler.</td>
|
||||
* </tr>
|
||||
* </table>
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -40,10 +40,7 @@
|
|||
/* Scheduler Task List */
|
||||
TASK_LIST
|
||||
{
|
||||
#if !defined(INTERRUPT_CONTROL_ENDPOINT)
|
||||
{ .Task = USB_USBTask , .TaskStatus = TASK_STOP },
|
||||
#endif
|
||||
|
||||
{ .Task = USB_USBTask , .TaskStatus = TASK_STOP },
|
||||
{ .Task = USB_Keyboard_Report , .TaskStatus = TASK_STOP },
|
||||
};
|
||||
|
||||
|
|
@ -105,10 +102,8 @@ int main(void)
|
|||
*/
|
||||
EVENT_HANDLER(USB_Connect)
|
||||
{
|
||||
#if !defined(INTERRUPT_CONTROL_ENDPOINT)
|
||||
/* Start USB management task */
|
||||
Scheduler_SetTaskMode(USB_USBTask, TASK_RUN);
|
||||
#endif
|
||||
|
||||
/* Indicate USB enumerating */
|
||||
UpdateStatus(Status_USBEnumerating);
|
||||
|
|
@ -117,21 +112,6 @@ EVENT_HANDLER(USB_Connect)
|
|||
UsingReportProtocol = true;
|
||||
}
|
||||
|
||||
/** Event handler for the USB_Reset event. This fires when the USB interface is reset by the USB host, before the
|
||||
* enumeration process begins, and enables the control endpoint interrupt so that control requests can be handled
|
||||
* asynchronously when they arrive rather than when the control endpoint is polled manually.
|
||||
*/
|
||||
EVENT_HANDLER(USB_Reset)
|
||||
{
|
||||
#if defined(INTERRUPT_CONTROL_ENDPOINT)
|
||||
/* Select the control endpoint */
|
||||
Endpoint_SelectEndpoint(ENDPOINT_CONTROLEP);
|
||||
|
||||
/* Enable the endpoint SETUP interrupt ISR for the control endpoint */
|
||||
USB_INT_Enable(ENDPOINT_INT_SETUP);
|
||||
#endif
|
||||
}
|
||||
|
||||
/** Event handler for the USB_Disconnect event. This indicates that the device is no longer connected to a host via
|
||||
* the status LEDs.
|
||||
*/
|
||||
|
|
@ -139,10 +119,7 @@ EVENT_HANDLER(USB_Disconnect)
|
|||
{
|
||||
/* Stop running keyboard reporting and USB management tasks */
|
||||
Scheduler_SetTaskMode(USB_Keyboard_Report, TASK_STOP);
|
||||
|
||||
#if !defined(INTERRUPT_CONTROL_ENDPOINT)
|
||||
Scheduler_SetTaskMode(USB_USBTask, TASK_STOP);
|
||||
#endif
|
||||
|
||||
/* Indicate USB not ready */
|
||||
UpdateStatus(Status_USBNotReady);
|
||||
|
|
@ -445,30 +422,3 @@ TASK(USB_Keyboard_Report)
|
|||
ReceiveNextReport();
|
||||
}
|
||||
}
|
||||
|
||||
#if defined(INTERRUPT_CONTROL_ENDPOINT)
|
||||
/** ISR for the general Pipe/Endpoint interrupt vector. This ISR fires when an endpoint's status changes (such as
|
||||
* a packet has been received) on an endpoint with its corresponding ISR enabling bits set. This is used to send
|
||||
* HID packets to the host each time the HID interrupt endpoints polling period elapses, as managed by the USB
|
||||
* controller. It is also used to respond to standard and class specific requests send to the device on the control
|
||||
* endpoint, by handing them off to the LUFA library when they are received.
|
||||
*/
|
||||
ISR(ENDPOINT_PIPE_vect, ISR_BLOCK)
|
||||
{
|
||||
/* Save previously selected endpoint before selecting a new endpoint */
|
||||
uint8_t PrevSelectedEndpoint = Endpoint_GetCurrentEndpoint();
|
||||
|
||||
/* Check if the control endpoint has received a request */
|
||||
if (Endpoint_HasEndpointInterrupted(ENDPOINT_CONTROLEP))
|
||||
{
|
||||
/* Process the control request */
|
||||
USB_USBTask();
|
||||
|
||||
/* Handshake the endpoint setup interrupt - must be after the call to USB_USBTask() */
|
||||
USB_INT_Clear(ENDPOINT_INT_SETUP);
|
||||
}
|
||||
|
||||
/* Restore previously selected endpoint */
|
||||
Endpoint_SelectEndpoint(PrevSelectedEndpoint);
|
||||
}
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -105,9 +105,6 @@
|
|||
/** Indicates that this module will catch the USB_Disconnect event when thrown by the library. */
|
||||
HANDLES_EVENT(USB_Disconnect);
|
||||
|
||||
/** Indicates that this module will catch the USB_Reset event when thrown by the library. */
|
||||
HANDLES_EVENT(USB_Reset);
|
||||
|
||||
/** Indicates that this module will catch the USB_ConfigurationChanged event when thrown by the library. */
|
||||
HANDLES_EVENT(USB_ConfigurationChanged);
|
||||
|
||||
|
|
|
|||
|
|
@ -52,16 +52,9 @@
|
|||
*
|
||||
* <table>
|
||||
* <tr>
|
||||
* <td><b>Define Name:</b></td>
|
||||
* <td><b>Location:</b></td>
|
||||
* <td><b>Description:</b></td>
|
||||
* </tr>
|
||||
* <tr>
|
||||
* <td>INTERRUPT_CONTROL_ENDPOINT</td>
|
||||
* <td>Makefile CDEFS</td>
|
||||
* <td>When defined, this causes the demo to enable interrupts for the control endpoint,
|
||||
* which services control requests from the host. If not defined, the control endpoint
|
||||
* is serviced via polling using the task scheduler.</td>
|
||||
* <td>
|
||||
* None
|
||||
* </td>
|
||||
* </tr>
|
||||
* </table>
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -85,19 +85,6 @@ int main(void)
|
|||
Scheduler_Start();
|
||||
}
|
||||
|
||||
/** Event handler for the USB_Reset event. This fires when the USB interface is reset by the USB host, before the
|
||||
* enumeration process begins, and enables the control endpoint interrupt so that control requests can be handled
|
||||
* asynchronously when they arrive rather than when the control endpoint is polled manually.
|
||||
*/
|
||||
EVENT_HANDLER(USB_Reset)
|
||||
{
|
||||
/* Select the control endpoint */
|
||||
Endpoint_SelectEndpoint(ENDPOINT_CONTROLEP);
|
||||
|
||||
/* Enable the endpoint SETUP interrupt ISR for the control endpoint */
|
||||
USB_INT_Enable(ENDPOINT_INT_SETUP);
|
||||
}
|
||||
|
||||
/** Event handler for the USB_Connect event. This indicates that the device is enumerating via the status LEDs. */
|
||||
EVENT_HANDLER(USB_Connect)
|
||||
{
|
||||
|
|
@ -376,21 +363,3 @@ STREAM_CALLBACK(AbortOnMassStoreReset)
|
|||
/* Continue with the current stream operation */
|
||||
return STREAMCALLBACK_Continue;
|
||||
}
|
||||
|
||||
/** ISR for the general Pipe/Endpoint interrupt vector. This ISR fires when a control request has been issued to the control endpoint,
|
||||
* so that the request can be processed. As several elements of the Mass Storage implementation require asynchronous control requests
|
||||
* (such as endpoint stall clearing and Mass Storage Reset requests during data transfers) this is done via interrupts rather than
|
||||
* polling so that they can be processed regardless of the rest of the application's state.
|
||||
*/
|
||||
ISR(ENDPOINT_PIPE_vect, ISR_BLOCK)
|
||||
{
|
||||
/* Check if the control endpoint has received a request */
|
||||
if (Endpoint_HasEndpointInterrupted(ENDPOINT_CONTROLEP))
|
||||
{
|
||||
/* Process the control request */
|
||||
USB_USBTask();
|
||||
|
||||
/* Handshake the endpoint setup interrupt - must be after the call to USB_USBTask() */
|
||||
USB_INT_Clear(ENDPOINT_INT_SETUP);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -134,9 +134,6 @@
|
|||
STREAM_CALLBACK(AbortOnMassStoreReset);
|
||||
|
||||
/* Event Handlers: */
|
||||
/** Indicates that this module will catch the USB_Reset event when thrown by the library. */
|
||||
HANDLES_EVENT(USB_Reset);
|
||||
|
||||
/** Indicates that this module will catch the USB_Connect event when thrown by the library. */
|
||||
HANDLES_EVENT(USB_Connect);
|
||||
|
||||
|
|
|
|||
|
|
@ -58,6 +58,11 @@
|
|||
* 255), with each LUN being allocated an equal portion of the available
|
||||
* Dataflash memory.
|
||||
*
|
||||
* The USB control endpoint is managed entirely by the library using endpoint
|
||||
* interrupts, as the INTERRUPT_CONTROL_ENDPOINT option is enabled. This allows for
|
||||
* the host to reset the Mass Storage device state during long transfers without
|
||||
* the need for complicated polling logic.
|
||||
*
|
||||
* \section SSec_Options Project Options
|
||||
*
|
||||
* The following defines can be found in this demo, which can control the demo behaviour when defined, or changed in value.
|
||||
|
|
|
|||
|
|
@ -189,6 +189,7 @@ CDEFS = -DF_CPU=$(F_CPU)UL -DF_CLOCK=$(F_CLOCK)UL -DBOARD=BOARD_$(BOARD)
|
|||
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 += -DINTERRUPT_CONTROL_ENDPOINT
|
||||
|
||||
|
||||
# Place -D or -U options here for ASM sources
|
||||
|
|
|
|||
|
|
@ -39,10 +39,7 @@
|
|||
/* Scheduler Task List */
|
||||
TASK_LIST
|
||||
{
|
||||
#if !defined(INTERRUPT_CONTROL_ENDPOINT)
|
||||
{ .Task = USB_USBTask , .TaskStatus = TASK_STOP },
|
||||
#endif
|
||||
|
||||
{ .Task = USB_Mouse_Report , .TaskStatus = TASK_STOP },
|
||||
};
|
||||
|
||||
|
|
@ -105,10 +102,8 @@ int main(void)
|
|||
*/
|
||||
EVENT_HANDLER(USB_Connect)
|
||||
{
|
||||
#if !defined(INTERRUPT_CONTROL_ENDPOINT)
|
||||
/* Start USB management task */
|
||||
Scheduler_SetTaskMode(USB_USBTask, TASK_RUN);
|
||||
#endif
|
||||
|
||||
/* Indicate USB enumerating */
|
||||
UpdateStatus(Status_USBEnumerating);
|
||||
|
|
@ -117,21 +112,6 @@ EVENT_HANDLER(USB_Connect)
|
|||
UsingReportProtocol = true;
|
||||
}
|
||||
|
||||
/** Event handler for the USB_Reset event. This fires when the USB interface is reset by the USB host, before the
|
||||
* enumeration process begins, and enables the control endpoint interrupt so that control requests can be handled
|
||||
* asynchronously when they arrive rather than when the control endpoint is polled manually.
|
||||
*/
|
||||
EVENT_HANDLER(USB_Reset)
|
||||
{
|
||||
#if defined(INTERRUPT_CONTROL_ENDPOINT)
|
||||
/* Select the control endpoint */
|
||||
Endpoint_SelectEndpoint(ENDPOINT_CONTROLEP);
|
||||
|
||||
/* Enable the endpoint SETUP interrupt ISR for the control endpoint */
|
||||
USB_INT_Enable(ENDPOINT_INT_SETUP);
|
||||
#endif
|
||||
}
|
||||
|
||||
/** Event handler for the USB_Disconnect event. This indicates that the device is no longer connected to a host via
|
||||
* the status LEDs and stops the USB management and Mouse reporting tasks.
|
||||
*/
|
||||
|
|
@ -139,10 +119,7 @@ EVENT_HANDLER(USB_Disconnect)
|
|||
{
|
||||
/* Stop running mouse reporting and USB management tasks */
|
||||
Scheduler_SetTaskMode(USB_Mouse_Report, TASK_STOP);
|
||||
|
||||
#if !defined(INTERRUPT_CONTROL_ENDPOINT)
|
||||
Scheduler_SetTaskMode(USB_USBTask, TASK_STOP);
|
||||
#endif
|
||||
|
||||
/* Indicate USB not ready */
|
||||
UpdateStatus(Status_USBNotReady);
|
||||
|
|
@ -381,30 +358,3 @@ TASK(USB_Mouse_Report)
|
|||
SendNextReport();
|
||||
}
|
||||
}
|
||||
|
||||
#if defined(INTERRUPT_CONTROL_ENDPOINT)
|
||||
/** ISR for the general Pipe/Endpoint interrupt vector. This ISR fires when an endpoint's status changes (such as
|
||||
* a packet has been received) on an endpoint with its corresponding ISR enabling bits set. This is used to send
|
||||
* HID packets to the host each time the HID interrupt endpoints polling period elapses, as managed by the USB
|
||||
* controller. It is also used to respond to standard and class specific requests send to the device on the control
|
||||
* endpoint, by handing them off to the LUFA library when they are received.
|
||||
*/
|
||||
ISR(ENDPOINT_PIPE_vect, ISR_BLOCK)
|
||||
{
|
||||
/* Save previously selected endpoint before selecting a new endpoint */
|
||||
uint8_t PrevSelectedEndpoint = Endpoint_GetCurrentEndpoint();
|
||||
|
||||
/* Check if the control endpoint has received a request */
|
||||
if (Endpoint_HasEndpointInterrupted(ENDPOINT_CONTROLEP))
|
||||
{
|
||||
/* Process the control request */
|
||||
USB_USBTask();
|
||||
|
||||
/* Handshake the endpoint setup interrupt - must be after the call to USB_USBTask() */
|
||||
USB_INT_Clear(ENDPOINT_INT_SETUP);
|
||||
}
|
||||
|
||||
/* Restore previously selected endpoint */
|
||||
Endpoint_SelectEndpoint(PrevSelectedEndpoint);
|
||||
}
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -105,9 +105,6 @@
|
|||
/** Indicates that this module will catch the USB_Disconnect event when thrown by the library. */
|
||||
HANDLES_EVENT(USB_Disconnect);
|
||||
|
||||
/** Indicates that this module will catch the USB_Reset event when thrown by the library. */
|
||||
HANDLES_EVENT(USB_Reset);
|
||||
|
||||
/** Indicates that this module will catch the USB_ConfigurationChanged event when thrown by the library. */
|
||||
HANDLES_EVENT(USB_ConfigurationChanged);
|
||||
|
||||
|
|
|
|||
|
|
@ -53,16 +53,9 @@
|
|||
*
|
||||
* <table>
|
||||
* <tr>
|
||||
* <td><b>Define Name:</b></td>
|
||||
* <td><b>Location:</b></td>
|
||||
* <td><b>Description:</b></td>
|
||||
* </tr>
|
||||
* <tr>
|
||||
* <td>INTERRUPT_CONTROL_ENDPOINT</td>
|
||||
* <td>Makefile CDEFS</td>
|
||||
* <td>When defined, this causes the demo to enable interrupts for the control endpoint,
|
||||
* which services control requests from the host. If not defined, the control endpoint
|
||||
* is serviced via polling using the task scheduler.</td>
|
||||
* <td>
|
||||
* None
|
||||
* </td>
|
||||
* </tr>
|
||||
* </table>
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -331,12 +331,6 @@ TASK(USB_HID_Host)
|
|||
break;
|
||||
}
|
||||
|
||||
#if defined(INTERRUPT_DATA_PIPE)
|
||||
/* Select and unfreeze HID data IN pipe */
|
||||
Pipe_SelectPipe(HID_DATA_IN_PIPE);
|
||||
Pipe_Unfreeze();
|
||||
#endif
|
||||
|
||||
puts_P(PSTR("HID Device Enumerated.\r\n"));
|
||||
|
||||
USB_HostState = HOST_STATE_Ready;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue