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.
pull/1469/head
Dean Camera 14 years ago
parent 40946a5704
commit d0ac8e46f9

@ -39,14 +39,6 @@
/** Buffer to hold the previously generated HID report, for comparison purposes inside the HID class driver. */ /** Buffer to hold the previously generated HID report, for comparison purposes inside the HID class driver. */
static uint8_t PrevHIDReportBuffer[GENERIC_REPORT_SIZE]; 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 /** 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 * passed to all HID Class driver functions, so that multiple instances of the same class
* within a device can be differentiated from one another. * 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, void* ReportData,
uint16_t* const ReportSize) uint16_t* const ReportSize)
{ {
if (HIDReportEcho.ReportID) uint8_t* Data = (uint8_t*)ReportData;
*ReportID = HIDReportEcho.ReportID; uint8_t CurrLEDMask = LEDs_GetLEDs();
memcpy(ReportData, HIDReportEcho.ReportData, HIDReportEcho.ReportSize); 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 = HIDReportEcho.ReportSize; *ReportSize = sizeof(GENERIC_REPORT_SIZE);
return true; return false;
} }
/** HID class driver callback function for the processing of HID reports from the host. /** 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 void* ReportData,
const uint16_t ReportSize) const uint16_t ReportSize)
{ {
HIDReportEcho.ReportID = ReportID; uint8_t* Data = (uint8_t*)ReportData;
HIDReportEcho.ReportSize = ReportSize; uint8_t NewLEDMask = LEDS_NO_LEDS;
memcpy(HIDReportEcho.ReportData, ReportData, ReportSize);
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);
} }

@ -36,9 +36,6 @@
#include "GenericHID.h" #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 /** Main program entry point. This routine configures the hardware required by the application, then
* enters a loop to run the application tasks in sequence. * 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) void ProcessGenericHIDReport(uint8_t* DataArray)
{ {
/* /*
This is where you need to process the reports being sent from the host to the device. This is where you need to process reports sent from the host to the device. This
DataArray is an array holding the last report from the host. This function is called function is called each time the host has sent a new report. DataArray is an array
each time the host has sent a report to the device. holding the report sent from the host.
*/ */
for (uint8_t i = 0; i < GENERIC_REPORT_SIZE; i++) uint8_t NewLEDMask = LEDS_NO_LEDS;
LastReceived[i] = DataArray[i];
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. /** 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. an array to hold the report to the host.
*/ */
for (uint8_t i = 0; i < GENERIC_REPORT_SIZE; i++) uint8_t CurrLEDMask = LEDs_GetLEDs();
DataArray[i] = LastReceived[i];
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) void HID_Task(void)

@ -44,7 +44,7 @@
#define INCLUDE_FROM_BLUETOOTHHCICOMMANDS_C #define INCLUDE_FROM_BLUETOOTHHCICOMMANDS_C
#include "BluetoothHCICommands.h" #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]; static uint8_t Bluetooth_TempDeviceAddress[6];
/** Bluetooth HCI processing task. This task should be called repeatedly the main Bluetooth /** Bluetooth HCI processing task. This task should be called repeatedly the main Bluetooth

@ -84,14 +84,14 @@
* *
* \note This macro is not available for all architectures. * \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 /** 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. * 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. * \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. /** 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. * \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 /** 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 * must be pre-initialized before this macro is run and linked to an output device, such as the microcontroller's

@ -117,7 +117,7 @@ uint8_t TWI_ReadPacket(const uint8_t SlaveAddress,
{ {
while (Length--) while (Length--)
{ {
if (!(TWI_ReceiveByte(Buffer++, (Length == 0)))) if (!(TWI_ReceiveByte(Buffer++, (Length == 1))))
{ {
ErrorCode = TWI_ERROR_SlaveNAK; ErrorCode = TWI_ERROR_SlaveNAK;
break; break;

@ -143,12 +143,12 @@
/** TWI slave device address mask for a read session. Mask with a slave device base address to obtain /** 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. * 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 /** 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. * 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 /** 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. * or \ref TWI_ADDRESS_WRITE to obtain the device's read and write address respectively.

@ -56,10 +56,12 @@
* USB_Host_ConfigurationNumber global as required * USB_Host_ConfigurationNumber global as required
* - Added endian correcting code to the library USB class drivers for multiple architecture support * - 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 * - Removed the ENDPOINT_DESCRIPTOR_DIR_* macros, replaced by ENDPOINT_DIR_* instead
* - Renamed the JTAG_DEBUG_ASSERT() macro to JTAG_ASSERT()
* - Library Applications: * - Library Applications:
* - Modified the Low Level and Class Driver AudioInput and AudioOutput demos to support multiple audio sample rates * - 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 * - 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 * 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
* *
* <b>Fixed:</b> * <b>Fixed:</b>
* - Core: * - 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 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 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 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: * - Library Applications:
* - Fixed incorrect signature in the CDC and DFU class bootloaders for the ATMEGA8U2 * - 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 * - Fixed KeyboardHost and KeyboardHostWithParser demos displaying incorrect values when numerical keys were pressed

@ -55,6 +55,7 @@
* - Generic HID Device Creator: http://generichid.sourceforge.net/ * - Generic HID Device Creator: http://generichid.sourceforge.net/
* - Ghetto Drum, a MIDI drum controller: http://noisybox.net/art/gdrum/ * - 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/ * - 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 * - 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 * - 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 * - LUFA powered DDR dance mat (French): http://logicien-parfait.fr/dokuwiki/doku.php?id=projet:ddr_repair

Loading…
Cancel
Save