X-Git-Url: http://git.linex4red.de/pub/USBasp.git/blobdiff_plain/071e02c6b6b4837fa9cf0b6d4c749994e02638d7..e61345f872fc7f1a8b95e53ee68b4dbdea0650db:/Demos/Device/LowLevel/Keyboard/Keyboard.c diff --git a/Demos/Device/LowLevel/Keyboard/Keyboard.c b/Demos/Device/LowLevel/Keyboard/Keyboard.c index c58162649..b4d4c2137 100644 --- a/Demos/Device/LowLevel/Keyboard/Keyboard.c +++ b/Demos/Device/LowLevel/Keyboard/Keyboard.c @@ -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(); } @@ -257,7 +240,7 @@ void EVENT_USB_Device_StartOfFrame(void) * * \param[out] ReportData Pointer to a HID report data structure to be filled */ -void CreateKeyboardReport(USB_KeyboardReport_Data_t* ReportData) +void CreateKeyboardReport(USB_KeyboardReport_Data_t* const ReportData) { uint8_t JoyStatus_LCL = Joystick_GetStatus(); uint8_t ButtonStatus_LCL = Buttons_GetStatus(); @@ -291,7 +274,7 @@ void CreateKeyboardReport(USB_KeyboardReport_Data_t* ReportData) * * \param[in] LEDReport LED status report from the host */ -void ProcessLEDReport(uint8_t LEDReport) +void ProcessLEDReport(const uint8_t LEDReport) { uint8_t LEDMask = LEDS_LED2; @@ -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())