Fixed incorrect signature reported in the CDC class bootloader for the ATMEGA32U2.
[pub/USBasp.git] / Demos / Device / LowLevel / Keyboard / Keyboard.c
index 71b5861..b4d4c21 100644 (file)
@@ -114,26 +114,19 @@ void EVENT_USB_Device_Disconnect(void)
  */
 void EVENT_USB_Device_ConfigurationChanged(void)
 {      
-       /* Indicate USB connected and ready */
-       LEDs_SetAllLEDs(LEDMASK_USB_READY);
+       bool ConfigSuccess = true;
 
-       /* Setup Keyboard Keycode Report Endpoint */
-       if (!(Endpoint_ConfigureEndpoint(KEYBOARD_EPNUM, EP_TYPE_INTERRUPT,
-                                            ENDPOINT_DIR_IN, KEYBOARD_EPSIZE,
-                                        ENDPOINT_BANK_SINGLE)))
-       {
-               LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
-       }
-       
-       /* Setup Keyboard LED Report Endpoint */
-       if (!(Endpoint_ConfigureEndpoint(KEYBOARD_LEDS_EPNUM, EP_TYPE_INTERRUPT,
-                                            ENDPOINT_DIR_OUT, KEYBOARD_EPSIZE,
-                                        ENDPOINT_BANK_SINGLE)))
-       {
-               LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
-       }
-       
+       /* Setup HID Report Endpoints */
+       ConfigSuccess &= Endpoint_ConfigureEndpoint(KEYBOARD_IN_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_IN,
+                                                   KEYBOARD_EPSIZE, ENDPOINT_BANK_SINGLE);
+       ConfigSuccess &= Endpoint_ConfigureEndpoint(KEYBOARD_OUT_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_OUT,
+                                                   KEYBOARD_EPSIZE, ENDPOINT_BANK_SINGLE);
+
+       /* Turn on Start-of-Frame events for tracking HID report period exiry */
        USB_Device_EnableSOFEvents();
+
+       /* Indicate endpoint configuration success or failure */
+       LEDs_SetAllLEDs(ConfigSuccess ? LEDMASK_USB_READY : LEDMASK_USB_ERROR); 
 }
 
 /** Event handler for the USB_UnhandledControlRequest event. This is used to catch standard and class specific
@@ -150,15 +143,13 @@ void EVENT_USB_Device_UnhandledControlRequest(void)
                        {
                                USB_KeyboardReport_Data_t KeyboardReportData;
 
-                               Endpoint_ClearSETUP();
-       
                                /* Create the next keyboard report for transmission to the host */
                                CreateKeyboardReport(&KeyboardReportData);
 
+                               Endpoint_ClearSETUP();
+
                                /* Write the report data to the control endpoint */
                                Endpoint_Write_Control_Stream_LE(&KeyboardReportData, sizeof(KeyboardReportData));
-                               
-                               /* Finalize the stream transfer to send the last packet or clear the host abort */
                                Endpoint_ClearOUT();
                        }
                
@@ -178,13 +169,11 @@ void EVENT_USB_Device_UnhandledControlRequest(void)
                                /* Read in the LED report from the host */
                                uint8_t LEDStatus = Endpoint_Read_Byte();
 
-                               /* Process the incoming LED report */
-                               ProcessLEDReport(LEDStatus);
-                       
-                               /* Clear the endpoint data */
                                Endpoint_ClearOUT();
-
                                Endpoint_ClearStatusStage();
+
+                               /* Process the incoming LED report */
+                               ProcessLEDReport(LEDStatus);
                        }
                        
                        break;
@@ -195,10 +184,8 @@ void EVENT_USB_Device_UnhandledControlRequest(void)
                                
                                /* Write the current protocol flag to the host */
                                Endpoint_Write_Byte(UsingReportProtocol);
-                               
-                               /* Send the flag to the host */
-                               Endpoint_ClearIN();
 
+                               Endpoint_ClearIN();
                                Endpoint_ClearStatusStage();
                        }
                        
@@ -207,23 +194,21 @@ void EVENT_USB_Device_UnhandledControlRequest(void)
                        if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE))
                        {
                                Endpoint_ClearSETUP();
+                               Endpoint_ClearStatusStage();
 
                                /* Set or clear the flag depending on what the host indicates that the current Protocol should be */
                                UsingReportProtocol = (USB_ControlRequest.wValue != 0);
-
-                               Endpoint_ClearStatusStage();
                        }
                        
                        break;
                case REQ_SetIdle:
                        if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE))
                        {
-                               Endpoint_ClearSETUP();
-                               
+                               Endpoint_ClearSETUP();                          
+                               Endpoint_ClearStatusStage();
+
                                /* Get idle period in MSB, IdleCount must be multiplied by 4 to get number of milliseconds */
                                IdleCount = ((USB_ControlRequest.wValue & 0xFF00) >> 6);
-                               
-                               Endpoint_ClearStatusStage();
                        }
                        
                        break;
@@ -233,11 +218,9 @@ void EVENT_USB_Device_UnhandledControlRequest(void)
                                Endpoint_ClearSETUP();
                                
                                /* Write the current idle duration to the host, must be divided by 4 before sent to host */
-                               Endpoint_Write_Byte(IdleCount >> 2);
-                               
-                               /* Send the flag to the host */
-                               Endpoint_ClearIN();
+                               Endpoint_Write_Byte(IdleCount >> 2);                            
 
+                               Endpoint_ClearIN();
                                Endpoint_ClearStatusStage();
                        }
 
@@ -332,7 +315,7 @@ void SendNextReport(void)
        }
        
        /* Select the Keyboard Report Endpoint */
-       Endpoint_SelectEndpoint(KEYBOARD_EPNUM);
+       Endpoint_SelectEndpoint(KEYBOARD_IN_EPNUM);
 
        /* Check if Keyboard Endpoint Ready for Read/Write and if we should send a new report */
        if (Endpoint_IsReadWriteAllowed() && SendReport)
@@ -352,7 +335,7 @@ void SendNextReport(void)
 void ReceiveNextReport(void)
 {
        /* Select the Keyboard LED Report Endpoint */
-       Endpoint_SelectEndpoint(KEYBOARD_LEDS_EPNUM);
+       Endpoint_SelectEndpoint(KEYBOARD_OUT_EPNUM);
 
        /* Check if Keyboard LED Endpoint contains a packet */
        if (Endpoint_IsOUTReceived())