mirror of
https://github.com/qmk/qmk_firmware.git
synced 2025-06-27 11:32:08 +00:00
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.
This commit is contained in:
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…
Reference in New Issue
Block a user