From d0ac8e46f958e81f78876740202ca489569f5689 Mon Sep 17 00:00:00 2001 From: Dean Camera Date: Mon, 22 Aug 2011 13:03:56 +0000 Subject: [PATCH] Renamed the JTAG_DEBUG_ASSERT() macro to JTAG_ASSERT(). Changed the reports in the GenericHID device demos to control the board LEDs, to reduce user confusion over the callback routines. Fixed swapped TWI_ADDRESS_READ and TWI_ADDRESS_WRITE values. Fixed TWI_ReadPacket() not releasing the TWI bus on read completion. --- .../ClassDriver/GenericHID/GenericHID.c | 44 +++++++++++-------- Demos/Device/LowLevel/GenericHID/GenericHID.c | 34 +++++++++----- .../BluetoothHost/Lib/BluetoothHCICommands.c | 2 +- LUFA/Common/ArchitectureSpecific.h | 6 +-- LUFA/Drivers/Peripheral/AVR8/TWI_AVR8.c | 2 +- LUFA/Drivers/Peripheral/AVR8/TWI_AVR8.h | 4 +- LUFA/ManPages/ChangeLog.txt | 4 ++ LUFA/ManPages/LUFAPoweredProjects.txt | 1 + 8 files changed, 62 insertions(+), 35 deletions(-) diff --git a/Demos/Device/ClassDriver/GenericHID/GenericHID.c b/Demos/Device/ClassDriver/GenericHID/GenericHID.c index 7eea008c53..f44d7fc2e3 100644 --- a/Demos/Device/ClassDriver/GenericHID/GenericHID.c +++ b/Demos/Device/ClassDriver/GenericHID/GenericHID.c @@ -39,14 +39,6 @@ /** Buffer to hold the previously generated HID report, for comparison purposes inside the HID class driver. */ static uint8_t PrevHIDReportBuffer[GENERIC_REPORT_SIZE]; -/** Structure to contain reports from the host, so that they can be echoed back upon request */ -static struct -{ - uint8_t ReportID; - uint16_t ReportSize; - uint8_t ReportData[GENERIC_REPORT_SIZE]; -} HIDReportEcho; - /** LUFA HID Class driver interface configuration and state information. This structure is * passed to all HID Class driver functions, so that multiple instances of the same class * within a device can be differentiated from one another. @@ -151,13 +143,16 @@ bool CALLBACK_HID_Device_CreateHIDReport(USB_ClassInfo_HID_Device_t* const HIDIn void* ReportData, uint16_t* const ReportSize) { - if (HIDReportEcho.ReportID) - *ReportID = HIDReportEcho.ReportID; - - memcpy(ReportData, HIDReportEcho.ReportData, HIDReportEcho.ReportSize); - - *ReportSize = HIDReportEcho.ReportSize; - return true; + uint8_t* Data = (uint8_t*)ReportData; + uint8_t CurrLEDMask = LEDs_GetLEDs(); + + Data[0] = ((CurrLEDMask & LEDS_LED1) ? 1 : 0); + Data[1] = ((CurrLEDMask & LEDS_LED2) ? 1 : 0); + Data[2] = ((CurrLEDMask & LEDS_LED3) ? 1 : 0); + Data[3] = ((CurrLEDMask & LEDS_LED4) ? 1 : 0); + + *ReportSize = sizeof(GENERIC_REPORT_SIZE); + return false; } /** HID class driver callback function for the processing of HID reports from the host. @@ -174,8 +169,21 @@ void CALLBACK_HID_Device_ProcessHIDReport(USB_ClassInfo_HID_Device_t* const HIDI const void* ReportData, const uint16_t ReportSize) { - HIDReportEcho.ReportID = ReportID; - HIDReportEcho.ReportSize = ReportSize; - memcpy(HIDReportEcho.ReportData, ReportData, ReportSize); + uint8_t* Data = (uint8_t*)ReportData; + uint8_t NewLEDMask = LEDS_NO_LEDS; + + if (Data[0]) + NewLEDMask |= LEDS_LED1; + + if (Data[1]) + NewLEDMask |= LEDS_LED1; + + if (Data[2]) + NewLEDMask |= LEDS_LED1; + + if (Data[3]) + NewLEDMask |= LEDS_LED1; + + LEDs_SetAllLEDs(NewLEDMask); } diff --git a/Demos/Device/LowLevel/GenericHID/GenericHID.c b/Demos/Device/LowLevel/GenericHID/GenericHID.c index 70ca0a5cee..69c417655b 100644 --- a/Demos/Device/LowLevel/GenericHID/GenericHID.c +++ b/Demos/Device/LowLevel/GenericHID/GenericHID.c @@ -36,9 +36,6 @@ #include "GenericHID.h" -/** Static buffer to hold the last received report from the host, so that it can be echoed back in the next sent report */ -static uint8_t LastReceived[GENERIC_REPORT_SIZE]; - /** Main program entry point. This routine configures the hardware required by the application, then * enters a loop to run the application tasks in sequence. @@ -155,13 +152,26 @@ void EVENT_USB_Device_ControlRequest(void) void ProcessGenericHIDReport(uint8_t* DataArray) { /* - This is where you need to process the reports being sent from the host to the device. - DataArray is an array holding the last report from the host. This function is called - each time the host has sent a report to the device. + This is where you need to process reports sent from the host to the device. This + function is called each time the host has sent a new report. DataArray is an array + holding the report sent from the host. */ - for (uint8_t i = 0; i < GENERIC_REPORT_SIZE; i++) - LastReceived[i] = DataArray[i]; + uint8_t NewLEDMask = LEDS_NO_LEDS; + + if (DataArray[0]) + NewLEDMask |= LEDS_LED1; + + if (DataArray[1]) + NewLEDMask |= LEDS_LED1; + + if (DataArray[2]) + NewLEDMask |= LEDS_LED1; + + if (DataArray[3]) + NewLEDMask |= LEDS_LED1; + + LEDs_SetAllLEDs(NewLEDMask); } /** Function to create the next report to send back to the host at the next reporting interval. @@ -176,8 +186,12 @@ void CreateGenericHIDReport(uint8_t* DataArray) an array to hold the report to the host. */ - for (uint8_t i = 0; i < GENERIC_REPORT_SIZE; i++) - DataArray[i] = LastReceived[i]; + uint8_t CurrLEDMask = LEDs_GetLEDs(); + + DataArray[0] = ((CurrLEDMask & LEDS_LED1) ? 1 : 0); + DataArray[1] = ((CurrLEDMask & LEDS_LED2) ? 1 : 0); + DataArray[2] = ((CurrLEDMask & LEDS_LED3) ? 1 : 0); + DataArray[3] = ((CurrLEDMask & LEDS_LED4) ? 1 : 0); } void HID_Task(void) diff --git a/Demos/Host/Incomplete/BluetoothHost/Lib/BluetoothHCICommands.c b/Demos/Host/Incomplete/BluetoothHost/Lib/BluetoothHCICommands.c index 35bfcdd026..ed4a24872f 100644 --- a/Demos/Host/Incomplete/BluetoothHost/Lib/BluetoothHCICommands.c +++ b/Demos/Host/Incomplete/BluetoothHost/Lib/BluetoothHCICommands.c @@ -44,7 +44,7 @@ #define INCLUDE_FROM_BLUETOOTHHCICOMMANDS_C #include "BluetoothHCICommands.h" -/** Temporary Bluetooth Device Address, for HCI responses which much include the destination address */ +/** Temporary Bluetooth Device Address, for HCI responses which must include the destination address */ static uint8_t Bluetooth_TempDeviceAddress[6]; /** Bluetooth HCI processing task. This task should be called repeatedly the main Bluetooth diff --git a/LUFA/Common/ArchitectureSpecific.h b/LUFA/Common/ArchitectureSpecific.h index 4f29be6d6f..3920cb94e3 100644 --- a/LUFA/Common/ArchitectureSpecific.h +++ b/LUFA/Common/ArchitectureSpecific.h @@ -84,14 +84,14 @@ * * \note This macro is not available for all architectures. */ - #define JTAG_DEBUG_POINT() __asm__ __volatile__ ("NOP" ::) + #define JTAG_DEBUG_POINT() __asm__ __volatile__ ("nop" ::) /** Defines an explicit JTAG break point in the resulting binary via the assembly \c BREAK statement. When * a JTAG is used, this causes the program execution to halt when reached until manually resumed. * * \note This macro is not available for all architectures. */ - #define JTAG_DEBUG_BREAK() __asm__ __volatile__ ("BREAK" ::) + #define JTAG_DEBUG_BREAK() __asm__ __volatile__ ("break" ::) /** Macro for testing condition "x" and breaking via \ref JTAG_DEBUG_BREAK() if the condition is false. * @@ -99,7 +99,7 @@ * * \param[in] Condition Condition that will be evaluated. */ - #define JTAG_DEBUG_ASSERT(Condition) MACROS{ if (!(Condition)) { JTAG_DEBUG_BREAK(); } }MACROE + #define JTAG_ASSERT(Condition) MACROS{ if (!(Condition)) { JTAG_DEBUG_BREAK(); } }MACROE /** Macro for testing condition \c "x" and writing debug data to the stdout stream if \c false. The stdout stream * must be pre-initialized before this macro is run and linked to an output device, such as the microcontroller's diff --git a/LUFA/Drivers/Peripheral/AVR8/TWI_AVR8.c b/LUFA/Drivers/Peripheral/AVR8/TWI_AVR8.c index 2f65921ca7..d4f594f3ba 100644 --- a/LUFA/Drivers/Peripheral/AVR8/TWI_AVR8.c +++ b/LUFA/Drivers/Peripheral/AVR8/TWI_AVR8.c @@ -117,7 +117,7 @@ uint8_t TWI_ReadPacket(const uint8_t SlaveAddress, { while (Length--) { - if (!(TWI_ReceiveByte(Buffer++, (Length == 0)))) + if (!(TWI_ReceiveByte(Buffer++, (Length == 1)))) { ErrorCode = TWI_ERROR_SlaveNAK; break; diff --git a/LUFA/Drivers/Peripheral/AVR8/TWI_AVR8.h b/LUFA/Drivers/Peripheral/AVR8/TWI_AVR8.h index c35499eff8..63b9f03c67 100644 --- a/LUFA/Drivers/Peripheral/AVR8/TWI_AVR8.h +++ b/LUFA/Drivers/Peripheral/AVR8/TWI_AVR8.h @@ -143,12 +143,12 @@ /** TWI slave device address mask for a read session. Mask with a slave device base address to obtain * the correct TWI bus address for the slave device when reading data from it. */ - #define TWI_ADDRESS_READ 0x00 + #define TWI_ADDRESS_READ 0x01 /** TWI slave device address mask for a write session. Mask with a slave device base address to obtain * the correct TWI bus address for the slave device when writing data to it. */ - #define TWI_ADDRESS_WRITE 0x01 + #define TWI_ADDRESS_WRITE 0x00 /** Mask to retrieve the base address for a TWI device, which can then be ORed with \ref TWI_ADDRESS_READ * or \ref TWI_ADDRESS_WRITE to obtain the device's read and write address respectively. diff --git a/LUFA/ManPages/ChangeLog.txt b/LUFA/ManPages/ChangeLog.txt index d46123ac01..fcfce3e9a6 100644 --- a/LUFA/ManPages/ChangeLog.txt +++ b/LUFA/ManPages/ChangeLog.txt @@ -56,10 +56,12 @@ * USB_Host_ConfigurationNumber global as required * - Added endian correcting code to the library USB class drivers for multiple architecture support * - Removed the ENDPOINT_DESCRIPTOR_DIR_* macros, replaced by ENDPOINT_DIR_* instead + * - Renamed the JTAG_DEBUG_ASSERT() macro to JTAG_ASSERT() * - Library Applications: * - Modified the Low Level and Class Driver AudioInput and AudioOutput demos to support multiple audio sample rates * - Updated all host mode demos and projects to use the EVENT_USB_Host_DeviceEnumerationComplete() event callback for device configuration * instead of manual host state machine manipulations in the main application task + * - Changed the reports in the GenericHID device demos to control the board LEDs, to reduce user confusion over the callback routines * * Fixed: * - Core: @@ -71,6 +73,8 @@ * - Fixed lack of C++ compatibility in some internal header files causing compile errors when using LUFA in C++ projects * - Fixed error in the pipe unordered allocation algorithm for the AVR8 devices breaking compatibility with some devices * - Fixed USB_USBTask not being called internally in stream transfers between packets when Partial Stream Transfers are used + * - Fixed swapped TWI_ADDRESS_READ and TWI_ADDRESS_WRITE values + * - Fixed TWI_ReadPacket() not releasing the TWI bus on read completion * - Library Applications: * - Fixed incorrect signature in the CDC and DFU class bootloaders for the ATMEGA8U2 * - Fixed KeyboardHost and KeyboardHostWithParser demos displaying incorrect values when numerical keys were pressed diff --git a/LUFA/ManPages/LUFAPoweredProjects.txt b/LUFA/ManPages/LUFAPoweredProjects.txt index 1931dce35c..b715872ccf 100644 --- a/LUFA/ManPages/LUFAPoweredProjects.txt +++ b/LUFA/ManPages/LUFAPoweredProjects.txt @@ -55,6 +55,7 @@ * - Generic HID Device Creator: http://generichid.sourceforge.net/ * - Ghetto Drum, a MIDI drum controller: http://noisybox.net/art/gdrum/ * - Hiduino, a USB-MIDI replacement firmware for the Arduino Uno: http://code.google.com/p/hiduino/ + * - Ikea RGB LED USB modification: http://slashhome.se/p/projects/id/ikea_dioder_usb/#project * - IR Remote to Keyboard decoder: http://netzhansa.blogspot.com/2010/04/our-living-room-hi-fi-setup-needs-mp3.html * - LED Panel controller: http://projects.peterpolidoro.net/caltech/panelscontroller/panelscontroller.htm * - LUFA powered DDR dance mat (French): http://logicien-parfait.fr/dokuwiki/doku.php?id=projet:ddr_repair