forked from mfulz_github/qmk_firmware
Add branch for the conversion of demos to use standard C header files for configuration, rather than makefile defined macros.
This commit is contained in:
parent
e8570c4a37
commit
359fbfe14d
|
@ -56,6 +56,28 @@ static uint32_t CurrAddress;
|
||||||
*/
|
*/
|
||||||
static bool RunBootloader = true;
|
static bool RunBootloader = true;
|
||||||
|
|
||||||
|
/** Magic lock for forced application start. If the HWBE fuse is programmed and BOOTRST is unprogrammed, the bootloader
|
||||||
|
* will start if the /HWB line of the AVR is held low and the system is reset. However, if the /HWB line is still held
|
||||||
|
* low when the application attempts to start via a watchdog reset, the bootloader will re-start. If set to the value
|
||||||
|
* \ref MAGIC_BOOT_KEY the special init function \ref Application_Jump_Check() will force the application to start.
|
||||||
|
*/
|
||||||
|
uint32_t MagicBootKey ATTR_NO_INIT;
|
||||||
|
|
||||||
|
|
||||||
|
/** Special startup routine to check if the bootloader was started via a watchdog reset, and if the magic application
|
||||||
|
* start key has been loaded into \ref MagicBootKey. If the bootloader started via the watchdog and the key is valid,
|
||||||
|
* this will force the user application to start via a software jump.
|
||||||
|
*/
|
||||||
|
void Application_Jump_Check(void)
|
||||||
|
{
|
||||||
|
/* If the reset source was the bootloader and the key is correct, clear it and jump to the application */
|
||||||
|
if ((MCUSR & (1 << WDRF)) && (MagicBootKey == MAGIC_BOOT_KEY))
|
||||||
|
{
|
||||||
|
MagicBootKey = 0;
|
||||||
|
// cppcheck-suppress constStatement
|
||||||
|
((void (*)(void))0x0000)();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/** Main program entry point. This routine configures the hardware required by the bootloader, then continuously
|
/** Main program entry point. This routine configures the hardware required by the bootloader, then continuously
|
||||||
* runs the bootloader processing routine until instructed to soft-exit, or hard-reset via the watchdog to start
|
* runs the bootloader processing routine until instructed to soft-exit, or hard-reset via the watchdog to start
|
||||||
|
@ -80,6 +102,9 @@ int main(void)
|
||||||
|
|
||||||
/* Disconnect from the host - USB interface will be reset later along with the AVR */
|
/* Disconnect from the host - USB interface will be reset later along with the AVR */
|
||||||
USB_Detach();
|
USB_Detach();
|
||||||
|
|
||||||
|
/* Unlock the forced application start mode of the bootloader if it is restarted */
|
||||||
|
MagicBootKey = MAGIC_BOOT_KEY;
|
||||||
|
|
||||||
/* Enable the watchdog and force a timeout to reset the AVR */
|
/* Enable the watchdog and force a timeout to reset the AVR */
|
||||||
wdt_enable(WDTO_250MS);
|
wdt_enable(WDTO_250MS);
|
||||||
|
@ -122,17 +147,12 @@ ISR(TIMER1_OVF_vect, ISR_BLOCK)
|
||||||
void EVENT_USB_Device_ConfigurationChanged(void)
|
void EVENT_USB_Device_ConfigurationChanged(void)
|
||||||
{
|
{
|
||||||
/* Setup CDC Notification, Rx and Tx Endpoints */
|
/* Setup CDC Notification, Rx and Tx Endpoints */
|
||||||
Endpoint_ConfigureEndpoint(CDC_NOTIFICATION_EPNUM, EP_TYPE_INTERRUPT,
|
Endpoint_ConfigureEndpoint(CDC_NOTIFICATION_EPADDR, EP_TYPE_INTERRUPT,
|
||||||
ENDPOINT_DIR_IN, CDC_NOTIFICATION_EPSIZE,
|
CDC_NOTIFICATION_EPSIZE, 1);
|
||||||
ENDPOINT_BANK_SINGLE);
|
|
||||||
|
|
||||||
Endpoint_ConfigureEndpoint(CDC_TX_EPNUM, EP_TYPE_BULK,
|
Endpoint_ConfigureEndpoint(CDC_TX_EPADDR, EP_TYPE_BULK, CDC_TXRX_EPSIZE, 1);
|
||||||
ENDPOINT_DIR_IN, CDC_TXRX_EPSIZE,
|
|
||||||
ENDPOINT_BANK_SINGLE);
|
|
||||||
|
|
||||||
Endpoint_ConfigureEndpoint(CDC_RX_EPNUM, EP_TYPE_BULK,
|
Endpoint_ConfigureEndpoint(CDC_RX_EPADDR, EP_TYPE_BULK, CDC_TXRX_EPSIZE, 1);
|
||||||
ENDPOINT_DIR_OUT, CDC_TXRX_EPSIZE,
|
|
||||||
ENDPOINT_BANK_SINGLE);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Event handler for the USB_ControlRequest event. This is used to catch and process control requests sent to
|
/** Event handler for the USB_ControlRequest event. This is used to catch and process control requests sent to
|
||||||
|
@ -303,7 +323,7 @@ static void ReadWriteMemoryBlock(const uint8_t Command)
|
||||||
static uint8_t FetchNextCommandByte(void)
|
static uint8_t FetchNextCommandByte(void)
|
||||||
{
|
{
|
||||||
/* Select the OUT endpoint so that the next data byte can be read */
|
/* Select the OUT endpoint so that the next data byte can be read */
|
||||||
Endpoint_SelectEndpoint(CDC_RX_EPNUM);
|
Endpoint_SelectEndpoint(CDC_RX_EPADDR);
|
||||||
|
|
||||||
/* If OUT endpoint empty, clear it and wait for the next packet from the host */
|
/* If OUT endpoint empty, clear it and wait for the next packet from the host */
|
||||||
while (!(Endpoint_IsReadWriteAllowed()))
|
while (!(Endpoint_IsReadWriteAllowed()))
|
||||||
|
@ -329,7 +349,7 @@ static uint8_t FetchNextCommandByte(void)
|
||||||
static void WriteNextResponseByte(const uint8_t Response)
|
static void WriteNextResponseByte(const uint8_t Response)
|
||||||
{
|
{
|
||||||
/* Select the IN endpoint so that the next data byte can be written */
|
/* Select the IN endpoint so that the next data byte can be written */
|
||||||
Endpoint_SelectEndpoint(CDC_TX_EPNUM);
|
Endpoint_SelectEndpoint(CDC_TX_EPADDR);
|
||||||
|
|
||||||
/* If IN endpoint full, clear it and wait until ready for the next packet to the host */
|
/* If IN endpoint full, clear it and wait until ready for the next packet to the host */
|
||||||
if (!(Endpoint_IsReadWriteAllowed()))
|
if (!(Endpoint_IsReadWriteAllowed()))
|
||||||
|
@ -353,7 +373,7 @@ static void WriteNextResponseByte(const uint8_t Response)
|
||||||
static void CDC_Task(void)
|
static void CDC_Task(void)
|
||||||
{
|
{
|
||||||
/* Select the OUT endpoint */
|
/* Select the OUT endpoint */
|
||||||
Endpoint_SelectEndpoint(CDC_RX_EPNUM);
|
Endpoint_SelectEndpoint(CDC_RX_EPADDR);
|
||||||
|
|
||||||
/* Check if endpoint has a command in it sent from the host */
|
/* Check if endpoint has a command in it sent from the host */
|
||||||
if (!(Endpoint_IsOUTReceived()))
|
if (!(Endpoint_IsOUTReceived()))
|
||||||
|
@ -549,7 +569,7 @@ static void CDC_Task(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Select the IN endpoint */
|
/* Select the IN endpoint */
|
||||||
Endpoint_SelectEndpoint(CDC_TX_EPNUM);
|
Endpoint_SelectEndpoint(CDC_TX_EPADDR);
|
||||||
|
|
||||||
/* Remember if the endpoint is completely full before clearing it */
|
/* Remember if the endpoint is completely full before clearing it */
|
||||||
bool IsEndpointFull = !(Endpoint_IsReadWriteAllowed());
|
bool IsEndpointFull = !(Endpoint_IsReadWriteAllowed());
|
||||||
|
@ -577,7 +597,7 @@ static void CDC_Task(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Select the OUT endpoint */
|
/* Select the OUT endpoint */
|
||||||
Endpoint_SelectEndpoint(CDC_RX_EPNUM);
|
Endpoint_SelectEndpoint(CDC_RX_EPADDR);
|
||||||
|
|
||||||
/* Acknowledge the command from the host */
|
/* Acknowledge the command from the host */
|
||||||
Endpoint_ClearOUT();
|
Endpoint_ClearOUT();
|
||||||
|
|
|
@ -67,6 +67,9 @@
|
||||||
/** Eight character bootloader firmware identifier reported to the host when requested */
|
/** Eight character bootloader firmware identifier reported to the host when requested */
|
||||||
#define SOFTWARE_IDENTIFIER "LUFACDC"
|
#define SOFTWARE_IDENTIFIER "LUFACDC"
|
||||||
|
|
||||||
|
/** Magic bootloader key to unlock forced application start mode. */
|
||||||
|
#define MAGIC_BOOT_KEY 0xDC42CACA
|
||||||
|
|
||||||
/* Type Defines: */
|
/* Type Defines: */
|
||||||
/** Type define for a non-returning pointer to the start of the loaded application in flash memory. */
|
/** Type define for a non-returning pointer to the start of the loaded application in flash memory. */
|
||||||
typedef void (*AppPtr_t)(void) ATTR_NO_RETURN;
|
typedef void (*AppPtr_t)(void) ATTR_NO_RETURN;
|
||||||
|
@ -75,6 +78,8 @@
|
||||||
static void CDC_Task(void);
|
static void CDC_Task(void);
|
||||||
static void SetupHardware(void);
|
static void SetupHardware(void);
|
||||||
|
|
||||||
|
void Application_Jump_Check(void) ATTR_INIT_SECTION(3);
|
||||||
|
|
||||||
void EVENT_USB_Device_ConfigurationChanged(void);
|
void EVENT_USB_Device_ConfigurationChanged(void);
|
||||||
|
|
||||||
#if defined(INCLUDE_FROM_BOOTLOADERCDC_C) || defined(__DOXYGEN__)
|
#if defined(INCLUDE_FROM_BOOTLOADERCDC_C) || defined(__DOXYGEN__)
|
||||||
|
|
|
@ -47,9 +47,9 @@
|
||||||
* This bootloader enumerates to the host as a CDC Class device (virtual serial port), allowing for AVR109
|
* This bootloader enumerates to the host as a CDC Class device (virtual serial port), allowing for AVR109
|
||||||
* protocol compatible programming software to load firmware onto the AVR.
|
* protocol compatible programming software to load firmware onto the AVR.
|
||||||
*
|
*
|
||||||
* Out of the box this bootloader builds for the USB1287, and will fit into 4KB of bootloader space. If
|
* Out of the box this bootloader builds for the AT90USB1287 with an 8KB bootloader section size, and will fit
|
||||||
* you wish to enlarge this space and/or change the AVR model, you will need to edit the BOOT_START and MCU
|
* into 4KB of bootloader space. If you wish to alter this size and/or change the AVR model, you will need to
|
||||||
* values in the accompanying makefile.
|
* edit the MCU, FLASH_SIZE_KB and BOOT_SECTION_SIZE_KB values in the accompanying makefile.
|
||||||
*
|
*
|
||||||
* When the bootloader is running, the board's LED(s) will flash at regular intervals to distinguish the
|
* When the bootloader is running, the board's LED(s) will flash at regular intervals to distinguish the
|
||||||
* bootloader from the normal user application.
|
* bootloader from the normal user application.
|
||||||
|
|
|
@ -0,0 +1,50 @@
|
||||||
|
/*
|
||||||
|
LUFA Library
|
||||||
|
Copyright (C) Dean Camera, 2012.
|
||||||
|
|
||||||
|
dean [at] fourwalledcubicle [dot] com
|
||||||
|
www.lufa-lib.org
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
Copyright 2012 Dean Camera (dean [at] fourwalledcubicle [dot] com)
|
||||||
|
|
||||||
|
Permission to use, copy, modify, distribute, and sell this
|
||||||
|
software and its documentation for any purpose is hereby granted
|
||||||
|
without fee, provided that the above copyright notice appear in
|
||||||
|
all copies and that both that the copyright notice and this
|
||||||
|
permission notice and warranty disclaimer appear in supporting
|
||||||
|
documentation, and that the name of the author not be used in
|
||||||
|
advertising or publicity pertaining to distribution of the
|
||||||
|
software without specific, written prior permission.
|
||||||
|
|
||||||
|
The author disclaim all warranties with regard to this
|
||||||
|
software, including all implied warranties of merchantability
|
||||||
|
and fitness. In no event shall the author be liable for any
|
||||||
|
special, indirect or consequential damages or any damages
|
||||||
|
whatsoever resulting from loss of use, data or profits, whether
|
||||||
|
in an action of contract, negligence or other tortious action,
|
||||||
|
arising out of or in connection with the use or performance of
|
||||||
|
this software.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** \file
|
||||||
|
* \brief LUFA Library Configuration Header File
|
||||||
|
*
|
||||||
|
* This is a header file which is be used to configure LUFA's
|
||||||
|
* compile time options, as an alternative to the compile time
|
||||||
|
* constants supplied through a makefile.
|
||||||
|
*
|
||||||
|
* For information on what each token does, refer to the LUFA
|
||||||
|
* manual section "Summary of Compile Tokens".
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _APP_CONFIG_H_
|
||||||
|
#define _APP_CONFIG_H_
|
||||||
|
|
||||||
|
#define NO_BLOCK_SUPPORT
|
||||||
|
#define NO_EEPROM_BYTE_SUPPORT
|
||||||
|
#define NO_FLASH_BYTE_SUPPORT
|
||||||
|
#define NO_LOCK_BYTE_WRITE_SUPPORT
|
||||||
|
|
||||||
|
#endif
|
|
@ -0,0 +1,93 @@
|
||||||
|
/*
|
||||||
|
LUFA Library
|
||||||
|
Copyright (C) Dean Camera, 2012.
|
||||||
|
|
||||||
|
dean [at] fourwalledcubicle [dot] com
|
||||||
|
www.lufa-lib.org
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
Copyright 2012 Dean Camera (dean [at] fourwalledcubicle [dot] com)
|
||||||
|
|
||||||
|
Permission to use, copy, modify, distribute, and sell this
|
||||||
|
software and its documentation for any purpose is hereby granted
|
||||||
|
without fee, provided that the above copyright notice appear in
|
||||||
|
all copies and that both that the copyright notice and this
|
||||||
|
permission notice and warranty disclaimer appear in supporting
|
||||||
|
documentation, and that the name of the author not be used in
|
||||||
|
advertising or publicity pertaining to distribution of the
|
||||||
|
software without specific, written prior permission.
|
||||||
|
|
||||||
|
The author disclaim all warranties with regard to this
|
||||||
|
software, including all implied warranties of merchantability
|
||||||
|
and fitness. In no event shall the author be liable for any
|
||||||
|
special, indirect or consequential damages or any damages
|
||||||
|
whatsoever resulting from loss of use, data or profits, whether
|
||||||
|
in an action of contract, negligence or other tortious action,
|
||||||
|
arising out of or in connection with the use or performance of
|
||||||
|
this software.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** \file
|
||||||
|
* \brief LUFA Library Configuration Header File
|
||||||
|
*
|
||||||
|
* This is a header file which is be used to configure LUFA's
|
||||||
|
* compile time options, as an alternative to the compile time
|
||||||
|
* constants supplied through a makefile.
|
||||||
|
*
|
||||||
|
* For information on what each token does, refer to the LUFA
|
||||||
|
* manual section "Summary of Compile Tokens".
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _LUFA_CONFIG_H_
|
||||||
|
#define _LUFA_CONFIG_H_
|
||||||
|
|
||||||
|
#if (ARCH == ARCH_AVR8)
|
||||||
|
|
||||||
|
/* Non-USB Related Configuration Tokens: */
|
||||||
|
// #define DISABLE_TERMINAL_CODES
|
||||||
|
|
||||||
|
/* USB Class Driver Related Tokens: */
|
||||||
|
// #define HID_HOST_BOOT_PROTOCOL_ONLY
|
||||||
|
// #define HID_STATETABLE_STACK_DEPTH {Insert Value Here}
|
||||||
|
// #define HID_USAGE_STACK_DEPTH {Insert Value Here}
|
||||||
|
// #define HID_MAX_COLLECTIONS {Insert Value Here}
|
||||||
|
// #define HID_MAX_REPORTITEMS {Insert Value Here}
|
||||||
|
// #define HID_MAX_REPORT_IDS {Insert Value Here}
|
||||||
|
// #define NO_CLASS_DRIVER_AUTOFLUSH
|
||||||
|
|
||||||
|
/* General USB Driver Related Tokens: */
|
||||||
|
#define ORDERED_EP_CONFIG
|
||||||
|
#define USE_STATIC_OPTIONS (USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)
|
||||||
|
#define USB_DEVICE_ONLY
|
||||||
|
// #define USB_HOST_ONLY
|
||||||
|
// #define USB_STREAM_TIMEOUT_MS {Insert Value Here}
|
||||||
|
// #define NO_LIMITED_CONTROLLER_CONNECT
|
||||||
|
#define NO_SOF_EVENTS
|
||||||
|
|
||||||
|
/* USB Device Mode Driver Related Tokens: */
|
||||||
|
#define USE_RAM_DESCRIPTORS
|
||||||
|
// #define USE_FLASH_DESCRIPTORS
|
||||||
|
// #define USE_EEPROM_DESCRIPTORS
|
||||||
|
#define NO_INTERNAL_SERIAL
|
||||||
|
#define FIXED_CONTROL_ENDPOINT_SIZE 8
|
||||||
|
#define DEVICE_STATE_AS_GPIOR 0
|
||||||
|
#define FIXED_NUM_CONFIGURATIONS 1
|
||||||
|
// #define CONTROL_ONLY_DEVICE
|
||||||
|
// #define INTERRUPT_CONTROL_ENDPOINT
|
||||||
|
#define NO_DEVICE_REMOTE_WAKEUP
|
||||||
|
#define NO_DEVICE_SELF_POWER
|
||||||
|
|
||||||
|
/* USB Host Mode Driver Related Tokens: */
|
||||||
|
// #define HOST_STATE_AS_GPIOR {Insert Value Here}
|
||||||
|
// #define USB_HOST_TIMEOUT_MS {Insert Value Here}
|
||||||
|
// #define HOST_DEVICE_SETTLE_DELAY_MS {Insert Value Here}
|
||||||
|
// #define NO_AUTO_VBUS_MANAGEMENT
|
||||||
|
// #define INVERTED_VBUS_ENABLE_LINE
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
#error Unsupported architecture for this LUFA configuration file.
|
||||||
|
|
||||||
|
#endif
|
||||||
|
#endif
|
|
@ -131,7 +131,7 @@ const USB_Descriptor_Configuration_t ConfigurationDescriptor =
|
||||||
{
|
{
|
||||||
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
|
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
|
||||||
|
|
||||||
.EndpointAddress = (ENDPOINT_DIR_IN | CDC_NOTIFICATION_EPNUM),
|
.EndpointAddress = CDC_NOTIFICATION_EPADDR,
|
||||||
.Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
|
.Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
|
||||||
.EndpointSize = CDC_NOTIFICATION_EPSIZE,
|
.EndpointSize = CDC_NOTIFICATION_EPSIZE,
|
||||||
.PollingIntervalMS = 0xFF
|
.PollingIntervalMS = 0xFF
|
||||||
|
@ -157,20 +157,20 @@ const USB_Descriptor_Configuration_t ConfigurationDescriptor =
|
||||||
{
|
{
|
||||||
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
|
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
|
||||||
|
|
||||||
.EndpointAddress = (ENDPOINT_DIR_OUT | CDC_RX_EPNUM),
|
.EndpointAddress = CDC_RX_EPADDR,
|
||||||
.Attributes = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
|
.Attributes = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
|
||||||
.EndpointSize = CDC_TXRX_EPSIZE,
|
.EndpointSize = CDC_TXRX_EPSIZE,
|
||||||
.PollingIntervalMS = 0x01
|
.PollingIntervalMS = 0x05
|
||||||
},
|
},
|
||||||
|
|
||||||
.CDC_DataInEndpoint =
|
.CDC_DataInEndpoint =
|
||||||
{
|
{
|
||||||
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
|
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
|
||||||
|
|
||||||
.EndpointAddress = (ENDPOINT_DIR_IN | CDC_TX_EPNUM),
|
.EndpointAddress = CDC_TX_EPADDR,
|
||||||
.Attributes = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
|
.Attributes = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
|
||||||
.EndpointSize = CDC_TXRX_EPSIZE,
|
.EndpointSize = CDC_TXRX_EPSIZE,
|
||||||
.PollingIntervalMS = 0x01
|
.PollingIntervalMS = 0x05
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -92,14 +92,14 @@
|
||||||
#error The selected AVR part is not currently supported by this bootloader.
|
#error The selected AVR part is not currently supported by this bootloader.
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/** Endpoint number for the CDC control interface event notification endpoint. */
|
/** Endpoint address for the CDC control interface event notification endpoint. */
|
||||||
#define CDC_NOTIFICATION_EPNUM 2
|
#define CDC_NOTIFICATION_EPADDR (ENDPOINT_DIR_IN | 2)
|
||||||
|
|
||||||
/** Endpoint number for the CDC data interface TX (data IN) endpoint. */
|
/** Endpoint address for the CDC data interface TX (data IN) endpoint. */
|
||||||
#define CDC_TX_EPNUM 3
|
#define CDC_TX_EPADDR (ENDPOINT_DIR_IN | 3)
|
||||||
|
|
||||||
/** Endpoint number for the CDC data interface RX (data OUT) endpoint. */
|
/** Endpoint address for the CDC data interface RX (data OUT) endpoint. */
|
||||||
#define CDC_RX_EPNUM 4
|
#define CDC_RX_EPADDR (ENDPOINT_DIR_OUT | 4)
|
||||||
|
|
||||||
/** Size of the CDC data interface TX and RX data endpoint banks, in bytes. */
|
/** Size of the CDC data interface TX and RX data endpoint banks, in bytes. */
|
||||||
#define CDC_TXRX_EPSIZE 16
|
#define CDC_TXRX_EPSIZE 16
|
||||||
|
|
|
@ -95,7 +95,7 @@ F_USB = $(F_CPU)
|
||||||
# Note that the bootloader size and start address given in AVRStudio is in words and not
|
# Note that the bootloader size and start address given in AVRStudio is in words and not
|
||||||
# bytes, and so will need to be doubled to obtain the byte address needed by AVR-GCC.
|
# bytes, and so will need to be doubled to obtain the byte address needed by AVR-GCC.
|
||||||
FLASH_SIZE_KB = 128
|
FLASH_SIZE_KB = 128
|
||||||
BOOT_SECTION_SIZE_KB = 4
|
BOOT_SECTION_SIZE_KB = 8
|
||||||
|
|
||||||
|
|
||||||
# Formulas used to calculate the starting address of the Bootloader section, and the User Application
|
# Formulas used to calculate the starting address of the Bootloader section, and the User Application
|
||||||
|
@ -124,22 +124,7 @@ LUFA_PATH = ../..
|
||||||
|
|
||||||
|
|
||||||
# LUFA library compile-time options and predefined tokens
|
# LUFA library compile-time options and predefined tokens
|
||||||
LUFA_OPTS = -D USB_DEVICE_ONLY
|
LUFA_OPTS = -D USE_LUFA_CONFIG_HEADER
|
||||||
LUFA_OPTS += -D DEVICE_STATE_AS_GPIOR=0
|
|
||||||
LUFA_OPTS += -D ORDERED_EP_CONFIG
|
|
||||||
LUFA_OPTS += -D FIXED_CONTROL_ENDPOINT_SIZE=8
|
|
||||||
LUFA_OPTS += -D FIXED_NUM_CONFIGURATIONS=1
|
|
||||||
LUFA_OPTS += -D USE_RAM_DESCRIPTORS
|
|
||||||
LUFA_OPTS += -D USE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"
|
|
||||||
LUFA_OPTS += -D NO_INTERNAL_SERIAL
|
|
||||||
LUFA_OPTS += -D NO_DEVICE_SELF_POWER
|
|
||||||
LUFA_OPTS += -D NO_DEVICE_REMOTE_WAKEUP
|
|
||||||
LUFA_OPTS += -D NO_SOF_EVENTS
|
|
||||||
|
|
||||||
#LUFA_OPTS += -D NO_BLOCK_SUPPORT
|
|
||||||
#LUFA_OPTS += -D NO_EEPROM_BYTE_SUPPORT
|
|
||||||
#LUFA_OPTS += -D NO_FLASH_BYTE_SUPPORT
|
|
||||||
#LUFA_OPTS += -D NO_LOCK_BYTE_WRITE_SUPPORT
|
|
||||||
|
|
||||||
|
|
||||||
# Create the LUFA source path variables by including the LUFA root makefile
|
# Create the LUFA source path variables by including the LUFA root makefile
|
||||||
|
@ -184,7 +169,7 @@ DEBUG = dwarf-2
|
||||||
# Each directory must be seperated by a space.
|
# Each directory must be seperated by a space.
|
||||||
# Use forward slashes for directory separators.
|
# Use forward slashes for directory separators.
|
||||||
# For a directory that has spaces, enclose it in quotes.
|
# For a directory that has spaces, enclose it in quotes.
|
||||||
EXTRAINCDIRS = $(LUFA_PATH)/
|
EXTRAINCDIRS = $(LUFA_PATH)/ Config/
|
||||||
|
|
||||||
|
|
||||||
# Compiler flag to set the C Standard level.
|
# Compiler flag to set the C Standard level.
|
||||||
|
|
|
@ -92,6 +92,27 @@ static uint16_t StartAddr = 0x0000;
|
||||||
*/
|
*/
|
||||||
static uint16_t EndAddr = 0x0000;
|
static uint16_t EndAddr = 0x0000;
|
||||||
|
|
||||||
|
/** Magic lock for forced application start. If the HWBE fuse is programmed and BOOTRST is unprogrammed, the bootloader
|
||||||
|
* will start if the /HWB line of the AVR is held low and the system is reset. However, if the /HWB line is still held
|
||||||
|
* low when the application attempts to start via a watchdog reset, the bootloader will re-start. If set to the value
|
||||||
|
* \ref MAGIC_BOOT_KEY the special init function \ref Application_Jump_Check() will force the application to start.
|
||||||
|
*/
|
||||||
|
uint32_t MagicBootKey ATTR_NO_INIT;
|
||||||
|
|
||||||
|
|
||||||
|
/** Special startup routine to check if the bootloader was started via a watchdog reset, and if the magic application
|
||||||
|
* start key has been loaded into \ref MagicBootKey. If the bootloader started via the watchdog and the key is valid,
|
||||||
|
* this will force the user application to start via a software jump.
|
||||||
|
*/
|
||||||
|
void Application_Jump_Check(void)
|
||||||
|
{
|
||||||
|
// If the reset source was the bootloader and the key is correct, clear it and jump to the application
|
||||||
|
if ((MCUSR & (1 << WDRF)) && (MagicBootKey == MAGIC_BOOT_KEY))
|
||||||
|
{
|
||||||
|
MagicBootKey = 0;
|
||||||
|
AppStartPtr();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/** Main program entry point. This routine configures the hardware required by the bootloader, then continuously
|
/** Main program entry point. This routine configures the hardware required by the bootloader, then continuously
|
||||||
* runs the bootloader processing routine until instructed to soft-exit, or hard-reset via the watchdog to start
|
* runs the bootloader processing routine until instructed to soft-exit, or hard-reset via the watchdog to start
|
||||||
|
@ -695,6 +716,9 @@ static void ProcessWriteCommand(void)
|
||||||
{
|
{
|
||||||
if (SentCommand.Data[1] == 0x00) // Start via watchdog
|
if (SentCommand.Data[1] == 0x00) // Start via watchdog
|
||||||
{
|
{
|
||||||
|
/* Unlock the forced application start mode of the bootloader if it is restarted */
|
||||||
|
MagicBootKey = MAGIC_BOOT_KEY;
|
||||||
|
|
||||||
/* Start the watchdog to reset the AVR once the communications are finalized */
|
/* Start the watchdog to reset the AVR once the communications are finalized */
|
||||||
wdt_enable(WDTO_250MS);
|
wdt_enable(WDTO_250MS);
|
||||||
}
|
}
|
||||||
|
|
|
@ -66,6 +66,9 @@
|
||||||
|
|
||||||
/** Minor bootloader version number. */
|
/** Minor bootloader version number. */
|
||||||
#define BOOTLOADER_VERSION_REV 0
|
#define BOOTLOADER_VERSION_REV 0
|
||||||
|
|
||||||
|
/** Magic bootloader key to unlock forced application start mode. */
|
||||||
|
#define MAGIC_BOOT_KEY 0xDC42CACA
|
||||||
|
|
||||||
/** Complete bootloader version number expressed as a packed byte, constructed from the
|
/** Complete bootloader version number expressed as a packed byte, constructed from the
|
||||||
* two individual bootloader version macros.
|
* two individual bootloader version macros.
|
||||||
|
@ -206,6 +209,8 @@
|
||||||
static void ProcessWriteCommand(void);
|
static void ProcessWriteCommand(void);
|
||||||
static void ProcessReadCommand(void);
|
static void ProcessReadCommand(void);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
void Application_Jump_Check(void) ATTR_INIT_SECTION(3);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -47,9 +47,9 @@
|
||||||
* This bootloader enumerates to the host as a DFU Class device, allowing for DFU-compatible programming
|
* This bootloader enumerates to the host as a DFU Class device, allowing for DFU-compatible programming
|
||||||
* software to load firmware onto the AVR.
|
* software to load firmware onto the AVR.
|
||||||
*
|
*
|
||||||
* Out of the box this bootloader builds for the USB1287, and should fit into 4KB of bootloader space. If
|
* Out of the box this bootloader builds for the AT90USB1287 with an 8KB bootloader section size, and will fit
|
||||||
* you wish to enlarge this space and/or change the AVR model, you will need to edit the BOOT_START and MCU
|
* into 4KB of bootloader space. If you wish to alter this size and/or change the AVR model, you will need to
|
||||||
* values in the accompanying makefile.
|
* edit the MCU, FLASH_SIZE_KB and BOOT_SECTION_SIZE_KB values in the accompanying makefile.
|
||||||
*
|
*
|
||||||
* When the bootloader is running, the board's LED(s) will flash at regular intervals to distinguish the
|
* When the bootloader is running, the board's LED(s) will flash at regular intervals to distinguish the
|
||||||
* bootloader from the normal user application.
|
* bootloader from the normal user application.
|
||||||
|
|
|
@ -111,7 +111,7 @@ const USB_Descriptor_Configuration_t ConfigurationDescriptor =
|
||||||
.DetachTimeout = 0x0000,
|
.DetachTimeout = 0x0000,
|
||||||
.TransferSize = 0x0C00,
|
.TransferSize = 0x0C00,
|
||||||
|
|
||||||
.DFUSpecification = VERSION_BCD(01.01)
|
.DFUSpecification = VERSION_BCD(01.10)
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -95,7 +95,7 @@ F_USB = $(F_CPU)
|
||||||
# Note that the bootloader size and start address given in AVRStudio is in words and not
|
# Note that the bootloader size and start address given in AVRStudio is in words and not
|
||||||
# bytes, and so will need to be doubled to obtain the byte address needed by AVR-GCC.
|
# bytes, and so will need to be doubled to obtain the byte address needed by AVR-GCC.
|
||||||
FLASH_SIZE_KB = 128
|
FLASH_SIZE_KB = 128
|
||||||
BOOT_SECTION_SIZE_KB = 4
|
BOOT_SECTION_SIZE_KB = 8
|
||||||
|
|
||||||
|
|
||||||
# Formulas used to calculate the starting address of the Bootloader section, and the User Application
|
# Formulas used to calculate the starting address of the Bootloader section, and the User Application
|
||||||
|
|
|
@ -41,6 +41,29 @@
|
||||||
*/
|
*/
|
||||||
static bool RunBootloader = true;
|
static bool RunBootloader = true;
|
||||||
|
|
||||||
|
/** Magic lock for forced application start. If the HWBE fuse is programmed and BOOTRST is unprogrammed, the bootloader
|
||||||
|
* will start if the /HWB line of the AVR is held low and the system is reset. However, if the /HWB line is still held
|
||||||
|
* low when the application attempts to start via a watchdog reset, the bootloader will re-start. If set to the value
|
||||||
|
* \ref MAGIC_BOOT_KEY the special init function \ref Application_Jump_Check() will force the application to start.
|
||||||
|
*/
|
||||||
|
uint32_t MagicBootKey ATTR_NO_INIT;
|
||||||
|
|
||||||
|
|
||||||
|
/** Special startup routine to check if the bootloader was started via a watchdog reset, and if the magic application
|
||||||
|
* start key has been loaded into \ref MagicBootKey. If the bootloader started via the watchdog and the key is valid,
|
||||||
|
* this will force the user application to start via a software jump.
|
||||||
|
*/
|
||||||
|
void Application_Jump_Check(void)
|
||||||
|
{
|
||||||
|
/* If the reset source was the bootloader and the key is correct, clear it and jump to the application */
|
||||||
|
if ((MCUSR & (1 << WDRF)) && (MagicBootKey == MAGIC_BOOT_KEY))
|
||||||
|
{
|
||||||
|
MagicBootKey = 0;
|
||||||
|
// cppcheck-suppress constStatement
|
||||||
|
((void (*)(void))0x0000)();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/** Main program entry point. This routine configures the hardware required by the bootloader, then continuously
|
/** Main program entry point. This routine configures the hardware required by the bootloader, then continuously
|
||||||
* runs the bootloader processing routine until instructed to soft-exit.
|
* runs the bootloader processing routine until instructed to soft-exit.
|
||||||
*/
|
*/
|
||||||
|
@ -58,6 +81,9 @@ int main(void)
|
||||||
/* Disconnect from the host - USB interface will be reset later along with the AVR */
|
/* Disconnect from the host - USB interface will be reset later along with the AVR */
|
||||||
USB_Detach();
|
USB_Detach();
|
||||||
|
|
||||||
|
/* Unlock the forced application start mode of the bootloader if it is restarted */
|
||||||
|
MagicBootKey = MAGIC_BOOT_KEY;
|
||||||
|
|
||||||
/* Enable the watchdog and force a timeout to reset the AVR */
|
/* Enable the watchdog and force a timeout to reset the AVR */
|
||||||
wdt_enable(WDTO_250MS);
|
wdt_enable(WDTO_250MS);
|
||||||
|
|
||||||
|
@ -85,9 +111,7 @@ static void SetupHardware(void)
|
||||||
void EVENT_USB_Device_ConfigurationChanged(void)
|
void EVENT_USB_Device_ConfigurationChanged(void)
|
||||||
{
|
{
|
||||||
/* Setup HID Report Endpoint */
|
/* Setup HID Report Endpoint */
|
||||||
Endpoint_ConfigureEndpoint(HID_IN_EPNUM, EP_TYPE_INTERRUPT,
|
Endpoint_ConfigureEndpoint(HID_IN_EPADDR, EP_TYPE_INTERRUPT, HID_IN_EPSIZE, 1);
|
||||||
ENDPOINT_DIR_IN, HID_IN_EPSIZE,
|
|
||||||
ENDPOINT_BANK_SINGLE);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Event handler for the USB_ControlRequest event. This is used to catch and process control requests sent to
|
/** Event handler for the USB_ControlRequest event. This is used to catch and process control requests sent to
|
||||||
|
|
|
@ -52,9 +52,14 @@
|
||||||
/** Bootloader special address to start the user application */
|
/** Bootloader special address to start the user application */
|
||||||
#define COMMAND_STARTAPPLICATION 0xFFFF
|
#define COMMAND_STARTAPPLICATION 0xFFFF
|
||||||
|
|
||||||
|
/** Magic bootloader key to unlock forced application start mode. */
|
||||||
|
#define MAGIC_BOOT_KEY 0xDC42CACA
|
||||||
|
|
||||||
/* Function Prototypes: */
|
/* Function Prototypes: */
|
||||||
static void SetupHardware(void);
|
static void SetupHardware(void);
|
||||||
|
|
||||||
|
void Application_Jump_Check(void) ATTR_INIT_SECTION(3);
|
||||||
|
|
||||||
void EVENT_USB_Device_ConfigurationChanged(void);
|
void EVENT_USB_Device_ConfigurationChanged(void);
|
||||||
void EVENT_USB_Device_UnhandledControlRequest(void);
|
void EVENT_USB_Device_UnhandledControlRequest(void);
|
||||||
|
|
||||||
|
|
|
@ -51,10 +51,10 @@
|
||||||
* from PJRC (used with permission). This bootloader is deliberatley non-compatible with the properietary PJRC
|
* from PJRC (used with permission). This bootloader is deliberatley non-compatible with the properietary PJRC
|
||||||
* HalfKay bootloader GUI; only the command line interface software accompanying this bootloader will work with it.
|
* HalfKay bootloader GUI; only the command line interface software accompanying this bootloader will work with it.
|
||||||
*
|
*
|
||||||
* Out of the box this bootloader builds for the USB1287, and will fit into 2KB of bootloader space for the
|
* Out of the box this bootloader builds for the AT90USB1287 with an 8KB bootloader section size, and will fit
|
||||||
* Series 2 USB AVRs (ATMEGAxxU2, AT90USBxx2) or 4KB of bootloader space for all other models. If you wish to
|
* into 2KB of bootloader space for the Series 2 USB AVRs (ATMEGAxxU2, AT90USBxx2) or 4KB of bootloader space for
|
||||||
* enlarge this space and/or change the AVR model, you will need to edit the BOOT_START and MCU values in the
|
* all other models. If you wish to alter this size and/or change the AVR model, you will need to edit the MCU,
|
||||||
* accompanying makefile.
|
* FLASH_SIZE_KB and BOOT_SECTION_SIZE_KB values in the accompanying makefile.
|
||||||
*
|
*
|
||||||
* \section Sec_Installation Driver Installation
|
* \section Sec_Installation Driver Installation
|
||||||
*
|
*
|
||||||
|
|
|
@ -137,10 +137,10 @@ const USB_Descriptor_Configuration_t ConfigurationDescriptor =
|
||||||
{
|
{
|
||||||
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
|
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
|
||||||
|
|
||||||
.EndpointAddress = (ENDPOINT_DIR_IN | HID_IN_EPNUM),
|
.EndpointAddress = HID_IN_EPADDR,
|
||||||
.Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
|
.Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
|
||||||
.EndpointSize = HID_IN_EPSIZE,
|
.EndpointSize = HID_IN_EPSIZE,
|
||||||
.PollingIntervalMS = 0x01
|
.PollingIntervalMS = 0x05
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -55,8 +55,8 @@
|
||||||
} USB_Descriptor_Configuration_t;
|
} USB_Descriptor_Configuration_t;
|
||||||
|
|
||||||
/* Macros: */
|
/* Macros: */
|
||||||
/** Endpoint number of the HID data IN endpoint. */
|
/** Endpoint address of the HID data IN endpoint. */
|
||||||
#define HID_IN_EPNUM 1
|
#define HID_IN_EPADDR (ENDPOINT_DIR_IN | 1)
|
||||||
|
|
||||||
/** Size in bytes of the HID reporting IN endpoint. */
|
/** Size in bytes of the HID reporting IN endpoint. */
|
||||||
#define HID_IN_EPSIZE 64
|
#define HID_IN_EPSIZE 64
|
||||||
|
|
|
@ -970,13 +970,9 @@ void parse_options(int argc, char **argv)
|
||||||
} else if (strncmp(arg, "-mmcu=", 6) == 0) {
|
} else if (strncmp(arg, "-mmcu=", 6) == 0) {
|
||||||
arg += 6;
|
arg += 6;
|
||||||
|
|
||||||
uint8_t valid_prefix = 0;
|
|
||||||
|
|
||||||
if (strncmp(arg, "at90usb", 7) == 0) {
|
if (strncmp(arg, "at90usb", 7) == 0) {
|
||||||
valid_prefix = 1;
|
|
||||||
arg += 7;
|
arg += 7;
|
||||||
} else if (strncmp(arg, "atmega", 6) == 0) {
|
} else if (strncmp(arg, "atmega", 6) == 0) {
|
||||||
valid_prefix = 1;
|
|
||||||
arg += 6;
|
arg += 6;
|
||||||
} else {
|
} else {
|
||||||
die("Unknown MCU type\n");
|
die("Unknown MCU type\n");
|
||||||
|
|
|
@ -95,7 +95,7 @@ F_USB = $(F_CPU)
|
||||||
# Note that the bootloader size and start address given in AVRStudio is in words and not
|
# Note that the bootloader size and start address given in AVRStudio is in words and not
|
||||||
# bytes, and so will need to be doubled to obtain the byte address needed by AVR-GCC.
|
# bytes, and so will need to be doubled to obtain the byte address needed by AVR-GCC.
|
||||||
FLASH_SIZE_KB = 128
|
FLASH_SIZE_KB = 128
|
||||||
BOOT_SECTION_SIZE_KB = 4
|
BOOT_SECTION_SIZE_KB = 8
|
||||||
|
|
||||||
|
|
||||||
# Formulas used to calculate the starting address of the Bootloader section. These formulas
|
# Formulas used to calculate the starting address of the Bootloader section. These formulas
|
||||||
|
|
|
@ -0,0 +1,90 @@
|
||||||
|
/*
|
||||||
|
LUFA Library
|
||||||
|
Copyright (C) Dean Camera, 2012.
|
||||||
|
|
||||||
|
dean [at] fourwalledcubicle [dot] com
|
||||||
|
www.lufa-lib.org
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
Copyright 2012 Dean Camera (dean [at] fourwalledcubicle [dot] com)
|
||||||
|
|
||||||
|
Permission to use, copy, modify, distribute, and sell this
|
||||||
|
software and its documentation for any purpose is hereby granted
|
||||||
|
without fee, provided that the above copyright notice appear in
|
||||||
|
all copies and that both that the copyright notice and this
|
||||||
|
permission notice and warranty disclaimer appear in supporting
|
||||||
|
documentation, and that the name of the author not be used in
|
||||||
|
advertising or publicity pertaining to distribution of the
|
||||||
|
software without specific, written prior permission.
|
||||||
|
|
||||||
|
The author disclaim all warranties with regard to this
|
||||||
|
software, including all implied warranties of merchantability
|
||||||
|
and fitness. In no event shall the author be liable for any
|
||||||
|
special, indirect or consequential damages or any damages
|
||||||
|
whatsoever resulting from loss of use, data or profits, whether
|
||||||
|
in an action of contract, negligence or other tortious action,
|
||||||
|
arising out of or in connection with the use or performance of
|
||||||
|
this software.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** \file
|
||||||
|
* \brief LUFA Custom Board Button Hardware Driver (Template)
|
||||||
|
*
|
||||||
|
* This is a stub driver header file, for implementing custom board
|
||||||
|
* layout hardware with compatible LUFA board specific drivers. If
|
||||||
|
* the library is configured to use the BOARD_USER board mode, this
|
||||||
|
* driver file should be completed and copied into the "/Board/" folder
|
||||||
|
* inside the application's folder.
|
||||||
|
*
|
||||||
|
* This stub is for the board-specific component of the LUFA Buttons driver,
|
||||||
|
* for the control of physical board-mounted GPIO pushbuttons.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __BUTTONS_USER_H__
|
||||||
|
#define __BUTTONS_USER_H__
|
||||||
|
|
||||||
|
/* Includes: */
|
||||||
|
// TODO: Add any required includes here
|
||||||
|
|
||||||
|
/* Enable C linkage for C++ Compilers: */
|
||||||
|
#if defined(__cplusplus)
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Preprocessor Checks: */
|
||||||
|
#if !defined(__INCLUDE_FROM_BUTTONS_H)
|
||||||
|
#error Do not include this file directly. Include LUFA/Drivers/Board/Buttons.h instead.
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Public Interface - May be used in end-application: */
|
||||||
|
/* Macros: */
|
||||||
|
/** Button mask for the first button on the board. */
|
||||||
|
#define BUTTONS_BUTTON1 (1 << 0)
|
||||||
|
|
||||||
|
/* Inline Functions: */
|
||||||
|
#if !defined(__DOXYGEN__)
|
||||||
|
static inline void Buttons_Init(void)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void Buttons_Disable(void)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline uint8_t Buttons_GetStatus(void) ATTR_WARN_UNUSED_RESULT;
|
||||||
|
static inline uint8_t Buttons_GetStatus(void)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Disable C linkage for C++ Compilers: */
|
||||||
|
#if defined(__cplusplus)
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
|
@ -0,0 +1,195 @@
|
||||||
|
/*
|
||||||
|
LUFA Library
|
||||||
|
Copyright (C) Dean Camera, 2012.
|
||||||
|
|
||||||
|
dean [at] fourwalledcubicle [dot] com
|
||||||
|
www.lufa-lib.org
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
Copyright 2012 Dean Camera (dean [at] fourwalledcubicle [dot] com)
|
||||||
|
|
||||||
|
Permission to use, copy, modify, distribute, and sell this
|
||||||
|
software and its documentation for any purpose is hereby granted
|
||||||
|
without fee, provided that the above copyright notice appear in
|
||||||
|
all copies and that both that the copyright notice and this
|
||||||
|
permission notice and warranty disclaimer appear in supporting
|
||||||
|
documentation, and that the name of the author not be used in
|
||||||
|
advertising or publicity pertaining to distribution of the
|
||||||
|
software without specific, written prior permission.
|
||||||
|
|
||||||
|
The author disclaim all warranties with regard to this
|
||||||
|
software, including all implied warranties of merchantability
|
||||||
|
and fitness. In no event shall the author be liable for any
|
||||||
|
special, indirect or consequential damages or any damages
|
||||||
|
whatsoever resulting from loss of use, data or profits, whether
|
||||||
|
in an action of contract, negligence or other tortious action,
|
||||||
|
arising out of or in connection with the use or performance of
|
||||||
|
this software.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** \file
|
||||||
|
* \brief LUFA Custom Board Dataflash Hardware Driver (Template)
|
||||||
|
*
|
||||||
|
* This is a stub driver header file, for implementing custom board
|
||||||
|
* layout hardware with compatible LUFA board specific drivers. If
|
||||||
|
* the library is configured to use the BOARD_USER board mode, this
|
||||||
|
* driver file should be completed and copied into the "/Board/" folder
|
||||||
|
* inside the application's folder.
|
||||||
|
*
|
||||||
|
* This stub is for the board-specific component of the LUFA Dataflash
|
||||||
|
* driver.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __DATAFLASH_USER_H__
|
||||||
|
#define __DATAFLASH_USER_H__
|
||||||
|
|
||||||
|
/* Includes: */
|
||||||
|
// TODO: Add any required includes here
|
||||||
|
|
||||||
|
/* Preprocessor Checks: */
|
||||||
|
#if !defined(__INCLUDE_FROM_DATAFLASH_H)
|
||||||
|
#error Do not include this file directly. Include LUFA/Drivers/Board/Dataflash.h instead.
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Private Interface - For use in library only: */
|
||||||
|
#if !defined(__DOXYGEN__)
|
||||||
|
/* Macros: */
|
||||||
|
#define DATAFLASH_CHIPCS_MASK // TODO: Replace this with a mask of all the /CS pins of all Dataflashes
|
||||||
|
#define DATAFLASH_CHIPCS_DDR // TODO: Replace with the DDR register name for the board's Dataflash ICs
|
||||||
|
#define DATAFLASH_CHIPCS_PORT // TODO: Replace with the PORT register name for the board's Dataflash ICs
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Public Interface - May be used in end-application: */
|
||||||
|
/* Macros: */
|
||||||
|
/** Constant indicating the total number of dataflash ICs mounted on the selected board. */
|
||||||
|
#define DATAFLASH_TOTALCHIPS 1 // TODO: Replace with the number of Dataflashes on the board, max 2
|
||||||
|
|
||||||
|
/** Mask for no dataflash chip selected. */
|
||||||
|
#define DATAFLASH_NO_CHIP DATAFLASH_CHIPCS_MASK
|
||||||
|
|
||||||
|
/** Mask for the first dataflash chip selected. */
|
||||||
|
#define DATAFLASH_CHIP1 // TODO: Replace with mask to hold /CS of first Dataflash low, and all others high
|
||||||
|
|
||||||
|
/** Mask for the second dataflash chip selected. */
|
||||||
|
#define DATAFLASH_CHIP2 // TODO: Replace with mask to hold /CS of second Dataflash low, and all others high
|
||||||
|
|
||||||
|
/** Internal main memory page size for the board's dataflash ICs. */
|
||||||
|
#define DATAFLASH_PAGE_SIZE // TODO: Replace with the page size for the Dataflash ICs
|
||||||
|
|
||||||
|
/** Total number of pages inside each of the board's dataflash ICs. */
|
||||||
|
#define DATAFLASH_PAGES // TODO: Replace with the total number of pages inside one of the Dataflash ICs
|
||||||
|
|
||||||
|
/* Inline Functions: */
|
||||||
|
/** Initializes the dataflash driver so that commands and data may be sent to an attached dataflash IC.
|
||||||
|
* The microcontroller's SPI driver MUST be initialized before any of the dataflash commands are used.
|
||||||
|
*/
|
||||||
|
static inline void Dataflash_Init(void)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Sends a byte to the currently selected dataflash IC, and returns a byte from the dataflash.
|
||||||
|
*
|
||||||
|
* \param[in] Byte Byte of data to send to the dataflash
|
||||||
|
*
|
||||||
|
* \return Last response byte from the dataflash
|
||||||
|
*/
|
||||||
|
static inline uint8_t Dataflash_TransferByte(const uint8_t Byte) ATTR_ALWAYS_INLINE;
|
||||||
|
static inline uint8_t Dataflash_TransferByte(const uint8_t Byte)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Sends a byte to the currently selected dataflash IC, and ignores the next byte from the dataflash.
|
||||||
|
*
|
||||||
|
* \param[in] Byte Byte of data to send to the dataflash
|
||||||
|
*/
|
||||||
|
static inline void Dataflash_SendByte(const uint8_t Byte) ATTR_ALWAYS_INLINE;
|
||||||
|
static inline void Dataflash_SendByte(const uint8_t Byte)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Sends a dummy byte to the currently selected dataflash IC, and returns the next byte from the dataflash.
|
||||||
|
*
|
||||||
|
* \return Last response byte from the dataflash
|
||||||
|
*/
|
||||||
|
static inline uint8_t Dataflash_ReceiveByte(void) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT;
|
||||||
|
static inline uint8_t Dataflash_ReceiveByte(void)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Determines the currently selected dataflash chip.
|
||||||
|
*
|
||||||
|
* \return Mask of the currently selected Dataflash chip, either \ref DATAFLASH_NO_CHIP if no chip is selected
|
||||||
|
* or a DATAFLASH_CHIPn mask (where n is the chip number).
|
||||||
|
*/
|
||||||
|
static inline uint8_t Dataflash_GetSelectedChip(void) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT;
|
||||||
|
static inline uint8_t Dataflash_GetSelectedChip(void)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Selects the given dataflash chip.
|
||||||
|
*
|
||||||
|
* \param[in] ChipMask Mask of the Dataflash IC to select, in the form of DATAFLASH_CHIPn mask (where n is
|
||||||
|
* the chip number).
|
||||||
|
*/
|
||||||
|
static inline void Dataflash_SelectChip(const uint8_t ChipMask) ATTR_ALWAYS_INLINE;
|
||||||
|
static inline void Dataflash_SelectChip(const uint8_t ChipMask)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Deselects the current dataflash chip, so that no dataflash is selected. */
|
||||||
|
static inline void Dataflash_DeselectChip(void) ATTR_ALWAYS_INLINE;
|
||||||
|
static inline void Dataflash_DeselectChip(void)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Selects a dataflash IC from the given page number, which should range from 0 to
|
||||||
|
* ((DATAFLASH_PAGES * DATAFLASH_TOTALCHIPS) - 1). For boards containing only one
|
||||||
|
* dataflash IC, this will select DATAFLASH_CHIP1. If the given page number is outside
|
||||||
|
* the total number of pages contained in the boards dataflash ICs, all dataflash ICs
|
||||||
|
* are deselected.
|
||||||
|
*
|
||||||
|
* \param[in] PageAddress Address of the page to manipulate, ranging from
|
||||||
|
* 0 to ((DATAFLASH_PAGES * DATAFLASH_TOTALCHIPS) - 1).
|
||||||
|
*/
|
||||||
|
static inline void Dataflash_SelectChipFromPage(const uint16_t PageAddress)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Toggles the select line of the currently selected dataflash IC, so that it is ready to receive
|
||||||
|
* a new command.
|
||||||
|
*/
|
||||||
|
static inline void Dataflash_ToggleSelectedChipCS(void)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Spin-loops while the currently selected dataflash is busy executing a command, such as a main
|
||||||
|
* memory page program or main memory to buffer transfer.
|
||||||
|
*/
|
||||||
|
static inline void Dataflash_WaitWhileBusy(void)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Sends a set of page and buffer address bytes to the currently selected dataflash IC, for use with
|
||||||
|
* dataflash commands which require a complete 24-bit address.
|
||||||
|
*
|
||||||
|
* \param[in] PageAddress Page address within the selected dataflash IC
|
||||||
|
* \param[in] BufferByte Address within the dataflash's buffer
|
||||||
|
*/
|
||||||
|
static inline void Dataflash_SendAddressBytes(uint16_t PageAddress, const uint16_t BufferByte)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
|
@ -0,0 +1,102 @@
|
||||||
|
/*
|
||||||
|
LUFA Library
|
||||||
|
Copyright (C) Dean Camera, 2012.
|
||||||
|
|
||||||
|
dean [at] fourwalledcubicle [dot] com
|
||||||
|
www.lufa-lib.org
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
Copyright 2012 Dean Camera (dean [at] fourwalledcubicle [dot] com)
|
||||||
|
|
||||||
|
Permission to use, copy, modify, distribute, and sell this
|
||||||
|
software and its documentation for any purpose is hereby granted
|
||||||
|
without fee, provided that the above copyright notice appear in
|
||||||
|
all copies and that both that the copyright notice and this
|
||||||
|
permission notice and warranty disclaimer appear in supporting
|
||||||
|
documentation, and that the name of the author not be used in
|
||||||
|
advertising or publicity pertaining to distribution of the
|
||||||
|
software without specific, written prior permission.
|
||||||
|
|
||||||
|
The author disclaim all warranties with regard to this
|
||||||
|
software, including all implied warranties of merchantability
|
||||||
|
and fitness. In no event shall the author be liable for any
|
||||||
|
special, indirect or consequential damages or any damages
|
||||||
|
whatsoever resulting from loss of use, data or profits, whether
|
||||||
|
in an action of contract, negligence or other tortious action,
|
||||||
|
arising out of or in connection with the use or performance of
|
||||||
|
this software.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** \file
|
||||||
|
* \brief LUFA Custom Board Joystick Hardware Driver (Template)
|
||||||
|
*
|
||||||
|
* This is a stub driver header file, for implementing custom board
|
||||||
|
* layout hardware with compatible LUFA board specific drivers. If
|
||||||
|
* the library is configured to use the BOARD_USER board mode, this
|
||||||
|
* driver file should be completed and copied into the "/Board/" folder
|
||||||
|
* inside the application's folder.
|
||||||
|
*
|
||||||
|
* This stub is for the board-specific component of the LUFA Joystick
|
||||||
|
* driver, for a digital four-way (plus button) joystick.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __JOYSTICK_USER_H__
|
||||||
|
#define __JOYSTICK_USER_H__
|
||||||
|
|
||||||
|
/* Includes: */
|
||||||
|
// TODO: Add any required includes here
|
||||||
|
|
||||||
|
/* Enable C linkage for C++ Compilers: */
|
||||||
|
#if defined(__cplusplus)
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Preprocessor Checks: */
|
||||||
|
#if !defined(__INCLUDE_FROM_JOYSTICK_H)
|
||||||
|
#error Do not include this file directly. Include LUFA/Drivers/Board/Joystick.h instead.
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Public Interface - May be used in end-application: */
|
||||||
|
/* Macros: */
|
||||||
|
/** Mask for the joystick being pushed in the left direction. */
|
||||||
|
#define JOY_LEFT // TODO: Add mask to indicate joystick left position here
|
||||||
|
|
||||||
|
/** Mask for the joystick being pushed in the right direction. */
|
||||||
|
#define JOY_RIGHT // TODO: Add mask to indicate joystick right position here
|
||||||
|
|
||||||
|
/** Mask for the joystick being pushed in the upward direction. */
|
||||||
|
#define JOY_UP // TODO: Add mask to indicate joystick up position here
|
||||||
|
|
||||||
|
/** Mask for the joystick being pushed in the downward direction. */
|
||||||
|
#define JOY_DOWN // TODO: Add mask to indicate joystick down position here
|
||||||
|
|
||||||
|
/** Mask for the joystick being pushed inward. */
|
||||||
|
#define JOY_PRESS // TODO: Add mask to indicate joystick pressed position here
|
||||||
|
|
||||||
|
/* Inline Functions: */
|
||||||
|
#if !defined(__DOXYGEN__)
|
||||||
|
static inline void Joystick_Init(void)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void Joystick_Disable(void)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline uint8_t Joystick_GetStatus(void) ATTR_WARN_UNUSED_RESULT;
|
||||||
|
static inline uint8_t Joystick_GetStatus(void)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Disable C linkage for C++ Compilers: */
|
||||||
|
#if defined(__cplusplus)
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
|
@ -0,0 +1,130 @@
|
||||||
|
/*
|
||||||
|
LUFA Library
|
||||||
|
Copyright (C) Dean Camera, 2012.
|
||||||
|
|
||||||
|
dean [at] fourwalledcubicle [dot] com
|
||||||
|
www.lufa-lib.org
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
Copyright 2012 Dean Camera (dean [at] fourwalledcubicle [dot] com)
|
||||||
|
|
||||||
|
Permission to use, copy, modify, distribute, and sell this
|
||||||
|
software and its documentation for any purpose is hereby granted
|
||||||
|
without fee, provided that the above copyright notice appear in
|
||||||
|
all copies and that both that the copyright notice and this
|
||||||
|
permission notice and warranty disclaimer appear in supporting
|
||||||
|
documentation, and that the name of the author not be used in
|
||||||
|
advertising or publicity pertaining to distribution of the
|
||||||
|
software without specific, written prior permission.
|
||||||
|
|
||||||
|
The author disclaim all warranties with regard to this
|
||||||
|
software, including all implied warranties of merchantability
|
||||||
|
and fitness. In no event shall the author be liable for any
|
||||||
|
special, indirect or consequential damages or any damages
|
||||||
|
whatsoever resulting from loss of use, data or profits, whether
|
||||||
|
in an action of contract, negligence or other tortious action,
|
||||||
|
arising out of or in connection with the use or performance of
|
||||||
|
this software.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** \file
|
||||||
|
* \brief LUFA Custom Board LED Hardware Driver (Template)
|
||||||
|
*
|
||||||
|
* This is a stub driver header file, for implementing custom board
|
||||||
|
* layout hardware with compatible LUFA board specific drivers. If
|
||||||
|
* the library is configured to use the BOARD_USER board mode, this
|
||||||
|
* driver file should be completed and copied into the "/Board/" folder
|
||||||
|
* inside the application's folder.
|
||||||
|
*
|
||||||
|
* This stub is for the board-specific component of the LUFA LEDs driver,
|
||||||
|
* for the LEDs (up to four) mounted on most development boards.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __LEDS_USER_H__
|
||||||
|
#define __LEDS_USER_H__
|
||||||
|
|
||||||
|
/* Includes: */
|
||||||
|
// TODO: Add any required includes here
|
||||||
|
|
||||||
|
/* Enable C linkage for C++ Compilers: */
|
||||||
|
#if defined(__cplusplus)
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Preprocessor Checks: */
|
||||||
|
#if !defined(__INCLUDE_FROM_LEDS_H)
|
||||||
|
#error Do not include this file directly. Include LUFA/Drivers/Board/LEDS.h instead.
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Public Interface - May be used in end-application: */
|
||||||
|
/* Macros: */
|
||||||
|
/** LED mask for the first LED on the board. */
|
||||||
|
#define LEDS_LED1 (1 << 0)
|
||||||
|
|
||||||
|
/** LED mask for the second LED on the board. */
|
||||||
|
#define LEDS_LED2 (1 << 1)
|
||||||
|
|
||||||
|
/** LED mask for the third LED on the board. */
|
||||||
|
#define LEDS_LED3 (1 << 2)
|
||||||
|
|
||||||
|
/** LED mask for the fourth LED on the board. */
|
||||||
|
#define LEDS_LED4 (1 << 3)
|
||||||
|
|
||||||
|
/** LED mask for all the LEDs on the board. */
|
||||||
|
#define LEDS_ALL_LEDS (LEDS_LED1 | LEDS_LED2 | LEDS_LED3 | LEDS_LED4)
|
||||||
|
|
||||||
|
/** LED mask for none of the board LEDs. */
|
||||||
|
#define LEDS_NO_LEDS 0
|
||||||
|
|
||||||
|
/* Inline Functions: */
|
||||||
|
#if !defined(__DOXYGEN__)
|
||||||
|
static inline void LEDs_Init(void)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void LEDs_Disable(void)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void LEDs_TurnOnLEDs(const uint8_t LEDMask)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void LEDs_TurnOffLEDs(const uint8_t LEDMask)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void LEDs_SetAllLEDs(const uint8_t LEDMask)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void LEDs_ChangeLEDs(const uint8_t LEDMask, const uint8_t ActiveMask)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void LEDs_ToggleLEDs(const uint8_t LEDMask)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline uint8_t LEDs_GetLEDs(void) ATTR_WARN_UNUSED_RESULT;
|
||||||
|
static inline uint8_t LEDs_GetLEDs(void)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Disable C linkage for C++ Compilers: */
|
||||||
|
#if defined(__cplusplus)
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
|
@ -0,0 +1,51 @@
|
||||||
|
# BOARD DEFINE = {ARCH} : {MCU} :
|
||||||
|
BOARD_USER = avr8 : at90usb1287 :
|
||||||
|
BOARD_NONE = avr8 : at90usb1287 :
|
||||||
|
BOARD_USBKEY = avr8 : at90usb1287 :
|
||||||
|
BOARD_STK525 = avr8 : at90usb647 :
|
||||||
|
BOARD_STK526 = avr8 : at90usb162 :
|
||||||
|
BOARD_RZUSBSTICK = avr8 : at90usb1287 :
|
||||||
|
BOARD_ATAVRUSBRF01 = avr8 : at90usb1287 :
|
||||||
|
BOARD_BUMBLEB = avr8 : at90usb162 :
|
||||||
|
BOARD_XPLAIN = avr8 : at90usb1287 :
|
||||||
|
BOARD_XPLAIN_REV1 = avr8 : at90usb1287 :
|
||||||
|
BOARD_EVK527 = avr8 : atmega32u4 :
|
||||||
|
BOARD_TEENSY = avr8 : at90usb162 :
|
||||||
|
BOARD_USBTINYMKII = avr8 : at90usb162 :
|
||||||
|
BOARD_BENITO = avr8 : at90usb162 :
|
||||||
|
BOARD_JMDBU2 = avr8 : atmega32u2 :
|
||||||
|
BOARD_OLIMEX162 = avr8 : at90usb162 :
|
||||||
|
BOARD_UDIP = avr8 : atmega32u2 :
|
||||||
|
BOARD_BUI = avr8 : at90usb646 :
|
||||||
|
BOARD_UNO = avr8 : atmega8u2 :
|
||||||
|
BOARD_CULV3 = avr8 : atmega32u4 :
|
||||||
|
BOARD_BLACKCAT = avr8 : at90usb162 :
|
||||||
|
BOARD_MAXIMUS = avr8 : at90usb162 :
|
||||||
|
BOARD_MINIMUS = avr8 : atmega32u2 :
|
||||||
|
BOARD_ADAFRUITU4 = avr8 : atmega32u4 :
|
||||||
|
BOARD_MICROSIN162 = avr8 : atmega162 :
|
||||||
|
BOARD_USBFOO = avr8 : atmega162 :
|
||||||
|
BOARD_SPARKFUN8U2 = avr8 : atmega8u2 :
|
||||||
|
BOARD_EVK1101 = uc3 : uc3b0256 :
|
||||||
|
BOARD_TUL = avr8 : atmega32u4 :
|
||||||
|
BOARD_EVK1100 = uc3 : uc3a0512 :
|
||||||
|
BOARD_EVK1104 = uc3 : uc3a3256 :
|
||||||
|
BOARD_A3BU_XPLAINED = xmega : atxmega256a3bu :
|
||||||
|
BOARD_TEENSY2 = avr8 : at90usb646 :
|
||||||
|
BOARD_USB2AX = avr8 : atmega32u4 :
|
||||||
|
BOARD_USB2AX_V3 = avr8 : atmega32u4 :
|
||||||
|
BOARD_MICROPENDOUS_32U2 = avr8 : atmega32u2 :
|
||||||
|
BOARD_MICROPENDOUS_A = avr8 : at90usb1287 :
|
||||||
|
BOARD_MICROPENDOUS_1 = avr8 : at90usb162 :
|
||||||
|
BOARD_MICROPENDOUS_2 = avr8 : atmega32u4 :
|
||||||
|
BOARD_MICROPENDOUS_3 = avr8 : at90usb1287 :
|
||||||
|
BOARD_MICROPENDOUS_4 = avr8 : at90usb1287 :
|
||||||
|
BOARD_MICROPENDOUS_DIP = avr8 : at90usb1287 :
|
||||||
|
BOARD_MICROPENDOUS_REV1 = avr8 : at90usb1287 :
|
||||||
|
BOARD_MICROPENDOUS_REV2 = avr8 : at90usb1287 :
|
||||||
|
BOARD_B1_XPLAINED = xmega : atxmega128b1 :
|
||||||
|
BOARD_MULTIO = avr8 : at90usb162 :
|
||||||
|
BOARD_BIGMULTIO = avr8 : atmega32u4 :
|
||||||
|
BOARD_DUCE = avr8 : atmega32u2 :
|
||||||
|
BOARD_OLIMEX32U4 = avr8 : atmega32u4 :
|
||||||
|
BOARD_OLIMEXT32U4 = avr8 : atmega32u4 :
|
|
@ -0,0 +1,77 @@
|
||||||
|
/*
|
||||||
|
LUFA Library
|
||||||
|
Copyright (C) Dean Camera, 2012.
|
||||||
|
|
||||||
|
dean [at] fourwalledcubicle [dot] com
|
||||||
|
www.lufa-lib.org
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
Copyright 2012 Dean Camera (dean [at] fourwalledcubicle [dot] com)
|
||||||
|
|
||||||
|
Permission to use, copy, modify, distribute, and sell this
|
||||||
|
software and its documentation for any purpose is hereby granted
|
||||||
|
without fee, provided that the above copyright notice appear in
|
||||||
|
all copies and that both that the copyright notice and this
|
||||||
|
permission notice and warranty disclaimer appear in supporting
|
||||||
|
documentation, and that the name of the author not be used in
|
||||||
|
advertising or publicity pertaining to distribution of the
|
||||||
|
software without specific, written prior permission.
|
||||||
|
|
||||||
|
The author disclaim all warranties with regard to this
|
||||||
|
software, including all implied warranties of merchantability
|
||||||
|
and fitness. In no event shall the author be liable for any
|
||||||
|
special, indirect or consequential damages or any damages
|
||||||
|
whatsoever resulting from loss of use, data or profits, whether
|
||||||
|
in an action of contract, negligence or other tortious action,
|
||||||
|
arising out of or in connection with the use or performance of
|
||||||
|
this software.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <LUFA/Common/Common.h>
|
||||||
|
#include <LUFA/Drivers/Board/Buttons.h>
|
||||||
|
#include <LUFA/Drivers/Board/Dataflash.h>
|
||||||
|
#include <LUFA/Drivers/Board/LEDs.h>
|
||||||
|
#include <LUFA/Drivers/Board/Joystick.h>
|
||||||
|
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
uint_reg_t Dummy;
|
||||||
|
|
||||||
|
/* Buttons Compile Check */
|
||||||
|
Buttons_Init();
|
||||||
|
Dummy = Buttons_GetStatus();
|
||||||
|
Buttons_Disable();
|
||||||
|
|
||||||
|
/* Dataflash Compile Check */
|
||||||
|
Dataflash_Init();
|
||||||
|
Dataflash_TransferByte(0);
|
||||||
|
Dataflash_SendByte(0);
|
||||||
|
Dummy = Dataflash_ReceiveByte();
|
||||||
|
Dummy = Dataflash_GetSelectedChip();
|
||||||
|
Dataflash_SelectChip(0);
|
||||||
|
Dataflash_DeselectChip();
|
||||||
|
Dataflash_SelectChipFromPage(0);
|
||||||
|
Dataflash_ToggleSelectedChipCS();
|
||||||
|
Dataflash_WaitWhileBusy();
|
||||||
|
Dataflash_SendAddressBytes(0, 0);
|
||||||
|
|
||||||
|
/* LEDs Compile Check */
|
||||||
|
LEDs_Init();
|
||||||
|
LEDs_TurnOnLEDs(LEDS_ALL_LEDS);
|
||||||
|
LEDs_TurnOffLEDs(LEDS_ALL_LEDS);
|
||||||
|
LEDs_SetAllLEDs(LEDS_ALL_LEDS);
|
||||||
|
LEDs_ChangeLEDs(LEDS_ALL_LEDS, LEDS_NO_LEDS);
|
||||||
|
LEDs_ToggleLEDs(LEDS_ALL_LEDS);
|
||||||
|
Dummy = LEDs_GetLEDs();
|
||||||
|
LEDs_Disable();
|
||||||
|
|
||||||
|
/* Joystick Compile Check */
|
||||||
|
Joystick_Init();
|
||||||
|
Dummy = Joystick_GetStatus();
|
||||||
|
Joystick_Disable();
|
||||||
|
|
||||||
|
(void)Dummy;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,63 @@
|
||||||
|
#
|
||||||
|
# LUFA Library
|
||||||
|
# Copyright (C) Dean Camera, 2011.
|
||||||
|
#
|
||||||
|
# dean [at] fourwalledcubicle [dot] com
|
||||||
|
# www.lufa-lib.org
|
||||||
|
#
|
||||||
|
|
||||||
|
# Makefile for the board driver build test. This
|
||||||
|
# test attempts to build a dummy project with all
|
||||||
|
# possible board targets using their respective
|
||||||
|
# compiler.
|
||||||
|
|
||||||
|
# Path to the root of the LUFA tree to scan
|
||||||
|
LUFA_ROOT_PATH = ../..
|
||||||
|
|
||||||
|
|
||||||
|
all: begin makeboardlist testboards clean end
|
||||||
|
|
||||||
|
begin:
|
||||||
|
@echo Executing build test "BoardDriverTest".
|
||||||
|
@echo
|
||||||
|
|
||||||
|
end:
|
||||||
|
@echo Build test "BoardDriverTest" complete.
|
||||||
|
@echo
|
||||||
|
|
||||||
|
makeboardlist:
|
||||||
|
@grep "BOARD_" $(LUFA_ROOT_PATH)/LUFA/Common/BoardTypes.h | cut -d'#' -f2 | cut -d' ' -f2 | grep "BOARD_" > BoardList.txt
|
||||||
|
|
||||||
|
testboards:
|
||||||
|
echo "buildtest:" > BuildMakefile
|
||||||
|
|
||||||
|
@while read line; \
|
||||||
|
do \
|
||||||
|
build_cfg=`grep "$$line " BoardDeviceMap.cfg | sed 's/ //g' | cut -d'=' -f2-`; \
|
||||||
|
\
|
||||||
|
build_board=$$line; \
|
||||||
|
build_arch=`echo $$build_cfg | cut -d':' -f1`; \
|
||||||
|
build_mcu=`echo $$build_cfg | cut -d':' -f2`; \
|
||||||
|
\
|
||||||
|
if ( test -z "$$build_cfg" ); then \
|
||||||
|
echo "No matching information set for board $$build_board"; \
|
||||||
|
else \
|
||||||
|
echo "Found board configuration for $$build_board - $$build_arch, $$build_mcu"; \
|
||||||
|
\
|
||||||
|
printf "\t@echo Building dummy project for $$build_board...\n" >> BuildMakefile; \
|
||||||
|
printf "\tmake -s -f makefile.%s clean\n" $$build_arch >> BuildMakefile; \
|
||||||
|
printf "\tmake -s -f makefile.%s MCU=%s BOARD=%s elf\n\n" $$build_arch $$build_mcu $$build_board >> BuildMakefile; \
|
||||||
|
fi; \
|
||||||
|
done < BoardList.txt
|
||||||
|
|
||||||
|
$(MAKE) -f BuildMakefile buildtest
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -f BuildMakefile
|
||||||
|
rm -f BoardList.txt
|
||||||
|
$(MAKE) -f makefile.avr8 clean
|
||||||
|
$(MAKE) -f makefile.xmega clean
|
||||||
|
$(MAKE) -f makefile.uc3 clean
|
||||||
|
|
||||||
|
%:
|
||||||
|
|
|
@ -0,0 +1,722 @@
|
||||||
|
# Hey Emacs, this is a -*- makefile -*-
|
||||||
|
#----------------------------------------------------------------------------
|
||||||
|
# WinAVR Makefile Template written by Eric B. Weddington, Jörg Wunsch, et al.
|
||||||
|
# >> Modified for use with the LUFA project. <<
|
||||||
|
#
|
||||||
|
# Released to the Public Domain
|
||||||
|
#
|
||||||
|
# Additional material for this makefile was written by:
|
||||||
|
# Peter Fleury
|
||||||
|
# Tim Henigan
|
||||||
|
# Colin O'Flynn
|
||||||
|
# Reiner Patommel
|
||||||
|
# Markus Pfaff
|
||||||
|
# Sander Pool
|
||||||
|
# Frederik Rouleau
|
||||||
|
# Carlos Lamas
|
||||||
|
# Dean Camera
|
||||||
|
# Opendous Inc.
|
||||||
|
# Denver Gingerich
|
||||||
|
#
|
||||||
|
#----------------------------------------------------------------------------
|
||||||
|
# On command line:
|
||||||
|
#
|
||||||
|
# make all = Make software.
|
||||||
|
#
|
||||||
|
# make clean = Clean out built project files.
|
||||||
|
#
|
||||||
|
# make coff = Convert ELF to AVR COFF.
|
||||||
|
#
|
||||||
|
# make extcoff = Convert ELF to AVR Extended COFF.
|
||||||
|
#
|
||||||
|
# make program = Download the hex file to the device, using avrdude.
|
||||||
|
# Please customize the avrdude settings below first!
|
||||||
|
#
|
||||||
|
# make dfu = Download the hex file to the device, using dfu-programmer (must
|
||||||
|
# have dfu-programmer installed).
|
||||||
|
#
|
||||||
|
# make flip = Download the hex file to the device, using Atmel FLIP (must
|
||||||
|
# have Atmel FLIP installed).
|
||||||
|
#
|
||||||
|
# make dfu-ee = Download the eeprom file to the device, using dfu-programmer
|
||||||
|
# (must have dfu-programmer installed).
|
||||||
|
#
|
||||||
|
# make flip-ee = Download the eeprom file to the device, using Atmel FLIP
|
||||||
|
# (must have Atmel FLIP installed).
|
||||||
|
#
|
||||||
|
# make doxygen = Generate DoxyGen documentation for the project (must have
|
||||||
|
# DoxyGen installed)
|
||||||
|
#
|
||||||
|
# make debug = Start either simulavr or avarice as specified for debugging,
|
||||||
|
# with avr-gdb or avr-insight as the front end for debugging.
|
||||||
|
#
|
||||||
|
# make filename.s = Just compile filename.c into the assembler code only.
|
||||||
|
#
|
||||||
|
# make filename.i = Create a preprocessed source file for use in submitting
|
||||||
|
# bug reports to the GCC project.
|
||||||
|
#
|
||||||
|
# To rebuild project do "make clean" then "make all".
|
||||||
|
#----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
# MCU name
|
||||||
|
MCU = at90usb1287
|
||||||
|
|
||||||
|
|
||||||
|
# Target architecture (see library "Board Types" documentation).
|
||||||
|
ARCH = AVR8
|
||||||
|
|
||||||
|
|
||||||
|
# Target board (see library "Board Types" documentation, NONE for projects not requiring
|
||||||
|
# LUFA board drivers). If USER is selected, put custom board drivers in a directory called
|
||||||
|
# "Board" inside the application directory.
|
||||||
|
BOARD = NONE
|
||||||
|
|
||||||
|
|
||||||
|
# Processor frequency.
|
||||||
|
# This will define a symbol, F_CPU, in all source code files equal to the
|
||||||
|
# processor frequency in Hz. You can then use this symbol in your source code to
|
||||||
|
# calculate timings. Do NOT tack on a 'UL' at the end, this will be done
|
||||||
|
# automatically to create a 32-bit value in your source code.
|
||||||
|
#
|
||||||
|
# This will be an integer division of F_USB below, as it is sourced by
|
||||||
|
# F_USB after it has run through any CPU prescalers. Note that this value
|
||||||
|
# does not *change* the processor frequency - it should merely be updated to
|
||||||
|
# reflect the processor speed set externally so that the code can use accurate
|
||||||
|
# software delays.
|
||||||
|
F_CPU = 16000000
|
||||||
|
|
||||||
|
|
||||||
|
# Input clock frequency.
|
||||||
|
# This will define a symbol, F_USB, in all source code files equal to the
|
||||||
|
# input clock frequency (before any prescaling is performed) in Hz. This value may
|
||||||
|
# differ from F_CPU if prescaling is used on the latter, and is required as the
|
||||||
|
# raw input clock is fed directly to the PLL sections of the AVR for high speed
|
||||||
|
# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
|
||||||
|
# at the end, this will be done automatically to create a 32-bit value in your
|
||||||
|
# source code.
|
||||||
|
#
|
||||||
|
# If no clock division is performed on the input clock inside the AVR (via the
|
||||||
|
# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
|
||||||
|
F_USB = $(F_CPU)
|
||||||
|
|
||||||
|
|
||||||
|
# Output format. (can be srec, ihex, binary)
|
||||||
|
FORMAT = ihex
|
||||||
|
|
||||||
|
|
||||||
|
# Target file name (without extension).
|
||||||
|
TARGET = Test
|
||||||
|
|
||||||
|
|
||||||
|
# Object files directory
|
||||||
|
# To put object files in current directory, use a dot (.), do NOT make
|
||||||
|
# this an empty or blank macro!
|
||||||
|
OBJDIR = .
|
||||||
|
|
||||||
|
|
||||||
|
# Path to the LUFA library
|
||||||
|
LUFA_PATH = ../..
|
||||||
|
|
||||||
|
|
||||||
|
# LUFA library compile-time options and predefined tokens
|
||||||
|
LUFA_OPTS =
|
||||||
|
|
||||||
|
|
||||||
|
# Create the LUFA source path variables by including the LUFA root makefile
|
||||||
|
include $(LUFA_PATH)/LUFA/makefile
|
||||||
|
|
||||||
|
|
||||||
|
# List C source files here. (C dependencies are automatically generated.)
|
||||||
|
SRC = Test.c
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# List C++ source files here. (C dependencies are automatically generated.)
|
||||||
|
CPPSRC =
|
||||||
|
|
||||||
|
|
||||||
|
# List Assembler source files here.
|
||||||
|
# Make them always end in a capital .S. Files ending in a lowercase .s
|
||||||
|
# will not be considered source files but generated files (assembler
|
||||||
|
# output from the compiler), and will be deleted upon "make clean"!
|
||||||
|
# Even though the DOS/Win* filesystem matches both .s and .S the same,
|
||||||
|
# it will preserve the spelling of the filenames, and gcc itself does
|
||||||
|
# care about how the name is spelled on its command-line.
|
||||||
|
ASRC =
|
||||||
|
|
||||||
|
|
||||||
|
# Optimization level, can be [0, 1, 2, 3, s].
|
||||||
|
# 0 = turn off optimization. s = optimize for size.
|
||||||
|
# (Note: 3 is not always the best optimization level. See avr-libc FAQ.)
|
||||||
|
OPT = s
|
||||||
|
|
||||||
|
|
||||||
|
# Debugging format.
|
||||||
|
# Native formats for AVR-GCC's -g are dwarf-2 [default] or stabs.
|
||||||
|
# AVR Studio 4.10 requires dwarf-2.
|
||||||
|
# AVR [Extended] COFF format requires stabs, plus an avr-objcopy run.
|
||||||
|
DEBUG = dwarf-2
|
||||||
|
|
||||||
|
|
||||||
|
# List any extra directories to look for include files here.
|
||||||
|
# Each directory must be seperated by a space.
|
||||||
|
# Use forward slashes for directory separators.
|
||||||
|
# For a directory that has spaces, enclose it in quotes.
|
||||||
|
EXTRAINCDIRS = $(LUFA_PATH)/
|
||||||
|
|
||||||
|
|
||||||
|
# Compiler flag to set the C Standard level.
|
||||||
|
# c89 = "ANSI" C
|
||||||
|
# gnu89 = c89 plus GCC extensions
|
||||||
|
# c99 = ISO C99 standard (not yet fully implemented)
|
||||||
|
# gnu99 = c99 plus GCC extensions
|
||||||
|
CSTANDARD = -std=c99
|
||||||
|
|
||||||
|
|
||||||
|
# Place -D or -U options here for C sources
|
||||||
|
CDEFS = -DF_CPU=$(F_CPU)UL
|
||||||
|
CDEFS += -DF_USB=$(F_USB)UL
|
||||||
|
CDEFS += -DBOARD=BOARD_$(BOARD) -DARCH=ARCH_$(ARCH)
|
||||||
|
CDEFS += $(LUFA_OPTS)
|
||||||
|
|
||||||
|
|
||||||
|
# Place -D or -U options here for ASM sources
|
||||||
|
ADEFS = -DF_CPU=$(F_CPU)
|
||||||
|
ADEFS += -DF_USB=$(F_USB)UL
|
||||||
|
ADEFS += -DBOARD=BOARD_$(BOARD)
|
||||||
|
ADEFS += $(LUFA_OPTS)
|
||||||
|
|
||||||
|
# Place -D or -U options here for C++ sources
|
||||||
|
CPPDEFS = -DF_CPU=$(F_CPU)UL
|
||||||
|
CPPDEFS += -DF_USB=$(F_USB)UL
|
||||||
|
CPPDEFS += -DBOARD=BOARD_$(BOARD)
|
||||||
|
CPPDEFS += $(LUFA_OPTS)
|
||||||
|
#CPPDEFS += -D__STDC_LIMIT_MACROS
|
||||||
|
#CPPDEFS += -D__STDC_CONSTANT_MACROS
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#---------------- Compiler Options C ----------------
|
||||||
|
# -g*: generate debugging information
|
||||||
|
# -O*: optimization level
|
||||||
|
# -f...: tuning, see GCC manual and avr-libc documentation
|
||||||
|
# -Wall...: warning level
|
||||||
|
# -Wa,...: tell GCC to pass this to the assembler.
|
||||||
|
# -adhlns...: create assembler listing
|
||||||
|
CFLAGS = -g$(DEBUG)
|
||||||
|
CFLAGS += $(CDEFS)
|
||||||
|
CFLAGS += -O$(OPT)
|
||||||
|
CFLAGS += -funsigned-char
|
||||||
|
CFLAGS += -funsigned-bitfields
|
||||||
|
CFLAGS += -ffunction-sections
|
||||||
|
CFLAGS += -fno-inline-small-functions
|
||||||
|
CFLAGS += -fpack-struct
|
||||||
|
CFLAGS += -fshort-enums
|
||||||
|
CFLAGS += -fno-strict-aliasing
|
||||||
|
CFLAGS += -fno-split-wide-types
|
||||||
|
CFLAGS += -Wall
|
||||||
|
CFLAGS += -Wstrict-prototypes
|
||||||
|
#CFLAGS += -mshort-calls
|
||||||
|
#CFLAGS += -fno-unit-at-a-time
|
||||||
|
#CFLAGS += -Wundef
|
||||||
|
#CFLAGS += -Wunreachable-code
|
||||||
|
#CFLAGS += -Wsign-compare
|
||||||
|
CFLAGS += -Wa,-adhlns=$(<:%.c=$(OBJDIR)/%.lst)
|
||||||
|
CFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS))
|
||||||
|
CFLAGS += $(CSTANDARD)
|
||||||
|
|
||||||
|
|
||||||
|
#---------------- Compiler Options C++ ----------------
|
||||||
|
# -g*: generate debugging information
|
||||||
|
# -O*: optimization level
|
||||||
|
# -f...: tuning, see GCC manual and avr-libc documentation
|
||||||
|
# -Wall...: warning level
|
||||||
|
# -Wa,...: tell GCC to pass this to the assembler.
|
||||||
|
# -adhlns...: create assembler listing
|
||||||
|
CPPFLAGS = -g$(DEBUG)
|
||||||
|
CPPFLAGS += $(CPPDEFS)
|
||||||
|
CPPFLAGS += -O$(OPT)
|
||||||
|
CPPFLAGS += -funsigned-char
|
||||||
|
CPPFLAGS += -funsigned-bitfields
|
||||||
|
CPPFLAGS += -fpack-struct
|
||||||
|
CPPFLAGS += -fshort-enums
|
||||||
|
CPPFLAGS += -fno-exceptions
|
||||||
|
CPPFLAGS += -Wall
|
||||||
|
CPPFLAGS += -Wundef
|
||||||
|
#CPPFLAGS += -mshort-calls
|
||||||
|
#CPPFLAGS += -fno-unit-at-a-time
|
||||||
|
#CPPFLAGS += -Wstrict-prototypes
|
||||||
|
#CPPFLAGS += -Wunreachable-code
|
||||||
|
#CPPFLAGS += -Wsign-compare
|
||||||
|
CPPFLAGS += -Wa,-adhlns=$(<:%.cpp=$(OBJDIR)/%.lst)
|
||||||
|
CPPFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS))
|
||||||
|
#CPPFLAGS += $(CSTANDARD)
|
||||||
|
|
||||||
|
|
||||||
|
#---------------- Assembler Options ----------------
|
||||||
|
# -Wa,...: tell GCC to pass this to the assembler.
|
||||||
|
# -adhlns: create listing
|
||||||
|
# -gstabs: have the assembler create line number information; note that
|
||||||
|
# for use in COFF files, additional information about filenames
|
||||||
|
# and function names needs to be present in the assembler source
|
||||||
|
# files -- see avr-libc docs [FIXME: not yet described there]
|
||||||
|
# -listing-cont-lines: Sets the maximum number of continuation lines of hex
|
||||||
|
# dump that will be displayed for a given single line of source input.
|
||||||
|
ASFLAGS = $(ADEFS) -Wa,-adhlns=$(<:%.S=$(OBJDIR)/%.lst),-gstabs,--listing-cont-lines=100
|
||||||
|
|
||||||
|
|
||||||
|
#---------------- Library Options ----------------
|
||||||
|
# Minimalistic printf version
|
||||||
|
PRINTF_LIB_MIN = -Wl,-u,vfprintf -lprintf_min
|
||||||
|
|
||||||
|
# Floating point printf version (requires MATH_LIB = -lm below)
|
||||||
|
PRINTF_LIB_FLOAT = -Wl,-u,vfprintf -lprintf_flt
|
||||||
|
|
||||||
|
# If this is left blank, then it will use the Standard printf version.
|
||||||
|
PRINTF_LIB =
|
||||||
|
#PRINTF_LIB = $(PRINTF_LIB_MIN)
|
||||||
|
#PRINTF_LIB = $(PRINTF_LIB_FLOAT)
|
||||||
|
|
||||||
|
|
||||||
|
# Minimalistic scanf version
|
||||||
|
SCANF_LIB_MIN = -Wl,-u,vfscanf -lscanf_min
|
||||||
|
|
||||||
|
# Floating point + %[ scanf version (requires MATH_LIB = -lm below)
|
||||||
|
SCANF_LIB_FLOAT = -Wl,-u,vfscanf -lscanf_flt
|
||||||
|
|
||||||
|
# If this is left blank, then it will use the Standard scanf version.
|
||||||
|
SCANF_LIB =
|
||||||
|
#SCANF_LIB = $(SCANF_LIB_MIN)
|
||||||
|
#SCANF_LIB = $(SCANF_LIB_FLOAT)
|
||||||
|
|
||||||
|
|
||||||
|
MATH_LIB = -lm
|
||||||
|
|
||||||
|
|
||||||
|
# List any extra directories to look for libraries here.
|
||||||
|
# Each directory must be seperated by a space.
|
||||||
|
# Use forward slashes for directory separators.
|
||||||
|
# For a directory that has spaces, enclose it in quotes.
|
||||||
|
EXTRALIBDIRS =
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#---------------- External Memory Options ----------------
|
||||||
|
|
||||||
|
# 64 KB of external RAM, starting after internal RAM (ATmega128!),
|
||||||
|
# used for variables (.data/.bss) and heap (malloc()).
|
||||||
|
#EXTMEMOPTS = -Wl,-Tdata=0x801100,--defsym=__heap_end=0x80ffff
|
||||||
|
|
||||||
|
# 64 KB of external RAM, starting after internal RAM (ATmega128!),
|
||||||
|
# only used for heap (malloc()).
|
||||||
|
#EXTMEMOPTS = -Wl,--section-start,.data=0x801100,--defsym=__heap_end=0x80ffff
|
||||||
|
|
||||||
|
EXTMEMOPTS =
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#---------------- Linker Options ----------------
|
||||||
|
# -Wl,...: tell GCC to pass this to linker.
|
||||||
|
# -Map: create map file
|
||||||
|
# --cref: add cross reference to map file
|
||||||
|
LDFLAGS = -Wl,-Map=$(TARGET).map,--cref
|
||||||
|
LDFLAGS += -Wl,--relax
|
||||||
|
LDFLAGS += -Wl,--gc-sections
|
||||||
|
LDFLAGS += $(EXTMEMOPTS)
|
||||||
|
LDFLAGS += $(patsubst %,-L%,$(EXTRALIBDIRS))
|
||||||
|
LDFLAGS += $(PRINTF_LIB) $(SCANF_LIB) $(MATH_LIB)
|
||||||
|
#LDFLAGS += -T linker_script.x
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#---------------- Programming Options (avrdude) ----------------
|
||||||
|
|
||||||
|
# Programming hardware
|
||||||
|
# Type: avrdude -c ?
|
||||||
|
# to get a full listing.
|
||||||
|
#
|
||||||
|
AVRDUDE_PROGRAMMER = jtagmkII
|
||||||
|
|
||||||
|
# com1 = serial port. Use lpt1 to connect to parallel port.
|
||||||
|
AVRDUDE_PORT = usb
|
||||||
|
|
||||||
|
AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex
|
||||||
|
#AVRDUDE_WRITE_EEPROM = -U eeprom:w:$(TARGET).eep
|
||||||
|
|
||||||
|
|
||||||
|
# Uncomment the following if you want avrdude's erase cycle counter.
|
||||||
|
# Note that this counter needs to be initialized first using -Yn,
|
||||||
|
# see avrdude manual.
|
||||||
|
#AVRDUDE_ERASE_COUNTER = -y
|
||||||
|
|
||||||
|
# Uncomment the following if you do /not/ wish a verification to be
|
||||||
|
# performed after programming the device.
|
||||||
|
#AVRDUDE_NO_VERIFY = -V
|
||||||
|
|
||||||
|
# Increase verbosity level. Please use this when submitting bug
|
||||||
|
# reports about avrdude. See <http://savannah.nongnu.org/projects/avrdude>
|
||||||
|
# to submit bug reports.
|
||||||
|
#AVRDUDE_VERBOSE = -v -v
|
||||||
|
|
||||||
|
AVRDUDE_FLAGS = -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER)
|
||||||
|
AVRDUDE_FLAGS += $(AVRDUDE_NO_VERIFY)
|
||||||
|
AVRDUDE_FLAGS += $(AVRDUDE_VERBOSE)
|
||||||
|
AVRDUDE_FLAGS += $(AVRDUDE_ERASE_COUNTER)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#---------------- Debugging Options ----------------
|
||||||
|
|
||||||
|
# For simulavr only - target MCU frequency.
|
||||||
|
DEBUG_MFREQ = $(F_CPU)
|
||||||
|
|
||||||
|
# Set the DEBUG_UI to either gdb or insight.
|
||||||
|
# DEBUG_UI = gdb
|
||||||
|
DEBUG_UI = insight
|
||||||
|
|
||||||
|
# Set the debugging back-end to either avarice, simulavr.
|
||||||
|
DEBUG_BACKEND = avarice
|
||||||
|
#DEBUG_BACKEND = simulavr
|
||||||
|
|
||||||
|
# GDB Init Filename.
|
||||||
|
GDBINIT_FILE = __avr_gdbinit
|
||||||
|
|
||||||
|
# When using avarice settings for the JTAG
|
||||||
|
JTAG_DEV = /dev/com1
|
||||||
|
|
||||||
|
# Debugging port used to communicate between GDB / avarice / simulavr.
|
||||||
|
DEBUG_PORT = 4242
|
||||||
|
|
||||||
|
# Debugging host used to communicate between GDB / avarice / simulavr, normally
|
||||||
|
# just set to localhost unless doing some sort of crazy debugging when
|
||||||
|
# avarice is running on a different computer.
|
||||||
|
DEBUG_HOST = localhost
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#============================================================================
|
||||||
|
|
||||||
|
|
||||||
|
# Define programs and commands.
|
||||||
|
SHELL = sh
|
||||||
|
CC = avr-gcc
|
||||||
|
OBJCOPY = avr-objcopy
|
||||||
|
OBJDUMP = avr-objdump
|
||||||
|
SIZE = avr-size
|
||||||
|
AR = avr-ar rcs
|
||||||
|
NM = avr-nm
|
||||||
|
AVRDUDE = avrdude
|
||||||
|
REMOVE = rm -f
|
||||||
|
REMOVEDIR = rm -rf
|
||||||
|
COPY = cp
|
||||||
|
WINSHELL = cmd
|
||||||
|
|
||||||
|
|
||||||
|
# Define Messages
|
||||||
|
# English
|
||||||
|
MSG_ERRORS_NONE = Errors: none
|
||||||
|
MSG_BEGIN = -------- begin --------
|
||||||
|
MSG_END = -------- end --------
|
||||||
|
MSG_SIZE_BEFORE = Size before:
|
||||||
|
MSG_SIZE_AFTER = Size after:
|
||||||
|
MSG_COFF = Converting to AVR COFF:
|
||||||
|
MSG_EXTENDED_COFF = Converting to AVR Extended COFF:
|
||||||
|
MSG_FLASH = Creating load file for Flash:
|
||||||
|
MSG_EEPROM = Creating load file for EEPROM:
|
||||||
|
MSG_EXTENDED_LISTING = Creating Extended Listing:
|
||||||
|
MSG_SYMBOL_TABLE = Creating Symbol Table:
|
||||||
|
MSG_LINKING = Linking:
|
||||||
|
MSG_COMPILING = Compiling C:
|
||||||
|
MSG_COMPILING_CPP = Compiling C++:
|
||||||
|
MSG_ASSEMBLING = Assembling:
|
||||||
|
MSG_CLEANING = Cleaning project:
|
||||||
|
MSG_CREATING_LIBRARY = Creating library:
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# Define all object files.
|
||||||
|
OBJ = $(SRC:%.c=$(OBJDIR)/%.o) $(CPPSRC:%.cpp=$(OBJDIR)/%.o) $(ASRC:%.S=$(OBJDIR)/%.o)
|
||||||
|
|
||||||
|
# Define all listing files.
|
||||||
|
LST = $(SRC:%.c=$(OBJDIR)/%.lst) $(CPPSRC:%.cpp=$(OBJDIR)/%.lst) $(ASRC:%.S=$(OBJDIR)/%.lst)
|
||||||
|
|
||||||
|
|
||||||
|
# Compiler flags to generate dependency files.
|
||||||
|
GENDEPFLAGS = -MMD -MP -MF .dep/$(@F).d
|
||||||
|
|
||||||
|
|
||||||
|
# Combine all necessary flags and optional flags.
|
||||||
|
# Add target processor to flags.
|
||||||
|
ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS) $(GENDEPFLAGS)
|
||||||
|
ALL_CPPFLAGS = -mmcu=$(MCU) -I. -x c++ $(CPPFLAGS) $(GENDEPFLAGS)
|
||||||
|
ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# Default target.
|
||||||
|
all: begin gccversion sizebefore build sizeafter end
|
||||||
|
|
||||||
|
# Change the build target to build a HEX file or a library.
|
||||||
|
build: elf hex eep lss sym
|
||||||
|
#build: lib
|
||||||
|
|
||||||
|
|
||||||
|
elf: $(TARGET).elf
|
||||||
|
hex: $(TARGET).hex
|
||||||
|
eep: $(TARGET).eep
|
||||||
|
lss: $(TARGET).lss
|
||||||
|
sym: $(TARGET).sym
|
||||||
|
LIBNAME=lib$(TARGET).a
|
||||||
|
lib: $(LIBNAME)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# Eye candy.
|
||||||
|
# AVR Studio 3.x does not check make's exit code but relies on
|
||||||
|
# the following magic strings to be generated by the compile job.
|
||||||
|
begin:
|
||||||
|
@echo
|
||||||
|
@echo $(MSG_BEGIN)
|
||||||
|
|
||||||
|
end:
|
||||||
|
@echo $(MSG_END)
|
||||||
|
@echo
|
||||||
|
|
||||||
|
|
||||||
|
# Display size of file.
|
||||||
|
HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex
|
||||||
|
ELFSIZE = $(SIZE) $(MCU_FLAG) $(FORMAT_FLAG) $(TARGET).elf
|
||||||
|
MCU_FLAG = $(shell $(SIZE) --help | grep -- --mcu > /dev/null && echo --mcu=$(MCU) )
|
||||||
|
FORMAT_FLAG = $(shell $(SIZE) --help | grep -- --format=.*avr > /dev/null && echo --format=avr )
|
||||||
|
|
||||||
|
|
||||||
|
sizebefore:
|
||||||
|
@if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_BEFORE); $(ELFSIZE); \
|
||||||
|
2>/dev/null; echo; fi
|
||||||
|
|
||||||
|
sizeafter:
|
||||||
|
@if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_AFTER); $(ELFSIZE); \
|
||||||
|
2>/dev/null; echo; fi
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# Display compiler version information.
|
||||||
|
gccversion :
|
||||||
|
@$(CC) --version
|
||||||
|
|
||||||
|
|
||||||
|
# Program the device.
|
||||||
|
program: $(TARGET).hex $(TARGET).eep
|
||||||
|
$(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM)
|
||||||
|
|
||||||
|
flip: $(TARGET).hex
|
||||||
|
batchisp -hardware usb -device $(MCU) -operation erase f
|
||||||
|
batchisp -hardware usb -device $(MCU) -operation loadbuffer $(TARGET).hex program
|
||||||
|
batchisp -hardware usb -device $(MCU) -operation start reset 0
|
||||||
|
|
||||||
|
dfu: $(TARGET).hex
|
||||||
|
dfu-programmer $(MCU) erase
|
||||||
|
dfu-programmer $(MCU) flash $(TARGET).hex
|
||||||
|
dfu-programmer $(MCU) reset
|
||||||
|
|
||||||
|
flip-ee: $(TARGET).hex $(TARGET).eep
|
||||||
|
$(COPY) $(TARGET).eep $(TARGET)eep.hex
|
||||||
|
batchisp -hardware usb -device $(MCU) -operation memory EEPROM erase
|
||||||
|
batchisp -hardware usb -device $(MCU) -operation memory EEPROM loadbuffer $(TARGET)eep.hex program
|
||||||
|
batchisp -hardware usb -device $(MCU) -operation start reset 0
|
||||||
|
$(REMOVE) $(TARGET)eep.hex
|
||||||
|
|
||||||
|
dfu-ee: $(TARGET).hex $(TARGET).eep
|
||||||
|
dfu-programmer $(MCU) eeprom-flash $(TARGET).eep
|
||||||
|
dfu-programmer $(MCU) reset
|
||||||
|
|
||||||
|
|
||||||
|
# Generate avr-gdb config/init file which does the following:
|
||||||
|
# define the reset signal, load the target file, connect to target, and set
|
||||||
|
# a breakpoint at main().
|
||||||
|
gdb-config:
|
||||||
|
@$(REMOVE) $(GDBINIT_FILE)
|
||||||
|
@echo define reset >> $(GDBINIT_FILE)
|
||||||
|
@echo SIGNAL SIGHUP >> $(GDBINIT_FILE)
|
||||||
|
@echo end >> $(GDBINIT_FILE)
|
||||||
|
@echo file $(TARGET).elf >> $(GDBINIT_FILE)
|
||||||
|
@echo target remote $(DEBUG_HOST):$(DEBUG_PORT) >> $(GDBINIT_FILE)
|
||||||
|
ifeq ($(DEBUG_BACKEND),simulavr)
|
||||||
|
@echo load >> $(GDBINIT_FILE)
|
||||||
|
endif
|
||||||
|
@echo break main >> $(GDBINIT_FILE)
|
||||||
|
|
||||||
|
debug: gdb-config $(TARGET).elf
|
||||||
|
ifeq ($(DEBUG_BACKEND), avarice)
|
||||||
|
@echo Starting AVaRICE - Press enter when "waiting to connect" message displays.
|
||||||
|
@$(WINSHELL) /c start avarice --jtag $(JTAG_DEV) --erase --program --file \
|
||||||
|
$(TARGET).elf $(DEBUG_HOST):$(DEBUG_PORT)
|
||||||
|
@$(WINSHELL) /c pause
|
||||||
|
|
||||||
|
else
|
||||||
|
@$(WINSHELL) /c start simulavr --gdbserver --device $(MCU) --clock-freq \
|
||||||
|
$(DEBUG_MFREQ) --port $(DEBUG_PORT)
|
||||||
|
endif
|
||||||
|
@$(WINSHELL) /c start avr-$(DEBUG_UI) --command=$(GDBINIT_FILE)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# Convert ELF to COFF for use in debugging / simulating in AVR Studio or VMLAB.
|
||||||
|
COFFCONVERT = $(OBJCOPY) --debugging
|
||||||
|
COFFCONVERT += --change-section-address .data-0x800000
|
||||||
|
COFFCONVERT += --change-section-address .bss-0x800000
|
||||||
|
COFFCONVERT += --change-section-address .noinit-0x800000
|
||||||
|
COFFCONVERT += --change-section-address .eeprom-0x810000
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
coff: $(TARGET).elf
|
||||||
|
@echo
|
||||||
|
@echo $(MSG_COFF) $(TARGET).cof
|
||||||
|
$(COFFCONVERT) -O coff-avr $< $(TARGET).cof
|
||||||
|
|
||||||
|
|
||||||
|
extcoff: $(TARGET).elf
|
||||||
|
@echo
|
||||||
|
@echo $(MSG_EXTENDED_COFF) $(TARGET).cof
|
||||||
|
$(COFFCONVERT) -O coff-ext-avr $< $(TARGET).cof
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# Create final output files (.hex, .eep) from ELF output file.
|
||||||
|
%.hex: %.elf
|
||||||
|
@echo
|
||||||
|
@echo $(MSG_FLASH) $@
|
||||||
|
$(OBJCOPY) -O $(FORMAT) -R .eeprom -R .fuse -R .lock $< $@
|
||||||
|
|
||||||
|
%.eep: %.elf
|
||||||
|
@echo
|
||||||
|
@echo $(MSG_EEPROM) $@
|
||||||
|
-$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \
|
||||||
|
--change-section-lma .eeprom=0 --no-change-warnings -O $(FORMAT) $< $@ || exit 0
|
||||||
|
|
||||||
|
# Create extended listing file from ELF output file.
|
||||||
|
%.lss: %.elf
|
||||||
|
@echo
|
||||||
|
@echo $(MSG_EXTENDED_LISTING) $@
|
||||||
|
$(OBJDUMP) -h -S -z $< > $@
|
||||||
|
|
||||||
|
# Create a symbol table from ELF output file.
|
||||||
|
%.sym: %.elf
|
||||||
|
@echo
|
||||||
|
@echo $(MSG_SYMBOL_TABLE) $@
|
||||||
|
$(NM) -n $< > $@
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# Create library from object files.
|
||||||
|
.SECONDARY : $(TARGET).a
|
||||||
|
.PRECIOUS : $(OBJ)
|
||||||
|
%.a: $(OBJ)
|
||||||
|
@echo
|
||||||
|
@echo $(MSG_CREATING_LIBRARY) $@
|
||||||
|
$(AR) $@ $(OBJ)
|
||||||
|
|
||||||
|
|
||||||
|
# Link: create ELF output file from object files.
|
||||||
|
.SECONDARY : $(TARGET).elf
|
||||||
|
.PRECIOUS : $(OBJ)
|
||||||
|
%.elf: $(OBJ)
|
||||||
|
@echo
|
||||||
|
@echo $(MSG_LINKING) $@
|
||||||
|
$(CC) $(ALL_CFLAGS) $^ --output $@ $(LDFLAGS)
|
||||||
|
|
||||||
|
|
||||||
|
# Compile: create object files from C source files.
|
||||||
|
$(OBJDIR)/%.o : %.c
|
||||||
|
@echo
|
||||||
|
@echo $(MSG_COMPILING) $<
|
||||||
|
$(CC) -c $(ALL_CFLAGS) $< -o $@
|
||||||
|
|
||||||
|
|
||||||
|
# Compile: create object files from C++ source files.
|
||||||
|
$(OBJDIR)/%.o : %.cpp
|
||||||
|
@echo
|
||||||
|
@echo $(MSG_COMPILING_CPP) $<
|
||||||
|
$(CC) -c $(ALL_CPPFLAGS) $< -o $@
|
||||||
|
|
||||||
|
|
||||||
|
# Compile: create assembler files from C source files.
|
||||||
|
%.s : %.c
|
||||||
|
$(CC) -S $(ALL_CFLAGS) $< -o $@
|
||||||
|
|
||||||
|
|
||||||
|
# Compile: create assembler files from C++ source files.
|
||||||
|
%.s : %.cpp
|
||||||
|
$(CC) -S $(ALL_CPPFLAGS) $< -o $@
|
||||||
|
|
||||||
|
|
||||||
|
# Assemble: create object files from assembler source files.
|
||||||
|
$(OBJDIR)/%.o : %.S
|
||||||
|
@echo
|
||||||
|
@echo $(MSG_ASSEMBLING) $<
|
||||||
|
$(CC) -c $(ALL_ASFLAGS) $< -o $@
|
||||||
|
|
||||||
|
|
||||||
|
# Create preprocessed source for use in sending a bug report.
|
||||||
|
%.i : %.c
|
||||||
|
$(CC) -E -mmcu=$(MCU) -I. $(CFLAGS) $< -o $@
|
||||||
|
|
||||||
|
|
||||||
|
# Target: clean project.
|
||||||
|
clean: begin clean_list end
|
||||||
|
|
||||||
|
clean_list :
|
||||||
|
@echo
|
||||||
|
@echo $(MSG_CLEANING)
|
||||||
|
$(REMOVE) $(TARGET).hex
|
||||||
|
$(REMOVE) $(TARGET).eep
|
||||||
|
$(REMOVE) $(TARGET).cof
|
||||||
|
$(REMOVE) $(TARGET).elf
|
||||||
|
$(REMOVE) $(TARGET).map
|
||||||
|
$(REMOVE) $(TARGET).sym
|
||||||
|
$(REMOVE) $(TARGET).lss
|
||||||
|
$(REMOVE) $(SRC:%.c=$(OBJDIR)/%.o) $(CPPSRC:%.cpp=$(OBJDIR)/%.o) $(ASRC:%.S=$(OBJDIR)/%.o)
|
||||||
|
$(REMOVE) $(SRC:%.c=$(OBJDIR)/%.lst) $(CPPSRC:%.cpp=$(OBJDIR)/%.lst) $(ASRC:%.S=$(OBJDIR)/%.lst)
|
||||||
|
$(REMOVE) $(SRC:.c=.s)
|
||||||
|
$(REMOVE) $(SRC:.c=.d)
|
||||||
|
$(REMOVE) $(SRC:.c=.i)
|
||||||
|
$(REMOVEDIR) .dep
|
||||||
|
|
||||||
|
doxygen:
|
||||||
|
@echo Generating Project Documentation \($(TARGET)\)...
|
||||||
|
@if ( doxygen Doxygen.conf 2>&1 | grep -v "warning: ignoring unsupported tag" ;); then \
|
||||||
|
exit 1; \
|
||||||
|
fi;
|
||||||
|
@echo Documentation Generation Complete.
|
||||||
|
|
||||||
|
clean_doxygen:
|
||||||
|
rm -rf Documentation
|
||||||
|
|
||||||
|
checksource:
|
||||||
|
@for f in $(SRC) $(CPPSRC) $(ASRC); do \
|
||||||
|
if [ -f $$f ]; then \
|
||||||
|
echo "Found Source File: $$f" ; \
|
||||||
|
else \
|
||||||
|
echo "Source File Not Found: $$f" ; \
|
||||||
|
fi; done
|
||||||
|
|
||||||
|
|
||||||
|
# Create object files directory
|
||||||
|
$(shell mkdir $(OBJDIR) 2>/dev/null)
|
||||||
|
|
||||||
|
|
||||||
|
# Include the dependency files.
|
||||||
|
-include $(shell mkdir .dep 2>/dev/null) $(wildcard .dep/*)
|
||||||
|
|
||||||
|
|
||||||
|
# Listing of phony targets.
|
||||||
|
.PHONY : all begin finish end sizebefore sizeafter gccversion \
|
||||||
|
build elf hex eep lss sym coff extcoff doxygen clean \
|
||||||
|
clean_list clean_doxygen program dfu flip flip-ee dfu-ee \
|
||||||
|
debug gdb-config checksource
|
|
@ -0,0 +1,485 @@
|
||||||
|
# Hey Emacs, this is a -*- makefile -*-
|
||||||
|
#----------------------------------------------------------------------------
|
||||||
|
# WinAVR Makefile Template written by Eric B. Weddington, Jörg Wunsch, et al.
|
||||||
|
# >> Modified for use with the LUFA project. <<
|
||||||
|
#
|
||||||
|
# Released to the Public Domain
|
||||||
|
#
|
||||||
|
# Additional material for this makefile was written by:
|
||||||
|
# Peter Fleury
|
||||||
|
# Tim Henigan
|
||||||
|
# Colin O'Flynn
|
||||||
|
# Reiner Patommel
|
||||||
|
# Markus Pfaff
|
||||||
|
# Sander Pool
|
||||||
|
# Frederik Rouleau
|
||||||
|
# Carlos Lamas
|
||||||
|
# Dean Camera
|
||||||
|
# Opendous Inc.
|
||||||
|
# Denver Gingerich
|
||||||
|
#
|
||||||
|
#----------------------------------------------------------------------------
|
||||||
|
# On command line:
|
||||||
|
#
|
||||||
|
# make all = Make software.
|
||||||
|
#
|
||||||
|
# make clean = Clean out built project files.
|
||||||
|
#
|
||||||
|
# make dfu = Download the hex file to the device, using dfu-programmer (must
|
||||||
|
# have dfu-programmer installed).
|
||||||
|
#
|
||||||
|
# make flip = Download the hex file to the device, using Atmel FLIP (must
|
||||||
|
# have Atmel FLIP installed).
|
||||||
|
#
|
||||||
|
# make doxygen = Generate DoxyGen documentation for the project (must have
|
||||||
|
# DoxyGen installed)
|
||||||
|
#
|
||||||
|
# make filename.s = Just compile filename.c into the assembler code only.
|
||||||
|
#
|
||||||
|
# make filename.i = Create a preprocessed source file for use in submitting
|
||||||
|
# bug reports to the GCC project.
|
||||||
|
#
|
||||||
|
# To rebuild project do "make clean" then "make all".
|
||||||
|
#----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
# MCU name
|
||||||
|
MCU = uc3a3256
|
||||||
|
|
||||||
|
|
||||||
|
# Targeted chip architecture (see library "Architectures" documentation)
|
||||||
|
ARCH = UC3
|
||||||
|
|
||||||
|
|
||||||
|
# Target board (see library "Board Types" documentation, NONE for projects not requiring
|
||||||
|
# LUFA board drivers). If USER is selected, put custom board drivers in a directory called
|
||||||
|
# "Board" inside the application directory.
|
||||||
|
BOARD = NONE
|
||||||
|
|
||||||
|
|
||||||
|
# Processor frequency.
|
||||||
|
# This will define a symbol, F_CPU, in all source code files equal to the
|
||||||
|
# processor frequency in Hz. You can then use this symbol in your source code to
|
||||||
|
# calculate timings. Do NOT tack on a 'UL' at the end, this will be done
|
||||||
|
# automatically to create a 32-bit value in your source code.
|
||||||
|
#
|
||||||
|
# This should be the frequency the system core runs at, after the system clock
|
||||||
|
# has been set up correctly and started.
|
||||||
|
F_CPU = 12000000
|
||||||
|
|
||||||
|
|
||||||
|
# USB controller master clock frequency.
|
||||||
|
# This will define a symbol, F_USB, in all source code files equal to the
|
||||||
|
# input clock frequency of the USB controller's clock generator in Hz.
|
||||||
|
#
|
||||||
|
# For the UC3 chips, this should be equal to 48MHz or 96MHz.
|
||||||
|
F_USB = 48000000
|
||||||
|
|
||||||
|
|
||||||
|
# Output format. (can be srec, ihex, binary)
|
||||||
|
FORMAT = ihex
|
||||||
|
|
||||||
|
|
||||||
|
# Target file name (without extension).
|
||||||
|
TARGET = Test
|
||||||
|
|
||||||
|
|
||||||
|
# Object files directory
|
||||||
|
# To put object files in current directory, use a dot (.), do NOT make
|
||||||
|
# this an empty or blank macro!
|
||||||
|
OBJDIR = .
|
||||||
|
|
||||||
|
|
||||||
|
# Path to the LUFA library
|
||||||
|
LUFA_PATH = ../..
|
||||||
|
|
||||||
|
|
||||||
|
# LUFA library compile-time options and predefined tokens (add '-D' before each token)
|
||||||
|
LUFA_OPTS =
|
||||||
|
|
||||||
|
|
||||||
|
# Create the LUFA source path variables by including the LUFA root makefile
|
||||||
|
include $(LUFA_PATH)/LUFA/makefile
|
||||||
|
|
||||||
|
|
||||||
|
# List C source files here. (C dependencies are automatically generated.)
|
||||||
|
SRC = Test.c
|
||||||
|
|
||||||
|
|
||||||
|
# List C++ source files here. (C dependencies are automatically generated.)
|
||||||
|
CPPSRC =
|
||||||
|
|
||||||
|
|
||||||
|
# List Assembler source files here.
|
||||||
|
# Make them always end in a capital .S. Files ending in a lowercase .s
|
||||||
|
# will not be considered source files but generated files (assembler
|
||||||
|
# output from the compiler), and will be deleted upon "make clean"!
|
||||||
|
# Even though the DOS/Win* filesystem matches both .s and .S the same,
|
||||||
|
# it will preserve the spelling of the filenames, and gcc itself does
|
||||||
|
# care about how the name is spelled on its command-line.
|
||||||
|
ASRC =
|
||||||
|
|
||||||
|
|
||||||
|
# Optimization level, can be [0, 1, 2, 3, s].
|
||||||
|
# 0 = turn off optimization. s = optimize for size.
|
||||||
|
# (Note: 3 is not always the best optimization level. See avr-libc FAQ.)
|
||||||
|
OPT = s
|
||||||
|
|
||||||
|
|
||||||
|
# List any extra directories to look for include files here.
|
||||||
|
# Each directory must be seperated by a space.
|
||||||
|
# Use forward slashes for directory separators.
|
||||||
|
# For a directory that has spaces, enclose it in quotes.
|
||||||
|
EXTRAINCDIRS = $(LUFA_PATH)/
|
||||||
|
|
||||||
|
|
||||||
|
# Compiler flag to set the C Standard level.
|
||||||
|
# c89 = "ANSI" C
|
||||||
|
# gnu89 = c89 plus GCC extensions
|
||||||
|
# c99 = ISO C99 standard (not yet fully implemented)
|
||||||
|
# gnu99 = c99 plus GCC extensions
|
||||||
|
CSTANDARD = -std=gnu99
|
||||||
|
|
||||||
|
|
||||||
|
# Place -D or -U options here for C sources
|
||||||
|
CDEFS = -DF_CPU=$(F_CPU)UL
|
||||||
|
CDEFS += -DF_USB=$(F_USB)UL
|
||||||
|
CDEFS += -DBOARD=BOARD_$(BOARD)
|
||||||
|
CDEFS += -DARCH=ARCH_$(ARCH)
|
||||||
|
CDEFS += $(LUFA_OPTS)
|
||||||
|
|
||||||
|
|
||||||
|
# Place -D or -U options here for ASM sources
|
||||||
|
ADEFS = -DF_CPU=$(F_CPU)
|
||||||
|
ADEFS += -DF_USB=$(F_USB)UL
|
||||||
|
ADEFS += -DBOARD=BOARD_$(BOARD)
|
||||||
|
ADEFS += -DARCH=ARCH_$(ARCH)
|
||||||
|
ADEFS += $(LUFA_OPTS)
|
||||||
|
|
||||||
|
# Place -D or -U options here for C++ sources
|
||||||
|
CPPDEFS = -DF_CPU=$(F_CPU)UL
|
||||||
|
CPPDEFS += -DF_USB=$(F_USB)UL
|
||||||
|
CPPDEFS += -DBOARD=BOARD_$(BOARD)
|
||||||
|
CPPDEFS += -DARCH=ARCH_$(ARCH)
|
||||||
|
CPPDEFS += $(LUFA_OPTS)
|
||||||
|
|
||||||
|
|
||||||
|
# Debugging level.
|
||||||
|
DEBUG = 3
|
||||||
|
|
||||||
|
|
||||||
|
#---------------- Compiler Options C ----------------
|
||||||
|
# -g*: generate debugging information
|
||||||
|
# -O*: optimization level
|
||||||
|
# -f...: tuning, see GCC manual and avr-libc documentation
|
||||||
|
# -Wall...: warning level
|
||||||
|
# -Wa,...: tell GCC to pass this to the assembler.
|
||||||
|
# -adhlns...: create assembler listing
|
||||||
|
CFLAGS = -g$(DEBUG)
|
||||||
|
CFLAGS += $(CDEFS)
|
||||||
|
CFLAGS += -O$(OPT)
|
||||||
|
CFLAGS += -funsigned-char
|
||||||
|
CFLAGS += -funsigned-bitfields
|
||||||
|
CFLAGS += -ffunction-sections
|
||||||
|
CFLAGS += -fno-strict-aliasing
|
||||||
|
CFLAGS += -Wall
|
||||||
|
CFLAGS += -Wstrict-prototypes
|
||||||
|
CFLAGS += -masm-addr-pseudos
|
||||||
|
CFLAGS += -Wa,-adhlns=$(<:%.c=$(OBJDIR)/%.lst)
|
||||||
|
CFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS))
|
||||||
|
CFLAGS += $(CSTANDARD)
|
||||||
|
|
||||||
|
|
||||||
|
#---------------- Compiler Options C++ ----------------
|
||||||
|
# -g*: generate debugging information
|
||||||
|
# -O*: optimization level
|
||||||
|
# -f...: tuning, see GCC manual and avr-libc documentation
|
||||||
|
# -Wall...: warning level
|
||||||
|
# -Wa,...: tell GCC to pass this to the assembler.
|
||||||
|
# -adhlns...: create assembler listing
|
||||||
|
CPPFLAGS = -g$(DEBUG)
|
||||||
|
CPPFLAGS += $(CPPDEFS)
|
||||||
|
CPPFLAGS += -O$(OPT)
|
||||||
|
CPPFLAGS += -funsigned-char
|
||||||
|
CPPFLAGS += -funsigned-bitfields
|
||||||
|
CPPFLAGS += -ffunction-sections
|
||||||
|
CPPFLAGS += -fno-strict-aliasing
|
||||||
|
CPPFLAGS += -fno-exceptions
|
||||||
|
CPPFLAGS += -masm-addr-pseudos
|
||||||
|
CPPFLAGS += -Wall
|
||||||
|
CPPFLAGS += -Wundef
|
||||||
|
CPPFLAGS += -Wa,-adhlns=$(<:%.cpp=$(OBJDIR)/%.lst)
|
||||||
|
CPPFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS))
|
||||||
|
#CPPFLAGS += $(CSTANDARD)
|
||||||
|
|
||||||
|
|
||||||
|
#---------------- Assembler Options ----------------
|
||||||
|
# -Wa,...: tell GCC to pass this to the assembler.
|
||||||
|
# -adhlns: create listing
|
||||||
|
# -gstabs: have the assembler create line number information; note that
|
||||||
|
# for use in COFF files, additional information about filenames
|
||||||
|
# and function names needs to be present in the assembler source
|
||||||
|
# files -- see avr-libc docs [FIXME: not yet described there]
|
||||||
|
# -listing-cont-lines: Sets the maximum number of continuation lines of hex
|
||||||
|
# dump that will be displayed for a given single line of source input.
|
||||||
|
ASFLAGS = $(ADEFS) -Wa,-adhlns=$(<:%.S=$(OBJDIR)/%.lst),-gstabs,--listing-cont-lines=100
|
||||||
|
|
||||||
|
|
||||||
|
#---------------- Linker Options ----------------
|
||||||
|
# -Wl,...: tell GCC to pass this to linker.
|
||||||
|
# -Map: create map file
|
||||||
|
# --cref: add cross reference to map file
|
||||||
|
LDFLAGS = -Wl,-Map=$(TARGET).map,--cref
|
||||||
|
LDFLAGS += -Wl,--gc-sections --rodata-writable
|
||||||
|
LDFLAGS += -Wl,--direct-data
|
||||||
|
#LDFLAGS += -T linker_script.x
|
||||||
|
|
||||||
|
|
||||||
|
#============================================================================
|
||||||
|
|
||||||
|
|
||||||
|
# Define programs and commands.
|
||||||
|
SHELL = sh
|
||||||
|
CC = avr32-gcc
|
||||||
|
OBJCOPY = avr32-objcopy
|
||||||
|
OBJDUMP = avr32-objdump
|
||||||
|
SIZE = avr32-size
|
||||||
|
AR = avr32-ar rcs
|
||||||
|
NM = avr32-nm
|
||||||
|
REMOVE = rm -f
|
||||||
|
REMOVEDIR = rm -rf
|
||||||
|
COPY = cp
|
||||||
|
WINSHELL = cmd
|
||||||
|
|
||||||
|
|
||||||
|
# Define Messages
|
||||||
|
# English
|
||||||
|
MSG_ERRORS_NONE = Errors: none
|
||||||
|
MSG_BEGIN = -------- begin --------
|
||||||
|
MSG_END = -------- end --------
|
||||||
|
MSG_SIZE_BEFORE = Size before:
|
||||||
|
MSG_SIZE_AFTER = Size after:
|
||||||
|
MSG_COFF = Converting to AVR COFF:
|
||||||
|
MSG_FLASH = Creating load file for Flash:
|
||||||
|
MSG_EEPROM = Creating load file for EEPROM:
|
||||||
|
MSG_EXTENDED_LISTING = Creating Extended Listing:
|
||||||
|
MSG_SYMBOL_TABLE = Creating Symbol Table:
|
||||||
|
MSG_LINKING = Linking:
|
||||||
|
MSG_COMPILING = Compiling C:
|
||||||
|
MSG_COMPILING_CPP = Compiling C++:
|
||||||
|
MSG_ASSEMBLING = Assembling:
|
||||||
|
MSG_CLEANING = Cleaning project:
|
||||||
|
MSG_CREATING_LIBRARY = Creating library:
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# Define all object files.
|
||||||
|
OBJ = $(SRC:%.c=$(OBJDIR)/%.o) $(CPPSRC:%.cpp=$(OBJDIR)/%.o) $(ASRC:%.S=$(OBJDIR)/%.o)
|
||||||
|
|
||||||
|
# Define all listing files.
|
||||||
|
LST = $(SRC:%.c=$(OBJDIR)/%.lst) $(CPPSRC:%.cpp=$(OBJDIR)/%.lst) $(ASRC:%.S=$(OBJDIR)/%.lst)
|
||||||
|
|
||||||
|
|
||||||
|
# Compiler flags to generate dependency files.
|
||||||
|
GENDEPFLAGS = -MMD -MP -MF .dep/$(@F).d
|
||||||
|
|
||||||
|
|
||||||
|
# Combine all necessary flags and optional flags.
|
||||||
|
# Add target processor to flags.
|
||||||
|
ALL_CFLAGS = -mpart=$(MCU) -I. $(CFLAGS) $(GENDEPFLAGS)
|
||||||
|
ALL_CPPFLAGS = -mpart=$(MCU) -I. -x c++ $(CPPFLAGS) $(GENDEPFLAGS)
|
||||||
|
ALL_ASFLAGS = -mpart=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# Default target.
|
||||||
|
all: begin gccversion sizebefore build sizeafter end
|
||||||
|
|
||||||
|
# Change the build target to build a HEX file or a library.
|
||||||
|
build: elf hex lss sym
|
||||||
|
#build: lib
|
||||||
|
|
||||||
|
|
||||||
|
elf: $(TARGET).elf
|
||||||
|
hex: $(TARGET).hex
|
||||||
|
lss: $(TARGET).lss
|
||||||
|
sym: $(TARGET).sym
|
||||||
|
LIBNAME=lib$(TARGET).a
|
||||||
|
lib: $(LIBNAME)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# Eye candy.
|
||||||
|
# AVR Studio 3.x does not check make's exit code but relies on
|
||||||
|
# the following magic strings to be generated by the compile job.
|
||||||
|
begin:
|
||||||
|
@echo
|
||||||
|
@echo $(MSG_BEGIN)
|
||||||
|
|
||||||
|
end:
|
||||||
|
@echo $(MSG_END)
|
||||||
|
@echo
|
||||||
|
|
||||||
|
|
||||||
|
# Display size of file.
|
||||||
|
HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex
|
||||||
|
ELFSIZE = $(SIZE) $(MCU_FLAG) $(FORMAT_FLAG) $(TARGET).elf
|
||||||
|
MCU_FLAG = $(shell $(SIZE) --help | grep -- --mcu > /dev/null && echo --mcu=$(MCU) )
|
||||||
|
FORMAT_FLAG = $(shell $(SIZE) --help | grep -- --format=.*avr > /dev/null && echo --format=avr )
|
||||||
|
|
||||||
|
|
||||||
|
sizebefore:
|
||||||
|
@if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_BEFORE); $(ELFSIZE); \
|
||||||
|
2>/dev/null; echo; fi
|
||||||
|
|
||||||
|
sizeafter:
|
||||||
|
@if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_AFTER); $(ELFSIZE); \
|
||||||
|
2>/dev/null; echo; fi
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# Display compiler version information.
|
||||||
|
gccversion :
|
||||||
|
@$(CC) --version
|
||||||
|
|
||||||
|
|
||||||
|
# Program the device.
|
||||||
|
flip: $(TARGET).hex
|
||||||
|
batchisp -hardware usb -device $(MCU) -operation erase f
|
||||||
|
batchisp -hardware usb -device $(MCU) -operation loadbuffer $(TARGET).hex program
|
||||||
|
batchisp -hardware usb -device $(MCU) -operation start reset 0
|
||||||
|
|
||||||
|
dfu: $(TARGET).hex
|
||||||
|
dfu-programmer $(MCU) erase
|
||||||
|
dfu-programmer $(MCU) flash $(TARGET).hex
|
||||||
|
dfu-programmer $(MCU) reset
|
||||||
|
|
||||||
|
|
||||||
|
# Create final output files (.hex, .eep) from ELF output file.
|
||||||
|
%.hex: %.elf
|
||||||
|
@echo
|
||||||
|
@echo $(MSG_FLASH) $@
|
||||||
|
$(OBJCOPY) -O $(FORMAT) -R .eeprom -R .fuse -R .lock -R .signature $< $@
|
||||||
|
|
||||||
|
# Create extended listing file from ELF output file.
|
||||||
|
%.lss: %.elf
|
||||||
|
@echo
|
||||||
|
@echo $(MSG_EXTENDED_LISTING) $@
|
||||||
|
$(OBJDUMP) -h -S -z $< > $@
|
||||||
|
|
||||||
|
# Create a symbol table from ELF output file.
|
||||||
|
%.sym: %.elf
|
||||||
|
@echo
|
||||||
|
@echo $(MSG_SYMBOL_TABLE) $@
|
||||||
|
$(NM) -n $< > $@
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# Create library from object files.
|
||||||
|
.SECONDARY : $(TARGET).a
|
||||||
|
.PRECIOUS : $(OBJ)
|
||||||
|
%.a: $(OBJ)
|
||||||
|
@echo
|
||||||
|
@echo $(MSG_CREATING_LIBRARY) $@
|
||||||
|
$(AR) $@ $(OBJ)
|
||||||
|
|
||||||
|
|
||||||
|
# Link: create ELF output file from object files.
|
||||||
|
.SECONDARY : $(TARGET).elf
|
||||||
|
.PRECIOUS : $(OBJ)
|
||||||
|
%.elf: $(OBJ)
|
||||||
|
@echo
|
||||||
|
@echo $(MSG_LINKING) $@
|
||||||
|
$(CC) $(ALL_CFLAGS) $^ --output $@ $(LDFLAGS)
|
||||||
|
|
||||||
|
|
||||||
|
# Compile: create object files from C source files.
|
||||||
|
$(OBJDIR)/%.o : %.c
|
||||||
|
@echo
|
||||||
|
@echo $(MSG_COMPILING) $<
|
||||||
|
$(CC) -c $(ALL_CFLAGS) $< -o $@
|
||||||
|
|
||||||
|
|
||||||
|
# Compile: create object files from C++ source files.
|
||||||
|
$(OBJDIR)/%.o : %.cpp
|
||||||
|
@echo
|
||||||
|
@echo $(MSG_COMPILING_CPP) $<
|
||||||
|
$(CC) -c $(ALL_CPPFLAGS) $< -o $@
|
||||||
|
|
||||||
|
|
||||||
|
# Compile: create assembler files from C source files.
|
||||||
|
%.s : %.c
|
||||||
|
$(CC) -S $(ALL_CFLAGS) $< -o $@
|
||||||
|
|
||||||
|
|
||||||
|
# Compile: create assembler files from C++ source files.
|
||||||
|
%.s : %.cpp
|
||||||
|
$(CC) -S $(ALL_CPPFLAGS) $< -o $@
|
||||||
|
|
||||||
|
|
||||||
|
# Assemble: create object files from assembler source files.
|
||||||
|
$(OBJDIR)/%.o : %.S
|
||||||
|
@echo
|
||||||
|
@echo $(MSG_ASSEMBLING) $<
|
||||||
|
$(CC) -c $(ALL_ASFLAGS) $< -o $@
|
||||||
|
|
||||||
|
|
||||||
|
# Create preprocessed source for use in sending a bug report.
|
||||||
|
%.i : %.c
|
||||||
|
$(CC) -E -mmcu=$(MCU) -I. $(CFLAGS) $< -o $@
|
||||||
|
|
||||||
|
|
||||||
|
# Target: clean project.
|
||||||
|
clean: begin clean_list end
|
||||||
|
|
||||||
|
clean_list :
|
||||||
|
@echo
|
||||||
|
@echo $(MSG_CLEANING)
|
||||||
|
$(REMOVE) $(TARGET).hex
|
||||||
|
$(REMOVE) $(TARGET).cof
|
||||||
|
$(REMOVE) $(TARGET).elf
|
||||||
|
$(REMOVE) $(TARGET).map
|
||||||
|
$(REMOVE) $(TARGET).sym
|
||||||
|
$(REMOVE) $(TARGET).lss
|
||||||
|
$(REMOVE) $(SRC:%.c=$(OBJDIR)/%.o) $(CPPSRC:%.cpp=$(OBJDIR)/%.o) $(ASRC:%.S=$(OBJDIR)/%.o)
|
||||||
|
$(REMOVE) $(SRC:%.c=$(OBJDIR)/%.lst) $(CPPSRC:%.cpp=$(OBJDIR)/%.lst) $(ASRC:%.S=$(OBJDIR)/%.lst)
|
||||||
|
$(REMOVE) $(SRC:.c=.s)
|
||||||
|
$(REMOVE) $(SRC:.c=.d)
|
||||||
|
$(REMOVE) $(SRC:.c=.i)
|
||||||
|
$(REMOVEDIR) .dep
|
||||||
|
|
||||||
|
doxygen:
|
||||||
|
@echo Generating Project Documentation \($(TARGET)\)...
|
||||||
|
@if ( doxygen Doxygen.conf 2>&1 | grep -v "warning: ignoring unsupported tag" ;); then \
|
||||||
|
exit 1; \
|
||||||
|
fi;
|
||||||
|
@echo Documentation Generation Complete.
|
||||||
|
|
||||||
|
clean_doxygen:
|
||||||
|
rm -rf Documentation
|
||||||
|
|
||||||
|
checksource:
|
||||||
|
@for f in $(SRC) $(CPPSRC) $(ASRC); do \
|
||||||
|
if [ -f $$f ]; then \
|
||||||
|
echo "Found Source File: $$f" ; \
|
||||||
|
else \
|
||||||
|
echo "Source File Not Found: $$f" ; \
|
||||||
|
fi; done
|
||||||
|
|
||||||
|
|
||||||
|
# Create object files directory
|
||||||
|
$(shell mkdir $(OBJDIR) 2>/dev/null)
|
||||||
|
|
||||||
|
|
||||||
|
# Include the dependency files.
|
||||||
|
-include $(shell mkdir .dep 2>/dev/null) $(wildcard .dep/*)
|
||||||
|
|
||||||
|
|
||||||
|
# Listing of phony targets.
|
||||||
|
.PHONY : all begin finish end sizebefore sizeafter gccversion \
|
||||||
|
build elf hex lss sym doxygen clean clean_list clean_doxygen \
|
||||||
|
dfu flip checksource
|
||||||
|
|
|
@ -0,0 +1,704 @@
|
||||||
|
# Hey Emacs, this is a -*- makefile -*-
|
||||||
|
#----------------------------------------------------------------------------
|
||||||
|
# WinAVR Makefile Template written by Eric B. Weddington, Jörg Wunsch, et al.
|
||||||
|
# >> Modified for use with the LUFA project. <<
|
||||||
|
#
|
||||||
|
# Released to the Public Domain
|
||||||
|
#
|
||||||
|
# Additional material for this makefile was written by:
|
||||||
|
# Peter Fleury
|
||||||
|
# Tim Henigan
|
||||||
|
# Colin O'Flynn
|
||||||
|
# Reiner Patommel
|
||||||
|
# Markus Pfaff
|
||||||
|
# Sander Pool
|
||||||
|
# Frederik Rouleau
|
||||||
|
# Carlos Lamas
|
||||||
|
# Dean Camera
|
||||||
|
# Opendous Inc.
|
||||||
|
# Denver Gingerich
|
||||||
|
#
|
||||||
|
#----------------------------------------------------------------------------
|
||||||
|
# On command line:
|
||||||
|
#
|
||||||
|
# make all = Make software.
|
||||||
|
#
|
||||||
|
# make clean = Clean out built project files.
|
||||||
|
#
|
||||||
|
# make coff = Convert ELF to AVR COFF.
|
||||||
|
#
|
||||||
|
# make extcoff = Convert ELF to AVR Extended COFF.
|
||||||
|
#
|
||||||
|
# make program = Download the hex file to the device, using avrdude.
|
||||||
|
# Please customize the avrdude settings below first!
|
||||||
|
#
|
||||||
|
# make dfu = Download the hex file to the device, using dfu-programmer (must
|
||||||
|
# have dfu-programmer installed).
|
||||||
|
#
|
||||||
|
# make flip = Download the hex file to the device, using Atmel FLIP (must
|
||||||
|
# have Atmel FLIP installed).
|
||||||
|
#
|
||||||
|
# make dfu-ee = Download the eeprom file to the device, using dfu-programmer
|
||||||
|
# (must have dfu-programmer installed).
|
||||||
|
#
|
||||||
|
# make flip-ee = Download the eeprom file to the device, using Atmel FLIP
|
||||||
|
# (must have Atmel FLIP installed).
|
||||||
|
#
|
||||||
|
# make doxygen = Generate DoxyGen documentation for the project (must have
|
||||||
|
# DoxyGen installed)
|
||||||
|
#
|
||||||
|
# make debug = Start either simulavr or avarice as specified for debugging,
|
||||||
|
# with avr-gdb or avr-insight as the front end for debugging.
|
||||||
|
#
|
||||||
|
# make filename.s = Just compile filename.c into the assembler code only.
|
||||||
|
#
|
||||||
|
# make filename.i = Create a preprocessed source file for use in submitting
|
||||||
|
# bug reports to the GCC project.
|
||||||
|
#
|
||||||
|
# To rebuild project do "make clean" then "make all".
|
||||||
|
#----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
# MCU name
|
||||||
|
MCU = atxmega128a1u
|
||||||
|
|
||||||
|
|
||||||
|
# Targeted chip architecture (see library "Architectures" documentation)
|
||||||
|
ARCH = XMEGA
|
||||||
|
|
||||||
|
|
||||||
|
# Target board (see library "Board Types" documentation, NONE for projects not requiring
|
||||||
|
# LUFA board drivers). If USER is selected, put custom board drivers in a directory called
|
||||||
|
# "Board" inside the application directory.
|
||||||
|
BOARD = NONE
|
||||||
|
|
||||||
|
|
||||||
|
# Processor frequency.
|
||||||
|
# This will define a symbol, F_CPU, in all source code files equal to the
|
||||||
|
# processor frequency in Hz. You can then use this symbol in your source code to
|
||||||
|
# calculate timings. Do NOT tack on a 'UL' at the end, this will be done
|
||||||
|
# automatically to create a 32-bit value in your source code.
|
||||||
|
#
|
||||||
|
# This should be the frequency the system core runs at, after the system clock
|
||||||
|
# has been set up correctly and started.
|
||||||
|
F_CPU = 24000000
|
||||||
|
|
||||||
|
|
||||||
|
# USB controller master clock frequency.
|
||||||
|
# This will define a symbol, F_USB, in all source code files equal to the
|
||||||
|
# input clock frequency of the USB controller's clock generator in Hz.
|
||||||
|
#
|
||||||
|
# For the XMEGA chips, this should be equal to a multiple of 6MHz for Low
|
||||||
|
# Speed USB mode, or a multiple of 48MHz for Full Speed USB mode.
|
||||||
|
F_USB = 48000000
|
||||||
|
|
||||||
|
|
||||||
|
# Output format. (can be srec, ihex, binary)
|
||||||
|
FORMAT = ihex
|
||||||
|
|
||||||
|
|
||||||
|
# Target file name (without extension).
|
||||||
|
TARGET = Test
|
||||||
|
|
||||||
|
|
||||||
|
# Object files directory
|
||||||
|
# To put object files in current directory, use a dot (.), do NOT make
|
||||||
|
# this an empty or blank macro!
|
||||||
|
OBJDIR = .
|
||||||
|
|
||||||
|
|
||||||
|
# Path to the LUFA library
|
||||||
|
LUFA_PATH = ../..
|
||||||
|
|
||||||
|
|
||||||
|
# LUFA library compile-time options and predefined tokens
|
||||||
|
LUFA_OPTS =
|
||||||
|
|
||||||
|
|
||||||
|
# Create the LUFA source path variables by including the LUFA root makefile
|
||||||
|
include $(LUFA_PATH)/LUFA/makefile
|
||||||
|
|
||||||
|
|
||||||
|
# List C source files here. (C dependencies are automatically generated.)
|
||||||
|
SRC = Test.c
|
||||||
|
|
||||||
|
|
||||||
|
# List C++ source files here. (C dependencies are automatically generated.)
|
||||||
|
CPPSRC =
|
||||||
|
|
||||||
|
|
||||||
|
# List Assembler source files here.
|
||||||
|
# Make them always end in a capital .S. Files ending in a lowercase .s
|
||||||
|
# will not be considered source files but generated files (assembler
|
||||||
|
# output from the compiler), and will be deleted upon "make clean"!
|
||||||
|
# Even though the DOS/Win* filesystem matches both .s and .S the same,
|
||||||
|
# it will preserve the spelling of the filenames, and gcc itself does
|
||||||
|
# care about how the name is spelled on its command-line.
|
||||||
|
ASRC =
|
||||||
|
|
||||||
|
|
||||||
|
# Optimization level, can be [0, 1, 2, 3, s].
|
||||||
|
# 0 = turn off optimization. s = optimize for size.
|
||||||
|
# (Note: 3 is not always the best optimization level. See avr-libc FAQ.)
|
||||||
|
OPT = s
|
||||||
|
|
||||||
|
|
||||||
|
# List any extra directories to look for include files here.
|
||||||
|
# Each directory must be seperated by a space.
|
||||||
|
# Use forward slashes for directory separators.
|
||||||
|
# For a directory that has spaces, enclose it in quotes.
|
||||||
|
EXTRAINCDIRS = $(LUFA_PATH)/
|
||||||
|
|
||||||
|
|
||||||
|
# Compiler flag to set the C Standard level.
|
||||||
|
# c89 = "ANSI" C
|
||||||
|
# gnu89 = c89 plus GCC extensions
|
||||||
|
# c99 = ISO C99 standard (not yet fully implemented)
|
||||||
|
# gnu99 = c99 plus GCC extensions
|
||||||
|
CSTANDARD = -std=gnu99
|
||||||
|
|
||||||
|
|
||||||
|
# Place -D or -U options here for C sources
|
||||||
|
CDEFS = -DF_CPU=$(F_CPU)UL
|
||||||
|
CDEFS += -DF_USB=$(F_USB)UL
|
||||||
|
CDEFS += -DBOARD=BOARD_$(BOARD)
|
||||||
|
CDEFS += -DARCH=ARCH_$(ARCH)
|
||||||
|
CDEFS += $(LUFA_OPTS)
|
||||||
|
|
||||||
|
|
||||||
|
# Place -D or -U options here for ASM sources
|
||||||
|
ADEFS = -DF_CPU=$(F_CPU)
|
||||||
|
ADEFS += -DF_USB=$(F_USB)UL
|
||||||
|
ADEFS += -DBOARD=BOARD_$(BOARD)
|
||||||
|
ADEFS += -DARCH=ARCH_$(ARCH)
|
||||||
|
ADEFS += $(LUFA_OPTS)
|
||||||
|
|
||||||
|
# Place -D or -U options here for C++ sources
|
||||||
|
CPPDEFS = -DF_CPU=$(F_CPU)UL
|
||||||
|
CPPDEFS += -DF_USB=$(F_USB)UL
|
||||||
|
CPPDEFS += -DBOARD=BOARD_$(BOARD)
|
||||||
|
CPPDEFS += -DARCH=ARCH_$(ARCH)
|
||||||
|
CPPDEFS += $(LUFA_OPTS)
|
||||||
|
|
||||||
|
|
||||||
|
# Debugging format.
|
||||||
|
# Native formats for AVR-GCC's -g are dwarf-2 [default] or stabs.
|
||||||
|
# AVR Studio 4.10 requires dwarf-2.
|
||||||
|
# AVR [Extended] COFF format requires stabs, plus an avr-objcopy run.
|
||||||
|
DEBUG = dwarf-2
|
||||||
|
|
||||||
|
|
||||||
|
#---------------- Compiler Options C ----------------
|
||||||
|
# -g*: generate debugging information
|
||||||
|
# -O*: optimization level
|
||||||
|
# -f...: tuning, see GCC manual and avr-libc documentation
|
||||||
|
# -Wall...: warning level
|
||||||
|
# -Wa,...: tell GCC to pass this to the assembler.
|
||||||
|
# -adhlns...: create assembler listing
|
||||||
|
CFLAGS = -g$(DEBUG)
|
||||||
|
CFLAGS += $(CDEFS)
|
||||||
|
CFLAGS += -O$(OPT)
|
||||||
|
CFLAGS += -funsigned-char
|
||||||
|
CFLAGS += -funsigned-bitfields
|
||||||
|
CFLAGS += -ffunction-sections
|
||||||
|
CFLAGS += -fno-inline-small-functions
|
||||||
|
CFLAGS += -fpack-struct
|
||||||
|
CFLAGS += -fshort-enums
|
||||||
|
CFLAGS += -fno-strict-aliasing
|
||||||
|
CFLAGS += -Wall
|
||||||
|
CFLAGS += -Wstrict-prototypes
|
||||||
|
CFLAGS += -Wa,-adhlns=$(<:%.c=$(OBJDIR)/%.lst)
|
||||||
|
CFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS))
|
||||||
|
CFLAGS += $(CSTANDARD)
|
||||||
|
|
||||||
|
|
||||||
|
#---------------- Compiler Options C++ ----------------
|
||||||
|
# -g*: generate debugging information
|
||||||
|
# -O*: optimization level
|
||||||
|
# -f...: tuning, see GCC manual and avr-libc documentation
|
||||||
|
# -Wall...: warning level
|
||||||
|
# -Wa,...: tell GCC to pass this to the assembler.
|
||||||
|
# -adhlns...: create assembler listing
|
||||||
|
CPPFLAGS = -g$(DEBUG)
|
||||||
|
CPPFLAGS += $(CPPDEFS)
|
||||||
|
CPPFLAGS += -O$(OPT)
|
||||||
|
CPPFLAGS += -funsigned-char
|
||||||
|
CPPFLAGS += -funsigned-bitfields
|
||||||
|
CPPFLAGS += -fpack-struct
|
||||||
|
CPPFLAGS += -fshort-enums
|
||||||
|
CPPFLAGS += -ffunction-sections
|
||||||
|
CPPFLAGS += -fno-strict-aliasing
|
||||||
|
CPPFLAGS += -fno-exceptions
|
||||||
|
CPPFLAGS += -Wall
|
||||||
|
CPPFLAGS += -Wundef
|
||||||
|
CPPFLAGS += -Wa,-adhlns=$(<:%.cpp=$(OBJDIR)/%.lst)
|
||||||
|
CPPFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS))
|
||||||
|
#CPPFLAGS += $(CSTANDARD)
|
||||||
|
|
||||||
|
|
||||||
|
#---------------- Assembler Options ----------------
|
||||||
|
# -Wa,...: tell GCC to pass this to the assembler.
|
||||||
|
# -adhlns: create listing
|
||||||
|
# -gstabs: have the assembler create line number information; note that
|
||||||
|
# for use in COFF files, additional information about filenames
|
||||||
|
# and function names needs to be present in the assembler source
|
||||||
|
# files -- see avr-libc docs [FIXME: not yet described there]
|
||||||
|
# -listing-cont-lines: Sets the maximum number of continuation lines of hex
|
||||||
|
# dump that will be displayed for a given single line of source input.
|
||||||
|
ASFLAGS = $(ADEFS) -Wa,-adhlns=$(<:%.S=$(OBJDIR)/%.lst),-gstabs,--listing-cont-lines=100
|
||||||
|
|
||||||
|
|
||||||
|
#---------------- Library Options ----------------
|
||||||
|
# Minimalistic printf version
|
||||||
|
PRINTF_LIB_MIN = -Wl,-u,vfprintf -lprintf_min
|
||||||
|
|
||||||
|
# Floating point printf version (requires MATH_LIB = -lm below)
|
||||||
|
PRINTF_LIB_FLOAT = -Wl,-u,vfprintf -lprintf_flt
|
||||||
|
|
||||||
|
# If this is left blank, then it will use the Standard printf version.
|
||||||
|
PRINTF_LIB =
|
||||||
|
#PRINTF_LIB = $(PRINTF_LIB_MIN)
|
||||||
|
#PRINTF_LIB = $(PRINTF_LIB_FLOAT)
|
||||||
|
|
||||||
|
|
||||||
|
# Minimalistic scanf version
|
||||||
|
SCANF_LIB_MIN = -Wl,-u,vfscanf -lscanf_min
|
||||||
|
|
||||||
|
# Floating point + %[ scanf version (requires MATH_LIB = -lm below)
|
||||||
|
SCANF_LIB_FLOAT = -Wl,-u,vfscanf -lscanf_flt
|
||||||
|
|
||||||
|
# If this is left blank, then it will use the Standard scanf version.
|
||||||
|
SCANF_LIB =
|
||||||
|
#SCANF_LIB = $(SCANF_LIB_MIN)
|
||||||
|
#SCANF_LIB = $(SCANF_LIB_FLOAT)
|
||||||
|
|
||||||
|
|
||||||
|
MATH_LIB = -lm
|
||||||
|
|
||||||
|
|
||||||
|
# List any extra directories to look for libraries here.
|
||||||
|
# Each directory must be seperated by a space.
|
||||||
|
# Use forward slashes for directory separators.
|
||||||
|
# For a directory that has spaces, enclose it in quotes.
|
||||||
|
EXTRALIBDIRS =
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#---------------- External Memory Options ----------------
|
||||||
|
|
||||||
|
# 64 KB of external RAM, starting after internal RAM (ATmega128!),
|
||||||
|
# used for variables (.data/.bss) and heap (malloc()).
|
||||||
|
#EXTMEMOPTS = -Wl,-Tdata=0x801100,--defsym=__heap_end=0x80ffff
|
||||||
|
|
||||||
|
# 64 KB of external RAM, starting after internal RAM (ATmega128!),
|
||||||
|
# only used for heap (malloc()).
|
||||||
|
#EXTMEMOPTS = -Wl,--section-start,.data=0x801100,--defsym=__heap_end=0x80ffff
|
||||||
|
|
||||||
|
EXTMEMOPTS =
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#---------------- Linker Options ----------------
|
||||||
|
# -Wl,...: tell GCC to pass this to linker.
|
||||||
|
# -Map: create map file
|
||||||
|
# --cref: add cross reference to map file
|
||||||
|
LDFLAGS = -Wl,-Map=$(TARGET).map,--cref
|
||||||
|
LDFLAGS += -Wl,--relax
|
||||||
|
LDFLAGS += -Wl,--gc-sections
|
||||||
|
LDFLAGS += $(EXTMEMOPTS)
|
||||||
|
LDFLAGS += $(patsubst %,-L%,$(EXTRALIBDIRS))
|
||||||
|
LDFLAGS += $(PRINTF_LIB) $(SCANF_LIB) $(MATH_LIB)
|
||||||
|
#LDFLAGS += -T linker_script.x
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#---------------- Programming Options (avrdude) ----------------
|
||||||
|
|
||||||
|
# Programming hardware
|
||||||
|
# Type: avrdude -c ?
|
||||||
|
# to get a full listing.
|
||||||
|
#
|
||||||
|
AVRDUDE_PROGRAMMER = jtagmkII
|
||||||
|
|
||||||
|
# com1 = serial port. Use lpt1 to connect to parallel port.
|
||||||
|
AVRDUDE_PORT = usb
|
||||||
|
|
||||||
|
AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex
|
||||||
|
#AVRDUDE_WRITE_EEPROM = -U eeprom:w:$(TARGET).eep
|
||||||
|
|
||||||
|
|
||||||
|
# Uncomment the following if you want avrdude's erase cycle counter.
|
||||||
|
# Note that this counter needs to be initialized first using -Yn,
|
||||||
|
# see avrdude manual.
|
||||||
|
#AVRDUDE_ERASE_COUNTER = -y
|
||||||
|
|
||||||
|
# Uncomment the following if you do /not/ wish a verification to be
|
||||||
|
# performed after programming the device.
|
||||||
|
#AVRDUDE_NO_VERIFY = -V
|
||||||
|
|
||||||
|
# Increase verbosity level. Please use this when submitting bug
|
||||||
|
# reports about avrdude. See <http://savannah.nongnu.org/projects/avrdude>
|
||||||
|
# to submit bug reports.
|
||||||
|
#AVRDUDE_VERBOSE = -v -v
|
||||||
|
|
||||||
|
AVRDUDE_FLAGS = -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER)
|
||||||
|
AVRDUDE_FLAGS += $(AVRDUDE_NO_VERIFY)
|
||||||
|
AVRDUDE_FLAGS += $(AVRDUDE_VERBOSE)
|
||||||
|
AVRDUDE_FLAGS += $(AVRDUDE_ERASE_COUNTER)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#---------------- Debugging Options ----------------
|
||||||
|
|
||||||
|
# For simulavr only - target MCU frequency.
|
||||||
|
DEBUG_MFREQ = $(F_CPU)
|
||||||
|
|
||||||
|
# Set the DEBUG_UI to either gdb or insight.
|
||||||
|
# DEBUG_UI = gdb
|
||||||
|
DEBUG_UI = insight
|
||||||
|
|
||||||
|
# Set the debugging back-end to either avarice, simulavr.
|
||||||
|
DEBUG_BACKEND = avarice
|
||||||
|
#DEBUG_BACKEND = simulavr
|
||||||
|
|
||||||
|
# GDB Init Filename.
|
||||||
|
GDBINIT_FILE = __avr_gdbinit
|
||||||
|
|
||||||
|
# When using avarice settings for the JTAG
|
||||||
|
JTAG_DEV = /dev/com1
|
||||||
|
|
||||||
|
# Debugging port used to communicate between GDB / avarice / simulavr.
|
||||||
|
DEBUG_PORT = 4242
|
||||||
|
|
||||||
|
# Debugging host used to communicate between GDB / avarice / simulavr, normally
|
||||||
|
# just set to localhost unless doing some sort of crazy debugging when
|
||||||
|
# avarice is running on a different computer.
|
||||||
|
DEBUG_HOST = localhost
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#============================================================================
|
||||||
|
|
||||||
|
|
||||||
|
# Define programs and commands.
|
||||||
|
SHELL = sh
|
||||||
|
CC = avr-gcc
|
||||||
|
OBJCOPY = avr-objcopy
|
||||||
|
OBJDUMP = avr-objdump
|
||||||
|
SIZE = avr-size
|
||||||
|
AR = avr-ar rcs
|
||||||
|
NM = avr-nm
|
||||||
|
AVRDUDE = avrdude
|
||||||
|
REMOVE = rm -f
|
||||||
|
REMOVEDIR = rm -rf
|
||||||
|
COPY = cp
|
||||||
|
WINSHELL = cmd
|
||||||
|
|
||||||
|
|
||||||
|
# Define Messages
|
||||||
|
# English
|
||||||
|
MSG_ERRORS_NONE = Errors: none
|
||||||
|
MSG_BEGIN = -------- begin --------
|
||||||
|
MSG_END = -------- end --------
|
||||||
|
MSG_SIZE_BEFORE = Size before:
|
||||||
|
MSG_SIZE_AFTER = Size after:
|
||||||
|
MSG_COFF = Converting to AVR COFF:
|
||||||
|
MSG_EXTENDED_COFF = Converting to AVR Extended COFF:
|
||||||
|
MSG_FLASH = Creating load file for Flash:
|
||||||
|
MSG_EEPROM = Creating load file for EEPROM:
|
||||||
|
MSG_EXTENDED_LISTING = Creating Extended Listing:
|
||||||
|
MSG_SYMBOL_TABLE = Creating Symbol Table:
|
||||||
|
MSG_LINKING = Linking:
|
||||||
|
MSG_COMPILING = Compiling C:
|
||||||
|
MSG_COMPILING_CPP = Compiling C++:
|
||||||
|
MSG_ASSEMBLING = Assembling:
|
||||||
|
MSG_CLEANING = Cleaning project:
|
||||||
|
MSG_CREATING_LIBRARY = Creating library:
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# Define all object files.
|
||||||
|
OBJ = $(SRC:%.c=$(OBJDIR)/%.o) $(CPPSRC:%.cpp=$(OBJDIR)/%.o) $(ASRC:%.S=$(OBJDIR)/%.o)
|
||||||
|
|
||||||
|
# Define all listing files.
|
||||||
|
LST = $(SRC:%.c=$(OBJDIR)/%.lst) $(CPPSRC:%.cpp=$(OBJDIR)/%.lst) $(ASRC:%.S=$(OBJDIR)/%.lst)
|
||||||
|
|
||||||
|
|
||||||
|
# Compiler flags to generate dependency files.
|
||||||
|
GENDEPFLAGS = -MMD -MP -MF .dep/$(@F).d
|
||||||
|
|
||||||
|
|
||||||
|
# Combine all necessary flags and optional flags.
|
||||||
|
# Add target processor to flags.
|
||||||
|
ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS) $(GENDEPFLAGS)
|
||||||
|
ALL_CPPFLAGS = -mmcu=$(MCU) -I. -x c++ $(CPPFLAGS) $(GENDEPFLAGS)
|
||||||
|
ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# Default target.
|
||||||
|
all: begin gccversion sizebefore build sizeafter end
|
||||||
|
|
||||||
|
# Change the build target to build a HEX file or a library.
|
||||||
|
build: elf hex eep lss sym
|
||||||
|
#build: lib
|
||||||
|
|
||||||
|
|
||||||
|
elf: $(TARGET).elf
|
||||||
|
hex: $(TARGET).hex
|
||||||
|
eep: $(TARGET).eep
|
||||||
|
lss: $(TARGET).lss
|
||||||
|
sym: $(TARGET).sym
|
||||||
|
LIBNAME=lib$(TARGET).a
|
||||||
|
lib: $(LIBNAME)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# Eye candy.
|
||||||
|
# AVR Studio 3.x does not check make's exit code but relies on
|
||||||
|
# the following magic strings to be generated by the compile job.
|
||||||
|
begin:
|
||||||
|
@echo
|
||||||
|
@echo $(MSG_BEGIN)
|
||||||
|
|
||||||
|
end:
|
||||||
|
@echo $(MSG_END)
|
||||||
|
@echo
|
||||||
|
|
||||||
|
|
||||||
|
# Display size of file.
|
||||||
|
HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex
|
||||||
|
ELFSIZE = $(SIZE) $(MCU_FLAG) $(FORMAT_FLAG) $(TARGET).elf
|
||||||
|
MCU_FLAG = $(shell $(SIZE) --help | grep -- --mcu > /dev/null && echo --mcu=$(MCU) )
|
||||||
|
FORMAT_FLAG = $(shell $(SIZE) --help | grep -- --format=.*avr > /dev/null && echo --format=avr )
|
||||||
|
|
||||||
|
|
||||||
|
sizebefore:
|
||||||
|
@if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_BEFORE); $(ELFSIZE); \
|
||||||
|
2>/dev/null; echo; fi
|
||||||
|
|
||||||
|
sizeafter:
|
||||||
|
@if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_AFTER); $(ELFSIZE); \
|
||||||
|
2>/dev/null; echo; fi
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# Display compiler version information.
|
||||||
|
gccversion :
|
||||||
|
@$(CC) --version
|
||||||
|
|
||||||
|
|
||||||
|
# Program the device.
|
||||||
|
program: $(TARGET).hex $(TARGET).eep
|
||||||
|
$(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM)
|
||||||
|
|
||||||
|
flip: $(TARGET).hex
|
||||||
|
batchisp -hardware usb -device $(MCU) -operation erase f
|
||||||
|
batchisp -hardware usb -device $(MCU) -operation loadbuffer $(TARGET).hex program
|
||||||
|
batchisp -hardware usb -device $(MCU) -operation start reset 0
|
||||||
|
|
||||||
|
dfu: $(TARGET).hex
|
||||||
|
dfu-programmer $(MCU) erase
|
||||||
|
dfu-programmer $(MCU) flash $(TARGET).hex
|
||||||
|
dfu-programmer $(MCU) reset
|
||||||
|
|
||||||
|
flip-ee: $(TARGET).hex $(TARGET).eep
|
||||||
|
$(COPY) $(TARGET).eep $(TARGET)eep.hex
|
||||||
|
batchisp -hardware usb -device $(MCU) -operation memory EEPROM erase
|
||||||
|
batchisp -hardware usb -device $(MCU) -operation memory EEPROM loadbuffer $(TARGET)eep.hex program
|
||||||
|
batchisp -hardware usb -device $(MCU) -operation start reset 0
|
||||||
|
$(REMOVE) $(TARGET)eep.hex
|
||||||
|
|
||||||
|
dfu-ee: $(TARGET).hex $(TARGET).eep
|
||||||
|
dfu-programmer $(MCU) eeprom-flash $(TARGET).eep
|
||||||
|
dfu-programmer $(MCU) reset
|
||||||
|
|
||||||
|
|
||||||
|
# Generate avr-gdb config/init file which does the following:
|
||||||
|
# define the reset signal, load the target file, connect to target, and set
|
||||||
|
# a breakpoint at main().
|
||||||
|
gdb-config:
|
||||||
|
@$(REMOVE) $(GDBINIT_FILE)
|
||||||
|
@echo define reset >> $(GDBINIT_FILE)
|
||||||
|
@echo SIGNAL SIGHUP >> $(GDBINIT_FILE)
|
||||||
|
@echo end >> $(GDBINIT_FILE)
|
||||||
|
@echo file $(TARGET).elf >> $(GDBINIT_FILE)
|
||||||
|
@echo target remote $(DEBUG_HOST):$(DEBUG_PORT) >> $(GDBINIT_FILE)
|
||||||
|
ifeq ($(DEBUG_BACKEND),simulavr)
|
||||||
|
@echo load >> $(GDBINIT_FILE)
|
||||||
|
endif
|
||||||
|
@echo break main >> $(GDBINIT_FILE)
|
||||||
|
|
||||||
|
debug: gdb-config $(TARGET).elf
|
||||||
|
ifeq ($(DEBUG_BACKEND), avarice)
|
||||||
|
@echo Starting AVaRICE - Press enter when "waiting to connect" message displays.
|
||||||
|
@$(WINSHELL) /c start avarice --jtag $(JTAG_DEV) --erase --program --file \
|
||||||
|
$(TARGET).elf $(DEBUG_HOST):$(DEBUG_PORT)
|
||||||
|
@$(WINSHELL) /c pause
|
||||||
|
|
||||||
|
else
|
||||||
|
@$(WINSHELL) /c start simulavr --gdbserver --device $(MCU) --clock-freq \
|
||||||
|
$(DEBUG_MFREQ) --port $(DEBUG_PORT)
|
||||||
|
endif
|
||||||
|
@$(WINSHELL) /c start avr-$(DEBUG_UI) --command=$(GDBINIT_FILE)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# Convert ELF to COFF for use in debugging / simulating in AVR Studio or VMLAB.
|
||||||
|
COFFCONVERT = $(OBJCOPY) --debugging
|
||||||
|
COFFCONVERT += --change-section-address .data-0x800000
|
||||||
|
COFFCONVERT += --change-section-address .bss-0x800000
|
||||||
|
COFFCONVERT += --change-section-address .noinit-0x800000
|
||||||
|
COFFCONVERT += --change-section-address .eeprom-0x810000
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
coff: $(TARGET).elf
|
||||||
|
@echo
|
||||||
|
@echo $(MSG_COFF) $(TARGET).cof
|
||||||
|
$(COFFCONVERT) -O coff-avr $< $(TARGET).cof
|
||||||
|
|
||||||
|
|
||||||
|
extcoff: $(TARGET).elf
|
||||||
|
@echo
|
||||||
|
@echo $(MSG_EXTENDED_COFF) $(TARGET).cof
|
||||||
|
$(COFFCONVERT) -O coff-ext-avr $< $(TARGET).cof
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# Create final output files (.hex, .eep) from ELF output file.
|
||||||
|
%.hex: %.elf
|
||||||
|
@echo
|
||||||
|
@echo $(MSG_FLASH) $@
|
||||||
|
$(OBJCOPY) -O $(FORMAT) -R .eeprom -R .fuse -R .lock -R .signature $< $@
|
||||||
|
|
||||||
|
%.eep: %.elf
|
||||||
|
@echo
|
||||||
|
@echo $(MSG_EEPROM) $@
|
||||||
|
-$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \
|
||||||
|
--change-section-lma .eeprom=0 --no-change-warnings -O $(FORMAT) $< $@ || exit 0
|
||||||
|
|
||||||
|
# Create extended listing file from ELF output file.
|
||||||
|
%.lss: %.elf
|
||||||
|
@echo
|
||||||
|
@echo $(MSG_EXTENDED_LISTING) $@
|
||||||
|
$(OBJDUMP) -h -S -z $< > $@
|
||||||
|
|
||||||
|
# Create a symbol table from ELF output file.
|
||||||
|
%.sym: %.elf
|
||||||
|
@echo
|
||||||
|
@echo $(MSG_SYMBOL_TABLE) $@
|
||||||
|
$(NM) -n $< > $@
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# Create library from object files.
|
||||||
|
.SECONDARY : $(TARGET).a
|
||||||
|
.PRECIOUS : $(OBJ)
|
||||||
|
%.a: $(OBJ)
|
||||||
|
@echo
|
||||||
|
@echo $(MSG_CREATING_LIBRARY) $@
|
||||||
|
$(AR) $@ $(OBJ)
|
||||||
|
|
||||||
|
|
||||||
|
# Link: create ELF output file from object files.
|
||||||
|
.SECONDARY : $(TARGET).elf
|
||||||
|
.PRECIOUS : $(OBJ)
|
||||||
|
%.elf: $(OBJ)
|
||||||
|
@echo
|
||||||
|
@echo $(MSG_LINKING) $@
|
||||||
|
$(CC) $(ALL_CFLAGS) $^ --output $@ $(LDFLAGS)
|
||||||
|
|
||||||
|
|
||||||
|
# Compile: create object files from C source files.
|
||||||
|
$(OBJDIR)/%.o : %.c
|
||||||
|
@echo
|
||||||
|
@echo $(MSG_COMPILING) $<
|
||||||
|
$(CC) -c $(ALL_CFLAGS) $< -o $@
|
||||||
|
|
||||||
|
|
||||||
|
# Compile: create object files from C++ source files.
|
||||||
|
$(OBJDIR)/%.o : %.cpp
|
||||||
|
@echo
|
||||||
|
@echo $(MSG_COMPILING_CPP) $<
|
||||||
|
$(CC) -c $(ALL_CPPFLAGS) $< -o $@
|
||||||
|
|
||||||
|
|
||||||
|
# Compile: create assembler files from C source files.
|
||||||
|
%.s : %.c
|
||||||
|
$(CC) -S $(ALL_CFLAGS) $< -o $@
|
||||||
|
|
||||||
|
|
||||||
|
# Compile: create assembler files from C++ source files.
|
||||||
|
%.s : %.cpp
|
||||||
|
$(CC) -S $(ALL_CPPFLAGS) $< -o $@
|
||||||
|
|
||||||
|
|
||||||
|
# Assemble: create object files from assembler source files.
|
||||||
|
$(OBJDIR)/%.o : %.S
|
||||||
|
@echo
|
||||||
|
@echo $(MSG_ASSEMBLING) $<
|
||||||
|
$(CC) -c $(ALL_ASFLAGS) $< -o $@
|
||||||
|
|
||||||
|
|
||||||
|
# Create preprocessed source for use in sending a bug report.
|
||||||
|
%.i : %.c
|
||||||
|
$(CC) -E -mmcu=$(MCU) -I. $(CFLAGS) $< -o $@
|
||||||
|
|
||||||
|
|
||||||
|
# Target: clean project.
|
||||||
|
clean: begin clean_list end
|
||||||
|
|
||||||
|
clean_list :
|
||||||
|
@echo
|
||||||
|
@echo $(MSG_CLEANING)
|
||||||
|
$(REMOVE) $(TARGET).hex
|
||||||
|
$(REMOVE) $(TARGET).eep
|
||||||
|
$(REMOVE) $(TARGET).cof
|
||||||
|
$(REMOVE) $(TARGET).elf
|
||||||
|
$(REMOVE) $(TARGET).map
|
||||||
|
$(REMOVE) $(TARGET).sym
|
||||||
|
$(REMOVE) $(TARGET).lss
|
||||||
|
$(REMOVE) $(SRC:%.c=$(OBJDIR)/%.o) $(CPPSRC:%.cpp=$(OBJDIR)/%.o) $(ASRC:%.S=$(OBJDIR)/%.o)
|
||||||
|
$(REMOVE) $(SRC:%.c=$(OBJDIR)/%.lst) $(CPPSRC:%.cpp=$(OBJDIR)/%.lst) $(ASRC:%.S=$(OBJDIR)/%.lst)
|
||||||
|
$(REMOVE) $(SRC:.c=.s)
|
||||||
|
$(REMOVE) $(SRC:.c=.d)
|
||||||
|
$(REMOVE) $(SRC:.c=.i)
|
||||||
|
$(REMOVEDIR) .dep
|
||||||
|
|
||||||
|
doxygen:
|
||||||
|
@echo Generating Project Documentation \($(TARGET)\)...
|
||||||
|
@if ( doxygen Doxygen.conf 2>&1 | grep -v "warning: ignoring unsupported tag" ;); then \
|
||||||
|
exit 1; \
|
||||||
|
fi;
|
||||||
|
@echo Documentation Generation Complete.
|
||||||
|
|
||||||
|
clean_doxygen:
|
||||||
|
rm -rf Documentation
|
||||||
|
|
||||||
|
checksource:
|
||||||
|
@for f in $(SRC) $(CPPSRC) $(ASRC); do \
|
||||||
|
if [ -f $$f ]; then \
|
||||||
|
echo "Found Source File: $$f" ; \
|
||||||
|
else \
|
||||||
|
echo "Source File Not Found: $$f" ; \
|
||||||
|
fi; done
|
||||||
|
|
||||||
|
|
||||||
|
# Create object files directory
|
||||||
|
$(shell mkdir $(OBJDIR) 2>/dev/null)
|
||||||
|
|
||||||
|
|
||||||
|
# Include the dependency files.
|
||||||
|
-include $(shell mkdir .dep 2>/dev/null) $(wildcard .dep/*)
|
||||||
|
|
||||||
|
|
||||||
|
# Listing of phony targets.
|
||||||
|
.PHONY : all begin finish end sizebefore sizeafter gccversion \
|
||||||
|
build elf hex eep lss sym coff extcoff doxygen clean \
|
||||||
|
clean_list clean_doxygen program dfu flip flip-ee dfu-ee \
|
||||||
|
debug gdb-config checksource
|
|
@ -15,7 +15,7 @@
|
||||||
|
|
||||||
# List of device families per architecture, one device per architecture sub-family
|
# List of device families per architecture, one device per architecture sub-family
|
||||||
AVR8_FAMILIES = at90usb1287 at90usb1286 atmega16u4 atmega16u2 at90usb162
|
AVR8_FAMILIES = at90usb1287 at90usb1286 atmega16u4 atmega16u2 at90usb162
|
||||||
XMEGA_FAMILIES = atxmega128a1u atxmega128a3u atxmega256a3bu atxmega128a4u atxmega128b1 atxmega128b3
|
XMEGA_FAMILIES = atxmega128a1u atxmega128a3u atxmega256a3bu atxmega128a4u atxmega128b1 atxmega128b3 atxmega128c3 atxmega32c4
|
||||||
UC3_FAMILIES = uc3a0256 uc3a1256 uc3a3256 uc3a4256 uc3b0256 uc3b1256
|
UC3_FAMILIES = uc3a0256 uc3a1256 uc3a3256 uc3a4256 uc3b0256 uc3b1256
|
||||||
|
|
||||||
# List of all device families, with a family postfix
|
# List of all device families, with a family postfix
|
||||||
|
@ -24,6 +24,10 @@ DEVICE_FAMILIES = $(AVR8_FAMILIES:%=%.avr8) $(XMEGA_FAMILIES:%=%.xmega) $(UC3_FA
|
||||||
|
|
||||||
all: begin $(DEVICE_FAMILIES) clean end
|
all: begin $(DEVICE_FAMILIES) clean end
|
||||||
|
|
||||||
|
arch_avr8: begin $(AVR8_FAMILIES:%=%.avr8) end
|
||||||
|
arch_xmega: begin $(XMEGA_FAMILIES:%=%.xmega) end
|
||||||
|
arch_uc3: begin $(UC3_FAMILIES:%=%.uc3) end
|
||||||
|
|
||||||
begin:
|
begin:
|
||||||
@echo Executing build test "ModuleTest".
|
@echo Executing build test "ModuleTest".
|
||||||
@echo
|
@echo
|
||||||
|
@ -33,21 +37,21 @@ end:
|
||||||
@echo
|
@echo
|
||||||
|
|
||||||
%.avr8:
|
%.avr8:
|
||||||
$(MAKE) -f makefile.avr8 clean -s
|
$(MAKE) -s -f makefile.avr8 clean
|
||||||
$(MAKE) -f makefile.avr8 all MCU=$(@:%.avr8=%) -s
|
$(MAKE) -s -f makefile.avr8 all MCU=$(@:%.avr8=%) elf
|
||||||
|
|
||||||
%.xmega:
|
%.xmega:
|
||||||
$(MAKE) -f makefile.xmega clean -s
|
$(MAKE) -s -f makefile.xmega clean
|
||||||
$(MAKE) -f makefile.xmega all MCU=$(@:%.xmega=%) -s
|
$(MAKE) -s -f makefile.xmega all MCU=$(@:%.xmega=%) elf
|
||||||
|
|
||||||
%.uc3:
|
%.uc3:
|
||||||
$(MAKE) -f makefile.uc3 clean -s
|
$(MAKE) -s -f makefile.uc3 clean
|
||||||
$(MAKE) -f makefile.uc3 all MCU=$(@:%.uc3=%) -s
|
$(MAKE) -s -f makefile.uc3 all MCU=$(@:%.uc3=%) elf
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
$(MAKE) -f makefile.avr8 clean -s
|
$(MAKE) -s -f makefile.avr8 clean
|
||||||
$(MAKE) -f makefile.xmega clean -s
|
$(MAKE) -s -f makefile.xmega clean
|
||||||
$(MAKE) -f makefile.uc3 clean -s
|
$(MAKE) -s -f makefile.uc3 clean
|
||||||
|
|
||||||
%:
|
%:
|
||||||
|
|
|
@ -23,23 +23,23 @@ end:
|
||||||
@echo
|
@echo
|
||||||
|
|
||||||
compile:
|
compile:
|
||||||
$(MAKE) -f makefile.avr8 clean -s
|
$(MAKE) -s -f makefile.avr8 clean
|
||||||
$(MAKE) -f makefile.avr8 LUFA_OPTS='-D USB_DEVICE_ONLY' -s
|
$(MAKE) -s -f makefile.avr8 LUFA_OPTS='-D USB_DEVICE_ONLY' elf
|
||||||
$(MAKE) -f makefile.avr8 clean -s
|
$(MAKE) -s -f makefile.avr8 clean
|
||||||
$(MAKE) -f makefile.avr8 LUFA_OPTS='-D USB_HOST_ONLY' -s
|
$(MAKE) -s -f makefile.avr8 LUFA_OPTS='-D USB_HOST_ONLY' elf
|
||||||
|
|
||||||
$(MAKE) -f makefile.xmega clean -s
|
$(MAKE) -s -f makefile.xmega clean
|
||||||
$(MAKE) -f makefile.xmega LUFA_OPTS='-D USB_DEVICE_ONLY' -s
|
$(MAKE) -s -f makefile.xmega LUFA_OPTS='-D USB_DEVICE_ONLY' elf
|
||||||
|
|
||||||
$(MAKE) -f makefile.uc3 clean -s
|
$(MAKE) -s -f makefile.uc3 clean
|
||||||
$(MAKE) -f makefile.uc3 LUFA_OPTS='-D USB_DEVICE_ONLY' -s
|
$(MAKE) -s -f makefile.uc3 LUFA_OPTS='-D USB_DEVICE_ONLY' elf
|
||||||
$(MAKE) -f makefile.uc3 clean -s
|
$(MAKE) -s -f makefile.uc3 clean
|
||||||
$(MAKE) -f makefile.uc3 LUFA_OPTS='-D USB_HOST_ONLY' -s
|
$(MAKE) -s -f makefile.uc3 LUFA_OPTS='-D USB_HOST_ONLY' elf
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
$(MAKE) -f makefile.avr8 clean -s
|
$(MAKE) -s -f makefile.avr8 clean
|
||||||
$(MAKE) -f makefile.xmega clean -s
|
$(MAKE) -s -f makefile.xmega clean
|
||||||
$(MAKE) -f makefile.uc3 clean -s
|
$(MAKE) -s -f makefile.uc3 clean
|
||||||
|
|
||||||
%:
|
%:
|
||||||
|
|
|
@ -24,7 +24,8 @@ SUPPRESS_WARNINGS = variableScope \
|
||||||
missingInclude
|
missingInclude
|
||||||
|
|
||||||
# Extra paths to search for include files
|
# Extra paths to search for include files
|
||||||
INCLUDE_PATHS = $(LUFA_ROOT_PATH)/LUFA/CodeTemplates/
|
INCLUDE_PATHS = $(LUFA_ROOT_PATH)/LUFA/CodeTemplates/ \
|
||||||
|
$(LUFA_ROOT_PATH)/Projects/AVRISP-MKII/
|
||||||
|
|
||||||
# Configuration options to pass to cppcheck
|
# Configuration options to pass to cppcheck
|
||||||
CPPCHECK_OPTIONS = --template=$(MESSAGE_TEMPLATE) $(INCLUDE_PATHS:%=-I%) $(EXCLUDE_LIST:%=-i%) --inline-suppr --force --error-exitcode=1 --std=c99
|
CPPCHECK_OPTIONS = --template=$(MESSAGE_TEMPLATE) $(INCLUDE_PATHS:%=-I%) $(EXCLUDE_LIST:%=-i%) --inline-suppr --force --error-exitcode=1 --std=c99
|
||||||
|
|
|
@ -11,11 +11,8 @@
|
||||||
# not intended to be modified or compiled by non-developers.
|
# not intended to be modified or compiled by non-developers.
|
||||||
|
|
||||||
all:
|
all:
|
||||||
$(MAKE) -C ModuleTest all
|
|
||||||
$(MAKE) -C SingleUSBModeTest all
|
|
||||||
$(MAKE) -C StaticAnalysisTest all
|
|
||||||
|
|
||||||
%:
|
%:
|
||||||
|
$(MAKE) -C BoardDriverTest $@
|
||||||
$(MAKE) -C ModuleTest $@
|
$(MAKE) -C ModuleTest $@
|
||||||
$(MAKE) -C SingleUSBModeTest $@
|
$(MAKE) -C SingleUSBModeTest $@
|
||||||
$(MAKE) -C StaticAnalysisTest $@
|
$(MAKE) -C StaticAnalysisTest $@
|
||||||
|
|
|
@ -46,9 +46,12 @@ USB_ClassInfo_Audio_Device_t Microphone_Audio_Interface =
|
||||||
{
|
{
|
||||||
.ControlInterfaceNumber = 0,
|
.ControlInterfaceNumber = 0,
|
||||||
.StreamingInterfaceNumber = 1,
|
.StreamingInterfaceNumber = 1,
|
||||||
|
.DataINEndpoint =
|
||||||
.DataINEndpointNumber = AUDIO_STREAM_EPNUM,
|
{
|
||||||
.DataINEndpointSize = AUDIO_STREAM_EPSIZE,
|
.Address = AUDIO_STREAM_EPADDR,
|
||||||
|
.Size = AUDIO_STREAM_EPSIZE,
|
||||||
|
.Banks = 2,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -197,7 +200,7 @@ bool CALLBACK_Audio_Device_GetSetEndpointProperty(USB_ClassInfo_Audio_Device_t*
|
||||||
uint8_t* Data)
|
uint8_t* Data)
|
||||||
{
|
{
|
||||||
/* Check the requested endpoint to see if a supported endpoint is being manipulated */
|
/* Check the requested endpoint to see if a supported endpoint is being manipulated */
|
||||||
if (EndpointAddress == (ENDPOINT_DIR_IN | Microphone_Audio_Interface.Config.DataINEndpointNumber))
|
if (EndpointAddress == Microphone_Audio_Interface.Config.DataINEndpoint.Address)
|
||||||
{
|
{
|
||||||
/* Check the requested control to see if a supported control is being manipulated */
|
/* Check the requested control to see if a supported control is being manipulated */
|
||||||
if (EndpointControl == AUDIO_EPCONTROL_SamplingFreq)
|
if (EndpointControl == AUDIO_EPCONTROL_SamplingFreq)
|
||||||
|
|
|
@ -220,7 +220,7 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
|
||||||
{
|
{
|
||||||
.Header = {.Size = sizeof(USB_Audio_Descriptor_StreamEndpoint_Std_t), .Type = DTYPE_Endpoint},
|
.Header = {.Size = sizeof(USB_Audio_Descriptor_StreamEndpoint_Std_t), .Type = DTYPE_Endpoint},
|
||||||
|
|
||||||
.EndpointAddress = (ENDPOINT_DIR_IN | AUDIO_STREAM_EPNUM),
|
.EndpointAddress = AUDIO_STREAM_EPADDR,
|
||||||
.Attributes = (EP_TYPE_ISOCHRONOUS | ENDPOINT_ATTR_SYNC | ENDPOINT_USAGE_DATA),
|
.Attributes = (EP_TYPE_ISOCHRONOUS | ENDPOINT_ATTR_SYNC | ENDPOINT_USAGE_DATA),
|
||||||
.EndpointSize = AUDIO_STREAM_EPSIZE,
|
.EndpointSize = AUDIO_STREAM_EPSIZE,
|
||||||
.PollingIntervalMS = 0x01
|
.PollingIntervalMS = 0x01
|
||||||
|
|
|
@ -42,14 +42,11 @@
|
||||||
#include <avr/pgmspace.h>
|
#include <avr/pgmspace.h>
|
||||||
|
|
||||||
/* Macros: */
|
/* Macros: */
|
||||||
/** Endpoint number of the Audio isochronous streaming data endpoint. */
|
/** Endpoint address of the Audio isochronous streaming data IN endpoint. */
|
||||||
#define AUDIO_STREAM_EPNUM 1
|
#define AUDIO_STREAM_EPADDR (ENDPOINT_DIR_IN | 1)
|
||||||
|
|
||||||
/** Endpoint size in bytes of the Audio isochronous streaming data endpoint. The Windows audio stack requires
|
/** Endpoint size in bytes of the Audio isochronous streaming data endpoint. */
|
||||||
* at least 192 bytes for correct output, thus the smaller 128 byte maximum endpoint size on some of the smaller
|
#define AUDIO_STREAM_EPSIZE 256
|
||||||
* USB AVR models will result in unavoidable distorted output.
|
|
||||||
*/
|
|
||||||
#define AUDIO_STREAM_EPSIZE ENDPOINT_MAX_SIZE(AUDIO_STREAM_EPNUM)
|
|
||||||
|
|
||||||
/* Type Defines: */
|
/* Type Defines: */
|
||||||
/** Type define for the device configuration descriptor structure. This must be defined in the
|
/** Type define for the device configuration descriptor structure. This must be defined in the
|
||||||
|
|
|
@ -46,9 +46,12 @@ USB_ClassInfo_Audio_Device_t Speaker_Audio_Interface =
|
||||||
{
|
{
|
||||||
.ControlInterfaceNumber = 0,
|
.ControlInterfaceNumber = 0,
|
||||||
.StreamingInterfaceNumber = 1,
|
.StreamingInterfaceNumber = 1,
|
||||||
|
.DataOUTEndpoint =
|
||||||
.DataOUTEndpointNumber = AUDIO_STREAM_EPNUM,
|
{
|
||||||
.DataOUTEndpointSize = AUDIO_STREAM_EPSIZE,
|
.Address = AUDIO_STREAM_EPADDR,
|
||||||
|
.Size = AUDIO_STREAM_EPSIZE,
|
||||||
|
.Banks = 2,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -234,7 +237,7 @@ bool CALLBACK_Audio_Device_GetSetEndpointProperty(USB_ClassInfo_Audio_Device_t*
|
||||||
uint8_t* Data)
|
uint8_t* Data)
|
||||||
{
|
{
|
||||||
/* Check the requested endpoint to see if a supported endpoint is being manipulated */
|
/* Check the requested endpoint to see if a supported endpoint is being manipulated */
|
||||||
if (EndpointAddress == (ENDPOINT_DIR_OUT | Speaker_Audio_Interface.Config.DataOUTEndpointNumber))
|
if (EndpointAddress == Speaker_Audio_Interface.Config.DataOUTEndpoint.Address)
|
||||||
{
|
{
|
||||||
/* Check the requested control to see if a supported control is being manipulated */
|
/* Check the requested control to see if a supported control is being manipulated */
|
||||||
if (EndpointControl == AUDIO_EPCONTROL_SamplingFreq)
|
if (EndpointControl == AUDIO_EPCONTROL_SamplingFreq)
|
||||||
|
|
|
@ -220,7 +220,7 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
|
||||||
{
|
{
|
||||||
.Header = {.Size = sizeof(USB_Audio_Descriptor_StreamEndpoint_Std_t), .Type = DTYPE_Endpoint},
|
.Header = {.Size = sizeof(USB_Audio_Descriptor_StreamEndpoint_Std_t), .Type = DTYPE_Endpoint},
|
||||||
|
|
||||||
.EndpointAddress = (ENDPOINT_DIR_OUT | AUDIO_STREAM_EPNUM),
|
.EndpointAddress = AUDIO_STREAM_EPADDR,
|
||||||
.Attributes = (EP_TYPE_ISOCHRONOUS | ENDPOINT_ATTR_SYNC | ENDPOINT_USAGE_DATA),
|
.Attributes = (EP_TYPE_ISOCHRONOUS | ENDPOINT_ATTR_SYNC | ENDPOINT_USAGE_DATA),
|
||||||
.EndpointSize = AUDIO_STREAM_EPSIZE,
|
.EndpointSize = AUDIO_STREAM_EPSIZE,
|
||||||
.PollingIntervalMS = 0x01
|
.PollingIntervalMS = 0x01
|
||||||
|
|
|
@ -42,14 +42,11 @@
|
||||||
#include <avr/pgmspace.h>
|
#include <avr/pgmspace.h>
|
||||||
|
|
||||||
/* Macros: */
|
/* Macros: */
|
||||||
/** Endpoint number of the Audio isochronous streaming data endpoint. */
|
/** Endpoint address of the Audio isochronous streaming data OUT endpoint. */
|
||||||
#define AUDIO_STREAM_EPNUM 1
|
#define AUDIO_STREAM_EPADDR (ENDPOINT_DIR_OUT | 1)
|
||||||
|
|
||||||
/** Endpoint size in bytes of the Audio isochronous streaming data endpoint. The Windows audio stack requires
|
/** Endpoint size in bytes of the Audio isochronous streaming data endpoint. */
|
||||||
* at least 192 bytes for correct output, thus the smaller 128 byte maximum endpoint size on some of the smaller
|
#define AUDIO_STREAM_EPSIZE 256
|
||||||
* USB AVR models will result in unavoidable distorted output.
|
|
||||||
*/
|
|
||||||
#define AUDIO_STREAM_EPSIZE ENDPOINT_MAX_SIZE(AUDIO_STREAM_EPNUM)
|
|
||||||
|
|
||||||
/* Type Defines: */
|
/* Type Defines: */
|
||||||
/** Type define for the device configuration descriptor structure. This must be defined in the
|
/** Type define for the device configuration descriptor structure. This must be defined in the
|
||||||
|
|
|
@ -157,7 +157,7 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
|
||||||
{
|
{
|
||||||
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
|
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
|
||||||
|
|
||||||
.EndpointAddress = (ENDPOINT_DIR_IN | CDC1_NOTIFICATION_EPNUM),
|
.EndpointAddress = CDC1_NOTIFICATION_EPADDR,
|
||||||
.Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
|
.Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
|
||||||
.EndpointSize = CDC_NOTIFICATION_EPSIZE,
|
.EndpointSize = CDC_NOTIFICATION_EPSIZE,
|
||||||
.PollingIntervalMS = 0xFF
|
.PollingIntervalMS = 0xFF
|
||||||
|
@ -183,20 +183,20 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
|
||||||
{
|
{
|
||||||
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
|
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
|
||||||
|
|
||||||
.EndpointAddress = (ENDPOINT_DIR_OUT | CDC1_RX_EPNUM),
|
.EndpointAddress = CDC1_RX_EPADDR,
|
||||||
.Attributes = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
|
.Attributes = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
|
||||||
.EndpointSize = CDC_TXRX_EPSIZE,
|
.EndpointSize = CDC_TXRX_EPSIZE,
|
||||||
.PollingIntervalMS = 0x01
|
.PollingIntervalMS = 0x05
|
||||||
},
|
},
|
||||||
|
|
||||||
.CDC1_DataInEndpoint =
|
.CDC1_DataInEndpoint =
|
||||||
{
|
{
|
||||||
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
|
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
|
||||||
|
|
||||||
.EndpointAddress = (ENDPOINT_DIR_IN | CDC1_TX_EPNUM),
|
.EndpointAddress = CDC1_TX_EPADDR,
|
||||||
.Attributes = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
|
.Attributes = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
|
||||||
.EndpointSize = CDC_TXRX_EPSIZE,
|
.EndpointSize = CDC_TXRX_EPSIZE,
|
||||||
.PollingIntervalMS = 0x01
|
.PollingIntervalMS = 0x05
|
||||||
},
|
},
|
||||||
|
|
||||||
.CDC2_IAD =
|
.CDC2_IAD =
|
||||||
|
@ -258,7 +258,7 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
|
||||||
{
|
{
|
||||||
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
|
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
|
||||||
|
|
||||||
.EndpointAddress = (ENDPOINT_DIR_IN | CDC2_NOTIFICATION_EPNUM),
|
.EndpointAddress = CDC2_NOTIFICATION_EPADDR,
|
||||||
.Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
|
.Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
|
||||||
.EndpointSize = CDC_NOTIFICATION_EPSIZE,
|
.EndpointSize = CDC_NOTIFICATION_EPSIZE,
|
||||||
.PollingIntervalMS = 0xFF
|
.PollingIntervalMS = 0xFF
|
||||||
|
@ -284,20 +284,20 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
|
||||||
{
|
{
|
||||||
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
|
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
|
||||||
|
|
||||||
.EndpointAddress = (ENDPOINT_DIR_OUT | CDC2_RX_EPNUM),
|
.EndpointAddress = CDC2_RX_EPADDR,
|
||||||
.Attributes = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
|
.Attributes = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
|
||||||
.EndpointSize = CDC_TXRX_EPSIZE,
|
.EndpointSize = CDC_TXRX_EPSIZE,
|
||||||
.PollingIntervalMS = 0x01
|
.PollingIntervalMS = 0x05
|
||||||
},
|
},
|
||||||
|
|
||||||
.CDC2_DataInEndpoint =
|
.CDC2_DataInEndpoint =
|
||||||
{
|
{
|
||||||
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
|
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
|
||||||
|
|
||||||
.EndpointAddress = (ENDPOINT_DIR_IN | CDC2_TX_EPNUM),
|
.EndpointAddress = CDC2_TX_EPADDR,
|
||||||
.Attributes = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
|
.Attributes = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
|
||||||
.EndpointSize = CDC_TXRX_EPSIZE,
|
.EndpointSize = CDC_TXRX_EPSIZE,
|
||||||
.PollingIntervalMS = 0x01
|
.PollingIntervalMS = 0x05
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -42,23 +42,23 @@
|
||||||
#include <LUFA/Drivers/USB/USB.h>
|
#include <LUFA/Drivers/USB/USB.h>
|
||||||
|
|
||||||
/* Macros: */
|
/* Macros: */
|
||||||
/** Endpoint number of the first CDC interface's device-to-host data IN endpoint. */
|
/** Endpoint address of the first CDC interface's device-to-host data IN endpoint. */
|
||||||
#define CDC1_TX_EPNUM 1
|
#define CDC1_TX_EPADDR (ENDPOINT_DIR_IN | 1)
|
||||||
|
|
||||||
/** Endpoint number of the first CDC interface's host-to-device data OUT endpoint. */
|
/** Endpoint address of the first CDC interface's host-to-device data OUT endpoint. */
|
||||||
#define CDC1_RX_EPNUM 2
|
#define CDC1_RX_EPADDR (ENDPOINT_DIR_OUT | 2)
|
||||||
|
|
||||||
/** Endpoint number of the first CDC interface's device-to-host notification IN endpoint. */
|
/** Endpoint address of the first CDC interface's device-to-host notification IN endpoint. */
|
||||||
#define CDC1_NOTIFICATION_EPNUM 3
|
#define CDC1_NOTIFICATION_EPADDR (ENDPOINT_DIR_IN | 3)
|
||||||
|
|
||||||
/** Endpoint number of the second CDC interface's device-to-host data IN endpoint. */
|
/** Endpoint address of the second CDC interface's device-to-host data IN endpoint. */
|
||||||
#define CDC2_TX_EPNUM 4
|
#define CDC2_TX_EPADDR (ENDPOINT_DIR_IN | 4)
|
||||||
|
|
||||||
/** Endpoint number of the second CDC interface's host-to-device data OUT endpoint. */
|
/** Endpoint address of the second CDC interface's host-to-device data OUT endpoint. */
|
||||||
#define CDC2_RX_EPNUM 5
|
#define CDC2_RX_EPADDR (ENDPOINT_DIR_OUT | 5)
|
||||||
|
|
||||||
/** Endpoint number of the second CDC interface's device-to-host notification IN endpoint. */
|
/** Endpoint address of the second CDC interface's device-to-host notification IN endpoint. */
|
||||||
#define CDC2_NOTIFICATION_EPNUM 6
|
#define CDC2_NOTIFICATION_EPADDR (ENDPOINT_DIR_IN | 6)
|
||||||
|
|
||||||
/** Size in bytes of the CDC device-to-host notification IN endpoints. */
|
/** Size in bytes of the CDC device-to-host notification IN endpoints. */
|
||||||
#define CDC_NOTIFICATION_EPSIZE 8
|
#define CDC_NOTIFICATION_EPSIZE 8
|
||||||
|
|
|
@ -45,19 +45,25 @@ USB_ClassInfo_CDC_Device_t VirtualSerial1_CDC_Interface =
|
||||||
{
|
{
|
||||||
.Config =
|
.Config =
|
||||||
{
|
{
|
||||||
.ControlInterfaceNumber = 0,
|
.ControlInterfaceNumber = 0,
|
||||||
|
.DataINEndpoint =
|
||||||
.DataINEndpointNumber = CDC1_TX_EPNUM,
|
{
|
||||||
.DataINEndpointSize = CDC_TXRX_EPSIZE,
|
.Address = CDC1_TX_EPADDR,
|
||||||
.DataINEndpointDoubleBank = false,
|
.Size = CDC_TXRX_EPSIZE,
|
||||||
|
.Banks = 1,
|
||||||
.DataOUTEndpointNumber = CDC1_RX_EPNUM,
|
},
|
||||||
.DataOUTEndpointSize = CDC_TXRX_EPSIZE,
|
.DataOUTEndpoint =
|
||||||
.DataOUTEndpointDoubleBank = false,
|
{
|
||||||
|
.Address = CDC1_RX_EPADDR,
|
||||||
.NotificationEndpointNumber = CDC1_NOTIFICATION_EPNUM,
|
.Size = CDC_TXRX_EPSIZE,
|
||||||
.NotificationEndpointSize = CDC_NOTIFICATION_EPSIZE,
|
.Banks = 1,
|
||||||
.NotificationEndpointDoubleBank = false,
|
},
|
||||||
|
.NotificationEndpoint =
|
||||||
|
{
|
||||||
|
.Address = CDC1_NOTIFICATION_EPADDR,
|
||||||
|
.Size = CDC_NOTIFICATION_EPSIZE,
|
||||||
|
.Banks = 1,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -70,19 +76,26 @@ USB_ClassInfo_CDC_Device_t VirtualSerial2_CDC_Interface =
|
||||||
{
|
{
|
||||||
.Config =
|
.Config =
|
||||||
{
|
{
|
||||||
.ControlInterfaceNumber = 2,
|
.ControlInterfaceNumber = 2,
|
||||||
|
.DataINEndpoint =
|
||||||
|
{
|
||||||
|
.Address = CDC2_TX_EPADDR,
|
||||||
|
.Size = CDC_TXRX_EPSIZE,
|
||||||
|
.Banks = 1,
|
||||||
|
},
|
||||||
|
.DataOUTEndpoint =
|
||||||
|
{
|
||||||
|
.Address = CDC2_RX_EPADDR,
|
||||||
|
.Size = CDC_TXRX_EPSIZE,
|
||||||
|
.Banks = 1,
|
||||||
|
},
|
||||||
|
.NotificationEndpoint =
|
||||||
|
{
|
||||||
|
.Address = CDC2_NOTIFICATION_EPADDR,
|
||||||
|
.Size = CDC_NOTIFICATION_EPSIZE,
|
||||||
|
.Banks = 1,
|
||||||
|
},
|
||||||
|
|
||||||
.DataINEndpointNumber = CDC2_TX_EPNUM,
|
|
||||||
.DataINEndpointSize = CDC_TXRX_EPSIZE,
|
|
||||||
.DataINEndpointDoubleBank = false,
|
|
||||||
|
|
||||||
.DataOUTEndpointNumber = CDC2_RX_EPNUM,
|
|
||||||
.DataOUTEndpointSize = CDC_TXRX_EPSIZE,
|
|
||||||
.DataOUTEndpointDoubleBank = false,
|
|
||||||
|
|
||||||
.NotificationEndpointNumber = CDC2_NOTIFICATION_EPNUM,
|
|
||||||
.NotificationEndpointSize = CDC_NOTIFICATION_EPSIZE,
|
|
||||||
.NotificationEndpointDoubleBank = false,
|
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -135,10 +135,10 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
|
||||||
{
|
{
|
||||||
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
|
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
|
||||||
|
|
||||||
.EndpointAddress = (ENDPOINT_DIR_IN | GENERIC_IN_EPNUM),
|
.EndpointAddress = GENERIC_IN_EPADDR,
|
||||||
.Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
|
.Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
|
||||||
.EndpointSize = GENERIC_EPSIZE,
|
.EndpointSize = GENERIC_EPSIZE,
|
||||||
.PollingIntervalMS = 0x01
|
.PollingIntervalMS = 0x05
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -57,8 +57,8 @@
|
||||||
} USB_Descriptor_Configuration_t;
|
} USB_Descriptor_Configuration_t;
|
||||||
|
|
||||||
/* Macros: */
|
/* Macros: */
|
||||||
/** Endpoint number of the Generic HID reporting IN endpoint. */
|
/** Endpoint address of the Generic HID reporting IN endpoint. */
|
||||||
#define GENERIC_IN_EPNUM 1
|
#define GENERIC_IN_EPADDR (ENDPOINT_DIR_IN | 1)
|
||||||
|
|
||||||
/** Size in bytes of the Generic HID reporting endpoint. */
|
/** Size in bytes of the Generic HID reporting endpoint. */
|
||||||
#define GENERIC_EPSIZE 8
|
#define GENERIC_EPSIZE 8
|
||||||
|
|
|
@ -48,11 +48,12 @@ USB_ClassInfo_HID_Device_t Generic_HID_Interface =
|
||||||
.Config =
|
.Config =
|
||||||
{
|
{
|
||||||
.InterfaceNumber = 0,
|
.InterfaceNumber = 0,
|
||||||
|
.ReportINEndpoint =
|
||||||
.ReportINEndpointNumber = GENERIC_IN_EPNUM,
|
{
|
||||||
.ReportINEndpointSize = GENERIC_EPSIZE,
|
.Address = GENERIC_IN_EPADDR,
|
||||||
.ReportINEndpointDoubleBank = false,
|
.Size = GENERIC_EPSIZE,
|
||||||
|
.Banks = 1,
|
||||||
|
},
|
||||||
.PrevReportINBuffer = PrevHIDReportBuffer,
|
.PrevReportINBuffer = PrevHIDReportBuffer,
|
||||||
.PrevReportINBufferSize = sizeof(PrevHIDReportBuffer),
|
.PrevReportINBufferSize = sizeof(PrevHIDReportBuffer),
|
||||||
},
|
},
|
||||||
|
|
|
@ -135,10 +135,10 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
|
||||||
{
|
{
|
||||||
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
|
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
|
||||||
|
|
||||||
.EndpointAddress = (ENDPOINT_DIR_IN | JOYSTICK_EPNUM),
|
.EndpointAddress = JOYSTICK_EPADDR,
|
||||||
.Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
|
.Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
|
||||||
.EndpointSize = JOYSTICK_EPSIZE,
|
.EndpointSize = JOYSTICK_EPSIZE,
|
||||||
.PollingIntervalMS = 0x01
|
.PollingIntervalMS = 0x05
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -57,8 +57,8 @@
|
||||||
} USB_Descriptor_Configuration_t;
|
} USB_Descriptor_Configuration_t;
|
||||||
|
|
||||||
/* Macros: */
|
/* Macros: */
|
||||||
/** Endpoint number of the Joystick HID reporting IN endpoint. */
|
/** Endpoint address of the Joystick HID reporting IN endpoint. */
|
||||||
#define JOYSTICK_EPNUM 1
|
#define JOYSTICK_EPADDR (ENDPOINT_DIR_IN | 1)
|
||||||
|
|
||||||
/** Size in bytes of the Joystick HID reporting IN endpoint. */
|
/** Size in bytes of the Joystick HID reporting IN endpoint. */
|
||||||
#define JOYSTICK_EPSIZE 8
|
#define JOYSTICK_EPSIZE 8
|
||||||
|
|
|
@ -48,11 +48,12 @@ USB_ClassInfo_HID_Device_t Joystick_HID_Interface =
|
||||||
.Config =
|
.Config =
|
||||||
{
|
{
|
||||||
.InterfaceNumber = 0,
|
.InterfaceNumber = 0,
|
||||||
|
.ReportINEndpoint =
|
||||||
.ReportINEndpointNumber = JOYSTICK_EPNUM,
|
{
|
||||||
.ReportINEndpointSize = JOYSTICK_EPSIZE,
|
.Address = JOYSTICK_EPADDR,
|
||||||
.ReportINEndpointDoubleBank = false,
|
.Size = JOYSTICK_EPSIZE,
|
||||||
|
.Banks = 1,
|
||||||
|
},
|
||||||
.PrevReportINBuffer = PrevJoystickHIDReportBuffer,
|
.PrevReportINBuffer = PrevJoystickHIDReportBuffer,
|
||||||
.PrevReportINBufferSize = sizeof(PrevJoystickHIDReportBuffer),
|
.PrevReportINBufferSize = sizeof(PrevJoystickHIDReportBuffer),
|
||||||
},
|
},
|
||||||
|
|
|
@ -131,10 +131,10 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
|
||||||
{
|
{
|
||||||
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
|
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
|
||||||
|
|
||||||
.EndpointAddress = (ENDPOINT_DIR_IN | KEYBOARD_EPNUM),
|
.EndpointAddress = KEYBOARD_EPADDR,
|
||||||
.Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
|
.Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
|
||||||
.EndpointSize = KEYBOARD_EPSIZE,
|
.EndpointSize = KEYBOARD_EPSIZE,
|
||||||
.PollingIntervalMS = 0x01
|
.PollingIntervalMS = 0x05
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -57,8 +57,8 @@
|
||||||
} USB_Descriptor_Configuration_t;
|
} USB_Descriptor_Configuration_t;
|
||||||
|
|
||||||
/* Macros: */
|
/* Macros: */
|
||||||
/** Endpoint number of the Keyboard HID reporting IN endpoint. */
|
/** Endpoint address of the Keyboard HID reporting IN endpoint. */
|
||||||
#define KEYBOARD_EPNUM 1
|
#define KEYBOARD_EPADDR (ENDPOINT_DIR_IN | 1)
|
||||||
|
|
||||||
/** Size in bytes of the Keyboard HID reporting IN endpoint. */
|
/** Size in bytes of the Keyboard HID reporting IN endpoint. */
|
||||||
#define KEYBOARD_EPSIZE 8
|
#define KEYBOARD_EPSIZE 8
|
||||||
|
|
|
@ -48,11 +48,12 @@ USB_ClassInfo_HID_Device_t Keyboard_HID_Interface =
|
||||||
.Config =
|
.Config =
|
||||||
{
|
{
|
||||||
.InterfaceNumber = 0,
|
.InterfaceNumber = 0,
|
||||||
|
.ReportINEndpoint =
|
||||||
.ReportINEndpointNumber = KEYBOARD_EPNUM,
|
{
|
||||||
.ReportINEndpointSize = KEYBOARD_EPSIZE,
|
.Address = KEYBOARD_EPADDR,
|
||||||
.ReportINEndpointDoubleBank = false,
|
.Size = KEYBOARD_EPSIZE,
|
||||||
|
.Banks = 1,
|
||||||
|
},
|
||||||
.PrevReportINBuffer = PrevKeyboardHIDReportBuffer,
|
.PrevReportINBuffer = PrevKeyboardHIDReportBuffer,
|
||||||
.PrevReportINBufferSize = sizeof(PrevKeyboardHIDReportBuffer),
|
.PrevReportINBufferSize = sizeof(PrevKeyboardHIDReportBuffer),
|
||||||
},
|
},
|
||||||
|
|
|
@ -147,10 +147,10 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
|
||||||
{
|
{
|
||||||
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
|
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
|
||||||
|
|
||||||
.EndpointAddress = (ENDPOINT_DIR_IN | KEYBOARD_IN_EPNUM),
|
.EndpointAddress = KEYBOARD_IN_EPADDR,
|
||||||
.Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
|
.Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
|
||||||
.EndpointSize = HID_EPSIZE,
|
.EndpointSize = HID_EPSIZE,
|
||||||
.PollingIntervalMS = 0x01
|
.PollingIntervalMS = 0x05
|
||||||
},
|
},
|
||||||
|
|
||||||
.HID2_MouseInterface =
|
.HID2_MouseInterface =
|
||||||
|
@ -184,10 +184,10 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
|
||||||
{
|
{
|
||||||
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
|
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
|
||||||
|
|
||||||
.EndpointAddress = (ENDPOINT_DIR_IN | MOUSE_IN_EPNUM),
|
.EndpointAddress = MOUSE_IN_EPADDR,
|
||||||
.Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
|
.Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
|
||||||
.EndpointSize = HID_EPSIZE,
|
.EndpointSize = HID_EPSIZE,
|
||||||
.PollingIntervalMS = 0x01
|
.PollingIntervalMS = 0x05
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -62,11 +62,11 @@
|
||||||
} USB_Descriptor_Configuration_t;
|
} USB_Descriptor_Configuration_t;
|
||||||
|
|
||||||
/* Macros: */
|
/* Macros: */
|
||||||
/** Endpoint number of the Keyboard HID reporting IN endpoint. */
|
/** Endpoint address of the Keyboard HID reporting IN endpoint. */
|
||||||
#define KEYBOARD_IN_EPNUM 1
|
#define KEYBOARD_IN_EPADDR (ENDPOINT_DIR_IN | 1)
|
||||||
|
|
||||||
/** Endpoint number of the Mouse HID reporting IN endpoint. */
|
/** Endpoint address of the Mouse HID reporting IN endpoint. */
|
||||||
#define MOUSE_IN_EPNUM 3
|
#define MOUSE_IN_EPADDR (ENDPOINT_DIR_IN | 3)
|
||||||
|
|
||||||
/** Size in bytes of each of the HID reporting IN endpoints. */
|
/** Size in bytes of each of the HID reporting IN endpoints. */
|
||||||
#define HID_EPSIZE 8
|
#define HID_EPSIZE 8
|
||||||
|
|
|
@ -52,11 +52,12 @@ USB_ClassInfo_HID_Device_t Keyboard_HID_Interface =
|
||||||
.Config =
|
.Config =
|
||||||
{
|
{
|
||||||
.InterfaceNumber = 0,
|
.InterfaceNumber = 0,
|
||||||
|
.ReportINEndpoint =
|
||||||
.ReportINEndpointNumber = KEYBOARD_IN_EPNUM,
|
{
|
||||||
.ReportINEndpointSize = HID_EPSIZE,
|
.Address = KEYBOARD_IN_EPADDR,
|
||||||
.ReportINEndpointDoubleBank = false,
|
.Size = HID_EPSIZE,
|
||||||
|
.Banks = 1,
|
||||||
|
},
|
||||||
.PrevReportINBuffer = PrevKeyboardHIDReportBuffer,
|
.PrevReportINBuffer = PrevKeyboardHIDReportBuffer,
|
||||||
.PrevReportINBufferSize = sizeof(PrevKeyboardHIDReportBuffer),
|
.PrevReportINBufferSize = sizeof(PrevKeyboardHIDReportBuffer),
|
||||||
},
|
},
|
||||||
|
@ -72,10 +73,12 @@ USB_ClassInfo_HID_Device_t Mouse_HID_Interface =
|
||||||
.Config =
|
.Config =
|
||||||
{
|
{
|
||||||
.InterfaceNumber = 1,
|
.InterfaceNumber = 1,
|
||||||
|
.ReportINEndpoint =
|
||||||
.ReportINEndpointNumber = MOUSE_IN_EPNUM,
|
{
|
||||||
.ReportINEndpointSize = HID_EPSIZE,
|
.Address = MOUSE_IN_EPADDR,
|
||||||
|
.Size = HID_EPSIZE,
|
||||||
|
.Banks = 1,
|
||||||
|
},
|
||||||
.PrevReportINBuffer = PrevMouseHIDReportBuffer,
|
.PrevReportINBuffer = PrevMouseHIDReportBuffer,
|
||||||
.PrevReportINBufferSize = sizeof(PrevMouseHIDReportBuffer),
|
.PrevReportINBufferSize = sizeof(PrevMouseHIDReportBuffer),
|
||||||
},
|
},
|
||||||
|
|
|
@ -194,10 +194,10 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
|
||||||
{
|
{
|
||||||
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
|
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
|
||||||
|
|
||||||
.EndpointAddress = (ENDPOINT_DIR_IN | HID_IN_EPNUM),
|
.EndpointAddress = HID_IN_EPADDR,
|
||||||
.Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
|
.Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
|
||||||
.EndpointSize = HID_EPSIZE,
|
.EndpointSize = HID_EPSIZE,
|
||||||
.PollingIntervalMS = 0x01
|
.PollingIntervalMS = 0x05
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -57,8 +57,8 @@
|
||||||
} USB_Descriptor_Configuration_t;
|
} USB_Descriptor_Configuration_t;
|
||||||
|
|
||||||
/* Macros: */
|
/* Macros: */
|
||||||
/** Endpoint number of the HID reporting IN endpoint. */
|
/** Endpoint address of the HID reporting IN endpoint. */
|
||||||
#define HID_IN_EPNUM 1
|
#define HID_IN_EPADDR (ENDPOINT_DIR_IN | 1)
|
||||||
|
|
||||||
/** Size in bytes of each of the HID reporting IN endpoint. */
|
/** Size in bytes of each of the HID reporting IN endpoint. */
|
||||||
#define HID_EPSIZE 8
|
#define HID_EPSIZE 8
|
||||||
|
|
|
@ -48,11 +48,12 @@ USB_ClassInfo_HID_Device_t Device_HID_Interface =
|
||||||
.Config =
|
.Config =
|
||||||
{
|
{
|
||||||
.InterfaceNumber = 0,
|
.InterfaceNumber = 0,
|
||||||
|
.ReportINEndpoint =
|
||||||
.ReportINEndpointNumber = HID_IN_EPNUM,
|
{
|
||||||
.ReportINEndpointSize = HID_EPSIZE,
|
.Address = HID_IN_EPADDR,
|
||||||
.ReportINEndpointDoubleBank = false,
|
.Size = HID_EPSIZE,
|
||||||
|
.Banks = 1,
|
||||||
|
},
|
||||||
.PrevReportINBuffer = PrevHIDReportBuffer,
|
.PrevReportINBuffer = PrevHIDReportBuffer,
|
||||||
.PrevReportINBufferSize = sizeof(PrevHIDReportBuffer),
|
.PrevReportINBufferSize = sizeof(PrevHIDReportBuffer),
|
||||||
},
|
},
|
||||||
|
|
|
@ -199,10 +199,10 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
|
||||||
{
|
{
|
||||||
.Header = {.Size = sizeof(USB_Audio_Descriptor_StreamEndpoint_Std_t), .Type = DTYPE_Endpoint},
|
.Header = {.Size = sizeof(USB_Audio_Descriptor_StreamEndpoint_Std_t), .Type = DTYPE_Endpoint},
|
||||||
|
|
||||||
.EndpointAddress = (ENDPOINT_DIR_OUT | MIDI_STREAM_OUT_EPNUM),
|
.EndpointAddress = MIDI_STREAM_OUT_EPADDR,
|
||||||
.Attributes = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
|
.Attributes = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
|
||||||
.EndpointSize = MIDI_STREAM_EPSIZE,
|
.EndpointSize = MIDI_STREAM_EPSIZE,
|
||||||
.PollingIntervalMS = 0x01
|
.PollingIntervalMS = 0x05
|
||||||
},
|
},
|
||||||
|
|
||||||
.Refresh = 0,
|
.Refresh = 0,
|
||||||
|
@ -224,10 +224,10 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
|
||||||
{
|
{
|
||||||
.Header = {.Size = sizeof(USB_Audio_Descriptor_StreamEndpoint_Std_t), .Type = DTYPE_Endpoint},
|
.Header = {.Size = sizeof(USB_Audio_Descriptor_StreamEndpoint_Std_t), .Type = DTYPE_Endpoint},
|
||||||
|
|
||||||
.EndpointAddress = (ENDPOINT_DIR_IN | MIDI_STREAM_IN_EPNUM),
|
.EndpointAddress = MIDI_STREAM_IN_EPADDR,
|
||||||
.Attributes = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
|
.Attributes = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
|
||||||
.EndpointSize = MIDI_STREAM_EPSIZE,
|
.EndpointSize = MIDI_STREAM_EPSIZE,
|
||||||
.PollingIntervalMS = 0x01
|
.PollingIntervalMS = 0x05
|
||||||
},
|
},
|
||||||
|
|
||||||
.Refresh = 0,
|
.Refresh = 0,
|
||||||
|
|
|
@ -42,11 +42,11 @@
|
||||||
#include <avr/pgmspace.h>
|
#include <avr/pgmspace.h>
|
||||||
|
|
||||||
/* Macros: */
|
/* Macros: */
|
||||||
/** Endpoint number of the MIDI streaming data IN endpoint, for device-to-host data transfers. */
|
/** Endpoint address of the MIDI streaming data IN endpoint, for device-to-host data transfers. */
|
||||||
#define MIDI_STREAM_IN_EPNUM 2
|
#define MIDI_STREAM_IN_EPADDR (ENDPOINT_DIR_IN | 2)
|
||||||
|
|
||||||
/** Endpoint number of the MIDI streaming data OUT endpoint, for host-to-device data transfers. */
|
/** Endpoint address of the MIDI streaming data OUT endpoint, for host-to-device data transfers. */
|
||||||
#define MIDI_STREAM_OUT_EPNUM 1
|
#define MIDI_STREAM_OUT_EPADDR (ENDPOINT_DIR_OUT | 1)
|
||||||
|
|
||||||
/** Endpoint size in bytes of the Audio isochronous streaming data IN and OUT endpoints. */
|
/** Endpoint size in bytes of the Audio isochronous streaming data IN and OUT endpoints. */
|
||||||
#define MIDI_STREAM_EPSIZE 64
|
#define MIDI_STREAM_EPSIZE 64
|
||||||
|
|
|
@ -45,14 +45,18 @@ USB_ClassInfo_MIDI_Device_t Keyboard_MIDI_Interface =
|
||||||
.Config =
|
.Config =
|
||||||
{
|
{
|
||||||
.StreamingInterfaceNumber = 1,
|
.StreamingInterfaceNumber = 1,
|
||||||
|
.DataINEndpoint =
|
||||||
.DataINEndpointNumber = MIDI_STREAM_IN_EPNUM,
|
{
|
||||||
.DataINEndpointSize = MIDI_STREAM_EPSIZE,
|
.Address = MIDI_STREAM_IN_EPADDR,
|
||||||
.DataINEndpointDoubleBank = false,
|
.Size = MIDI_STREAM_EPSIZE,
|
||||||
|
.Banks = 1,
|
||||||
.DataOUTEndpointNumber = MIDI_STREAM_OUT_EPNUM,
|
},
|
||||||
.DataOUTEndpointSize = MIDI_STREAM_EPSIZE,
|
.DataOUTEndpoint =
|
||||||
.DataOUTEndpointDoubleBank = false,
|
{
|
||||||
|
.Address = MIDI_STREAM_OUT_EPADDR,
|
||||||
|
.Size = MIDI_STREAM_EPSIZE,
|
||||||
|
.Banks = 1,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -74,7 +78,7 @@ int main(void)
|
||||||
MIDI_EventPacket_t ReceivedMIDIEvent;
|
MIDI_EventPacket_t ReceivedMIDIEvent;
|
||||||
while (MIDI_Device_ReceiveEventPacket(&Keyboard_MIDI_Interface, &ReceivedMIDIEvent))
|
while (MIDI_Device_ReceiveEventPacket(&Keyboard_MIDI_Interface, &ReceivedMIDIEvent))
|
||||||
{
|
{
|
||||||
if ((ReceivedMIDIEvent.Command == (MIDI_COMMAND_NOTE_ON >> 4)) && (ReceivedMIDIEvent.Data3 > 0))
|
if ((ReceivedMIDIEvent.Event == MIDI_EVENT(0, MIDI_COMMAND_NOTE_ON)) && (ReceivedMIDIEvent.Data3 > 0))
|
||||||
LEDs_SetAllLEDs(ReceivedMIDIEvent.Data2 > 64 ? LEDS_LED1 : LEDS_LED2);
|
LEDs_SetAllLEDs(ReceivedMIDIEvent.Data2 > 64 ? LEDS_LED1 : LEDS_LED2);
|
||||||
else
|
else
|
||||||
LEDs_SetAllLEDs(LEDS_NO_LEDS);
|
LEDs_SetAllLEDs(LEDS_NO_LEDS);
|
||||||
|
@ -151,8 +155,7 @@ void CheckJoystickMovement(void)
|
||||||
{
|
{
|
||||||
MIDI_EventPacket_t MIDIEvent = (MIDI_EventPacket_t)
|
MIDI_EventPacket_t MIDIEvent = (MIDI_EventPacket_t)
|
||||||
{
|
{
|
||||||
.CableNumber = 0,
|
.Event = MIDI_EVENT(0, MIDICommand),
|
||||||
.Command = (MIDICommand >> 4),
|
|
||||||
|
|
||||||
.Data1 = MIDICommand | Channel,
|
.Data1 = MIDICommand | Channel,
|
||||||
.Data2 = MIDIPitch,
|
.Data2 = MIDIPitch,
|
||||||
|
|
|
@ -118,20 +118,20 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
|
||||||
{
|
{
|
||||||
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
|
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
|
||||||
|
|
||||||
.EndpointAddress = (ENDPOINT_DIR_IN | MASS_STORAGE_IN_EPNUM),
|
.EndpointAddress = MASS_STORAGE_IN_EPADDR,
|
||||||
.Attributes = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
|
.Attributes = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
|
||||||
.EndpointSize = MASS_STORAGE_IO_EPSIZE,
|
.EndpointSize = MASS_STORAGE_IO_EPSIZE,
|
||||||
.PollingIntervalMS = 0x01
|
.PollingIntervalMS = 0x05
|
||||||
},
|
},
|
||||||
|
|
||||||
.MS_DataOutEndpoint =
|
.MS_DataOutEndpoint =
|
||||||
{
|
{
|
||||||
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
|
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
|
||||||
|
|
||||||
.EndpointAddress = (ENDPOINT_DIR_OUT | MASS_STORAGE_OUT_EPNUM),
|
.EndpointAddress = MASS_STORAGE_OUT_EPADDR,
|
||||||
.Attributes = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
|
.Attributes = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
|
||||||
.EndpointSize = MASS_STORAGE_IO_EPSIZE,
|
.EndpointSize = MASS_STORAGE_IO_EPSIZE,
|
||||||
.PollingIntervalMS = 0x01
|
.PollingIntervalMS = 0x05
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -42,11 +42,11 @@
|
||||||
#include <LUFA/Drivers/USB/USB.h>
|
#include <LUFA/Drivers/USB/USB.h>
|
||||||
|
|
||||||
/* Macros: */
|
/* Macros: */
|
||||||
/** Endpoint number of the Mass Storage device-to-host data IN endpoint. */
|
/** Endpoint address of the Mass Storage device-to-host data IN endpoint. */
|
||||||
#define MASS_STORAGE_IN_EPNUM 3
|
#define MASS_STORAGE_IN_EPADDR (ENDPOINT_DIR_IN | 3)
|
||||||
|
|
||||||
/** Endpoint number of the Mass Storage host-to-device data OUT endpoint. */
|
/** Endpoint address of the Mass Storage host-to-device data OUT endpoint. */
|
||||||
#define MASS_STORAGE_OUT_EPNUM 4
|
#define MASS_STORAGE_OUT_EPADDR (ENDPOINT_DIR_OUT | 4)
|
||||||
|
|
||||||
/** Size in bytes of the Mass Storage data endpoints. */
|
/** Size in bytes of the Mass Storage data endpoints. */
|
||||||
#define MASS_STORAGE_IO_EPSIZE 64
|
#define MASS_STORAGE_IO_EPSIZE 64
|
||||||
|
|
|
@ -45,15 +45,18 @@ USB_ClassInfo_MS_Device_t Disk_MS_Interface =
|
||||||
.Config =
|
.Config =
|
||||||
{
|
{
|
||||||
.InterfaceNumber = 0,
|
.InterfaceNumber = 0,
|
||||||
|
.DataINEndpoint =
|
||||||
.DataINEndpointNumber = MASS_STORAGE_IN_EPNUM,
|
{
|
||||||
.DataINEndpointSize = MASS_STORAGE_IO_EPSIZE,
|
.Address = MASS_STORAGE_IN_EPADDR,
|
||||||
.DataINEndpointDoubleBank = false,
|
.Size = MASS_STORAGE_IO_EPSIZE,
|
||||||
|
.Banks = 1,
|
||||||
.DataOUTEndpointNumber = MASS_STORAGE_OUT_EPNUM,
|
},
|
||||||
.DataOUTEndpointSize = MASS_STORAGE_IO_EPSIZE,
|
.DataOUTEndpoint =
|
||||||
.DataOUTEndpointDoubleBank = false,
|
{
|
||||||
|
.Address = MASS_STORAGE_OUT_EPADDR,
|
||||||
|
.Size = MASS_STORAGE_IO_EPSIZE,
|
||||||
|
.Banks = 1,
|
||||||
|
},
|
||||||
.TotalLUNs = TOTAL_LUNS,
|
.TotalLUNs = TOTAL_LUNS,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
|
@ -133,20 +133,20 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
|
||||||
{
|
{
|
||||||
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
|
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
|
||||||
|
|
||||||
.EndpointAddress = (ENDPOINT_DIR_IN | MASS_STORAGE_IN_EPNUM),
|
.EndpointAddress = MASS_STORAGE_IN_EPADDR,
|
||||||
.Attributes = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
|
.Attributes = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
|
||||||
.EndpointSize = MASS_STORAGE_IO_EPSIZE,
|
.EndpointSize = MASS_STORAGE_IO_EPSIZE,
|
||||||
.PollingIntervalMS = 0x01
|
.PollingIntervalMS = 0x05
|
||||||
},
|
},
|
||||||
|
|
||||||
.MS_DataOutEndpoint =
|
.MS_DataOutEndpoint =
|
||||||
{
|
{
|
||||||
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
|
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
|
||||||
|
|
||||||
.EndpointAddress = (ENDPOINT_DIR_OUT | MASS_STORAGE_OUT_EPNUM),
|
.EndpointAddress = MASS_STORAGE_OUT_EPADDR,
|
||||||
.Attributes = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
|
.Attributes = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
|
||||||
.EndpointSize = MASS_STORAGE_IO_EPSIZE,
|
.EndpointSize = MASS_STORAGE_IO_EPSIZE,
|
||||||
.PollingIntervalMS = 0x01
|
.PollingIntervalMS = 0x05
|
||||||
},
|
},
|
||||||
|
|
||||||
.HID_KeyboardInterface =
|
.HID_KeyboardInterface =
|
||||||
|
@ -180,10 +180,10 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
|
||||||
{
|
{
|
||||||
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
|
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
|
||||||
|
|
||||||
.EndpointAddress = (ENDPOINT_DIR_IN | KEYBOARD_EPNUM),
|
.EndpointAddress = KEYBOARD_EPADDR,
|
||||||
.Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
|
.Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
|
||||||
.EndpointSize = KEYBOARD_EPSIZE,
|
.EndpointSize = KEYBOARD_EPSIZE,
|
||||||
.PollingIntervalMS = 0x01
|
.PollingIntervalMS = 0x05
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -43,17 +43,17 @@
|
||||||
#include <LUFA/Drivers/USB/USB.h>
|
#include <LUFA/Drivers/USB/USB.h>
|
||||||
|
|
||||||
/* Macros: */
|
/* Macros: */
|
||||||
/** Endpoint number of the Keyboard HID reporting IN endpoint. */
|
/** Endpoint address of the Keyboard HID reporting IN endpoint. */
|
||||||
#define KEYBOARD_EPNUM 1
|
#define KEYBOARD_EPADDR (ENDPOINT_DIR_IN | 1)
|
||||||
|
|
||||||
/** Size in bytes of the Keyboard HID reporting IN endpoint. */
|
/** Size in bytes of the Keyboard HID reporting IN endpoint. */
|
||||||
#define KEYBOARD_EPSIZE 8
|
#define KEYBOARD_EPSIZE 8
|
||||||
|
|
||||||
/** Endpoint number of the Mass Storage device-to-host data IN endpoint. */
|
/** Endpoint address of the Mass Storage device-to-host data IN endpoint. */
|
||||||
#define MASS_STORAGE_IN_EPNUM 3
|
#define MASS_STORAGE_IN_EPADDR (ENDPOINT_DIR_IN | 3)
|
||||||
|
|
||||||
/** Endpoint number of the Mass Storage host-to-device data OUT endpoint. */
|
/** Endpoint address of the Mass Storage host-to-device data OUT endpoint. */
|
||||||
#define MASS_STORAGE_OUT_EPNUM 4
|
#define MASS_STORAGE_OUT_EPADDR (ENDPOINT_DIR_OUT | 4)
|
||||||
|
|
||||||
/** Size in bytes of the Mass Storage data endpoints. */
|
/** Size in bytes of the Mass Storage data endpoints. */
|
||||||
#define MASS_STORAGE_IO_EPSIZE 64
|
#define MASS_STORAGE_IO_EPSIZE 64
|
||||||
|
|
|
@ -46,15 +46,18 @@ USB_ClassInfo_MS_Device_t Disk_MS_Interface =
|
||||||
.Config =
|
.Config =
|
||||||
{
|
{
|
||||||
.InterfaceNumber = 0,
|
.InterfaceNumber = 0,
|
||||||
|
.DataINEndpoint =
|
||||||
.DataINEndpointNumber = MASS_STORAGE_IN_EPNUM,
|
{
|
||||||
.DataINEndpointSize = MASS_STORAGE_IO_EPSIZE,
|
.Address = MASS_STORAGE_IN_EPADDR,
|
||||||
.DataINEndpointDoubleBank = false,
|
.Size = MASS_STORAGE_IO_EPSIZE,
|
||||||
|
.Banks = 1,
|
||||||
.DataOUTEndpointNumber = MASS_STORAGE_OUT_EPNUM,
|
},
|
||||||
.DataOUTEndpointSize = MASS_STORAGE_IO_EPSIZE,
|
.DataOUTEndpoint =
|
||||||
.DataOUTEndpointDoubleBank = false,
|
{
|
||||||
|
.Address = MASS_STORAGE_OUT_EPADDR,
|
||||||
|
.Size = MASS_STORAGE_IO_EPSIZE,
|
||||||
|
.Banks = 1,
|
||||||
|
},
|
||||||
.TotalLUNs = TOTAL_LUNS,
|
.TotalLUNs = TOTAL_LUNS,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
@ -71,11 +74,12 @@ USB_ClassInfo_HID_Device_t Keyboard_HID_Interface =
|
||||||
.Config =
|
.Config =
|
||||||
{
|
{
|
||||||
.InterfaceNumber = 1,
|
.InterfaceNumber = 1,
|
||||||
|
.ReportINEndpoint =
|
||||||
.ReportINEndpointNumber = KEYBOARD_EPNUM,
|
{
|
||||||
.ReportINEndpointSize = KEYBOARD_EPSIZE,
|
.Address = KEYBOARD_EPADDR,
|
||||||
.ReportINEndpointDoubleBank = false,
|
.Size = KEYBOARD_EPSIZE,
|
||||||
|
.Banks = 1,
|
||||||
|
},
|
||||||
.PrevReportINBuffer = PrevKeyboardHIDReportBuffer,
|
.PrevReportINBuffer = PrevKeyboardHIDReportBuffer,
|
||||||
.PrevReportINBufferSize = sizeof(PrevKeyboardHIDReportBuffer),
|
.PrevReportINBufferSize = sizeof(PrevKeyboardHIDReportBuffer),
|
||||||
},
|
},
|
||||||
|
|
|
@ -136,10 +136,10 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
|
||||||
{
|
{
|
||||||
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
|
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
|
||||||
|
|
||||||
.EndpointAddress = (ENDPOINT_DIR_IN | MOUSE_EPNUM),
|
.EndpointAddress = MOUSE_EPADDR,
|
||||||
.Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
|
.Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
|
||||||
.EndpointSize = MOUSE_EPSIZE,
|
.EndpointSize = MOUSE_EPSIZE,
|
||||||
.PollingIntervalMS = 0x01
|
.PollingIntervalMS = 0x05
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -41,6 +41,13 @@
|
||||||
|
|
||||||
#include <avr/pgmspace.h>
|
#include <avr/pgmspace.h>
|
||||||
|
|
||||||
|
/* Macros: */
|
||||||
|
/** Endpoint address of the Mouse HID reporting IN endpoint. */
|
||||||
|
#define MOUSE_EPADDR (ENDPOINT_DIR_IN | 1)
|
||||||
|
|
||||||
|
/** Size in bytes of the Mouse HID reporting IN endpoint. */
|
||||||
|
#define MOUSE_EPSIZE 8
|
||||||
|
|
||||||
/* Type Defines: */
|
/* Type Defines: */
|
||||||
/** Type define for the device configuration descriptor structure. This must be defined in the
|
/** Type define for the device configuration descriptor structure. This must be defined in the
|
||||||
* application code, as the configuration descriptor contains several sub-descriptors which
|
* application code, as the configuration descriptor contains several sub-descriptors which
|
||||||
|
@ -56,13 +63,6 @@
|
||||||
USB_Descriptor_Endpoint_t HID_ReportINEndpoint;
|
USB_Descriptor_Endpoint_t HID_ReportINEndpoint;
|
||||||
} USB_Descriptor_Configuration_t;
|
} USB_Descriptor_Configuration_t;
|
||||||
|
|
||||||
/* Macros: */
|
|
||||||
/** Endpoint number of the Mouse HID reporting IN endpoint. */
|
|
||||||
#define MOUSE_EPNUM 1
|
|
||||||
|
|
||||||
/** Size in bytes of the Mouse HID reporting IN endpoint. */
|
|
||||||
#define MOUSE_EPSIZE 8
|
|
||||||
|
|
||||||
/* Function Prototypes: */
|
/* Function Prototypes: */
|
||||||
uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue,
|
uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue,
|
||||||
const uint8_t wIndex,
|
const uint8_t wIndex,
|
||||||
|
|
|
@ -48,11 +48,12 @@ USB_ClassInfo_HID_Device_t Mouse_HID_Interface =
|
||||||
.Config =
|
.Config =
|
||||||
{
|
{
|
||||||
.InterfaceNumber = 0,
|
.InterfaceNumber = 0,
|
||||||
|
.ReportINEndpoint =
|
||||||
.ReportINEndpointNumber = MOUSE_EPNUM,
|
{
|
||||||
.ReportINEndpointSize = MOUSE_EPSIZE,
|
.Address = MOUSE_EPADDR,
|
||||||
.ReportINEndpointDoubleBank = false,
|
.Size = MOUSE_EPSIZE,
|
||||||
|
.Banks = 1,
|
||||||
|
},
|
||||||
.PrevReportINBuffer = PrevMouseHIDReportBuffer,
|
.PrevReportINBuffer = PrevMouseHIDReportBuffer,
|
||||||
.PrevReportINBufferSize = sizeof(PrevMouseHIDReportBuffer),
|
.PrevReportINBufferSize = sizeof(PrevMouseHIDReportBuffer),
|
||||||
},
|
},
|
||||||
|
|
|
@ -131,7 +131,7 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
|
||||||
{
|
{
|
||||||
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
|
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
|
||||||
|
|
||||||
.EndpointAddress = (ENDPOINT_DIR_IN | CDC_NOTIFICATION_EPNUM),
|
.EndpointAddress = CDC_NOTIFICATION_EPADDR,
|
||||||
.Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
|
.Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
|
||||||
.EndpointSize = CDC_NOTIFICATION_EPSIZE,
|
.EndpointSize = CDC_NOTIFICATION_EPSIZE,
|
||||||
.PollingIntervalMS = 0xFF
|
.PollingIntervalMS = 0xFF
|
||||||
|
@ -157,20 +157,20 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
|
||||||
{
|
{
|
||||||
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
|
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
|
||||||
|
|
||||||
.EndpointAddress = (ENDPOINT_DIR_OUT | CDC_RX_EPNUM),
|
.EndpointAddress = CDC_RX_EPADDR,
|
||||||
.Attributes = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
|
.Attributes = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
|
||||||
.EndpointSize = CDC_TXRX_EPSIZE,
|
.EndpointSize = CDC_TXRX_EPSIZE,
|
||||||
.PollingIntervalMS = 0x01
|
.PollingIntervalMS = 0x05
|
||||||
},
|
},
|
||||||
|
|
||||||
.RNDIS_DataInEndpoint =
|
.RNDIS_DataInEndpoint =
|
||||||
{
|
{
|
||||||
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
|
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
|
||||||
|
|
||||||
.EndpointAddress = (ENDPOINT_DIR_IN | CDC_TX_EPNUM),
|
.EndpointAddress = CDC_TX_EPADDR,
|
||||||
.Attributes = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
|
.Attributes = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
|
||||||
.EndpointSize = CDC_TXRX_EPSIZE,
|
.EndpointSize = CDC_TXRX_EPSIZE,
|
||||||
.PollingIntervalMS = 0x01
|
.PollingIntervalMS = 0x05
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -42,14 +42,14 @@
|
||||||
#include <avr/pgmspace.h>
|
#include <avr/pgmspace.h>
|
||||||
|
|
||||||
/* Macros: */
|
/* Macros: */
|
||||||
/** Endpoint number of the CDC device-to-host notification IN endpoint. */
|
/** Endpoint address of the CDC device-to-host notification IN endpoint. */
|
||||||
#define CDC_NOTIFICATION_EPNUM 3
|
#define CDC_NOTIFICATION_EPADDR (ENDPOINT_DIR_IN | 3)
|
||||||
|
|
||||||
/** Endpoint number of the CDC device-to-host data IN endpoint. */
|
/** Endpoint address of the CDC device-to-host data IN endpoint. */
|
||||||
#define CDC_TX_EPNUM 1
|
#define CDC_TX_EPADDR (ENDPOINT_DIR_IN | 1)
|
||||||
|
|
||||||
/** Endpoint number of the CDC host-to-device data OUT endpoint. */
|
/** Endpoint address of the CDC host-to-device data OUT endpoint. */
|
||||||
#define CDC_RX_EPNUM 2
|
#define CDC_RX_EPADDR (ENDPOINT_DIR_OUT | 2)
|
||||||
|
|
||||||
/** Size in bytes of the CDC device-to-host notification IN endpoint. */
|
/** Size in bytes of the CDC device-to-host notification IN endpoint. */
|
||||||
#define CDC_NOTIFICATION_EPSIZE 8
|
#define CDC_NOTIFICATION_EPSIZE 8
|
||||||
|
|
|
@ -45,19 +45,24 @@ USB_ClassInfo_RNDIS_Device_t Ethernet_RNDIS_Interface =
|
||||||
.Config =
|
.Config =
|
||||||
{
|
{
|
||||||
.ControlInterfaceNumber = 0,
|
.ControlInterfaceNumber = 0,
|
||||||
|
.DataINEndpoint =
|
||||||
.DataINEndpointNumber = CDC_TX_EPNUM,
|
{
|
||||||
.DataINEndpointSize = CDC_TXRX_EPSIZE,
|
.Address = CDC_TX_EPADDR,
|
||||||
.DataINEndpointDoubleBank = false,
|
.Size = CDC_TXRX_EPSIZE,
|
||||||
|
.Banks = 1,
|
||||||
.DataOUTEndpointNumber = CDC_RX_EPNUM,
|
},
|
||||||
.DataOUTEndpointSize = CDC_TXRX_EPSIZE,
|
.DataOUTEndpoint =
|
||||||
.DataOUTEndpointDoubleBank = false,
|
{
|
||||||
|
.Address = CDC_RX_EPADDR,
|
||||||
.NotificationEndpointNumber = CDC_NOTIFICATION_EPNUM,
|
.Size = CDC_TXRX_EPSIZE,
|
||||||
.NotificationEndpointSize = CDC_NOTIFICATION_EPSIZE,
|
.Banks = 1,
|
||||||
.NotificationEndpointDoubleBank = false,
|
},
|
||||||
|
.NotificationEndpoint =
|
||||||
|
{
|
||||||
|
.Address = CDC_NOTIFICATION_EPADDR,
|
||||||
|
.Size = CDC_NOTIFICATION_EPSIZE,
|
||||||
|
.Banks = 1,
|
||||||
|
},
|
||||||
.AdapterVendorDescription = "LUFA RNDIS Demo Adapter",
|
.AdapterVendorDescription = "LUFA RNDIS Demo Adapter",
|
||||||
.AdapterMACAddress = {ADAPTER_MAC_ADDRESS},
|
.AdapterMACAddress = {ADAPTER_MAC_ADDRESS},
|
||||||
},
|
},
|
||||||
|
|
|
@ -143,7 +143,7 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
|
||||||
{
|
{
|
||||||
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
|
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
|
||||||
|
|
||||||
.EndpointAddress = (ENDPOINT_DIR_IN | CDC_NOTIFICATION_EPNUM),
|
.EndpointAddress = CDC_NOTIFICATION_EPADDR,
|
||||||
.Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
|
.Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
|
||||||
.EndpointSize = CDC_NOTIFICATION_EPSIZE,
|
.EndpointSize = CDC_NOTIFICATION_EPSIZE,
|
||||||
.PollingIntervalMS = 0xFF
|
.PollingIntervalMS = 0xFF
|
||||||
|
@ -169,20 +169,20 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
|
||||||
{
|
{
|
||||||
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
|
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
|
||||||
|
|
||||||
.EndpointAddress = (ENDPOINT_DIR_OUT | CDC_RX_EPNUM),
|
.EndpointAddress = CDC_RX_EPADDR,
|
||||||
.Attributes = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
|
.Attributes = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
|
||||||
.EndpointSize = CDC_TXRX_EPSIZE,
|
.EndpointSize = CDC_TXRX_EPSIZE,
|
||||||
.PollingIntervalMS = 0x01
|
.PollingIntervalMS = 0x05
|
||||||
},
|
},
|
||||||
|
|
||||||
.CDC_DataInEndpoint =
|
.CDC_DataInEndpoint =
|
||||||
{
|
{
|
||||||
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
|
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
|
||||||
|
|
||||||
.EndpointAddress = (ENDPOINT_DIR_IN | CDC_TX_EPNUM),
|
.EndpointAddress = CDC_TX_EPADDR,
|
||||||
.Attributes = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
|
.Attributes = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
|
||||||
.EndpointSize = CDC_TXRX_EPSIZE,
|
.EndpointSize = CDC_TXRX_EPSIZE,
|
||||||
.PollingIntervalMS = 0x01
|
.PollingIntervalMS = 0x05
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -42,14 +42,14 @@
|
||||||
#include <LUFA/Drivers/USB/USB.h>
|
#include <LUFA/Drivers/USB/USB.h>
|
||||||
|
|
||||||
/* Macros: */
|
/* Macros: */
|
||||||
/** Endpoint number of the CDC device-to-host notification IN endpoint. */
|
/** Endpoint address of the CDC device-to-host notification IN endpoint. */
|
||||||
#define CDC_NOTIFICATION_EPNUM 2
|
#define CDC_NOTIFICATION_EPADDR (ENDPOINT_DIR_IN | 2)
|
||||||
|
|
||||||
/** Endpoint number of the CDC device-to-host data IN endpoint. */
|
/** Endpoint address of the CDC device-to-host data IN endpoint. */
|
||||||
#define CDC_TX_EPNUM 3
|
#define CDC_TX_EPADDR (ENDPOINT_DIR_IN | 3)
|
||||||
|
|
||||||
/** Endpoint number of the CDC host-to-device data OUT endpoint. */
|
/** Endpoint address of the CDC host-to-device data OUT endpoint. */
|
||||||
#define CDC_RX_EPNUM 4
|
#define CDC_RX_EPADDR (ENDPOINT_DIR_OUT | 4)
|
||||||
|
|
||||||
/** Size in bytes of the CDC device-to-host notification IN endpoint. */
|
/** Size in bytes of the CDC device-to-host notification IN endpoint. */
|
||||||
#define CDC_NOTIFICATION_EPSIZE 8
|
#define CDC_NOTIFICATION_EPSIZE 8
|
||||||
|
|
|
@ -44,19 +44,25 @@ USB_ClassInfo_CDC_Device_t VirtualSerial_CDC_Interface =
|
||||||
{
|
{
|
||||||
.Config =
|
.Config =
|
||||||
{
|
{
|
||||||
.ControlInterfaceNumber = 0,
|
.ControlInterfaceNumber = 0,
|
||||||
|
.DataINEndpoint =
|
||||||
.DataINEndpointNumber = CDC_TX_EPNUM,
|
{
|
||||||
.DataINEndpointSize = CDC_TXRX_EPSIZE,
|
.Address = CDC_TX_EPADDR,
|
||||||
.DataINEndpointDoubleBank = false,
|
.Size = CDC_TXRX_EPSIZE,
|
||||||
|
.Banks = 1,
|
||||||
.DataOUTEndpointNumber = CDC_RX_EPNUM,
|
},
|
||||||
.DataOUTEndpointSize = CDC_TXRX_EPSIZE,
|
.DataOUTEndpoint =
|
||||||
.DataOUTEndpointDoubleBank = false,
|
{
|
||||||
|
.Address = CDC_RX_EPADDR,
|
||||||
.NotificationEndpointNumber = CDC_NOTIFICATION_EPNUM,
|
.Size = CDC_TXRX_EPSIZE,
|
||||||
.NotificationEndpointSize = CDC_NOTIFICATION_EPSIZE,
|
.Banks = 1,
|
||||||
.NotificationEndpointDoubleBank = false,
|
},
|
||||||
|
.NotificationEndpoint =
|
||||||
|
{
|
||||||
|
.Address = CDC_NOTIFICATION_EPADDR,
|
||||||
|
.Size = CDC_NOTIFICATION_EPSIZE,
|
||||||
|
.Banks = 1,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -157,7 +157,7 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
|
||||||
{
|
{
|
||||||
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
|
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
|
||||||
|
|
||||||
.EndpointAddress = (ENDPOINT_DIR_IN | CDC_NOTIFICATION_EPNUM),
|
.EndpointAddress = CDC_NOTIFICATION_EPADDR,
|
||||||
.Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
|
.Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
|
||||||
.EndpointSize = CDC_NOTIFICATION_EPSIZE,
|
.EndpointSize = CDC_NOTIFICATION_EPSIZE,
|
||||||
.PollingIntervalMS = 0xFF
|
.PollingIntervalMS = 0xFF
|
||||||
|
@ -183,20 +183,20 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
|
||||||
{
|
{
|
||||||
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
|
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
|
||||||
|
|
||||||
.EndpointAddress = (ENDPOINT_DIR_OUT | CDC_RX_EPNUM),
|
.EndpointAddress = CDC_RX_EPADDR,
|
||||||
.Attributes = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
|
.Attributes = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
|
||||||
.EndpointSize = CDC_TXRX_EPSIZE,
|
.EndpointSize = CDC_TXRX_EPSIZE,
|
||||||
.PollingIntervalMS = 0x01
|
.PollingIntervalMS = 0x05
|
||||||
},
|
},
|
||||||
|
|
||||||
.CDC_DataInEndpoint =
|
.CDC_DataInEndpoint =
|
||||||
{
|
{
|
||||||
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
|
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
|
||||||
|
|
||||||
.EndpointAddress = (ENDPOINT_DIR_IN | CDC_TX_EPNUM),
|
.EndpointAddress = CDC_TX_EPADDR,
|
||||||
.Attributes = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
|
.Attributes = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
|
||||||
.EndpointSize = CDC_TXRX_EPSIZE,
|
.EndpointSize = CDC_TXRX_EPSIZE,
|
||||||
.PollingIntervalMS = 0x01
|
.PollingIntervalMS = 0x05
|
||||||
},
|
},
|
||||||
|
|
||||||
.MS_Interface =
|
.MS_Interface =
|
||||||
|
@ -219,20 +219,20 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
|
||||||
{
|
{
|
||||||
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
|
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
|
||||||
|
|
||||||
.EndpointAddress = (ENDPOINT_DIR_IN | MASS_STORAGE_IN_EPNUM),
|
.EndpointAddress = MASS_STORAGE_IN_EPADDR,
|
||||||
.Attributes = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
|
.Attributes = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
|
||||||
.EndpointSize = MASS_STORAGE_IO_EPSIZE,
|
.EndpointSize = MASS_STORAGE_IO_EPSIZE,
|
||||||
.PollingIntervalMS = 0x01
|
.PollingIntervalMS = 0x05
|
||||||
},
|
},
|
||||||
|
|
||||||
.MS_DataOutEndpoint =
|
.MS_DataOutEndpoint =
|
||||||
{
|
{
|
||||||
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
|
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
|
||||||
|
|
||||||
.EndpointAddress = (ENDPOINT_DIR_OUT | MASS_STORAGE_OUT_EPNUM),
|
.EndpointAddress = MASS_STORAGE_OUT_EPADDR,
|
||||||
.Attributes = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
|
.Attributes = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
|
||||||
.EndpointSize = MASS_STORAGE_IO_EPSIZE,
|
.EndpointSize = MASS_STORAGE_IO_EPSIZE,
|
||||||
.PollingIntervalMS = 0x01
|
.PollingIntervalMS = 0x05
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -42,14 +42,14 @@
|
||||||
#include <LUFA/Drivers/USB/USB.h>
|
#include <LUFA/Drivers/USB/USB.h>
|
||||||
|
|
||||||
/* Macros: */
|
/* Macros: */
|
||||||
/** Endpoint number of the CDC device-to-host notification IN endpoint. */
|
/** Endpoint address of the CDC device-to-host notification IN endpoint. */
|
||||||
#define CDC_NOTIFICATION_EPNUM 1
|
#define CDC_NOTIFICATION_EPADDR (ENDPOINT_DIR_IN | 1)
|
||||||
|
|
||||||
/** Endpoint number of the CDC device-to-host data IN endpoint. */
|
/** Endpoint address of the CDC device-to-host data IN endpoint. */
|
||||||
#define CDC_TX_EPNUM 2
|
#define CDC_TX_EPADDR (ENDPOINT_DIR_IN | 2)
|
||||||
|
|
||||||
/** Endpoint number of the CDC host-to-device data OUT endpoint. */
|
/** Endpoint address of the CDC host-to-device data OUT endpoint. */
|
||||||
#define CDC_RX_EPNUM 3
|
#define CDC_RX_EPADDR (ENDPOINT_DIR_OUT | 3)
|
||||||
|
|
||||||
/** Size in bytes of the CDC device-to-host notification IN endpoint. */
|
/** Size in bytes of the CDC device-to-host notification IN endpoint. */
|
||||||
#define CDC_NOTIFICATION_EPSIZE 8
|
#define CDC_NOTIFICATION_EPSIZE 8
|
||||||
|
@ -57,11 +57,11 @@
|
||||||
/** Size in bytes of the CDC data IN and OUT endpoints. */
|
/** Size in bytes of the CDC data IN and OUT endpoints. */
|
||||||
#define CDC_TXRX_EPSIZE 16
|
#define CDC_TXRX_EPSIZE 16
|
||||||
|
|
||||||
/** Endpoint number of the Mass Storage device-to-host data IN endpoint. */
|
/** Endpoint address of the Mass Storage device-to-host data IN endpoint. */
|
||||||
#define MASS_STORAGE_IN_EPNUM 4
|
#define MASS_STORAGE_IN_EPADDR (ENDPOINT_DIR_IN | 4)
|
||||||
|
|
||||||
/** Endpoint number of the Mass Storage host-to-device data OUT endpoint. */
|
/** Endpoint address of the Mass Storage host-to-device data OUT endpoint. */
|
||||||
#define MASS_STORAGE_OUT_EPNUM 5
|
#define MASS_STORAGE_OUT_EPADDR (ENDPOINT_DIR_OUT | 5)
|
||||||
|
|
||||||
/** Size in bytes of the Mass Storage data endpoints. */
|
/** Size in bytes of the Mass Storage data endpoints. */
|
||||||
#define MASS_STORAGE_IO_EPSIZE 64
|
#define MASS_STORAGE_IO_EPSIZE 64
|
||||||
|
|
|
@ -45,18 +45,24 @@ USB_ClassInfo_CDC_Device_t VirtualSerial_CDC_Interface =
|
||||||
.Config =
|
.Config =
|
||||||
{
|
{
|
||||||
.ControlInterfaceNumber = 0,
|
.ControlInterfaceNumber = 0,
|
||||||
|
.DataINEndpoint =
|
||||||
.DataINEndpointNumber = CDC_TX_EPNUM,
|
{
|
||||||
.DataINEndpointSize = CDC_TXRX_EPSIZE,
|
.Address = CDC_TX_EPADDR,
|
||||||
.DataINEndpointDoubleBank = false,
|
.Size = CDC_TXRX_EPSIZE,
|
||||||
|
.Banks = 1,
|
||||||
.DataOUTEndpointNumber = CDC_RX_EPNUM,
|
},
|
||||||
.DataOUTEndpointSize = CDC_TXRX_EPSIZE,
|
.DataOUTEndpoint =
|
||||||
.DataOUTEndpointDoubleBank = false,
|
{
|
||||||
|
.Address = CDC_RX_EPADDR,
|
||||||
.NotificationEndpointNumber = CDC_NOTIFICATION_EPNUM,
|
.Size = CDC_TXRX_EPSIZE,
|
||||||
.NotificationEndpointSize = CDC_NOTIFICATION_EPSIZE,
|
.Banks = 1,
|
||||||
.NotificationEndpointDoubleBank = false,
|
},
|
||||||
|
.NotificationEndpoint =
|
||||||
|
{
|
||||||
|
.Address = CDC_NOTIFICATION_EPADDR,
|
||||||
|
.Size = CDC_NOTIFICATION_EPSIZE,
|
||||||
|
.Banks = 1,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -69,15 +75,18 @@ USB_ClassInfo_MS_Device_t Disk_MS_Interface =
|
||||||
.Config =
|
.Config =
|
||||||
{
|
{
|
||||||
.InterfaceNumber = 2,
|
.InterfaceNumber = 2,
|
||||||
|
.DataINEndpoint =
|
||||||
.DataINEndpointNumber = MASS_STORAGE_IN_EPNUM,
|
{
|
||||||
.DataINEndpointSize = MASS_STORAGE_IO_EPSIZE,
|
.Address = MASS_STORAGE_IN_EPADDR,
|
||||||
.DataINEndpointDoubleBank = false,
|
.Size = MASS_STORAGE_IO_EPSIZE,
|
||||||
|
.Banks = 1,
|
||||||
.DataOUTEndpointNumber = MASS_STORAGE_OUT_EPNUM,
|
},
|
||||||
.DataOUTEndpointSize = MASS_STORAGE_IO_EPSIZE,
|
.DataOUTEndpoint =
|
||||||
.DataOUTEndpointDoubleBank = false,
|
{
|
||||||
|
.Address = MASS_STORAGE_OUT_EPADDR,
|
||||||
|
.Size = MASS_STORAGE_IO_EPSIZE,
|
||||||
|
.Banks = 1,
|
||||||
|
},
|
||||||
.TotalLUNs = TOTAL_LUNS,
|
.TotalLUNs = TOTAL_LUNS,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
|
@ -176,7 +176,7 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
|
||||||
{
|
{
|
||||||
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
|
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
|
||||||
|
|
||||||
.EndpointAddress = (ENDPOINT_DIR_IN | CDC_NOTIFICATION_EPNUM),
|
.EndpointAddress = CDC_NOTIFICATION_EPADDR,
|
||||||
.Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
|
.Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
|
||||||
.EndpointSize = CDC_NOTIFICATION_EPSIZE,
|
.EndpointSize = CDC_NOTIFICATION_EPSIZE,
|
||||||
.PollingIntervalMS = 0xFF
|
.PollingIntervalMS = 0xFF
|
||||||
|
@ -202,20 +202,20 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
|
||||||
{
|
{
|
||||||
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
|
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
|
||||||
|
|
||||||
.EndpointAddress = (ENDPOINT_DIR_OUT | CDC_RX_EPNUM),
|
.EndpointAddress = CDC_RX_EPADDR,
|
||||||
.Attributes = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
|
.Attributes = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
|
||||||
.EndpointSize = CDC_TXRX_EPSIZE,
|
.EndpointSize = CDC_TXRX_EPSIZE,
|
||||||
.PollingIntervalMS = 0x01
|
.PollingIntervalMS = 0x05
|
||||||
},
|
},
|
||||||
|
|
||||||
.CDC_DataInEndpoint =
|
.CDC_DataInEndpoint =
|
||||||
{
|
{
|
||||||
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
|
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
|
||||||
|
|
||||||
.EndpointAddress = (ENDPOINT_DIR_IN | CDC_TX_EPNUM),
|
.EndpointAddress = CDC_TX_EPADDR,
|
||||||
.Attributes = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
|
.Attributes = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
|
||||||
.EndpointSize = CDC_TXRX_EPSIZE,
|
.EndpointSize = CDC_TXRX_EPSIZE,
|
||||||
.PollingIntervalMS = 0x01
|
.PollingIntervalMS = 0x05
|
||||||
},
|
},
|
||||||
|
|
||||||
.HID_Interface =
|
.HID_Interface =
|
||||||
|
@ -249,10 +249,10 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
|
||||||
{
|
{
|
||||||
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
|
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
|
||||||
|
|
||||||
.EndpointAddress = (ENDPOINT_DIR_IN | MOUSE_EPNUM),
|
.EndpointAddress = MOUSE_EPADDR,
|
||||||
.Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
|
.Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
|
||||||
.EndpointSize = MOUSE_EPSIZE,
|
.EndpointSize = MOUSE_EPSIZE,
|
||||||
.PollingIntervalMS = 0x01
|
.PollingIntervalMS = 0x05
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -42,14 +42,14 @@
|
||||||
#include <LUFA/Drivers/USB/USB.h>
|
#include <LUFA/Drivers/USB/USB.h>
|
||||||
|
|
||||||
/* Macros: */
|
/* Macros: */
|
||||||
/** Endpoint number of the CDC device-to-host notification IN endpoint. */
|
/** Endpoint address of the CDC device-to-host notification IN endpoint. */
|
||||||
#define CDC_NOTIFICATION_EPNUM 2
|
#define CDC_NOTIFICATION_EPADDR (ENDPOINT_DIR_IN | 2)
|
||||||
|
|
||||||
/** Endpoint number of the CDC device-to-host data IN endpoint. */
|
/** Endpoint address of the CDC device-to-host data IN endpoint. */
|
||||||
#define CDC_TX_EPNUM 3
|
#define CDC_TX_EPADDR (ENDPOINT_DIR_IN | 3)
|
||||||
|
|
||||||
/** Endpoint number of the CDC host-to-device data OUT endpoint. */
|
/** Endpoint address of the CDC host-to-device data OUT endpoint. */
|
||||||
#define CDC_RX_EPNUM 4
|
#define CDC_RX_EPADDR (ENDPOINT_DIR_OUT | 4)
|
||||||
|
|
||||||
/** Size in bytes of the CDC device-to-host notification IN endpoint. */
|
/** Size in bytes of the CDC device-to-host notification IN endpoint. */
|
||||||
#define CDC_NOTIFICATION_EPSIZE 8
|
#define CDC_NOTIFICATION_EPSIZE 8
|
||||||
|
@ -57,8 +57,8 @@
|
||||||
/** Size in bytes of the CDC data IN and OUT endpoints. */
|
/** Size in bytes of the CDC data IN and OUT endpoints. */
|
||||||
#define CDC_TXRX_EPSIZE 16
|
#define CDC_TXRX_EPSIZE 16
|
||||||
|
|
||||||
/** Endpoint number of the Mouse HID reporting IN endpoint. */
|
/** Endpoint address of the Mouse HID reporting IN endpoint. */
|
||||||
#define MOUSE_EPNUM 1
|
#define MOUSE_EPADDR (ENDPOINT_DIR_IN | 1)
|
||||||
|
|
||||||
/** Size in bytes of the Mouse HID reporting IN endpoint. */
|
/** Size in bytes of the Mouse HID reporting IN endpoint. */
|
||||||
#define MOUSE_EPSIZE 8
|
#define MOUSE_EPSIZE 8
|
||||||
|
|
|
@ -45,18 +45,24 @@ USB_ClassInfo_CDC_Device_t VirtualSerial_CDC_Interface =
|
||||||
.Config =
|
.Config =
|
||||||
{
|
{
|
||||||
.ControlInterfaceNumber = 0,
|
.ControlInterfaceNumber = 0,
|
||||||
|
.DataINEndpoint =
|
||||||
.DataINEndpointNumber = CDC_TX_EPNUM,
|
{
|
||||||
.DataINEndpointSize = CDC_TXRX_EPSIZE,
|
.Address = CDC_TX_EPADDR,
|
||||||
.DataINEndpointDoubleBank = false,
|
.Size = CDC_TXRX_EPSIZE,
|
||||||
|
.Banks = 1,
|
||||||
.DataOUTEndpointNumber = CDC_RX_EPNUM,
|
},
|
||||||
.DataOUTEndpointSize = CDC_TXRX_EPSIZE,
|
.DataOUTEndpoint =
|
||||||
.DataOUTEndpointDoubleBank = false,
|
{
|
||||||
|
.Address = CDC_RX_EPADDR,
|
||||||
.NotificationEndpointNumber = CDC_NOTIFICATION_EPNUM,
|
.Size = CDC_TXRX_EPSIZE,
|
||||||
.NotificationEndpointSize = CDC_NOTIFICATION_EPSIZE,
|
.Banks = 1,
|
||||||
.NotificationEndpointDoubleBank = false,
|
},
|
||||||
|
.NotificationEndpoint =
|
||||||
|
{
|
||||||
|
.Address = CDC_NOTIFICATION_EPADDR,
|
||||||
|
.Size = CDC_NOTIFICATION_EPSIZE,
|
||||||
|
.Banks = 1,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -72,11 +78,12 @@ USB_ClassInfo_HID_Device_t Mouse_HID_Interface =
|
||||||
.Config =
|
.Config =
|
||||||
{
|
{
|
||||||
.InterfaceNumber = 2,
|
.InterfaceNumber = 2,
|
||||||
|
.ReportINEndpoint =
|
||||||
.ReportINEndpointNumber = MOUSE_EPNUM,
|
{
|
||||||
.ReportINEndpointSize = MOUSE_EPSIZE,
|
.Address = MOUSE_EPADDR,
|
||||||
.ReportINEndpointDoubleBank = false,
|
.Size = MOUSE_EPSIZE,
|
||||||
|
.Banks = 1,
|
||||||
|
},
|
||||||
.PrevReportINBuffer = PrevMouseHIDReportBuffer,
|
.PrevReportINBuffer = PrevMouseHIDReportBuffer,
|
||||||
.PrevReportINBufferSize = sizeof(PrevMouseHIDReportBuffer),
|
.PrevReportINBufferSize = sizeof(PrevMouseHIDReportBuffer),
|
||||||
},
|
},
|
||||||
|
|
|
@ -89,7 +89,7 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
|
||||||
{
|
{
|
||||||
Header: {Size: sizeof(USB_Descriptor_Endpoint_t), Type: DTYPE_Endpoint},
|
Header: {Size: sizeof(USB_Descriptor_Endpoint_t), Type: DTYPE_Endpoint},
|
||||||
|
|
||||||
EndpointAddress: (ENDPOINT_DIR_IN | SIDESHOW_IN_EPNUM),
|
EndpointAddress: SIDESHOW_IN_EPADDR,
|
||||||
Attributes: EP_TYPE_BULK,
|
Attributes: EP_TYPE_BULK,
|
||||||
EndpointSize: SIDESHOW_IO_EPSIZE,
|
EndpointSize: SIDESHOW_IO_EPSIZE,
|
||||||
PollingIntervalMS: 0x00
|
PollingIntervalMS: 0x00
|
||||||
|
@ -99,7 +99,7 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
|
||||||
{
|
{
|
||||||
Header: {Size: sizeof(USB_Descriptor_Endpoint_t), Type: DTYPE_Endpoint},
|
Header: {Size: sizeof(USB_Descriptor_Endpoint_t), Type: DTYPE_Endpoint},
|
||||||
|
|
||||||
EndpointAddress: (ENDPOINT_DIR_OUT | SIDESHOW_OUT_EPNUM),
|
EndpointAddress: SIDESHOW_OUT_EPADDR,
|
||||||
Attributes: EP_TYPE_BULK,
|
Attributes: EP_TYPE_BULK,
|
||||||
EndpointSize: SIDESHOW_IO_EPSIZE,
|
EndpointSize: SIDESHOW_IO_EPSIZE,
|
||||||
PollingIntervalMS: 0x00
|
PollingIntervalMS: 0x00
|
||||||
|
|
|
@ -39,8 +39,8 @@
|
||||||
#include "Sideshow.h"
|
#include "Sideshow.h"
|
||||||
|
|
||||||
/* Macros: */
|
/* Macros: */
|
||||||
#define SIDESHOW_IN_EPNUM 3
|
#define SIDESHOW_IN_EPADDR 3
|
||||||
#define SIDESHOW_OUT_EPNUM 4
|
#define SIDESHOW_OUT_EPADDR 4
|
||||||
#define SIDESHOW_IO_EPSIZE 64
|
#define SIDESHOW_IO_EPSIZE 64
|
||||||
|
|
||||||
/* Type Defines: */
|
/* Type Defines: */
|
||||||
|
|
|
@ -47,7 +47,7 @@ void Sideshow_ProcessCommandPacket(void)
|
||||||
{
|
{
|
||||||
SideShow_PacketHeader_t PacketHeader;
|
SideShow_PacketHeader_t PacketHeader;
|
||||||
|
|
||||||
Endpoint_SelectEndpoint(SIDESHOW_OUT_EPNUM);
|
Endpoint_SelectEndpoint(SIDESHOW_OUT_EPADDR);
|
||||||
Endpoint_Read_Stream_LE(&PacketHeader, sizeof(SideShow_PacketHeader_t), NULL);
|
Endpoint_Read_Stream_LE(&PacketHeader, sizeof(SideShow_PacketHeader_t), NULL);
|
||||||
|
|
||||||
PacketHeader.Type.TypeFields.Response = true;
|
PacketHeader.Type.TypeFields.Response = true;
|
||||||
|
@ -110,7 +110,7 @@ void Sideshow_ProcessCommandPacket(void)
|
||||||
PacketHeader.Length = sizeof(SideShow_PacketHeader_t);
|
PacketHeader.Length = sizeof(SideShow_PacketHeader_t);
|
||||||
PacketHeader.Type.TypeFields.NAK = true;
|
PacketHeader.Type.TypeFields.NAK = true;
|
||||||
|
|
||||||
Endpoint_SelectEndpoint(SIDESHOW_IN_EPNUM);
|
Endpoint_SelectEndpoint(SIDESHOW_IN_EPADDR);
|
||||||
Endpoint_Write_Stream_LE(&PacketHeader, sizeof(SideShow_PacketHeader_t), NULL);
|
Endpoint_Write_Stream_LE(&PacketHeader, sizeof(SideShow_PacketHeader_t), NULL);
|
||||||
Endpoint_ClearIN();
|
Endpoint_ClearIN();
|
||||||
|
|
||||||
|
@ -122,7 +122,7 @@ static void SideShow_Ping(SideShow_PacketHeader_t* const PacketHeader)
|
||||||
{
|
{
|
||||||
Endpoint_ClearOUT();
|
Endpoint_ClearOUT();
|
||||||
|
|
||||||
Endpoint_SelectEndpoint(SIDESHOW_IN_EPNUM);
|
Endpoint_SelectEndpoint(SIDESHOW_IN_EPADDR);
|
||||||
Endpoint_Write_Stream_LE(PacketHeader, sizeof(SideShow_PacketHeader_t), NULL);
|
Endpoint_Write_Stream_LE(PacketHeader, sizeof(SideShow_PacketHeader_t), NULL);
|
||||||
Endpoint_ClearIN();
|
Endpoint_ClearIN();
|
||||||
}
|
}
|
||||||
|
@ -137,7 +137,7 @@ static void SideShow_Sync(SideShow_PacketHeader_t* const PacketHeader)
|
||||||
if (!(GUID_COMPARE(&ProtocolGUID, (uint32_t[])STANDARD_PROTOCOL_GUID)))
|
if (!(GUID_COMPARE(&ProtocolGUID, (uint32_t[])STANDARD_PROTOCOL_GUID)))
|
||||||
PacketHeader->Type.TypeFields.NAK = true;
|
PacketHeader->Type.TypeFields.NAK = true;
|
||||||
|
|
||||||
Endpoint_SelectEndpoint(SIDESHOW_IN_EPNUM);
|
Endpoint_SelectEndpoint(SIDESHOW_IN_EPADDR);
|
||||||
Endpoint_Write_Stream_LE(PacketHeader, sizeof(SideShow_PacketHeader_t), NULL);
|
Endpoint_Write_Stream_LE(PacketHeader, sizeof(SideShow_PacketHeader_t), NULL);
|
||||||
Endpoint_Write_Stream_LE(&ProtocolGUID, sizeof(GUID_t), NULL);
|
Endpoint_Write_Stream_LE(&ProtocolGUID, sizeof(GUID_t), NULL);
|
||||||
Endpoint_ClearIN();
|
Endpoint_ClearIN();
|
||||||
|
@ -149,7 +149,7 @@ static void SideShow_GetCurrentUser(SideShow_PacketHeader_t* const PacketHeader)
|
||||||
|
|
||||||
PacketHeader->Length = sizeof(SideShow_PacketHeader_t) + sizeof(uint32_t) + UserSID.LengthInBytes;
|
PacketHeader->Length = sizeof(SideShow_PacketHeader_t) + sizeof(uint32_t) + UserSID.LengthInBytes;
|
||||||
|
|
||||||
Endpoint_SelectEndpoint(SIDESHOW_IN_EPNUM);
|
Endpoint_SelectEndpoint(SIDESHOW_IN_EPADDR);
|
||||||
Endpoint_Write_Stream_LE(PacketHeader, sizeof(SideShow_PacketHeader_t), NULL);
|
Endpoint_Write_Stream_LE(PacketHeader, sizeof(SideShow_PacketHeader_t), NULL);
|
||||||
SideShow_Write_Unicode_String(&UserSID);
|
SideShow_Write_Unicode_String(&UserSID);
|
||||||
Endpoint_ClearIN();
|
Endpoint_ClearIN();
|
||||||
|
@ -162,7 +162,7 @@ static void SideShow_SetCurrentUser(SideShow_PacketHeader_t* const PacketHeader)
|
||||||
|
|
||||||
PacketHeader->Length = sizeof(SideShow_PacketHeader_t);
|
PacketHeader->Length = sizeof(SideShow_PacketHeader_t);
|
||||||
|
|
||||||
Endpoint_SelectEndpoint(SIDESHOW_IN_EPNUM);
|
Endpoint_SelectEndpoint(SIDESHOW_IN_EPADDR);
|
||||||
Endpoint_Write_Stream_LE(PacketHeader, sizeof(SideShow_PacketHeader_t), NULL);
|
Endpoint_Write_Stream_LE(PacketHeader, sizeof(SideShow_PacketHeader_t), NULL);
|
||||||
Endpoint_ClearIN();
|
Endpoint_ClearIN();
|
||||||
}
|
}
|
||||||
|
@ -254,7 +254,7 @@ static void SideShow_GetCapabilities(SideShow_PacketHeader_t* const PacketHeader
|
||||||
Property.PropertyGUID.Chunks[2], Property.PropertyGUID.Chunks[3]);
|
Property.PropertyGUID.Chunks[2], Property.PropertyGUID.Chunks[3]);
|
||||||
}
|
}
|
||||||
|
|
||||||
Endpoint_SelectEndpoint(SIDESHOW_IN_EPNUM);
|
Endpoint_SelectEndpoint(SIDESHOW_IN_EPADDR);
|
||||||
Endpoint_Write_Stream_LE(PacketHeader, sizeof(SideShow_PacketHeader_t), NULL);
|
Endpoint_Write_Stream_LE(PacketHeader, sizeof(SideShow_PacketHeader_t), NULL);
|
||||||
|
|
||||||
if (!(PacketHeader->Type.TypeFields.NAK))
|
if (!(PacketHeader->Type.TypeFields.NAK))
|
||||||
|
@ -288,7 +288,7 @@ static void SideShow_GetString(SideShow_PacketHeader_t* const PacketHeader,
|
||||||
PacketHeader->Length = sizeof(SideShow_PacketHeader_t) +
|
PacketHeader->Length = sizeof(SideShow_PacketHeader_t) +
|
||||||
sizeof(uint32_t) + ((Unicode_String_t*)UnicodeStruct)->LengthInBytes;
|
sizeof(uint32_t) + ((Unicode_String_t*)UnicodeStruct)->LengthInBytes;
|
||||||
|
|
||||||
Endpoint_SelectEndpoint(SIDESHOW_IN_EPNUM);
|
Endpoint_SelectEndpoint(SIDESHOW_IN_EPADDR);
|
||||||
Endpoint_Write_Stream_LE(PacketHeader, sizeof(SideShow_PacketHeader_t), NULL);
|
Endpoint_Write_Stream_LE(PacketHeader, sizeof(SideShow_PacketHeader_t), NULL);
|
||||||
SideShow_Write_Unicode_String(UnicodeStruct);
|
SideShow_Write_Unicode_String(UnicodeStruct);
|
||||||
Endpoint_ClearIN();
|
Endpoint_ClearIN();
|
||||||
|
@ -309,7 +309,7 @@ static void SideShow_GetApplicationOrder(SideShow_PacketHeader_t* const PacketHe
|
||||||
PacketHeader->Length = sizeof(SideShow_PacketHeader_t) +
|
PacketHeader->Length = sizeof(SideShow_PacketHeader_t) +
|
||||||
sizeof(uint32_t) + (TotalApplications * sizeof(GUID_t));
|
sizeof(uint32_t) + (TotalApplications * sizeof(GUID_t));
|
||||||
|
|
||||||
Endpoint_SelectEndpoint(SIDESHOW_IN_EPNUM);
|
Endpoint_SelectEndpoint(SIDESHOW_IN_EPADDR);
|
||||||
Endpoint_Write_Stream_LE(PacketHeader, sizeof(SideShow_PacketHeader_t), NULL);
|
Endpoint_Write_Stream_LE(PacketHeader, sizeof(SideShow_PacketHeader_t), NULL);
|
||||||
Endpoint_Write_32_LE(TotalApplications);
|
Endpoint_Write_32_LE(TotalApplications);
|
||||||
|
|
||||||
|
@ -330,7 +330,7 @@ static void SideShow_GetSupportedEndpoints(SideShow_PacketHeader_t* const Packet
|
||||||
|
|
||||||
PacketHeader->Length = sizeof(SideShow_PacketHeader_t) + sizeof(uint32_t) + sizeof(GUID_t);
|
PacketHeader->Length = sizeof(SideShow_PacketHeader_t) + sizeof(uint32_t) + sizeof(GUID_t);
|
||||||
|
|
||||||
Endpoint_SelectEndpoint(SIDESHOW_IN_EPNUM);
|
Endpoint_SelectEndpoint(SIDESHOW_IN_EPADDR);
|
||||||
Endpoint_Write_Stream_LE(PacketHeader, sizeof(SideShow_PacketHeader_t), NULL);
|
Endpoint_Write_Stream_LE(PacketHeader, sizeof(SideShow_PacketHeader_t), NULL);
|
||||||
Endpoint_Write_32_LE(1);
|
Endpoint_Write_32_LE(1);
|
||||||
Endpoint_Write_Stream_LE(&SupportedEndpointGUID, sizeof(GUID_t), NULL);
|
Endpoint_Write_Stream_LE(&SupportedEndpointGUID, sizeof(GUID_t), NULL);
|
||||||
|
@ -377,7 +377,7 @@ static void SideShow_AddApplication(SideShow_PacketHeader_t* const PacketHeader)
|
||||||
|
|
||||||
PacketHeader->Length = sizeof(SideShow_PacketHeader_t);
|
PacketHeader->Length = sizeof(SideShow_PacketHeader_t);
|
||||||
|
|
||||||
Endpoint_SelectEndpoint(SIDESHOW_IN_EPNUM);
|
Endpoint_SelectEndpoint(SIDESHOW_IN_EPADDR);
|
||||||
Endpoint_Write_Stream_LE(PacketHeader, sizeof(SideShow_PacketHeader_t), NULL);
|
Endpoint_Write_Stream_LE(PacketHeader, sizeof(SideShow_PacketHeader_t), NULL);
|
||||||
Endpoint_ClearIN();
|
Endpoint_ClearIN();
|
||||||
}
|
}
|
||||||
|
@ -398,7 +398,7 @@ static void SideShow_DeleteApplication(SideShow_PacketHeader_t* const PacketHead
|
||||||
|
|
||||||
PacketHeader->Length = sizeof(SideShow_PacketHeader_t);
|
PacketHeader->Length = sizeof(SideShow_PacketHeader_t);
|
||||||
|
|
||||||
Endpoint_SelectEndpoint(SIDESHOW_IN_EPNUM);
|
Endpoint_SelectEndpoint(SIDESHOW_IN_EPADDR);
|
||||||
Endpoint_Write_Stream_LE(PacketHeader, sizeof(SideShow_PacketHeader_t), NULL);
|
Endpoint_Write_Stream_LE(PacketHeader, sizeof(SideShow_PacketHeader_t), NULL);
|
||||||
Endpoint_ClearIN();
|
Endpoint_ClearIN();
|
||||||
}
|
}
|
||||||
|
@ -410,7 +410,7 @@ static void SideShow_DeleteAllApplications(SideShow_PacketHeader_t* const Packet
|
||||||
for (uint8_t App = 0; App < MAX_APPLICATIONS; App++)
|
for (uint8_t App = 0; App < MAX_APPLICATIONS; App++)
|
||||||
InstalledApplications[App].InUse = false;
|
InstalledApplications[App].InUse = false;
|
||||||
|
|
||||||
Endpoint_SelectEndpoint(SIDESHOW_IN_EPNUM);
|
Endpoint_SelectEndpoint(SIDESHOW_IN_EPADDR);
|
||||||
Endpoint_Write_Stream_LE(PacketHeader, sizeof(SideShow_PacketHeader_t), NULL);
|
Endpoint_Write_Stream_LE(PacketHeader, sizeof(SideShow_PacketHeader_t), NULL);
|
||||||
Endpoint_ClearIN();
|
Endpoint_ClearIN();
|
||||||
}
|
}
|
||||||
|
@ -440,7 +440,7 @@ static void SideShow_AddContent(SideShow_PacketHeader_t* const PacketHeader)
|
||||||
|
|
||||||
PacketHeader->Length = sizeof(SideShow_PacketHeader_t);
|
PacketHeader->Length = sizeof(SideShow_PacketHeader_t);
|
||||||
|
|
||||||
Endpoint_SelectEndpoint(SIDESHOW_IN_EPNUM);
|
Endpoint_SelectEndpoint(SIDESHOW_IN_EPADDR);
|
||||||
Endpoint_Write_Stream_LE(PacketHeader, sizeof(SideShow_PacketHeader_t), NULL);
|
Endpoint_Write_Stream_LE(PacketHeader, sizeof(SideShow_PacketHeader_t), NULL);
|
||||||
Endpoint_ClearIN();
|
Endpoint_ClearIN();
|
||||||
}
|
}
|
||||||
|
@ -465,7 +465,7 @@ static void SideShow_DeleteContent(SideShow_PacketHeader_t* const PacketHeader)
|
||||||
|
|
||||||
PacketHeader->Length = sizeof(SideShow_PacketHeader_t);
|
PacketHeader->Length = sizeof(SideShow_PacketHeader_t);
|
||||||
|
|
||||||
Endpoint_SelectEndpoint(SIDESHOW_IN_EPNUM);
|
Endpoint_SelectEndpoint(SIDESHOW_IN_EPADDR);
|
||||||
Endpoint_Write_Stream_LE(PacketHeader, sizeof(SideShow_PacketHeader_t), NULL);
|
Endpoint_Write_Stream_LE(PacketHeader, sizeof(SideShow_PacketHeader_t), NULL);
|
||||||
Endpoint_ClearIN();
|
Endpoint_ClearIN();
|
||||||
}
|
}
|
||||||
|
@ -488,7 +488,7 @@ static void SideShow_DeleteAllContent(SideShow_PacketHeader_t* const PacketHeade
|
||||||
|
|
||||||
PacketHeader->Length = sizeof(SideShow_PacketHeader_t);
|
PacketHeader->Length = sizeof(SideShow_PacketHeader_t);
|
||||||
|
|
||||||
Endpoint_SelectEndpoint(SIDESHOW_IN_EPNUM);
|
Endpoint_SelectEndpoint(SIDESHOW_IN_EPADDR);
|
||||||
Endpoint_Write_Stream_LE(PacketHeader, sizeof(SideShow_PacketHeader_t), NULL);
|
Endpoint_Write_Stream_LE(PacketHeader, sizeof(SideShow_PacketHeader_t), NULL);
|
||||||
Endpoint_ClearIN();
|
Endpoint_ClearIN();
|
||||||
}
|
}
|
||||||
|
|
|
@ -101,10 +101,8 @@ void EVENT_USB_Device_ConfigurationChanged(void)
|
||||||
bool ConfigSuccess = true;
|
bool ConfigSuccess = true;
|
||||||
|
|
||||||
/* Setup Sideshow Data Endpoints */
|
/* Setup Sideshow Data Endpoints */
|
||||||
ConfigSuccess &= Endpoint_ConfigureEndpoint(SIDESHOW_IN_EPNUM, EP_TYPE_BULK, ENDPOINT_DIR_IN,
|
ConfigSuccess &= Endpoint_ConfigureEndpoint(SIDESHOW_IN_EPADDR, EP_TYPE_BULK, SIDESHOW_IO_EPSIZE, 1);
|
||||||
SIDESHOW_IO_EPSIZE, ENDPOINT_BANK_SINGLE);
|
ConfigSuccess &= Endpoint_ConfigureEndpoint(SIDESHOW_OUT_EPADDR, EP_TYPE_BULK, SIDESHOW_IO_EPSIZE, 1);
|
||||||
ConfigSuccess &= Endpoint_ConfigureEndpoint(SIDESHOW_OUT_EPNUM, EP_TYPE_BULK, ENDPOINT_DIR_OUT,
|
|
||||||
SIDESHOW_IO_EPSIZE, ENDPOINT_BANK_SINGLE);
|
|
||||||
|
|
||||||
/* Indicate endpoint configuration success or failure */
|
/* Indicate endpoint configuration success or failure */
|
||||||
LEDs_SetAllLEDs(ConfigSuccess ? LEDMASK_USB_READY : LEDMASK_USB_ERROR);
|
LEDs_SetAllLEDs(ConfigSuccess ? LEDMASK_USB_READY : LEDMASK_USB_ERROR);
|
||||||
|
@ -142,7 +140,7 @@ void SideShow_Task(void)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/* Select the SideShow data out endpoint */
|
/* Select the SideShow data out endpoint */
|
||||||
Endpoint_SelectEndpoint(SIDESHOW_OUT_EPNUM);
|
Endpoint_SelectEndpoint(SIDESHOW_OUT_EPADDR);
|
||||||
|
|
||||||
/* Check to see if a new SideShow message has been received */
|
/* Check to see if a new SideShow message has been received */
|
||||||
if (Endpoint_IsReadWriteAllowed())
|
if (Endpoint_IsReadWriteAllowed())
|
||||||
|
|
|
@ -119,27 +119,27 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
|
||||||
{
|
{
|
||||||
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
|
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
|
||||||
|
|
||||||
.EndpointAddress = (ENDPOINT_DIR_OUT | TMC_OUT_EPNUM),
|
.EndpointAddress = TMC_OUT_EPADDR,
|
||||||
.Attributes = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
|
.Attributes = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
|
||||||
.EndpointSize = TMC_IO_EPSIZE,
|
.EndpointSize = TMC_IO_EPSIZE,
|
||||||
.PollingIntervalMS = 0x01
|
.PollingIntervalMS = 0x05
|
||||||
},
|
},
|
||||||
|
|
||||||
.TM_DataInEndpoint =
|
.TM_DataInEndpoint =
|
||||||
{
|
{
|
||||||
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
|
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
|
||||||
|
|
||||||
.EndpointAddress = (ENDPOINT_DIR_IN | TMC_IN_EPNUM),
|
.EndpointAddress = TMC_IN_EPADDR,
|
||||||
.Attributes = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
|
.Attributes = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
|
||||||
.EndpointSize = TMC_IO_EPSIZE,
|
.EndpointSize = TMC_IO_EPSIZE,
|
||||||
.PollingIntervalMS = 0x01
|
.PollingIntervalMS = 0x05
|
||||||
},
|
},
|
||||||
|
|
||||||
.TM_NotificationEndpoint =
|
.TM_NotificationEndpoint =
|
||||||
{
|
{
|
||||||
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
|
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
|
||||||
|
|
||||||
.EndpointAddress = (ENDPOINT_DIR_IN | TMC_NOTIFICATION_EPNUM),
|
.EndpointAddress = TMC_NOTIFICATION_EPADDR,
|
||||||
.Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
|
.Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
|
||||||
.EndpointSize = TMC_NOTIFICATION_EPSIZE,
|
.EndpointSize = TMC_NOTIFICATION_EPSIZE,
|
||||||
.PollingIntervalMS = 0xFF
|
.PollingIntervalMS = 0xFF
|
||||||
|
|
|
@ -43,20 +43,20 @@
|
||||||
#include <LUFA/Drivers/USB/USB.h>
|
#include <LUFA/Drivers/USB/USB.h>
|
||||||
|
|
||||||
/* Macros: */
|
/* Macros: */
|
||||||
/** Endpoint number of the TMC notification IN endpoint. */
|
/** Endpoint address of the TMC notification IN endpoint. */
|
||||||
#define TMC_NOTIFICATION_EPNUM 2
|
#define TMC_NOTIFICATION_EPADDR (ENDPOINT_DIR_IN | 2)
|
||||||
|
|
||||||
/** Endpoint number of the TMC device-to-host data IN endpoint. */
|
/** Endpoint address of the TMC device-to-host data IN endpoint. */
|
||||||
#define TMC_IN_EPNUM 3
|
#define TMC_IN_EPADDR (ENDPOINT_DIR_IN | 3)
|
||||||
|
|
||||||
/** Endpoint number of the TMC host-to-device data OUT endpoint. */
|
/** Endpoint address of the TMC host-to-device data OUT endpoint. */
|
||||||
#define TMC_OUT_EPNUM 4
|
#define TMC_OUT_EPADDR (ENDPOINT_DIR_OUT | 4)
|
||||||
|
|
||||||
/** Size in bytes of the TMC data endpoints. */
|
/** Size in bytes of the TMC data endpoints. */
|
||||||
#define TMC_IO_EPSIZE 64
|
#define TMC_IO_EPSIZE 64
|
||||||
|
|
||||||
/** Size in bytes of the TMC notification endpoint. */
|
/** Size in bytes of the TMC notification endpoint. */
|
||||||
#define TMC_NOTIFICATION_EPSIZE 8
|
#define TMC_NOTIFICATION_EPSIZE 8
|
||||||
|
|
||||||
/* Type Defines: */
|
/* Type Defines: */
|
||||||
/** Type define for the device configuration descriptor structure. This must be defined in the
|
/** Type define for the device configuration descriptor structure. This must be defined in the
|
||||||
|
|
|
@ -129,12 +129,9 @@ void EVENT_USB_Device_ConfigurationChanged(void)
|
||||||
bool ConfigSuccess = true;
|
bool ConfigSuccess = true;
|
||||||
|
|
||||||
/* Setup TMC In, Out and Notification Endpoints */
|
/* Setup TMC In, Out and Notification Endpoints */
|
||||||
ConfigSuccess &= Endpoint_ConfigureEndpoint(TMC_NOTIFICATION_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_IN,
|
ConfigSuccess &= Endpoint_ConfigureEndpoint(TMC_NOTIFICATION_EPADDR, EP_TYPE_INTERRUPT, TMC_IO_EPSIZE, 1);
|
||||||
TMC_IO_EPSIZE, ENDPOINT_BANK_SINGLE);
|
ConfigSuccess &= Endpoint_ConfigureEndpoint(TMC_IN_EPADDR, EP_TYPE_BULK, TMC_IO_EPSIZE, 1);
|
||||||
ConfigSuccess &= Endpoint_ConfigureEndpoint(TMC_IN_EPNUM, EP_TYPE_BULK, ENDPOINT_DIR_IN,
|
ConfigSuccess &= Endpoint_ConfigureEndpoint(TMC_OUT_EPADDR, EP_TYPE_BULK, TMC_IO_EPSIZE, 1);
|
||||||
TMC_IO_EPSIZE, ENDPOINT_BANK_SINGLE);
|
|
||||||
ConfigSuccess &= Endpoint_ConfigureEndpoint(TMC_OUT_EPNUM, EP_TYPE_BULK, ENDPOINT_DIR_OUT,
|
|
||||||
TMC_IO_EPSIZE, ENDPOINT_BANK_SINGLE);
|
|
||||||
|
|
||||||
/* Indicate endpoint configuration success or failure */
|
/* Indicate endpoint configuration success or failure */
|
||||||
LEDs_SetAllLEDs(ConfigSuccess ? LEDMASK_USB_READY : LEDMASK_USB_ERROR);
|
LEDs_SetAllLEDs(ConfigSuccess ? LEDMASK_USB_READY : LEDMASK_USB_ERROR);
|
||||||
|
@ -418,7 +415,7 @@ bool ReadTMCHeader(TMC_MessageHeader_t* const MessageHeader)
|
||||||
uint8_t ErrorCode;
|
uint8_t ErrorCode;
|
||||||
|
|
||||||
/* Select the Data Out endpoint */
|
/* Select the Data Out endpoint */
|
||||||
Endpoint_SelectEndpoint(TMC_OUT_EPNUM);
|
Endpoint_SelectEndpoint(TMC_OUT_EPADDR);
|
||||||
|
|
||||||
/* Abort if no command has been sent from the host */
|
/* Abort if no command has been sent from the host */
|
||||||
if (!(Endpoint_IsOUTReceived()))
|
if (!(Endpoint_IsOUTReceived()))
|
||||||
|
@ -450,7 +447,7 @@ bool WriteTMCHeader(TMC_MessageHeader_t* const MessageHeader)
|
||||||
MessageHeader->InverseTag = ~CurrentTransferTag;
|
MessageHeader->InverseTag = ~CurrentTransferTag;
|
||||||
|
|
||||||
/* Select the Data In endpoint */
|
/* Select the Data In endpoint */
|
||||||
Endpoint_SelectEndpoint(TMC_IN_EPNUM);
|
Endpoint_SelectEndpoint(TMC_IN_EPADDR);
|
||||||
|
|
||||||
/* Send the command header to the host */
|
/* Send the command header to the host */
|
||||||
BytesTransferred = 0;
|
BytesTransferred = 0;
|
||||||
|
|
|
@ -118,8 +118,7 @@ void EVENT_USB_Device_ConfigurationChanged(void)
|
||||||
bool ConfigSuccess = true;
|
bool ConfigSuccess = true;
|
||||||
|
|
||||||
/* Setup Audio Stream Endpoint */
|
/* Setup Audio Stream Endpoint */
|
||||||
ConfigSuccess &= Endpoint_ConfigureEndpoint(AUDIO_STREAM_EPNUM, EP_TYPE_ISOCHRONOUS, ENDPOINT_DIR_IN,
|
ConfigSuccess &= Endpoint_ConfigureEndpoint(AUDIO_STREAM_EPADDR, EP_TYPE_ISOCHRONOUS, AUDIO_STREAM_EPSIZE, 2);
|
||||||
AUDIO_STREAM_EPSIZE, ENDPOINT_BANK_DOUBLE);
|
|
||||||
|
|
||||||
/* Indicate endpoint configuration success or failure */
|
/* Indicate endpoint configuration success or failure */
|
||||||
LEDs_SetAllLEDs(ConfigSuccess ? LEDMASK_USB_READY : LEDMASK_USB_ERROR);
|
LEDs_SetAllLEDs(ConfigSuccess ? LEDMASK_USB_READY : LEDMASK_USB_ERROR);
|
||||||
|
@ -165,7 +164,7 @@ void EVENT_USB_Device_ControlRequest(void)
|
||||||
uint8_t EndpointControl = (USB_ControlRequest.wValue >> 8);
|
uint8_t EndpointControl = (USB_ControlRequest.wValue >> 8);
|
||||||
|
|
||||||
/* Only handle SET CURRENT requests to the audio endpoint's sample frequency property */
|
/* Only handle SET CURRENT requests to the audio endpoint's sample frequency property */
|
||||||
if ((EndpointAddress == (ENDPOINT_DIR_IN | AUDIO_STREAM_EPNUM)) && (EndpointControl == AUDIO_EPCONTROL_SamplingFreq))
|
if ((EndpointAddress == AUDIO_STREAM_EPADDR) && (EndpointControl == AUDIO_EPCONTROL_SamplingFreq))
|
||||||
{
|
{
|
||||||
uint8_t SampleRate[3];
|
uint8_t SampleRate[3];
|
||||||
|
|
||||||
|
@ -190,7 +189,7 @@ void EVENT_USB_Device_ControlRequest(void)
|
||||||
uint8_t EndpointControl = (USB_ControlRequest.wValue >> 8);
|
uint8_t EndpointControl = (USB_ControlRequest.wValue >> 8);
|
||||||
|
|
||||||
/* Only handle GET CURRENT requests to the audio endpoint's sample frequency property */
|
/* Only handle GET CURRENT requests to the audio endpoint's sample frequency property */
|
||||||
if ((EndpointAddress == (ENDPOINT_DIR_IN | AUDIO_STREAM_EPNUM)) && (EndpointControl == AUDIO_EPCONTROL_SamplingFreq))
|
if ((EndpointAddress == AUDIO_STREAM_EPADDR) && (EndpointControl == AUDIO_EPCONTROL_SamplingFreq))
|
||||||
{
|
{
|
||||||
uint8_t SampleRate[3];
|
uint8_t SampleRate[3];
|
||||||
|
|
||||||
|
@ -215,7 +214,7 @@ ISR(TIMER0_COMPA_vect, ISR_BLOCK)
|
||||||
uint8_t PrevEndpoint = Endpoint_GetCurrentEndpoint();
|
uint8_t PrevEndpoint = Endpoint_GetCurrentEndpoint();
|
||||||
|
|
||||||
/* Select the audio stream endpoint */
|
/* Select the audio stream endpoint */
|
||||||
Endpoint_SelectEndpoint(AUDIO_STREAM_EPNUM);
|
Endpoint_SelectEndpoint(AUDIO_STREAM_EPADDR);
|
||||||
|
|
||||||
/* Check if the current endpoint can be written to and that the audio interface is enabled */
|
/* Check if the current endpoint can be written to and that the audio interface is enabled */
|
||||||
if (Endpoint_IsINReady() && StreamingAudioInterfaceSelected)
|
if (Endpoint_IsINReady() && StreamingAudioInterfaceSelected)
|
||||||
|
|
|
@ -220,7 +220,7 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
|
||||||
{
|
{
|
||||||
.Header = {.Size = sizeof(USB_Audio_Descriptor_StreamEndpoint_Std_t), .Type = DTYPE_Endpoint},
|
.Header = {.Size = sizeof(USB_Audio_Descriptor_StreamEndpoint_Std_t), .Type = DTYPE_Endpoint},
|
||||||
|
|
||||||
.EndpointAddress = (ENDPOINT_DIR_IN | AUDIO_STREAM_EPNUM),
|
.EndpointAddress = AUDIO_STREAM_EPADDR,
|
||||||
.Attributes = (EP_TYPE_ISOCHRONOUS | ENDPOINT_ATTR_SYNC | ENDPOINT_USAGE_DATA),
|
.Attributes = (EP_TYPE_ISOCHRONOUS | ENDPOINT_ATTR_SYNC | ENDPOINT_USAGE_DATA),
|
||||||
.EndpointSize = AUDIO_STREAM_EPSIZE,
|
.EndpointSize = AUDIO_STREAM_EPSIZE,
|
||||||
.PollingIntervalMS = 0x01
|
.PollingIntervalMS = 0x01
|
||||||
|
|
|
@ -42,14 +42,11 @@
|
||||||
#include <avr/pgmspace.h>
|
#include <avr/pgmspace.h>
|
||||||
|
|
||||||
/* Macros: */
|
/* Macros: */
|
||||||
/** Endpoint number of the Audio isochronous streaming data endpoint. */
|
/** Endpoint address of the Audio isochronous streaming data IN endpoint. */
|
||||||
#define AUDIO_STREAM_EPNUM 1
|
#define AUDIO_STREAM_EPADDR (ENDPOINT_DIR_IN | 1)
|
||||||
|
|
||||||
/** Endpoint size in bytes of the Audio isochronous streaming data endpoint. The Windows audio stack requires
|
/** Endpoint size in bytes of the Audio isochronous streaming data endpoint. */
|
||||||
* at least 192 bytes for correct output, thus the smaller 128 byte maximum endpoint size on some of the smaller
|
#define AUDIO_STREAM_EPSIZE 256
|
||||||
* USB AVR models will result in unavoidable distorted output.
|
|
||||||
*/
|
|
||||||
#define AUDIO_STREAM_EPSIZE ENDPOINT_MAX_SIZE(AUDIO_STREAM_EPNUM)
|
|
||||||
|
|
||||||
/* Type Defines: */
|
/* Type Defines: */
|
||||||
/** Type define for the device configuration descriptor structure. This must be defined in the
|
/** Type define for the device configuration descriptor structure. This must be defined in the
|
||||||
|
|
|
@ -144,8 +144,7 @@ void EVENT_USB_Device_ConfigurationChanged(void)
|
||||||
bool ConfigSuccess = true;
|
bool ConfigSuccess = true;
|
||||||
|
|
||||||
/* Setup Audio Stream Endpoint */
|
/* Setup Audio Stream Endpoint */
|
||||||
ConfigSuccess &= Endpoint_ConfigureEndpoint(AUDIO_STREAM_EPNUM, EP_TYPE_ISOCHRONOUS, ENDPOINT_DIR_OUT,
|
ConfigSuccess &= Endpoint_ConfigureEndpoint(AUDIO_STREAM_EPADDR, EP_TYPE_ISOCHRONOUS, AUDIO_STREAM_EPSIZE, 2);
|
||||||
AUDIO_STREAM_EPSIZE, ENDPOINT_BANK_DOUBLE);
|
|
||||||
|
|
||||||
/* Indicate endpoint configuration success or failure */
|
/* Indicate endpoint configuration success or failure */
|
||||||
LEDs_SetAllLEDs(ConfigSuccess ? LEDMASK_USB_READY : LEDMASK_USB_ERROR);
|
LEDs_SetAllLEDs(ConfigSuccess ? LEDMASK_USB_READY : LEDMASK_USB_ERROR);
|
||||||
|
@ -191,7 +190,7 @@ void EVENT_USB_Device_ControlRequest(void)
|
||||||
uint8_t EndpointControl = (USB_ControlRequest.wValue >> 8);
|
uint8_t EndpointControl = (USB_ControlRequest.wValue >> 8);
|
||||||
|
|
||||||
/* Only handle SET CURRENT requests to the audio endpoint's sample frequency property */
|
/* Only handle SET CURRENT requests to the audio endpoint's sample frequency property */
|
||||||
if ((EndpointAddress == (ENDPOINT_DIR_OUT | AUDIO_STREAM_EPNUM)) && (EndpointControl == AUDIO_EPCONTROL_SamplingFreq))
|
if ((EndpointAddress == AUDIO_STREAM_EPADDR) && (EndpointControl == AUDIO_EPCONTROL_SamplingFreq))
|
||||||
{
|
{
|
||||||
uint8_t SampleRate[3];
|
uint8_t SampleRate[3];
|
||||||
|
|
||||||
|
@ -216,7 +215,7 @@ void EVENT_USB_Device_ControlRequest(void)
|
||||||
uint8_t EndpointControl = (USB_ControlRequest.wValue >> 8);
|
uint8_t EndpointControl = (USB_ControlRequest.wValue >> 8);
|
||||||
|
|
||||||
/* Only handle GET CURRENT requests to the audio endpoint's sample frequency property */
|
/* Only handle GET CURRENT requests to the audio endpoint's sample frequency property */
|
||||||
if ((EndpointAddress == (ENDPOINT_DIR_OUT | AUDIO_STREAM_EPNUM)) && (EndpointControl == AUDIO_EPCONTROL_SamplingFreq))
|
if ((EndpointAddress == AUDIO_STREAM_EPADDR) && (EndpointControl == AUDIO_EPCONTROL_SamplingFreq))
|
||||||
{
|
{
|
||||||
uint8_t SampleRate[3];
|
uint8_t SampleRate[3];
|
||||||
|
|
||||||
|
@ -241,7 +240,7 @@ ISR(TIMER0_COMPA_vect, ISR_BLOCK)
|
||||||
uint8_t PrevEndpoint = Endpoint_GetCurrentEndpoint();
|
uint8_t PrevEndpoint = Endpoint_GetCurrentEndpoint();
|
||||||
|
|
||||||
/* Select the audio stream endpoint */
|
/* Select the audio stream endpoint */
|
||||||
Endpoint_SelectEndpoint(AUDIO_STREAM_EPNUM);
|
Endpoint_SelectEndpoint(AUDIO_STREAM_EPADDR);
|
||||||
|
|
||||||
/* Check if the current endpoint can be read from (contains a packet) and the host is sending data */
|
/* Check if the current endpoint can be read from (contains a packet) and the host is sending data */
|
||||||
if (Endpoint_IsOUTReceived() && StreamingAudioInterfaceSelected)
|
if (Endpoint_IsOUTReceived() && StreamingAudioInterfaceSelected)
|
||||||
|
|
|
@ -220,7 +220,7 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
|
||||||
{
|
{
|
||||||
.Header = {.Size = sizeof(USB_Audio_Descriptor_StreamEndpoint_Std_t), .Type = DTYPE_Endpoint},
|
.Header = {.Size = sizeof(USB_Audio_Descriptor_StreamEndpoint_Std_t), .Type = DTYPE_Endpoint},
|
||||||
|
|
||||||
.EndpointAddress = (ENDPOINT_DIR_OUT | AUDIO_STREAM_EPNUM),
|
.EndpointAddress = AUDIO_STREAM_EPADDR,
|
||||||
.Attributes = (EP_TYPE_ISOCHRONOUS | ENDPOINT_ATTR_SYNC | ENDPOINT_USAGE_DATA),
|
.Attributes = (EP_TYPE_ISOCHRONOUS | ENDPOINT_ATTR_SYNC | ENDPOINT_USAGE_DATA),
|
||||||
.EndpointSize = AUDIO_STREAM_EPSIZE,
|
.EndpointSize = AUDIO_STREAM_EPSIZE,
|
||||||
.PollingIntervalMS = 0x01
|
.PollingIntervalMS = 0x01
|
||||||
|
|
|
@ -42,14 +42,11 @@
|
||||||
#include <avr/pgmspace.h>
|
#include <avr/pgmspace.h>
|
||||||
|
|
||||||
/* Macros: */
|
/* Macros: */
|
||||||
/** Endpoint number of the Audio isochronous streaming data endpoint. */
|
/** Endpoint address of the Audio isochronous streaming data OUT endpoint. */
|
||||||
#define AUDIO_STREAM_EPNUM 1
|
#define AUDIO_STREAM_EPADDR (ENDPOINT_DIR_OUT | 1)
|
||||||
|
|
||||||
/** Endpoint size in bytes of the Audio isochronous streaming data endpoint. The Windows audio stack requires
|
/** Endpoint size in bytes of the Audio isochronous streaming data endpoint. */
|
||||||
* at least 192 bytes for correct output, thus the smaller 128 byte maximum endpoint size on some of the smaller
|
#define AUDIO_STREAM_EPSIZE 256
|
||||||
* USB AVR models will result in unavoidable distorted output.
|
|
||||||
*/
|
|
||||||
#define AUDIO_STREAM_EPSIZE ENDPOINT_MAX_SIZE(AUDIO_STREAM_EPNUM)
|
|
||||||
|
|
||||||
/* Type Defines: */
|
/* Type Defines: */
|
||||||
/** Type define for the device configuration descriptor structure. This must be defined in the
|
/** Type define for the device configuration descriptor structure. This must be defined in the
|
||||||
|
|
|
@ -157,7 +157,7 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
|
||||||
{
|
{
|
||||||
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
|
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
|
||||||
|
|
||||||
.EndpointAddress = (ENDPOINT_DIR_IN | CDC1_NOTIFICATION_EPNUM),
|
.EndpointAddress = CDC1_NOTIFICATION_EPADDR,
|
||||||
.Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
|
.Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
|
||||||
.EndpointSize = CDC_NOTIFICATION_EPSIZE,
|
.EndpointSize = CDC_NOTIFICATION_EPSIZE,
|
||||||
.PollingIntervalMS = 0xFF
|
.PollingIntervalMS = 0xFF
|
||||||
|
@ -183,20 +183,20 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
|
||||||
{
|
{
|
||||||
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
|
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
|
||||||
|
|
||||||
.EndpointAddress = (ENDPOINT_DIR_OUT | CDC1_RX_EPNUM),
|
.EndpointAddress = CDC1_RX_EPADDR,
|
||||||
.Attributes = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
|
.Attributes = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
|
||||||
.EndpointSize = CDC_TXRX_EPSIZE,
|
.EndpointSize = CDC_TXRX_EPSIZE,
|
||||||
.PollingIntervalMS = 0x01
|
.PollingIntervalMS = 0x05
|
||||||
},
|
},
|
||||||
|
|
||||||
.CDC1_DataInEndpoint =
|
.CDC1_DataInEndpoint =
|
||||||
{
|
{
|
||||||
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
|
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
|
||||||
|
|
||||||
.EndpointAddress = (ENDPOINT_DIR_IN | CDC1_TX_EPNUM),
|
.EndpointAddress = CDC1_TX_EPADDR,
|
||||||
.Attributes = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
|
.Attributes = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
|
||||||
.EndpointSize = CDC_TXRX_EPSIZE,
|
.EndpointSize = CDC_TXRX_EPSIZE,
|
||||||
.PollingIntervalMS = 0x01
|
.PollingIntervalMS = 0x05
|
||||||
},
|
},
|
||||||
|
|
||||||
.CDC2_IAD =
|
.CDC2_IAD =
|
||||||
|
@ -258,7 +258,7 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
|
||||||
{
|
{
|
||||||
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
|
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
|
||||||
|
|
||||||
.EndpointAddress = (ENDPOINT_DIR_IN | CDC2_NOTIFICATION_EPNUM),
|
.EndpointAddress = CDC2_NOTIFICATION_EPADDR,
|
||||||
.Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
|
.Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
|
||||||
.EndpointSize = CDC_NOTIFICATION_EPSIZE,
|
.EndpointSize = CDC_NOTIFICATION_EPSIZE,
|
||||||
.PollingIntervalMS = 0xFF
|
.PollingIntervalMS = 0xFF
|
||||||
|
@ -284,20 +284,20 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
|
||||||
{
|
{
|
||||||
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
|
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
|
||||||
|
|
||||||
.EndpointAddress = (ENDPOINT_DIR_OUT | CDC2_RX_EPNUM),
|
.EndpointAddress = CDC2_RX_EPADDR,
|
||||||
.Attributes = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
|
.Attributes = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
|
||||||
.EndpointSize = CDC_TXRX_EPSIZE,
|
.EndpointSize = CDC_TXRX_EPSIZE,
|
||||||
.PollingIntervalMS = 0x01
|
.PollingIntervalMS = 0x05
|
||||||
},
|
},
|
||||||
|
|
||||||
.CDC2_DataInEndpoint =
|
.CDC2_DataInEndpoint =
|
||||||
{
|
{
|
||||||
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
|
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
|
||||||
|
|
||||||
.EndpointAddress = (ENDPOINT_DIR_IN | CDC2_TX_EPNUM),
|
.EndpointAddress = CDC2_TX_EPADDR,
|
||||||
.Attributes = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
|
.Attributes = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
|
||||||
.EndpointSize = CDC_TXRX_EPSIZE,
|
.EndpointSize = CDC_TXRX_EPSIZE,
|
||||||
.PollingIntervalMS = 0x01
|
.PollingIntervalMS = 0x05
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -42,23 +42,23 @@
|
||||||
#include <avr/pgmspace.h>
|
#include <avr/pgmspace.h>
|
||||||
|
|
||||||
/* Macros: */
|
/* Macros: */
|
||||||
/** Endpoint number of the first CDC interface's device-to-host data IN endpoint. */
|
/** Endpoint address of the first CDC interface's device-to-host data IN endpoint. */
|
||||||
#define CDC1_TX_EPNUM 1
|
#define CDC1_TX_EPADDR (ENDPOINT_DIR_IN | 1)
|
||||||
|
|
||||||
/** Endpoint number of the first CDC interface's host-to-device data OUT endpoint. */
|
/** Endpoint address of the first CDC interface's host-to-device data OUT endpoint. */
|
||||||
#define CDC1_RX_EPNUM 2
|
#define CDC1_RX_EPADDR (ENDPOINT_DIR_OUT | 2)
|
||||||
|
|
||||||
/** Endpoint number of the first CDC interface's device-to-host notification IN endpoint. */
|
/** Endpoint address of the first CDC interface's device-to-host notification IN endpoint. */
|
||||||
#define CDC1_NOTIFICATION_EPNUM 3
|
#define CDC1_NOTIFICATION_EPADDR (ENDPOINT_DIR_IN | 3)
|
||||||
|
|
||||||
/** Endpoint number of the second CDC interface's device-to-host data IN endpoint. */
|
/** Endpoint address of the second CDC interface's device-to-host data IN endpoint. */
|
||||||
#define CDC2_TX_EPNUM 4
|
#define CDC2_TX_EPADDR (ENDPOINT_DIR_IN | 4)
|
||||||
|
|
||||||
/** Endpoint number of the second CDC interface's host-to-device data OUT endpoint. */
|
/** Endpoint address of the second CDC interface's host-to-device data OUT endpoint. */
|
||||||
#define CDC2_RX_EPNUM 5
|
#define CDC2_RX_EPADDR (ENDPOINT_DIR_OUT | 5)
|
||||||
|
|
||||||
/** Endpoint number of the second CDC interface's device-to-host notification IN endpoint. */
|
/** Endpoint address of the second CDC interface's device-to-host notification IN endpoint. */
|
||||||
#define CDC2_NOTIFICATION_EPNUM 6
|
#define CDC2_NOTIFICATION_EPADDR (ENDPOINT_DIR_IN | 6)
|
||||||
|
|
||||||
/** Size in bytes of the CDC device-to-host notification IN endpoints. */
|
/** Size in bytes of the CDC device-to-host notification IN endpoints. */
|
||||||
#define CDC_NOTIFICATION_EPSIZE 8
|
#define CDC_NOTIFICATION_EPSIZE 8
|
||||||
|
|
|
@ -123,20 +123,14 @@ void EVENT_USB_Device_ConfigurationChanged(void)
|
||||||
bool ConfigSuccess = true;
|
bool ConfigSuccess = true;
|
||||||
|
|
||||||
/* Setup first CDC Interface's Endpoints */
|
/* Setup first CDC Interface's Endpoints */
|
||||||
ConfigSuccess &= Endpoint_ConfigureEndpoint(CDC1_TX_EPNUM, EP_TYPE_BULK, ENDPOINT_DIR_IN,
|
ConfigSuccess &= Endpoint_ConfigureEndpoint(CDC1_TX_EPADDR, EP_TYPE_BULK, CDC_TXRX_EPSIZE, 1);
|
||||||
CDC_TXRX_EPSIZE, ENDPOINT_BANK_SINGLE);
|
ConfigSuccess &= Endpoint_ConfigureEndpoint(CDC1_RX_EPADDR, EP_TYPE_BULK, CDC_TXRX_EPSIZE, 1);
|
||||||
ConfigSuccess &= Endpoint_ConfigureEndpoint(CDC1_RX_EPNUM, EP_TYPE_BULK, ENDPOINT_DIR_OUT,
|
ConfigSuccess &= Endpoint_ConfigureEndpoint(CDC1_NOTIFICATION_EPADDR, EP_TYPE_INTERRUPT, CDC_NOTIFICATION_EPSIZE, 1);
|
||||||
CDC_TXRX_EPSIZE, ENDPOINT_BANK_SINGLE);
|
|
||||||
ConfigSuccess &= Endpoint_ConfigureEndpoint(CDC1_NOTIFICATION_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_IN,
|
|
||||||
CDC_NOTIFICATION_EPSIZE, ENDPOINT_BANK_SINGLE);
|
|
||||||
|
|
||||||
/* Setup second CDC Interface's Endpoints */
|
/* Setup second CDC Interface's Endpoints */
|
||||||
ConfigSuccess &= Endpoint_ConfigureEndpoint(CDC2_TX_EPNUM, EP_TYPE_BULK, ENDPOINT_DIR_IN,
|
ConfigSuccess &= Endpoint_ConfigureEndpoint(CDC2_TX_EPADDR, EP_TYPE_BULK, CDC_TXRX_EPSIZE, 1);
|
||||||
CDC_TXRX_EPSIZE, ENDPOINT_BANK_SINGLE);
|
ConfigSuccess &= Endpoint_ConfigureEndpoint(CDC2_RX_EPADDR, EP_TYPE_BULK, CDC_TXRX_EPSIZE, 1);
|
||||||
ConfigSuccess &= Endpoint_ConfigureEndpoint(CDC2_RX_EPNUM, EP_TYPE_BULK, ENDPOINT_DIR_OUT,
|
ConfigSuccess &= Endpoint_ConfigureEndpoint(CDC2_NOTIFICATION_EPADDR, EP_TYPE_INTERRUPT, CDC_NOTIFICATION_EPSIZE, 1);
|
||||||
CDC_TXRX_EPSIZE, ENDPOINT_BANK_SINGLE);
|
|
||||||
ConfigSuccess &= Endpoint_ConfigureEndpoint(CDC2_NOTIFICATION_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_IN,
|
|
||||||
CDC_NOTIFICATION_EPSIZE, ENDPOINT_BANK_SINGLE);
|
|
||||||
|
|
||||||
/* Reset line encoding baud rates so that the host knows to send new values */
|
/* Reset line encoding baud rates so that the host knows to send new values */
|
||||||
LineEncoding1.BaudRateBPS = 0;
|
LineEncoding1.BaudRateBPS = 0;
|
||||||
|
@ -224,7 +218,7 @@ void CDC1_Task(void)
|
||||||
ActionSent = true;
|
ActionSent = true;
|
||||||
|
|
||||||
/* Select the Serial Tx Endpoint */
|
/* Select the Serial Tx Endpoint */
|
||||||
Endpoint_SelectEndpoint(CDC1_TX_EPNUM);
|
Endpoint_SelectEndpoint(CDC1_TX_EPADDR);
|
||||||
|
|
||||||
/* Write the String to the Endpoint */
|
/* Write the String to the Endpoint */
|
||||||
Endpoint_Write_Stream_LE(ReportString, strlen(ReportString), NULL);
|
Endpoint_Write_Stream_LE(ReportString, strlen(ReportString), NULL);
|
||||||
|
@ -240,7 +234,7 @@ void CDC1_Task(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Select the Serial Rx Endpoint */
|
/* Select the Serial Rx Endpoint */
|
||||||
Endpoint_SelectEndpoint(CDC1_RX_EPNUM);
|
Endpoint_SelectEndpoint(CDC1_RX_EPADDR);
|
||||||
|
|
||||||
/* Throw away any received data from the host */
|
/* Throw away any received data from the host */
|
||||||
if (Endpoint_IsOUTReceived())
|
if (Endpoint_IsOUTReceived())
|
||||||
|
@ -257,7 +251,7 @@ void CDC2_Task(void)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/* Select the Serial Rx Endpoint */
|
/* Select the Serial Rx Endpoint */
|
||||||
Endpoint_SelectEndpoint(CDC2_RX_EPNUM);
|
Endpoint_SelectEndpoint(CDC2_RX_EPADDR);
|
||||||
|
|
||||||
/* Check to see if any data has been received */
|
/* Check to see if any data has been received */
|
||||||
if (Endpoint_IsOUTReceived())
|
if (Endpoint_IsOUTReceived())
|
||||||
|
@ -275,7 +269,7 @@ void CDC2_Task(void)
|
||||||
Endpoint_ClearOUT();
|
Endpoint_ClearOUT();
|
||||||
|
|
||||||
/* Select the Serial Tx Endpoint */
|
/* Select the Serial Tx Endpoint */
|
||||||
Endpoint_SelectEndpoint(CDC2_TX_EPNUM);
|
Endpoint_SelectEndpoint(CDC2_TX_EPADDR);
|
||||||
|
|
||||||
/* Write the received data to the endpoint */
|
/* Write the received data to the endpoint */
|
||||||
Endpoint_Write_Stream_LE(&Buffer, DataLength, NULL);
|
Endpoint_Write_Stream_LE(&Buffer, DataLength, NULL);
|
||||||
|
|
|
@ -143,20 +143,20 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
|
||||||
{
|
{
|
||||||
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
|
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
|
||||||
|
|
||||||
.EndpointAddress = (ENDPOINT_DIR_IN | GENERIC_IN_EPNUM),
|
.EndpointAddress = GENERIC_IN_EPADDR,
|
||||||
.Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
|
.Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
|
||||||
.EndpointSize = GENERIC_EPSIZE,
|
.EndpointSize = GENERIC_EPSIZE,
|
||||||
.PollingIntervalMS = 0x01
|
.PollingIntervalMS = 0x05
|
||||||
},
|
},
|
||||||
|
|
||||||
.HID_ReportOUTEndpoint =
|
.HID_ReportOUTEndpoint =
|
||||||
{
|
{
|
||||||
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
|
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
|
||||||
|
|
||||||
.EndpointAddress = (ENDPOINT_DIR_OUT | GENERIC_OUT_EPNUM),
|
.EndpointAddress = GENERIC_OUT_EPADDR,
|
||||||
.Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
|
.Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
|
||||||
.EndpointSize = GENERIC_EPSIZE,
|
.EndpointSize = GENERIC_EPSIZE,
|
||||||
.PollingIntervalMS = 0x01
|
.PollingIntervalMS = 0x05
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -58,11 +58,11 @@
|
||||||
} USB_Descriptor_Configuration_t;
|
} USB_Descriptor_Configuration_t;
|
||||||
|
|
||||||
/* Macros: */
|
/* Macros: */
|
||||||
/** Endpoint number of the Generic HID reporting IN endpoint. */
|
/** Endpoint address of the Generic HID reporting IN endpoint. */
|
||||||
#define GENERIC_IN_EPNUM 1
|
#define GENERIC_IN_EPADDR (ENDPOINT_DIR_IN | 1)
|
||||||
|
|
||||||
/** Endpoint number of the Generic HID reporting OUT endpoint. */
|
/** Endpoint address of the Generic HID reporting OUT endpoint. */
|
||||||
#define GENERIC_OUT_EPNUM 2
|
#define GENERIC_OUT_EPADDR (ENDPOINT_DIR_OUT | 2)
|
||||||
|
|
||||||
/** Size in bytes of the Generic HID reporting endpoint. */
|
/** Size in bytes of the Generic HID reporting endpoint. */
|
||||||
#define GENERIC_EPSIZE 8
|
#define GENERIC_EPSIZE 8
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue