pull/1469/head
parent
f10126a95e
commit
0ec2b55a7c
@ -1,248 +1,248 @@
|
|||||||
/*
|
/*
|
||||||
LUFA Library
|
LUFA Library
|
||||||
Copyright (C) Dean Camera, 2011.
|
Copyright (C) Dean Camera, 2011.
|
||||||
|
|
||||||
dean [at] fourwalledcubicle [dot] com
|
dean [at] fourwalledcubicle [dot] com
|
||||||
www.lufa-lib.org
|
www.lufa-lib.org
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com)
|
Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com)
|
||||||
|
|
||||||
Permission to use, copy, modify, distribute, and sell this
|
Permission to use, copy, modify, distribute, and sell this
|
||||||
software and its documentation for any purpose is hereby granted
|
software and its documentation for any purpose is hereby granted
|
||||||
without fee, provided that the above copyright notice appear in
|
without fee, provided that the above copyright notice appear in
|
||||||
all copies and that both that the copyright notice and this
|
all copies and that both that the copyright notice and this
|
||||||
permission notice and warranty disclaimer appear in supporting
|
permission notice and warranty disclaimer appear in supporting
|
||||||
documentation, and that the name of the author not be used in
|
documentation, and that the name of the author not be used in
|
||||||
advertising or publicity pertaining to distribution of the
|
advertising or publicity pertaining to distribution of the
|
||||||
software without specific, written prior permission.
|
software without specific, written prior permission.
|
||||||
|
|
||||||
The author disclaim all warranties with regard to this
|
The author disclaim all warranties with regard to this
|
||||||
software, including all implied warranties of merchantability
|
software, including all implied warranties of merchantability
|
||||||
and fitness. In no event shall the author be liable for any
|
and fitness. In no event shall the author be liable for any
|
||||||
special, indirect or consequential damages or any damages
|
special, indirect or consequential damages or any damages
|
||||||
whatsoever resulting from loss of use, data or profits, whether
|
whatsoever resulting from loss of use, data or profits, whether
|
||||||
in an action of contract, negligence or other tortious action,
|
in an action of contract, negligence or other tortious action,
|
||||||
arising out of or in connection with the use or performance of
|
arising out of or in connection with the use or performance of
|
||||||
this software.
|
this software.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/** \file
|
/** \file
|
||||||
*
|
*
|
||||||
* Main source file for the AudioInputHost demo. This file contains the main tasks of
|
* Main source file for the AudioInputHost demo. This file contains the main tasks of
|
||||||
* the demo and is responsible for the initial application hardware configuration.
|
* the demo and is responsible for the initial application hardware configuration.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "AudioInputHost.h"
|
#include "AudioInputHost.h"
|
||||||
|
|
||||||
/** LUFA Audio Class driver interface configuration and state information. This structure is
|
/** LUFA Audio Class driver interface configuration and state information. This structure is
|
||||||
* passed to all Audio Class driver functions, so that multiple instances of the same class
|
* passed to all Audio Class driver functions, so that multiple instances of the same class
|
||||||
* within a device can be differentiated from one another.
|
* within a device can be differentiated from one another.
|
||||||
*/
|
*/
|
||||||
USB_ClassInfo_Audio_Host_t Microphone_Audio_Interface =
|
USB_ClassInfo_Audio_Host_t Microphone_Audio_Interface =
|
||||||
{
|
{
|
||||||
.Config =
|
.Config =
|
||||||
{
|
{
|
||||||
.DataINPipeNumber = 1,
|
.DataINPipeNumber = 1,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
/** Main program entry point. This routine configures the hardware required by the application, then
|
/** Main program entry point. This routine configures the hardware required by the application, then
|
||||||
* enters a loop to run the application tasks in sequence.
|
* enters a loop to run the application tasks in sequence.
|
||||||
*/
|
*/
|
||||||
int main(void)
|
int main(void)
|
||||||
{
|
{
|
||||||
SetupHardware();
|
SetupHardware();
|
||||||
|
|
||||||
puts_P(PSTR(ESC_FG_CYAN "Audio Input Host Demo running.\r\n" ESC_FG_WHITE));
|
puts_P(PSTR(ESC_FG_CYAN "Audio Input Host Demo running.\r\n" ESC_FG_WHITE));
|
||||||
|
|
||||||
LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY);
|
LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY);
|
||||||
sei();
|
sei();
|
||||||
|
|
||||||
for (;;)
|
for (;;)
|
||||||
{
|
{
|
||||||
switch (USB_HostState)
|
switch (USB_HostState)
|
||||||
{
|
{
|
||||||
case HOST_STATE_Addressed:
|
case HOST_STATE_Addressed:
|
||||||
LEDs_SetAllLEDs(LEDMASK_USB_ENUMERATING);
|
LEDs_SetAllLEDs(LEDMASK_USB_ENUMERATING);
|
||||||
|
|
||||||
uint16_t ConfigDescriptorSize;
|
uint16_t ConfigDescriptorSize;
|
||||||
uint8_t ConfigDescriptorData[512];
|
uint8_t ConfigDescriptorData[512];
|
||||||
|
|
||||||
if (USB_Host_GetDeviceConfigDescriptor(1, &ConfigDescriptorSize, ConfigDescriptorData,
|
if (USB_Host_GetDeviceConfigDescriptor(1, &ConfigDescriptorSize, ConfigDescriptorData,
|
||||||
sizeof(ConfigDescriptorData)) != HOST_GETCONFIG_Successful)
|
sizeof(ConfigDescriptorData)) != HOST_GETCONFIG_Successful)
|
||||||
{
|
{
|
||||||
puts_P(PSTR("Error Retrieving Configuration Descriptor.\r\n"));
|
puts_P(PSTR("Error Retrieving Configuration Descriptor.\r\n"));
|
||||||
LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
|
LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
|
||||||
USB_HostState = HOST_STATE_WaitForDeviceRemoval;
|
USB_HostState = HOST_STATE_WaitForDeviceRemoval;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Audio_Host_ConfigurePipes(&Microphone_Audio_Interface,
|
if (Audio_Host_ConfigurePipes(&Microphone_Audio_Interface,
|
||||||
ConfigDescriptorSize, ConfigDescriptorData) != AUDIO_ENUMERROR_NoError)
|
ConfigDescriptorSize, ConfigDescriptorData) != AUDIO_ENUMERROR_NoError)
|
||||||
{
|
{
|
||||||
puts_P(PSTR("Attached Device Not a Valid Audio Input Device.\r\n"));
|
puts_P(PSTR("Attached Device Not a Valid Audio Input Device.\r\n"));
|
||||||
LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
|
LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
|
||||||
USB_HostState = HOST_STATE_WaitForDeviceRemoval;
|
USB_HostState = HOST_STATE_WaitForDeviceRemoval;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (USB_Host_SetDeviceConfiguration(1) != HOST_SENDCONTROL_Successful)
|
if (USB_Host_SetDeviceConfiguration(1) != HOST_SENDCONTROL_Successful)
|
||||||
{
|
{
|
||||||
puts_P(PSTR("Error Setting Device Configuration.\r\n"));
|
puts_P(PSTR("Error Setting Device Configuration.\r\n"));
|
||||||
LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
|
LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
|
||||||
USB_HostState = HOST_STATE_WaitForDeviceRemoval;
|
USB_HostState = HOST_STATE_WaitForDeviceRemoval;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Audio_Host_StartStopStreaming(&Microphone_Audio_Interface, true) != HOST_SENDCONTROL_Successful)
|
if (Audio_Host_StartStopStreaming(&Microphone_Audio_Interface, true) != HOST_SENDCONTROL_Successful)
|
||||||
{
|
{
|
||||||
puts_P(PSTR("Error Enabling Audio Stream.\r\n"));
|
puts_P(PSTR("Error Enabling Audio Stream.\r\n"));
|
||||||
LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
|
LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
|
||||||
USB_HostState = HOST_STATE_WaitForDeviceRemoval;
|
USB_HostState = HOST_STATE_WaitForDeviceRemoval;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
USB_Audio_SampleFreq_t SampleRate = AUDIO_SAMPLE_FREQ(48000);
|
USB_Audio_SampleFreq_t SampleRate = AUDIO_SAMPLE_FREQ(48000);
|
||||||
if (Audio_Host_GetSetEndpointProperty(&Microphone_Audio_Interface, Microphone_Audio_Interface.Config.DataINPipeNumber,
|
if (Audio_Host_GetSetEndpointProperty(&Microphone_Audio_Interface, Microphone_Audio_Interface.Config.DataINPipeNumber,
|
||||||
AUDIO_REQ_SetCurrent, AUDIO_EPCONTROL_SamplingFreq,
|
AUDIO_REQ_SetCurrent, AUDIO_EPCONTROL_SamplingFreq,
|
||||||
sizeof(SampleRate), &SampleRate) != HOST_SENDCONTROL_Successful)
|
sizeof(SampleRate), &SampleRate) != HOST_SENDCONTROL_Successful)
|
||||||
{
|
{
|
||||||
puts_P(PSTR("Error Setting Audio Sampling Frequency.\r\n"));
|
puts_P(PSTR("Error Setting Audio Sampling Frequency.\r\n"));
|
||||||
LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
|
LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
|
||||||
USB_HostState = HOST_STATE_WaitForDeviceRemoval;
|
USB_HostState = HOST_STATE_WaitForDeviceRemoval;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Sample reload timer initialization */
|
/* Sample reload timer initialization */
|
||||||
TIMSK0 = (1 << OCIE0A);
|
TIMSK0 = (1 << OCIE0A);
|
||||||
OCR0A = ((F_CPU / 8 / 48000) - 1);
|
OCR0A = ((F_CPU / 8 / 48000) - 1);
|
||||||
TCCR0A = (1 << WGM01); // CTC mode
|
TCCR0A = (1 << WGM01); // CTC mode
|
||||||
TCCR0B = (1 << CS01); // Fcpu/8 speed
|
TCCR0B = (1 << CS01); // Fcpu/8 speed
|
||||||
|
|
||||||
/* Set speaker as output */
|
/* Set speaker as output */
|
||||||
DDRC |= (1 << 6);
|
DDRC |= (1 << 6);
|
||||||
|
|
||||||
/* PWM speaker timer initialization */
|
/* PWM speaker timer initialization */
|
||||||
TCCR3A = ((1 << WGM30) | (1 << COM3A1) | (1 << COM3A0)); // Set on match, clear on TOP
|
TCCR3A = ((1 << WGM30) | (1 << COM3A1) | (1 << COM3A0)); // Set on match, clear on TOP
|
||||||
TCCR3B = ((1 << WGM32) | (1 << CS30)); // Fast 8-Bit PWM, F_CPU speed
|
TCCR3B = ((1 << WGM32) | (1 << CS30)); // Fast 8-Bit PWM, F_CPU speed
|
||||||
|
|
||||||
puts_P(PSTR("Audio Device Enumerated.\r\n"));
|
puts_P(PSTR("Audio Device Enumerated.\r\n"));
|
||||||
LEDs_SetAllLEDs(LEDMASK_USB_READY);
|
LEDs_SetAllLEDs(LEDMASK_USB_READY);
|
||||||
USB_HostState = HOST_STATE_Configured;
|
USB_HostState = HOST_STATE_Configured;
|
||||||
break;
|
break;
|
||||||
case HOST_STATE_Configured:
|
case HOST_STATE_Configured:
|
||||||
/* Do nothing - audio stream is handled by the timer interrupt routine */
|
/* Do nothing - audio stream is handled by the timer interrupt routine */
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
Audio_Host_USBTask(&Microphone_Audio_Interface);
|
Audio_Host_USBTask(&Microphone_Audio_Interface);
|
||||||
USB_USBTask();
|
USB_USBTask();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/** ISR to handle the reloading of the PWM timer with the next sample. */
|
/** ISR to handle the reloading of the PWM timer with the next sample. */
|
||||||
ISR(TIMER0_COMPA_vect, ISR_BLOCK)
|
ISR(TIMER0_COMPA_vect, ISR_BLOCK)
|
||||||
{
|
{
|
||||||
uint8_t PrevPipe = Pipe_GetCurrentPipe();
|
uint8_t PrevPipe = Pipe_GetCurrentPipe();
|
||||||
|
|
||||||
/* Check that the USB bus is ready for the next sample to read */
|
/* Check that the USB bus is ready for the next sample to read */
|
||||||
if (Audio_Host_IsSampleReceived(&Microphone_Audio_Interface))
|
if (Audio_Host_IsSampleReceived(&Microphone_Audio_Interface))
|
||||||
{
|
{
|
||||||
/* Retrieve the signed 16-bit audio sample, convert to 8-bit */
|
/* Retrieve the signed 16-bit audio sample, convert to 8-bit */
|
||||||
int8_t Sample_8Bit = (Audio_Host_ReadSample16(&Microphone_Audio_Interface) >> 8);
|
int8_t Sample_8Bit = (Audio_Host_ReadSample16(&Microphone_Audio_Interface) >> 8);
|
||||||
|
|
||||||
/* Load the sample into the PWM timer channel */
|
/* Load the sample into the PWM timer channel */
|
||||||
OCR3A = (Sample_8Bit ^ (1 << 7));
|
OCR3A = (Sample_8Bit ^ (1 << 7));
|
||||||
|
|
||||||
uint8_t LEDMask = LEDS_NO_LEDS;
|
uint8_t LEDMask = LEDS_NO_LEDS;
|
||||||
|
|
||||||
/* Turn on LEDs as the sample amplitude increases */
|
/* Turn on LEDs as the sample amplitude increases */
|
||||||
if (Sample_8Bit > 16)
|
if (Sample_8Bit > 16)
|
||||||
LEDMask = (LEDS_LED1 | LEDS_LED2 | LEDS_LED3 | LEDS_LED4);
|
LEDMask = (LEDS_LED1 | LEDS_LED2 | LEDS_LED3 | LEDS_LED4);
|
||||||
else if (Sample_8Bit > 8)
|
else if (Sample_8Bit > 8)
|
||||||
LEDMask = (LEDS_LED1 | LEDS_LED2 | LEDS_LED3);
|
LEDMask = (LEDS_LED1 | LEDS_LED2 | LEDS_LED3);
|
||||||
else if (Sample_8Bit > 4)
|
else if (Sample_8Bit > 4)
|
||||||
LEDMask = (LEDS_LED1 | LEDS_LED2);
|
LEDMask = (LEDS_LED1 | LEDS_LED2);
|
||||||
else if (Sample_8Bit > 2)
|
else if (Sample_8Bit > 2)
|
||||||
LEDMask = (LEDS_LED1);
|
LEDMask = (LEDS_LED1);
|
||||||
|
|
||||||
LEDs_SetAllLEDs(LEDMask);
|
LEDs_SetAllLEDs(LEDMask);
|
||||||
}
|
}
|
||||||
|
|
||||||
Pipe_SelectPipe(PrevPipe);
|
Pipe_SelectPipe(PrevPipe);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Configures the board hardware and chip peripherals for the demo's functionality. */
|
/** Configures the board hardware and chip peripherals for the demo's functionality. */
|
||||||
void SetupHardware(void)
|
void SetupHardware(void)
|
||||||
{
|
{
|
||||||
/* Disable watchdog if enabled by bootloader/fuses */
|
/* Disable watchdog if enabled by bootloader/fuses */
|
||||||
MCUSR &= ~(1 << WDRF);
|
MCUSR &= ~(1 << WDRF);
|
||||||
wdt_disable();
|
wdt_disable();
|
||||||
|
|
||||||
/* Disable clock division */
|
/* Disable clock division */
|
||||||
clock_prescale_set(clock_div_1);
|
clock_prescale_set(clock_div_1);
|
||||||
|
|
||||||
/* Hardware Initialization */
|
/* Hardware Initialization */
|
||||||
Serial_Init(9600, false);
|
Serial_Init(9600, false);
|
||||||
LEDs_Init();
|
LEDs_Init();
|
||||||
USB_Init();
|
USB_Init();
|
||||||
|
|
||||||
/* Create a stdio stream for the serial port for stdin and stdout */
|
/* Create a stdio stream for the serial port for stdin and stdout */
|
||||||
Serial_CreateStream(NULL);
|
Serial_CreateStream(NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Event handler for the USB_DeviceAttached event. This indicates that a device has been attached to the host, and
|
/** Event handler for the USB_DeviceAttached event. This indicates that a device has been attached to the host, and
|
||||||
* starts the library USB task to begin the enumeration and USB management process.
|
* starts the library USB task to begin the enumeration and USB management process.
|
||||||
*/
|
*/
|
||||||
void EVENT_USB_Host_DeviceAttached(void)
|
void EVENT_USB_Host_DeviceAttached(void)
|
||||||
{
|
{
|
||||||
puts_P(PSTR("Device Attached.\r\n"));
|
puts_P(PSTR("Device Attached.\r\n"));
|
||||||
LEDs_SetAllLEDs(LEDMASK_USB_ENUMERATING);
|
LEDs_SetAllLEDs(LEDMASK_USB_ENUMERATING);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Event handler for the USB_DeviceUnattached event. This indicates that a device has been removed from the host, and
|
/** Event handler for the USB_DeviceUnattached event. This indicates that a device has been removed from the host, and
|
||||||
* stops the library USB task management process.
|
* stops the library USB task management process.
|
||||||
*/
|
*/
|
||||||
void EVENT_USB_Host_DeviceUnattached(void)
|
void EVENT_USB_Host_DeviceUnattached(void)
|
||||||
{
|
{
|
||||||
puts_P(PSTR("\r\nDevice Unattached.\r\n"));
|
puts_P(PSTR("\r\nDevice Unattached.\r\n"));
|
||||||
LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY);
|
LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Event handler for the USB_DeviceEnumerationComplete event. This indicates that a device has been successfully
|
/** Event handler for the USB_DeviceEnumerationComplete event. This indicates that a device has been successfully
|
||||||
* enumerated by the host and is now ready to be used by the application.
|
* enumerated by the host and is now ready to be used by the application.
|
||||||
*/
|
*/
|
||||||
void EVENT_USB_Host_DeviceEnumerationComplete(void)
|
void EVENT_USB_Host_DeviceEnumerationComplete(void)
|
||||||
{
|
{
|
||||||
LEDs_SetAllLEDs(LEDMASK_USB_READY);
|
LEDs_SetAllLEDs(LEDMASK_USB_READY);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Event handler for the USB_HostError event. This indicates that a hardware error occurred while in host mode. */
|
/** Event handler for the USB_HostError event. This indicates that a hardware error occurred while in host mode. */
|
||||||
void EVENT_USB_Host_HostError(const uint8_t ErrorCode)
|
void EVENT_USB_Host_HostError(const uint8_t ErrorCode)
|
||||||
{
|
{
|
||||||
USB_Disable();
|
USB_Disable();
|
||||||
|
|
||||||
printf_P(PSTR(ESC_FG_RED "Host Mode Error\r\n"
|
printf_P(PSTR(ESC_FG_RED "Host Mode Error\r\n"
|
||||||
" -- Error Code %d\r\n" ESC_FG_WHITE), ErrorCode);
|
" -- Error Code %d\r\n" ESC_FG_WHITE), ErrorCode);
|
||||||
|
|
||||||
LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
|
LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
|
||||||
for(;;);
|
for(;;);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Event handler for the USB_DeviceEnumerationFailed event. This indicates that a problem occurred while
|
/** Event handler for the USB_DeviceEnumerationFailed event. This indicates that a problem occurred while
|
||||||
* enumerating an attached USB device.
|
* enumerating an attached USB device.
|
||||||
*/
|
*/
|
||||||
void EVENT_USB_Host_DeviceEnumerationFailed(const uint8_t ErrorCode,
|
void EVENT_USB_Host_DeviceEnumerationFailed(const uint8_t ErrorCode,
|
||||||
const uint8_t SubErrorCode)
|
const uint8_t SubErrorCode)
|
||||||
{
|
{
|
||||||
printf_P(PSTR(ESC_FG_RED "Dev Enum Error\r\n"
|
printf_P(PSTR(ESC_FG_RED "Dev Enum Error\r\n"
|
||||||
" -- Error Code %d\r\n"
|
" -- Error Code %d\r\n"
|
||||||
" -- Sub Error Code %d\r\n"
|
" -- Sub Error Code %d\r\n"
|
||||||
" -- In State %d\r\n" ESC_FG_WHITE), ErrorCode, SubErrorCode, USB_HostState);
|
" -- In State %d\r\n" ESC_FG_WHITE), ErrorCode, SubErrorCode, USB_HostState);
|
||||||
|
|
||||||
LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
|
LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,77 +1,77 @@
|
|||||||
/*
|
/*
|
||||||
LUFA Library
|
LUFA Library
|
||||||
Copyright (C) Dean Camera, 2011.
|
Copyright (C) Dean Camera, 2011.
|
||||||
|
|
||||||
dean [at] fourwalledcubicle [dot] com
|
dean [at] fourwalledcubicle [dot] com
|
||||||
www.lufa-lib.org
|
www.lufa-lib.org
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com)
|
Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com)
|
||||||
|
|
||||||
Permission to use, copy, modify, distribute, and sell this
|
Permission to use, copy, modify, distribute, and sell this
|
||||||
software and its documentation for any purpose is hereby granted
|
software and its documentation for any purpose is hereby granted
|
||||||
without fee, provided that the above copyright notice appear in
|
without fee, provided that the above copyright notice appear in
|
||||||
all copies and that both that the copyright notice and this
|
all copies and that both that the copyright notice and this
|
||||||
permission notice and warranty disclaimer appear in supporting
|
permission notice and warranty disclaimer appear in supporting
|
||||||
documentation, and that the name of the author not be used in
|
documentation, and that the name of the author not be used in
|
||||||
advertising or publicity pertaining to distribution of the
|
advertising or publicity pertaining to distribution of the
|
||||||
software without specific, written prior permission.
|
software without specific, written prior permission.
|
||||||
|
|
||||||
The author disclaim all warranties with regard to this
|
The author disclaim all warranties with regard to this
|
||||||
software, including all implied warranties of merchantability
|
software, including all implied warranties of merchantability
|
||||||
and fitness. In no event shall the author be liable for any
|
and fitness. In no event shall the author be liable for any
|
||||||
special, indirect or consequential damages or any damages
|
special, indirect or consequential damages or any damages
|
||||||
whatsoever resulting from loss of use, data or profits, whether
|
whatsoever resulting from loss of use, data or profits, whether
|
||||||
in an action of contract, negligence or other tortious action,
|
in an action of contract, negligence or other tortious action,
|
||||||
arising out of or in connection with the use or performance of
|
arising out of or in connection with the use or performance of
|
||||||
this software.
|
this software.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/** \file
|
/** \file
|
||||||
*
|
*
|
||||||
* Header file for AudioInputHost.c.
|
* Header file for AudioInputHost.c.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _AUDIO_INPUT_HOST_H_
|
#ifndef _AUDIO_INPUT_HOST_H_
|
||||||
#define _AUDIO_INPUT_HOST_H_
|
#define _AUDIO_INPUT_HOST_H_
|
||||||
|
|
||||||
/* Includes: */
|
/* Includes: */
|
||||||
#include <avr/io.h>
|
#include <avr/io.h>
|
||||||
#include <avr/wdt.h>
|
#include <avr/wdt.h>
|
||||||
#include <avr/pgmspace.h>
|
#include <avr/pgmspace.h>
|
||||||
#include <avr/power.h>
|
#include <avr/power.h>
|
||||||
#include <avr/interrupt.h>
|
#include <avr/interrupt.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
#include <LUFA/Version.h>
|
#include <LUFA/Version.h>
|
||||||
#include <LUFA/Drivers/Misc/TerminalCodes.h>
|
#include <LUFA/Drivers/Misc/TerminalCodes.h>
|
||||||
#include <LUFA/Drivers/Peripheral/Serial.h>
|
#include <LUFA/Drivers/Peripheral/Serial.h>
|
||||||
#include <LUFA/Drivers/Board/LEDs.h>
|
#include <LUFA/Drivers/Board/LEDs.h>
|
||||||
#include <LUFA/Drivers/USB/USB.h>
|
#include <LUFA/Drivers/USB/USB.h>
|
||||||
|
|
||||||
/* Macros: */
|
/* Macros: */
|
||||||
/** LED mask for the library LED driver, to indicate that the USB interface is not ready. */
|
/** LED mask for the library LED driver, to indicate that the USB interface is not ready. */
|
||||||
#define LEDMASK_USB_NOTREADY LEDS_LED1
|
#define LEDMASK_USB_NOTREADY LEDS_LED1
|
||||||
|
|
||||||
/** LED mask for the library LED driver, to indicate that the USB interface is enumerating. */
|
/** LED mask for the library LED driver, to indicate that the USB interface is enumerating. */
|
||||||
#define LEDMASK_USB_ENUMERATING (LEDS_LED2 | LEDS_LED3)
|
#define LEDMASK_USB_ENUMERATING (LEDS_LED2 | LEDS_LED3)
|
||||||
|
|
||||||
/** LED mask for the library LED driver, to indicate that the USB interface is ready. */
|
/** LED mask for the library LED driver, to indicate that the USB interface is ready. */
|
||||||
#define LEDMASK_USB_READY (LEDS_LED2 | LEDS_LED4)
|
#define LEDMASK_USB_READY (LEDS_LED2 | LEDS_LED4)
|
||||||
|
|
||||||
/** LED mask for the library LED driver, to indicate that an error has occurred in the USB interface. */
|
/** LED mask for the library LED driver, to indicate that an error has occurred in the USB interface. */
|
||||||
#define LEDMASK_USB_ERROR (LEDS_LED1 | LEDS_LED3)
|
#define LEDMASK_USB_ERROR (LEDS_LED1 | LEDS_LED3)
|
||||||
|
|
||||||
/* Function Prototypes: */
|
/* Function Prototypes: */
|
||||||
void SetupHardware(void);
|
void SetupHardware(void);
|
||||||
|
|
||||||
void EVENT_USB_Host_HostError(const uint8_t ErrorCode);
|
void EVENT_USB_Host_HostError(const uint8_t ErrorCode);
|
||||||
void EVENT_USB_Host_DeviceAttached(void);
|
void EVENT_USB_Host_DeviceAttached(void);
|
||||||
void EVENT_USB_Host_DeviceUnattached(void);
|
void EVENT_USB_Host_DeviceUnattached(void);
|
||||||
void EVENT_USB_Host_DeviceEnumerationFailed(const uint8_t ErrorCode,
|
void EVENT_USB_Host_DeviceEnumerationFailed(const uint8_t ErrorCode,
|
||||||
const uint8_t SubErrorCode);
|
const uint8_t SubErrorCode);
|
||||||
void EVENT_USB_Host_DeviceEnumerationComplete(void);
|
void EVENT_USB_Host_DeviceEnumerationComplete(void);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -1,66 +1,66 @@
|
|||||||
/** \file
|
/** \file
|
||||||
*
|
*
|
||||||
* This file contains special DoxyGen information for the generation of the main page and other special
|
* This file contains special DoxyGen information for the generation of the main page and other special
|
||||||
* documentation pages. It is not a project source file.
|
* documentation pages. It is not a project source file.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/** \mainpage Audio Input Host Demo
|
/** \mainpage Audio Input Host Demo
|
||||||
*
|
*
|
||||||
* \section Sec_Compat Demo Compatibility:
|
* \section Sec_Compat Demo Compatibility:
|
||||||
*
|
*
|
||||||
* The following list indicates what microcontrollers are compatible with this demo.
|
* The following list indicates what microcontrollers are compatible with this demo.
|
||||||
*
|
*
|
||||||
* - Series 7 USB AVRs (AT90USBxxx7)
|
* - Series 7 USB AVRs (AT90USBxxx7)
|
||||||
*
|
*
|
||||||
* \section Sec_Info USB Information:
|
* \section Sec_Info USB Information:
|
||||||
*
|
*
|
||||||
* The following table gives a rundown of the USB utilization of this demo.
|
* The following table gives a rundown of the USB utilization of this demo.
|
||||||
*
|
*
|
||||||
* <table>
|
* <table>
|
||||||
* <tr>
|
* <tr>
|
||||||
* <td><b>USB Mode:</b></td>
|
* <td><b>USB Mode:</b></td>
|
||||||
* <td>Host</td>
|
* <td>Host</td>
|
||||||
* </tr>
|
* </tr>
|
||||||
* <tr>
|
* <tr>
|
||||||
* <td><b>USB Class:</b></td>
|
* <td><b>USB Class:</b></td>
|
||||||
* <td>Audio Class</td>
|
* <td>Audio Class</td>
|
||||||
* </tr>
|
* </tr>
|
||||||
* <tr>
|
* <tr>
|
||||||
* <td><b>USB Subclass:</b></td>
|
* <td><b>USB Subclass:</b></td>
|
||||||
* <td>Standard Audio Device</td>
|
* <td>Standard Audio Device</td>
|
||||||
* </tr>
|
* </tr>
|
||||||
* <tr>
|
* <tr>
|
||||||
* <td><b>Relevant Standards:</b></td>
|
* <td><b>Relevant Standards:</b></td>
|
||||||
* <td>USBIF Audio 1.0 Class Specification \n
|
* <td>USBIF Audio 1.0 Class Specification \n
|
||||||
* USBIF Audio 1.0 Class Terminal Types Specification \n
|
* USBIF Audio 1.0 Class Terminal Types Specification \n
|
||||||
* USBIF Audio 1.0 Data Formats Specification</td>
|
* USBIF Audio 1.0 Data Formats Specification</td>
|
||||||
* </tr>
|
* </tr>
|
||||||
* <tr>
|
* <tr>
|
||||||
* <td><b>Usable Speeds:</b></td>
|
* <td><b>Usable Speeds:</b></td>
|
||||||
* <td>Full Speed Mode</td>
|
* <td>Full Speed Mode</td>
|
||||||
* </tr>
|
* </tr>
|
||||||
* </table>
|
* </table>
|
||||||
*
|
*
|
||||||
* \section Sec_Description Project Description:
|
* \section Sec_Description Project Description:
|
||||||
*
|
*
|
||||||
* Audio Input host demonstration application. This gives a simple reference
|
* Audio Input host demonstration application. This gives a simple reference
|
||||||
* application for implementing a USB Audio host, for USB Audio devices using
|
* application for implementing a USB Audio host, for USB Audio devices using
|
||||||
* the USB Audio 1.0 class profile.
|
* the USB Audio 1.0 class profile.
|
||||||
*
|
*
|
||||||
* Incoming audio will output in 8-bit PWM onto the timer 3 output compare
|
* Incoming audio will output in 8-bit PWM onto the timer 3 output compare
|
||||||
* channel A, and will also be indicated on the board LEDs. Decouple the PWM
|
* channel A, and will also be indicated on the board LEDs. Decouple the PWM
|
||||||
* output with a capacitor and attach to a speaker to hear the audio.
|
* output with a capacitor and attach to a speaker to hear the audio.
|
||||||
*
|
*
|
||||||
* \section Sec_Options Project Options
|
* \section Sec_Options Project Options
|
||||||
*
|
*
|
||||||
* The following defines can be found in this demo, which can control the demo behaviour when defined, or changed in value.
|
* The following defines can be found in this demo, which can control the demo behaviour when defined, or changed in value.
|
||||||
*
|
*
|
||||||
* <table>
|
* <table>
|
||||||
* <tr>
|
* <tr>
|
||||||
* <td>
|
* <td>
|
||||||
* None
|
* None
|
||||||
* </td>
|
* </td>
|
||||||
* </tr>
|
* </tr>
|
||||||
* </table>
|
* </table>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -1,714 +1,714 @@
|
|||||||
# Hey Emacs, this is a -*- makefile -*-
|
# Hey Emacs, this is a -*- makefile -*-
|
||||||
#----------------------------------------------------------------------------
|
#----------------------------------------------------------------------------
|
||||||
# WinAVR Makefile Template written by Eric B. Weddington, Jörg Wunsch, et al.
|
# WinAVR Makefile Template written by Eric B. Weddington, Jörg Wunsch, et al.
|
||||||
# >> Modified for use with the LUFA project. <<
|
# >> Modified for use with the LUFA project. <<
|
||||||
#
|
#
|
||||||
# Released to the Public Domain
|
# Released to the Public Domain
|
||||||
#
|
#
|
||||||
# Additional material for this makefile was written by:
|
# Additional material for this makefile was written by:
|
||||||
# Peter Fleury
|
# Peter Fleury
|
||||||
# Tim Henigan
|
# Tim Henigan
|
||||||
# Colin O'Flynn
|
# Colin O'Flynn
|
||||||
# Reiner Patommel
|
# Reiner Patommel
|
||||||
# Markus Pfaff
|
# Markus Pfaff
|
||||||
# Sander Pool
|
# Sander Pool
|
||||||
# Frederik Rouleau
|
# Frederik Rouleau
|
||||||
# Carlos Lamas
|
# Carlos Lamas
|
||||||
# Dean Camera
|
# Dean Camera
|
||||||
# Opendous Inc.
|
# Opendous Inc.
|
||||||
# Denver Gingerich
|
# Denver Gingerich
|
||||||
#
|
#
|
||||||
#----------------------------------------------------------------------------
|
#----------------------------------------------------------------------------
|
||||||
# On command line:
|
# On command line:
|
||||||
#
|
#
|
||||||
# make all = Make software.
|
# make all = Make software.
|
||||||
#
|
#
|
||||||
# make clean = Clean out built project files.
|
# make clean = Clean out built project files.
|
||||||
#
|
#
|
||||||
# make coff = Convert ELF to AVR COFF.
|
# make coff = Convert ELF to AVR COFF.
|
||||||
#
|
#
|
||||||
# make extcoff = Convert ELF to AVR Extended COFF.
|
# make extcoff = Convert ELF to AVR Extended COFF.
|
||||||
#
|
#
|
||||||
# make program = Download the hex file to the device, using avrdude.
|
# make program = Download the hex file to the device, using avrdude.
|
||||||
# Please customize the avrdude settings below first!
|
# Please customize the avrdude settings below first!
|
||||||
#
|
#
|
||||||
# make dfu = Download the hex file to the device, using dfu-programmer (must
|
# make dfu = Download the hex file to the device, using dfu-programmer (must
|
||||||
# have dfu-programmer installed).
|
# have dfu-programmer installed).
|
||||||
#
|
#
|
||||||
# make flip = Download the hex file to the device, using Atmel FLIP (must
|
# make flip = Download the hex file to the device, using Atmel FLIP (must
|
||||||
# have Atmel FLIP installed).
|
# have Atmel FLIP installed).
|
||||||
#
|
#
|
||||||
# make dfu-ee = Download the eeprom file to the device, using dfu-programmer
|
# make dfu-ee = Download the eeprom file to the device, using dfu-programmer
|
||||||
# (must have dfu-programmer installed).
|
# (must have dfu-programmer installed).
|
||||||
#
|
#
|
||||||
# make flip-ee = Download the eeprom file to the device, using Atmel FLIP
|
# make flip-ee = Download the eeprom file to the device, using Atmel FLIP
|
||||||
# (must have Atmel FLIP installed).
|
# (must have Atmel FLIP installed).
|
||||||
#
|
#
|
||||||
# make doxygen = Generate DoxyGen documentation for the project (must have
|
# make doxygen = Generate DoxyGen documentation for the project (must have
|
||||||
# DoxyGen installed)
|
# DoxyGen installed)
|
||||||
#
|
#
|
||||||
# make debug = Start either simulavr or avarice as specified for debugging,
|
# make debug = Start either simulavr or avarice as specified for debugging,
|
||||||
# with avr-gdb or avr-insight as the front end 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.s = Just compile filename.c into the assembler code only.
|
||||||
#
|
#
|
||||||
# make filename.i = Create a preprocessed source file for use in submitting
|
# make filename.i = Create a preprocessed source file for use in submitting
|
||||||
# bug reports to the GCC project.
|
# bug reports to the GCC project.
|
||||||
#
|
#
|
||||||
# To rebuild project do "make clean" then "make all".
|
# To rebuild project do "make clean" then "make all".
|
||||||
#----------------------------------------------------------------------------
|
#----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
# MCU name
|
# MCU name
|
||||||
MCU = at90usb1287
|
MCU = at90usb1287
|
||||||
|
|
||||||
|
|
||||||
# Target architecture (see library "Board Types" documentation).
|
# Target architecture (see library "Board Types" documentation).
|
||||||
ARCH = AVR8
|
ARCH = AVR8
|
||||||
|
|
||||||
|
|
||||||
# Target board (see library "Board Types" documentation, NONE for projects not requiring
|
# 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
|
# LUFA board drivers). If USER is selected, put custom board drivers in a directory called
|
||||||
# "Board" inside the application directory.
|
# "Board" inside the application directory.
|
||||||
BOARD = USBKEY
|
BOARD = USBKEY
|
||||||
|
|
||||||
|
|
||||||
# Processor frequency.
|
# Processor frequency.
|
||||||
# This will define a symbol, F_CPU, in all source code files equal to the
|
# 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
|
# 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
|
# 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.
|
# 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
|
# 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
|
# 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
|
# 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
|
# reflect the processor speed set externally so that the code can use accurate
|
||||||
# software delays.
|
# software delays.
|
||||||
F_CPU = 8000000
|
F_CPU = 8000000
|
||||||
|
|
||||||
|
|
||||||
# Input clock frequency.
|
# Input clock frequency.
|
||||||
# This will define a symbol, F_USB, in all source code files equal to the
|
# 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
|
# 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
|
# 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
|
# 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'
|
# 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
|
# at the end, this will be done automatically to create a 32-bit value in your
|
||||||
# source code.
|
# source code.
|
||||||
#
|
#
|
||||||
# If no clock division is performed on the input clock inside the AVR (via the
|
# 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.
|
# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
|
||||||
F_USB = $(F_CPU)
|
F_USB = $(F_CPU)
|
||||||
|
|
||||||
|
|
||||||
# Output format. (can be srec, ihex, binary)
|
# Output format. (can be srec, ihex, binary)
|
||||||
FORMAT = ihex
|
FORMAT = ihex
|
||||||
|
|
||||||
|
|
||||||
# Target file name (without extension).
|
# Target file name (without extension).
|
||||||
TARGET = AudioInputHost
|
TARGET = AudioInputHost
|
||||||
|
|
||||||
|
|
||||||
# Object files directory
|
# Object files directory
|
||||||
# To put object files in current directory, use a dot (.), do NOT make
|
# To put object files in current directory, use a dot (.), do NOT make
|
||||||
# this an empty or blank macro!
|
# this an empty or blank macro!
|
||||||
OBJDIR = .
|
OBJDIR = .
|
||||||
|
|
||||||
|
|
||||||
# Path to the LUFA library
|
# Path to the LUFA library
|
||||||
LUFA_PATH = ../../../..
|
LUFA_PATH = ../../../..
|
||||||
|
|
||||||
|
|
||||||
# LUFA library compile-time options and predefined tokens
|
# LUFA library compile-time options and predefined tokens
|
||||||
LUFA_OPTS = -D USB_HOST_ONLY
|
LUFA_OPTS = -D USB_HOST_ONLY
|
||||||
LUFA_OPTS += -D USE_STATIC_OPTIONS="(USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"
|
LUFA_OPTS += -D USE_STATIC_OPTIONS="(USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"
|
||||||
|
|
||||||
|
|
||||||
# Create the LUFA source path variables by including the LUFA root makefile
|
# Create the LUFA source path variables by including the LUFA root makefile
|
||||||
include $(LUFA_PATH)/LUFA/makefile
|
include $(LUFA_PATH)/LUFA/makefile
|
||||||
|
|
||||||
|
|
||||||
# List C source files here. (C dependencies are automatically generated.)
|
# List C source files here. (C dependencies are automatically generated.)
|
||||||
SRC = $(TARGET).c \
|
SRC = $(TARGET).c \
|
||||||
$(LUFA_SRC_USB) \
|
$(LUFA_SRC_USB) \
|
||||||
$(LUFA_SRC_USBCLASS) \
|
$(LUFA_SRC_USBCLASS) \
|
||||||
$(LUFA_SRC_SERIAL)
|
$(LUFA_SRC_SERIAL)
|
||||||
|
|
||||||
|
|
||||||
# List C++ source files here. (C dependencies are automatically generated.)
|
# List C++ source files here. (C dependencies are automatically generated.)
|
||||||
CPPSRC =
|
CPPSRC =
|
||||||
|
|
||||||
|
|
||||||
# List Assembler source files here.
|
# List Assembler source files here.
|
||||||
# Make them always end in a capital .S. Files ending in a lowercase .s
|
# Make them always end in a capital .S. Files ending in a lowercase .s
|
||||||
# will not be considered source files but generated files (assembler
|
# will not be considered source files but generated files (assembler
|
||||||
# output from the compiler), and will be deleted upon "make clean"!
|
# output from the compiler), and will be deleted upon "make clean"!
|
||||||
# Even though the DOS/Win* filesystem matches both .s and .S the same,
|
# 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
|
# it will preserve the spelling of the filenames, and gcc itself does
|
||||||
# care about how the name is spelled on its command-line.
|
# care about how the name is spelled on its command-line.
|
||||||
ASRC =
|
ASRC =
|
||||||
|
|
||||||
|
|
||||||
# Optimization level, can be [0, 1, 2, 3, s].
|
# Optimization level, can be [0, 1, 2, 3, s].
|
||||||
# 0 = turn off optimization. s = optimize for size.
|
# 0 = turn off optimization. s = optimize for size.
|
||||||
# (Note: 3 is not always the best optimization level. See avr-libc FAQ.)
|
# (Note: 3 is not always the best optimization level. See avr-libc FAQ.)
|
||||||
OPT = s
|
OPT = s
|
||||||
|
|
||||||
|
|
||||||
# Debugging format.
|
# Debugging format.
|
||||||
# Native formats for AVR-GCC's -g are dwarf-2 [default] or stabs.
|
# Native formats for AVR-GCC's -g are dwarf-2 [default] or stabs.
|
||||||
# AVR Studio 4.10 requires dwarf-2.
|
# AVR Studio 4.10 requires dwarf-2.
|
||||||
# AVR [Extended] COFF format requires stabs, plus an avr-objcopy run.
|
# AVR [Extended] COFF format requires stabs, plus an avr-objcopy run.
|
||||||
DEBUG = dwarf-2
|
DEBUG = dwarf-2
|
||||||
|
|
||||||
|
|
||||||
# List any extra directories to look for include files here.
|
# List any extra directories to look for include files here.
|
||||||
# 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)/
|
||||||
|
|
||||||
|
|
||||||
# Compiler flag to set the C Standard level.
|
# Compiler flag to set the C Standard level.
|
||||||
# c89 = "ANSI" C
|
# c89 = "ANSI" C
|
||||||
# gnu89 = c89 plus GCC extensions
|
# gnu89 = c89 plus GCC extensions
|
||||||
# c99 = ISO C99 standard (not yet fully implemented)
|
# c99 = ISO C99 standard (not yet fully implemented)
|
||||||
# gnu99 = c99 plus GCC extensions
|
# gnu99 = c99 plus GCC extensions
|
||||||
CSTANDARD = -std=c99
|
CSTANDARD = -std=c99
|
||||||
|
|
||||||
|
|
||||||
# Place -D or -U options here for C sources
|
# Place -D or -U options here for C sources
|
||||||
CDEFS = -DF_CPU=$(F_CPU)UL
|
CDEFS = -DF_CPU=$(F_CPU)UL
|
||||||
CDEFS += -DF_USB=$(F_USB)UL
|
CDEFS += -DF_USB=$(F_USB)UL
|
||||||
CDEFS += -DBOARD=BOARD_$(BOARD) -DARCH=ARCH_$(ARCH)
|
CDEFS += -DBOARD=BOARD_$(BOARD) -DARCH=ARCH_$(ARCH)
|
||||||
CDEFS += $(LUFA_OPTS)
|
CDEFS += $(LUFA_OPTS)
|
||||||
|
|
||||||
|
|
||||||
# Place -D or -U options here for ASM sources
|
# Place -D or -U options here for ASM sources
|
||||||
ADEFS = -DF_CPU=$(F_CPU)
|
ADEFS = -DF_CPU=$(F_CPU)
|
||||||
ADEFS += -DF_USB=$(F_USB)UL
|
ADEFS += -DF_USB=$(F_USB)UL
|
||||||
ADEFS += -DBOARD=BOARD_$(BOARD)
|
ADEFS += -DBOARD=BOARD_$(BOARD)
|
||||||
ADEFS += $(LUFA_OPTS)
|
ADEFS += $(LUFA_OPTS)
|
||||||
|
|
||||||
# Place -D or -U options here for C++ sources
|
# Place -D or -U options here for C++ sources
|
||||||
CPPDEFS = -DF_CPU=$(F_CPU)UL
|
CPPDEFS = -DF_CPU=$(F_CPU)UL
|
||||||
CPPDEFS += -DF_USB=$(F_USB)UL
|
CPPDEFS += -DF_USB=$(F_USB)UL
|
||||||
CPPDEFS += -DBOARD=BOARD_$(BOARD)
|
CPPDEFS += -DBOARD=BOARD_$(BOARD)
|
||||||
CPPDEFS += $(LUFA_OPTS)
|
CPPDEFS += $(LUFA_OPTS)
|
||||||
#CPPDEFS += -D__STDC_LIMIT_MACROS
|
#CPPDEFS += -D__STDC_LIMIT_MACROS
|
||||||
#CPPDEFS += -D__STDC_CONSTANT_MACROS
|
#CPPDEFS += -D__STDC_CONSTANT_MACROS
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#---------------- Compiler Options C ----------------
|
#---------------- Compiler Options C ----------------
|
||||||
# -g*: generate debugging information
|
# -g*: generate debugging information
|
||||||
# -O*: optimization level
|
# -O*: optimization level
|
||||||
# -f...: tuning, see GCC manual and avr-libc documentation
|
# -f...: tuning, see GCC manual and avr-libc documentation
|
||||||
# -Wall...: warning level
|
# -Wall...: warning level
|
||||||
# -Wa,...: tell GCC to pass this to the assembler.
|
# -Wa,...: tell GCC to pass this to the assembler.
|
||||||
# -adhlns...: create assembler listing
|
# -adhlns...: create assembler listing
|
||||||
CFLAGS = -g$(DEBUG)
|
CFLAGS = -g$(DEBUG)
|
||||||
CFLAGS += $(CDEFS)
|
CFLAGS += $(CDEFS)
|
||||||
CFLAGS += -O$(OPT)
|
CFLAGS += -O$(OPT)
|
||||||
CFLAGS += -funsigned-char
|
CFLAGS += -funsigned-char
|
||||||
CFLAGS += -funsigned-bitfields
|
CFLAGS += -funsigned-bitfields
|
||||||
CFLAGS += -ffunction-sections
|
CFLAGS += -ffunction-sections
|
||||||
CFLAGS += -fno-inline-small-functions
|
CFLAGS += -fno-inline-small-functions
|
||||||
CFLAGS += -fpack-struct
|
CFLAGS += -fpack-struct
|
||||||
CFLAGS += -fshort-enums
|
CFLAGS += -fshort-enums
|
||||||
CFLAGS += -fno-strict-aliasing
|
CFLAGS += -fno-strict-aliasing
|
||||||
CFLAGS += -Wall
|
CFLAGS += -Wall
|
||||||
CFLAGS += -Wstrict-prototypes
|
CFLAGS += -Wstrict-prototypes
|
||||||
#CFLAGS += -mshort-calls
|
#CFLAGS += -mshort-calls
|
||||||
#CFLAGS += -fno-unit-at-a-time
|
#CFLAGS += -fno-unit-at-a-time
|
||||||
#CFLAGS += -Wundef
|
#CFLAGS += -Wundef
|
||||||
#CFLAGS += -Wunreachable-code
|
#CFLAGS += -Wunreachable-code
|
||||||
#CFLAGS += -Wsign-compare
|
#CFLAGS += -Wsign-compare
|
||||||
CFLAGS += -Wa,-adhlns=$(<:%.c=$(OBJDIR)/%.lst)
|
CFLAGS += -Wa,-adhlns=$(<:%.c=$(OBJDIR)/%.lst)
|
||||||
CFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS))
|
CFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS))
|
||||||
CFLAGS += $(CSTANDARD)
|
CFLAGS += $(CSTANDARD)
|
||||||
|
|
||||||
|
|
||||||
#---------------- Compiler Options C++ ----------------
|
#---------------- Compiler Options C++ ----------------
|
||||||
# -g*: generate debugging information
|
# -g*: generate debugging information
|
||||||
# -O*: optimization level
|
# -O*: optimization level
|
||||||
# -f...: tuning, see GCC manual and avr-libc documentation
|
# -f...: tuning, see GCC manual and avr-libc documentation
|
||||||
# -Wall...: warning level
|
# -Wall...: warning level
|
||||||
# -Wa,...: tell GCC to pass this to the assembler.
|
# -Wa,...: tell GCC to pass this to the assembler.
|
||||||
# -adhlns...: create assembler listing
|
# -adhlns...: create assembler listing
|
||||||
CPPFLAGS = -g$(DEBUG)
|
CPPFLAGS = -g$(DEBUG)
|
||||||
CPPFLAGS += $(CPPDEFS)
|
CPPFLAGS += $(CPPDEFS)
|
||||||
CPPFLAGS += -O$(OPT)
|
CPPFLAGS += -O$(OPT)
|
||||||
CPPFLAGS += -funsigned-char
|
CPPFLAGS += -funsigned-char
|
||||||
CPPFLAGS += -funsigned-bitfields
|
CPPFLAGS += -funsigned-bitfields
|
||||||
CPPFLAGS += -fpack-struct
|
CPPFLAGS += -fpack-struct
|
||||||
CPPFLAGS += -fshort-enums
|
CPPFLAGS += -fshort-enums
|
||||||
CPPFLAGS += -fno-exceptions
|
CPPFLAGS += -fno-exceptions
|
||||||
CPPFLAGS += -Wall
|
CPPFLAGS += -Wall
|
||||||
CPPFLAGS += -Wundef
|
CPPFLAGS += -Wundef
|
||||||
#CPPFLAGS += -mshort-calls
|
#CPPFLAGS += -mshort-calls
|
||||||
#CPPFLAGS += -fno-unit-at-a-time
|
#CPPFLAGS += -fno-unit-at-a-time
|
||||||
#CPPFLAGS += -Wstrict-prototypes
|
#CPPFLAGS += -Wstrict-prototypes
|
||||||
#CPPFLAGS += -Wunreachable-code
|
#CPPFLAGS += -Wunreachable-code
|
||||||
#CPPFLAGS += -Wsign-compare
|
#CPPFLAGS += -Wsign-compare
|
||||||
CPPFLAGS += -Wa,-adhlns=$(<:%.cpp=$(OBJDIR)/%.lst)
|
CPPFLAGS += -Wa,-adhlns=$(<:%.cpp=$(OBJDIR)/%.lst)
|
||||||
CPPFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS))
|
CPPFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS))
|
||||||
#CPPFLAGS += $(CSTANDARD)
|
#CPPFLAGS += $(CSTANDARD)
|
||||||
|
|
||||||
|
|
||||||
#---------------- Assembler Options ----------------
|
#---------------- Assembler Options ----------------
|
||||||
# -Wa,...: tell GCC to pass this to the assembler.
|
# -Wa,...: tell GCC to pass this to the assembler.
|
||||||
# -adhlns: create listing
|
# -adhlns: create listing
|
||||||
# -gstabs: have the assembler create line number information; note that
|
# -gstabs: have the assembler create line number information; note that
|
||||||
# for use in COFF files, additional information about filenames
|
# for use in COFF files, additional information about filenames
|
||||||
# and function names needs to be present in the assembler source
|
# and function names needs to be present in the assembler source
|
||||||
# files -- see avr-libc docs [FIXME: not yet described there]
|
# files -- see avr-libc docs [FIXME: not yet described there]
|
||||||
# -listing-cont-lines: Sets the maximum number of continuation lines of hex
|
# -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.
|
# 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
|
ASFLAGS = $(ADEFS) -Wa,-adhlns=$(<:%.S=$(OBJDIR)/%.lst),-gstabs,--listing-cont-lines=100
|
||||||
|
|
||||||
|
|
||||||
#---------------- Library Options ----------------
|
#---------------- Library Options ----------------
|
||||||
# Minimalistic printf version
|
# Minimalistic printf version
|
||||||
PRINTF_LIB_MIN = -Wl,-u,vfprintf -lprintf_min
|
PRINTF_LIB_MIN = -Wl,-u,vfprintf -lprintf_min
|
||||||
|
|
||||||
# Floating point printf version (requires MATH_LIB = -lm below)
|
# Floating point printf version (requires MATH_LIB = -lm below)
|
||||||
PRINTF_LIB_FLOAT = -Wl,-u,vfprintf -lprintf_flt
|
PRINTF_LIB_FLOAT = -Wl,-u,vfprintf -lprintf_flt
|
||||||
|
|
||||||
# If this is left blank, then it will use the Standard printf version.
|
# If this is left blank, then it will use the Standard printf version.
|
||||||
PRINTF_LIB =
|
PRINTF_LIB =
|
||||||
#PRINTF_LIB = $(PRINTF_LIB_MIN)
|
#PRINTF_LIB = $(PRINTF_LIB_MIN)
|
||||||
#PRINTF_LIB = $(PRINTF_LIB_FLOAT)
|
#PRINTF_LIB = $(PRINTF_LIB_FLOAT)
|
||||||
|
|
||||||
|
|
||||||
# Minimalistic scanf version
|
# Minimalistic scanf version
|
||||||
SCANF_LIB_MIN = -Wl,-u,vfscanf -lscanf_min
|
SCANF_LIB_MIN = -Wl,-u,vfscanf -lscanf_min
|
||||||
|
|
||||||
# Floating point + %[ scanf version (requires MATH_LIB = -lm below)
|
# Floating point + %[ scanf version (requires MATH_LIB = -lm below)
|
||||||
SCANF_LIB_FLOAT = -Wl,-u,vfscanf -lscanf_flt
|
SCANF_LIB_FLOAT = -Wl,-u,vfscanf -lscanf_flt
|
||||||
|
|
||||||
# If this is left blank, then it will use the Standard scanf version.
|
# If this is left blank, then it will use the Standard scanf version.
|
||||||
SCANF_LIB =
|
SCANF_LIB =
|
||||||
#SCANF_LIB = $(SCANF_LIB_MIN)
|
#SCANF_LIB = $(SCANF_LIB_MIN)
|
||||||
#SCANF_LIB = $(SCANF_LIB_FLOAT)
|
#SCANF_LIB = $(SCANF_LIB_FLOAT)
|
||||||
|
|
||||||
|
|
||||||
MATH_LIB = -lm
|
MATH_LIB = -lm
|
||||||
|
|
||||||
|
|
||||||
# List any extra directories to look for libraries here.
|
# List any extra directories to look for libraries here.
|
||||||
# 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.
|
||||||
EXTRALIBDIRS =
|
EXTRALIBDIRS =
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#---------------- External Memory Options ----------------
|
#---------------- External Memory Options ----------------
|
||||||
|
|
||||||
# 64 KB of external RAM, starting after internal RAM (ATmega128!),
|
# 64 KB of external RAM, starting after internal RAM (ATmega128!),
|
||||||
# used for variables (.data/.bss) and heap (malloc()).
|
# used for variables (.data/.bss) and heap (malloc()).
|
||||||
#EXTMEMOPTS = -Wl,-Tdata=0x801100,--defsym=__heap_end=0x80ffff
|
#EXTMEMOPTS = -Wl,-Tdata=0x801100,--defsym=__heap_end=0x80ffff
|
||||||
|
|
||||||
# 64 KB of external RAM, starting after internal RAM (ATmega128!),
|
# 64 KB of external RAM, starting after internal RAM (ATmega128!),
|
||||||
# only used for heap (malloc()).
|
# only used for heap (malloc()).
|
||||||
#EXTMEMOPTS = -Wl,--section-start,.data=0x801100,--defsym=__heap_end=0x80ffff
|
#EXTMEMOPTS = -Wl,--section-start,.data=0x801100,--defsym=__heap_end=0x80ffff
|
||||||
|
|
||||||
EXTMEMOPTS =
|
EXTMEMOPTS =
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#---------------- Linker Options ----------------
|
#---------------- Linker Options ----------------
|
||||||
# -Wl,...: tell GCC to pass this to linker.
|
# -Wl,...: tell GCC to pass this to linker.
|
||||||
# -Map: create map file
|
# -Map: create map file
|
||||||
# --cref: add cross reference to map file
|
# --cref: add cross reference to map file
|
||||||
LDFLAGS = -Wl,-Map=$(TARGET).map,--cref
|
LDFLAGS = -Wl,-Map=$(TARGET).map,--cref
|
||||||
LDFLAGS += -Wl,--relax
|
LDFLAGS += -Wl,--relax
|
||||||
LDFLAGS += -Wl,--gc-sections
|
LDFLAGS += -Wl,--gc-sections
|
||||||
LDFLAGS += $(EXTMEMOPTS)
|
LDFLAGS += $(EXTMEMOPTS)
|
||||||
LDFLAGS += $(patsubst %,-L%,$(EXTRALIBDIRS))
|
LDFLAGS += $(patsubst %,-L%,$(EXTRALIBDIRS))
|
||||||
LDFLAGS += $(PRINTF_LIB) $(SCANF_LIB) $(MATH_LIB)
|
LDFLAGS += $(PRINTF_LIB) $(SCANF_LIB) $(MATH_LIB)
|
||||||
#LDFLAGS += -T linker_script.x
|
#LDFLAGS += -T linker_script.x
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#---------------- Programming Options (avrdude) ----------------
|
#---------------- Programming Options (avrdude) ----------------
|
||||||
|
|
||||||
# Programming hardware
|
# Programming hardware
|
||||||
# Type: avrdude -c ?
|
# Type: avrdude -c ?
|
||||||
# to get a full listing.
|
# to get a full listing.
|
||||||
#
|
#
|
||||||
AVRDUDE_PROGRAMMER = jtagmkII
|
AVRDUDE_PROGRAMMER = jtagmkII
|
||||||
|
|
||||||
# com1 = serial port. Use lpt1 to connect to parallel port.
|
# com1 = serial port. Use lpt1 to connect to parallel port.
|
||||||
AVRDUDE_PORT = usb
|
AVRDUDE_PORT = usb
|
||||||
|
|
||||||
AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex
|
AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex
|
||||||
#AVRDUDE_WRITE_EEPROM = -U eeprom:w:$(TARGET).eep
|
#AVRDUDE_WRITE_EEPROM = -U eeprom:w:$(TARGET).eep
|
||||||
|
|
||||||
|
|
||||||
# Uncomment the following if you want avrdude's erase cycle counter.
|
# Uncomment the following if you want avrdude's erase cycle counter.
|
||||||
# Note that this counter needs to be initialized first using -Yn,
|
# Note that this counter needs to be initialized first using -Yn,
|
||||||
# see avrdude manual.
|
# see avrdude manual.
|
||||||
#AVRDUDE_ERASE_COUNTER = -y
|
#AVRDUDE_ERASE_COUNTER = -y
|
||||||
|
|
||||||
# Uncomment the following if you do /not/ wish a verification to be
|
# Uncomment the following if you do /not/ wish a verification to be
|
||||||
# performed after programming the device.
|
# performed after programming the device.
|
||||||
#AVRDUDE_NO_VERIFY = -V
|
#AVRDUDE_NO_VERIFY = -V
|
||||||
|
|
||||||
# Increase verbosity level. Please use this when submitting bug
|
# Increase verbosity level. Please use this when submitting bug
|
||||||
# reports about avrdude. See <http://savannah.nongnu.org/projects/avrdude>
|
# reports about avrdude. See <http://savannah.nongnu.org/projects/avrdude>
|
||||||
# to submit bug reports.
|
# to submit bug reports.
|
||||||
#AVRDUDE_VERBOSE = -v -v
|
#AVRDUDE_VERBOSE = -v -v
|
||||||
|
|
||||||
AVRDUDE_FLAGS = -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER)
|
AVRDUDE_FLAGS = -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER)
|
||||||
AVRDUDE_FLAGS += $(AVRDUDE_NO_VERIFY)
|
AVRDUDE_FLAGS += $(AVRDUDE_NO_VERIFY)
|
||||||
AVRDUDE_FLAGS += $(AVRDUDE_VERBOSE)
|
AVRDUDE_FLAGS += $(AVRDUDE_VERBOSE)
|
||||||
AVRDUDE_FLAGS += $(AVRDUDE_ERASE_COUNTER)
|
AVRDUDE_FLAGS += $(AVRDUDE_ERASE_COUNTER)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#---------------- Debugging Options ----------------
|
#---------------- Debugging Options ----------------
|
||||||
|
|
||||||
# For simulavr only - target MCU frequency.
|
# For simulavr only - target MCU frequency.
|
||||||
DEBUG_MFREQ = $(F_CPU)
|
DEBUG_MFREQ = $(F_CPU)
|
||||||
|
|
||||||
# Set the DEBUG_UI to either gdb or insight.
|
# Set the DEBUG_UI to either gdb or insight.
|
||||||
# DEBUG_UI = gdb
|
# DEBUG_UI = gdb
|
||||||
DEBUG_UI = insight
|
DEBUG_UI = insight
|
||||||
|
|
||||||
# Set the debugging back-end to either avarice, simulavr.
|
# Set the debugging back-end to either avarice, simulavr.
|
||||||
DEBUG_BACKEND = avarice
|
DEBUG_BACKEND = avarice
|
||||||
#DEBUG_BACKEND = simulavr
|
#DEBUG_BACKEND = simulavr
|
||||||
|
|
||||||
# GDB Init Filename.
|
# GDB Init Filename.
|
||||||
GDBINIT_FILE = __avr_gdbinit
|
GDBINIT_FILE = __avr_gdbinit
|
||||||
|
|
||||||
# When using avarice settings for the JTAG
|
# When using avarice settings for the JTAG
|
||||||
JTAG_DEV = /dev/com1
|
JTAG_DEV = /dev/com1
|
||||||
|
|
||||||
# Debugging port used to communicate between GDB / avarice / simulavr.
|
# Debugging port used to communicate between GDB / avarice / simulavr.
|
||||||
DEBUG_PORT = 4242
|
DEBUG_PORT = 4242
|
||||||
|
|
||||||
# Debugging host used to communicate between GDB / avarice / simulavr, normally
|
# Debugging host used to communicate between GDB / avarice / simulavr, normally
|
||||||
# just set to localhost unless doing some sort of crazy debugging when
|
# just set to localhost unless doing some sort of crazy debugging when
|
||||||
# avarice is running on a different computer.
|
# avarice is running on a different computer.
|
||||||
DEBUG_HOST = localhost
|
DEBUG_HOST = localhost
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#============================================================================
|
#============================================================================
|
||||||
|
|
||||||
|
|
||||||
# Define programs and commands.
|
# Define programs and commands.
|
||||||
SHELL = sh
|
SHELL = sh
|
||||||
CC = avr-gcc
|
CC = avr-gcc
|
||||||
OBJCOPY = avr-objcopy
|
OBJCOPY = avr-objcopy
|
||||||
OBJDUMP = avr-objdump
|
OBJDUMP = avr-objdump
|
||||||
SIZE = avr-size
|
SIZE = avr-size
|
||||||
AR = avr-ar rcs
|
AR = avr-ar rcs
|
||||||
NM = avr-nm
|
NM = avr-nm
|
||||||
AVRDUDE = avrdude
|
AVRDUDE = avrdude
|
||||||
REMOVE = rm -f
|
REMOVE = rm -f
|
||||||
REMOVEDIR = rm -rf
|
REMOVEDIR = rm -rf
|
||||||
COPY = cp
|
COPY = cp
|
||||||
WINSHELL = cmd
|
WINSHELL = cmd
|
||||||
|
|
||||||
|
|
||||||
# Define Messages
|
# Define Messages
|
||||||
# English
|
# English
|
||||||
MSG_ERRORS_NONE = Errors: none
|
MSG_ERRORS_NONE = Errors: none
|
||||||
MSG_BEGIN = -------- begin --------
|
MSG_BEGIN = -------- begin --------
|
||||||
MSG_END = -------- end --------
|
MSG_END = -------- end --------
|
||||||
MSG_SIZE_BEFORE = Size before:
|
MSG_SIZE_BEFORE = Size before:
|
||||||
MSG_SIZE_AFTER = Size after:
|
MSG_SIZE_AFTER = Size after:
|
||||||
MSG_COFF = Converting to AVR COFF:
|
MSG_COFF = Converting to AVR COFF:
|
||||||
MSG_EXTENDED_COFF = Converting to AVR Extended COFF:
|
MSG_EXTENDED_COFF = Converting to AVR Extended COFF:
|
||||||
MSG_FLASH = Creating load file for Flash:
|
MSG_FLASH = Creating load file for Flash:
|
||||||
MSG_EEPROM = Creating load file for EEPROM:
|
MSG_EEPROM = Creating load file for EEPROM:
|
||||||
MSG_EXTENDED_LISTING = Creating Extended Listing:
|
MSG_EXTENDED_LISTING = Creating Extended Listing:
|
||||||
MSG_SYMBOL_TABLE = Creating Symbol Table:
|
MSG_SYMBOL_TABLE = Creating Symbol Table:
|
||||||
MSG_LINKING = Linking:
|
MSG_LINKING = Linking:
|
||||||
MSG_COMPILING = Compiling C:
|
MSG_COMPILING = Compiling C:
|
||||||
MSG_COMPILING_CPP = Compiling C++:
|
MSG_COMPILING_CPP = Compiling C++:
|
||||||
MSG_ASSEMBLING = Assembling:
|
MSG_ASSEMBLING = Assembling:
|
||||||
MSG_CLEANING = Cleaning project:
|
MSG_CLEANING = Cleaning project:
|
||||||
MSG_CREATING_LIBRARY = Creating library:
|
MSG_CREATING_LIBRARY = Creating library:
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Define all object files.
|
# Define all object files.
|
||||||
OBJ = $(SRC:%.c=$(OBJDIR)/%.o) $(CPPSRC:%.cpp=$(OBJDIR)/%.o) $(ASRC:%.S=$(OBJDIR)/%.o)
|
OBJ = $(SRC:%.c=$(OBJDIR)/%.o) $(CPPSRC:%.cpp=$(OBJDIR)/%.o) $(ASRC:%.S=$(OBJDIR)/%.o)
|
||||||
|
|
||||||
# Define all listing files.
|
# Define all listing files.
|
||||||
LST = $(SRC:%.c=$(OBJDIR)/%.lst) $(CPPSRC:%.cpp=$(OBJDIR)/%.lst) $(ASRC:%.S=$(OBJDIR)/%.lst)
|
LST = $(SRC:%.c=$(OBJDIR)/%.lst) $(CPPSRC:%.cpp=$(OBJDIR)/%.lst) $(ASRC:%.S=$(OBJDIR)/%.lst)
|
||||||
|
|
||||||
|
|
||||||
# Compiler flags to generate dependency files.
|
# Compiler flags to generate dependency files.
|
||||||
GENDEPFLAGS = -MMD -MP -MF .dep/$(@F).d
|
GENDEPFLAGS = -MMD -MP -MF .dep/$(@F).d
|
||||||
|
|
||||||
|
|
||||||
# Combine all necessary flags and optional flags.
|
# Combine all necessary flags and optional flags.
|
||||||
# Add target processor to flags.
|
# Add target processor to flags.
|
||||||
ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS) $(GENDEPFLAGS)
|
ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS) $(GENDEPFLAGS)
|
||||||
ALL_CPPFLAGS = -mmcu=$(MCU) -I. -x c++ $(CPPFLAGS) $(GENDEPFLAGS)
|
ALL_CPPFLAGS = -mmcu=$(MCU) -I. -x c++ $(CPPFLAGS) $(GENDEPFLAGS)
|
||||||
ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS)
|
ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Default target.
|
# Default target.
|
||||||
all: begin gccversion sizebefore build sizeafter end
|
all: begin gccversion sizebefore build sizeafter end
|
||||||
|
|
||||||
# Change the build target to build a HEX file or a library.
|
# Change the build target to build a HEX file or a library.
|
||||||
build: elf hex eep lss sym
|
build: elf hex eep lss sym
|
||||||
#build: lib
|
#build: lib
|
||||||
|
|
||||||
|
|
||||||
elf: $(TARGET).elf
|
elf: $(TARGET).elf
|
||||||
hex: $(TARGET).hex
|
hex: $(TARGET).hex
|
||||||
eep: $(TARGET).eep
|
eep: $(TARGET).eep
|
||||||
lss: $(TARGET).lss
|
lss: $(TARGET).lss
|
||||||
sym: $(TARGET).sym
|
sym: $(TARGET).sym
|
||||||
LIBNAME=lib$(TARGET).a
|
LIBNAME=lib$(TARGET).a
|
||||||
lib: $(LIBNAME)
|
lib: $(LIBNAME)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Eye candy.
|
# Eye candy.
|
||||||
# AVR Studio 3.x does not check make's exit code but relies on
|
# 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.
|
# the following magic strings to be generated by the compile job.
|
||||||
begin:
|
begin:
|
||||||
@echo
|
@echo
|
||||||
@echo $(MSG_BEGIN)
|
@echo $(MSG_BEGIN)
|
||||||
|
|
||||||
end:
|
end:
|
||||||
@echo $(MSG_END)
|
@echo $(MSG_END)
|
||||||
@echo
|
@echo
|
||||||
|
|
||||||
|
|
||||||
# Display size of file.
|
# Display size of file.
|
||||||
HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex
|
HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex
|
||||||
ELFSIZE = $(SIZE) $(MCU_FLAG) $(FORMAT_FLAG) $(TARGET).elf
|
ELFSIZE = $(SIZE) $(MCU_FLAG) $(FORMAT_FLAG) $(TARGET).elf
|
||||||
MCU_FLAG = $(shell $(SIZE) --help | grep -- --mcu > /dev/null && echo --mcu=$(MCU) )
|
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 )
|
FORMAT_FLAG = $(shell $(SIZE) --help | grep -- --format=.*avr > /dev/null && echo --format=avr )
|
||||||
|
|
||||||
|
|
||||||
sizebefore:
|
sizebefore:
|
||||||
@if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_BEFORE); $(ELFSIZE); \
|
@if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_BEFORE); $(ELFSIZE); \
|
||||||
2>/dev/null; echo; fi
|
2>/dev/null; echo; fi
|
||||||
|
|
||||||
sizeafter:
|
sizeafter:
|
||||||
@if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_AFTER); $(ELFSIZE); \
|
@if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_AFTER); $(ELFSIZE); \
|
||||||
2>/dev/null; echo; fi
|
2>/dev/null; echo; fi
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Display compiler version information.
|
# Display compiler version information.
|
||||||
gccversion :
|
gccversion :
|
||||||
@$(CC) --version
|
@$(CC) --version
|
||||||
|
|
||||||
|
|
||||||
# Program the device.
|
# Program the device.
|
||||||
program: $(TARGET).hex $(TARGET).eep
|
program: $(TARGET).hex $(TARGET).eep
|
||||||
$(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM)
|
$(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM)
|
||||||
|
|
||||||
flip: $(TARGET).hex
|
flip: $(TARGET).hex
|
||||||
batchisp -hardware usb -device $(MCU) -operation erase f
|
batchisp -hardware usb -device $(MCU) -operation erase f
|
||||||
batchisp -hardware usb -device $(MCU) -operation loadbuffer $(TARGET).hex program
|
batchisp -hardware usb -device $(MCU) -operation loadbuffer $(TARGET).hex program
|
||||||
batchisp -hardware usb -device $(MCU) -operation start reset 0
|
batchisp -hardware usb -device $(MCU) -operation start reset 0
|
||||||
|
|
||||||
dfu: $(TARGET).hex
|
dfu: $(TARGET).hex
|
||||||
dfu-programmer $(MCU) erase
|
dfu-programmer $(MCU) erase
|
||||||
dfu-programmer $(MCU) flash $(TARGET).hex
|
dfu-programmer $(MCU) flash $(TARGET).hex
|
||||||
dfu-programmer $(MCU) reset
|
dfu-programmer $(MCU) reset
|
||||||
|
|
||||||
flip-ee: $(TARGET).hex $(TARGET).eep
|
flip-ee: $(TARGET).hex $(TARGET).eep
|
||||||
$(COPY) $(TARGET).eep $(TARGET)eep.hex
|
$(COPY) $(TARGET).eep $(TARGET)eep.hex
|
||||||
batchisp -hardware usb -device $(MCU) -operation memory EEPROM erase
|
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 memory EEPROM loadbuffer $(TARGET)eep.hex program
|
||||||
batchisp -hardware usb -device $(MCU) -operation start reset 0
|
batchisp -hardware usb -device $(MCU) -operation start reset 0
|
||||||
$(REMOVE) $(TARGET)eep.hex
|
$(REMOVE) $(TARGET)eep.hex
|
||||||
|
|
||||||
dfu-ee: $(TARGET).hex $(TARGET).eep
|
dfu-ee: $(TARGET).hex $(TARGET).eep
|
||||||
dfu-programmer $(MCU) eeprom-flash $(TARGET).eep
|
dfu-programmer $(MCU) eeprom-flash $(TARGET).eep
|
||||||
dfu-programmer $(MCU) reset
|
dfu-programmer $(MCU) reset
|
||||||
|
|
||||||
|
|
||||||
# Generate avr-gdb config/init file which does the following:
|
# Generate avr-gdb config/init file which does the following:
|
||||||
# define the reset signal, load the target file, connect to target, and set
|
# define the reset signal, load the target file, connect to target, and set
|
||||||
# a breakpoint at main().
|
# a breakpoint at main().
|
||||||
gdb-config:
|
gdb-config:
|
||||||
@$(REMOVE) $(GDBINIT_FILE)
|
@$(REMOVE) $(GDBINIT_FILE)
|
||||||
@echo define reset >> $(GDBINIT_FILE)
|
@echo define reset >> $(GDBINIT_FILE)
|
||||||
@echo SIGNAL SIGHUP >> $(GDBINIT_FILE)
|
@echo SIGNAL SIGHUP >> $(GDBINIT_FILE)
|
||||||
@echo end >> $(GDBINIT_FILE)
|
@echo end >> $(GDBINIT_FILE)
|
||||||
@echo file $(TARGET).elf >> $(GDBINIT_FILE)
|
@echo file $(TARGET).elf >> $(GDBINIT_FILE)
|
||||||
@echo target remote $(DEBUG_HOST):$(DEBUG_PORT) >> $(GDBINIT_FILE)
|
@echo target remote $(DEBUG_HOST):$(DEBUG_PORT) >> $(GDBINIT_FILE)
|
||||||
ifeq ($(DEBUG_BACKEND),simulavr)
|
ifeq ($(DEBUG_BACKEND),simulavr)
|
||||||
@echo load >> $(GDBINIT_FILE)
|
@echo load >> $(GDBINIT_FILE)
|
||||||
endif
|
endif
|
||||||
@echo break main >> $(GDBINIT_FILE)
|
@echo break main >> $(GDBINIT_FILE)
|
||||||
|
|
||||||
debug: gdb-config $(TARGET).elf
|
debug: gdb-config $(TARGET).elf
|
||||||
ifeq ($(DEBUG_BACKEND), avarice)
|
ifeq ($(DEBUG_BACKEND), avarice)
|
||||||
@echo Starting AVaRICE - Press enter when "waiting to connect" message displays.
|
@echo Starting AVaRICE - Press enter when "waiting to connect" message displays.
|
||||||
@$(WINSHELL) /c start avarice --jtag $(JTAG_DEV) --erase --program --file \
|
@$(WINSHELL) /c start avarice --jtag $(JTAG_DEV) --erase --program --file \
|
||||||
$(TARGET).elf $(DEBUG_HOST):$(DEBUG_PORT)
|
$(TARGET).elf $(DEBUG_HOST):$(DEBUG_PORT)
|
||||||
@$(WINSHELL) /c pause
|
@$(WINSHELL) /c pause
|
||||||
|
|
||||||
else
|
else
|
||||||
@$(WINSHELL) /c start simulavr --gdbserver --device $(MCU) --clock-freq \
|
@$(WINSHELL) /c start simulavr --gdbserver --device $(MCU) --clock-freq \
|
||||||
$(DEBUG_MFREQ) --port $(DEBUG_PORT)
|
$(DEBUG_MFREQ) --port $(DEBUG_PORT)
|
||||||
endif
|
endif
|
||||||
@$(WINSHELL) /c start avr-$(DEBUG_UI) --command=$(GDBINIT_FILE)
|
@$(WINSHELL) /c start avr-$(DEBUG_UI) --command=$(GDBINIT_FILE)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Convert ELF to COFF for use in debugging / simulating in AVR Studio or VMLAB.
|
# Convert ELF to COFF for use in debugging / simulating in AVR Studio or VMLAB.
|
||||||
COFFCONVERT = $(OBJCOPY) --debugging
|
COFFCONVERT = $(OBJCOPY) --debugging
|
||||||
COFFCONVERT += --change-section-address .data-0x800000
|
COFFCONVERT += --change-section-address .data-0x800000
|
||||||
COFFCONVERT += --change-section-address .bss-0x800000
|
COFFCONVERT += --change-section-address .bss-0x800000
|
||||||
COFFCONVERT += --change-section-address .noinit-0x800000
|
COFFCONVERT += --change-section-address .noinit-0x800000
|
||||||
COFFCONVERT += --change-section-address .eeprom-0x810000
|
COFFCONVERT += --change-section-address .eeprom-0x810000
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
coff: $(TARGET).elf
|
coff: $(TARGET).elf
|
||||||
@echo
|
@echo
|
||||||
@echo $(MSG_COFF) $(TARGET).cof
|
@echo $(MSG_COFF) $(TARGET).cof
|
||||||
$(COFFCONVERT) -O coff-avr $< $(TARGET).cof
|
$(COFFCONVERT) -O coff-avr $< $(TARGET).cof
|
||||||
|
|
||||||
|
|
||||||
extcoff: $(TARGET).elf
|
extcoff: $(TARGET).elf
|
||||||
@echo
|
@echo
|
||||||
@echo $(MSG_EXTENDED_COFF) $(TARGET).cof
|
@echo $(MSG_EXTENDED_COFF) $(TARGET).cof
|
||||||
$(COFFCONVERT) -O coff-ext-avr $< $(TARGET).cof
|
$(COFFCONVERT) -O coff-ext-avr $< $(TARGET).cof
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Create final output files (.hex, .eep) from ELF output file.
|
# Create final output files (.hex, .eep) from ELF output file.
|
||||||
%.hex: %.elf
|
%.hex: %.elf
|
||||||
@echo
|
@echo
|
||||||
@echo $(MSG_FLASH) $@
|
@echo $(MSG_FLASH) $@
|
||||||
$(OBJCOPY) -O $(FORMAT) -R .eeprom -R .fuse -R .lock $< $@
|
$(OBJCOPY) -O $(FORMAT) -R .eeprom -R .fuse -R .lock $< $@
|
||||||
|
|
||||||
%.eep: %.elf
|
%.eep: %.elf
|
||||||
@echo
|
@echo
|
||||||
@echo $(MSG_EEPROM) $@
|
@echo $(MSG_EEPROM) $@
|
||||||
-$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \
|
-$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \
|
||||||
--change-section-lma .eeprom=0 --no-change-warnings -O $(FORMAT) $< $@ || exit 0
|
--change-section-lma .eeprom=0 --no-change-warnings -O $(FORMAT) $< $@ || exit 0
|
||||||
|
|
||||||
# Create extended listing file from ELF output file.
|
# Create extended listing file from ELF output file.
|
||||||
%.lss: %.elf
|
%.lss: %.elf
|
||||||
@echo
|
@echo
|
||||||
@echo $(MSG_EXTENDED_LISTING) $@
|
@echo $(MSG_EXTENDED_LISTING) $@
|
||||||
$(OBJDUMP) -h -S -z $< > $@
|
$(OBJDUMP) -h -S -z $< > $@
|
||||||
|
|
||||||
# Create a symbol table from ELF output file.
|
# Create a symbol table from ELF output file.
|
||||||
%.sym: %.elf
|
%.sym: %.elf
|
||||||
@echo
|
@echo
|
||||||
@echo $(MSG_SYMBOL_TABLE) $@
|
@echo $(MSG_SYMBOL_TABLE) $@
|
||||||
$(NM) -n $< > $@
|
$(NM) -n $< > $@
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Create library from object files.
|
# Create library from object files.
|
||||||
.SECONDARY : $(TARGET).a
|
.SECONDARY : $(TARGET).a
|
||||||
.PRECIOUS : $(OBJ)
|
.PRECIOUS : $(OBJ)
|
||||||
%.a: $(OBJ)
|
%.a: $(OBJ)
|
||||||
@echo
|
@echo
|
||||||
@echo $(MSG_CREATING_LIBRARY) $@
|
@echo $(MSG_CREATING_LIBRARY) $@
|
||||||
$(AR) $@ $(OBJ)
|
$(AR) $@ $(OBJ)
|
||||||
|
|
||||||
|
|
||||||
# Link: create ELF output file from object files.
|
# Link: create ELF output file from object files.
|
||||||
.SECONDARY : $(TARGET).elf
|
.SECONDARY : $(TARGET).elf
|
||||||
.PRECIOUS : $(OBJ)
|
.PRECIOUS : $(OBJ)
|
||||||
%.elf: $(OBJ)
|
%.elf: $(OBJ)
|
||||||
@echo
|
@echo
|
||||||
@echo $(MSG_LINKING) $@
|
@echo $(MSG_LINKING) $@
|
||||||
$(CC) $(ALL_CFLAGS) $^ --output $@ $(LDFLAGS)
|
$(CC) $(ALL_CFLAGS) $^ --output $@ $(LDFLAGS)
|
||||||
|
|
||||||
|
|
||||||
# Compile: create object files from C source files.
|
# Compile: create object files from C source files.
|
||||||
$(OBJDIR)/%.o : %.c
|
$(OBJDIR)/%.o : %.c
|
||||||
@echo
|
@echo
|
||||||
@echo $(MSG_COMPILING) $<
|
@echo $(MSG_COMPILING) $<
|
||||||
$(CC) -c $(ALL_CFLAGS) $< -o $@
|
$(CC) -c $(ALL_CFLAGS) $< -o $@
|
||||||
|
|
||||||
|
|
||||||
# Compile: create object files from C++ source files.
|
# Compile: create object files from C++ source files.
|
||||||
$(OBJDIR)/%.o : %.cpp
|
$(OBJDIR)/%.o : %.cpp
|
||||||
@echo
|
@echo
|
||||||
@echo $(MSG_COMPILING_CPP) $<
|
@echo $(MSG_COMPILING_CPP) $<
|
||||||
$(CC) -c $(ALL_CPPFLAGS) $< -o $@
|
$(CC) -c $(ALL_CPPFLAGS) $< -o $@
|
||||||
|
|
||||||
|
|
||||||
# Compile: create assembler files from C source files.
|
# Compile: create assembler files from C source files.
|
||||||
%.s : %.c
|
%.s : %.c
|
||||||
$(CC) -S $(ALL_CFLAGS) $< -o $@
|
$(CC) -S $(ALL_CFLAGS) $< -o $@
|
||||||
|
|
||||||
|
|
||||||
# Compile: create assembler files from C++ source files.
|
# Compile: create assembler files from C++ source files.
|
||||||
%.s : %.cpp
|
%.s : %.cpp
|
||||||
$(CC) -S $(ALL_CPPFLAGS) $< -o $@
|
$(CC) -S $(ALL_CPPFLAGS) $< -o $@
|
||||||
|
|
||||||
|
|
||||||
# Assemble: create object files from assembler source files.
|
# Assemble: create object files from assembler source files.
|
||||||
$(OBJDIR)/%.o : %.S
|
$(OBJDIR)/%.o : %.S
|
||||||
@echo
|
@echo
|
||||||
@echo $(MSG_ASSEMBLING) $<
|
@echo $(MSG_ASSEMBLING) $<
|
||||||
$(CC) -c $(ALL_ASFLAGS) $< -o $@
|
$(CC) -c $(ALL_ASFLAGS) $< -o $@
|
||||||
|
|
||||||
|
|
||||||
# Create preprocessed source for use in sending a bug report.
|
# Create preprocessed source for use in sending a bug report.
|
||||||
%.i : %.c
|
%.i : %.c
|
||||||
$(CC) -E -mmcu=$(MCU) -I. $(CFLAGS) $< -o $@
|
$(CC) -E -mmcu=$(MCU) -I. $(CFLAGS) $< -o $@
|
||||||
|
|
||||||
|
|
||||||
# Target: clean project.
|
# Target: clean project.
|
||||||
clean: begin clean_list end
|
clean: begin clean_list end
|
||||||
|
|
||||||
clean_list :
|
clean_list :
|
||||||
@echo
|
@echo
|
||||||
@echo $(MSG_CLEANING)
|
@echo $(MSG_CLEANING)
|
||||||
$(REMOVE) $(TARGET).hex
|
$(REMOVE) $(TARGET).hex
|
||||||
$(REMOVE) $(TARGET).eep
|
$(REMOVE) $(TARGET).eep
|
||||||
$(REMOVE) $(TARGET).cof
|
$(REMOVE) $(TARGET).cof
|
||||||
$(REMOVE) $(TARGET).elf
|
$(REMOVE) $(TARGET).elf
|
||||||
$(REMOVE) $(TARGET).map
|
$(REMOVE) $(TARGET).map
|
||||||
$(REMOVE) $(TARGET).sym
|
$(REMOVE) $(TARGET).sym
|
||||||
$(REMOVE) $(TARGET).lss
|
$(REMOVE) $(TARGET).lss
|
||||||
$(REMOVE) $(SRC:%.c=$(OBJDIR)/%.o) $(CPPSRC:%.cpp=$(OBJDIR)/%.o) $(ASRC:%.S=$(OBJDIR)/%.o)
|
$(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=$(OBJDIR)/%.lst) $(CPPSRC:%.cpp=$(OBJDIR)/%.lst) $(ASRC:%.S=$(OBJDIR)/%.lst)
|
||||||
$(REMOVE) $(SRC:.c=.s)
|
$(REMOVE) $(SRC:.c=.s)
|
||||||
$(REMOVE) $(SRC:.c=.d)
|
$(REMOVE) $(SRC:.c=.d)
|
||||||
$(REMOVE) $(SRC:.c=.i)
|
$(REMOVE) $(SRC:.c=.i)
|
||||||
$(REMOVEDIR) .dep
|
$(REMOVEDIR) .dep
|
||||||
|
|
||||||
doxygen:
|
doxygen:
|
||||||
@echo Generating Project Documentation...
|
@echo Generating Project Documentation...
|
||||||
@doxygen Doxygen.conf
|
@doxygen Doxygen.conf
|
||||||
@echo Documentation Generation Complete.
|
@echo Documentation Generation Complete.
|
||||||
|
|
||||||
clean_doxygen:
|
clean_doxygen:
|
||||||
rm -rf Documentation
|
rm -rf Documentation
|
||||||
|
|
||||||
# Create object files directory
|
# Create object files directory
|
||||||
$(shell mkdir $(OBJDIR) 2>/dev/null)
|
$(shell mkdir $(OBJDIR) 2>/dev/null)
|
||||||
|
|
||||||
|
|
||||||
# Include the dependency files.
|
# Include the dependency files.
|
||||||
-include $(shell mkdir .dep 2>/dev/null) $(wildcard .dep/*)
|
-include $(shell mkdir .dep 2>/dev/null) $(wildcard .dep/*)
|
||||||
|
|
||||||
|
|
||||||
# Listing of phony targets.
|
# Listing of phony targets.
|
||||||
.PHONY : all begin finish end sizebefore sizeafter gccversion \
|
.PHONY : all begin finish end sizebefore sizeafter gccversion \
|
||||||
build elf hex eep lss sym coff extcoff doxygen clean \
|
build elf hex eep lss sym coff extcoff doxygen clean \
|
||||||
clean_list clean_doxygen program dfu flip flip-ee dfu-ee \
|
clean_list clean_doxygen program dfu flip flip-ee dfu-ee \
|
||||||
debug gdb-config
|
debug gdb-config
|
||||||
|
|
||||||
|
@ -1,249 +1,249 @@
|
|||||||
/*
|
/*
|
||||||
LUFA Library
|
LUFA Library
|
||||||
Copyright (C) Dean Camera, 2011.
|
Copyright (C) Dean Camera, 2011.
|
||||||
|
|
||||||
dean [at] fourwalledcubicle [dot] com
|
dean [at] fourwalledcubicle [dot] com
|
||||||
www.lufa-lib.org
|
www.lufa-lib.org
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com)
|
Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com)
|
||||||
|
|
||||||
Permission to use, copy, modify, distribute, and sell this
|
Permission to use, copy, modify, distribute, and sell this
|
||||||
software and its documentation for any purpose is hereby granted
|
software and its documentation for any purpose is hereby granted
|
||||||
without fee, provided that the above copyright notice appear in
|
without fee, provided that the above copyright notice appear in
|
||||||
all copies and that both that the copyright notice and this
|
all copies and that both that the copyright notice and this
|
||||||
permission notice and warranty disclaimer appear in supporting
|
permission notice and warranty disclaimer appear in supporting
|
||||||
documentation, and that the name of the author not be used in
|
documentation, and that the name of the author not be used in
|
||||||
advertising or publicity pertaining to distribution of the
|
advertising or publicity pertaining to distribution of the
|
||||||
software without specific, written prior permission.
|
software without specific, written prior permission.
|
||||||
|
|
||||||
The author disclaim all warranties with regard to this
|
The author disclaim all warranties with regard to this
|
||||||
software, including all implied warranties of merchantability
|
software, including all implied warranties of merchantability
|
||||||
and fitness. In no event shall the author be liable for any
|
and fitness. In no event shall the author be liable for any
|
||||||
special, indirect or consequential damages or any damages
|
special, indirect or consequential damages or any damages
|
||||||
whatsoever resulting from loss of use, data or profits, whether
|
whatsoever resulting from loss of use, data or profits, whether
|
||||||
in an action of contract, negligence or other tortious action,
|
in an action of contract, negligence or other tortious action,
|
||||||
arising out of or in connection with the use or performance of
|
arising out of or in connection with the use or performance of
|
||||||
this software.
|
this software.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/** \file
|
/** \file
|
||||||
*
|
*
|
||||||
* Main source file for the AudioOutputHost demo. This file contains the main tasks of
|
* Main source file for the AudioOutputHost demo. This file contains the main tasks of
|
||||||
* the demo and is responsible for the initial application hardware configuration.
|
* the demo and is responsible for the initial application hardware configuration.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "AudioOutputHost.h"
|
#include "AudioOutputHost.h"
|
||||||
|
|
||||||
/** LUFA Audio Class driver interface configuration and state information. This structure is
|
/** LUFA Audio Class driver interface configuration and state information. This structure is
|
||||||
* passed to all Audio Class driver functions, so that multiple instances of the same class
|
* passed to all Audio Class driver functions, so that multiple instances of the same class
|
||||||
* within a device can be differentiated from one another.
|
* within a device can be differentiated from one another.
|
||||||
*/
|
*/
|
||||||
USB_ClassInfo_Audio_Host_t Speaker_Audio_Interface =
|
USB_ClassInfo_Audio_Host_t Speaker_Audio_Interface =
|
||||||
{
|
{
|
||||||
.Config =
|
.Config =
|
||||||
{
|
{
|
||||||
.DataOUTPipeNumber = 1,
|
.DataOUTPipeNumber = 1,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
/** Main program entry point. This routine configures the hardware required by the application, then
|
/** Main program entry point. This routine configures the hardware required by the application, then
|
||||||
* enters a loop to run the application tasks in sequence.
|
* enters a loop to run the application tasks in sequence.
|
||||||
*/
|
*/
|
||||||
int main(void)
|
int main(void)
|
||||||
{
|
{
|
||||||
SetupHardware();
|
SetupHardware();
|
||||||
|
|
||||||
puts_P(PSTR(ESC_FG_CYAN "Audio Output Host Demo running.\r\n" ESC_FG_WHITE));
|
puts_P(PSTR(ESC_FG_CYAN "Audio Output Host Demo running.\r\n" ESC_FG_WHITE));
|
||||||
|
|
||||||
LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY);
|
LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY);
|
||||||
sei();
|
sei();
|
||||||
|
|
||||||
for (;;)
|
for (;;)
|
||||||
{
|
{
|
||||||
switch (USB_HostState)
|
switch (USB_HostState)
|
||||||
{
|
{
|
||||||
case HOST_STATE_Addressed:
|
case HOST_STATE_Addressed:
|
||||||
LEDs_SetAllLEDs(LEDMASK_USB_ENUMERATING);
|
LEDs_SetAllLEDs(LEDMASK_USB_ENUMERATING);
|
||||||
|
|
||||||
uint16_t ConfigDescriptorSize;
|
uint16_t ConfigDescriptorSize;
|
||||||
uint8_t ConfigDescriptorData[512];
|
uint8_t ConfigDescriptorData[512];
|
||||||
|
|
||||||
if (USB_Host_GetDeviceConfigDescriptor(1, &ConfigDescriptorSize, ConfigDescriptorData,
|
if (USB_Host_GetDeviceConfigDescriptor(1, &ConfigDescriptorSize, ConfigDescriptorData,
|
||||||
sizeof(ConfigDescriptorData)) != HOST_GETCONFIG_Successful)
|
sizeof(ConfigDescriptorData)) != HOST_GETCONFIG_Successful)
|
||||||
{
|
{
|
||||||
puts_P(PSTR("Error Retrieving Configuration Descriptor.\r\n"));
|
puts_P(PSTR("Error Retrieving Configuration Descriptor.\r\n"));
|
||||||
LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
|
LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
|
||||||
USB_HostState = HOST_STATE_WaitForDeviceRemoval;
|
USB_HostState = HOST_STATE_WaitForDeviceRemoval;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Audio_Host_ConfigurePipes(&Speaker_Audio_Interface,
|
if (Audio_Host_ConfigurePipes(&Speaker_Audio_Interface,
|
||||||
ConfigDescriptorSize, ConfigDescriptorData) != AUDIO_ENUMERROR_NoError)
|
ConfigDescriptorSize, ConfigDescriptorData) != AUDIO_ENUMERROR_NoError)
|
||||||
{
|
{
|
||||||
puts_P(PSTR("Attached Device Not a Valid Audio Output Device.\r\n"));
|
puts_P(PSTR("Attached Device Not a Valid Audio Output Device.\r\n"));
|
||||||
LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
|
LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
|
||||||
USB_HostState = HOST_STATE_WaitForDeviceRemoval;
|
USB_HostState = HOST_STATE_WaitForDeviceRemoval;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (USB_Host_SetDeviceConfiguration(1) != HOST_SENDCONTROL_Successful)
|
if (USB_Host_SetDeviceConfiguration(1) != HOST_SENDCONTROL_Successful)
|
||||||
{
|
{
|
||||||
puts_P(PSTR("Error Setting Device Configuration.\r\n"));
|
puts_P(PSTR("Error Setting Device Configuration.\r\n"));
|
||||||
LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
|
LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
|
||||||
USB_HostState = HOST_STATE_WaitForDeviceRemoval;
|
USB_HostState = HOST_STATE_WaitForDeviceRemoval;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Audio_Host_StartStopStreaming(&Speaker_Audio_Interface, true) != HOST_SENDCONTROL_Successful)
|
if (Audio_Host_StartStopStreaming(&Speaker_Audio_Interface, true) != HOST_SENDCONTROL_Successful)
|
||||||
{
|
{
|
||||||
puts_P(PSTR("Error Enabling Audio Stream.\r\n"));
|
puts_P(PSTR("Error Enabling Audio Stream.\r\n"));
|
||||||
LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
|
LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
|
||||||
USB_HostState = HOST_STATE_WaitForDeviceRemoval;
|
USB_HostState = HOST_STATE_WaitForDeviceRemoval;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
USB_Audio_SampleFreq_t SampleRate = AUDIO_SAMPLE_FREQ(48000);
|
USB_Audio_SampleFreq_t SampleRate = AUDIO_SAMPLE_FREQ(48000);
|
||||||
if (Audio_Host_GetSetEndpointProperty(&Speaker_Audio_Interface, Speaker_Audio_Interface.Config.DataOUTPipeNumber,
|
if (Audio_Host_GetSetEndpointProperty(&Speaker_Audio_Interface, Speaker_Audio_Interface.Config.DataOUTPipeNumber,
|
||||||
AUDIO_REQ_SetCurrent, AUDIO_EPCONTROL_SamplingFreq,
|
AUDIO_REQ_SetCurrent, AUDIO_EPCONTROL_SamplingFreq,
|
||||||
sizeof(SampleRate), &SampleRate) != HOST_SENDCONTROL_Successful)
|
sizeof(SampleRate), &SampleRate) != HOST_SENDCONTROL_Successful)
|
||||||
{
|
{
|
||||||
puts_P(PSTR("Error Setting Audio Sampling Frequency.\r\n"));
|
puts_P(PSTR("Error Setting Audio Sampling Frequency.\r\n"));
|
||||||
LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
|
LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
|
||||||
USB_HostState = HOST_STATE_WaitForDeviceRemoval;
|
USB_HostState = HOST_STATE_WaitForDeviceRemoval;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Sample reload timer initialization */
|
/* Sample reload timer initialization */
|
||||||
TIMSK0 = (1 << OCIE0A);
|
TIMSK0 = (1 << OCIE0A);
|
||||||
OCR0A = ((F_CPU / 8 / 48000) - 1);
|
OCR0A = ((F_CPU / 8 / 48000) - 1);
|
||||||
TCCR0A = (1 << WGM01); // CTC mode
|
TCCR0A = (1 << WGM01); // CTC mode
|
||||||
TCCR0B = (1 << CS01); // Fcpu/8 speed
|
TCCR0B = (1 << CS01); // Fcpu/8 speed
|
||||||
|
|
||||||
puts_P(PSTR("Audio Device Enumerated.\r\n"));
|
puts_P(PSTR("Audio Device Enumerated.\r\n"));
|
||||||
LEDs_SetAllLEDs(LEDMASK_USB_READY);
|
LEDs_SetAllLEDs(LEDMASK_USB_READY);
|
||||||
USB_HostState = HOST_STATE_Configured;
|
USB_HostState = HOST_STATE_Configured;
|
||||||
break;
|
break;
|
||||||
case HOST_STATE_Configured:
|
case HOST_STATE_Configured:
|
||||||
/* Do nothing - audio stream is handled by the timer interrupt routine */
|
/* Do nothing - audio stream is handled by the timer interrupt routine */
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
Audio_Host_USBTask(&Speaker_Audio_Interface);
|
Audio_Host_USBTask(&Speaker_Audio_Interface);
|
||||||
USB_USBTask();
|
USB_USBTask();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/** ISR to handle the reloading of the PWM timer with the next sample. */
|
/** ISR to handle the reloading of the PWM timer with the next sample. */
|
||||||
ISR(TIMER0_COMPA_vect, ISR_BLOCK)
|
ISR(TIMER0_COMPA_vect, ISR_BLOCK)
|
||||||
{
|
{
|
||||||
uint8_t PrevPipe = Pipe_GetCurrentPipe();
|
uint8_t PrevPipe = Pipe_GetCurrentPipe();
|
||||||
|
|
||||||
/* Check that the USB bus is ready for the next sample to write */
|
/* Check that the USB bus is ready for the next sample to write */
|
||||||
if (Audio_Host_IsReadyForNextSample(&Speaker_Audio_Interface))
|
if (Audio_Host_IsReadyForNextSample(&Speaker_Audio_Interface))
|
||||||
{
|
{
|
||||||
int16_t AudioSample;
|
int16_t AudioSample;
|
||||||
|
|
||||||
#if defined(USE_TEST_TONE)
|
#if defined(USE_TEST_TONE)
|
||||||
static uint8_t SquareWaveSampleCount;
|
static uint8_t SquareWaveSampleCount;
|
||||||
static int16_t CurrentWaveValue;
|
static int16_t CurrentWaveValue;
|
||||||
|
|
||||||
/* In test tone mode, generate a square wave at 1/256 of the sample rate */
|
/* In test tone mode, generate a square wave at 1/256 of the sample rate */
|
||||||
if (SquareWaveSampleCount++ == 0xFF)
|
if (SquareWaveSampleCount++ == 0xFF)
|
||||||
CurrentWaveValue ^= 0x8000;
|
CurrentWaveValue ^= 0x8000;
|
||||||
|
|
||||||
/* Only generate audio if the board button is being pressed */
|
/* Only generate audio if the board button is being pressed */
|
||||||
AudioSample = (Buttons_GetStatus() & BUTTONS_BUTTON1) ? CurrentWaveValue : 0;
|
AudioSample = (Buttons_GetStatus() & BUTTONS_BUTTON1) ? CurrentWaveValue : 0;
|
||||||
#else
|
#else
|
||||||
/* Audio sample is ADC value scaled to fit the entire range */
|
/* Audio sample is ADC value scaled to fit the entire range */
|
||||||
AudioSample = ((SAMPLE_MAX_RANGE / ADC_MAX_RANGE) * ADC_GetResult());
|
AudioSample = ((SAMPLE_MAX_RANGE / ADC_MAX_RANGE) * ADC_GetResult());
|
||||||
|
|
||||||
#if defined(MICROPHONE_BIASED_TO_HALF_RAIL)
|
#if defined(MICROPHONE_BIASED_TO_HALF_RAIL)
|
||||||
/* Microphone is biased to half rail voltage, subtract the bias from the sample value */
|
/* Microphone is biased to half rail voltage, subtract the bias from the sample value */
|
||||||
AudioSample -= (SAMPLE_MAX_RANGE / 2);
|
AudioSample -= (SAMPLE_MAX_RANGE / 2);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
Audio_Host_WriteSample16(&Speaker_Audio_Interface, AudioSample);
|
Audio_Host_WriteSample16(&Speaker_Audio_Interface, AudioSample);
|
||||||
Audio_Host_WriteSample16(&Speaker_Audio_Interface, AudioSample);
|
Audio_Host_WriteSample16(&Speaker_Audio_Interface, AudioSample);
|
||||||
}
|
}
|
||||||
|
|
||||||
Pipe_SelectPipe(PrevPipe);
|
Pipe_SelectPipe(PrevPipe);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Configures the board hardware and chip peripherals for the demo's functionality. */
|
/** Configures the board hardware and chip peripherals for the demo's functionality. */
|
||||||
void SetupHardware(void)
|
void SetupHardware(void)
|
||||||
{
|
{
|
||||||
/* Disable watchdog if enabled by bootloader/fuses */
|
/* Disable watchdog if enabled by bootloader/fuses */
|
||||||
MCUSR &= ~(1 << WDRF);
|
MCUSR &= ~(1 << WDRF);
|
||||||
wdt_disable();
|
wdt_disable();
|
||||||
|
|
||||||
/* Disable clock division */
|
/* Disable clock division */
|
||||||
clock_prescale_set(clock_div_1);
|
clock_prescale_set(clock_div_1);
|
||||||
|
|
||||||
/* Hardware Initialization */
|
/* Hardware Initialization */
|
||||||
Serial_Init(9600, false);
|
Serial_Init(9600, false);
|
||||||
LEDs_Init();
|
LEDs_Init();
|
||||||
Buttons_Init();
|
Buttons_Init();
|
||||||
ADC_Init(ADC_FREE_RUNNING | ADC_PRESCALE_32);
|
ADC_Init(ADC_FREE_RUNNING | ADC_PRESCALE_32);
|
||||||
ADC_SetupChannel(MIC_IN_ADC_CHANNEL);
|
ADC_SetupChannel(MIC_IN_ADC_CHANNEL);
|
||||||
USB_Init();
|
USB_Init();
|
||||||
|
|
||||||
/* Create a stdio stream for the serial port for stdin and stdout */
|
/* Create a stdio stream for the serial port for stdin and stdout */
|
||||||
Serial_CreateStream(NULL);
|
Serial_CreateStream(NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Event handler for the USB_DeviceAttached event. This indicates that a device has been attached to the host, and
|
/** Event handler for the USB_DeviceAttached event. This indicates that a device has been attached to the host, and
|
||||||
* starts the library USB task to begin the enumeration and USB management process.
|
* starts the library USB task to begin the enumeration and USB management process.
|
||||||
*/
|
*/
|
||||||
void EVENT_USB_Host_DeviceAttached(void)
|
void EVENT_USB_Host_DeviceAttached(void)
|
||||||
{
|
{
|
||||||
puts_P(PSTR("Device Attached.\r\n"));
|
puts_P(PSTR("Device Attached.\r\n"));
|
||||||
LEDs_SetAllLEDs(LEDMASK_USB_ENUMERATING);
|
LEDs_SetAllLEDs(LEDMASK_USB_ENUMERATING);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Event handler for the USB_DeviceUnattached event. This indicates that a device has been removed from the host, and
|
/** Event handler for the USB_DeviceUnattached event. This indicates that a device has been removed from the host, and
|
||||||
* stops the library USB task management process.
|
* stops the library USB task management process.
|
||||||
*/
|
*/
|
||||||
void EVENT_USB_Host_DeviceUnattached(void)
|
void EVENT_USB_Host_DeviceUnattached(void)
|
||||||
{
|
{
|
||||||
puts_P(PSTR("\r\nDevice Unattached.\r\n"));
|
puts_P(PSTR("\r\nDevice Unattached.\r\n"));
|
||||||
LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY);
|
LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Event handler for the USB_DeviceEnumerationComplete event. This indicates that a device has been successfully
|
/** Event handler for the USB_DeviceEnumerationComplete event. This indicates that a device has been successfully
|
||||||
* enumerated by the host and is now ready to be used by the application.
|
* enumerated by the host and is now ready to be used by the application.
|
||||||
*/
|
*/
|
||||||
void EVENT_USB_Host_DeviceEnumerationComplete(void)
|
void EVENT_USB_Host_DeviceEnumerationComplete(void)
|
||||||
{
|
{
|
||||||
LEDs_SetAllLEDs(LEDMASK_USB_READY);
|
LEDs_SetAllLEDs(LEDMASK_USB_READY);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Event handler for the USB_HostError event. This indicates that a hardware error occurred while in host mode. */
|
/** Event handler for the USB_HostError event. This indicates that a hardware error occurred while in host mode. */
|
||||||
void EVENT_USB_Host_HostError(const uint8_t ErrorCode)
|
void EVENT_USB_Host_HostError(const uint8_t ErrorCode)
|
||||||
{
|
{
|
||||||
USB_Disable();
|
USB_Disable();
|
||||||
|
|
||||||
printf_P(PSTR(ESC_FG_RED "Host Mode Error\r\n"
|
printf_P(PSTR(ESC_FG_RED "Host Mode Error\r\n"
|
||||||
" -- Error Code %d\r\n" ESC_FG_WHITE), ErrorCode);
|
" -- Error Code %d\r\n" ESC_FG_WHITE), ErrorCode);
|
||||||
|
|
||||||
LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
|
LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
|
||||||
for(;;);
|
for(;;);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Event handler for the USB_DeviceEnumerationFailed event. This indicates that a problem occurred while
|
/** Event handler for the USB_DeviceEnumerationFailed event. This indicates that a problem occurred while
|
||||||
* enumerating an attached USB device.
|
* enumerating an attached USB device.
|
||||||
*/
|
*/
|
||||||
void EVENT_USB_Host_DeviceEnumerationFailed(const uint8_t ErrorCode,
|
void EVENT_USB_Host_DeviceEnumerationFailed(const uint8_t ErrorCode,
|
||||||
const uint8_t SubErrorCode)
|
const uint8_t SubErrorCode)
|
||||||
{
|
{
|
||||||
printf_P(PSTR(ESC_FG_RED "Dev Enum Error\r\n"
|
printf_P(PSTR(ESC_FG_RED "Dev Enum Error\r\n"
|
||||||
" -- Error Code %d\r\n"
|
" -- Error Code %d\r\n"
|
||||||
" -- Sub Error Code %d\r\n"
|
" -- Sub Error Code %d\r\n"
|
||||||
" -- In State %d\r\n" ESC_FG_WHITE), ErrorCode, SubErrorCode, USB_HostState);
|
" -- In State %d\r\n" ESC_FG_WHITE), ErrorCode, SubErrorCode, USB_HostState);
|
||||||
|
|
||||||
LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
|
LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,91 +1,91 @@
|
|||||||
/*
|
/*
|
||||||
LUFA Library
|
LUFA Library
|
||||||
Copyright (C) Dean Camera, 2011.
|
Copyright (C) Dean Camera, 2011.
|
||||||
|
|
||||||
dean [at] fourwalledcubicle [dot] com
|
dean [at] fourwalledcubicle [dot] com
|
||||||
www.lufa-lib.org
|
www.lufa-lib.org
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com)
|
Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com)
|
||||||
|
|
||||||
Permission to use, copy, modify, distribute, and sell this
|
Permission to use, copy, modify, distribute, and sell this
|
||||||
software and its documentation for any purpose is hereby granted
|
software and its documentation for any purpose is hereby granted
|
||||||
without fee, provided that the above copyright notice appear in
|
without fee, provided that the above copyright notice appear in
|
||||||
all copies and that both that the copyright notice and this
|
all copies and that both that the copyright notice and this
|
||||||
permission notice and warranty disclaimer appear in supporting
|
permission notice and warranty disclaimer appear in supporting
|
||||||
documentation, and that the name of the author not be used in
|
documentation, and that the name of the author not be used in
|
||||||
advertising or publicity pertaining to distribution of the
|
advertising or publicity pertaining to distribution of the
|
||||||
software without specific, written prior permission.
|
software without specific, written prior permission.
|
||||||
|
|
||||||
The author disclaim all warranties with regard to this
|
The author disclaim all warranties with regard to this
|
||||||
software, including all implied warranties of merchantability
|
software, including all implied warranties of merchantability
|
||||||
and fitness. In no event shall the author be liable for any
|
and fitness. In no event shall the author be liable for any
|
||||||
special, indirect or consequential damages or any damages
|
special, indirect or consequential damages or any damages
|
||||||
whatsoever resulting from loss of use, data or profits, whether
|
whatsoever resulting from loss of use, data or profits, whether
|
||||||
in an action of contract, negligence or other tortious action,
|
in an action of contract, negligence or other tortious action,
|
||||||
arising out of or in connection with the use or performance of
|
arising out of or in connection with the use or performance of
|
||||||
this software.
|
this software.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/** \file
|
/** \file
|
||||||
*
|
*
|
||||||
* Header file for AudioOutputHost.c.
|
* Header file for AudioOutputHost.c.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _AUDIO_OUTPUT_HOST_H_
|
#ifndef _AUDIO_OUTPUT_HOST_H_
|
||||||
#define _AUDIO_OUTPUT_HOST_H_
|
#define _AUDIO_OUTPUT_HOST_H_
|
||||||
|
|
||||||
/* Includes: */
|
/* Includes: */
|
||||||
#include <avr/io.h>
|
#include <avr/io.h>
|
||||||
#include <avr/wdt.h>
|
#include <avr/wdt.h>
|
||||||
#include <avr/pgmspace.h>
|
#include <avr/pgmspace.h>
|
||||||
#include <avr/power.h>
|
#include <avr/power.h>
|
||||||
#include <avr/interrupt.h>
|
#include <avr/interrupt.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
#include <LUFA/Version.h>
|
#include <LUFA/Version.h>
|
||||||
#include <LUFA/Drivers/Misc/TerminalCodes.h>
|
#include <LUFA/Drivers/Misc/TerminalCodes.h>
|
||||||
#include <LUFA/Drivers/Peripheral/Serial.h>
|
#include <LUFA/Drivers/Peripheral/Serial.h>
|
||||||
#include <LUFA/Drivers/Peripheral/ADC.h>
|
#include <LUFA/Drivers/Peripheral/ADC.h>
|
||||||
#include <LUFA/Drivers/Board/LEDs.h>
|
#include <LUFA/Drivers/Board/LEDs.h>
|
||||||
#include <LUFA/Drivers/Board/Buttons.h>
|
#include <LUFA/Drivers/Board/Buttons.h>
|
||||||
#include <LUFA/Drivers/USB/USB.h>
|
#include <LUFA/Drivers/USB/USB.h>
|
||||||
|
|
||||||
/* Macros: */
|
/* Macros: */
|
||||||
/** ADC channel number for the microphone input. */
|
/** ADC channel number for the microphone input. */
|
||||||
#define MIC_IN_ADC_CHANNEL 2
|
#define MIC_IN_ADC_CHANNEL 2
|
||||||
|
|
||||||
/** ADC channel MUX mask for the microphone input. */
|
/** ADC channel MUX mask for the microphone input. */
|
||||||
#define MIC_IN_ADC_MUX_MASK ADC_CHANNEL2
|
#define MIC_IN_ADC_MUX_MASK ADC_CHANNEL2
|
||||||
|
|
||||||
/** Maximum audio sample value for the microphone input. */
|
/** Maximum audio sample value for the microphone input. */
|
||||||
#define SAMPLE_MAX_RANGE 0xFFFF
|
#define SAMPLE_MAX_RANGE 0xFFFF
|
||||||
|
|
||||||
/** Maximum ADC range for the microphone input. */
|
/** Maximum ADC range for the microphone input. */
|
||||||
#define ADC_MAX_RANGE 0x3FF
|
#define ADC_MAX_RANGE 0x3FF
|
||||||
|
|
||||||
/** LED mask for the library LED driver, to indicate that the USB interface is not ready. */
|
/** LED mask for the library LED driver, to indicate that the USB interface is not ready. */
|
||||||
#define LEDMASK_USB_NOTREADY LEDS_LED1
|
#define LEDMASK_USB_NOTREADY LEDS_LED1
|
||||||
|
|
||||||
/** LED mask for the library LED driver, to indicate that the USB interface is enumerating. */
|
/** LED mask for the library LED driver, to indicate that the USB interface is enumerating. */
|
||||||
#define LEDMASK_USB_ENUMERATING (LEDS_LED2 | LEDS_LED3)
|
#define LEDMASK_USB_ENUMERATING (LEDS_LED2 | LEDS_LED3)
|
||||||
|
|
||||||
/** LED mask for the library LED driver, to indicate that the USB interface is ready. */
|
/** LED mask for the library LED driver, to indicate that the USB interface is ready. */
|
||||||
#define LEDMASK_USB_READY (LEDS_LED2 | LEDS_LED4)
|
#define LEDMASK_USB_READY (LEDS_LED2 | LEDS_LED4)
|
||||||
|
|
||||||
/** LED mask for the library LED driver, to indicate that an error has occurred in the USB interface. */
|
/** LED mask for the library LED driver, to indicate that an error has occurred in the USB interface. */
|
||||||
#define LEDMASK_USB_ERROR (LEDS_LED1 | LEDS_LED3)
|
#define LEDMASK_USB_ERROR (LEDS_LED1 | LEDS_LED3)
|
||||||
|
|
||||||
/* Function Prototypes: */
|
/* Function Prototypes: */
|
||||||
void SetupHardware(void);
|
void SetupHardware(void);
|
||||||
|
|
||||||
void EVENT_USB_Host_HostError(const uint8_t ErrorCode);
|
void EVENT_USB_Host_HostError(const uint8_t ErrorCode);
|
||||||
void EVENT_USB_Host_DeviceAttached(void);
|
void EVENT_USB_Host_DeviceAttached(void);
|
||||||
void EVENT_USB_Host_DeviceUnattached(void);
|
void EVENT_USB_Host_DeviceUnattached(void);
|
||||||
void EVENT_USB_Host_DeviceEnumerationFailed(const uint8_t ErrorCode,
|
void EVENT_USB_Host_DeviceEnumerationFailed(const uint8_t ErrorCode,
|
||||||
const uint8_t SubErrorCode);
|
const uint8_t SubErrorCode);
|
||||||
void EVENT_USB_Host_DeviceEnumerationComplete(void);
|
void EVENT_USB_Host_DeviceEnumerationComplete(void);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -1,78 +1,78 @@
|
|||||||
/** \file
|
/** \file
|
||||||
*
|
*
|
||||||
* This file contains special DoxyGen information for the generation of the main page and other special
|
* This file contains special DoxyGen information for the generation of the main page and other special
|
||||||
* documentation pages. It is not a project source file.
|
* documentation pages. It is not a project source file.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/** \mainpage Audio Output Host Demo
|
/** \mainpage Audio Output Host Demo
|
||||||
*
|
*
|
||||||
* \section Sec_Compat Demo Compatibility:
|
* \section Sec_Compat Demo Compatibility:
|
||||||
*
|
*
|
||||||
* The following list indicates what microcontrollers are compatible with this demo.
|
* The following list indicates what microcontrollers are compatible with this demo.
|
||||||
*
|
*
|
||||||
* - Series 7 USB AVRs (AT90USBxxx7)
|
* - Series 7 USB AVRs (AT90USBxxx7)
|
||||||
*
|
*
|
||||||
* \section Sec_Info USB Information:
|
* \section Sec_Info USB Information:
|
||||||
*
|
*
|
||||||
* The following table gives a rundown of the USB utilization of this demo.
|
* The following table gives a rundown of the USB utilization of this demo.
|
||||||
*
|
*
|
||||||
* <table>
|
* <table>
|
||||||
* <tr>
|
* <tr>
|
||||||
* <td><b>USB Mode:</b></td>
|
* <td><b>USB Mode:</b></td>
|
||||||
* <td>Host</td>
|
* <td>Host</td>
|
||||||
* </tr>
|
* </tr>
|
||||||
* <tr>
|
* <tr>
|
||||||
* <td><b>USB Class:</b></td>
|
* <td><b>USB Class:</b></td>
|
||||||
* <td>Audio Class</td>
|
* <td>Audio Class</td>
|
||||||
* </tr>
|
* </tr>
|
||||||
* <tr>
|
* <tr>
|
||||||
* <td><b>USB Subclass:</b></td>
|
* <td><b>USB Subclass:</b></td>
|
||||||
* <td>Standard Audio Device</td>
|
* <td>Standard Audio Device</td>
|
||||||
* </tr>
|
* </tr>
|
||||||
* <tr>
|
* <tr>
|
||||||
* <td><b>Relevant Standards:</b></td>
|
* <td><b>Relevant Standards:</b></td>
|
||||||
* <td>USBIF Audio 1.0 Class Specification \n
|
* <td>USBIF Audio 1.0 Class Specification \n
|
||||||
* USBIF Audio 1.0 Class Terminal Types Specification \n
|
* USBIF Audio 1.0 Class Terminal Types Specification \n
|
||||||
* USBIF Audio 1.0 Data Formats Specification</td>
|
* USBIF Audio 1.0 Data Formats Specification</td>
|
||||||
* </tr>
|
* </tr>
|
||||||
* <tr>
|
* <tr>
|
||||||
* <td><b>Usable Speeds:</b></td>
|
* <td><b>Usable Speeds:</b></td>
|
||||||
* <td>Full Speed Mode</td>
|
* <td>Full Speed Mode</td>
|
||||||
* </tr>
|
* </tr>
|
||||||
* </table>
|
* </table>
|
||||||
*
|
*
|
||||||
* \section Sec_Description Project Description:
|
* \section Sec_Description Project Description:
|
||||||
*
|
*
|
||||||
* Audio Output host demonstration application. This gives a simple reference
|
* Audio Output host demonstration application. This gives a simple reference
|
||||||
* application for implementing a USB Audio host, for USB Audio devices using
|
* application for implementing a USB Audio host, for USB Audio devices using
|
||||||
* the USB Audio 1.0 class profile.
|
* the USB Audio 1.0 class profile.
|
||||||
*
|
*
|
||||||
* By default, the demo will produce a square wave test tone when the board
|
* By default, the demo will produce a square wave test tone when the board
|
||||||
* button is pressed. If USE_TEST_TONE is not defined in the project makefile,
|
* button is pressed. If USE_TEST_TONE is not defined in the project makefile,
|
||||||
* incoming audio from the ADC channel 1 will be sampled and sent to the attached
|
* incoming audio from the ADC channel 1 will be sampled and sent to the attached
|
||||||
* USB audio device instead.
|
* USB audio device instead.
|
||||||
*
|
*
|
||||||
* \section Sec_Options Project Options
|
* \section Sec_Options Project Options
|
||||||
*
|
*
|
||||||
* The following defines can be found in this demo, which can control the demo behaviour when defined, or changed in value.
|
* The following defines can be found in this demo, which can control the demo behaviour when defined, or changed in value.
|
||||||
*
|
*
|
||||||
* <table>
|
* <table>
|
||||||
* <tr>
|
* <tr>
|
||||||
* <td><b>Define Name:</b></td>
|
* <td><b>Define Name:</b></td>
|
||||||
* <td><b>Location:</b></td>
|
* <td><b>Location:</b></td>
|
||||||
* <td><b>Description:</b></td>
|
* <td><b>Description:</b></td>
|
||||||
* </tr>
|
* </tr>
|
||||||
* <tr>
|
* <tr>
|
||||||
* <td>USE_TEST_TONE</td>
|
* <td>USE_TEST_TONE</td>
|
||||||
* <td>Makefile LUFA_OPTS</td>
|
* <td>Makefile LUFA_OPTS</td>
|
||||||
* <td>When defined, this alters the demo to produce a square wave test tone when the first board button is pressed
|
* <td>When defined, this alters the demo to produce a square wave test tone when the first board button is pressed
|
||||||
* instead of sampling the board microphone.</td>
|
* instead of sampling the board microphone.</td>
|
||||||
* </tr>
|
* </tr>
|
||||||
* <tr>
|
* <tr>
|
||||||
* <td>MICROPHONE_BIASED_TO_HALF_RAIL</td>
|
* <td>MICROPHONE_BIASED_TO_HALF_RAIL</td>
|
||||||
* <td>Makefile LUFA_OPTS</td>
|
* <td>Makefile LUFA_OPTS</td>
|
||||||
* <td>When defined, this alters the demo so that the half VCC bias of the microphone input is subtracted.</td>
|
* <td>When defined, this alters the demo so that the half VCC bias of the microphone input is subtracted.</td>
|
||||||
* </tr>
|
* </tr>
|
||||||
* </table>
|
* </table>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -1,717 +1,717 @@
|
|||||||
# Hey Emacs, this is a -*- makefile -*-
|
# Hey Emacs, this is a -*- makefile -*-
|
||||||
#----------------------------------------------------------------------------
|
#----------------------------------------------------------------------------
|
||||||
# WinAVR Makefile Template written by Eric B. Weddington, Jörg Wunsch, et al.
|
# WinAVR Makefile Template written by Eric B. Weddington, Jörg Wunsch, et al.
|
||||||
# >> Modified for use with the LUFA project. <<
|
# >> Modified for use with the LUFA project. <<
|
||||||
#
|
#
|
||||||
# Released to the Public Domain
|
# Released to the Public Domain
|
||||||
#
|
#
|
||||||
# Additional material for this makefile was written by:
|
# Additional material for this makefile was written by:
|
||||||
# Peter Fleury
|
# Peter Fleury
|
||||||
# Tim Henigan
|
# Tim Henigan
|
||||||
# Colin O'Flynn
|
# Colin O'Flynn
|
||||||
# Reiner Patommel
|
# Reiner Patommel
|
||||||
# Markus Pfaff
|
# Markus Pfaff
|
||||||
# Sander Pool
|
# Sander Pool
|
||||||
# Frederik Rouleau
|
# Frederik Rouleau
|
||||||
# Carlos Lamas
|
# Carlos Lamas
|
||||||
# Dean Camera
|
# Dean Camera
|
||||||
# Opendous Inc.
|
# Opendous Inc.
|
||||||
# Denver Gingerich
|
# Denver Gingerich
|
||||||
#
|
#
|
||||||
#----------------------------------------------------------------------------
|
#----------------------------------------------------------------------------
|
||||||
# On command line:
|
# On command line:
|
||||||
#
|
#
|
||||||
# make all = Make software.
|
# make all = Make software.
|
||||||
#
|
#
|
||||||
# make clean = Clean out built project files.
|
# make clean = Clean out built project files.
|
||||||
#
|
#
|
||||||
# make coff = Convert ELF to AVR COFF.
|
# make coff = Convert ELF to AVR COFF.
|
||||||
#
|
#
|
||||||
# make extcoff = Convert ELF to AVR Extended COFF.
|
# make extcoff = Convert ELF to AVR Extended COFF.
|
||||||
#
|
#
|
||||||
# make program = Download the hex file to the device, using avrdude.
|
# make program = Download the hex file to the device, using avrdude.
|
||||||
# Please customize the avrdude settings below first!
|
# Please customize the avrdude settings below first!
|
||||||
#
|
#
|
||||||
# make dfu = Download the hex file to the device, using dfu-programmer (must
|
# make dfu = Download the hex file to the device, using dfu-programmer (must
|
||||||
# have dfu-programmer installed).
|
# have dfu-programmer installed).
|
||||||
#
|
#
|
||||||
# make flip = Download the hex file to the device, using Atmel FLIP (must
|
# make flip = Download the hex file to the device, using Atmel FLIP (must
|
||||||
# have Atmel FLIP installed).
|
# have Atmel FLIP installed).
|
||||||
#
|
#
|
||||||
# make dfu-ee = Download the eeprom file to the device, using dfu-programmer
|
# make dfu-ee = Download the eeprom file to the device, using dfu-programmer
|
||||||
# (must have dfu-programmer installed).
|
# (must have dfu-programmer installed).
|
||||||
#
|
#
|
||||||
# make flip-ee = Download the eeprom file to the device, using Atmel FLIP
|
# make flip-ee = Download the eeprom file to the device, using Atmel FLIP
|
||||||
# (must have Atmel FLIP installed).
|
# (must have Atmel FLIP installed).
|
||||||
#
|
#
|
||||||
# make doxygen = Generate DoxyGen documentation for the project (must have
|
# make doxygen = Generate DoxyGen documentation for the project (must have
|
||||||
# DoxyGen installed)
|
# DoxyGen installed)
|
||||||
#
|
#
|
||||||
# make debug = Start either simulavr or avarice as specified for debugging,
|
# make debug = Start either simulavr or avarice as specified for debugging,
|
||||||
# with avr-gdb or avr-insight as the front end 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.s = Just compile filename.c into the assembler code only.
|
||||||
#
|
#
|
||||||
# make filename.i = Create a preprocessed source file for use in submitting
|
# make filename.i = Create a preprocessed source file for use in submitting
|
||||||
# bug reports to the GCC project.
|
# bug reports to the GCC project.
|
||||||
#
|
#
|
||||||
# To rebuild project do "make clean" then "make all".
|
# To rebuild project do "make clean" then "make all".
|
||||||
#----------------------------------------------------------------------------
|
#----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
# MCU name
|
# MCU name
|
||||||
MCU = at90usb1287
|
MCU = at90usb1287
|
||||||
|
|
||||||
|
|
||||||
# Target architecture (see library "Board Types" documentation).
|
# Target architecture (see library "Board Types" documentation).
|
||||||
ARCH = AVR8
|
ARCH = AVR8
|
||||||
|
|
||||||
|
|
||||||
# Target board (see library "Board Types" documentation, NONE for projects not requiring
|
# 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
|
# LUFA board drivers). If USER is selected, put custom board drivers in a directory called
|
||||||
# "Board" inside the application directory.
|
# "Board" inside the application directory.
|
||||||
BOARD = USBKEY
|
BOARD = USBKEY
|
||||||
|
|
||||||
|
|
||||||
# Processor frequency.
|
# Processor frequency.
|
||||||
# This will define a symbol, F_CPU, in all source code files equal to the
|
# 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
|
# 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
|
# 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.
|
# 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
|
# 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
|
# 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
|
# 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
|
# reflect the processor speed set externally so that the code can use accurate
|
||||||
# software delays.
|
# software delays.
|
||||||
F_CPU = 8000000
|
F_CPU = 8000000
|
||||||
|
|
||||||
|
|
||||||
# Input clock frequency.
|
# Input clock frequency.
|
||||||
# This will define a symbol, F_USB, in all source code files equal to the
|
# 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
|
# 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
|
# 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
|
# 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'
|
# 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
|
# at the end, this will be done automatically to create a 32-bit value in your
|
||||||
# source code.
|
# source code.
|
||||||
#
|
#
|
||||||
# If no clock division is performed on the input clock inside the AVR (via the
|
# 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.
|
# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
|
||||||
F_USB = $(F_CPU)
|
F_USB = $(F_CPU)
|
||||||
|
|
||||||
|
|
||||||
# Output format. (can be srec, ihex, binary)
|
# Output format. (can be srec, ihex, binary)
|
||||||
FORMAT = ihex
|
FORMAT = ihex
|
||||||
|
|
||||||
|
|
||||||
# Target file name (without extension).
|
# Target file name (without extension).
|
||||||
TARGET = AudioOutputHost
|
TARGET = AudioOutputHost
|
||||||
|
|
||||||
|
|
||||||
# Object files directory
|
# Object files directory
|
||||||
# To put object files in current directory, use a dot (.), do NOT make
|
# To put object files in current directory, use a dot (.), do NOT make
|
||||||
# this an empty or blank macro!
|
# this an empty or blank macro!
|
||||||
OBJDIR = .
|
OBJDIR = .
|
||||||
|
|
||||||
|
|
||||||
# Path to the LUFA library
|
# Path to the LUFA library
|
||||||
LUFA_PATH = ../../../..
|
LUFA_PATH = ../../../..
|
||||||
|
|
||||||
|
|
||||||
# LUFA library compile-time options and predefined tokens
|
# LUFA library compile-time options and predefined tokens
|
||||||
LUFA_OPTS = -D USB_HOST_ONLY
|
LUFA_OPTS = -D USB_HOST_ONLY
|
||||||
LUFA_OPTS += -D USE_STATIC_OPTIONS="(USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"
|
LUFA_OPTS += -D USE_STATIC_OPTIONS="(USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"
|
||||||
|
|
||||||
LUFA_OPTS += -D MICROPHONE_BIASED_TO_HALF_RAIL
|
LUFA_OPTS += -D MICROPHONE_BIASED_TO_HALF_RAIL
|
||||||
LUFA_OPTS += -D USE_TEST_TONE
|
LUFA_OPTS += -D USE_TEST_TONE
|
||||||
|
|
||||||
|
|
||||||
# Create the LUFA source path variables by including the LUFA root makefile
|
# Create the LUFA source path variables by including the LUFA root makefile
|
||||||
include $(LUFA_PATH)/LUFA/makefile
|
include $(LUFA_PATH)/LUFA/makefile
|
||||||
|
|
||||||
|
|
||||||
# List C source files here. (C dependencies are automatically generated.)
|
# List C source files here. (C dependencies are automatically generated.)
|
||||||
SRC = $(TARGET).c \
|
SRC = $(TARGET).c \
|
||||||
$(LUFA_SRC_USB) \
|
$(LUFA_SRC_USB) \
|
||||||
$(LUFA_SRC_USBCLASS) \
|
$(LUFA_SRC_USBCLASS) \
|
||||||
$(LUFA_SRC_SERIAL)
|
$(LUFA_SRC_SERIAL)
|
||||||
|
|
||||||
|
|
||||||
# List C++ source files here. (C dependencies are automatically generated.)
|
# List C++ source files here. (C dependencies are automatically generated.)
|
||||||
CPPSRC =
|
CPPSRC =
|
||||||
|
|
||||||
|
|
||||||
# List Assembler source files here.
|
# List Assembler source files here.
|
||||||
# Make them always end in a capital .S. Files ending in a lowercase .s
|
# Make them always end in a capital .S. Files ending in a lowercase .s
|
||||||
# will not be considered source files but generated files (assembler
|
# will not be considered source files but generated files (assembler
|
||||||
# output from the compiler), and will be deleted upon "make clean"!
|
# output from the compiler), and will be deleted upon "make clean"!
|
||||||
# Even though the DOS/Win* filesystem matches both .s and .S the same,
|
# 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
|
# it will preserve the spelling of the filenames, and gcc itself does
|
||||||
# care about how the name is spelled on its command-line.
|
# care about how the name is spelled on its command-line.
|
||||||
ASRC =
|
ASRC =
|
||||||
|
|
||||||
|
|
||||||
# Optimization level, can be [0, 1, 2, 3, s].
|
# Optimization level, can be [0, 1, 2, 3, s].
|
||||||
# 0 = turn off optimization. s = optimize for size.
|
# 0 = turn off optimization. s = optimize for size.
|
||||||
# (Note: 3 is not always the best optimization level. See avr-libc FAQ.)
|
# (Note: 3 is not always the best optimization level. See avr-libc FAQ.)
|
||||||
OPT = s
|
OPT = s
|
||||||
|
|
||||||
|
|
||||||
# Debugging format.
|
# Debugging format.
|
||||||
# Native formats for AVR-GCC's -g are dwarf-2 [default] or stabs.
|
# Native formats for AVR-GCC's -g are dwarf-2 [default] or stabs.
|
||||||
# AVR Studio 4.10 requires dwarf-2.
|
# AVR Studio 4.10 requires dwarf-2.
|
||||||
# AVR [Extended] COFF format requires stabs, plus an avr-objcopy run.
|
# AVR [Extended] COFF format requires stabs, plus an avr-objcopy run.
|
||||||
DEBUG = dwarf-2
|
DEBUG = dwarf-2
|
||||||
|
|
||||||
|
|
||||||
# List any extra directories to look for include files here.
|
# List any extra directories to look for include files here.
|
||||||
# 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)/
|
||||||
|
|
||||||
|
|
||||||
# Compiler flag to set the C Standard level.
|
# Compiler flag to set the C Standard level.
|
||||||
# c89 = "ANSI" C
|
# c89 = "ANSI" C
|
||||||
# gnu89 = c89 plus GCC extensions
|
# gnu89 = c89 plus GCC extensions
|
||||||
# c99 = ISO C99 standard (not yet fully implemented)
|
# c99 = ISO C99 standard (not yet fully implemented)
|
||||||
# gnu99 = c99 plus GCC extensions
|
# gnu99 = c99 plus GCC extensions
|
||||||
CSTANDARD = -std=c99
|
CSTANDARD = -std=c99
|
||||||
|
|
||||||
|
|
||||||
# Place -D or -U options here for C sources
|
# Place -D or -U options here for C sources
|
||||||
CDEFS = -DF_CPU=$(F_CPU)UL
|
CDEFS = -DF_CPU=$(F_CPU)UL
|
||||||
CDEFS += -DF_USB=$(F_USB)UL
|
CDEFS += -DF_USB=$(F_USB)UL
|
||||||
CDEFS += -DBOARD=BOARD_$(BOARD) -DARCH=ARCH_$(ARCH)
|
CDEFS += -DBOARD=BOARD_$(BOARD) -DARCH=ARCH_$(ARCH)
|
||||||
CDEFS += $(LUFA_OPTS)
|
CDEFS += $(LUFA_OPTS)
|
||||||
|
|
||||||
|
|
||||||
# Place -D or -U options here for ASM sources
|
# Place -D or -U options here for ASM sources
|
||||||
ADEFS = -DF_CPU=$(F_CPU)
|
ADEFS = -DF_CPU=$(F_CPU)
|
||||||
ADEFS += -DF_USB=$(F_USB)UL
|
ADEFS += -DF_USB=$(F_USB)UL
|
||||||
ADEFS += -DBOARD=BOARD_$(BOARD)
|
ADEFS += -DBOARD=BOARD_$(BOARD)
|
||||||
ADEFS += $(LUFA_OPTS)
|
ADEFS += $(LUFA_OPTS)
|
||||||
|
|
||||||
# Place -D or -U options here for C++ sources
|
# Place -D or -U options here for C++ sources
|
||||||
CPPDEFS = -DF_CPU=$(F_CPU)UL
|
CPPDEFS = -DF_CPU=$(F_CPU)UL
|
||||||
CPPDEFS += -DF_USB=$(F_USB)UL
|
CPPDEFS += -DF_USB=$(F_USB)UL
|
||||||
CPPDEFS += -DBOARD=BOARD_$(BOARD)
|
CPPDEFS += -DBOARD=BOARD_$(BOARD)
|
||||||
CPPDEFS += $(LUFA_OPTS)
|
CPPDEFS += $(LUFA_OPTS)
|
||||||
#CPPDEFS += -D__STDC_LIMIT_MACROS
|
#CPPDEFS += -D__STDC_LIMIT_MACROS
|
||||||
#CPPDEFS += -D__STDC_CONSTANT_MACROS
|
#CPPDEFS += -D__STDC_CONSTANT_MACROS
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#---------------- Compiler Options C ----------------
|
#---------------- Compiler Options C ----------------
|
||||||
# -g*: generate debugging information
|
# -g*: generate debugging information
|
||||||
# -O*: optimization level
|
# -O*: optimization level
|
||||||
# -f...: tuning, see GCC manual and avr-libc documentation
|
# -f...: tuning, see GCC manual and avr-libc documentation
|
||||||
# -Wall...: warning level
|
# -Wall...: warning level
|
||||||
# -Wa,...: tell GCC to pass this to the assembler.
|
# -Wa,...: tell GCC to pass this to the assembler.
|
||||||
# -adhlns...: create assembler listing
|
# -adhlns...: create assembler listing
|
||||||
CFLAGS = -g$(DEBUG)
|
CFLAGS = -g$(DEBUG)
|
||||||
CFLAGS += $(CDEFS)
|
CFLAGS += $(CDEFS)
|
||||||
CFLAGS += -O$(OPT)
|
CFLAGS += -O$(OPT)
|
||||||
CFLAGS += -funsigned-char
|
CFLAGS += -funsigned-char
|
||||||
CFLAGS += -funsigned-bitfields
|
CFLAGS += -funsigned-bitfields
|
||||||
CFLAGS += -ffunction-sections
|
CFLAGS += -ffunction-sections
|
||||||
CFLAGS += -fno-inline-small-functions
|
CFLAGS += -fno-inline-small-functions
|
||||||
CFLAGS += -fpack-struct
|
CFLAGS += -fpack-struct
|
||||||
CFLAGS += -fshort-enums
|
CFLAGS += -fshort-enums
|
||||||
CFLAGS += -fno-strict-aliasing
|
CFLAGS += -fno-strict-aliasing
|
||||||
CFLAGS += -Wall
|
CFLAGS += -Wall
|
||||||
CFLAGS += -Wstrict-prototypes
|
CFLAGS += -Wstrict-prototypes
|
||||||
#CFLAGS += -mshort-calls
|
#CFLAGS += -mshort-calls
|
||||||
#CFLAGS += -fno-unit-at-a-time
|
#CFLAGS += -fno-unit-at-a-time
|
||||||
#CFLAGS += -Wundef
|
#CFLAGS += -Wundef
|
||||||
#CFLAGS += -Wunreachable-code
|
#CFLAGS += -Wunreachable-code
|
||||||
#CFLAGS += -Wsign-compare
|
#CFLAGS += -Wsign-compare
|
||||||
CFLAGS += -Wa,-adhlns=$(<:%.c=$(OBJDIR)/%.lst)
|
CFLAGS += -Wa,-adhlns=$(<:%.c=$(OBJDIR)/%.lst)
|
||||||
CFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS))
|
CFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS))
|
||||||
CFLAGS += $(CSTANDARD)
|
CFLAGS += $(CSTANDARD)
|
||||||
|
|
||||||
|
|
||||||
#---------------- Compiler Options C++ ----------------
|
#---------------- Compiler Options C++ ----------------
|
||||||
# -g*: generate debugging information
|
# -g*: generate debugging information
|
||||||
# -O*: optimization level
|
# -O*: optimization level
|
||||||
# -f...: tuning, see GCC manual and avr-libc documentation
|
# -f...: tuning, see GCC manual and avr-libc documentation
|
||||||
# -Wall...: warning level
|
# -Wall...: warning level
|
||||||
# -Wa,...: tell GCC to pass this to the assembler.
|
# -Wa,...: tell GCC to pass this to the assembler.
|
||||||
# -adhlns...: create assembler listing
|
# -adhlns...: create assembler listing
|
||||||
CPPFLAGS = -g$(DEBUG)
|
CPPFLAGS = -g$(DEBUG)
|
||||||
CPPFLAGS += $(CPPDEFS)
|
CPPFLAGS += $(CPPDEFS)
|
||||||
CPPFLAGS += -O$(OPT)
|
CPPFLAGS += -O$(OPT)
|
||||||
CPPFLAGS += -funsigned-char
|
CPPFLAGS += -funsigned-char
|
||||||
CPPFLAGS += -funsigned-bitfields
|
CPPFLAGS += -funsigned-bitfields
|
||||||
CPPFLAGS += -fpack-struct
|
CPPFLAGS += -fpack-struct
|
||||||
CPPFLAGS += -fshort-enums
|
CPPFLAGS += -fshort-enums
|
||||||
CPPFLAGS += -fno-exceptions
|
CPPFLAGS += -fno-exceptions
|
||||||
CPPFLAGS += -Wall
|
CPPFLAGS += -Wall
|
||||||
CPPFLAGS += -Wundef
|
CPPFLAGS += -Wundef
|
||||||
#CPPFLAGS += -mshort-calls
|
#CPPFLAGS += -mshort-calls
|
||||||
#CPPFLAGS += -fno-unit-at-a-time
|
#CPPFLAGS += -fno-unit-at-a-time
|
||||||
#CPPFLAGS += -Wstrict-prototypes
|
#CPPFLAGS += -Wstrict-prototypes
|
||||||
#CPPFLAGS += -Wunreachable-code
|
#CPPFLAGS += -Wunreachable-code
|
||||||
#CPPFLAGS += -Wsign-compare
|
#CPPFLAGS += -Wsign-compare
|
||||||
CPPFLAGS += -Wa,-adhlns=$(<:%.cpp=$(OBJDIR)/%.lst)
|
CPPFLAGS += -Wa,-adhlns=$(<:%.cpp=$(OBJDIR)/%.lst)
|
||||||
CPPFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS))
|
CPPFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS))
|
||||||
#CPPFLAGS += $(CSTANDARD)
|
#CPPFLAGS += $(CSTANDARD)
|
||||||
|
|
||||||
|
|
||||||
#---------------- Assembler Options ----------------
|
#---------------- Assembler Options ----------------
|
||||||
# -Wa,...: tell GCC to pass this to the assembler.
|
# -Wa,...: tell GCC to pass this to the assembler.
|
||||||
# -adhlns: create listing
|
# -adhlns: create listing
|
||||||
# -gstabs: have the assembler create line number information; note that
|
# -gstabs: have the assembler create line number information; note that
|
||||||
# for use in COFF files, additional information about filenames
|
# for use in COFF files, additional information about filenames
|
||||||
# and function names needs to be present in the assembler source
|
# and function names needs to be present in the assembler source
|
||||||
# files -- see avr-libc docs [FIXME: not yet described there]
|
# files -- see avr-libc docs [FIXME: not yet described there]
|
||||||
# -listing-cont-lines: Sets the maximum number of continuation lines of hex
|
# -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.
|
# 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
|
ASFLAGS = $(ADEFS) -Wa,-adhlns=$(<:%.S=$(OBJDIR)/%.lst),-gstabs,--listing-cont-lines=100
|
||||||
|
|
||||||
|
|
||||||
#---------------- Library Options ----------------
|
#---------------- Library Options ----------------
|
||||||
# Minimalistic printf version
|
# Minimalistic printf version
|
||||||
PRINTF_LIB_MIN = -Wl,-u,vfprintf -lprintf_min
|
PRINTF_LIB_MIN = -Wl,-u,vfprintf -lprintf_min
|
||||||
|
|
||||||
# Floating point printf version (requires MATH_LIB = -lm below)
|
# Floating point printf version (requires MATH_LIB = -lm below)
|
||||||
PRINTF_LIB_FLOAT = -Wl,-u,vfprintf -lprintf_flt
|
PRINTF_LIB_FLOAT = -Wl,-u,vfprintf -lprintf_flt
|
||||||
|
|
||||||
# If this is left blank, then it will use the Standard printf version.
|
# If this is left blank, then it will use the Standard printf version.
|
||||||
PRINTF_LIB =
|
PRINTF_LIB =
|
||||||
#PRINTF_LIB = $(PRINTF_LIB_MIN)
|
#PRINTF_LIB = $(PRINTF_LIB_MIN)
|
||||||
#PRINTF_LIB = $(PRINTF_LIB_FLOAT)
|
#PRINTF_LIB = $(PRINTF_LIB_FLOAT)
|
||||||
|
|
||||||
|
|
||||||
# Minimalistic scanf version
|
# Minimalistic scanf version
|
||||||
SCANF_LIB_MIN = -Wl,-u,vfscanf -lscanf_min
|
SCANF_LIB_MIN = -Wl,-u,vfscanf -lscanf_min
|
||||||
|
|
||||||
# Floating point + %[ scanf version (requires MATH_LIB = -lm below)
|
# Floating point + %[ scanf version (requires MATH_LIB = -lm below)
|
||||||
SCANF_LIB_FLOAT = -Wl,-u,vfscanf -lscanf_flt
|
SCANF_LIB_FLOAT = -Wl,-u,vfscanf -lscanf_flt
|
||||||
|
|
||||||
# If this is left blank, then it will use the Standard scanf version.
|
# If this is left blank, then it will use the Standard scanf version.
|
||||||
SCANF_LIB =
|
SCANF_LIB =
|
||||||
#SCANF_LIB = $(SCANF_LIB_MIN)
|
#SCANF_LIB = $(SCANF_LIB_MIN)
|
||||||
#SCANF_LIB = $(SCANF_LIB_FLOAT)
|
#SCANF_LIB = $(SCANF_LIB_FLOAT)
|
||||||
|
|
||||||
|
|
||||||
MATH_LIB = -lm
|
MATH_LIB = -lm
|
||||||
|
|
||||||
|
|
||||||
# List any extra directories to look for libraries here.
|
# List any extra directories to look for libraries here.
|
||||||
# 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.
|
||||||
EXTRALIBDIRS =
|
EXTRALIBDIRS =
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#---------------- External Memory Options ----------------
|
#---------------- External Memory Options ----------------
|
||||||
|
|
||||||
# 64 KB of external RAM, starting after internal RAM (ATmega128!),
|
# 64 KB of external RAM, starting after internal RAM (ATmega128!),
|
||||||
# used for variables (.data/.bss) and heap (malloc()).
|
# used for variables (.data/.bss) and heap (malloc()).
|
||||||
#EXTMEMOPTS = -Wl,-Tdata=0x801100,--defsym=__heap_end=0x80ffff
|
#EXTMEMOPTS = -Wl,-Tdata=0x801100,--defsym=__heap_end=0x80ffff
|
||||||
|
|
||||||
# 64 KB of external RAM, starting after internal RAM (ATmega128!),
|
# 64 KB of external RAM, starting after internal RAM (ATmega128!),
|
||||||
# only used for heap (malloc()).
|
# only used for heap (malloc()).
|
||||||
#EXTMEMOPTS = -Wl,--section-start,.data=0x801100,--defsym=__heap_end=0x80ffff
|
#EXTMEMOPTS = -Wl,--section-start,.data=0x801100,--defsym=__heap_end=0x80ffff
|
||||||
|
|
||||||
EXTMEMOPTS =
|
EXTMEMOPTS =
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#---------------- Linker Options ----------------
|
#---------------- Linker Options ----------------
|
||||||
# -Wl,...: tell GCC to pass this to linker.
|
# -Wl,...: tell GCC to pass this to linker.
|
||||||
# -Map: create map file
|
# -Map: create map file
|
||||||
# --cref: add cross reference to map file
|
# --cref: add cross reference to map file
|
||||||
LDFLAGS = -Wl,-Map=$(TARGET).map,--cref
|
LDFLAGS = -Wl,-Map=$(TARGET).map,--cref
|
||||||
LDFLAGS += -Wl,--relax
|
LDFLAGS += -Wl,--relax
|
||||||
LDFLAGS += -Wl,--gc-sections
|
LDFLAGS += -Wl,--gc-sections
|
||||||
LDFLAGS += $(EXTMEMOPTS)
|
LDFLAGS += $(EXTMEMOPTS)
|
||||||
LDFLAGS += $(patsubst %,-L%,$(EXTRALIBDIRS))
|
LDFLAGS += $(patsubst %,-L%,$(EXTRALIBDIRS))
|
||||||
LDFLAGS += $(PRINTF_LIB) $(SCANF_LIB) $(MATH_LIB)
|
LDFLAGS += $(PRINTF_LIB) $(SCANF_LIB) $(MATH_LIB)
|
||||||
#LDFLAGS += -T linker_script.x
|
#LDFLAGS += -T linker_script.x
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#---------------- Programming Options (avrdude) ----------------
|
#---------------- Programming Options (avrdude) ----------------
|
||||||
|
|
||||||
# Programming hardware
|
# Programming hardware
|
||||||
# Type: avrdude -c ?
|
# Type: avrdude -c ?
|
||||||
# to get a full listing.
|
# to get a full listing.
|
||||||
#
|
#
|
||||||
AVRDUDE_PROGRAMMER = jtagmkII
|
AVRDUDE_PROGRAMMER = jtagmkII
|
||||||
|
|
||||||
# com1 = serial port. Use lpt1 to connect to parallel port.
|
# com1 = serial port. Use lpt1 to connect to parallel port.
|
||||||
AVRDUDE_PORT = usb
|
AVRDUDE_PORT = usb
|
||||||
|
|
||||||
AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex
|
AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex
|
||||||
#AVRDUDE_WRITE_EEPROM = -U eeprom:w:$(TARGET).eep
|
#AVRDUDE_WRITE_EEPROM = -U eeprom:w:$(TARGET).eep
|
||||||
|
|
||||||
|
|
||||||
# Uncomment the following if you want avrdude's erase cycle counter.
|
# Uncomment the following if you want avrdude's erase cycle counter.
|
||||||
# Note that this counter needs to be initialized first using -Yn,
|
# Note that this counter needs to be initialized first using -Yn,
|
||||||
# see avrdude manual.
|
# see avrdude manual.
|
||||||
#AVRDUDE_ERASE_COUNTER = -y
|
#AVRDUDE_ERASE_COUNTER = -y
|
||||||
|
|
||||||
# Uncomment the following if you do /not/ wish a verification to be
|
# Uncomment the following if you do /not/ wish a verification to be
|
||||||
# performed after programming the device.
|
# performed after programming the device.
|
||||||
#AVRDUDE_NO_VERIFY = -V
|
#AVRDUDE_NO_VERIFY = -V
|
||||||
|
|
||||||
# Increase verbosity level. Please use this when submitting bug
|
# Increase verbosity level. Please use this when submitting bug
|
||||||
# reports about avrdude. See <http://savannah.nongnu.org/projects/avrdude>
|
# reports about avrdude. See <http://savannah.nongnu.org/projects/avrdude>
|
||||||
# to submit bug reports.
|
# to submit bug reports.
|
||||||
#AVRDUDE_VERBOSE = -v -v
|
#AVRDUDE_VERBOSE = -v -v
|
||||||
|
|
||||||
AVRDUDE_FLAGS = -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER)
|
AVRDUDE_FLAGS = -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER)
|
||||||
AVRDUDE_FLAGS += $(AVRDUDE_NO_VERIFY)
|
AVRDUDE_FLAGS += $(AVRDUDE_NO_VERIFY)
|
||||||
AVRDUDE_FLAGS += $(AVRDUDE_VERBOSE)
|
AVRDUDE_FLAGS += $(AVRDUDE_VERBOSE)
|
||||||
AVRDUDE_FLAGS += $(AVRDUDE_ERASE_COUNTER)
|
AVRDUDE_FLAGS += $(AVRDUDE_ERASE_COUNTER)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#---------------- Debugging Options ----------------
|
#---------------- Debugging Options ----------------
|
||||||
|
|
||||||
# For simulavr only - target MCU frequency.
|
# For simulavr only - target MCU frequency.
|
||||||
DEBUG_MFREQ = $(F_CPU)
|
DEBUG_MFREQ = $(F_CPU)
|
||||||
|
|
||||||
# Set the DEBUG_UI to either gdb or insight.
|
# Set the DEBUG_UI to either gdb or insight.
|
||||||
# DEBUG_UI = gdb
|
# DEBUG_UI = gdb
|
||||||
DEBUG_UI = insight
|
DEBUG_UI = insight
|
||||||
|
|
||||||
# Set the debugging back-end to either avarice, simulavr.
|
# Set the debugging back-end to either avarice, simulavr.
|
||||||
DEBUG_BACKEND = avarice
|
DEBUG_BACKEND = avarice
|
||||||
#DEBUG_BACKEND = simulavr
|
#DEBUG_BACKEND = simulavr
|
||||||
|
|
||||||
# GDB Init Filename.
|
# GDB Init Filename.
|
||||||
GDBINIT_FILE = __avr_gdbinit
|
GDBINIT_FILE = __avr_gdbinit
|
||||||
|
|
||||||
# When using avarice settings for the JTAG
|
# When using avarice settings for the JTAG
|
||||||
JTAG_DEV = /dev/com1
|
JTAG_DEV = /dev/com1
|
||||||
|
|
||||||
# Debugging port used to communicate between GDB / avarice / simulavr.
|
# Debugging port used to communicate between GDB / avarice / simulavr.
|
||||||
DEBUG_PORT = 4242
|
DEBUG_PORT = 4242
|
||||||
|
|
||||||
# Debugging host used to communicate between GDB / avarice / simulavr, normally
|
# Debugging host used to communicate between GDB / avarice / simulavr, normally
|
||||||
# just set to localhost unless doing some sort of crazy debugging when
|
# just set to localhost unless doing some sort of crazy debugging when
|
||||||
# avarice is running on a different computer.
|
# avarice is running on a different computer.
|
||||||
DEBUG_HOST = localhost
|
DEBUG_HOST = localhost
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#============================================================================
|
#============================================================================
|
||||||
|
|
||||||
|
|
||||||
# Define programs and commands.
|
# Define programs and commands.
|
||||||
SHELL = sh
|
SHELL = sh
|
||||||
CC = avr-gcc
|
CC = avr-gcc
|
||||||
OBJCOPY = avr-objcopy
|
OBJCOPY = avr-objcopy
|
||||||
OBJDUMP = avr-objdump
|
OBJDUMP = avr-objdump
|
||||||
SIZE = avr-size
|
SIZE = avr-size
|
||||||
AR = avr-ar rcs
|
AR = avr-ar rcs
|
||||||
NM = avr-nm
|
NM = avr-nm
|
||||||
AVRDUDE = avrdude
|
AVRDUDE = avrdude
|
||||||
REMOVE = rm -f
|
REMOVE = rm -f
|
||||||
REMOVEDIR = rm -rf
|
REMOVEDIR = rm -rf
|
||||||
COPY = cp
|
COPY = cp
|
||||||
WINSHELL = cmd
|
WINSHELL = cmd
|
||||||
|
|
||||||
|
|
||||||
# Define Messages
|
# Define Messages
|
||||||
# English
|
# English
|
||||||
MSG_ERRORS_NONE = Errors: none
|
MSG_ERRORS_NONE = Errors: none
|
||||||
MSG_BEGIN = -------- begin --------
|
MSG_BEGIN = -------- begin --------
|
||||||
MSG_END = -------- end --------
|
MSG_END = -------- end --------
|
||||||
MSG_SIZE_BEFORE = Size before:
|
MSG_SIZE_BEFORE = Size before:
|
||||||
MSG_SIZE_AFTER = Size after:
|
MSG_SIZE_AFTER = Size after:
|
||||||
MSG_COFF = Converting to AVR COFF:
|
MSG_COFF = Converting to AVR COFF:
|
||||||
MSG_EXTENDED_COFF = Converting to AVR Extended COFF:
|
MSG_EXTENDED_COFF = Converting to AVR Extended COFF:
|
||||||
MSG_FLASH = Creating load file for Flash:
|
MSG_FLASH = Creating load file for Flash:
|
||||||
MSG_EEPROM = Creating load file for EEPROM:
|
MSG_EEPROM = Creating load file for EEPROM:
|
||||||
MSG_EXTENDED_LISTING = Creating Extended Listing:
|
MSG_EXTENDED_LISTING = Creating Extended Listing:
|
||||||
MSG_SYMBOL_TABLE = Creating Symbol Table:
|
MSG_SYMBOL_TABLE = Creating Symbol Table:
|
||||||
MSG_LINKING = Linking:
|
MSG_LINKING = Linking:
|
||||||
MSG_COMPILING = Compiling C:
|
MSG_COMPILING = Compiling C:
|
||||||
MSG_COMPILING_CPP = Compiling C++:
|
MSG_COMPILING_CPP = Compiling C++:
|
||||||
MSG_ASSEMBLING = Assembling:
|
MSG_ASSEMBLING = Assembling:
|
||||||
MSG_CLEANING = Cleaning project:
|
MSG_CLEANING = Cleaning project:
|
||||||
MSG_CREATING_LIBRARY = Creating library:
|
MSG_CREATING_LIBRARY = Creating library:
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Define all object files.
|
# Define all object files.
|
||||||
OBJ = $(SRC:%.c=$(OBJDIR)/%.o) $(CPPSRC:%.cpp=$(OBJDIR)/%.o) $(ASRC:%.S=$(OBJDIR)/%.o)
|
OBJ = $(SRC:%.c=$(OBJDIR)/%.o) $(CPPSRC:%.cpp=$(OBJDIR)/%.o) $(ASRC:%.S=$(OBJDIR)/%.o)
|
||||||
|
|
||||||
# Define all listing files.
|
# Define all listing files.
|
||||||
LST = $(SRC:%.c=$(OBJDIR)/%.lst) $(CPPSRC:%.cpp=$(OBJDIR)/%.lst) $(ASRC:%.S=$(OBJDIR)/%.lst)
|
LST = $(SRC:%.c=$(OBJDIR)/%.lst) $(CPPSRC:%.cpp=$(OBJDIR)/%.lst) $(ASRC:%.S=$(OBJDIR)/%.lst)
|
||||||
|
|
||||||
|
|
||||||
# Compiler flags to generate dependency files.
|
# Compiler flags to generate dependency files.
|
||||||
GENDEPFLAGS = -MMD -MP -MF .dep/$(@F).d
|
GENDEPFLAGS = -MMD -MP -MF .dep/$(@F).d
|
||||||
|
|
||||||
|
|
||||||
# Combine all necessary flags and optional flags.
|
# Combine all necessary flags and optional flags.
|
||||||
# Add target processor to flags.
|
# Add target processor to flags.
|
||||||
ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS) $(GENDEPFLAGS)
|
ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS) $(GENDEPFLAGS)
|
||||||
ALL_CPPFLAGS = -mmcu=$(MCU) -I. -x c++ $(CPPFLAGS) $(GENDEPFLAGS)
|
ALL_CPPFLAGS = -mmcu=$(MCU) -I. -x c++ $(CPPFLAGS) $(GENDEPFLAGS)
|
||||||
ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS)
|
ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Default target.
|
# Default target.
|
||||||
all: begin gccversion sizebefore build sizeafter end
|
all: begin gccversion sizebefore build sizeafter end
|
||||||
|
|
||||||
# Change the build target to build a HEX file or a library.
|
# Change the build target to build a HEX file or a library.
|
||||||
build: elf hex eep lss sym
|
build: elf hex eep lss sym
|
||||||
#build: lib
|
#build: lib
|
||||||
|
|
||||||
|
|
||||||
elf: $(TARGET).elf
|
elf: $(TARGET).elf
|
||||||
hex: $(TARGET).hex
|
hex: $(TARGET).hex
|
||||||
eep: $(TARGET).eep
|
eep: $(TARGET).eep
|
||||||
lss: $(TARGET).lss
|
lss: $(TARGET).lss
|
||||||
sym: $(TARGET).sym
|
sym: $(TARGET).sym
|
||||||
LIBNAME=lib$(TARGET).a
|
LIBNAME=lib$(TARGET).a
|
||||||
lib: $(LIBNAME)
|
lib: $(LIBNAME)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Eye candy.
|
# Eye candy.
|
||||||
# AVR Studio 3.x does not check make's exit code but relies on
|
# 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.
|
# the following magic strings to be generated by the compile job.
|
||||||
begin:
|
begin:
|
||||||
@echo
|
@echo
|
||||||
@echo $(MSG_BEGIN)
|
@echo $(MSG_BEGIN)
|
||||||
|
|
||||||
end:
|
end:
|
||||||
@echo $(MSG_END)
|
@echo $(MSG_END)
|
||||||
@echo
|
@echo
|
||||||
|
|
||||||
|
|
||||||
# Display size of file.
|
# Display size of file.
|
||||||
HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex
|
HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex
|
||||||
ELFSIZE = $(SIZE) $(MCU_FLAG) $(FORMAT_FLAG) $(TARGET).elf
|
ELFSIZE = $(SIZE) $(MCU_FLAG) $(FORMAT_FLAG) $(TARGET).elf
|
||||||
MCU_FLAG = $(shell $(SIZE) --help | grep -- --mcu > /dev/null && echo --mcu=$(MCU) )
|
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 )
|
FORMAT_FLAG = $(shell $(SIZE) --help | grep -- --format=.*avr > /dev/null && echo --format=avr )
|
||||||
|
|
||||||
|
|
||||||
sizebefore:
|
sizebefore:
|
||||||
@if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_BEFORE); $(ELFSIZE); \
|
@if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_BEFORE); $(ELFSIZE); \
|
||||||
2>/dev/null; echo; fi
|
2>/dev/null; echo; fi
|
||||||
|
|
||||||
sizeafter:
|
sizeafter:
|
||||||
@if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_AFTER); $(ELFSIZE); \
|
@if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_AFTER); $(ELFSIZE); \
|
||||||
2>/dev/null; echo; fi
|
2>/dev/null; echo; fi
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Display compiler version information.
|
# Display compiler version information.
|
||||||
gccversion :
|
gccversion :
|
||||||
@$(CC) --version
|
@$(CC) --version
|
||||||
|
|
||||||
|
|
||||||
# Program the device.
|
# Program the device.
|
||||||
program: $(TARGET).hex $(TARGET).eep
|
program: $(TARGET).hex $(TARGET).eep
|
||||||
$(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM)
|
$(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM)
|
||||||
|
|
||||||
flip: $(TARGET).hex
|
flip: $(TARGET).hex
|
||||||
batchisp -hardware usb -device $(MCU) -operation erase f
|
batchisp -hardware usb -device $(MCU) -operation erase f
|
||||||
batchisp -hardware usb -device $(MCU) -operation loadbuffer $(TARGET).hex program
|
batchisp -hardware usb -device $(MCU) -operation loadbuffer $(TARGET).hex program
|
||||||
batchisp -hardware usb -device $(MCU) -operation start reset 0
|
batchisp -hardware usb -device $(MCU) -operation start reset 0
|
||||||
|
|
||||||
dfu: $(TARGET).hex
|
dfu: $(TARGET).hex
|
||||||
dfu-programmer $(MCU) erase
|
dfu-programmer $(MCU) erase
|
||||||
dfu-programmer $(MCU) flash $(TARGET).hex
|
dfu-programmer $(MCU) flash $(TARGET).hex
|
||||||
dfu-programmer $(MCU) reset
|
dfu-programmer $(MCU) reset
|
||||||
|
|
||||||
flip-ee: $(TARGET).hex $(TARGET).eep
|
flip-ee: $(TARGET).hex $(TARGET).eep
|
||||||
$(COPY) $(TARGET).eep $(TARGET)eep.hex
|
$(COPY) $(TARGET).eep $(TARGET)eep.hex
|
||||||
batchisp -hardware usb -device $(MCU) -operation memory EEPROM erase
|
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 memory EEPROM loadbuffer $(TARGET)eep.hex program
|
||||||
batchisp -hardware usb -device $(MCU) -operation start reset 0
|
batchisp -hardware usb -device $(MCU) -operation start reset 0
|
||||||
$(REMOVE) $(TARGET)eep.hex
|
$(REMOVE) $(TARGET)eep.hex
|
||||||
|
|
||||||
dfu-ee: $(TARGET).hex $(TARGET).eep
|
dfu-ee: $(TARGET).hex $(TARGET).eep
|
||||||
dfu-programmer $(MCU) eeprom-flash $(TARGET).eep
|
dfu-programmer $(MCU) eeprom-flash $(TARGET).eep
|
||||||
dfu-programmer $(MCU) reset
|
dfu-programmer $(MCU) reset
|
||||||
|
|
||||||
|
|
||||||
# Generate avr-gdb config/init file which does the following:
|
# Generate avr-gdb config/init file which does the following:
|
||||||
# define the reset signal, load the target file, connect to target, and set
|
# define the reset signal, load the target file, connect to target, and set
|
||||||
# a breakpoint at main().
|
# a breakpoint at main().
|
||||||
gdb-config:
|
gdb-config:
|
||||||
@$(REMOVE) $(GDBINIT_FILE)
|
@$(REMOVE) $(GDBINIT_FILE)
|
||||||
@echo define reset >> $(GDBINIT_FILE)
|
@echo define reset >> $(GDBINIT_FILE)
|
||||||
@echo SIGNAL SIGHUP >> $(GDBINIT_FILE)
|
@echo SIGNAL SIGHUP >> $(GDBINIT_FILE)
|
||||||
@echo end >> $(GDBINIT_FILE)
|
@echo end >> $(GDBINIT_FILE)
|
||||||
@echo file $(TARGET).elf >> $(GDBINIT_FILE)
|
@echo file $(TARGET).elf >> $(GDBINIT_FILE)
|
||||||
@echo target remote $(DEBUG_HOST):$(DEBUG_PORT) >> $(GDBINIT_FILE)
|
@echo target remote $(DEBUG_HOST):$(DEBUG_PORT) >> $(GDBINIT_FILE)
|
||||||
ifeq ($(DEBUG_BACKEND),simulavr)
|
ifeq ($(DEBUG_BACKEND),simulavr)
|
||||||
@echo load >> $(GDBINIT_FILE)
|
@echo load >> $(GDBINIT_FILE)
|
||||||
endif
|
endif
|
||||||
@echo break main >> $(GDBINIT_FILE)
|
@echo break main >> $(GDBINIT_FILE)
|
||||||
|
|
||||||
debug: gdb-config $(TARGET).elf
|
debug: gdb-config $(TARGET).elf
|
||||||
ifeq ($(DEBUG_BACKEND), avarice)
|
ifeq ($(DEBUG_BACKEND), avarice)
|
||||||
@echo Starting AVaRICE - Press enter when "waiting to connect" message displays.
|
@echo Starting AVaRICE - Press enter when "waiting to connect" message displays.
|
||||||
@$(WINSHELL) /c start avarice --jtag $(JTAG_DEV) --erase --program --file \
|
@$(WINSHELL) /c start avarice --jtag $(JTAG_DEV) --erase --program --file \
|
||||||
$(TARGET).elf $(DEBUG_HOST):$(DEBUG_PORT)
|
$(TARGET).elf $(DEBUG_HOST):$(DEBUG_PORT)
|
||||||
@$(WINSHELL) /c pause
|
@$(WINSHELL) /c pause
|
||||||
|
|
||||||
else
|
else
|
||||||
@$(WINSHELL) /c start simulavr --gdbserver --device $(MCU) --clock-freq \
|
@$(WINSHELL) /c start simulavr --gdbserver --device $(MCU) --clock-freq \
|
||||||
$(DEBUG_MFREQ) --port $(DEBUG_PORT)
|
$(DEBUG_MFREQ) --port $(DEBUG_PORT)
|
||||||
endif
|
endif
|
||||||
@$(WINSHELL) /c start avr-$(DEBUG_UI) --command=$(GDBINIT_FILE)
|
@$(WINSHELL) /c start avr-$(DEBUG_UI) --command=$(GDBINIT_FILE)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Convert ELF to COFF for use in debugging / simulating in AVR Studio or VMLAB.
|
# Convert ELF to COFF for use in debugging / simulating in AVR Studio or VMLAB.
|
||||||
COFFCONVERT = $(OBJCOPY) --debugging
|
COFFCONVERT = $(OBJCOPY) --debugging
|
||||||
COFFCONVERT += --change-section-address .data-0x800000
|
COFFCONVERT += --change-section-address .data-0x800000
|
||||||
COFFCONVERT += --change-section-address .bss-0x800000
|
COFFCONVERT += --change-section-address .bss-0x800000
|
||||||
COFFCONVERT += --change-section-address .noinit-0x800000
|
COFFCONVERT += --change-section-address .noinit-0x800000
|
||||||
COFFCONVERT += --change-section-address .eeprom-0x810000
|
COFFCONVERT += --change-section-address .eeprom-0x810000
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
coff: $(TARGET).elf
|
coff: $(TARGET).elf
|
||||||
@echo
|
@echo
|
||||||
@echo $(MSG_COFF) $(TARGET).cof
|
@echo $(MSG_COFF) $(TARGET).cof
|
||||||
$(COFFCONVERT) -O coff-avr $< $(TARGET).cof
|
$(COFFCONVERT) -O coff-avr $< $(TARGET).cof
|
||||||
|
|
||||||
|
|
||||||
extcoff: $(TARGET).elf
|
extcoff: $(TARGET).elf
|
||||||
@echo
|
@echo
|
||||||
@echo $(MSG_EXTENDED_COFF) $(TARGET).cof
|
@echo $(MSG_EXTENDED_COFF) $(TARGET).cof
|
||||||
$(COFFCONVERT) -O coff-ext-avr $< $(TARGET).cof
|
$(COFFCONVERT) -O coff-ext-avr $< $(TARGET).cof
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Create final output files (.hex, .eep) from ELF output file.
|
# Create final output files (.hex, .eep) from ELF output file.
|
||||||
%.hex: %.elf
|
%.hex: %.elf
|
||||||
@echo
|
@echo
|
||||||
@echo $(MSG_FLASH) $@
|
@echo $(MSG_FLASH) $@
|
||||||
$(OBJCOPY) -O $(FORMAT) -R .eeprom -R .fuse -R .lock $< $@
|
$(OBJCOPY) -O $(FORMAT) -R .eeprom -R .fuse -R .lock $< $@
|
||||||
|
|
||||||
%.eep: %.elf
|
%.eep: %.elf
|
||||||
@echo
|
@echo
|
||||||
@echo $(MSG_EEPROM) $@
|
@echo $(MSG_EEPROM) $@
|
||||||
-$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \
|
-$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \
|
||||||
--change-section-lma .eeprom=0 --no-change-warnings -O $(FORMAT) $< $@ || exit 0
|
--change-section-lma .eeprom=0 --no-change-warnings -O $(FORMAT) $< $@ || exit 0
|
||||||
|
|
||||||
# Create extended listing file from ELF output file.
|
# Create extended listing file from ELF output file.
|
||||||
%.lss: %.elf
|
%.lss: %.elf
|
||||||
@echo
|
@echo
|
||||||
@echo $(MSG_EXTENDED_LISTING) $@
|
@echo $(MSG_EXTENDED_LISTING) $@
|
||||||
$(OBJDUMP) -h -S -z $< > $@
|
$(OBJDUMP) -h -S -z $< > $@
|
||||||
|
|
||||||
# Create a symbol table from ELF output file.
|
# Create a symbol table from ELF output file.
|
||||||
%.sym: %.elf
|
%.sym: %.elf
|
||||||
@echo
|
@echo
|
||||||
@echo $(MSG_SYMBOL_TABLE) $@
|
@echo $(MSG_SYMBOL_TABLE) $@
|
||||||
$(NM) -n $< > $@
|
$(NM) -n $< > $@
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Create library from object files.
|
# Create library from object files.
|
||||||
.SECONDARY : $(TARGET).a
|
.SECONDARY : $(TARGET).a
|
||||||
.PRECIOUS : $(OBJ)
|
.PRECIOUS : $(OBJ)
|
||||||
%.a: $(OBJ)
|
%.a: $(OBJ)
|
||||||
@echo
|
@echo
|
||||||
@echo $(MSG_CREATING_LIBRARY) $@
|
@echo $(MSG_CREATING_LIBRARY) $@
|
||||||
$(AR) $@ $(OBJ)
|
$(AR) $@ $(OBJ)
|
||||||
|
|
||||||
|
|
||||||
# Link: create ELF output file from object files.
|
# Link: create ELF output file from object files.
|
||||||
.SECONDARY : $(TARGET).elf
|
.SECONDARY : $(TARGET).elf
|
||||||
.PRECIOUS : $(OBJ)
|
.PRECIOUS : $(OBJ)
|
||||||
%.elf: $(OBJ)
|
%.elf: $(OBJ)
|
||||||
@echo
|
@echo
|
||||||
@echo $(MSG_LINKING) $@
|
@echo $(MSG_LINKING) $@
|
||||||
$(CC) $(ALL_CFLAGS) $^ --output $@ $(LDFLAGS)
|
$(CC) $(ALL_CFLAGS) $^ --output $@ $(LDFLAGS)
|
||||||
|
|
||||||
|
|
||||||
# Compile: create object files from C source files.
|
# Compile: create object files from C source files.
|
||||||
$(OBJDIR)/%.o : %.c
|
$(OBJDIR)/%.o : %.c
|
||||||
@echo
|
@echo
|
||||||
@echo $(MSG_COMPILING) $<
|
@echo $(MSG_COMPILING) $<
|
||||||
$(CC) -c $(ALL_CFLAGS) $< -o $@
|
$(CC) -c $(ALL_CFLAGS) $< -o $@
|
||||||
|
|
||||||
|
|
||||||
# Compile: create object files from C++ source files.
|
# Compile: create object files from C++ source files.
|
||||||
$(OBJDIR)/%.o : %.cpp
|
$(OBJDIR)/%.o : %.cpp
|
||||||
@echo
|
@echo
|
||||||
@echo $(MSG_COMPILING_CPP) $<
|
@echo $(MSG_COMPILING_CPP) $<
|
||||||
$(CC) -c $(ALL_CPPFLAGS) $< -o $@
|
$(CC) -c $(ALL_CPPFLAGS) $< -o $@
|
||||||
|
|
||||||
|
|
||||||
# Compile: create assembler files from C source files.
|
# Compile: create assembler files from C source files.
|
||||||
%.s : %.c
|
%.s : %.c
|
||||||
$(CC) -S $(ALL_CFLAGS) $< -o $@
|
$(CC) -S $(ALL_CFLAGS) $< -o $@
|
||||||
|
|
||||||
|
|
||||||
# Compile: create assembler files from C++ source files.
|
# Compile: create assembler files from C++ source files.
|
||||||
%.s : %.cpp
|
%.s : %.cpp
|
||||||
$(CC) -S $(ALL_CPPFLAGS) $< -o $@
|
$(CC) -S $(ALL_CPPFLAGS) $< -o $@
|
||||||
|
|
||||||
|
|
||||||
# Assemble: create object files from assembler source files.
|
# Assemble: create object files from assembler source files.
|
||||||
$(OBJDIR)/%.o : %.S
|
$(OBJDIR)/%.o : %.S
|
||||||
@echo
|
@echo
|
||||||
@echo $(MSG_ASSEMBLING) $<
|
@echo $(MSG_ASSEMBLING) $<
|
||||||
$(CC) -c $(ALL_ASFLAGS) $< -o $@
|
$(CC) -c $(ALL_ASFLAGS) $< -o $@
|
||||||
|
|
||||||
|
|
||||||
# Create preprocessed source for use in sending a bug report.
|
# Create preprocessed source for use in sending a bug report.
|
||||||
%.i : %.c
|
%.i : %.c
|
||||||
$(CC) -E -mmcu=$(MCU) -I. $(CFLAGS) $< -o $@
|
$(CC) -E -mmcu=$(MCU) -I. $(CFLAGS) $< -o $@
|
||||||
|
|
||||||
|
|
||||||
# Target: clean project.
|
# Target: clean project.
|
||||||
clean: begin clean_list end
|
clean: begin clean_list end
|
||||||
|
|
||||||
clean_list :
|
clean_list :
|
||||||
@echo
|
@echo
|
||||||
@echo $(MSG_CLEANING)
|
@echo $(MSG_CLEANING)
|
||||||
$(REMOVE) $(TARGET).hex
|
$(REMOVE) $(TARGET).hex
|
||||||
$(REMOVE) $(TARGET).eep
|
$(REMOVE) $(TARGET).eep
|
||||||
$(REMOVE) $(TARGET).cof
|
$(REMOVE) $(TARGET).cof
|
||||||
$(REMOVE) $(TARGET).elf
|
$(REMOVE) $(TARGET).elf
|
||||||
$(REMOVE) $(TARGET).map
|
$(REMOVE) $(TARGET).map
|
||||||
$(REMOVE) $(TARGET).sym
|
$(REMOVE) $(TARGET).sym
|
||||||
$(REMOVE) $(TARGET).lss
|
$(REMOVE) $(TARGET).lss
|
||||||
$(REMOVE) $(SRC:%.c=$(OBJDIR)/%.o) $(CPPSRC:%.cpp=$(OBJDIR)/%.o) $(ASRC:%.S=$(OBJDIR)/%.o)
|
$(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=$(OBJDIR)/%.lst) $(CPPSRC:%.cpp=$(OBJDIR)/%.lst) $(ASRC:%.S=$(OBJDIR)/%.lst)
|
||||||
$(REMOVE) $(SRC:.c=.s)
|
$(REMOVE) $(SRC:.c=.s)
|
||||||
$(REMOVE) $(SRC:.c=.d)
|
$(REMOVE) $(SRC:.c=.d)
|
||||||
$(REMOVE) $(SRC:.c=.i)
|
$(REMOVE) $(SRC:.c=.i)
|
||||||
$(REMOVEDIR) .dep
|
$(REMOVEDIR) .dep
|
||||||
|
|
||||||
doxygen:
|
doxygen:
|
||||||
@echo Generating Project Documentation...
|
@echo Generating Project Documentation...
|
||||||
@doxygen Doxygen.conf
|
@doxygen Doxygen.conf
|
||||||
@echo Documentation Generation Complete.
|
@echo Documentation Generation Complete.
|
||||||
|
|
||||||
clean_doxygen:
|
clean_doxygen:
|
||||||
rm -rf Documentation
|
rm -rf Documentation
|
||||||
|
|
||||||
# Create object files directory
|
# Create object files directory
|
||||||
$(shell mkdir $(OBJDIR) 2>/dev/null)
|
$(shell mkdir $(OBJDIR) 2>/dev/null)
|
||||||
|
|
||||||
|
|
||||||
# Include the dependency files.
|
# Include the dependency files.
|
||||||
-include $(shell mkdir .dep 2>/dev/null) $(wildcard .dep/*)
|
-include $(shell mkdir .dep 2>/dev/null) $(wildcard .dep/*)
|
||||||
|
|
||||||
|
|
||||||
# Listing of phony targets.
|
# Listing of phony targets.
|
||||||
.PHONY : all begin finish end sizebefore sizeafter gccversion \
|
.PHONY : all begin finish end sizebefore sizeafter gccversion \
|
||||||
build elf hex eep lss sym coff extcoff doxygen clean \
|
build elf hex eep lss sym coff extcoff doxygen clean \
|
||||||
clean_list clean_doxygen program dfu flip flip-ee dfu-ee \
|
clean_list clean_doxygen program dfu flip flip-ee dfu-ee \
|
||||||
debug gdb-config
|
debug gdb-config
|
||||||
|
|
||||||
|
@ -1,267 +1,267 @@
|
|||||||
/*
|
/*
|
||||||
LUFA Library
|
LUFA Library
|
||||||
Copyright (C) Dean Camera, 2011.
|
Copyright (C) Dean Camera, 2011.
|
||||||
|
|
||||||
dean [at] fourwalledcubicle [dot] com
|
dean [at] fourwalledcubicle [dot] com
|
||||||
www.lufa-lib.org
|
www.lufa-lib.org
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com)
|
Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com)
|
||||||
|
|
||||||
Permission to use, copy, modify, distribute, and sell this
|
Permission to use, copy, modify, distribute, and sell this
|
||||||
software and its documentation for any purpose is hereby granted
|
software and its documentation for any purpose is hereby granted
|
||||||
without fee, provided that the above copyright notice appear in
|
without fee, provided that the above copyright notice appear in
|
||||||
all copies and that both that the copyright notice and this
|
all copies and that both that the copyright notice and this
|
||||||
permission notice and warranty disclaimer appear in supporting
|
permission notice and warranty disclaimer appear in supporting
|
||||||
documentation, and that the name of the author not be used in
|
documentation, and that the name of the author not be used in
|
||||||
advertising or publicity pertaining to distribution of the
|
advertising or publicity pertaining to distribution of the
|
||||||
software without specific, written prior permission.
|
software without specific, written prior permission.
|
||||||
|
|
||||||
The author disclaim all warranties with regard to this
|
The author disclaim all warranties with regard to this
|
||||||
software, including all implied warranties of merchantability
|
software, including all implied warranties of merchantability
|
||||||
and fitness. In no event shall the author be liable for any
|
and fitness. In no event shall the author be liable for any
|
||||||
special, indirect or consequential damages or any damages
|
special, indirect or consequential damages or any damages
|
||||||
whatsoever resulting from loss of use, data or profits, whether
|
whatsoever resulting from loss of use, data or profits, whether
|
||||||
in an action of contract, negligence or other tortious action,
|
in an action of contract, negligence or other tortious action,
|
||||||
arising out of or in connection with the use or performance of
|
arising out of or in connection with the use or performance of
|
||||||
this software.
|
this software.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/** \file
|
/** \file
|
||||||
*
|
*
|
||||||
* Main source file for the AndroidAccessoryHost demo. This file contains the main tasks
|
* Main source file for the AndroidAccessoryHost demo. This file contains the main tasks
|
||||||
* of the demo and is responsible for the initial application hardware configuration.
|
* of the demo and is responsible for the initial application hardware configuration.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "AndroidAccessoryHost.h"
|
#include "AndroidAccessoryHost.h"
|
||||||
|
|
||||||
/** Main program entry point. This routine configures the hardware required by the application, then
|
/** Main program entry point. This routine configures the hardware required by the application, then
|
||||||
* enters a loop to run the application tasks in sequence.
|
* enters a loop to run the application tasks in sequence.
|
||||||
*/
|
*/
|
||||||
int main(void)
|
int main(void)
|
||||||
{
|
{
|
||||||
SetupHardware();
|
SetupHardware();
|
||||||
|
|
||||||
puts_P(PSTR(ESC_FG_CYAN "Android Accessory Host Demo running.\r\n" ESC_FG_WHITE));
|
puts_P(PSTR(ESC_FG_CYAN "Android Accessory Host Demo running.\r\n" ESC_FG_WHITE));
|
||||||
|
|
||||||
LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY);
|
LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY);
|
||||||
sei();
|
sei();
|
||||||
|
|
||||||
for (;;)
|
for (;;)
|
||||||
{
|
{
|
||||||
Android_Host_Task();
|
Android_Host_Task();
|
||||||
USB_USBTask();
|
USB_USBTask();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Configures the board hardware and chip peripherals for the demo's functionality. */
|
/** Configures the board hardware and chip peripherals for the demo's functionality. */
|
||||||
void SetupHardware(void)
|
void SetupHardware(void)
|
||||||
{
|
{
|
||||||
/* Disable watchdog if enabled by bootloader/fuses */
|
/* Disable watchdog if enabled by bootloader/fuses */
|
||||||
MCUSR &= ~(1 << WDRF);
|
MCUSR &= ~(1 << WDRF);
|
||||||
wdt_disable();
|
wdt_disable();
|
||||||
|
|
||||||
/* Disable clock division */
|
/* Disable clock division */
|
||||||
clock_prescale_set(clock_div_1);
|
clock_prescale_set(clock_div_1);
|
||||||
|
|
||||||
/* Hardware Initialization */
|
/* Hardware Initialization */
|
||||||
Serial_Init(9600, false);
|
Serial_Init(9600, false);
|
||||||
LEDs_Init();
|
LEDs_Init();
|
||||||
USB_Init();
|
USB_Init();
|
||||||
|
|
||||||
/* Create a stdio stream for the serial port for stdin and stdout */
|
/* Create a stdio stream for the serial port for stdin and stdout */
|
||||||
Serial_CreateStream(NULL);
|
Serial_CreateStream(NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Event handler for the USB_DeviceAttached event. This indicates that a device has been attached to the host, and
|
/** Event handler for the USB_DeviceAttached event. This indicates that a device has been attached to the host, and
|
||||||
* starts the library USB task to begin the enumeration and USB management process.
|
* starts the library USB task to begin the enumeration and USB management process.
|
||||||
*/
|
*/
|
||||||
void EVENT_USB_Host_DeviceAttached(void)
|
void EVENT_USB_Host_DeviceAttached(void)
|
||||||
{
|
{
|
||||||
puts_P(PSTR(ESC_FG_GREEN "Device Attached.\r\n" ESC_FG_WHITE));
|
puts_P(PSTR(ESC_FG_GREEN "Device Attached.\r\n" ESC_FG_WHITE));
|
||||||
LEDs_SetAllLEDs(LEDMASK_USB_ENUMERATING);
|
LEDs_SetAllLEDs(LEDMASK_USB_ENUMERATING);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Event handler for the USB_DeviceUnattached event. This indicates that a device has been removed from the host, and
|
/** Event handler for the USB_DeviceUnattached event. This indicates that a device has been removed from the host, and
|
||||||
* stops the library USB task management process.
|
* stops the library USB task management process.
|
||||||
*/
|
*/
|
||||||
void EVENT_USB_Host_DeviceUnattached(void)
|
void EVENT_USB_Host_DeviceUnattached(void)
|
||||||
{
|
{
|
||||||
puts_P(PSTR(ESC_FG_GREEN "\r\nDevice Unattached.\r\n" ESC_FG_WHITE));
|
puts_P(PSTR(ESC_FG_GREEN "\r\nDevice Unattached.\r\n" ESC_FG_WHITE));
|
||||||
LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY);
|
LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Event handler for the USB_DeviceEnumerationComplete event. This indicates that a device has been successfully
|
/** Event handler for the USB_DeviceEnumerationComplete event. This indicates that a device has been successfully
|
||||||
* enumerated by the host and is now ready to be used by the application.
|
* enumerated by the host and is now ready to be used by the application.
|
||||||
*/
|
*/
|
||||||
void EVENT_USB_Host_DeviceEnumerationComplete(void)
|
void EVENT_USB_Host_DeviceEnumerationComplete(void)
|
||||||
{
|
{
|
||||||
LEDs_SetAllLEDs(LEDMASK_USB_READY);
|
LEDs_SetAllLEDs(LEDMASK_USB_READY);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Event handler for the USB_HostError event. This indicates that a hardware error occurred while in host mode. */
|
/** Event handler for the USB_HostError event. This indicates that a hardware error occurred while in host mode. */
|
||||||
void EVENT_USB_Host_HostError(const uint8_t ErrorCode)
|
void EVENT_USB_Host_HostError(const uint8_t ErrorCode)
|
||||||
{
|
{
|
||||||
USB_Disable();
|
USB_Disable();
|
||||||
|
|
||||||
printf_P(PSTR(ESC_FG_RED "Host Mode Error\r\n"
|
printf_P(PSTR(ESC_FG_RED "Host Mode Error\r\n"
|
||||||
" -- Error Code %d\r\n" ESC_FG_WHITE), ErrorCode);
|
" -- Error Code %d\r\n" ESC_FG_WHITE), ErrorCode);
|
||||||
|
|
||||||
LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
|
LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
|
||||||
for(;;);
|
for(;;);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Event handler for the USB_DeviceEnumerationFailed event. This indicates that a problem occurred while
|
/** Event handler for the USB_DeviceEnumerationFailed event. This indicates that a problem occurred while
|
||||||
* enumerating an attached USB device.
|
* enumerating an attached USB device.
|
||||||
*/
|
*/
|
||||||
void EVENT_USB_Host_DeviceEnumerationFailed(const uint8_t ErrorCode,
|
void EVENT_USB_Host_DeviceEnumerationFailed(const uint8_t ErrorCode,
|
||||||
const uint8_t SubErrorCode)
|
const uint8_t SubErrorCode)
|
||||||
{
|
{
|
||||||
printf_P(PSTR(ESC_FG_RED "Dev Enum Error\r\n"
|
printf_P(PSTR(ESC_FG_RED "Dev Enum Error\r\n"
|
||||||
" -- Error Code %d\r\n"
|
" -- Error Code %d\r\n"
|
||||||
" -- Sub Error Code %d\r\n"
|
" -- Sub Error Code %d\r\n"
|
||||||
" -- In State %d\r\n" ESC_FG_WHITE), ErrorCode, SubErrorCode, USB_HostState);
|
" -- In State %d\r\n" ESC_FG_WHITE), ErrorCode, SubErrorCode, USB_HostState);
|
||||||
|
|
||||||
LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
|
LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Task to set the configuration of the attached device after it has been enumerated. */
|
/** Task to set the configuration of the attached device after it has been enumerated. */
|
||||||
void Android_Host_Task(void)
|
void Android_Host_Task(void)
|
||||||
{
|
{
|
||||||
uint8_t ErrorCode;
|
uint8_t ErrorCode;
|
||||||
|
|
||||||
switch (USB_HostState)
|
switch (USB_HostState)
|
||||||
{
|
{
|
||||||
case HOST_STATE_Addressed:
|
case HOST_STATE_Addressed:
|
||||||
puts_P(PSTR("Getting Device Data.\r\n"));
|
puts_P(PSTR("Getting Device Data.\r\n"));
|
||||||
|
|
||||||
/* Get and process the configuration descriptor data */
|
/* Get and process the configuration descriptor data */
|
||||||
ErrorCode = ProcessDeviceDescriptor();
|
ErrorCode = ProcessDeviceDescriptor();
|
||||||
|
|
||||||
/* Save whether the Android device needs to be mode-switched later on */
|
/* Save whether the Android device needs to be mode-switched later on */
|
||||||
bool RequiresModeSwitch = (ErrorCode == NonAccessoryModeAndroidDevice);
|
bool RequiresModeSwitch = (ErrorCode == NonAccessoryModeAndroidDevice);
|
||||||
|
|
||||||
/* Error out if the device is not an Android device or an error occurred */
|
/* Error out if the device is not an Android device or an error occurred */
|
||||||
if ((ErrorCode != AccessoryModeAndroidDevice) && !(RequiresModeSwitch))
|
if ((ErrorCode != AccessoryModeAndroidDevice) && !(RequiresModeSwitch))
|
||||||
{
|
{
|
||||||
if (ErrorCode == DevControlError)
|
if (ErrorCode == DevControlError)
|
||||||
puts_P(PSTR(ESC_FG_RED "Control Error (Get Device).\r\n"));
|
puts_P(PSTR(ESC_FG_RED "Control Error (Get Device).\r\n"));
|
||||||
else
|
else
|
||||||
puts_P(PSTR(ESC_FG_RED "Invalid Device.\r\n"));
|
puts_P(PSTR(ESC_FG_RED "Invalid Device.\r\n"));
|
||||||
|
|
||||||
printf_P(PSTR(" -- Error Code: %d\r\n" ESC_FG_WHITE), ErrorCode);
|
printf_P(PSTR(" -- Error Code: %d\r\n" ESC_FG_WHITE), ErrorCode);
|
||||||
|
|
||||||
/* Indicate error via status LEDs */
|
/* Indicate error via status LEDs */
|
||||||
LEDs_SetAllLEDs(LEDS_LED1);
|
LEDs_SetAllLEDs(LEDS_LED1);
|
||||||
|
|
||||||
/* Wait until USB device disconnected */
|
/* Wait until USB device disconnected */
|
||||||
USB_HostState = HOST_STATE_WaitForDeviceRemoval;
|
USB_HostState = HOST_STATE_WaitForDeviceRemoval;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
printf_P(PSTR("Android Device Detected - %sAccessory mode.\r\n"), (RequiresModeSwitch ? "Non-" : ""));
|
printf_P(PSTR("Android Device Detected - %sAccessory mode.\r\n"), (RequiresModeSwitch ? "Non-" : ""));
|
||||||
|
|
||||||
/* Set the device configuration to the first configuration (rarely do devices use multiple configurations) */
|
/* Set the device configuration to the first configuration (rarely do devices use multiple configurations) */
|
||||||
if ((ErrorCode = USB_Host_SetDeviceConfiguration(1)) != HOST_SENDCONTROL_Successful)
|
if ((ErrorCode = USB_Host_SetDeviceConfiguration(1)) != HOST_SENDCONTROL_Successful)
|
||||||
{
|
{
|
||||||
printf_P(PSTR(ESC_FG_RED "Control Error (Set Configuration).\r\n"
|
printf_P(PSTR(ESC_FG_RED "Control Error (Set Configuration).\r\n"
|
||||||
" -- Error Code: %d\r\n" ESC_FG_WHITE), ErrorCode);
|
" -- Error Code: %d\r\n" ESC_FG_WHITE), ErrorCode);
|
||||||
|
|
||||||
/* Indicate error via status LEDs */
|
/* Indicate error via status LEDs */
|
||||||
LEDs_SetAllLEDs(LEDS_LED1);
|
LEDs_SetAllLEDs(LEDS_LED1);
|
||||||
|
|
||||||
/* Wait until USB device disconnected */
|
/* Wait until USB device disconnected */
|
||||||
USB_HostState = HOST_STATE_WaitForDeviceRemoval;
|
USB_HostState = HOST_STATE_WaitForDeviceRemoval;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Check if a valid Android device was attached, but it is not current in Accessory mode */
|
/* Check if a valid Android device was attached, but it is not current in Accessory mode */
|
||||||
if (RequiresModeSwitch)
|
if (RequiresModeSwitch)
|
||||||
{
|
{
|
||||||
USB_ControlRequest = (USB_Request_Header_t)
|
USB_ControlRequest = (USB_Request_Header_t)
|
||||||
{
|
{
|
||||||
.bmRequestType = (REQDIR_HOSTTODEVICE | REQTYPE_VENDOR | REQREC_DEVICE),
|
.bmRequestType = (REQDIR_HOSTTODEVICE | REQTYPE_VENDOR | REQREC_DEVICE),
|
||||||
.bRequest = ANDROID_Req_StartAccessoryMode,
|
.bRequest = ANDROID_Req_StartAccessoryMode,
|
||||||
.wValue = 0,
|
.wValue = 0,
|
||||||
.wIndex = 0,
|
.wIndex = 0,
|
||||||
.wLength = 0,
|
.wLength = 0,
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Send the control request for the Android device to switch to accessory mode */
|
/* Send the control request for the Android device to switch to accessory mode */
|
||||||
Pipe_SelectPipe(PIPE_CONTROLPIPE);
|
Pipe_SelectPipe(PIPE_CONTROLPIPE);
|
||||||
USB_Host_SendControlRequest(NULL);
|
USB_Host_SendControlRequest(NULL);
|
||||||
|
|
||||||
/* Wait until USB device disconnected */
|
/* Wait until USB device disconnected */
|
||||||
USB_HostState = HOST_STATE_WaitForDeviceRemoval;
|
USB_HostState = HOST_STATE_WaitForDeviceRemoval;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
puts_P(PSTR("Getting Config Data.\r\n"));
|
puts_P(PSTR("Getting Config Data.\r\n"));
|
||||||
|
|
||||||
/* Get and process the configuration descriptor data */
|
/* Get and process the configuration descriptor data */
|
||||||
if ((ErrorCode = ProcessConfigurationDescriptor()) != SuccessfulConfigRead)
|
if ((ErrorCode = ProcessConfigurationDescriptor()) != SuccessfulConfigRead)
|
||||||
{
|
{
|
||||||
if (ErrorCode == ControlError)
|
if (ErrorCode == ControlError)
|
||||||
puts_P(PSTR(ESC_FG_RED "Control Error (Get Configuration).\r\n"));
|
puts_P(PSTR(ESC_FG_RED "Control Error (Get Configuration).\r\n"));
|
||||||
else
|
else
|
||||||
puts_P(PSTR(ESC_FG_RED "Invalid Device.\r\n"));
|
puts_P(PSTR(ESC_FG_RED "Invalid Device.\r\n"));
|
||||||
|
|
||||||
printf_P(PSTR(" -- Error Code: %d\r\n" ESC_FG_WHITE), ErrorCode);
|
printf_P(PSTR(" -- Error Code: %d\r\n" ESC_FG_WHITE), ErrorCode);
|
||||||
|
|
||||||
/* Indicate error via status LEDs */
|
/* Indicate error via status LEDs */
|
||||||
LEDs_SetAllLEDs(LEDS_LED1);
|
LEDs_SetAllLEDs(LEDS_LED1);
|
||||||
|
|
||||||
/* Wait until USB device disconnected */
|
/* Wait until USB device disconnected */
|
||||||
USB_HostState = HOST_STATE_WaitForDeviceRemoval;
|
USB_HostState = HOST_STATE_WaitForDeviceRemoval;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
puts_P(PSTR("Accessory Mode Android Enumerated.\r\n"));
|
puts_P(PSTR("Accessory Mode Android Enumerated.\r\n"));
|
||||||
|
|
||||||
USB_HostState = HOST_STATE_Configured;
|
USB_HostState = HOST_STATE_Configured;
|
||||||
break;
|
break;
|
||||||
case HOST_STATE_Configured:
|
case HOST_STATE_Configured:
|
||||||
/* Select the data IN pipe */
|
/* Select the data IN pipe */
|
||||||
Pipe_SelectPipe(ANDROID_DATA_IN_PIPE);
|
Pipe_SelectPipe(ANDROID_DATA_IN_PIPE);
|
||||||
Pipe_Unfreeze();
|
Pipe_Unfreeze();
|
||||||
|
|
||||||
/* Check to see if a packet has been received */
|
/* Check to see if a packet has been received */
|
||||||
if (Pipe_IsINReceived())
|
if (Pipe_IsINReceived())
|
||||||
{
|
{
|
||||||
/* Re-freeze IN pipe after the packet has been received */
|
/* Re-freeze IN pipe after the packet has been received */
|
||||||
Pipe_Freeze();
|
Pipe_Freeze();
|
||||||
|
|
||||||
/* Check if data is in the pipe */
|
/* Check if data is in the pipe */
|
||||||
if (Pipe_IsReadWriteAllowed())
|
if (Pipe_IsReadWriteAllowed())
|
||||||
{
|
{
|
||||||
uint8_t NextReceivedByte = Pipe_BytesInPipe();
|
uint8_t NextReceivedByte = Pipe_BytesInPipe();
|
||||||
uint8_t LEDMask = LEDS_NO_LEDS;
|
uint8_t LEDMask = LEDS_NO_LEDS;
|
||||||
|
|
||||||
if (NextReceivedByte & 0x01)
|
if (NextReceivedByte & 0x01)
|
||||||
LEDMask |= LEDS_LED1;
|
LEDMask |= LEDS_LED1;
|
||||||
|
|
||||||
if (NextReceivedByte & 0x02)
|
if (NextReceivedByte & 0x02)
|
||||||
LEDMask |= LEDS_LED2;
|
LEDMask |= LEDS_LED2;
|
||||||
|
|
||||||
if (NextReceivedByte & 0x04)
|
if (NextReceivedByte & 0x04)
|
||||||
LEDMask |= LEDS_LED3;
|
LEDMask |= LEDS_LED3;
|
||||||
|
|
||||||
if (NextReceivedByte & 0x08)
|
if (NextReceivedByte & 0x08)
|
||||||
LEDMask |= LEDS_LED4;
|
LEDMask |= LEDS_LED4;
|
||||||
|
|
||||||
LEDs_SetAllLEDs(LEDMask);
|
LEDs_SetAllLEDs(LEDMask);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* Clear the pipe after all data in the packet has been read, ready for the next packet */
|
/* Clear the pipe after all data in the packet has been read, ready for the next packet */
|
||||||
Pipe_ClearIN();
|
Pipe_ClearIN();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Re-freeze IN pipe after use */
|
/* Re-freeze IN pipe after use */
|
||||||
Pipe_Freeze();
|
Pipe_Freeze();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,95 +1,95 @@
|
|||||||
/*
|
/*
|
||||||
LUFA Library
|
LUFA Library
|
||||||
Copyright (C) Dean Camera, 2011.
|
Copyright (C) Dean Camera, 2011.
|
||||||
|
|
||||||
dean [at] fourwalledcubicle [dot] com
|
dean [at] fourwalledcubicle [dot] com
|
||||||
www.lufa-lib.org
|
www.lufa-lib.org
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com)
|
Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com)
|
||||||
|
|
||||||
Permission to use, copy, modify, distribute, and sell this
|
Permission to use, copy, modify, distribute, and sell this
|
||||||
software and its documentation for any purpose is hereby granted
|
software and its documentation for any purpose is hereby granted
|
||||||
without fee, provided that the above copyright notice appear in
|
without fee, provided that the above copyright notice appear in
|
||||||
all copies and that both that the copyright notice and this
|
all copies and that both that the copyright notice and this
|
||||||
permission notice and warranty disclaimer appear in supporting
|
permission notice and warranty disclaimer appear in supporting
|
||||||
documentation, and that the name of the author not be used in
|
documentation, and that the name of the author not be used in
|
||||||
advertising or publicity pertaining to distribution of the
|
advertising or publicity pertaining to distribution of the
|
||||||
software without specific, written prior permission.
|
software without specific, written prior permission.
|
||||||
|
|
||||||
The author disclaim all warranties with regard to this
|
The author disclaim all warranties with regard to this
|
||||||
software, including all implied warranties of merchantability
|
software, including all implied warranties of merchantability
|
||||||
and fitness. In no event shall the author be liable for any
|
and fitness. In no event shall the author be liable for any
|
||||||
special, indirect or consequential damages or any damages
|
special, indirect or consequential damages or any damages
|
||||||
whatsoever resulting from loss of use, data or profits, whether
|
whatsoever resulting from loss of use, data or profits, whether
|
||||||
in an action of contract, negligence or other tortious action,
|
in an action of contract, negligence or other tortious action,
|
||||||
arising out of or in connection with the use or performance of
|
arising out of or in connection with the use or performance of
|
||||||
this software.
|
this software.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/** \file
|
/** \file
|
||||||
*
|
*
|
||||||
* Header file for AndroidAccessoryHost.c.
|
* Header file for AndroidAccessoryHost.c.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _ANDROID_ACCESSORY_HOST_H_
|
#ifndef _ANDROID_ACCESSORY_HOST_H_
|
||||||
#define _ANDROID_ACCESSORY_HOST_H_
|
#define _ANDROID_ACCESSORY_HOST_H_
|
||||||
|
|
||||||
/* Includes: */
|
/* Includes: */
|
||||||
#include <avr/io.h>
|
#include <avr/io.h>
|
||||||
#include <avr/wdt.h>
|
#include <avr/wdt.h>
|
||||||
#include <avr/pgmspace.h>
|
#include <avr/pgmspace.h>
|
||||||
#include <avr/power.h>
|
#include <avr/power.h>
|
||||||
#include <avr/interrupt.h>
|
#include <avr/interrupt.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
#include "DeviceDescriptor.h"
|
#include "DeviceDescriptor.h"
|
||||||
#include "ConfigDescriptor.h"
|
#include "ConfigDescriptor.h"
|
||||||
|
|
||||||
#include <LUFA/Version.h>
|
#include <LUFA/Version.h>
|
||||||
#include <LUFA/Drivers/Misc/TerminalCodes.h>
|
#include <LUFA/Drivers/Misc/TerminalCodes.h>
|
||||||
#include <LUFA/Drivers/USB/USB.h>
|
#include <LUFA/Drivers/USB/USB.h>
|
||||||
#include <LUFA/Drivers/Peripheral/Serial.h>
|
#include <LUFA/Drivers/Peripheral/Serial.h>
|
||||||
#include <LUFA/Drivers/Board/LEDs.h>
|
#include <LUFA/Drivers/Board/LEDs.h>
|
||||||
|
|
||||||
/* Macros: */
|
/* Macros: */
|
||||||
/** LED mask for the library LED driver, to indicate that the USB interface is not ready. */
|
/** LED mask for the library LED driver, to indicate that the USB interface is not ready. */
|
||||||
#define LEDMASK_USB_NOTREADY LEDS_LED1
|
#define LEDMASK_USB_NOTREADY LEDS_LED1
|
||||||
|
|
||||||
/** LED mask for the library LED driver, to indicate that the USB interface is enumerating. */
|
/** LED mask for the library LED driver, to indicate that the USB interface is enumerating. */
|
||||||
#define LEDMASK_USB_ENUMERATING (LEDS_LED2 | LEDS_LED3)
|
#define LEDMASK_USB_ENUMERATING (LEDS_LED2 | LEDS_LED3)
|
||||||
|
|
||||||
/** LED mask for the library LED driver, to indicate that the USB interface is ready. */
|
/** LED mask for the library LED driver, to indicate that the USB interface is ready. */
|
||||||
#define LEDMASK_USB_READY (LEDS_LED2 | LEDS_LED4)
|
#define LEDMASK_USB_READY (LEDS_LED2 | LEDS_LED4)
|
||||||
|
|
||||||
/** LED mask for the library LED driver, to indicate that an error has occurred in the USB interface. */
|
/** LED mask for the library LED driver, to indicate that an error has occurred in the USB interface. */
|
||||||
#define LEDMASK_USB_ERROR (LEDS_LED1 | LEDS_LED3)
|
#define LEDMASK_USB_ERROR (LEDS_LED1 | LEDS_LED3)
|
||||||
|
|
||||||
/** LED mask for the library LED driver, to indicate that the USB interface is busy. */
|
/** LED mask for the library LED driver, to indicate that the USB interface is busy. */
|
||||||
#define LEDMASK_USB_BUSY LEDS_LED2
|
#define LEDMASK_USB_BUSY LEDS_LED2
|
||||||
|
|
||||||
/* Enums: */
|
/* Enums: */
|
||||||
enum Android_Requests_t
|
enum Android_Requests_t
|
||||||
{
|
{
|
||||||
ANDROID_Req_GetAccessoryProtocol = 51,
|
ANDROID_Req_GetAccessoryProtocol = 51,
|
||||||
ANDROID_Req_GetString = 52,
|
ANDROID_Req_GetString = 52,
|
||||||
ANDROID_Req_StartAccessoryMode = 53,
|
ANDROID_Req_StartAccessoryMode = 53,
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Task Definitions: */
|
/* Task Definitions: */
|
||||||
void Android_Host_Task(void);
|
void Android_Host_Task(void);
|
||||||
|
|
||||||
/* Event Handlers: */
|
/* Event Handlers: */
|
||||||
void EVENT_USB_Host_DeviceAttached(void);
|
void EVENT_USB_Host_DeviceAttached(void);
|
||||||
void EVENT_USB_Host_DeviceUnattached(void);
|
void EVENT_USB_Host_DeviceUnattached(void);
|
||||||
void EVENT_USB_Host_DeviceEnumerationComplete(void);
|
void EVENT_USB_Host_DeviceEnumerationComplete(void);
|
||||||
void EVENT_USB_Host_HostError(const uint8_t ErrorCode);
|
void EVENT_USB_Host_HostError(const uint8_t ErrorCode);
|
||||||
void EVENT_USB_Host_DeviceEnumerationFailed(const uint8_t ErrorCode,
|
void EVENT_USB_Host_DeviceEnumerationFailed(const uint8_t ErrorCode,
|
||||||
const uint8_t SubErrorCode);
|
const uint8_t SubErrorCode);
|
||||||
|
|
||||||
/* Function Prototypes: */
|
/* Function Prototypes: */
|
||||||
void SetupHardware(void);
|
void SetupHardware(void);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -1,138 +1,138 @@
|
|||||||
/*
|
/*
|
||||||
LUFA Library
|
LUFA Library
|
||||||
Copyright (C) Dean Camera, 2011.
|
Copyright (C) Dean Camera, 2011.
|
||||||
|
|
||||||
dean [at] fourwalledcubicle [dot] com
|
dean [at] fourwalledcubicle [dot] com
|
||||||
www.lufa-lib.org
|
www.lufa-lib.org
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com)
|
Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com)
|
||||||
|
|
||||||
Permission to use, copy, modify, distribute, and sell this
|
Permission to use, copy, modify, distribute, and sell this
|
||||||
software and its documentation for any purpose is hereby granted
|
software and its documentation for any purpose is hereby granted
|
||||||
without fee, provided that the above copyright notice appear in
|
without fee, provided that the above copyright notice appear in
|
||||||
all copies and that both that the copyright notice and this
|
all copies and that both that the copyright notice and this
|
||||||
permission notice and warranty disclaimer appear in supporting
|
permission notice and warranty disclaimer appear in supporting
|
||||||
documentation, and that the name of the author not be used in
|
documentation, and that the name of the author not be used in
|
||||||
advertising or publicity pertaining to distribution of the
|
advertising or publicity pertaining to distribution of the
|
||||||
software without specific, written prior permission.
|
software without specific, written prior permission.
|
||||||
|
|
||||||
The author disclaim all warranties with regard to this
|
The author disclaim all warranties with regard to this
|
||||||
software, including all implied warranties of merchantability
|
software, including all implied warranties of merchantability
|
||||||
and fitness. In no event shall the author be liable for any
|
and fitness. In no event shall the author be liable for any
|
||||||
special, indirect or consequential damages or any damages
|
special, indirect or consequential damages or any damages
|
||||||
whatsoever resulting from loss of use, data or profits, whether
|
whatsoever resulting from loss of use, data or profits, whether
|
||||||
in an action of contract, negligence or other tortious action,
|
in an action of contract, negligence or other tortious action,
|
||||||
arising out of or in connection with the use or performance of
|
arising out of or in connection with the use or performance of
|
||||||
this software.
|
this software.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/** \file
|
/** \file
|
||||||
*
|
*
|
||||||
* USB Device Configuration Descriptor processing routines, to determine the correct pipe configurations
|
* USB Device Configuration Descriptor processing routines, to determine the correct pipe configurations
|
||||||
* needed to communication with an attached USB device. Descriptors are special computer-readable structures
|
* needed to communication with an attached USB device. Descriptors are special computer-readable structures
|
||||||
* which the host requests upon device enumeration, to determine the device's capabilities and functions.
|
* which the host requests upon device enumeration, to determine the device's capabilities and functions.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "ConfigDescriptor.h"
|
#include "ConfigDescriptor.h"
|
||||||
|
|
||||||
/** Reads and processes an attached device's descriptors, to determine compatibility and pipe configurations. This
|
/** Reads and processes an attached device's descriptors, to determine compatibility and pipe configurations. This
|
||||||
* routine will read in the entire configuration descriptor, and configure the hosts pipes to correctly communicate
|
* routine will read in the entire configuration descriptor, and configure the hosts pipes to correctly communicate
|
||||||
* with compatible devices.
|
* with compatible devices.
|
||||||
*
|
*
|
||||||
* This routine searches for the first interface containing bulk IN and OUT data endpoints.
|
* This routine searches for the first interface containing bulk IN and OUT data endpoints.
|
||||||
*
|
*
|
||||||
* \return An error code from the \ref AndroidHost_GetConfigDescriptorDataCodes_t enum.
|
* \return An error code from the \ref AndroidHost_GetConfigDescriptorDataCodes_t enum.
|
||||||
*/
|
*/
|
||||||
uint8_t ProcessConfigurationDescriptor(void)
|
uint8_t ProcessConfigurationDescriptor(void)
|
||||||
{
|
{
|
||||||
uint8_t ConfigDescriptorData[512];
|
uint8_t ConfigDescriptorData[512];
|
||||||
void* CurrConfigLocation = ConfigDescriptorData;
|
void* CurrConfigLocation = ConfigDescriptorData;
|
||||||
uint16_t CurrConfigBytesRem;
|
uint16_t CurrConfigBytesRem;
|
||||||
|
|
||||||
USB_Descriptor_Endpoint_t* DataINEndpoint = NULL;
|
USB_Descriptor_Endpoint_t* DataINEndpoint = NULL;
|
||||||
USB_Descriptor_Endpoint_t* DataOUTEndpoint = NULL;
|
USB_Descriptor_Endpoint_t* DataOUTEndpoint = NULL;
|
||||||
|
|
||||||
/* Retrieve the entire configuration descriptor into the allocated buffer */
|
/* Retrieve the entire configuration descriptor into the allocated buffer */
|
||||||
switch (USB_Host_GetDeviceConfigDescriptor(1, &CurrConfigBytesRem, ConfigDescriptorData, sizeof(ConfigDescriptorData)))
|
switch (USB_Host_GetDeviceConfigDescriptor(1, &CurrConfigBytesRem, ConfigDescriptorData, sizeof(ConfigDescriptorData)))
|
||||||
{
|
{
|
||||||
case HOST_GETCONFIG_Successful:
|
case HOST_GETCONFIG_Successful:
|
||||||
break;
|
break;
|
||||||
case HOST_GETCONFIG_InvalidData:
|
case HOST_GETCONFIG_InvalidData:
|
||||||
return InvalidConfigDataReturned;
|
return InvalidConfigDataReturned;
|
||||||
case HOST_GETCONFIG_BuffOverflow:
|
case HOST_GETCONFIG_BuffOverflow:
|
||||||
return DescriptorTooLarge;
|
return DescriptorTooLarge;
|
||||||
default:
|
default:
|
||||||
return DevControlError;
|
return DevControlError;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* The Android Accessory Mode specification mandates that the accessory communications endpoints
|
/* The Android Accessory Mode specification mandates that the accessory communications endpoints
|
||||||
be in the first interface descriptor (interface 0) */
|
be in the first interface descriptor (interface 0) */
|
||||||
USB_GetNextDescriptorOfType(&CurrConfigBytesRem, &CurrConfigLocation, DTYPE_Interface);
|
USB_GetNextDescriptorOfType(&CurrConfigBytesRem, &CurrConfigLocation, DTYPE_Interface);
|
||||||
|
|
||||||
/* Ensure that an interface was found, and the end of the descriptor was not reached */
|
/* Ensure that an interface was found, and the end of the descriptor was not reached */
|
||||||
if (!(CurrConfigBytesRem))
|
if (!(CurrConfigBytesRem))
|
||||||
return NoCompatibleInterfaceFound;
|
return NoCompatibleInterfaceFound;
|
||||||
|
|
||||||
while (!(DataINEndpoint) || !(DataOUTEndpoint))
|
while (!(DataINEndpoint) || !(DataOUTEndpoint))
|
||||||
{
|
{
|
||||||
/* Get the next Still Image interface's data endpoint descriptor */
|
/* Get the next Still Image interface's data endpoint descriptor */
|
||||||
if (USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation,
|
if (USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation,
|
||||||
DCOMP_NextInterfaceBulkEndpoint) != DESCRIPTOR_SEARCH_COMP_Found)
|
DCOMP_NextInterfaceBulkEndpoint) != DESCRIPTOR_SEARCH_COMP_Found)
|
||||||
{
|
{
|
||||||
/* Data endpoints not found within the first Android Accessory device interface, error out */
|
/* Data endpoints not found within the first Android Accessory device interface, error out */
|
||||||
return NoCompatibleInterfaceFound;
|
return NoCompatibleInterfaceFound;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Retrieve the endpoint address from the endpoint descriptor */
|
/* Retrieve the endpoint address from the endpoint descriptor */
|
||||||
USB_Descriptor_Endpoint_t* EndpointData = DESCRIPTOR_PCAST(CurrConfigLocation, USB_Descriptor_Endpoint_t);
|
USB_Descriptor_Endpoint_t* EndpointData = DESCRIPTOR_PCAST(CurrConfigLocation, USB_Descriptor_Endpoint_t);
|
||||||
|
|
||||||
/* If the endpoint is a IN type endpoint */
|
/* If the endpoint is a IN type endpoint */
|
||||||
if (EndpointData->EndpointAddress & ENDPOINT_DESCRIPTOR_DIR_IN)
|
if (EndpointData->EndpointAddress & ENDPOINT_DESCRIPTOR_DIR_IN)
|
||||||
DataINEndpoint = EndpointData;
|
DataINEndpoint = EndpointData;
|
||||||
else
|
else
|
||||||
DataOUTEndpoint = EndpointData;
|
DataOUTEndpoint = EndpointData;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Configure the Android Accessory data IN pipe */
|
/* Configure the Android Accessory data IN pipe */
|
||||||
Pipe_ConfigurePipe(ANDROID_DATA_IN_PIPE, EP_TYPE_BULK, PIPE_TOKEN_IN,
|
Pipe_ConfigurePipe(ANDROID_DATA_IN_PIPE, EP_TYPE_BULK, PIPE_TOKEN_IN,
|
||||||
DataINEndpoint->EndpointAddress, DataINEndpoint->EndpointSize, PIPE_BANK_SINGLE);
|
DataINEndpoint->EndpointAddress, DataINEndpoint->EndpointSize, PIPE_BANK_SINGLE);
|
||||||
|
|
||||||
/* Configure the Android Accessory data OUT pipe */
|
/* Configure the Android Accessory data OUT pipe */
|
||||||
Pipe_ConfigurePipe(ANDROID_DATA_OUT_PIPE, EP_TYPE_BULK, PIPE_TOKEN_OUT,
|
Pipe_ConfigurePipe(ANDROID_DATA_OUT_PIPE, EP_TYPE_BULK, PIPE_TOKEN_OUT,
|
||||||
DataOUTEndpoint->EndpointAddress, DataOUTEndpoint->EndpointSize, PIPE_BANK_SINGLE);
|
DataOUTEndpoint->EndpointAddress, DataOUTEndpoint->EndpointSize, PIPE_BANK_SINGLE);
|
||||||
|
|
||||||
/* Valid data found, return success */
|
/* Valid data found, return success */
|
||||||
return SuccessfulConfigRead;
|
return SuccessfulConfigRead;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Descriptor comparator function. This comparator function is can be called while processing an attached USB device's
|
/** Descriptor comparator function. This comparator function is can be called while processing an attached USB device's
|
||||||
* configuration descriptor, to search for a specific sub descriptor. It can also be used to abort the configuration
|
* configuration descriptor, to search for a specific sub descriptor. It can also be used to abort the configuration
|
||||||
* descriptor processing if an incompatible descriptor configuration is found.
|
* descriptor processing if an incompatible descriptor configuration is found.
|
||||||
*
|
*
|
||||||
* This comparator searches for the next Endpoint descriptor inside the current interface descriptor, aborting the
|
* This comparator searches for the next Endpoint descriptor inside the current interface descriptor, aborting the
|
||||||
* search if another interface descriptor is found before the required endpoint.
|
* search if another interface descriptor is found before the required endpoint.
|
||||||
*
|
*
|
||||||
* \return A value from the DSEARCH_Return_ErrorCodes_t enum
|
* \return A value from the DSEARCH_Return_ErrorCodes_t enum
|
||||||
*/
|
*/
|
||||||
uint8_t DCOMP_NextInterfaceBulkEndpoint(void* const CurrentDescriptor)
|
uint8_t DCOMP_NextInterfaceBulkEndpoint(void* const CurrentDescriptor)
|
||||||
{
|
{
|
||||||
USB_Descriptor_Header_t* Header = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Header_t);
|
USB_Descriptor_Header_t* Header = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Header_t);
|
||||||
|
|
||||||
if (Header->Type == DTYPE_Endpoint)
|
if (Header->Type == DTYPE_Endpoint)
|
||||||
{
|
{
|
||||||
USB_Descriptor_Endpoint_t* Endpoint = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Endpoint_t);
|
USB_Descriptor_Endpoint_t* Endpoint = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Endpoint_t);
|
||||||
|
|
||||||
uint8_t EndpointType = (Endpoint->Attributes & EP_TYPE_MASK);
|
uint8_t EndpointType = (Endpoint->Attributes & EP_TYPE_MASK);
|
||||||
if ((EndpointType == EP_TYPE_BULK) && (!(Pipe_IsEndpointBound(Endpoint->EndpointAddress))))
|
if ((EndpointType == EP_TYPE_BULK) && (!(Pipe_IsEndpointBound(Endpoint->EndpointAddress))))
|
||||||
return DESCRIPTOR_SEARCH_Found;
|
return DESCRIPTOR_SEARCH_Found;
|
||||||
}
|
}
|
||||||
else if (Header->Type == DTYPE_Interface)
|
else if (Header->Type == DTYPE_Interface)
|
||||||
{
|
{
|
||||||
return DESCRIPTOR_SEARCH_Fail;
|
return DESCRIPTOR_SEARCH_Fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
return DESCRIPTOR_SEARCH_NotFound;
|
return DESCRIPTOR_SEARCH_NotFound;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,63 +1,63 @@
|
|||||||
/*
|
/*
|
||||||
LUFA Library
|
LUFA Library
|
||||||
Copyright (C) Dean Camera, 2011.
|
Copyright (C) Dean Camera, 2011.
|
||||||
|
|
||||||
dean [at] fourwalledcubicle [dot] com
|
dean [at] fourwalledcubicle [dot] com
|
||||||
www.lufa-lib.org
|
www.lufa-lib.org
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com)
|
Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com)
|
||||||
|
|
||||||
Permission to use, copy, modify, distribute, and sell this
|
Permission to use, copy, modify, distribute, and sell this
|
||||||
software and its documentation for any purpose is hereby granted
|
software and its documentation for any purpose is hereby granted
|
||||||
without fee, provided that the above copyright notice appear in
|
without fee, provided that the above copyright notice appear in
|
||||||
all copies and that both that the copyright notice and this
|
all copies and that both that the copyright notice and this
|
||||||
permission notice and warranty disclaimer appear in supporting
|
permission notice and warranty disclaimer appear in supporting
|
||||||
documentation, and that the name of the author not be used in
|
documentation, and that the name of the author not be used in
|
||||||
advertising or publicity pertaining to distribution of the
|
advertising or publicity pertaining to distribution of the
|
||||||
software without specific, written prior permission.
|
software without specific, written prior permission.
|
||||||
|
|
||||||
The author disclaim all warranties with regard to this
|
The author disclaim all warranties with regard to this
|
||||||
software, including all implied warranties of merchantability
|
software, including all implied warranties of merchantability
|
||||||
and fitness. In no event shall the author be liable for any
|
and fitness. In no event shall the author be liable for any
|
||||||
special, indirect or consequential damages or any damages
|
special, indirect or consequential damages or any damages
|
||||||
whatsoever resulting from loss of use, data or profits, whether
|
whatsoever resulting from loss of use, data or profits, whether
|
||||||
in an action of contract, negligence or other tortious action,
|
in an action of contract, negligence or other tortious action,
|
||||||
arising out of or in connection with the use or performance of
|
arising out of or in connection with the use or performance of
|
||||||
this software.
|
this software.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/** \file
|
/** \file
|
||||||
*
|
*
|
||||||
* Header file for ConfigDescriptor.c.
|
* Header file for ConfigDescriptor.c.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _CONFIGDESCRIPTOR_H_
|
#ifndef _CONFIGDESCRIPTOR_H_
|
||||||
#define _CONFIGDESCRIPTOR_H_
|
#define _CONFIGDESCRIPTOR_H_
|
||||||
|
|
||||||
/* Includes: */
|
/* Includes: */
|
||||||
#include <LUFA/Drivers/USB/USB.h>
|
#include <LUFA/Drivers/USB/USB.h>
|
||||||
|
|
||||||
/* Macros: */
|
/* Macros: */
|
||||||
#define ANDROID_DATA_IN_PIPE 1
|
#define ANDROID_DATA_IN_PIPE 1
|
||||||
#define ANDROID_DATA_OUT_PIPE 2
|
#define ANDROID_DATA_OUT_PIPE 2
|
||||||
|
|
||||||
/* Enums: */
|
/* Enums: */
|
||||||
/** Enum for the possible return codes of the \ref ProcessConfigurationDescriptor() function. */
|
/** Enum for the possible return codes of the \ref ProcessConfigurationDescriptor() function. */
|
||||||
enum AndroidHost_GetConfigDescriptorDataCodes_t
|
enum AndroidHost_GetConfigDescriptorDataCodes_t
|
||||||
{
|
{
|
||||||
SuccessfulConfigRead = 0, /**< Configuration Descriptor was processed successfully */
|
SuccessfulConfigRead = 0, /**< Configuration Descriptor was processed successfully */
|
||||||
DevControlError = 1, /**< A control request to the device failed to complete successfully */
|
DevControlError = 1, /**< A control request to the device failed to complete successfully */
|
||||||
DescriptorTooLarge = 2, /**< The device's Configuration Descriptor is too large to process */
|
DescriptorTooLarge = 2, /**< The device's Configuration Descriptor is too large to process */
|
||||||
InvalidConfigDataReturned = 3, /**< The device returned an invalid Configuration Descriptor */
|
InvalidConfigDataReturned = 3, /**< The device returned an invalid Configuration Descriptor */
|
||||||
NoCompatibleInterfaceFound = 4, /**< A compatible interface with the required endpoints was not found */
|
NoCompatibleInterfaceFound = 4, /**< A compatible interface with the required endpoints was not found */
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Function Prototypes: */
|
/* Function Prototypes: */
|
||||||
uint8_t ProcessConfigurationDescriptor(void);
|
uint8_t ProcessConfigurationDescriptor(void);
|
||||||
|
|
||||||
uint8_t DCOMP_NextInterfaceBulkEndpoint(void* CurrentDescriptor);
|
uint8_t DCOMP_NextInterfaceBulkEndpoint(void* CurrentDescriptor);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -1,70 +1,70 @@
|
|||||||
/*
|
/*
|
||||||
LUFA Library
|
LUFA Library
|
||||||
Copyright (C) Dean Camera, 2011.
|
Copyright (C) Dean Camera, 2011.
|
||||||
|
|
||||||
dean [at] fourwalledcubicle [dot] com
|
dean [at] fourwalledcubicle [dot] com
|
||||||
www.lufa-lib.org
|
www.lufa-lib.org
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com)
|
Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com)
|
||||||
|
|
||||||
Permission to use, copy, modify, distribute, and sell this
|
Permission to use, copy, modify, distribute, and sell this
|
||||||
software and its documentation for any purpose is hereby granted
|
software and its documentation for any purpose is hereby granted
|
||||||
without fee, provided that the above copyright notice appear in
|
without fee, provided that the above copyright notice appear in
|
||||||
all copies and that both that the copyright notice and this
|
all copies and that both that the copyright notice and this
|
||||||
permission notice and warranty disclaimer appear in supporting
|
permission notice and warranty disclaimer appear in supporting
|
||||||
documentation, and that the name of the author not be used in
|
documentation, and that the name of the author not be used in
|
||||||
advertising or publicity pertaining to distribution of the
|
advertising or publicity pertaining to distribution of the
|
||||||
software without specific, written prior permission.
|
software without specific, written prior permission.
|
||||||
|
|
||||||
The author disclaim all warranties with regard to this
|
The author disclaim all warranties with regard to this
|
||||||
software, including all implied warranties of merchantability
|
software, including all implied warranties of merchantability
|
||||||
and fitness. In no event shall the author be liable for any
|
and fitness. In no event shall the author be liable for any
|
||||||
special, indirect or consequential damages or any damages
|
special, indirect or consequential damages or any damages
|
||||||
whatsoever resulting from loss of use, data or profits, whether
|
whatsoever resulting from loss of use, data or profits, whether
|
||||||
in an action of contract, negligence or other tortious action,
|
in an action of contract, negligence or other tortious action,
|
||||||
arising out of or in connection with the use or performance of
|
arising out of or in connection with the use or performance of
|
||||||
this software.
|
this software.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/** \file
|
/** \file
|
||||||
*
|
*
|
||||||
* USB Device Descriptor processing routines, to determine the overall device parameters. Descriptors are special
|
* USB Device Descriptor processing routines, to determine the overall device parameters. Descriptors are special
|
||||||
* computer-readable structures which the host requests upon device enumeration, to determine information about
|
* computer-readable structures which the host requests upon device enumeration, to determine information about
|
||||||
* the attached device.
|
* the attached device.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "DeviceDescriptor.h"
|
#include "DeviceDescriptor.h"
|
||||||
|
|
||||||
/** Reads and processes an attached device's Device Descriptor, to determine compatibility
|
/** Reads and processes an attached device's Device Descriptor, to determine compatibility
|
||||||
*
|
*
|
||||||
* This routine checks to ensure that the attached device's VID and PID matches Google's for Android devices.
|
* This routine checks to ensure that the attached device's VID and PID matches Google's for Android devices.
|
||||||
*
|
*
|
||||||
* \return An error code from the \ref BluetoothHost_GetDeviceDescriptorDataCodes_t enum.
|
* \return An error code from the \ref BluetoothHost_GetDeviceDescriptorDataCodes_t enum.
|
||||||
*/
|
*/
|
||||||
uint8_t ProcessDeviceDescriptor(void)
|
uint8_t ProcessDeviceDescriptor(void)
|
||||||
{
|
{
|
||||||
USB_Descriptor_Device_t DeviceDescriptor;
|
USB_Descriptor_Device_t DeviceDescriptor;
|
||||||
|
|
||||||
/* Send the request to retrieve the device descriptor */
|
/* Send the request to retrieve the device descriptor */
|
||||||
if (USB_Host_GetDeviceDescriptor(&DeviceDescriptor) != HOST_SENDCONTROL_Successful)
|
if (USB_Host_GetDeviceDescriptor(&DeviceDescriptor) != HOST_SENDCONTROL_Successful)
|
||||||
return DevControlError;
|
return DevControlError;
|
||||||
|
|
||||||
/* Validate returned data - ensure the returned data is a device descriptor */
|
/* Validate returned data - ensure the returned data is a device descriptor */
|
||||||
if (DeviceDescriptor.Header.Type != DTYPE_Device)
|
if (DeviceDescriptor.Header.Type != DTYPE_Device)
|
||||||
return InvalidDeviceDataReturned;
|
return InvalidDeviceDataReturned;
|
||||||
|
|
||||||
/* Validate returned device Class, SubClass and Protocol values against the Bluetooth spec values */
|
/* Validate returned device Class, SubClass and Protocol values against the Bluetooth spec values */
|
||||||
if (DeviceDescriptor.VendorID != ANDROID_VENDOR_ID)
|
if (DeviceDescriptor.VendorID != ANDROID_VENDOR_ID)
|
||||||
return IncorrectAndroidDevice;
|
return IncorrectAndroidDevice;
|
||||||
|
|
||||||
if ((DeviceDescriptor.ProductID != ANDROID_ACCESSORY_PRODUCT_ID) ||
|
if ((DeviceDescriptor.ProductID != ANDROID_ACCESSORY_PRODUCT_ID) ||
|
||||||
(DeviceDescriptor.ProductID != ANDROID_ACCESSORY_ADB_PRODUCT_ID))
|
(DeviceDescriptor.ProductID != ANDROID_ACCESSORY_ADB_PRODUCT_ID))
|
||||||
{
|
{
|
||||||
return NonAccessoryModeAndroidDevice;
|
return NonAccessoryModeAndroidDevice;
|
||||||
}
|
}
|
||||||
|
|
||||||
return AccessoryModeAndroidDevice;
|
return AccessoryModeAndroidDevice;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,65 +1,65 @@
|
|||||||
/*
|
/*
|
||||||
LUFA Library
|
LUFA Library
|
||||||
Copyright (C) Dean Camera, 2011.
|
Copyright (C) Dean Camera, 2011.
|
||||||
|
|
||||||
dean [at] fourwalledcubicle [dot] com
|
dean [at] fourwalledcubicle [dot] com
|
||||||
www.lufa-lib.org
|
www.lufa-lib.org
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com)
|
Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com)
|
||||||
|
|
||||||
Permission to use, copy, modify, distribute, and sell this
|
Permission to use, copy, modify, distribute, and sell this
|
||||||
software and its documentation for any purpose is hereby granted
|
software and its documentation for any purpose is hereby granted
|
||||||
without fee, provided that the above copyright notice appear in
|
without fee, provided that the above copyright notice appear in
|
||||||
all copies and that both that the copyright notice and this
|
all copies and that both that the copyright notice and this
|
||||||
permission notice and warranty disclaimer appear in supporting
|
permission notice and warranty disclaimer appear in supporting
|
||||||
documentation, and that the name of the author not be used in
|
documentation, and that the name of the author not be used in
|
||||||
advertising or publicity pertaining to distribution of the
|
advertising or publicity pertaining to distribution of the
|
||||||
software without specific, written prior permission.
|
software without specific, written prior permission.
|
||||||
|
|
||||||
The author disclaim all warranties with regard to this
|
The author disclaim all warranties with regard to this
|
||||||
software, including all implied warranties of merchantability
|
software, including all implied warranties of merchantability
|
||||||
and fitness. In no event shall the author be liable for any
|
and fitness. In no event shall the author be liable for any
|
||||||
special, indirect or consequential damages or any damages
|
special, indirect or consequential damages or any damages
|
||||||
whatsoever resulting from loss of use, data or profits, whether
|
whatsoever resulting from loss of use, data or profits, whether
|
||||||
in an action of contract, negligence or other tortious action,
|
in an action of contract, negligence or other tortious action,
|
||||||
arising out of or in connection with the use or performance of
|
arising out of or in connection with the use or performance of
|
||||||
this software.
|
this software.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/** \file
|
/** \file
|
||||||
*
|
*
|
||||||
* Header file for DeviceDescriptor.c.
|
* Header file for DeviceDescriptor.c.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _DEVICEDESCRIPTOR_H_
|
#ifndef _DEVICEDESCRIPTOR_H_
|
||||||
#define _DEVICEDESCRIPTOR_H_
|
#define _DEVICEDESCRIPTOR_H_
|
||||||
|
|
||||||
/* Includes: */
|
/* Includes: */
|
||||||
#include <LUFA/Drivers/USB/USB.h>
|
#include <LUFA/Drivers/USB/USB.h>
|
||||||
|
|
||||||
#include "AndroidAccessoryHost.h"
|
#include "AndroidAccessoryHost.h"
|
||||||
|
|
||||||
/* Macros: */
|
/* Macros: */
|
||||||
#define ANDROID_VENDOR_ID 0x18D1
|
#define ANDROID_VENDOR_ID 0x18D1
|
||||||
#define ANDROID_ACCESSORY_PRODUCT_ID 0x2D00
|
#define ANDROID_ACCESSORY_PRODUCT_ID 0x2D00
|
||||||
#define ANDROID_ACCESSORY_ADB_PRODUCT_ID 0x2D01
|
#define ANDROID_ACCESSORY_ADB_PRODUCT_ID 0x2D01
|
||||||
|
|
||||||
/* Enums: */
|
/* Enums: */
|
||||||
/** Enum for the possible return codes of the \ref ProcessDeviceDescriptor() function. */
|
/** Enum for the possible return codes of the \ref ProcessDeviceDescriptor() function. */
|
||||||
enum AndroidHost_GetDeviceDescriptorDataCodes_t
|
enum AndroidHost_GetDeviceDescriptorDataCodes_t
|
||||||
{
|
{
|
||||||
SuccessfulDeviceRead = 0, /**< Device Descriptor was processed successfully */
|
SuccessfulDeviceRead = 0, /**< Device Descriptor was processed successfully */
|
||||||
ControlError = 1, /**< A control request to the device failed to complete successfully */
|
ControlError = 1, /**< A control request to the device failed to complete successfully */
|
||||||
InvalidDeviceDataReturned = 2, /**< The device returned an invalid Device Descriptor */
|
InvalidDeviceDataReturned = 2, /**< The device returned an invalid Device Descriptor */
|
||||||
IncorrectAndroidDevice = 3, /**< The attached device is not an Android device */
|
IncorrectAndroidDevice = 3, /**< The attached device is not an Android device */
|
||||||
NonAccessoryModeAndroidDevice = 4, /**< The attached device is an Android device in non-accessory mode */
|
NonAccessoryModeAndroidDevice = 4, /**< The attached device is an Android device in non-accessory mode */
|
||||||
AccessoryModeAndroidDevice = 5, /**< The attached device is an Android device in accessory mode */
|
AccessoryModeAndroidDevice = 5, /**< The attached device is an Android device in accessory mode */
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Function Prototypes: */
|
/* Function Prototypes: */
|
||||||
uint8_t ProcessDeviceDescriptor(void);
|
uint8_t ProcessDeviceDescriptor(void);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -1,715 +1,715 @@
|
|||||||
# Hey Emacs, this is a -*- makefile -*-
|
# Hey Emacs, this is a -*- makefile -*-
|
||||||
#----------------------------------------------------------------------------
|
#----------------------------------------------------------------------------
|
||||||
# WinAVR Makefile Template written by Eric B. Weddington, Jörg Wunsch, et al.
|
# WinAVR Makefile Template written by Eric B. Weddington, Jörg Wunsch, et al.
|
||||||
# >> Modified for use with the LUFA project. <<
|
# >> Modified for use with the LUFA project. <<
|
||||||
#
|
#
|
||||||
# Released to the Public Domain
|
# Released to the Public Domain
|
||||||
#
|
#
|
||||||
# Additional material for this makefile was written by:
|
# Additional material for this makefile was written by:
|
||||||
# Peter Fleury
|
# Peter Fleury
|
||||||
# Tim Henigan
|
# Tim Henigan
|
||||||
# Colin O'Flynn
|
# Colin O'Flynn
|
||||||
# Reiner Patommel
|
# Reiner Patommel
|
||||||
# Markus Pfaff
|
# Markus Pfaff
|
||||||
# Sander Pool
|
# Sander Pool
|
||||||
# Frederik Rouleau
|
# Frederik Rouleau
|
||||||
# Carlos Lamas
|
# Carlos Lamas
|
||||||
# Dean Camera
|
# Dean Camera
|
||||||
# Opendous Inc.
|
# Opendous Inc.
|
||||||
# Denver Gingerich
|
# Denver Gingerich
|
||||||
#
|
#
|
||||||
#----------------------------------------------------------------------------
|
#----------------------------------------------------------------------------
|
||||||
# On command line:
|
# On command line:
|
||||||
#
|
#
|
||||||
# make all = Make software.
|
# make all = Make software.
|
||||||
#
|
#
|
||||||
# make clean = Clean out built project files.
|
# make clean = Clean out built project files.
|
||||||
#
|
#
|
||||||
# make coff = Convert ELF to AVR COFF.
|
# make coff = Convert ELF to AVR COFF.
|
||||||
#
|
#
|
||||||
# make extcoff = Convert ELF to AVR Extended COFF.
|
# make extcoff = Convert ELF to AVR Extended COFF.
|
||||||
#
|
#
|
||||||
# make program = Download the hex file to the device, using avrdude.
|
# make program = Download the hex file to the device, using avrdude.
|
||||||
# Please customize the avrdude settings below first!
|
# Please customize the avrdude settings below first!
|
||||||
#
|
#
|
||||||
# make dfu = Download the hex file to the device, using dfu-programmer (must
|
# make dfu = Download the hex file to the device, using dfu-programmer (must
|
||||||
# have dfu-programmer installed).
|
# have dfu-programmer installed).
|
||||||
#
|
#
|
||||||
# make flip = Download the hex file to the device, using Atmel FLIP (must
|
# make flip = Download the hex file to the device, using Atmel FLIP (must
|
||||||
# have Atmel FLIP installed).
|
# have Atmel FLIP installed).
|
||||||
#
|
#
|
||||||
# make dfu-ee = Download the eeprom file to the device, using dfu-programmer
|
# make dfu-ee = Download the eeprom file to the device, using dfu-programmer
|
||||||
# (must have dfu-programmer installed).
|
# (must have dfu-programmer installed).
|
||||||
#
|
#
|
||||||
# make flip-ee = Download the eeprom file to the device, using Atmel FLIP
|
# make flip-ee = Download the eeprom file to the device, using Atmel FLIP
|
||||||
# (must have Atmel FLIP installed).
|
# (must have Atmel FLIP installed).
|
||||||
#
|
#
|
||||||
# make doxygen = Generate DoxyGen documentation for the project (must have
|
# make doxygen = Generate DoxyGen documentation for the project (must have
|
||||||
# DoxyGen installed)
|
# DoxyGen installed)
|
||||||
#
|
#
|
||||||
# make debug = Start either simulavr or avarice as specified for debugging,
|
# make debug = Start either simulavr or avarice as specified for debugging,
|
||||||
# with avr-gdb or avr-insight as the front end 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.s = Just compile filename.c into the assembler code only.
|
||||||
#
|
#
|
||||||
# make filename.i = Create a preprocessed source file for use in submitting
|
# make filename.i = Create a preprocessed source file for use in submitting
|
||||||
# bug reports to the GCC project.
|
# bug reports to the GCC project.
|
||||||
#
|
#
|
||||||
# To rebuild project do "make clean" then "make all".
|
# To rebuild project do "make clean" then "make all".
|
||||||
#----------------------------------------------------------------------------
|
#----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
# MCU name
|
# MCU name
|
||||||
MCU = at90usb1287
|
MCU = at90usb1287
|
||||||
|
|
||||||
|
|
||||||
# Target architecture (see library "Board Types" documentation).
|
# Target architecture (see library "Board Types" documentation).
|
||||||
ARCH = AVR8
|
ARCH = AVR8
|
||||||
|
|
||||||
|
|
||||||
# Target board (see library "Board Types" documentation, NONE for projects not requiring
|
# 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
|
# LUFA board drivers). If USER is selected, put custom board drivers in a directory called
|
||||||
# "Board" inside the application directory.
|
# "Board" inside the application directory.
|
||||||
BOARD = USBKEY
|
BOARD = USBKEY
|
||||||
|
|
||||||
|
|
||||||
# Processor frequency.
|
# Processor frequency.
|
||||||
# This will define a symbol, F_CPU, in all source code files equal to the
|
# 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
|
# 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
|
# 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.
|
# 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
|
# 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
|
# 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
|
# 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
|
# reflect the processor speed set externally so that the code can use accurate
|
||||||
# software delays.
|
# software delays.
|
||||||
F_CPU = 8000000
|
F_CPU = 8000000
|
||||||
|
|
||||||
|
|
||||||
# Input clock frequency.
|
# Input clock frequency.
|
||||||
# This will define a symbol, F_USB, in all source code files equal to the
|
# 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
|
# 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
|
# 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
|
# 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'
|
# 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
|
# at the end, this will be done automatically to create a 32-bit value in your
|
||||||
# source code.
|
# source code.
|
||||||
#
|
#
|
||||||
# If no clock division is performed on the input clock inside the AVR (via the
|
# 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.
|
# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
|
||||||
F_USB = $(F_CPU)
|
F_USB = $(F_CPU)
|
||||||
|
|
||||||
|
|
||||||
# Output format. (can be srec, ihex, binary)
|
# Output format. (can be srec, ihex, binary)
|
||||||
FORMAT = ihex
|
FORMAT = ihex
|
||||||
|
|
||||||
|
|
||||||
# Target file name (without extension).
|
# Target file name (without extension).
|
||||||
TARGET = AndroidAccessoryHost
|
TARGET = AndroidAccessoryHost
|
||||||
|
|
||||||
|
|
||||||
# Object files directory
|
# Object files directory
|
||||||
# To put object files in current directory, use a dot (.), do NOT make
|
# To put object files in current directory, use a dot (.), do NOT make
|
||||||
# this an empty or blank macro!
|
# this an empty or blank macro!
|
||||||
OBJDIR = .
|
OBJDIR = .
|
||||||
|
|
||||||
|
|
||||||
# Path to the LUFA library
|
# Path to the LUFA library
|
||||||
LUFA_PATH = ../../../..
|
LUFA_PATH = ../../../..
|
||||||
|
|
||||||
|
|
||||||
# LUFA library compile-time options and predefined tokens
|
# LUFA library compile-time options and predefined tokens
|
||||||
LUFA_OPTS = -D USB_HOST_ONLY
|
LUFA_OPTS = -D USB_HOST_ONLY
|
||||||
LUFA_OPTS += -D USE_STATIC_OPTIONS="(USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"
|
LUFA_OPTS += -D USE_STATIC_OPTIONS="(USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"
|
||||||
|
|
||||||
|
|
||||||
# Create the LUFA source path variables by including the LUFA root makefile
|
# Create the LUFA source path variables by including the LUFA root makefile
|
||||||
include $(LUFA_PATH)/LUFA/makefile
|
include $(LUFA_PATH)/LUFA/makefile
|
||||||
|
|
||||||
|
|
||||||
# List C source files here. (C dependencies are automatically generated.)
|
# List C source files here. (C dependencies are automatically generated.)
|
||||||
SRC = $(TARGET).c \
|
SRC = $(TARGET).c \
|
||||||
DeviceDescriptor.c \
|
DeviceDescriptor.c \
|
||||||
ConfigDescriptor.c \
|
ConfigDescriptor.c \
|
||||||
$(LUFA_SRC_USB) \
|
$(LUFA_SRC_USB) \
|
||||||
$(LUFA_SRC_SERIAL)
|
$(LUFA_SRC_SERIAL)
|
||||||
|
|
||||||
|
|
||||||
# List C++ source files here. (C dependencies are automatically generated.)
|
# List C++ source files here. (C dependencies are automatically generated.)
|
||||||
CPPSRC =
|
CPPSRC =
|
||||||
|
|
||||||
|
|
||||||
# List Assembler source files here.
|
# List Assembler source files here.
|
||||||
# Make them always end in a capital .S. Files ending in a lowercase .s
|
# Make them always end in a capital .S. Files ending in a lowercase .s
|
||||||
# will not be considered source files but generated files (assembler
|
# will not be considered source files but generated files (assembler
|
||||||
# output from the compiler), and will be deleted upon "make clean"!
|
# output from the compiler), and will be deleted upon "make clean"!
|
||||||
# Even though the DOS/Win* filesystem matches both .s and .S the same,
|
# 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
|
# it will preserve the spelling of the filenames, and gcc itself does
|
||||||
# care about how the name is spelled on its command-line.
|
# care about how the name is spelled on its command-line.
|
||||||
ASRC =
|
ASRC =
|
||||||
|
|
||||||
|
|
||||||
# Optimization level, can be [0, 1, 2, 3, s].
|
# Optimization level, can be [0, 1, 2, 3, s].
|
||||||
# 0 = turn off optimization. s = optimize for size.
|
# 0 = turn off optimization. s = optimize for size.
|
||||||
# (Note: 3 is not always the best optimization level. See avr-libc FAQ.)
|
# (Note: 3 is not always the best optimization level. See avr-libc FAQ.)
|
||||||
OPT = s
|
OPT = s
|
||||||
|
|
||||||
|
|
||||||
# Debugging format.
|
# Debugging format.
|
||||||
# Native formats for AVR-GCC's -g are dwarf-2 [default] or stabs.
|
# Native formats for AVR-GCC's -g are dwarf-2 [default] or stabs.
|
||||||
# AVR Studio 4.10 requires dwarf-2.
|
# AVR Studio 4.10 requires dwarf-2.
|
||||||
# AVR [Extended] COFF format requires stabs, plus an avr-objcopy run.
|
# AVR [Extended] COFF format requires stabs, plus an avr-objcopy run.
|
||||||
DEBUG = dwarf-2
|
DEBUG = dwarf-2
|
||||||
|
|
||||||
|
|
||||||
# List any extra directories to look for include files here.
|
# List any extra directories to look for include files here.
|
||||||
# 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)/
|
||||||
|
|
||||||
|
|
||||||
# Compiler flag to set the C Standard level.
|
# Compiler flag to set the C Standard level.
|
||||||
# c89 = "ANSI" C
|
# c89 = "ANSI" C
|
||||||
# gnu89 = c89 plus GCC extensions
|
# gnu89 = c89 plus GCC extensions
|
||||||
# c99 = ISO C99 standard (not yet fully implemented)
|
# c99 = ISO C99 standard (not yet fully implemented)
|
||||||
# gnu99 = c99 plus GCC extensions
|
# gnu99 = c99 plus GCC extensions
|
||||||
CSTANDARD = -std=c99
|
CSTANDARD = -std=c99
|
||||||
|
|
||||||
|
|
||||||
# Place -D or -U options here for C sources
|
# Place -D or -U options here for C sources
|
||||||
CDEFS = -DF_CPU=$(F_CPU)UL
|
CDEFS = -DF_CPU=$(F_CPU)UL
|
||||||
CDEFS += -DF_USB=$(F_USB)UL
|
CDEFS += -DF_USB=$(F_USB)UL
|
||||||
CDEFS += -DBOARD=BOARD_$(BOARD) -DARCH=ARCH_$(ARCH)
|
CDEFS += -DBOARD=BOARD_$(BOARD) -DARCH=ARCH_$(ARCH)
|
||||||
CDEFS += $(LUFA_OPTS)
|
CDEFS += $(LUFA_OPTS)
|
||||||
|
|
||||||
|
|
||||||
# Place -D or -U options here for ASM sources
|
# Place -D or -U options here for ASM sources
|
||||||
ADEFS = -DF_CPU=$(F_CPU)
|
ADEFS = -DF_CPU=$(F_CPU)
|
||||||
ADEFS += -DF_USB=$(F_USB)UL
|
ADEFS += -DF_USB=$(F_USB)UL
|
||||||
ADEFS += -DBOARD=BOARD_$(BOARD)
|
ADEFS += -DBOARD=BOARD_$(BOARD)
|
||||||
ADEFS += $(LUFA_OPTS)
|
ADEFS += $(LUFA_OPTS)
|
||||||
|
|
||||||
# Place -D or -U options here for C++ sources
|
# Place -D or -U options here for C++ sources
|
||||||
CPPDEFS = -DF_CPU=$(F_CPU)UL
|
CPPDEFS = -DF_CPU=$(F_CPU)UL
|
||||||
CPPDEFS += -DF_USB=$(F_USB)UL
|
CPPDEFS += -DF_USB=$(F_USB)UL
|
||||||
CPPDEFS += -DBOARD=BOARD_$(BOARD)
|
CPPDEFS += -DBOARD=BOARD_$(BOARD)
|
||||||
CPPDEFS += $(LUFA_OPTS)
|
CPPDEFS += $(LUFA_OPTS)
|
||||||
#CPPDEFS += -D__STDC_LIMIT_MACROS
|
#CPPDEFS += -D__STDC_LIMIT_MACROS
|
||||||
#CPPDEFS += -D__STDC_CONSTANT_MACROS
|
#CPPDEFS += -D__STDC_CONSTANT_MACROS
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#---------------- Compiler Options C ----------------
|
#---------------- Compiler Options C ----------------
|
||||||
# -g*: generate debugging information
|
# -g*: generate debugging information
|
||||||
# -O*: optimization level
|
# -O*: optimization level
|
||||||
# -f...: tuning, see GCC manual and avr-libc documentation
|
# -f...: tuning, see GCC manual and avr-libc documentation
|
||||||
# -Wall...: warning level
|
# -Wall...: warning level
|
||||||
# -Wa,...: tell GCC to pass this to the assembler.
|
# -Wa,...: tell GCC to pass this to the assembler.
|
||||||
# -adhlns...: create assembler listing
|
# -adhlns...: create assembler listing
|
||||||
CFLAGS = -g$(DEBUG)
|
CFLAGS = -g$(DEBUG)
|
||||||
CFLAGS += $(CDEFS)
|
CFLAGS += $(CDEFS)
|
||||||
CFLAGS += -O$(OPT)
|
CFLAGS += -O$(OPT)
|
||||||
CFLAGS += -funsigned-char
|
CFLAGS += -funsigned-char
|
||||||
CFLAGS += -funsigned-bitfields
|
CFLAGS += -funsigned-bitfields
|
||||||
CFLAGS += -ffunction-sections
|
CFLAGS += -ffunction-sections
|
||||||
CFLAGS += -fno-inline-small-functions
|
CFLAGS += -fno-inline-small-functions
|
||||||
CFLAGS += -fpack-struct
|
CFLAGS += -fpack-struct
|
||||||
CFLAGS += -fshort-enums
|
CFLAGS += -fshort-enums
|
||||||
CFLAGS += -fno-strict-aliasing
|
CFLAGS += -fno-strict-aliasing
|
||||||
CFLAGS += -Wall
|
CFLAGS += -Wall
|
||||||
CFLAGS += -Wstrict-prototypes
|
CFLAGS += -Wstrict-prototypes
|
||||||
#CFLAGS += -mshort-calls
|
#CFLAGS += -mshort-calls
|
||||||
#CFLAGS += -fno-unit-at-a-time
|
#CFLAGS += -fno-unit-at-a-time
|
||||||
#CFLAGS += -Wundef
|
#CFLAGS += -Wundef
|
||||||
#CFLAGS += -Wunreachable-code
|
#CFLAGS += -Wunreachable-code
|
||||||
#CFLAGS += -Wsign-compare
|
#CFLAGS += -Wsign-compare
|
||||||
CFLAGS += -Wa,-adhlns=$(<:%.c=$(OBJDIR)/%.lst)
|
CFLAGS += -Wa,-adhlns=$(<:%.c=$(OBJDIR)/%.lst)
|
||||||
CFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS))
|
CFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS))
|
||||||
CFLAGS += $(CSTANDARD)
|
CFLAGS += $(CSTANDARD)
|
||||||
|
|
||||||
|
|
||||||
#---------------- Compiler Options C++ ----------------
|
#---------------- Compiler Options C++ ----------------
|
||||||
# -g*: generate debugging information
|
# -g*: generate debugging information
|
||||||
# -O*: optimization level
|
# -O*: optimization level
|
||||||
# -f...: tuning, see GCC manual and avr-libc documentation
|
# -f...: tuning, see GCC manual and avr-libc documentation
|
||||||
# -Wall...: warning level
|
# -Wall...: warning level
|
||||||
# -Wa,...: tell GCC to pass this to the assembler.
|
# -Wa,...: tell GCC to pass this to the assembler.
|
||||||
# -adhlns...: create assembler listing
|
# -adhlns...: create assembler listing
|
||||||
CPPFLAGS = -g$(DEBUG)
|
CPPFLAGS = -g$(DEBUG)
|
||||||
CPPFLAGS += $(CPPDEFS)
|
CPPFLAGS += $(CPPDEFS)
|
||||||
CPPFLAGS += -O$(OPT)
|
CPPFLAGS += -O$(OPT)
|
||||||
CPPFLAGS += -funsigned-char
|
CPPFLAGS += -funsigned-char
|
||||||
CPPFLAGS += -funsigned-bitfields
|
CPPFLAGS += -funsigned-bitfields
|
||||||
CPPFLAGS += -fpack-struct
|
CPPFLAGS += -fpack-struct
|
||||||
CPPFLAGS += -fshort-enums
|
CPPFLAGS += -fshort-enums
|
||||||
CPPFLAGS += -fno-exceptions
|
CPPFLAGS += -fno-exceptions
|
||||||
CPPFLAGS += -Wall
|
CPPFLAGS += -Wall
|
||||||
CPPFLAGS += -Wundef
|
CPPFLAGS += -Wundef
|
||||||
#CPPFLAGS += -mshort-calls
|
#CPPFLAGS += -mshort-calls
|
||||||
#CPPFLAGS += -fno-unit-at-a-time
|
#CPPFLAGS += -fno-unit-at-a-time
|
||||||
#CPPFLAGS += -Wstrict-prototypes
|
#CPPFLAGS += -Wstrict-prototypes
|
||||||
#CPPFLAGS += -Wunreachable-code
|
#CPPFLAGS += -Wunreachable-code
|
||||||
#CPPFLAGS += -Wsign-compare
|
#CPPFLAGS += -Wsign-compare
|
||||||
CPPFLAGS += -Wa,-adhlns=$(<:%.cpp=$(OBJDIR)/%.lst)
|
CPPFLAGS += -Wa,-adhlns=$(<:%.cpp=$(OBJDIR)/%.lst)
|
||||||
CPPFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS))
|
CPPFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS))
|
||||||
#CPPFLAGS += $(CSTANDARD)
|
#CPPFLAGS += $(CSTANDARD)
|
||||||
|
|
||||||
|
|
||||||
#---------------- Assembler Options ----------------
|
#---------------- Assembler Options ----------------
|
||||||
# -Wa,...: tell GCC to pass this to the assembler.
|
# -Wa,...: tell GCC to pass this to the assembler.
|
||||||
# -adhlns: create listing
|
# -adhlns: create listing
|
||||||
# -gstabs: have the assembler create line number information; note that
|
# -gstabs: have the assembler create line number information; note that
|
||||||
# for use in COFF files, additional information about filenames
|
# for use in COFF files, additional information about filenames
|
||||||
# and function names needs to be present in the assembler source
|
# and function names needs to be present in the assembler source
|
||||||
# files -- see avr-libc docs [FIXME: not yet described there]
|
# files -- see avr-libc docs [FIXME: not yet described there]
|
||||||
# -listing-cont-lines: Sets the maximum number of continuation lines of hex
|
# -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.
|
# 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
|
ASFLAGS = $(ADEFS) -Wa,-adhlns=$(<:%.S=$(OBJDIR)/%.lst),-gstabs,--listing-cont-lines=100
|
||||||
|
|
||||||
|
|
||||||
#---------------- Library Options ----------------
|
#---------------- Library Options ----------------
|
||||||
# Minimalistic printf version
|
# Minimalistic printf version
|
||||||
PRINTF_LIB_MIN = -Wl,-u,vfprintf -lprintf_min
|
PRINTF_LIB_MIN = -Wl,-u,vfprintf -lprintf_min
|
||||||
|
|
||||||
# Floating point printf version (requires MATH_LIB = -lm below)
|
# Floating point printf version (requires MATH_LIB = -lm below)
|
||||||
PRINTF_LIB_FLOAT = -Wl,-u,vfprintf -lprintf_flt
|
PRINTF_LIB_FLOAT = -Wl,-u,vfprintf -lprintf_flt
|
||||||
|
|
||||||
# If this is left blank, then it will use the Standard printf version.
|
# If this is left blank, then it will use the Standard printf version.
|
||||||
PRINTF_LIB =
|
PRINTF_LIB =
|
||||||
#PRINTF_LIB = $(PRINTF_LIB_MIN)
|
#PRINTF_LIB = $(PRINTF_LIB_MIN)
|
||||||
#PRINTF_LIB = $(PRINTF_LIB_FLOAT)
|
#PRINTF_LIB = $(PRINTF_LIB_FLOAT)
|
||||||
|
|
||||||
|
|
||||||
# Minimalistic scanf version
|
# Minimalistic scanf version
|
||||||
SCANF_LIB_MIN = -Wl,-u,vfscanf -lscanf_min
|
SCANF_LIB_MIN = -Wl,-u,vfscanf -lscanf_min
|
||||||
|
|
||||||
# Floating point + %[ scanf version (requires MATH_LIB = -lm below)
|
# Floating point + %[ scanf version (requires MATH_LIB = -lm below)
|
||||||
SCANF_LIB_FLOAT = -Wl,-u,vfscanf -lscanf_flt
|
SCANF_LIB_FLOAT = -Wl,-u,vfscanf -lscanf_flt
|
||||||
|
|
||||||
# If this is left blank, then it will use the Standard scanf version.
|
# If this is left blank, then it will use the Standard scanf version.
|
||||||
SCANF_LIB =
|
SCANF_LIB =
|
||||||
#SCANF_LIB = $(SCANF_LIB_MIN)
|
#SCANF_LIB = $(SCANF_LIB_MIN)
|
||||||
#SCANF_LIB = $(SCANF_LIB_FLOAT)
|
#SCANF_LIB = $(SCANF_LIB_FLOAT)
|
||||||
|
|
||||||
|
|
||||||
MATH_LIB = -lm
|
MATH_LIB = -lm
|
||||||
|
|
||||||
|
|
||||||
# List any extra directories to look for libraries here.
|
# List any extra directories to look for libraries here.
|
||||||
# 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.
|
||||||
EXTRALIBDIRS =
|
EXTRALIBDIRS =
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#---------------- External Memory Options ----------------
|
#---------------- External Memory Options ----------------
|
||||||
|
|
||||||
# 64 KB of external RAM, starting after internal RAM (ATmega128!),
|
# 64 KB of external RAM, starting after internal RAM (ATmega128!),
|
||||||
# used for variables (.data/.bss) and heap (malloc()).
|
# used for variables (.data/.bss) and heap (malloc()).
|
||||||
#EXTMEMOPTS = -Wl,-Tdata=0x801100,--defsym=__heap_end=0x80ffff
|
#EXTMEMOPTS = -Wl,-Tdata=0x801100,--defsym=__heap_end=0x80ffff
|
||||||
|
|
||||||
# 64 KB of external RAM, starting after internal RAM (ATmega128!),
|
# 64 KB of external RAM, starting after internal RAM (ATmega128!),
|
||||||
# only used for heap (malloc()).
|
# only used for heap (malloc()).
|
||||||
#EXTMEMOPTS = -Wl,--section-start,.data=0x801100,--defsym=__heap_end=0x80ffff
|
#EXTMEMOPTS = -Wl,--section-start,.data=0x801100,--defsym=__heap_end=0x80ffff
|
||||||
|
|
||||||
EXTMEMOPTS =
|
EXTMEMOPTS =
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#---------------- Linker Options ----------------
|
#---------------- Linker Options ----------------
|
||||||
# -Wl,...: tell GCC to pass this to linker.
|
# -Wl,...: tell GCC to pass this to linker.
|
||||||
# -Map: create map file
|
# -Map: create map file
|
||||||
# --cref: add cross reference to map file
|
# --cref: add cross reference to map file
|
||||||
LDFLAGS = -Wl,-Map=$(TARGET).map,--cref
|
LDFLAGS = -Wl,-Map=$(TARGET).map,--cref
|
||||||
LDFLAGS += -Wl,--relax
|
LDFLAGS += -Wl,--relax
|
||||||
LDFLAGS += -Wl,--gc-sections
|
LDFLAGS += -Wl,--gc-sections
|
||||||
LDFLAGS += $(EXTMEMOPTS)
|
LDFLAGS += $(EXTMEMOPTS)
|
||||||
LDFLAGS += $(patsubst %,-L%,$(EXTRALIBDIRS))
|
LDFLAGS += $(patsubst %,-L%,$(EXTRALIBDIRS))
|
||||||
LDFLAGS += $(PRINTF_LIB) $(SCANF_LIB) $(MATH_LIB)
|
LDFLAGS += $(PRINTF_LIB) $(SCANF_LIB) $(MATH_LIB)
|
||||||
#LDFLAGS += -T linker_script.x
|
#LDFLAGS += -T linker_script.x
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#---------------- Programming Options (avrdude) ----------------
|
#---------------- Programming Options (avrdude) ----------------
|
||||||
|
|
||||||
# Programming hardware
|
# Programming hardware
|
||||||
# Type: avrdude -c ?
|
# Type: avrdude -c ?
|
||||||
# to get a full listing.
|
# to get a full listing.
|
||||||
#
|
#
|
||||||
AVRDUDE_PROGRAMMER = jtagmkII
|
AVRDUDE_PROGRAMMER = jtagmkII
|
||||||
|
|
||||||
# com1 = serial port. Use lpt1 to connect to parallel port.
|
# com1 = serial port. Use lpt1 to connect to parallel port.
|
||||||
AVRDUDE_PORT = usb
|
AVRDUDE_PORT = usb
|
||||||
|
|
||||||
AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex
|
AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex
|
||||||
#AVRDUDE_WRITE_EEPROM = -U eeprom:w:$(TARGET).eep
|
#AVRDUDE_WRITE_EEPROM = -U eeprom:w:$(TARGET).eep
|
||||||
|
|
||||||
|
|
||||||
# Uncomment the following if you want avrdude's erase cycle counter.
|
# Uncomment the following if you want avrdude's erase cycle counter.
|
||||||
# Note that this counter needs to be initialized first using -Yn,
|
# Note that this counter needs to be initialized first using -Yn,
|
||||||
# see avrdude manual.
|
# see avrdude manual.
|
||||||
#AVRDUDE_ERASE_COUNTER = -y
|
#AVRDUDE_ERASE_COUNTER = -y
|
||||||
|
|
||||||
# Uncomment the following if you do /not/ wish a verification to be
|
# Uncomment the following if you do /not/ wish a verification to be
|
||||||
# performed after programming the device.
|
# performed after programming the device.
|
||||||
#AVRDUDE_NO_VERIFY = -V
|
#AVRDUDE_NO_VERIFY = -V
|
||||||
|
|
||||||
# Increase verbosity level. Please use this when submitting bug
|
# Increase verbosity level. Please use this when submitting bug
|
||||||
# reports about avrdude. See <http://savannah.nongnu.org/projects/avrdude>
|
# reports about avrdude. See <http://savannah.nongnu.org/projects/avrdude>
|
||||||
# to submit bug reports.
|
# to submit bug reports.
|
||||||
#AVRDUDE_VERBOSE = -v -v
|
#AVRDUDE_VERBOSE = -v -v
|
||||||
|
|
||||||
AVRDUDE_FLAGS = -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER)
|
AVRDUDE_FLAGS = -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER)
|
||||||
AVRDUDE_FLAGS += $(AVRDUDE_NO_VERIFY)
|
AVRDUDE_FLAGS += $(AVRDUDE_NO_VERIFY)
|
||||||
AVRDUDE_FLAGS += $(AVRDUDE_VERBOSE)
|
AVRDUDE_FLAGS += $(AVRDUDE_VERBOSE)
|
||||||
AVRDUDE_FLAGS += $(AVRDUDE_ERASE_COUNTER)
|
AVRDUDE_FLAGS += $(AVRDUDE_ERASE_COUNTER)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#---------------- Debugging Options ----------------
|
#---------------- Debugging Options ----------------
|
||||||
|
|
||||||
# For simulavr only - target MCU frequency.
|
# For simulavr only - target MCU frequency.
|
||||||
DEBUG_MFREQ = $(F_CPU)
|
DEBUG_MFREQ = $(F_CPU)
|
||||||
|
|
||||||
# Set the DEBUG_UI to either gdb or insight.
|
# Set the DEBUG_UI to either gdb or insight.
|
||||||
# DEBUG_UI = gdb
|
# DEBUG_UI = gdb
|
||||||
DEBUG_UI = insight
|
DEBUG_UI = insight
|
||||||
|
|
||||||
# Set the debugging back-end to either avarice, simulavr.
|
# Set the debugging back-end to either avarice, simulavr.
|
||||||
DEBUG_BACKEND = avarice
|
DEBUG_BACKEND = avarice
|
||||||
#DEBUG_BACKEND = simulavr
|
#DEBUG_BACKEND = simulavr
|
||||||
|
|
||||||
# GDB Init Filename.
|
# GDB Init Filename.
|
||||||
GDBINIT_FILE = __avr_gdbinit
|
GDBINIT_FILE = __avr_gdbinit
|
||||||
|
|
||||||
# When using avarice settings for the JTAG
|
# When using avarice settings for the JTAG
|
||||||
JTAG_DEV = /dev/com1
|
JTAG_DEV = /dev/com1
|
||||||
|
|
||||||
# Debugging port used to communicate between GDB / avarice / simulavr.
|
# Debugging port used to communicate between GDB / avarice / simulavr.
|
||||||
DEBUG_PORT = 4242
|
DEBUG_PORT = 4242
|
||||||
|
|
||||||
# Debugging host used to communicate between GDB / avarice / simulavr, normally
|
# Debugging host used to communicate between GDB / avarice / simulavr, normally
|
||||||
# just set to localhost unless doing some sort of crazy debugging when
|
# just set to localhost unless doing some sort of crazy debugging when
|
||||||
# avarice is running on a different computer.
|
# avarice is running on a different computer.
|
||||||
DEBUG_HOST = localhost
|
DEBUG_HOST = localhost
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#============================================================================
|
#============================================================================
|
||||||
|
|
||||||
|
|
||||||
# Define programs and commands.
|
# Define programs and commands.
|
||||||
SHELL = sh
|
SHELL = sh
|
||||||
CC = avr-gcc
|
CC = avr-gcc
|
||||||
OBJCOPY = avr-objcopy
|
OBJCOPY = avr-objcopy
|
||||||
OBJDUMP = avr-objdump
|
OBJDUMP = avr-objdump
|
||||||
SIZE = avr-size
|
SIZE = avr-size
|
||||||
AR = avr-ar rcs
|
AR = avr-ar rcs
|
||||||
NM = avr-nm
|
NM = avr-nm
|
||||||
AVRDUDE = avrdude
|
AVRDUDE = avrdude
|
||||||
REMOVE = rm -f
|
REMOVE = rm -f
|
||||||
REMOVEDIR = rm -rf
|
REMOVEDIR = rm -rf
|
||||||
COPY = cp
|
COPY = cp
|
||||||
WINSHELL = cmd
|
WINSHELL = cmd
|
||||||
|
|
||||||
|
|
||||||
# Define Messages
|
# Define Messages
|
||||||
# English
|
# English
|
||||||
MSG_ERRORS_NONE = Errors: none
|
MSG_ERRORS_NONE = Errors: none
|
||||||
MSG_BEGIN = -------- begin --------
|
MSG_BEGIN = -------- begin --------
|
||||||
MSG_END = -------- end --------
|
MSG_END = -------- end --------
|
||||||
MSG_SIZE_BEFORE = Size before:
|
MSG_SIZE_BEFORE = Size before:
|
||||||
MSG_SIZE_AFTER = Size after:
|
MSG_SIZE_AFTER = Size after:
|
||||||
MSG_COFF = Converting to AVR COFF:
|
MSG_COFF = Converting to AVR COFF:
|
||||||
MSG_EXTENDED_COFF = Converting to AVR Extended COFF:
|
MSG_EXTENDED_COFF = Converting to AVR Extended COFF:
|
||||||
MSG_FLASH = Creating load file for Flash:
|
MSG_FLASH = Creating load file for Flash:
|
||||||
MSG_EEPROM = Creating load file for EEPROM:
|
MSG_EEPROM = Creating load file for EEPROM:
|
||||||
MSG_EXTENDED_LISTING = Creating Extended Listing:
|
MSG_EXTENDED_LISTING = Creating Extended Listing:
|
||||||
MSG_SYMBOL_TABLE = Creating Symbol Table:
|
MSG_SYMBOL_TABLE = Creating Symbol Table:
|
||||||
MSG_LINKING = Linking:
|
MSG_LINKING = Linking:
|
||||||
MSG_COMPILING = Compiling C:
|
MSG_COMPILING = Compiling C:
|
||||||
MSG_COMPILING_CPP = Compiling C++:
|
MSG_COMPILING_CPP = Compiling C++:
|
||||||
MSG_ASSEMBLING = Assembling:
|
MSG_ASSEMBLING = Assembling:
|
||||||
MSG_CLEANING = Cleaning project:
|
MSG_CLEANING = Cleaning project:
|
||||||
MSG_CREATING_LIBRARY = Creating library:
|
MSG_CREATING_LIBRARY = Creating library:
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Define all object files.
|
# Define all object files.
|
||||||
OBJ = $(SRC:%.c=$(OBJDIR)/%.o) $(CPPSRC:%.cpp=$(OBJDIR)/%.o) $(ASRC:%.S=$(OBJDIR)/%.o)
|
OBJ = $(SRC:%.c=$(OBJDIR)/%.o) $(CPPSRC:%.cpp=$(OBJDIR)/%.o) $(ASRC:%.S=$(OBJDIR)/%.o)
|
||||||
|
|
||||||
# Define all listing files.
|
# Define all listing files.
|
||||||
LST = $(SRC:%.c=$(OBJDIR)/%.lst) $(CPPSRC:%.cpp=$(OBJDIR)/%.lst) $(ASRC:%.S=$(OBJDIR)/%.lst)
|
LST = $(SRC:%.c=$(OBJDIR)/%.lst) $(CPPSRC:%.cpp=$(OBJDIR)/%.lst) $(ASRC:%.S=$(OBJDIR)/%.lst)
|
||||||
|
|
||||||
|
|
||||||
# Compiler flags to generate dependency files.
|
# Compiler flags to generate dependency files.
|
||||||
GENDEPFLAGS = -MMD -MP -MF .dep/$(@F).d
|
GENDEPFLAGS = -MMD -MP -MF .dep/$(@F).d
|
||||||
|
|
||||||
|
|
||||||
# Combine all necessary flags and optional flags.
|
# Combine all necessary flags and optional flags.
|
||||||
# Add target processor to flags.
|
# Add target processor to flags.
|
||||||
ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS) $(GENDEPFLAGS)
|
ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS) $(GENDEPFLAGS)
|
||||||
ALL_CPPFLAGS = -mmcu=$(MCU) -I. -x c++ $(CPPFLAGS) $(GENDEPFLAGS)
|
ALL_CPPFLAGS = -mmcu=$(MCU) -I. -x c++ $(CPPFLAGS) $(GENDEPFLAGS)
|
||||||
ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS)
|
ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Default target.
|
# Default target.
|
||||||
all: begin gccversion sizebefore build sizeafter end
|
all: begin gccversion sizebefore build sizeafter end
|
||||||
|
|
||||||
# Change the build target to build a HEX file or a library.
|
# Change the build target to build a HEX file or a library.
|
||||||
build: elf hex eep lss sym
|
build: elf hex eep lss sym
|
||||||
#build: lib
|
#build: lib
|
||||||
|
|
||||||
|
|
||||||
elf: $(TARGET).elf
|
elf: $(TARGET).elf
|
||||||
hex: $(TARGET).hex
|
hex: $(TARGET).hex
|
||||||
eep: $(TARGET).eep
|
eep: $(TARGET).eep
|
||||||
lss: $(TARGET).lss
|
lss: $(TARGET).lss
|
||||||
sym: $(TARGET).sym
|
sym: $(TARGET).sym
|
||||||
LIBNAME=lib$(TARGET).a
|
LIBNAME=lib$(TARGET).a
|
||||||
lib: $(LIBNAME)
|
lib: $(LIBNAME)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Eye candy.
|
# Eye candy.
|
||||||
# AVR Studio 3.x does not check make's exit code but relies on
|
# 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.
|
# the following magic strings to be generated by the compile job.
|
||||||
begin:
|
begin:
|
||||||
@echo
|
@echo
|
||||||
@echo $(MSG_BEGIN)
|
@echo $(MSG_BEGIN)
|
||||||
|
|
||||||
end:
|
end:
|
||||||
@echo $(MSG_END)
|
@echo $(MSG_END)
|
||||||
@echo
|
@echo
|
||||||
|
|
||||||
|
|
||||||
# Display size of file.
|
# Display size of file.
|
||||||
HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex
|
HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex
|
||||||
ELFSIZE = $(SIZE) $(MCU_FLAG) $(FORMAT_FLAG) $(TARGET).elf
|
ELFSIZE = $(SIZE) $(MCU_FLAG) $(FORMAT_FLAG) $(TARGET).elf
|
||||||
MCU_FLAG = $(shell $(SIZE) --help | grep -- --mcu > /dev/null && echo --mcu=$(MCU) )
|
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 )
|
FORMAT_FLAG = $(shell $(SIZE) --help | grep -- --format=.*avr > /dev/null && echo --format=avr )
|
||||||
|
|
||||||
|
|
||||||
sizebefore:
|
sizebefore:
|
||||||
@if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_BEFORE); $(ELFSIZE); \
|
@if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_BEFORE); $(ELFSIZE); \
|
||||||
2>/dev/null; echo; fi
|
2>/dev/null; echo; fi
|
||||||
|
|
||||||
sizeafter:
|
sizeafter:
|
||||||
@if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_AFTER); $(ELFSIZE); \
|
@if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_AFTER); $(ELFSIZE); \
|
||||||
2>/dev/null; echo; fi
|
2>/dev/null; echo; fi
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Display compiler version information.
|
# Display compiler version information.
|
||||||
gccversion :
|
gccversion :
|
||||||
@$(CC) --version
|
@$(CC) --version
|
||||||
|
|
||||||
|
|
||||||
# Program the device.
|
# Program the device.
|
||||||
program: $(TARGET).hex $(TARGET).eep
|
program: $(TARGET).hex $(TARGET).eep
|
||||||
$(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM)
|
$(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM)
|
||||||
|
|
||||||
flip: $(TARGET).hex
|
flip: $(TARGET).hex
|
||||||
batchisp -hardware usb -device $(MCU) -operation erase f
|
batchisp -hardware usb -device $(MCU) -operation erase f
|
||||||
batchisp -hardware usb -device $(MCU) -operation loadbuffer $(TARGET).hex program
|
batchisp -hardware usb -device $(MCU) -operation loadbuffer $(TARGET).hex program
|
||||||
batchisp -hardware usb -device $(MCU) -operation start reset 0
|
batchisp -hardware usb -device $(MCU) -operation start reset 0
|
||||||
|
|
||||||
dfu: $(TARGET).hex
|
dfu: $(TARGET).hex
|
||||||
dfu-programmer $(MCU) erase
|
dfu-programmer $(MCU) erase
|
||||||
dfu-programmer $(MCU) flash $(TARGET).hex
|
dfu-programmer $(MCU) flash $(TARGET).hex
|
||||||
dfu-programmer $(MCU) reset
|
dfu-programmer $(MCU) reset
|
||||||
|
|
||||||
flip-ee: $(TARGET).hex $(TARGET).eep
|
flip-ee: $(TARGET).hex $(TARGET).eep
|
||||||
$(COPY) $(TARGET).eep $(TARGET)eep.hex
|
$(COPY) $(TARGET).eep $(TARGET)eep.hex
|
||||||
batchisp -hardware usb -device $(MCU) -operation memory EEPROM erase
|
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 memory EEPROM loadbuffer $(TARGET)eep.hex program
|
||||||
batchisp -hardware usb -device $(MCU) -operation start reset 0
|
batchisp -hardware usb -device $(MCU) -operation start reset 0
|
||||||
$(REMOVE) $(TARGET)eep.hex
|
$(REMOVE) $(TARGET)eep.hex
|
||||||
|
|
||||||
dfu-ee: $(TARGET).hex $(TARGET).eep
|
dfu-ee: $(TARGET).hex $(TARGET).eep
|
||||||
dfu-programmer $(MCU) eeprom-flash $(TARGET).eep
|
dfu-programmer $(MCU) eeprom-flash $(TARGET).eep
|
||||||
dfu-programmer $(MCU) reset
|
dfu-programmer $(MCU) reset
|
||||||
|
|
||||||
|
|
||||||
# Generate avr-gdb config/init file which does the following:
|
# Generate avr-gdb config/init file which does the following:
|
||||||
# define the reset signal, load the target file, connect to target, and set
|
# define the reset signal, load the target file, connect to target, and set
|
||||||
# a breakpoint at main().
|
# a breakpoint at main().
|
||||||
gdb-config:
|
gdb-config:
|
||||||
@$(REMOVE) $(GDBINIT_FILE)
|
@$(REMOVE) $(GDBINIT_FILE)
|
||||||
@echo define reset >> $(GDBINIT_FILE)
|
@echo define reset >> $(GDBINIT_FILE)
|
||||||
@echo SIGNAL SIGHUP >> $(GDBINIT_FILE)
|
@echo SIGNAL SIGHUP >> $(GDBINIT_FILE)
|
||||||
@echo end >> $(GDBINIT_FILE)
|
@echo end >> $(GDBINIT_FILE)
|
||||||
@echo file $(TARGET).elf >> $(GDBINIT_FILE)
|
@echo file $(TARGET).elf >> $(GDBINIT_FILE)
|
||||||
@echo target remote $(DEBUG_HOST):$(DEBUG_PORT) >> $(GDBINIT_FILE)
|
@echo target remote $(DEBUG_HOST):$(DEBUG_PORT) >> $(GDBINIT_FILE)
|
||||||
ifeq ($(DEBUG_BACKEND),simulavr)
|
ifeq ($(DEBUG_BACKEND),simulavr)
|
||||||
@echo load >> $(GDBINIT_FILE)
|
@echo load >> $(GDBINIT_FILE)
|
||||||
endif
|
endif
|
||||||
@echo break main >> $(GDBINIT_FILE)
|
@echo break main >> $(GDBINIT_FILE)
|
||||||
|
|
||||||
debug: gdb-config $(TARGET).elf
|
debug: gdb-config $(TARGET).elf
|
||||||
ifeq ($(DEBUG_BACKEND), avarice)
|
ifeq ($(DEBUG_BACKEND), avarice)
|
||||||
@echo Starting AVaRICE - Press enter when "waiting to connect" message displays.
|
@echo Starting AVaRICE - Press enter when "waiting to connect" message displays.
|
||||||
@$(WINSHELL) /c start avarice --jtag $(JTAG_DEV) --erase --program --file \
|
@$(WINSHELL) /c start avarice --jtag $(JTAG_DEV) --erase --program --file \
|
||||||
$(TARGET).elf $(DEBUG_HOST):$(DEBUG_PORT)
|
$(TARGET).elf $(DEBUG_HOST):$(DEBUG_PORT)
|
||||||
@$(WINSHELL) /c pause
|
@$(WINSHELL) /c pause
|
||||||
|
|
||||||
else
|
else
|
||||||
@$(WINSHELL) /c start simulavr --gdbserver --device $(MCU) --clock-freq \
|
@$(WINSHELL) /c start simulavr --gdbserver --device $(MCU) --clock-freq \
|
||||||
$(DEBUG_MFREQ) --port $(DEBUG_PORT)
|
$(DEBUG_MFREQ) --port $(DEBUG_PORT)
|
||||||
endif
|
endif
|
||||||
@$(WINSHELL) /c start avr-$(DEBUG_UI) --command=$(GDBINIT_FILE)
|
@$(WINSHELL) /c start avr-$(DEBUG_UI) --command=$(GDBINIT_FILE)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Convert ELF to COFF for use in debugging / simulating in AVR Studio or VMLAB.
|
# Convert ELF to COFF for use in debugging / simulating in AVR Studio or VMLAB.
|
||||||
COFFCONVERT = $(OBJCOPY) --debugging
|
COFFCONVERT = $(OBJCOPY) --debugging
|
||||||
COFFCONVERT += --change-section-address .data-0x800000
|
COFFCONVERT += --change-section-address .data-0x800000
|
||||||
COFFCONVERT += --change-section-address .bss-0x800000
|
COFFCONVERT += --change-section-address .bss-0x800000
|
||||||
COFFCONVERT += --change-section-address .noinit-0x800000
|
COFFCONVERT += --change-section-address .noinit-0x800000
|
||||||
COFFCONVERT += --change-section-address .eeprom-0x810000
|
COFFCONVERT += --change-section-address .eeprom-0x810000
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
coff: $(TARGET).elf
|
coff: $(TARGET).elf
|
||||||
@echo
|
@echo
|
||||||
@echo $(MSG_COFF) $(TARGET).cof
|
@echo $(MSG_COFF) $(TARGET).cof
|
||||||
$(COFFCONVERT) -O coff-avr $< $(TARGET).cof
|
$(COFFCONVERT) -O coff-avr $< $(TARGET).cof
|
||||||
|
|
||||||
|
|
||||||
extcoff: $(TARGET).elf
|
extcoff: $(TARGET).elf
|
||||||
@echo
|
@echo
|
||||||
@echo $(MSG_EXTENDED_COFF) $(TARGET).cof
|
@echo $(MSG_EXTENDED_COFF) $(TARGET).cof
|
||||||
$(COFFCONVERT) -O coff-ext-avr $< $(TARGET).cof
|
$(COFFCONVERT) -O coff-ext-avr $< $(TARGET).cof
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Create final output files (.hex, .eep) from ELF output file.
|
# Create final output files (.hex, .eep) from ELF output file.
|
||||||
%.hex: %.elf
|
%.hex: %.elf
|
||||||
@echo
|
@echo
|
||||||
@echo $(MSG_FLASH) $@
|
@echo $(MSG_FLASH) $@
|
||||||
$(OBJCOPY) -O $(FORMAT) -R .eeprom -R .fuse -R .lock $< $@
|
$(OBJCOPY) -O $(FORMAT) -R .eeprom -R .fuse -R .lock $< $@
|
||||||
|
|
||||||
%.eep: %.elf
|
%.eep: %.elf
|
||||||
@echo
|
@echo
|
||||||
@echo $(MSG_EEPROM) $@
|
@echo $(MSG_EEPROM) $@
|
||||||
-$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \
|
-$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \
|
||||||
--change-section-lma .eeprom=0 --no-change-warnings -O $(FORMAT) $< $@ || exit 0
|
--change-section-lma .eeprom=0 --no-change-warnings -O $(FORMAT) $< $@ || exit 0
|
||||||
|
|
||||||
# Create extended listing file from ELF output file.
|
# Create extended listing file from ELF output file.
|
||||||
%.lss: %.elf
|
%.lss: %.elf
|
||||||
@echo
|
@echo
|
||||||
@echo $(MSG_EXTENDED_LISTING) $@
|
@echo $(MSG_EXTENDED_LISTING) $@
|
||||||
$(OBJDUMP) -h -S -z $< > $@
|
$(OBJDUMP) -h -S -z $< > $@
|
||||||
|
|
||||||
# Create a symbol table from ELF output file.
|
# Create a symbol table from ELF output file.
|
||||||
%.sym: %.elf
|
%.sym: %.elf
|
||||||
@echo
|
@echo
|
||||||
@echo $(MSG_SYMBOL_TABLE) $@
|
@echo $(MSG_SYMBOL_TABLE) $@
|
||||||
$(NM) -n $< > $@
|
$(NM) -n $< > $@
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Create library from object files.
|
# Create library from object files.
|
||||||
.SECONDARY : $(TARGET).a
|
.SECONDARY : $(TARGET).a
|
||||||
.PRECIOUS : $(OBJ)
|
.PRECIOUS : $(OBJ)
|
||||||
%.a: $(OBJ)
|
%.a: $(OBJ)
|
||||||
@echo
|
@echo
|
||||||
@echo $(MSG_CREATING_LIBRARY) $@
|
@echo $(MSG_CREATING_LIBRARY) $@
|
||||||
$(AR) $@ $(OBJ)
|
$(AR) $@ $(OBJ)
|
||||||
|
|
||||||
|
|
||||||
# Link: create ELF output file from object files.
|
# Link: create ELF output file from object files.
|
||||||
.SECONDARY : $(TARGET).elf
|
.SECONDARY : $(TARGET).elf
|
||||||
.PRECIOUS : $(OBJ)
|
.PRECIOUS : $(OBJ)
|
||||||
%.elf: $(OBJ)
|
%.elf: $(OBJ)
|
||||||
@echo
|
@echo
|
||||||
@echo $(MSG_LINKING) $@
|
@echo $(MSG_LINKING) $@
|
||||||
$(CC) $(ALL_CFLAGS) $^ --output $@ $(LDFLAGS)
|
$(CC) $(ALL_CFLAGS) $^ --output $@ $(LDFLAGS)
|
||||||
|
|
||||||
|
|
||||||
# Compile: create object files from C source files.
|
# Compile: create object files from C source files.
|
||||||
$(OBJDIR)/%.o : %.c
|
$(OBJDIR)/%.o : %.c
|
||||||
@echo
|
@echo
|
||||||
@echo $(MSG_COMPILING) $<
|
@echo $(MSG_COMPILING) $<
|
||||||
$(CC) -c $(ALL_CFLAGS) $< -o $@
|
$(CC) -c $(ALL_CFLAGS) $< -o $@
|
||||||
|
|
||||||
|
|
||||||
# Compile: create object files from C++ source files.
|
# Compile: create object files from C++ source files.
|
||||||
$(OBJDIR)/%.o : %.cpp
|
$(OBJDIR)/%.o : %.cpp
|
||||||
@echo
|
@echo
|
||||||
@echo $(MSG_COMPILING_CPP) $<
|
@echo $(MSG_COMPILING_CPP) $<
|
||||||
$(CC) -c $(ALL_CPPFLAGS) $< -o $@
|
$(CC) -c $(ALL_CPPFLAGS) $< -o $@
|
||||||
|
|
||||||
|
|
||||||
# Compile: create assembler files from C source files.
|
# Compile: create assembler files from C source files.
|
||||||
%.s : %.c
|
%.s : %.c
|
||||||
$(CC) -S $(ALL_CFLAGS) $< -o $@
|
$(CC) -S $(ALL_CFLAGS) $< -o $@
|
||||||
|
|
||||||
|
|
||||||
# Compile: create assembler files from C++ source files.
|
# Compile: create assembler files from C++ source files.
|
||||||
%.s : %.cpp
|
%.s : %.cpp
|
||||||
$(CC) -S $(ALL_CPPFLAGS) $< -o $@
|
$(CC) -S $(ALL_CPPFLAGS) $< -o $@
|
||||||
|
|
||||||
|
|
||||||
# Assemble: create object files from assembler source files.
|
# Assemble: create object files from assembler source files.
|
||||||
$(OBJDIR)/%.o : %.S
|
$(OBJDIR)/%.o : %.S
|
||||||
@echo
|
@echo
|
||||||
@echo $(MSG_ASSEMBLING) $<
|
@echo $(MSG_ASSEMBLING) $<
|
||||||
$(CC) -c $(ALL_ASFLAGS) $< -o $@
|
$(CC) -c $(ALL_ASFLAGS) $< -o $@
|
||||||
|
|
||||||
|
|
||||||
# Create preprocessed source for use in sending a bug report.
|
# Create preprocessed source for use in sending a bug report.
|
||||||
%.i : %.c
|
%.i : %.c
|
||||||
$(CC) -E -mmcu=$(MCU) -I. $(CFLAGS) $< -o $@
|
$(CC) -E -mmcu=$(MCU) -I. $(CFLAGS) $< -o $@
|
||||||
|
|
||||||
|
|
||||||
# Target: clean project.
|
# Target: clean project.
|
||||||
clean: begin clean_list end
|
clean: begin clean_list end
|
||||||
|
|
||||||
clean_list :
|
clean_list :
|
||||||
@echo
|
@echo
|
||||||
@echo $(MSG_CLEANING)
|
@echo $(MSG_CLEANING)
|
||||||
$(REMOVE) $(TARGET).hex
|
$(REMOVE) $(TARGET).hex
|
||||||
$(REMOVE) $(TARGET).eep
|
$(REMOVE) $(TARGET).eep
|
||||||
$(REMOVE) $(TARGET).cof
|
$(REMOVE) $(TARGET).cof
|
||||||
$(REMOVE) $(TARGET).elf
|
$(REMOVE) $(TARGET).elf
|
||||||
$(REMOVE) $(TARGET).map
|
$(REMOVE) $(TARGET).map
|
||||||
$(REMOVE) $(TARGET).sym
|
$(REMOVE) $(TARGET).sym
|
||||||
$(REMOVE) $(TARGET).lss
|
$(REMOVE) $(TARGET).lss
|
||||||
$(REMOVE) $(SRC:%.c=$(OBJDIR)/%.o) $(CPPSRC:%.cpp=$(OBJDIR)/%.o) $(ASRC:%.S=$(OBJDIR)/%.o)
|
$(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=$(OBJDIR)/%.lst) $(CPPSRC:%.cpp=$(OBJDIR)/%.lst) $(ASRC:%.S=$(OBJDIR)/%.lst)
|
||||||
$(REMOVE) $(SRC:.c=.s)
|
$(REMOVE) $(SRC:.c=.s)
|
||||||
$(REMOVE) $(SRC:.c=.d)
|
$(REMOVE) $(SRC:.c=.d)
|
||||||
$(REMOVE) $(SRC:.c=.i)
|
$(REMOVE) $(SRC:.c=.i)
|
||||||
$(REMOVEDIR) .dep
|
$(REMOVEDIR) .dep
|
||||||
|
|
||||||
doxygen:
|
doxygen:
|
||||||
@echo Generating Project Documentation...
|
@echo Generating Project Documentation...
|
||||||
@doxygen Doxygen.conf
|
@doxygen Doxygen.conf
|
||||||
@echo Documentation Generation Complete.
|
@echo Documentation Generation Complete.
|
||||||
|
|
||||||
clean_doxygen:
|
clean_doxygen:
|
||||||
rm -rf Documentation
|
rm -rf Documentation
|
||||||
|
|
||||||
# Create object files directory
|
# Create object files directory
|
||||||
$(shell mkdir $(OBJDIR) 2>/dev/null)
|
$(shell mkdir $(OBJDIR) 2>/dev/null)
|
||||||
|
|
||||||
|
|
||||||
# Include the dependency files.
|
# Include the dependency files.
|
||||||
-include $(shell mkdir .dep 2>/dev/null) $(wildcard .dep/*)
|
-include $(shell mkdir .dep 2>/dev/null) $(wildcard .dep/*)
|
||||||
|
|
||||||
|
|
||||||
# Listing of phony targets.
|
# Listing of phony targets.
|
||||||
.PHONY : all begin finish end sizebefore sizeafter gccversion \
|
.PHONY : all begin finish end sizebefore sizeafter gccversion \
|
||||||
build elf hex eep lss sym coff extcoff doxygen clean \
|
build elf hex eep lss sym coff extcoff doxygen clean \
|
||||||
clean_list clean_doxygen program dfu flip flip-ee dfu-ee \
|
clean_list clean_doxygen program dfu flip flip-ee dfu-ee \
|
||||||
debug gdb-config
|
debug gdb-config
|
||||||
|
|
||||||
|
@ -1,273 +1,273 @@
|
|||||||
/*
|
/*
|
||||||
LUFA Library
|
LUFA Library
|
||||||
Copyright (C) Dean Camera, 2011.
|
Copyright (C) Dean Camera, 2011.
|
||||||
|
|
||||||
dean [at] fourwalledcubicle [dot] com
|
dean [at] fourwalledcubicle [dot] com
|
||||||
www.lufa-lib.org
|
www.lufa-lib.org
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com)
|
Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com)
|
||||||
|
|
||||||
Permission to use, copy, modify, distribute, and sell this
|
Permission to use, copy, modify, distribute, and sell this
|
||||||
software and its documentation for any purpose is hereby granted
|
software and its documentation for any purpose is hereby granted
|
||||||
without fee, provided that the above copyright notice appear in
|
without fee, provided that the above copyright notice appear in
|
||||||
all copies and that both that the copyright notice and this
|
all copies and that both that the copyright notice and this
|
||||||
permission notice and warranty disclaimer appear in supporting
|
permission notice and warranty disclaimer appear in supporting
|
||||||
documentation, and that the name of the author not be used in
|
documentation, and that the name of the author not be used in
|
||||||
advertising or publicity pertaining to distribution of the
|
advertising or publicity pertaining to distribution of the
|
||||||
software without specific, written prior permission.
|
software without specific, written prior permission.
|
||||||
|
|
||||||
The author disclaim all warranties with regard to this
|
The author disclaim all warranties with regard to this
|
||||||
software, including all implied warranties of merchantability
|
software, including all implied warranties of merchantability
|
||||||
and fitness. In no event shall the author be liable for any
|
and fitness. In no event shall the author be liable for any
|
||||||
special, indirect or consequential damages or any damages
|
special, indirect or consequential damages or any damages
|
||||||
whatsoever resulting from loss of use, data or profits, whether
|
whatsoever resulting from loss of use, data or profits, whether
|
||||||
in an action of contract, negligence or other tortious action,
|
in an action of contract, negligence or other tortious action,
|
||||||
arising out of or in connection with the use or performance of
|
arising out of or in connection with the use or performance of
|
||||||
this software.
|
this software.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/** \file
|
/** \file
|
||||||
*
|
*
|
||||||
* Main source file for the AudioInputHost demo. This file contains the main tasks of
|
* Main source file for the AudioInputHost demo. This file contains the main tasks of
|
||||||
* the demo and is responsible for the initial application hardware configuration.
|
* the demo and is responsible for the initial application hardware configuration.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "AudioInputHost.h"
|
#include "AudioInputHost.h"
|
||||||
|
|
||||||
/** Main program entry point. This routine configures the hardware required by the application, then
|
/** Main program entry point. This routine configures the hardware required by the application, then
|
||||||
* enters a loop to run the application tasks in sequence.
|
* enters a loop to run the application tasks in sequence.
|
||||||
*/
|
*/
|
||||||
int main(void)
|
int main(void)
|
||||||
{
|
{
|
||||||
SetupHardware();
|
SetupHardware();
|
||||||
|
|
||||||
puts_P(PSTR(ESC_FG_CYAN "Audio Input Host Demo running.\r\n" ESC_FG_WHITE));
|
puts_P(PSTR(ESC_FG_CYAN "Audio Input Host Demo running.\r\n" ESC_FG_WHITE));
|
||||||
|
|
||||||
LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY);
|
LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY);
|
||||||
sei();
|
sei();
|
||||||
|
|
||||||
for (;;)
|
for (;;)
|
||||||
{
|
{
|
||||||
Audio_Task();
|
Audio_Task();
|
||||||
USB_USBTask();
|
USB_USBTask();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Configures the board hardware and chip peripherals for the demo's functionality. */
|
/** Configures the board hardware and chip peripherals for the demo's functionality. */
|
||||||
void SetupHardware(void)
|
void SetupHardware(void)
|
||||||
{
|
{
|
||||||
/* Disable watchdog if enabled by bootloader/fuses */
|
/* Disable watchdog if enabled by bootloader/fuses */
|
||||||
MCUSR &= ~(1 << WDRF);
|
MCUSR &= ~(1 << WDRF);
|
||||||
wdt_disable();
|
wdt_disable();
|
||||||
|
|
||||||
/* Disable clock division */
|
/* Disable clock division */
|
||||||
clock_prescale_set(clock_div_1);
|
clock_prescale_set(clock_div_1);
|
||||||
|
|
||||||
/* Hardware Initialization */
|
/* Hardware Initialization */
|
||||||
Serial_Init(9600, false);
|
Serial_Init(9600, false);
|
||||||
LEDs_Init();
|
LEDs_Init();
|
||||||
USB_Init();
|
USB_Init();
|
||||||
|
|
||||||
/* Create a stdio stream for the serial port for stdin and stdout */
|
/* Create a stdio stream for the serial port for stdin and stdout */
|
||||||
Serial_CreateStream(NULL);
|
Serial_CreateStream(NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Event handler for the USB_DeviceAttached event. This indicates that a device has been attached to the host, and
|
/** Event handler for the USB_DeviceAttached event. This indicates that a device has been attached to the host, and
|
||||||
* starts the library USB task to begin the enumeration and USB management process.
|
* starts the library USB task to begin the enumeration and USB management process.
|
||||||
*/
|
*/
|
||||||
void EVENT_USB_Host_DeviceAttached(void)
|
void EVENT_USB_Host_DeviceAttached(void)
|
||||||
{
|
{
|
||||||
puts_P(PSTR(ESC_FG_GREEN "Device Attached.\r\n" ESC_FG_WHITE));
|
puts_P(PSTR(ESC_FG_GREEN "Device Attached.\r\n" ESC_FG_WHITE));
|
||||||
LEDs_SetAllLEDs(LEDMASK_USB_ENUMERATING);
|
LEDs_SetAllLEDs(LEDMASK_USB_ENUMERATING);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Event handler for the USB_DeviceUnattached event. This indicates that a device has been removed from the host, and
|
/** Event handler for the USB_DeviceUnattached event. This indicates that a device has been removed from the host, and
|
||||||
* stops the library USB task management process.
|
* stops the library USB task management process.
|
||||||
*/
|
*/
|
||||||
void EVENT_USB_Host_DeviceUnattached(void)
|
void EVENT_USB_Host_DeviceUnattached(void)
|
||||||
{
|
{
|
||||||
puts_P(PSTR(ESC_FG_GREEN "Device Unattached.\r\n" ESC_FG_WHITE));
|
puts_P(PSTR(ESC_FG_GREEN "Device Unattached.\r\n" ESC_FG_WHITE));
|
||||||
LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY);
|
LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Event handler for the USB_DeviceEnumerationComplete event. This indicates that a device has been successfully
|
/** Event handler for the USB_DeviceEnumerationComplete event. This indicates that a device has been successfully
|
||||||
* enumerated by the host and is now ready to be used by the application.
|
* enumerated by the host and is now ready to be used by the application.
|
||||||
*/
|
*/
|
||||||
void EVENT_USB_Host_DeviceEnumerationComplete(void)
|
void EVENT_USB_Host_DeviceEnumerationComplete(void)
|
||||||
{
|
{
|
||||||
LEDs_SetAllLEDs(LEDMASK_USB_READY);
|
LEDs_SetAllLEDs(LEDMASK_USB_READY);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Event handler for the USB_HostError event. This indicates that a hardware error occurred while in host mode. */
|
/** Event handler for the USB_HostError event. This indicates that a hardware error occurred while in host mode. */
|
||||||
void EVENT_USB_Host_HostError(const uint8_t ErrorCode)
|
void EVENT_USB_Host_HostError(const uint8_t ErrorCode)
|
||||||
{
|
{
|
||||||
USB_Disable();
|
USB_Disable();
|
||||||
|
|
||||||
printf_P(PSTR(ESC_FG_RED "Host Mode Error\r\n"
|
printf_P(PSTR(ESC_FG_RED "Host Mode Error\r\n"
|
||||||
" -- Error Code %d\r\n" ESC_FG_WHITE), ErrorCode);
|
" -- Error Code %d\r\n" ESC_FG_WHITE), ErrorCode);
|
||||||
|
|
||||||
LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
|
LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
|
||||||
for(;;);
|
for(;;);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Event handler for the USB_DeviceEnumerationFailed event. This indicates that a problem occurred while
|
/** Event handler for the USB_DeviceEnumerationFailed event. This indicates that a problem occurred while
|
||||||
* enumerating an attached USB device.
|
* enumerating an attached USB device.
|
||||||
*/
|
*/
|
||||||
void EVENT_USB_Host_DeviceEnumerationFailed(const uint8_t ErrorCode,
|
void EVENT_USB_Host_DeviceEnumerationFailed(const uint8_t ErrorCode,
|
||||||
const uint8_t SubErrorCode)
|
const uint8_t SubErrorCode)
|
||||||
{
|
{
|
||||||
printf_P(PSTR(ESC_FG_RED "Dev Enum Error\r\n"
|
printf_P(PSTR(ESC_FG_RED "Dev Enum Error\r\n"
|
||||||
" -- Error Code %d\r\n"
|
" -- Error Code %d\r\n"
|
||||||
" -- Sub Error Code %d\r\n"
|
" -- Sub Error Code %d\r\n"
|
||||||
" -- In State %d\r\n" ESC_FG_WHITE), ErrorCode, SubErrorCode, USB_HostState);
|
" -- In State %d\r\n" ESC_FG_WHITE), ErrorCode, SubErrorCode, USB_HostState);
|
||||||
|
|
||||||
LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
|
LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Audio_Task(void)
|
void Audio_Task(void)
|
||||||
{
|
{
|
||||||
uint8_t ErrorCode;
|
uint8_t ErrorCode;
|
||||||
|
|
||||||
switch (USB_HostState)
|
switch (USB_HostState)
|
||||||
{
|
{
|
||||||
case HOST_STATE_Addressed:
|
case HOST_STATE_Addressed:
|
||||||
puts_P(PSTR("Getting Config Data.\r\n"));
|
puts_P(PSTR("Getting Config Data.\r\n"));
|
||||||
|
|
||||||
/* Get and process the configuration descriptor data */
|
/* Get and process the configuration descriptor data */
|
||||||
if ((ErrorCode = ProcessConfigurationDescriptor()) != SuccessfulConfigRead)
|
if ((ErrorCode = ProcessConfigurationDescriptor()) != SuccessfulConfigRead)
|
||||||
{
|
{
|
||||||
if (ErrorCode == ControlError)
|
if (ErrorCode == ControlError)
|
||||||
puts_P(PSTR(ESC_FG_RED "Control Error (Get Configuration).\r\n"));
|
puts_P(PSTR(ESC_FG_RED "Control Error (Get Configuration).\r\n"));
|
||||||
else
|
else
|
||||||
puts_P(PSTR(ESC_FG_RED "Invalid Device.\r\n"));
|
puts_P(PSTR(ESC_FG_RED "Invalid Device.\r\n"));
|
||||||
|
|
||||||
printf_P(PSTR(" -- Error Code: %d\r\n" ESC_FG_WHITE), ErrorCode);
|
printf_P(PSTR(" -- Error Code: %d\r\n" ESC_FG_WHITE), ErrorCode);
|
||||||
|
|
||||||
/* Indicate error status */
|
/* Indicate error status */
|
||||||
LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
|
LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
|
||||||
|
|
||||||
/* Wait until USB device disconnected */
|
/* Wait until USB device disconnected */
|
||||||
USB_HostState = HOST_STATE_WaitForDeviceRemoval;
|
USB_HostState = HOST_STATE_WaitForDeviceRemoval;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Set the device configuration to the first configuration (rarely do devices use multiple configurations) */
|
/* Set the device configuration to the first configuration (rarely do devices use multiple configurations) */
|
||||||
if ((ErrorCode = USB_Host_SetDeviceConfiguration(1)) != HOST_SENDCONTROL_Successful)
|
if ((ErrorCode = USB_Host_SetDeviceConfiguration(1)) != HOST_SENDCONTROL_Successful)
|
||||||
{
|
{
|
||||||
printf_P(PSTR(ESC_FG_RED "Control Error (Set Configuration).\r\n"
|
printf_P(PSTR(ESC_FG_RED "Control Error (Set Configuration).\r\n"
|
||||||
" -- Error Code: %d\r\n" ESC_FG_WHITE), ErrorCode);
|
" -- Error Code: %d\r\n" ESC_FG_WHITE), ErrorCode);
|
||||||
|
|
||||||
/* Indicate error status */
|
/* Indicate error status */
|
||||||
LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
|
LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
|
||||||
|
|
||||||
/* Wait until USB device disconnected */
|
/* Wait until USB device disconnected */
|
||||||
USB_HostState = HOST_STATE_WaitForDeviceRemoval;
|
USB_HostState = HOST_STATE_WaitForDeviceRemoval;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((ErrorCode = USB_Host_SetInterfaceAltSetting(StreamingInterfaceIndex,
|
if ((ErrorCode = USB_Host_SetInterfaceAltSetting(StreamingInterfaceIndex,
|
||||||
StreamingInterfaceAltSetting)) != HOST_SENDCONTROL_Successful)
|
StreamingInterfaceAltSetting)) != HOST_SENDCONTROL_Successful)
|
||||||
{
|
{
|
||||||
printf_P(PSTR(ESC_FG_RED "Could not set alternative streaming interface setting.\r\n"
|
printf_P(PSTR(ESC_FG_RED "Could not set alternative streaming interface setting.\r\n"
|
||||||
" -- Error Code: %d\r\n" ESC_FG_WHITE), ErrorCode);
|
" -- Error Code: %d\r\n" ESC_FG_WHITE), ErrorCode);
|
||||||
|
|
||||||
/* Indicate error status */
|
/* Indicate error status */
|
||||||
LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
|
LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
|
||||||
|
|
||||||
/* Wait until USB device disconnected */
|
/* Wait until USB device disconnected */
|
||||||
USB_HostState = HOST_STATE_WaitForDeviceRemoval;
|
USB_HostState = HOST_STATE_WaitForDeviceRemoval;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
USB_ControlRequest = (USB_Request_Header_t)
|
USB_ControlRequest = (USB_Request_Header_t)
|
||||||
{
|
{
|
||||||
.bmRequestType = (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_ENDPOINT),
|
.bmRequestType = (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_ENDPOINT),
|
||||||
.bRequest = AUDIO_REQ_SetCurrent,
|
.bRequest = AUDIO_REQ_SetCurrent,
|
||||||
.wValue = (AUDIO_EPCONTROL_SamplingFreq << 8),
|
.wValue = (AUDIO_EPCONTROL_SamplingFreq << 8),
|
||||||
.wIndex = StreamingEndpointAddress,
|
.wIndex = StreamingEndpointAddress,
|
||||||
.wLength = sizeof(USB_Audio_SampleFreq_t),
|
.wLength = sizeof(USB_Audio_SampleFreq_t),
|
||||||
};
|
};
|
||||||
|
|
||||||
USB_Audio_SampleFreq_t SampleRate = AUDIO_SAMPLE_FREQ(48000);
|
USB_Audio_SampleFreq_t SampleRate = AUDIO_SAMPLE_FREQ(48000);
|
||||||
|
|
||||||
/* Select the control pipe for the request transfer */
|
/* Select the control pipe for the request transfer */
|
||||||
Pipe_SelectPipe(PIPE_CONTROLPIPE);
|
Pipe_SelectPipe(PIPE_CONTROLPIPE);
|
||||||
|
|
||||||
/* Set the sample rate on the streaming interface endpoint */
|
/* Set the sample rate on the streaming interface endpoint */
|
||||||
if ((ErrorCode = USB_Host_SendControlRequest(&SampleRate)) != HOST_SENDCONTROL_Successful)
|
if ((ErrorCode = USB_Host_SendControlRequest(&SampleRate)) != HOST_SENDCONTROL_Successful)
|
||||||
{
|
{
|
||||||
/* Indicate error status */
|
/* Indicate error status */
|
||||||
LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
|
LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
|
||||||
|
|
||||||
/* Wait until USB device disconnected */
|
/* Wait until USB device disconnected */
|
||||||
USB_HostState = HOST_STATE_WaitForDeviceRemoval;
|
USB_HostState = HOST_STATE_WaitForDeviceRemoval;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Sample reload timer initialization */
|
/* Sample reload timer initialization */
|
||||||
TIMSK0 = (1 << OCIE0A);
|
TIMSK0 = (1 << OCIE0A);
|
||||||
OCR0A = ((F_CPU / 8 / 48000) - 1);
|
OCR0A = ((F_CPU / 8 / 48000) - 1);
|
||||||
TCCR0A = (1 << WGM01); // CTC mode
|
TCCR0A = (1 << WGM01); // CTC mode
|
||||||
TCCR0B = (1 << CS01); // Fcpu/8 speed
|
TCCR0B = (1 << CS01); // Fcpu/8 speed
|
||||||
|
|
||||||
/* Set speaker as output */
|
/* Set speaker as output */
|
||||||
DDRC |= (1 << 6);
|
DDRC |= (1 << 6);
|
||||||
|
|
||||||
/* PWM speaker timer initialization */
|
/* PWM speaker timer initialization */
|
||||||
TCCR3A = ((1 << WGM30) | (1 << COM3A1) | (1 << COM3A0)); // Set on match, clear on TOP
|
TCCR3A = ((1 << WGM30) | (1 << COM3A1) | (1 << COM3A0)); // Set on match, clear on TOP
|
||||||
TCCR3B = ((1 << WGM32) | (1 << CS30)); // Fast 8-Bit PWM, F_CPU speed
|
TCCR3B = ((1 << WGM32) | (1 << CS30)); // Fast 8-Bit PWM, F_CPU speed
|
||||||
|
|
||||||
puts_P(PSTR("Microphone Enumerated.\r\n"));
|
puts_P(PSTR("Microphone Enumerated.\r\n"));
|
||||||
|
|
||||||
USB_HostState = HOST_STATE_Configured;
|
USB_HostState = HOST_STATE_Configured;
|
||||||
break;
|
break;
|
||||||
case HOST_STATE_Configured:
|
case HOST_STATE_Configured:
|
||||||
/* Do nothing - audio stream is handled by the timer interrupt routine */
|
/* Do nothing - audio stream is handled by the timer interrupt routine */
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/** ISR to handle the reloading of the PWM timer with the next sample. */
|
/** ISR to handle the reloading of the PWM timer with the next sample. */
|
||||||
ISR(TIMER0_COMPA_vect, ISR_BLOCK)
|
ISR(TIMER0_COMPA_vect, ISR_BLOCK)
|
||||||
{
|
{
|
||||||
uint8_t PrevPipe = Pipe_GetCurrentPipe();
|
uint8_t PrevPipe = Pipe_GetCurrentPipe();
|
||||||
|
|
||||||
Pipe_SelectPipe(AUDIO_DATA_IN_PIPE);
|
Pipe_SelectPipe(AUDIO_DATA_IN_PIPE);
|
||||||
Pipe_Unfreeze();
|
Pipe_Unfreeze();
|
||||||
|
|
||||||
/* Check if the current pipe can be read from (contains a packet) and the device is sending data */
|
/* Check if the current pipe can be read from (contains a packet) and the device is sending data */
|
||||||
if (Pipe_IsINReceived())
|
if (Pipe_IsINReceived())
|
||||||
{
|
{
|
||||||
/* Retrieve the signed 16-bit audio sample, convert to 8-bit */
|
/* Retrieve the signed 16-bit audio sample, convert to 8-bit */
|
||||||
int8_t Sample_8Bit = (Pipe_Read_16_LE() >> 8);
|
int8_t Sample_8Bit = (Pipe_Read_16_LE() >> 8);
|
||||||
|
|
||||||
/* Check to see if the bank is now empty */
|
/* Check to see if the bank is now empty */
|
||||||
if (!(Pipe_IsReadWriteAllowed()))
|
if (!(Pipe_IsReadWriteAllowed()))
|
||||||
{
|
{
|
||||||
/* Acknowledge the packet, clear the bank ready for the next packet */
|
/* Acknowledge the packet, clear the bank ready for the next packet */
|
||||||
Pipe_ClearIN();
|
Pipe_ClearIN();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Load the sample into the PWM timer channel */
|
/* Load the sample into the PWM timer channel */
|
||||||
OCR3A = (Sample_8Bit ^ (1 << 7));
|
OCR3A = (Sample_8Bit ^ (1 << 7));
|
||||||
|
|
||||||
uint8_t LEDMask = LEDS_NO_LEDS;
|
uint8_t LEDMask = LEDS_NO_LEDS;
|
||||||
|
|
||||||
/* Turn on LEDs as the sample amplitude increases */
|
/* Turn on LEDs as the sample amplitude increases */
|
||||||
if (Sample_8Bit > 16)
|
if (Sample_8Bit > 16)
|
||||||
LEDMask = (LEDS_LED1 | LEDS_LED2 | LEDS_LED3 | LEDS_LED4);
|
LEDMask = (LEDS_LED1 | LEDS_LED2 | LEDS_LED3 | LEDS_LED4);
|
||||||
else if (Sample_8Bit > 8)
|
else if (Sample_8Bit > 8)
|
||||||
LEDMask = (LEDS_LED1 | LEDS_LED2 | LEDS_LED3);
|
LEDMask = (LEDS_LED1 | LEDS_LED2 | LEDS_LED3);
|
||||||
else if (Sample_8Bit > 4)
|
else if (Sample_8Bit > 4)
|
||||||
LEDMask = (LEDS_LED1 | LEDS_LED2);
|
LEDMask = (LEDS_LED1 | LEDS_LED2);
|
||||||
else if (Sample_8Bit > 2)
|
else if (Sample_8Bit > 2)
|
||||||
LEDMask = (LEDS_LED1);
|
LEDMask = (LEDS_LED1);
|
||||||
|
|
||||||
LEDs_SetAllLEDs(LEDMask);
|
LEDs_SetAllLEDs(LEDMask);
|
||||||
}
|
}
|
||||||
|
|
||||||
Pipe_Freeze();
|
Pipe_Freeze();
|
||||||
Pipe_SelectPipe(PrevPipe);
|
Pipe_SelectPipe(PrevPipe);
|
||||||
}
|
}
|
||||||
|
@ -1,80 +1,80 @@
|
|||||||
/*
|
/*
|
||||||
LUFA Library
|
LUFA Library
|
||||||
Copyright (C) Dean Camera, 2011.
|
Copyright (C) Dean Camera, 2011.
|
||||||
|
|
||||||
dean [at] fourwalledcubicle [dot] com
|
dean [at] fourwalledcubicle [dot] com
|
||||||
www.lufa-lib.org
|
www.lufa-lib.org
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com)
|
Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com)
|
||||||
|
|
||||||
Permission to use, copy, modify, distribute, and sell this
|
Permission to use, copy, modify, distribute, and sell this
|
||||||
software and its documentation for any purpose is hereby granted
|
software and its documentation for any purpose is hereby granted
|
||||||
without fee, provided that the above copyright notice appear in
|
without fee, provided that the above copyright notice appear in
|
||||||
all copies and that both that the copyright notice and this
|
all copies and that both that the copyright notice and this
|
||||||
permission notice and warranty disclaimer appear in supporting
|
permission notice and warranty disclaimer appear in supporting
|
||||||
documentation, and that the name of the author not be used in
|
documentation, and that the name of the author not be used in
|
||||||
advertising or publicity pertaining to distribution of the
|
advertising or publicity pertaining to distribution of the
|
||||||
software without specific, written prior permission.
|
software without specific, written prior permission.
|
||||||
|
|
||||||
The author disclaim all warranties with regard to this
|
The author disclaim all warranties with regard to this
|
||||||
software, including all implied warranties of merchantability
|
software, including all implied warranties of merchantability
|
||||||
and fitness. In no event shall the author be liable for any
|
and fitness. In no event shall the author be liable for any
|
||||||
special, indirect or consequential damages or any damages
|
special, indirect or consequential damages or any damages
|
||||||
whatsoever resulting from loss of use, data or profits, whether
|
whatsoever resulting from loss of use, data or profits, whether
|
||||||
in an action of contract, negligence or other tortious action,
|
in an action of contract, negligence or other tortious action,
|
||||||
arising out of or in connection with the use or performance of
|
arising out of or in connection with the use or performance of
|
||||||
this software.
|
this software.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/** \file
|
/** \file
|
||||||
*
|
*
|
||||||
* Header file for AudioInputHost.c.
|
* Header file for AudioInputHost.c.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _AUDIO_INPUT_HOST_H_
|
#ifndef _AUDIO_INPUT_HOST_H_
|
||||||
#define _AUDIO_INPUT_HOST_H_
|
#define _AUDIO_INPUT_HOST_H_
|
||||||
|
|
||||||
/* Includes: */
|
/* Includes: */
|
||||||
#include <avr/io.h>
|
#include <avr/io.h>
|
||||||
#include <avr/wdt.h>
|
#include <avr/wdt.h>
|
||||||
#include <avr/pgmspace.h>
|
#include <avr/pgmspace.h>
|
||||||
#include <avr/power.h>
|
#include <avr/power.h>
|
||||||
#include <avr/interrupt.h>
|
#include <avr/interrupt.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
#include <LUFA/Version.h>
|
#include <LUFA/Version.h>
|
||||||
#include <LUFA/Drivers/Misc/TerminalCodes.h>
|
#include <LUFA/Drivers/Misc/TerminalCodes.h>
|
||||||
#include <LUFA/Drivers/USB/USB.h>
|
#include <LUFA/Drivers/USB/USB.h>
|
||||||
#include <LUFA/Drivers/Peripheral/Serial.h>
|
#include <LUFA/Drivers/Peripheral/Serial.h>
|
||||||
#include <LUFA/Drivers/Board/LEDs.h>
|
#include <LUFA/Drivers/Board/LEDs.h>
|
||||||
|
|
||||||
#include "ConfigDescriptor.h"
|
#include "ConfigDescriptor.h"
|
||||||
|
|
||||||
/* Macros: */
|
/* Macros: */
|
||||||
/** LED mask for the library LED driver, to indicate that the USB interface is not ready. */
|
/** LED mask for the library LED driver, to indicate that the USB interface is not ready. */
|
||||||
#define LEDMASK_USB_NOTREADY LEDS_LED1
|
#define LEDMASK_USB_NOTREADY LEDS_LED1
|
||||||
|
|
||||||
/** LED mask for the library LED driver, to indicate that the USB interface is enumerating. */
|
/** LED mask for the library LED driver, to indicate that the USB interface is enumerating. */
|
||||||
#define LEDMASK_USB_ENUMERATING (LEDS_LED2 | LEDS_LED3)
|
#define LEDMASK_USB_ENUMERATING (LEDS_LED2 | LEDS_LED3)
|
||||||
|
|
||||||
/** LED mask for the library LED driver, to indicate that the USB interface is ready. */
|
/** LED mask for the library LED driver, to indicate that the USB interface is ready. */
|
||||||
#define LEDMASK_USB_READY (LEDS_LED2 | LEDS_LED4)
|
#define LEDMASK_USB_READY (LEDS_LED2 | LEDS_LED4)
|
||||||
|
|
||||||
/** LED mask for the library LED driver, to indicate that an error has occurred in the USB interface. */
|
/** LED mask for the library LED driver, to indicate that an error has occurred in the USB interface. */
|
||||||
#define LEDMASK_USB_ERROR (LEDS_LED1 | LEDS_LED3)
|
#define LEDMASK_USB_ERROR (LEDS_LED1 | LEDS_LED3)
|
||||||
|
|
||||||
/* Function Prototypes: */
|
/* Function Prototypes: */
|
||||||
void Audio_Task(void);
|
void Audio_Task(void);
|
||||||
void SetupHardware(void);
|
void SetupHardware(void);
|
||||||
|
|
||||||
void EVENT_USB_Host_HostError(const uint8_t ErrorCode);
|
void EVENT_USB_Host_HostError(const uint8_t ErrorCode);
|
||||||
void EVENT_USB_Host_DeviceAttached(void);
|
void EVENT_USB_Host_DeviceAttached(void);
|
||||||
void EVENT_USB_Host_DeviceUnattached(void);
|
void EVENT_USB_Host_DeviceUnattached(void);
|
||||||
void EVENT_USB_Host_DeviceEnumerationFailed(const uint8_t ErrorCode,
|
void EVENT_USB_Host_DeviceEnumerationFailed(const uint8_t ErrorCode,
|
||||||
const uint8_t SubErrorCode);
|
const uint8_t SubErrorCode);
|
||||||
void EVENT_USB_Host_DeviceEnumerationComplete(void);
|
void EVENT_USB_Host_DeviceEnumerationComplete(void);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -1,66 +1,66 @@
|
|||||||
/** \file
|
/** \file
|
||||||
*
|
*
|
||||||
* This file contains special DoxyGen information for the generation of the main page and other special
|
* This file contains special DoxyGen information for the generation of the main page and other special
|
||||||
* documentation pages. It is not a project source file.
|
* documentation pages. It is not a project source file.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/** \mainpage Audio Input Host Demo
|
/** \mainpage Audio Input Host Demo
|
||||||
*
|
*
|
||||||
* \section Sec_Compat Demo Compatibility:
|
* \section Sec_Compat Demo Compatibility:
|
||||||
*
|
*
|
||||||
* The following list indicates what microcontrollers are compatible with this demo.
|
* The following list indicates what microcontrollers are compatible with this demo.
|
||||||
*
|
*
|
||||||
* - Series 7 USB AVRs (AT90USBxxx7)
|
* - Series 7 USB AVRs (AT90USBxxx7)
|
||||||
*
|
*
|
||||||
* \section Sec_Info USB Information:
|
* \section Sec_Info USB Information:
|
||||||
*
|
*
|
||||||
* The following table gives a rundown of the USB utilization of this demo.
|
* The following table gives a rundown of the USB utilization of this demo.
|
||||||
*
|
*
|
||||||
* <table>
|
* <table>
|
||||||
* <tr>
|
* <tr>
|
||||||
* <td><b>USB Mode:</b></td>
|
* <td><b>USB Mode:</b></td>
|
||||||
* <td>Host</td>
|
* <td>Host</td>
|
||||||
* </tr>
|
* </tr>
|
||||||
* <tr>
|
* <tr>
|
||||||
* <td><b>USB Class:</b></td>
|
* <td><b>USB Class:</b></td>
|
||||||
* <td>Audio Class</td>
|
* <td>Audio Class</td>
|
||||||
* </tr>
|
* </tr>
|
||||||
* <tr>
|
* <tr>
|
||||||
* <td><b>USB Subclass:</b></td>
|
* <td><b>USB Subclass:</b></td>
|
||||||
* <td>Standard Audio Device</td>
|
* <td>Standard Audio Device</td>
|
||||||
* </tr>
|
* </tr>
|
||||||
* <tr>
|
* <tr>
|
||||||
* <td><b>Relevant Standards:</b></td>
|
* <td><b>Relevant Standards:</b></td>
|
||||||
* <td>USBIF Audio 1.0 Class Specification \n
|
* <td>USBIF Audio 1.0 Class Specification \n
|
||||||
* USBIF Audio 1.0 Class Terminal Types Specification \n
|
* USBIF Audio 1.0 Class Terminal Types Specification \n
|
||||||
* USBIF Audio 1.0 Data Formats Specification</td>
|
* USBIF Audio 1.0 Data Formats Specification</td>
|
||||||
* </tr>
|
* </tr>
|
||||||
* <tr>
|
* <tr>
|
||||||
* <td><b>Usable Speeds:</b></td>
|
* <td><b>Usable Speeds:</b></td>
|
||||||
* <td>Full Speed Mode</td>
|
* <td>Full Speed Mode</td>
|
||||||
* </tr>
|
* </tr>
|
||||||
* </table>
|
* </table>
|
||||||
*
|
*
|
||||||
* \section Sec_Description Project Description:
|
* \section Sec_Description Project Description:
|
||||||
*
|
*
|
||||||
* Audio Input host demonstration application. This gives a simple reference
|
* Audio Input host demonstration application. This gives a simple reference
|
||||||
* application for implementing a USB Audio host, for USB Audio devices using
|
* application for implementing a USB Audio host, for USB Audio devices using
|
||||||
* the USB Audio 1.0 class profile.
|
* the USB Audio 1.0 class profile.
|
||||||
*
|
*
|
||||||
* Incoming audio will output in 8-bit PWM onto the timer 3 output compare
|
* Incoming audio will output in 8-bit PWM onto the timer 3 output compare
|
||||||
* channel A, and will also be indicated on the board LEDs. Decouple the PWM
|
* channel A, and will also be indicated on the board LEDs. Decouple the PWM
|
||||||
* output with a capacitor and attach to a speaker to hear the audio.
|
* output with a capacitor and attach to a speaker to hear the audio.
|
||||||
*
|
*
|
||||||
* \section Sec_Options Project Options
|
* \section Sec_Options Project Options
|
||||||
*
|
*
|
||||||
* The following defines can be found in this demo, which can control the demo behaviour when defined, or changed in value.
|
* The following defines can be found in this demo, which can control the demo behaviour when defined, or changed in value.
|
||||||
*
|
*
|
||||||
* <table>
|
* <table>
|
||||||
* <tr>
|
* <tr>
|
||||||
* <td>
|
* <td>
|
||||||
* None
|
* None
|
||||||
* </td>
|
* </td>
|
||||||
* </tr>
|
* </tr>
|
||||||
* </table>
|
* </table>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
@ -1,220 +1,220 @@
|
|||||||
/*
|
/*
|
||||||
LUFA Library
|
LUFA Library
|
||||||
Copyright (C) Dean Camera, 2011.
|
Copyright (C) Dean Camera, 2011.
|
||||||
|
|
||||||
dean [at] fourwalledcubicle [dot] com
|
dean [at] fourwalledcubicle [dot] com
|
||||||
www.lufa-lib.org
|
www.lufa-lib.org
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com)
|
Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com)
|
||||||
|
|
||||||
Permission to use, copy, modify, distribute, and sell this
|
Permission to use, copy, modify, distribute, and sell this
|
||||||
software and its documentation for any purpose is hereby granted
|
software and its documentation for any purpose is hereby granted
|
||||||
without fee, provided that the above copyright notice appear in
|
without fee, provided that the above copyright notice appear in
|
||||||
all copies and that both that the copyright notice and this
|
all copies and that both that the copyright notice and this
|
||||||
permission notice and warranty disclaimer appear in supporting
|
permission notice and warranty disclaimer appear in supporting
|
||||||
documentation, and that the name of the author not be used in
|
documentation, and that the name of the author not be used in
|
||||||
advertising or publicity pertaining to distribution of the
|
advertising or publicity pertaining to distribution of the
|
||||||
software without specific, written prior permission.
|
software without specific, written prior permission.
|
||||||
|
|
||||||
The author disclaim all warranties with regard to this
|
The author disclaim all warranties with regard to this
|
||||||
software, including all implied warranties of merchantability
|
software, including all implied warranties of merchantability
|
||||||
and fitness. In no event shall the author be liable for any
|
and fitness. In no event shall the author be liable for any
|
||||||
special, indirect or consequential damages or any damages
|
special, indirect or consequential damages or any damages
|
||||||
whatsoever resulting from loss of use, data or profits, whether
|
whatsoever resulting from loss of use, data or profits, whether
|
||||||
in an action of contract, negligence or other tortious action,
|
in an action of contract, negligence or other tortious action,
|
||||||
arising out of or in connection with the use or performance of
|
arising out of or in connection with the use or performance of
|
||||||
this software.
|
this software.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/** \file
|
/** \file
|
||||||
*
|
*
|
||||||
* USB Device Configuration Descriptor processing routines, to determine the correct pipe configurations
|
* USB Device Configuration Descriptor processing routines, to determine the correct pipe configurations
|
||||||
* needed to communication with an attached USB device. Descriptors are special computer-readable structures
|
* needed to communication with an attached USB device. Descriptors are special computer-readable structures
|
||||||
* which the host requests upon device enumeration, to determine the device's capabilities and functions.
|
* which the host requests upon device enumeration, to determine the device's capabilities and functions.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "ConfigDescriptor.h"
|
#include "ConfigDescriptor.h"
|
||||||
|
|
||||||
/** Index of the currently used Audio Streaming Interface within the device. */
|
/** Index of the currently used Audio Streaming Interface within the device. */
|
||||||
uint8_t StreamingInterfaceIndex = 0;
|
uint8_t StreamingInterfaceIndex = 0;
|
||||||
|
|
||||||
/** Alternative Setting of the currently used Audio Streaming Interface within the device. */
|
/** Alternative Setting of the currently used Audio Streaming Interface within the device. */
|
||||||
uint8_t StreamingInterfaceAltSetting = 0;
|
uint8_t StreamingInterfaceAltSetting = 0;
|
||||||
|
|
||||||
/** Address of the streaming audio endpoint currently in use within the device. */
|
/** Address of the streaming audio endpoint currently in use within the device. */
|
||||||
uint8_t StreamingEndpointAddress = 0;
|
uint8_t StreamingEndpointAddress = 0;
|
||||||
|
|
||||||
|
|
||||||
/** Reads and processes an attached device's descriptors, to determine compatibility and pipe configurations. This
|
/** Reads and processes an attached device's descriptors, to determine compatibility and pipe configurations. This
|
||||||
* routine will read in the entire configuration descriptor, and configure the hosts pipes to correctly communicate
|
* routine will read in the entire configuration descriptor, and configure the hosts pipes to correctly communicate
|
||||||
* with compatible devices.
|
* with compatible devices.
|
||||||
*
|
*
|
||||||
* This routine searches for a Streaming Audio interface descriptor containing a valid Isochronous audio endpoint.
|
* This routine searches for a Streaming Audio interface descriptor containing a valid Isochronous audio endpoint.
|
||||||
*
|
*
|
||||||
* \return An error code from the \ref AudioHost_GetConfigDescriptorDataCodes_t enum.
|
* \return An error code from the \ref AudioHost_GetConfigDescriptorDataCodes_t enum.
|
||||||
*/
|
*/
|
||||||
uint8_t ProcessConfigurationDescriptor(void)
|
uint8_t ProcessConfigurationDescriptor(void)
|
||||||
{
|
{
|
||||||
uint8_t ConfigDescriptorData[512];
|
uint8_t ConfigDescriptorData[512];
|
||||||
void* CurrConfigLocation = ConfigDescriptorData;
|
void* CurrConfigLocation = ConfigDescriptorData;
|
||||||
uint16_t CurrConfigBytesRem;
|
uint16_t CurrConfigBytesRem;
|
||||||
|
|
||||||
USB_Descriptor_Interface_t* AudioControlInterface = NULL;
|
USB_Descriptor_Interface_t* AudioControlInterface = NULL;
|
||||||
USB_Descriptor_Interface_t* AudioStreamingInterface = NULL;
|
USB_Descriptor_Interface_t* AudioStreamingInterface = NULL;
|
||||||
USB_Descriptor_Endpoint_t* DataINEndpoint = NULL;
|
USB_Descriptor_Endpoint_t* DataINEndpoint = NULL;
|
||||||
|
|
||||||
/* Retrieve the entire configuration descriptor into the allocated buffer */
|
/* Retrieve the entire configuration descriptor into the allocated buffer */
|
||||||
switch (USB_Host_GetDeviceConfigDescriptor(1, &CurrConfigBytesRem, ConfigDescriptorData, sizeof(ConfigDescriptorData)))
|
switch (USB_Host_GetDeviceConfigDescriptor(1, &CurrConfigBytesRem, ConfigDescriptorData, sizeof(ConfigDescriptorData)))
|
||||||
{
|
{
|
||||||
case HOST_GETCONFIG_Successful:
|
case HOST_GETCONFIG_Successful:
|
||||||
break;
|
break;
|
||||||
case HOST_GETCONFIG_InvalidData:
|
case HOST_GETCONFIG_InvalidData:
|
||||||
return InvalidConfigDataReturned;
|
return InvalidConfigDataReturned;
|
||||||
case HOST_GETCONFIG_BuffOverflow:
|
case HOST_GETCONFIG_BuffOverflow:
|
||||||
return DescriptorTooLarge;
|
return DescriptorTooLarge;
|
||||||
default:
|
default:
|
||||||
return ControlError;
|
return ControlError;
|
||||||
}
|
}
|
||||||
|
|
||||||
while (!(DataINEndpoint))
|
while (!(DataINEndpoint))
|
||||||
{
|
{
|
||||||
/* See if we've found a likely compatible interface, and if there is an endpoint within that interface */
|
/* See if we've found a likely compatible interface, and if there is an endpoint within that interface */
|
||||||
if (!(AudioControlInterface) ||
|
if (!(AudioControlInterface) ||
|
||||||
USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation,
|
USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation,
|
||||||
DComp_NextAudioInterfaceDataEndpoint) != DESCRIPTOR_SEARCH_COMP_Found)
|
DComp_NextAudioInterfaceDataEndpoint) != DESCRIPTOR_SEARCH_COMP_Found)
|
||||||
{
|
{
|
||||||
/* Check if we haven't found an Audio Control interface yet, or if we have run out of related Audio Streaming interfaces */
|
/* Check if we haven't found an Audio Control interface yet, or if we have run out of related Audio Streaming interfaces */
|
||||||
if (!(AudioControlInterface) ||
|
if (!(AudioControlInterface) ||
|
||||||
USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation,
|
USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation,
|
||||||
DComp_NextAudioStreamInterface) != DESCRIPTOR_SEARCH_COMP_Found)
|
DComp_NextAudioStreamInterface) != DESCRIPTOR_SEARCH_COMP_Found)
|
||||||
{
|
{
|
||||||
/* Find a new Audio Control interface if the current one doesn't contain a compatible streaming interface */
|
/* Find a new Audio Control interface if the current one doesn't contain a compatible streaming interface */
|
||||||
if (USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation,
|
if (USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation,
|
||||||
DComp_NextAudioControlInterface) != DESCRIPTOR_SEARCH_COMP_Found)
|
DComp_NextAudioControlInterface) != DESCRIPTOR_SEARCH_COMP_Found)
|
||||||
{
|
{
|
||||||
/* Descriptor not found, error out */
|
/* Descriptor not found, error out */
|
||||||
return NoCompatibleInterfaceFound;
|
return NoCompatibleInterfaceFound;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Save the interface in case we need to refer back to it later */
|
/* Save the interface in case we need to refer back to it later */
|
||||||
AudioControlInterface = DESCRIPTOR_PCAST(CurrConfigLocation, USB_Descriptor_Interface_t);
|
AudioControlInterface = DESCRIPTOR_PCAST(CurrConfigLocation, USB_Descriptor_Interface_t);
|
||||||
|
|
||||||
/* Find the next Audio Streaming interface within that Audio Control interface */
|
/* Find the next Audio Streaming interface within that Audio Control interface */
|
||||||
if (USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation,
|
if (USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation,
|
||||||
DComp_NextAudioStreamInterface) != DESCRIPTOR_SEARCH_COMP_Found)
|
DComp_NextAudioStreamInterface) != DESCRIPTOR_SEARCH_COMP_Found)
|
||||||
{
|
{
|
||||||
/* Descriptor not found, error out */
|
/* Descriptor not found, error out */
|
||||||
return NoCompatibleInterfaceFound;
|
return NoCompatibleInterfaceFound;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Save the interface in case we need to refer back to it later */
|
/* Save the interface in case we need to refer back to it later */
|
||||||
AudioStreamingInterface = DESCRIPTOR_PCAST(CurrConfigLocation, USB_Descriptor_Interface_t);
|
AudioStreamingInterface = DESCRIPTOR_PCAST(CurrConfigLocation, USB_Descriptor_Interface_t);
|
||||||
|
|
||||||
/* Skip the remainder of the loop as we have not found an endpoint yet */
|
/* Skip the remainder of the loop as we have not found an endpoint yet */
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Retrieve the endpoint address from the endpoint descriptor */
|
/* Retrieve the endpoint address from the endpoint descriptor */
|
||||||
USB_Descriptor_Endpoint_t* EndpointData = DESCRIPTOR_PCAST(CurrConfigLocation, USB_Descriptor_Endpoint_t);
|
USB_Descriptor_Endpoint_t* EndpointData = DESCRIPTOR_PCAST(CurrConfigLocation, USB_Descriptor_Endpoint_t);
|
||||||
|
|
||||||
/* Save the endpoint if it is an IN type endpoint */
|
/* Save the endpoint if it is an IN type endpoint */
|
||||||
if (EndpointData->EndpointAddress & ENDPOINT_DESCRIPTOR_DIR_IN)
|
if (EndpointData->EndpointAddress & ENDPOINT_DESCRIPTOR_DIR_IN)
|
||||||
DataINEndpoint = EndpointData;
|
DataINEndpoint = EndpointData;
|
||||||
}
|
}
|
||||||
|
|
||||||
StreamingInterfaceIndex = AudioStreamingInterface->InterfaceNumber;
|
StreamingInterfaceIndex = AudioStreamingInterface->InterfaceNumber;
|
||||||
StreamingInterfaceAltSetting = AudioStreamingInterface->AlternateSetting;
|
StreamingInterfaceAltSetting = AudioStreamingInterface->AlternateSetting;
|
||||||
StreamingEndpointAddress = DataINEndpoint->EndpointAddress;
|
StreamingEndpointAddress = DataINEndpoint->EndpointAddress;
|
||||||
|
|
||||||
/* Configure the Audio data IN pipe */
|
/* Configure the Audio data IN pipe */
|
||||||
Pipe_ConfigurePipe(AUDIO_DATA_IN_PIPE, EP_TYPE_ISOCHRONOUS, PIPE_TOKEN_IN,
|
Pipe_ConfigurePipe(AUDIO_DATA_IN_PIPE, EP_TYPE_ISOCHRONOUS, PIPE_TOKEN_IN,
|
||||||
DataINEndpoint->EndpointAddress, DataINEndpoint->EndpointSize, PIPE_BANK_DOUBLE);
|
DataINEndpoint->EndpointAddress, DataINEndpoint->EndpointSize, PIPE_BANK_DOUBLE);
|
||||||
|
|
||||||
/* Valid data found, return success */
|
/* Valid data found, return success */
|
||||||
return SuccessfulConfigRead;
|
return SuccessfulConfigRead;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Descriptor comparator function. This comparator function is can be called while processing an attached USB device's
|
/** Descriptor comparator function. This comparator function is can be called while processing an attached USB device's
|
||||||
* configuration descriptor, to search for a specific sub descriptor. It can also be used to abort the configuration
|
* configuration descriptor, to search for a specific sub descriptor. It can also be used to abort the configuration
|
||||||
* descriptor processing if an incompatible descriptor configuration is found.
|
* descriptor processing if an incompatible descriptor configuration is found.
|
||||||
*
|
*
|
||||||
* This comparator searches for the next Interface descriptor of the correct Audio Control Class, Subclass and Protocol values.
|
* This comparator searches for the next Interface descriptor of the correct Audio Control Class, Subclass and Protocol values.
|
||||||
*
|
*
|
||||||
* \return A value from the DSEARCH_Return_ErrorCodes_t enum
|
* \return A value from the DSEARCH_Return_ErrorCodes_t enum
|
||||||
*/
|
*/
|
||||||
uint8_t DComp_NextAudioControlInterface(void* CurrentDescriptor)
|
uint8_t DComp_NextAudioControlInterface(void* CurrentDescriptor)
|
||||||
{
|
{
|
||||||
USB_Descriptor_Header_t* Header = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Header_t);
|
USB_Descriptor_Header_t* Header = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Header_t);
|
||||||
|
|
||||||
if (Header->Type == DTYPE_Interface)
|
if (Header->Type == DTYPE_Interface)
|
||||||
{
|
{
|
||||||
USB_Descriptor_Interface_t* Interface = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Interface_t);
|
USB_Descriptor_Interface_t* Interface = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Interface_t);
|
||||||
|
|
||||||
if ((Interface->Class == AUDIO_CSCP_AudioClass) &&
|
if ((Interface->Class == AUDIO_CSCP_AudioClass) &&
|
||||||
(Interface->SubClass == AUDIO_CSCP_ControlSubclass) &&
|
(Interface->SubClass == AUDIO_CSCP_ControlSubclass) &&
|
||||||
(Interface->Protocol == AUDIO_CSCP_ControlProtocol))
|
(Interface->Protocol == AUDIO_CSCP_ControlProtocol))
|
||||||
{
|
{
|
||||||
return DESCRIPTOR_SEARCH_Found;
|
return DESCRIPTOR_SEARCH_Found;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return DESCRIPTOR_SEARCH_NotFound;
|
return DESCRIPTOR_SEARCH_NotFound;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Descriptor comparator function. This comparator function is can be called while processing an attached USB device's
|
/** Descriptor comparator function. This comparator function is can be called while processing an attached USB device's
|
||||||
* configuration descriptor, to search for a specific sub descriptor. It can also be used to abort the configuration
|
* configuration descriptor, to search for a specific sub descriptor. It can also be used to abort the configuration
|
||||||
* descriptor processing if an incompatible descriptor configuration is found.
|
* descriptor processing if an incompatible descriptor configuration is found.
|
||||||
*
|
*
|
||||||
* This comparator searches for the next Interface descriptor of the correct Audio Streaming Class, Subclass and Protocol values.
|
* This comparator searches for the next Interface descriptor of the correct Audio Streaming Class, Subclass and Protocol values.
|
||||||
*
|
*
|
||||||
* \return A value from the DSEARCH_Return_ErrorCodes_t enum
|
* \return A value from the DSEARCH_Return_ErrorCodes_t enum
|
||||||
*/
|
*/
|
||||||
uint8_t DComp_NextAudioStreamInterface(void* CurrentDescriptor)
|
uint8_t DComp_NextAudioStreamInterface(void* CurrentDescriptor)
|
||||||
{
|
{
|
||||||
USB_Descriptor_Header_t* Header = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Header_t);
|
USB_Descriptor_Header_t* Header = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Header_t);
|
||||||
|
|
||||||
if (Header->Type == DTYPE_Interface)
|
if (Header->Type == DTYPE_Interface)
|
||||||
{
|
{
|
||||||
USB_Descriptor_Interface_t* Interface = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Interface_t);
|
USB_Descriptor_Interface_t* Interface = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Interface_t);
|
||||||
|
|
||||||
if ((Interface->Class == AUDIO_CSCP_AudioClass) &&
|
if ((Interface->Class == AUDIO_CSCP_AudioClass) &&
|
||||||
(Interface->SubClass == AUDIO_CSCP_AudioStreamingSubclass) &&
|
(Interface->SubClass == AUDIO_CSCP_AudioStreamingSubclass) &&
|
||||||
(Interface->Protocol == AUDIO_CSCP_StreamingProtocol))
|
(Interface->Protocol == AUDIO_CSCP_StreamingProtocol))
|
||||||
{
|
{
|
||||||
return DESCRIPTOR_SEARCH_Found;
|
return DESCRIPTOR_SEARCH_Found;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return DESCRIPTOR_SEARCH_NotFound;
|
return DESCRIPTOR_SEARCH_NotFound;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Descriptor comparator function. This comparator function is can be called while processing an attached USB device's
|
/** Descriptor comparator function. This comparator function is can be called while processing an attached USB device's
|
||||||
* configuration descriptor, to search for a specific sub descriptor. It can also be used to abort the configuration
|
* configuration descriptor, to search for a specific sub descriptor. It can also be used to abort the configuration
|
||||||
* descriptor processing if an incompatible descriptor configuration is found.
|
* descriptor processing if an incompatible descriptor configuration is found.
|
||||||
*
|
*
|
||||||
* This comparator searches for the next Isochronous Endpoint descriptor within the current interface, aborting the
|
* This comparator searches for the next Isochronous Endpoint descriptor within the current interface, aborting the
|
||||||
* search if another interface descriptor is found before the next endpoint.
|
* search if another interface descriptor is found before the next endpoint.
|
||||||
*
|
*
|
||||||
* \return A value from the DSEARCH_Return_ErrorCodes_t enum
|
* \return A value from the DSEARCH_Return_ErrorCodes_t enum
|
||||||
*/
|
*/
|
||||||
uint8_t DComp_NextAudioInterfaceDataEndpoint(void* CurrentDescriptor)
|
uint8_t DComp_NextAudioInterfaceDataEndpoint(void* CurrentDescriptor)
|
||||||
{
|
{
|
||||||
USB_Descriptor_Header_t* Header = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Header_t);
|
USB_Descriptor_Header_t* Header = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Header_t);
|
||||||
|
|
||||||
if (Header->Type == DTYPE_Endpoint)
|
if (Header->Type == DTYPE_Endpoint)
|
||||||
{
|
{
|
||||||
USB_Descriptor_Endpoint_t* Endpoint = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Endpoint_t);
|
USB_Descriptor_Endpoint_t* Endpoint = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Endpoint_t);
|
||||||
|
|
||||||
if ((Endpoint->Attributes & EP_TYPE_MASK) == EP_TYPE_ISOCHRONOUS)
|
if ((Endpoint->Attributes & EP_TYPE_MASK) == EP_TYPE_ISOCHRONOUS)
|
||||||
return DESCRIPTOR_SEARCH_Found;
|
return DESCRIPTOR_SEARCH_Found;
|
||||||
}
|
}
|
||||||
else if (Header->Type == DTYPE_Interface)
|
else if (Header->Type == DTYPE_Interface)
|
||||||
{
|
{
|
||||||
return DESCRIPTOR_SEARCH_Fail;
|
return DESCRIPTOR_SEARCH_Fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
return DESCRIPTOR_SEARCH_NotFound;
|
return DESCRIPTOR_SEARCH_NotFound;
|
||||||
}
|
}
|
||||||
|
@ -1,72 +1,72 @@
|
|||||||
/*
|
/*
|
||||||
LUFA Library
|
LUFA Library
|
||||||
Copyright (C) Dean Camera, 2011.
|
Copyright (C) Dean Camera, 2011.
|
||||||
|
|
||||||
dean [at] fourwalledcubicle [dot] com
|
dean [at] fourwalledcubicle [dot] com
|
||||||
www.lufa-lib.org
|
www.lufa-lib.org
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com)
|
Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com)
|
||||||
|
|
||||||
Permission to use, copy, modify, distribute, and sell this
|
Permission to use, copy, modify, distribute, and sell this
|
||||||
software and its documentation for any purpose is hereby granted
|
software and its documentation for any purpose is hereby granted
|
||||||
without fee, provided that the above copyright notice appear in
|
without fee, provided that the above copyright notice appear in
|
||||||
all copies and that both that the copyright notice and this
|
all copies and that both that the copyright notice and this
|
||||||
permission notice and warranty disclaimer appear in supporting
|
permission notice and warranty disclaimer appear in supporting
|
||||||
documentation, and that the name of the author not be used in
|
documentation, and that the name of the author not be used in
|
||||||
advertising or publicity pertaining to distribution of the
|
advertising or publicity pertaining to distribution of the
|
||||||
software without specific, written prior permission.
|
software without specific, written prior permission.
|
||||||
|
|
||||||
The author disclaim all warranties with regard to this
|
The author disclaim all warranties with regard to this
|
||||||
software, including all implied warranties of merchantability
|
software, including all implied warranties of merchantability
|
||||||
and fitness. In no event shall the author be liable for any
|
and fitness. In no event shall the author be liable for any
|
||||||
special, indirect or consequential damages or any damages
|
special, indirect or consequential damages or any damages
|
||||||
whatsoever resulting from loss of use, data or profits, whether
|
whatsoever resulting from loss of use, data or profits, whether
|
||||||
in an action of contract, negligence or other tortious action,
|
in an action of contract, negligence or other tortious action,
|
||||||
arising out of or in connection with the use or performance of
|
arising out of or in connection with the use or performance of
|
||||||
this software.
|
this software.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/** \file
|
/** \file
|
||||||
*
|
*
|
||||||
* Header file for ConfigDescriptor.c.
|
* Header file for ConfigDescriptor.c.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _CONFIGDESCRIPTOR_H_
|
#ifndef _CONFIGDESCRIPTOR_H_
|
||||||
#define _CONFIGDESCRIPTOR_H_
|
#define _CONFIGDESCRIPTOR_H_
|
||||||
|
|
||||||
/* Includes: */
|
/* Includes: */
|
||||||
#include <LUFA/Drivers/USB/USB.h>
|
#include <LUFA/Drivers/USB/USB.h>
|
||||||
|
|
||||||
#include "AudioInputHost.h"
|
#include "AudioInputHost.h"
|
||||||
|
|
||||||
/* Macros: */
|
/* Macros: */
|
||||||
/** Pipe number for the Audio data IN pipe. */
|
/** Pipe number for the Audio data IN pipe. */
|
||||||
#define AUDIO_DATA_IN_PIPE 1
|
#define AUDIO_DATA_IN_PIPE 1
|
||||||
|
|
||||||
/* Enums: */
|
/* Enums: */
|
||||||
/** Enum for the possible return codes of the \ref ProcessConfigurationDescriptor() function. */
|
/** Enum for the possible return codes of the \ref ProcessConfigurationDescriptor() function. */
|
||||||
enum AudioHost_GetConfigDescriptorDataCodes_t
|
enum AudioHost_GetConfigDescriptorDataCodes_t
|
||||||
{
|
{
|
||||||
SuccessfulConfigRead = 0, /**< Configuration Descriptor was processed successfully */
|
SuccessfulConfigRead = 0, /**< Configuration Descriptor was processed successfully */
|
||||||
ControlError = 1, /**< A control request to the device failed to complete successfully */
|
ControlError = 1, /**< A control request to the device failed to complete successfully */
|
||||||
DescriptorTooLarge = 2, /**< The device's Configuration Descriptor is too large to process */
|
DescriptorTooLarge = 2, /**< The device's Configuration Descriptor is too large to process */
|
||||||
InvalidConfigDataReturned = 3, /**< The device returned an invalid Configuration Descriptor */
|
InvalidConfigDataReturned = 3, /**< The device returned an invalid Configuration Descriptor */
|
||||||
NoCompatibleInterfaceFound = 4, /**< A compatible interface with the required endpoints was not found */
|
NoCompatibleInterfaceFound = 4, /**< A compatible interface with the required endpoints was not found */
|
||||||
};
|
};
|
||||||
|
|
||||||
/* External Variables: */
|
/* External Variables: */
|
||||||
extern uint8_t StreamingInterfaceIndex;
|
extern uint8_t StreamingInterfaceIndex;
|
||||||
extern uint8_t StreamingInterfaceAltSetting;
|
extern uint8_t StreamingInterfaceAltSetting;
|
||||||
extern uint8_t StreamingEndpointAddress;
|
extern uint8_t StreamingEndpointAddress;
|
||||||
|
|
||||||
/* Function Prototypes: */
|
/* Function Prototypes: */
|
||||||
uint8_t ProcessConfigurationDescriptor(void);
|
uint8_t ProcessConfigurationDescriptor(void);
|
||||||
|
|
||||||
uint8_t DComp_NextAudioControlInterface(void* CurrentDescriptor);
|
uint8_t DComp_NextAudioControlInterface(void* CurrentDescriptor);
|
||||||
uint8_t DComp_NextAudioStreamInterface(void* CurrentDescriptor);
|
uint8_t DComp_NextAudioStreamInterface(void* CurrentDescriptor);
|
||||||
uint8_t DComp_NextAudioInterfaceDataEndpoint(void* CurrentDescriptor);
|
uint8_t DComp_NextAudioInterfaceDataEndpoint(void* CurrentDescriptor);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -1,714 +1,714 @@
|
|||||||
# Hey Emacs, this is a -*- makefile -*-
|
# Hey Emacs, this is a -*- makefile -*-
|
||||||
#----------------------------------------------------------------------------
|
#----------------------------------------------------------------------------
|
||||||
# WinAVR Makefile Template written by Eric B. Weddington, Jörg Wunsch, et al.
|
# WinAVR Makefile Template written by Eric B. Weddington, Jörg Wunsch, et al.
|
||||||
# >> Modified for use with the LUFA project. <<
|
# >> Modified for use with the LUFA project. <<
|
||||||
#
|
#
|
||||||
# Released to the Public Domain
|
# Released to the Public Domain
|
||||||
#
|
#
|
||||||
# Additional material for this makefile was written by:
|
# Additional material for this makefile was written by:
|
||||||
# Peter Fleury
|
# Peter Fleury
|
||||||
# Tim Henigan
|
# Tim Henigan
|
||||||
# Colin O'Flynn
|
# Colin O'Flynn
|
||||||
# Reiner Patommel
|
# Reiner Patommel
|
||||||
# Markus Pfaff
|
# Markus Pfaff
|
||||||
# Sander Pool
|
# Sander Pool
|
||||||
# Frederik Rouleau
|
# Frederik Rouleau
|
||||||
# Carlos Lamas
|
# Carlos Lamas
|
||||||
# Dean Camera
|
# Dean Camera
|
||||||
# Opendous Inc.
|
# Opendous Inc.
|
||||||
# Denver Gingerich
|
# Denver Gingerich
|
||||||
#
|
#
|
||||||
#----------------------------------------------------------------------------
|
#----------------------------------------------------------------------------
|
||||||
# On command line:
|
# On command line:
|
||||||
#
|
#
|
||||||
# make all = Make software.
|
# make all = Make software.
|
||||||
#
|
#
|
||||||
# make clean = Clean out built project files.
|
# make clean = Clean out built project files.
|
||||||
#
|
#
|
||||||
# make coff = Convert ELF to AVR COFF.
|
# make coff = Convert ELF to AVR COFF.
|
||||||
#
|
#
|
||||||
# make extcoff = Convert ELF to AVR Extended COFF.
|
# make extcoff = Convert ELF to AVR Extended COFF.
|
||||||
#
|
#
|
||||||
# make program = Download the hex file to the device, using avrdude.
|
# make program = Download the hex file to the device, using avrdude.
|
||||||
# Please customize the avrdude settings below first!
|
# Please customize the avrdude settings below first!
|
||||||
#
|
#
|
||||||
# make dfu = Download the hex file to the device, using dfu-programmer (must
|
# make dfu = Download the hex file to the device, using dfu-programmer (must
|
||||||
# have dfu-programmer installed).
|
# have dfu-programmer installed).
|
||||||
#
|
#
|
||||||
# make flip = Download the hex file to the device, using Atmel FLIP (must
|
# make flip = Download the hex file to the device, using Atmel FLIP (must
|
||||||
# have Atmel FLIP installed).
|
# have Atmel FLIP installed).
|
||||||
#
|
#
|
||||||
# make dfu-ee = Download the eeprom file to the device, using dfu-programmer
|
# make dfu-ee = Download the eeprom file to the device, using dfu-programmer
|
||||||
# (must have dfu-programmer installed).
|
# (must have dfu-programmer installed).
|
||||||
#
|
#
|
||||||
# make flip-ee = Download the eeprom file to the device, using Atmel FLIP
|
# make flip-ee = Download the eeprom file to the device, using Atmel FLIP
|
||||||
# (must have Atmel FLIP installed).
|
# (must have Atmel FLIP installed).
|
||||||
#
|
#
|
||||||
# make doxygen = Generate DoxyGen documentation for the project (must have
|
# make doxygen = Generate DoxyGen documentation for the project (must have
|
||||||
# DoxyGen installed)
|
# DoxyGen installed)
|
||||||
#
|
#
|
||||||
# make debug = Start either simulavr or avarice as specified for debugging,
|
# make debug = Start either simulavr or avarice as specified for debugging,
|
||||||
# with avr-gdb or avr-insight as the front end 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.s = Just compile filename.c into the assembler code only.
|
||||||
#
|
#
|
||||||
# make filename.i = Create a preprocessed source file for use in submitting
|
# make filename.i = Create a preprocessed source file for use in submitting
|
||||||
# bug reports to the GCC project.
|
# bug reports to the GCC project.
|
||||||
#
|
#
|
||||||
# To rebuild project do "make clean" then "make all".
|
# To rebuild project do "make clean" then "make all".
|
||||||
#----------------------------------------------------------------------------
|
#----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
# MCU name
|
# MCU name
|
||||||
MCU = at90usb1287
|
MCU = at90usb1287
|
||||||
|
|
||||||
|
|
||||||
# Target architecture (see library "Board Types" documentation).
|
# Target architecture (see library "Board Types" documentation).
|
||||||
ARCH = AVR8
|
ARCH = AVR8
|
||||||
|
|
||||||
|
|
||||||
# Target board (see library "Board Types" documentation, NONE for projects not requiring
|
# 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
|
# LUFA board drivers). If USER is selected, put custom board drivers in a directory called
|
||||||
# "Board" inside the application directory.
|
# "Board" inside the application directory.
|
||||||
BOARD = USBKEY
|
BOARD = USBKEY
|
||||||
|
|
||||||
|
|
||||||
# Processor frequency.
|
# Processor frequency.
|
||||||
# This will define a symbol, F_CPU, in all source code files equal to the
|
# 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
|
# 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
|
# 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.
|
# 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
|
# 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
|
# 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
|
# 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
|
# reflect the processor speed set externally so that the code can use accurate
|
||||||
# software delays.
|
# software delays.
|
||||||
F_CPU = 8000000
|
F_CPU = 8000000
|
||||||
|
|
||||||
|
|
||||||
# Input clock frequency.
|
# Input clock frequency.
|
||||||
# This will define a symbol, F_USB, in all source code files equal to the
|
# 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
|
# 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
|
# 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
|
# 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'
|
# 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
|
# at the end, this will be done automatically to create a 32-bit value in your
|
||||||
# source code.
|
# source code.
|
||||||
#
|
#
|
||||||
# If no clock division is performed on the input clock inside the AVR (via the
|
# 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.
|
# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
|
||||||
F_USB = $(F_CPU)
|
F_USB = $(F_CPU)
|
||||||
|
|
||||||
|
|
||||||
# Output format. (can be srec, ihex, binary)
|
# Output format. (can be srec, ihex, binary)
|
||||||
FORMAT = ihex
|
FORMAT = ihex
|
||||||
|
|
||||||
|
|
||||||
# Target file name (without extension).
|
# Target file name (without extension).
|
||||||
TARGET = AudioInputHost
|
TARGET = AudioInputHost
|
||||||
|
|
||||||
|
|
||||||
# Object files directory
|
# Object files directory
|
||||||
# To put object files in current directory, use a dot (.), do NOT make
|
# To put object files in current directory, use a dot (.), do NOT make
|
||||||
# this an empty or blank macro!
|
# this an empty or blank macro!
|
||||||
OBJDIR = .
|
OBJDIR = .
|
||||||
|
|
||||||
|
|
||||||
# Path to the LUFA library
|
# Path to the LUFA library
|
||||||
LUFA_PATH = ../../../..
|
LUFA_PATH = ../../../..
|
||||||
|
|
||||||
|
|
||||||
# LUFA library compile-time options and predefined tokens
|
# LUFA library compile-time options and predefined tokens
|
||||||
LUFA_OPTS = -D USB_HOST_ONLY
|
LUFA_OPTS = -D USB_HOST_ONLY
|
||||||
LUFA_OPTS += -D USE_STATIC_OPTIONS="(USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"
|
LUFA_OPTS += -D USE_STATIC_OPTIONS="(USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"
|
||||||
|
|
||||||
|
|
||||||
# Create the LUFA source path variables by including the LUFA root makefile
|
# Create the LUFA source path variables by including the LUFA root makefile
|
||||||
include $(LUFA_PATH)/LUFA/makefile
|
include $(LUFA_PATH)/LUFA/makefile
|
||||||
|
|
||||||
|
|
||||||
# List C source files here. (C dependencies are automatically generated.)
|
# List C source files here. (C dependencies are automatically generated.)
|
||||||
SRC = $(TARGET).c \
|
SRC = $(TARGET).c \
|
||||||
ConfigDescriptor.c \
|
ConfigDescriptor.c \
|
||||||
$(LUFA_SRC_USB) \
|
$(LUFA_SRC_USB) \
|
||||||
$(LUFA_SRC_SERIAL)
|
$(LUFA_SRC_SERIAL)
|
||||||
|
|
||||||
|
|
||||||
# List C++ source files here. (C dependencies are automatically generated.)
|
# List C++ source files here. (C dependencies are automatically generated.)
|
||||||
CPPSRC =
|
CPPSRC =
|
||||||
|
|
||||||
|
|
||||||
# List Assembler source files here.
|
# List Assembler source files here.
|
||||||
# Make them always end in a capital .S. Files ending in a lowercase .s
|
# Make them always end in a capital .S. Files ending in a lowercase .s
|
||||||
# will not be considered source files but generated files (assembler
|
# will not be considered source files but generated files (assembler
|
||||||
# output from the compiler), and will be deleted upon "make clean"!
|
# output from the compiler), and will be deleted upon "make clean"!
|
||||||
# Even though the DOS/Win* filesystem matches both .s and .S the same,
|
# 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
|
# it will preserve the spelling of the filenames, and gcc itself does
|
||||||
# care about how the name is spelled on its command-line.
|
# care about how the name is spelled on its command-line.
|
||||||
ASRC =
|
ASRC =
|
||||||
|
|
||||||
|
|
||||||
# Optimization level, can be [0, 1, 2, 3, s].
|
# Optimization level, can be [0, 1, 2, 3, s].
|
||||||
# 0 = turn off optimization. s = optimize for size.
|
# 0 = turn off optimization. s = optimize for size.
|
||||||
# (Note: 3 is not always the best optimization level. See avr-libc FAQ.)
|
# (Note: 3 is not always the best optimization level. See avr-libc FAQ.)
|
||||||
OPT = s
|
OPT = s
|
||||||
|
|
||||||
|
|
||||||
# Debugging format.
|
# Debugging format.
|
||||||
# Native formats for AVR-GCC's -g are dwarf-2 [default] or stabs.
|
# Native formats for AVR-GCC's -g are dwarf-2 [default] or stabs.
|
||||||
# AVR Studio 4.10 requires dwarf-2.
|
# AVR Studio 4.10 requires dwarf-2.
|
||||||
# AVR [Extended] COFF format requires stabs, plus an avr-objcopy run.
|
# AVR [Extended] COFF format requires stabs, plus an avr-objcopy run.
|
||||||
DEBUG = dwarf-2
|
DEBUG = dwarf-2
|
||||||
|
|
||||||
|
|
||||||
# List any extra directories to look for include files here.
|
# List any extra directories to look for include files here.
|
||||||
# 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)/
|
||||||
|
|
||||||
|
|
||||||
# Compiler flag to set the C Standard level.
|
# Compiler flag to set the C Standard level.
|
||||||
# c89 = "ANSI" C
|
# c89 = "ANSI" C
|
||||||
# gnu89 = c89 plus GCC extensions
|
# gnu89 = c89 plus GCC extensions
|
||||||
# c99 = ISO C99 standard (not yet fully implemented)
|
# c99 = ISO C99 standard (not yet fully implemented)
|
||||||
# gnu99 = c99 plus GCC extensions
|
# gnu99 = c99 plus GCC extensions
|
||||||
CSTANDARD = -std=c99
|
CSTANDARD = -std=c99
|
||||||
|
|
||||||
|
|
||||||
# Place -D or -U options here for C sources
|
# Place -D or -U options here for C sources
|
||||||
CDEFS = -DF_CPU=$(F_CPU)UL
|
CDEFS = -DF_CPU=$(F_CPU)UL
|
||||||
CDEFS += -DF_USB=$(F_USB)UL
|
CDEFS += -DF_USB=$(F_USB)UL
|
||||||
CDEFS += -DBOARD=BOARD_$(BOARD) -DARCH=ARCH_$(ARCH)
|
CDEFS += -DBOARD=BOARD_$(BOARD) -DARCH=ARCH_$(ARCH)
|
||||||
CDEFS += $(LUFA_OPTS)
|
CDEFS += $(LUFA_OPTS)
|
||||||
|
|
||||||
|
|
||||||
# Place -D or -U options here for ASM sources
|
# Place -D or -U options here for ASM sources
|
||||||
ADEFS = -DF_CPU=$(F_CPU)
|
ADEFS = -DF_CPU=$(F_CPU)
|
||||||
ADEFS += -DF_USB=$(F_USB)UL
|
ADEFS += -DF_USB=$(F_USB)UL
|
||||||
ADEFS += -DBOARD=BOARD_$(BOARD)
|
ADEFS += -DBOARD=BOARD_$(BOARD)
|
||||||
ADEFS += $(LUFA_OPTS)
|
ADEFS += $(LUFA_OPTS)
|
||||||
|
|
||||||
# Place -D or -U options here for C++ sources
|
# Place -D or -U options here for C++ sources
|
||||||
CPPDEFS = -DF_CPU=$(F_CPU)UL
|
CPPDEFS = -DF_CPU=$(F_CPU)UL
|
||||||
CPPDEFS += -DF_USB=$(F_USB)UL
|
CPPDEFS += -DF_USB=$(F_USB)UL
|
||||||
CPPDEFS += -DBOARD=BOARD_$(BOARD)
|
CPPDEFS += -DBOARD=BOARD_$(BOARD)
|
||||||
CPPDEFS += $(LUFA_OPTS)
|
CPPDEFS += $(LUFA_OPTS)
|
||||||
#CPPDEFS += -D__STDC_LIMIT_MACROS
|
#CPPDEFS += -D__STDC_LIMIT_MACROS
|
||||||
#CPPDEFS += -D__STDC_CONSTANT_MACROS
|
#CPPDEFS += -D__STDC_CONSTANT_MACROS
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#---------------- Compiler Options C ----------------
|
#---------------- Compiler Options C ----------------
|
||||||
# -g*: generate debugging information
|
# -g*: generate debugging information
|
||||||
# -O*: optimization level
|
# -O*: optimization level
|
||||||
# -f...: tuning, see GCC manual and avr-libc documentation
|
# -f...: tuning, see GCC manual and avr-libc documentation
|
||||||
# -Wall...: warning level
|
# -Wall...: warning level
|
||||||
# -Wa,...: tell GCC to pass this to the assembler.
|
# -Wa,...: tell GCC to pass this to the assembler.
|
||||||
# -adhlns...: create assembler listing
|
# -adhlns...: create assembler listing
|
||||||
CFLAGS = -g$(DEBUG)
|
CFLAGS = -g$(DEBUG)
|
||||||
CFLAGS += $(CDEFS)
|
CFLAGS += $(CDEFS)
|
||||||
CFLAGS += -O$(OPT)
|
CFLAGS += -O$(OPT)
|
||||||
CFLAGS += -funsigned-char
|
CFLAGS += -funsigned-char
|
||||||
CFLAGS += -funsigned-bitfields
|
CFLAGS += -funsigned-bitfields
|
||||||
CFLAGS += -ffunction-sections
|
CFLAGS += -ffunction-sections
|
||||||
CFLAGS += -fno-inline-small-functions
|
CFLAGS += -fno-inline-small-functions
|
||||||
CFLAGS += -fpack-struct
|
CFLAGS += -fpack-struct
|
||||||
CFLAGS += -fshort-enums
|
CFLAGS += -fshort-enums
|
||||||
CFLAGS += -fno-strict-aliasing
|
CFLAGS += -fno-strict-aliasing
|
||||||
CFLAGS += -Wall
|
CFLAGS += -Wall
|
||||||
CFLAGS += -Wstrict-prototypes
|
CFLAGS += -Wstrict-prototypes
|
||||||
#CFLAGS += -mshort-calls
|
#CFLAGS += -mshort-calls
|
||||||
#CFLAGS += -fno-unit-at-a-time
|
#CFLAGS += -fno-unit-at-a-time
|
||||||
#CFLAGS += -Wundef
|
#CFLAGS += -Wundef
|
||||||
#CFLAGS += -Wunreachable-code
|
#CFLAGS += -Wunreachable-code
|
||||||
#CFLAGS += -Wsign-compare
|
#CFLAGS += -Wsign-compare
|
||||||
CFLAGS += -Wa,-adhlns=$(<:%.c=$(OBJDIR)/%.lst)
|
CFLAGS += -Wa,-adhlns=$(<:%.c=$(OBJDIR)/%.lst)
|
||||||
CFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS))
|
CFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS))
|
||||||
CFLAGS += $(CSTANDARD)
|
CFLAGS += $(CSTANDARD)
|
||||||
|
|
||||||
|
|
||||||
#---------------- Compiler Options C++ ----------------
|
#---------------- Compiler Options C++ ----------------
|
||||||
# -g*: generate debugging information
|
# -g*: generate debugging information
|
||||||
# -O*: optimization level
|
# -O*: optimization level
|
||||||
# -f...: tuning, see GCC manual and avr-libc documentation
|
# -f...: tuning, see GCC manual and avr-libc documentation
|
||||||
# -Wall...: warning level
|
# -Wall...: warning level
|
||||||
# -Wa,...: tell GCC to pass this to the assembler.
|
# -Wa,...: tell GCC to pass this to the assembler.
|
||||||
# -adhlns...: create assembler listing
|
# -adhlns...: create assembler listing
|
||||||
CPPFLAGS = -g$(DEBUG)
|
CPPFLAGS = -g$(DEBUG)
|
||||||
CPPFLAGS += $(CPPDEFS)
|
CPPFLAGS += $(CPPDEFS)
|
||||||
CPPFLAGS += -O$(OPT)
|
CPPFLAGS += -O$(OPT)
|
||||||
CPPFLAGS += -funsigned-char
|
CPPFLAGS += -funsigned-char
|
||||||
CPPFLAGS += -funsigned-bitfields
|
CPPFLAGS += -funsigned-bitfields
|
||||||
CPPFLAGS += -fpack-struct
|
CPPFLAGS += -fpack-struct
|
||||||
CPPFLAGS += -fshort-enums
|
CPPFLAGS += -fshort-enums
|
||||||
CPPFLAGS += -fno-exceptions
|
CPPFLAGS += -fno-exceptions
|
||||||
CPPFLAGS += -Wall
|
CPPFLAGS += -Wall
|
||||||
CPPFLAGS += -Wundef
|
CPPFLAGS += -Wundef
|
||||||
#CPPFLAGS += -mshort-calls
|
#CPPFLAGS += -mshort-calls
|
||||||
#CPPFLAGS += -fno-unit-at-a-time
|
#CPPFLAGS += -fno-unit-at-a-time
|
||||||
#CPPFLAGS += -Wstrict-prototypes
|
#CPPFLAGS += -Wstrict-prototypes
|
||||||
#CPPFLAGS += -Wunreachable-code
|
#CPPFLAGS += -Wunreachable-code
|
||||||
#CPPFLAGS += -Wsign-compare
|
#CPPFLAGS += -Wsign-compare
|
||||||
CPPFLAGS += -Wa,-adhlns=$(<:%.cpp=$(OBJDIR)/%.lst)
|
CPPFLAGS += -Wa,-adhlns=$(<:%.cpp=$(OBJDIR)/%.lst)
|
||||||
CPPFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS))
|
CPPFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS))
|
||||||
#CPPFLAGS += $(CSTANDARD)
|
#CPPFLAGS += $(CSTANDARD)
|
||||||
|
|
||||||
|
|
||||||
#---------------- Assembler Options ----------------
|
#---------------- Assembler Options ----------------
|
||||||
# -Wa,...: tell GCC to pass this to the assembler.
|
# -Wa,...: tell GCC to pass this to the assembler.
|
||||||
# -adhlns: create listing
|
# -adhlns: create listing
|
||||||
# -gstabs: have the assembler create line number information; note that
|
# -gstabs: have the assembler create line number information; note that
|
||||||
# for use in COFF files, additional information about filenames
|
# for use in COFF files, additional information about filenames
|
||||||
# and function names needs to be present in the assembler source
|
# and function names needs to be present in the assembler source
|
||||||
# files -- see avr-libc docs [FIXME: not yet described there]
|
# files -- see avr-libc docs [FIXME: not yet described there]
|
||||||
# -listing-cont-lines: Sets the maximum number of continuation lines of hex
|
# -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.
|
# 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
|
ASFLAGS = $(ADEFS) -Wa,-adhlns=$(<:%.S=$(OBJDIR)/%.lst),-gstabs,--listing-cont-lines=100
|
||||||
|
|
||||||
|
|
||||||
#---------------- Library Options ----------------
|
#---------------- Library Options ----------------
|
||||||
# Minimalistic printf version
|
# Minimalistic printf version
|
||||||
PRINTF_LIB_MIN = -Wl,-u,vfprintf -lprintf_min
|
PRINTF_LIB_MIN = -Wl,-u,vfprintf -lprintf_min
|
||||||
|
|
||||||
# Floating point printf version (requires MATH_LIB = -lm below)
|
# Floating point printf version (requires MATH_LIB = -lm below)
|
||||||
PRINTF_LIB_FLOAT = -Wl,-u,vfprintf -lprintf_flt
|
PRINTF_LIB_FLOAT = -Wl,-u,vfprintf -lprintf_flt
|
||||||
|
|
||||||
# If this is left blank, then it will use the Standard printf version.
|
# If this is left blank, then it will use the Standard printf version.
|
||||||
PRINTF_LIB =
|
PRINTF_LIB =
|
||||||
#PRINTF_LIB = $(PRINTF_LIB_MIN)
|
#PRINTF_LIB = $(PRINTF_LIB_MIN)
|
||||||
#PRINTF_LIB = $(PRINTF_LIB_FLOAT)
|
#PRINTF_LIB = $(PRINTF_LIB_FLOAT)
|
||||||
|
|
||||||
|
|
||||||
# Minimalistic scanf version
|
# Minimalistic scanf version
|
||||||
SCANF_LIB_MIN = -Wl,-u,vfscanf -lscanf_min
|
SCANF_LIB_MIN = -Wl,-u,vfscanf -lscanf_min
|
||||||
|
|
||||||
# Floating point + %[ scanf version (requires MATH_LIB = -lm below)
|
# Floating point + %[ scanf version (requires MATH_LIB = -lm below)
|
||||||
SCANF_LIB_FLOAT = -Wl,-u,vfscanf -lscanf_flt
|
SCANF_LIB_FLOAT = -Wl,-u,vfscanf -lscanf_flt
|
||||||
|
|
||||||
# If this is left blank, then it will use the Standard scanf version.
|
# If this is left blank, then it will use the Standard scanf version.
|
||||||
SCANF_LIB =
|
SCANF_LIB =
|
||||||
#SCANF_LIB = $(SCANF_LIB_MIN)
|
#SCANF_LIB = $(SCANF_LIB_MIN)
|
||||||
#SCANF_LIB = $(SCANF_LIB_FLOAT)
|
#SCANF_LIB = $(SCANF_LIB_FLOAT)
|
||||||
|
|
||||||
|
|
||||||
MATH_LIB = -lm
|
MATH_LIB = -lm
|
||||||
|
|
||||||
|
|
||||||
# List any extra directories to look for libraries here.
|
# List any extra directories to look for libraries here.
|
||||||
# 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.
|
||||||
EXTRALIBDIRS =
|
EXTRALIBDIRS =
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#---------------- External Memory Options ----------------
|
#---------------- External Memory Options ----------------
|
||||||
|
|
||||||
# 64 KB of external RAM, starting after internal RAM (ATmega128!),
|
# 64 KB of external RAM, starting after internal RAM (ATmega128!),
|
||||||
# used for variables (.data/.bss) and heap (malloc()).
|
# used for variables (.data/.bss) and heap (malloc()).
|
||||||
#EXTMEMOPTS = -Wl,-Tdata=0x801100,--defsym=__heap_end=0x80ffff
|
#EXTMEMOPTS = -Wl,-Tdata=0x801100,--defsym=__heap_end=0x80ffff
|
||||||
|
|
||||||
# 64 KB of external RAM, starting after internal RAM (ATmega128!),
|
# 64 KB of external RAM, starting after internal RAM (ATmega128!),
|
||||||
# only used for heap (malloc()).
|
# only used for heap (malloc()).
|
||||||
#EXTMEMOPTS = -Wl,--section-start,.data=0x801100,--defsym=__heap_end=0x80ffff
|
#EXTMEMOPTS = -Wl,--section-start,.data=0x801100,--defsym=__heap_end=0x80ffff
|
||||||
|
|
||||||
EXTMEMOPTS =
|
EXTMEMOPTS =
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#---------------- Linker Options ----------------
|
#---------------- Linker Options ----------------
|
||||||
# -Wl,...: tell GCC to pass this to linker.
|
# -Wl,...: tell GCC to pass this to linker.
|
||||||
# -Map: create map file
|
# -Map: create map file
|
||||||
# --cref: add cross reference to map file
|
# --cref: add cross reference to map file
|
||||||
LDFLAGS = -Wl,-Map=$(TARGET).map,--cref
|
LDFLAGS = -Wl,-Map=$(TARGET).map,--cref
|
||||||
LDFLAGS += -Wl,--relax
|
LDFLAGS += -Wl,--relax
|
||||||
LDFLAGS += -Wl,--gc-sections
|
LDFLAGS += -Wl,--gc-sections
|
||||||
LDFLAGS += $(EXTMEMOPTS)
|
LDFLAGS += $(EXTMEMOPTS)
|
||||||
LDFLAGS += $(patsubst %,-L%,$(EXTRALIBDIRS))
|
LDFLAGS += $(patsubst %,-L%,$(EXTRALIBDIRS))
|
||||||
LDFLAGS += $(PRINTF_LIB) $(SCANF_LIB) $(MATH_LIB)
|
LDFLAGS += $(PRINTF_LIB) $(SCANF_LIB) $(MATH_LIB)
|
||||||
#LDFLAGS += -T linker_script.x
|
#LDFLAGS += -T linker_script.x
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#---------------- Programming Options (avrdude) ----------------
|
#---------------- Programming Options (avrdude) ----------------
|
||||||
|
|
||||||
# Programming hardware
|
# Programming hardware
|
||||||
# Type: avrdude -c ?
|
# Type: avrdude -c ?
|
||||||
# to get a full listing.
|
# to get a full listing.
|
||||||
#
|
#
|
||||||
AVRDUDE_PROGRAMMER = jtagmkII
|
AVRDUDE_PROGRAMMER = jtagmkII
|
||||||
|
|
||||||
# com1 = serial port. Use lpt1 to connect to parallel port.
|
# com1 = serial port. Use lpt1 to connect to parallel port.
|
||||||
AVRDUDE_PORT = usb
|
AVRDUDE_PORT = usb
|
||||||
|
|
||||||
AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex
|
AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex
|
||||||
#AVRDUDE_WRITE_EEPROM = -U eeprom:w:$(TARGET).eep
|
#AVRDUDE_WRITE_EEPROM = -U eeprom:w:$(TARGET).eep
|
||||||
|
|
||||||
|
|
||||||
# Uncomment the following if you want avrdude's erase cycle counter.
|
# Uncomment the following if you want avrdude's erase cycle counter.
|
||||||
# Note that this counter needs to be initialized first using -Yn,
|
# Note that this counter needs to be initialized first using -Yn,
|
||||||
# see avrdude manual.
|
# see avrdude manual.
|
||||||
#AVRDUDE_ERASE_COUNTER = -y
|
#AVRDUDE_ERASE_COUNTER = -y
|
||||||
|
|
||||||
# Uncomment the following if you do /not/ wish a verification to be
|
# Uncomment the following if you do /not/ wish a verification to be
|
||||||
# performed after programming the device.
|
# performed after programming the device.
|
||||||
#AVRDUDE_NO_VERIFY = -V
|
#AVRDUDE_NO_VERIFY = -V
|
||||||
|
|
||||||
# Increase verbosity level. Please use this when submitting bug
|
# Increase verbosity level. Please use this when submitting bug
|
||||||
# reports about avrdude. See <http://savannah.nongnu.org/projects/avrdude>
|
# reports about avrdude. See <http://savannah.nongnu.org/projects/avrdude>
|
||||||
# to submit bug reports.
|
# to submit bug reports.
|
||||||
#AVRDUDE_VERBOSE = -v -v
|
#AVRDUDE_VERBOSE = -v -v
|
||||||
|
|
||||||
AVRDUDE_FLAGS = -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER)
|
AVRDUDE_FLAGS = -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER)
|
||||||
AVRDUDE_FLAGS += $(AVRDUDE_NO_VERIFY)
|
AVRDUDE_FLAGS += $(AVRDUDE_NO_VERIFY)
|
||||||
AVRDUDE_FLAGS += $(AVRDUDE_VERBOSE)
|
AVRDUDE_FLAGS += $(AVRDUDE_VERBOSE)
|
||||||
AVRDUDE_FLAGS += $(AVRDUDE_ERASE_COUNTER)
|
AVRDUDE_FLAGS += $(AVRDUDE_ERASE_COUNTER)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#---------------- Debugging Options ----------------
|
#---------------- Debugging Options ----------------
|
||||||
|
|
||||||
# For simulavr only - target MCU frequency.
|
# For simulavr only - target MCU frequency.
|
||||||
DEBUG_MFREQ = $(F_CPU)
|
DEBUG_MFREQ = $(F_CPU)
|
||||||
|
|
||||||
# Set the DEBUG_UI to either gdb or insight.
|
# Set the DEBUG_UI to either gdb or insight.
|
||||||
# DEBUG_UI = gdb
|
# DEBUG_UI = gdb
|
||||||
DEBUG_UI = insight
|
DEBUG_UI = insight
|
||||||
|
|
||||||
# Set the debugging back-end to either avarice, simulavr.
|
# Set the debugging back-end to either avarice, simulavr.
|
||||||
DEBUG_BACKEND = avarice
|
DEBUG_BACKEND = avarice
|
||||||
#DEBUG_BACKEND = simulavr
|
#DEBUG_BACKEND = simulavr
|
||||||
|
|
||||||
# GDB Init Filename.
|
# GDB Init Filename.
|
||||||
GDBINIT_FILE = __avr_gdbinit
|
GDBINIT_FILE = __avr_gdbinit
|
||||||
|
|
||||||
# When using avarice settings for the JTAG
|
# When using avarice settings for the JTAG
|
||||||
JTAG_DEV = /dev/com1
|
JTAG_DEV = /dev/com1
|
||||||
|
|
||||||
# Debugging port used to communicate between GDB / avarice / simulavr.
|
# Debugging port used to communicate between GDB / avarice / simulavr.
|
||||||
DEBUG_PORT = 4242
|
DEBUG_PORT = 4242
|
||||||
|
|
||||||
# Debugging host used to communicate between GDB / avarice / simulavr, normally
|
# Debugging host used to communicate between GDB / avarice / simulavr, normally
|
||||||
# just set to localhost unless doing some sort of crazy debugging when
|
# just set to localhost unless doing some sort of crazy debugging when
|
||||||
# avarice is running on a different computer.
|
# avarice is running on a different computer.
|
||||||
DEBUG_HOST = localhost
|
DEBUG_HOST = localhost
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#============================================================================
|
#============================================================================
|
||||||
|
|
||||||
|
|
||||||
# Define programs and commands.
|
# Define programs and commands.
|
||||||
SHELL = sh
|
SHELL = sh
|
||||||
CC = avr-gcc
|
CC = avr-gcc
|
||||||
OBJCOPY = avr-objcopy
|
OBJCOPY = avr-objcopy
|
||||||
OBJDUMP = avr-objdump
|
OBJDUMP = avr-objdump
|
||||||
SIZE = avr-size
|
SIZE = avr-size
|
||||||
AR = avr-ar rcs
|
AR = avr-ar rcs
|
||||||
NM = avr-nm
|
NM = avr-nm
|
||||||
AVRDUDE = avrdude
|
AVRDUDE = avrdude
|
||||||
REMOVE = rm -f
|
REMOVE = rm -f
|
||||||
REMOVEDIR = rm -rf
|
REMOVEDIR = rm -rf
|
||||||
COPY = cp
|
COPY = cp
|
||||||
WINSHELL = cmd
|
WINSHELL = cmd
|
||||||
|
|
||||||
|
|
||||||
# Define Messages
|
# Define Messages
|
||||||
# English
|
# English
|
||||||
MSG_ERRORS_NONE = Errors: none
|
MSG_ERRORS_NONE = Errors: none
|
||||||
MSG_BEGIN = -------- begin --------
|
MSG_BEGIN = -------- begin --------
|
||||||
MSG_END = -------- end --------
|
MSG_END = -------- end --------
|
||||||
MSG_SIZE_BEFORE = Size before:
|
MSG_SIZE_BEFORE = Size before:
|
||||||
MSG_SIZE_AFTER = Size after:
|
MSG_SIZE_AFTER = Size after:
|
||||||
MSG_COFF = Converting to AVR COFF:
|
MSG_COFF = Converting to AVR COFF:
|
||||||
MSG_EXTENDED_COFF = Converting to AVR Extended COFF:
|
MSG_EXTENDED_COFF = Converting to AVR Extended COFF:
|
||||||
MSG_FLASH = Creating load file for Flash:
|
MSG_FLASH = Creating load file for Flash:
|
||||||
MSG_EEPROM = Creating load file for EEPROM:
|
MSG_EEPROM = Creating load file for EEPROM:
|
||||||
MSG_EXTENDED_LISTING = Creating Extended Listing:
|
MSG_EXTENDED_LISTING = Creating Extended Listing:
|
||||||
MSG_SYMBOL_TABLE = Creating Symbol Table:
|
MSG_SYMBOL_TABLE = Creating Symbol Table:
|
||||||
MSG_LINKING = Linking:
|
MSG_LINKING = Linking:
|
||||||
MSG_COMPILING = Compiling C:
|
MSG_COMPILING = Compiling C:
|
||||||
MSG_COMPILING_CPP = Compiling C++:
|
MSG_COMPILING_CPP = Compiling C++:
|
||||||
MSG_ASSEMBLING = Assembling:
|
MSG_ASSEMBLING = Assembling:
|
||||||
MSG_CLEANING = Cleaning project:
|
MSG_CLEANING = Cleaning project:
|
||||||
MSG_CREATING_LIBRARY = Creating library:
|
MSG_CREATING_LIBRARY = Creating library:
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Define all object files.
|
# Define all object files.
|
||||||
OBJ = $(SRC:%.c=$(OBJDIR)/%.o) $(CPPSRC:%.cpp=$(OBJDIR)/%.o) $(ASRC:%.S=$(OBJDIR)/%.o)
|
OBJ = $(SRC:%.c=$(OBJDIR)/%.o) $(CPPSRC:%.cpp=$(OBJDIR)/%.o) $(ASRC:%.S=$(OBJDIR)/%.o)
|
||||||
|
|
||||||
# Define all listing files.
|
# Define all listing files.
|
||||||
LST = $(SRC:%.c=$(OBJDIR)/%.lst) $(CPPSRC:%.cpp=$(OBJDIR)/%.lst) $(ASRC:%.S=$(OBJDIR)/%.lst)
|
LST = $(SRC:%.c=$(OBJDIR)/%.lst) $(CPPSRC:%.cpp=$(OBJDIR)/%.lst) $(ASRC:%.S=$(OBJDIR)/%.lst)
|
||||||
|
|
||||||
|
|
||||||
# Compiler flags to generate dependency files.
|
# Compiler flags to generate dependency files.
|
||||||
GENDEPFLAGS = -MMD -MP -MF .dep/$(@F).d
|
GENDEPFLAGS = -MMD -MP -MF .dep/$(@F).d
|
||||||
|
|
||||||
|
|
||||||
# Combine all necessary flags and optional flags.
|
# Combine all necessary flags and optional flags.
|
||||||
# Add target processor to flags.
|
# Add target processor to flags.
|
||||||
ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS) $(GENDEPFLAGS)
|
ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS) $(GENDEPFLAGS)
|
||||||
ALL_CPPFLAGS = -mmcu=$(MCU) -I. -x c++ $(CPPFLAGS) $(GENDEPFLAGS)
|
ALL_CPPFLAGS = -mmcu=$(MCU) -I. -x c++ $(CPPFLAGS) $(GENDEPFLAGS)
|
||||||
ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS)
|
ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Default target.
|
# Default target.
|
||||||
all: begin gccversion sizebefore build sizeafter end
|
all: begin gccversion sizebefore build sizeafter end
|
||||||
|
|
||||||
# Change the build target to build a HEX file or a library.
|
# Change the build target to build a HEX file or a library.
|
||||||
build: elf hex eep lss sym
|
build: elf hex eep lss sym
|
||||||
#build: lib
|
#build: lib
|
||||||
|
|
||||||
|
|
||||||
elf: $(TARGET).elf
|
elf: $(TARGET).elf
|
||||||
hex: $(TARGET).hex
|
hex: $(TARGET).hex
|
||||||
eep: $(TARGET).eep
|
eep: $(TARGET).eep
|
||||||
lss: $(TARGET).lss
|
lss: $(TARGET).lss
|
||||||
sym: $(TARGET).sym
|
sym: $(TARGET).sym
|
||||||
LIBNAME=lib$(TARGET).a
|
LIBNAME=lib$(TARGET).a
|
||||||
lib: $(LIBNAME)
|
lib: $(LIBNAME)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Eye candy.
|
# Eye candy.
|
||||||
# AVR Studio 3.x does not check make's exit code but relies on
|
# 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.
|
# the following magic strings to be generated by the compile job.
|
||||||
begin:
|
begin:
|
||||||
@echo
|
@echo
|
||||||
@echo $(MSG_BEGIN)
|
@echo $(MSG_BEGIN)
|
||||||
|
|
||||||
end:
|
end:
|
||||||
@echo $(MSG_END)
|
@echo $(MSG_END)
|
||||||
@echo
|
@echo
|
||||||
|
|
||||||
|
|
||||||
# Display size of file.
|
# Display size of file.
|
||||||
HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex
|
HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex
|
||||||
ELFSIZE = $(SIZE) $(MCU_FLAG) $(FORMAT_FLAG) $(TARGET).elf
|
ELFSIZE = $(SIZE) $(MCU_FLAG) $(FORMAT_FLAG) $(TARGET).elf
|
||||||
MCU_FLAG = $(shell $(SIZE) --help | grep -- --mcu > /dev/null && echo --mcu=$(MCU) )
|
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 )
|
FORMAT_FLAG = $(shell $(SIZE) --help | grep -- --format=.*avr > /dev/null && echo --format=avr )
|
||||||
|
|
||||||
|
|
||||||
sizebefore:
|
sizebefore:
|
||||||
@if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_BEFORE); $(ELFSIZE); \
|
@if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_BEFORE); $(ELFSIZE); \
|
||||||
2>/dev/null; echo; fi
|
2>/dev/null; echo; fi
|
||||||
|
|
||||||
sizeafter:
|
sizeafter:
|
||||||
@if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_AFTER); $(ELFSIZE); \
|
@if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_AFTER); $(ELFSIZE); \
|
||||||
2>/dev/null; echo; fi
|
2>/dev/null; echo; fi
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Display compiler version information.
|
# Display compiler version information.
|
||||||
gccversion :
|
gccversion :
|
||||||
@$(CC) --version
|
@$(CC) --version
|
||||||
|
|
||||||
|
|
||||||
# Program the device.
|
# Program the device.
|
||||||
program: $(TARGET).hex $(TARGET).eep
|
program: $(TARGET).hex $(TARGET).eep
|
||||||
$(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM)
|
$(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM)
|
||||||
|
|
||||||
flip: $(TARGET).hex
|
flip: $(TARGET).hex
|
||||||
batchisp -hardware usb -device $(MCU) -operation erase f
|
batchisp -hardware usb -device $(MCU) -operation erase f
|
||||||
batchisp -hardware usb -device $(MCU) -operation loadbuffer $(TARGET).hex program
|
batchisp -hardware usb -device $(MCU) -operation loadbuffer $(TARGET).hex program
|
||||||
batchisp -hardware usb -device $(MCU) -operation start reset 0
|
batchisp -hardware usb -device $(MCU) -operation start reset 0
|
||||||
|
|
||||||
dfu: $(TARGET).hex
|
dfu: $(TARGET).hex
|
||||||
dfu-programmer $(MCU) erase
|
dfu-programmer $(MCU) erase
|
||||||
dfu-programmer $(MCU) flash $(TARGET).hex
|
dfu-programmer $(MCU) flash $(TARGET).hex
|
||||||
dfu-programmer $(MCU) reset
|
dfu-programmer $(MCU) reset
|
||||||
|
|
||||||
flip-ee: $(TARGET).hex $(TARGET).eep
|
flip-ee: $(TARGET).hex $(TARGET).eep
|
||||||
$(COPY) $(TARGET).eep $(TARGET)eep.hex
|
$(COPY) $(TARGET).eep $(TARGET)eep.hex
|
||||||
batchisp -hardware usb -device $(MCU) -operation memory EEPROM erase
|
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 memory EEPROM loadbuffer $(TARGET)eep.hex program
|
||||||
batchisp -hardware usb -device $(MCU) -operation start reset 0
|
batchisp -hardware usb -device $(MCU) -operation start reset 0
|
||||||
$(REMOVE) $(TARGET)eep.hex
|
$(REMOVE) $(TARGET)eep.hex
|
||||||
|
|
||||||
dfu-ee: $(TARGET).hex $(TARGET).eep
|
dfu-ee: $(TARGET).hex $(TARGET).eep
|
||||||
dfu-programmer $(MCU) eeprom-flash $(TARGET).eep
|
dfu-programmer $(MCU) eeprom-flash $(TARGET).eep
|
||||||
dfu-programmer $(MCU) reset
|
dfu-programmer $(MCU) reset
|
||||||
|
|
||||||
|
|
||||||
# Generate avr-gdb config/init file which does the following:
|
# Generate avr-gdb config/init file which does the following:
|
||||||
# define the reset signal, load the target file, connect to target, and set
|
# define the reset signal, load the target file, connect to target, and set
|
||||||
# a breakpoint at main().
|
# a breakpoint at main().
|
||||||
gdb-config:
|
gdb-config:
|
||||||
@$(REMOVE) $(GDBINIT_FILE)
|
@$(REMOVE) $(GDBINIT_FILE)
|
||||||
@echo define reset >> $(GDBINIT_FILE)
|
@echo define reset >> $(GDBINIT_FILE)
|
||||||
@echo SIGNAL SIGHUP >> $(GDBINIT_FILE)
|
@echo SIGNAL SIGHUP >> $(GDBINIT_FILE)
|
||||||
@echo end >> $(GDBINIT_FILE)
|
@echo end >> $(GDBINIT_FILE)
|
||||||
@echo file $(TARGET).elf >> $(GDBINIT_FILE)
|
@echo file $(TARGET).elf >> $(GDBINIT_FILE)
|
||||||
@echo target remote $(DEBUG_HOST):$(DEBUG_PORT) >> $(GDBINIT_FILE)
|
@echo target remote $(DEBUG_HOST):$(DEBUG_PORT) >> $(GDBINIT_FILE)
|
||||||
ifeq ($(DEBUG_BACKEND),simulavr)
|
ifeq ($(DEBUG_BACKEND),simulavr)
|
||||||
@echo load >> $(GDBINIT_FILE)
|
@echo load >> $(GDBINIT_FILE)
|
||||||
endif
|
endif
|
||||||
@echo break main >> $(GDBINIT_FILE)
|
@echo break main >> $(GDBINIT_FILE)
|
||||||
|
|
||||||
debug: gdb-config $(TARGET).elf
|
debug: gdb-config $(TARGET).elf
|
||||||
ifeq ($(DEBUG_BACKEND), avarice)
|
ifeq ($(DEBUG_BACKEND), avarice)
|
||||||
@echo Starting AVaRICE - Press enter when "waiting to connect" message displays.
|
@echo Starting AVaRICE - Press enter when "waiting to connect" message displays.
|
||||||
@$(WINSHELL) /c start avarice --jtag $(JTAG_DEV) --erase --program --file \
|
@$(WINSHELL) /c start avarice --jtag $(JTAG_DEV) --erase --program --file \
|
||||||
$(TARGET).elf $(DEBUG_HOST):$(DEBUG_PORT)
|
$(TARGET).elf $(DEBUG_HOST):$(DEBUG_PORT)
|
||||||
@$(WINSHELL) /c pause
|
@$(WINSHELL) /c pause
|
||||||
|
|
||||||
else
|
else
|
||||||
@$(WINSHELL) /c start simulavr --gdbserver --device $(MCU) --clock-freq \
|
@$(WINSHELL) /c start simulavr --gdbserver --device $(MCU) --clock-freq \
|
||||||
$(DEBUG_MFREQ) --port $(DEBUG_PORT)
|
$(DEBUG_MFREQ) --port $(DEBUG_PORT)
|
||||||
endif
|
endif
|
||||||
@$(WINSHELL) /c start avr-$(DEBUG_UI) --command=$(GDBINIT_FILE)
|
@$(WINSHELL) /c start avr-$(DEBUG_UI) --command=$(GDBINIT_FILE)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Convert ELF to COFF for use in debugging / simulating in AVR Studio or VMLAB.
|
# Convert ELF to COFF for use in debugging / simulating in AVR Studio or VMLAB.
|
||||||
COFFCONVERT = $(OBJCOPY) --debugging
|
COFFCONVERT = $(OBJCOPY) --debugging
|
||||||
COFFCONVERT += --change-section-address .data-0x800000
|
COFFCONVERT += --change-section-address .data-0x800000
|
||||||
COFFCONVERT += --change-section-address .bss-0x800000
|
COFFCONVERT += --change-section-address .bss-0x800000
|
||||||
COFFCONVERT += --change-section-address .noinit-0x800000
|
COFFCONVERT += --change-section-address .noinit-0x800000
|
||||||
COFFCONVERT += --change-section-address .eeprom-0x810000
|
COFFCONVERT += --change-section-address .eeprom-0x810000
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
coff: $(TARGET).elf
|
coff: $(TARGET).elf
|
||||||
@echo
|
@echo
|
||||||
@echo $(MSG_COFF) $(TARGET).cof
|
@echo $(MSG_COFF) $(TARGET).cof
|
||||||
$(COFFCONVERT) -O coff-avr $< $(TARGET).cof
|
$(COFFCONVERT) -O coff-avr $< $(TARGET).cof
|
||||||
|
|
||||||
|
|
||||||
extcoff: $(TARGET).elf
|
extcoff: $(TARGET).elf
|
||||||
@echo
|
@echo
|
||||||
@echo $(MSG_EXTENDED_COFF) $(TARGET).cof
|
@echo $(MSG_EXTENDED_COFF) $(TARGET).cof
|
||||||
$(COFFCONVERT) -O coff-ext-avr $< $(TARGET).cof
|
$(COFFCONVERT) -O coff-ext-avr $< $(TARGET).cof
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Create final output files (.hex, .eep) from ELF output file.
|
# Create final output files (.hex, .eep) from ELF output file.
|
||||||
%.hex: %.elf
|
%.hex: %.elf
|
||||||
@echo
|
@echo
|
||||||
@echo $(MSG_FLASH) $@
|
@echo $(MSG_FLASH) $@
|
||||||
$(OBJCOPY) -O $(FORMAT) -R .eeprom -R .fuse -R .lock $< $@
|
$(OBJCOPY) -O $(FORMAT) -R .eeprom -R .fuse -R .lock $< $@
|
||||||
|
|
||||||
%.eep: %.elf
|
%.eep: %.elf
|
||||||
@echo
|
@echo
|
||||||
@echo $(MSG_EEPROM) $@
|
@echo $(MSG_EEPROM) $@
|
||||||
-$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \
|
-$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \
|
||||||
--change-section-lma .eeprom=0 --no-change-warnings -O $(FORMAT) $< $@ || exit 0
|
--change-section-lma .eeprom=0 --no-change-warnings -O $(FORMAT) $< $@ || exit 0
|
||||||
|
|
||||||
# Create extended listing file from ELF output file.
|
# Create extended listing file from ELF output file.
|
||||||
%.lss: %.elf
|
%.lss: %.elf
|
||||||
@echo
|
@echo
|
||||||
@echo $(MSG_EXTENDED_LISTING) $@
|
@echo $(MSG_EXTENDED_LISTING) $@
|
||||||
$(OBJDUMP) -h -S -z $< > $@
|
$(OBJDUMP) -h -S -z $< > $@
|
||||||
|
|
||||||
# Create a symbol table from ELF output file.
|
# Create a symbol table from ELF output file.
|
||||||
%.sym: %.elf
|
%.sym: %.elf
|
||||||
@echo
|
@echo
|
||||||
@echo $(MSG_SYMBOL_TABLE) $@
|
@echo $(MSG_SYMBOL_TABLE) $@
|
||||||
$(NM) -n $< > $@
|
$(NM) -n $< > $@
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Create library from object files.
|
# Create library from object files.
|
||||||
.SECONDARY : $(TARGET).a
|
.SECONDARY : $(TARGET).a
|
||||||
.PRECIOUS : $(OBJ)
|
.PRECIOUS : $(OBJ)
|
||||||
%.a: $(OBJ)
|
%.a: $(OBJ)
|
||||||
@echo
|
@echo
|
||||||
@echo $(MSG_CREATING_LIBRARY) $@
|
@echo $(MSG_CREATING_LIBRARY) $@
|
||||||
$(AR) $@ $(OBJ)
|
$(AR) $@ $(OBJ)
|
||||||
|
|
||||||
|
|
||||||
# Link: create ELF output file from object files.
|
# Link: create ELF output file from object files.
|
||||||
.SECONDARY : $(TARGET).elf
|
.SECONDARY : $(TARGET).elf
|
||||||
.PRECIOUS : $(OBJ)
|
.PRECIOUS : $(OBJ)
|
||||||
%.elf: $(OBJ)
|
%.elf: $(OBJ)
|
||||||
@echo
|
@echo
|
||||||
@echo $(MSG_LINKING) $@
|
@echo $(MSG_LINKING) $@
|
||||||
$(CC) $(ALL_CFLAGS) $^ --output $@ $(LDFLAGS)
|
$(CC) $(ALL_CFLAGS) $^ --output $@ $(LDFLAGS)
|
||||||
|
|
||||||
|
|
||||||
# Compile: create object files from C source files.
|
# Compile: create object files from C source files.
|
||||||
$(OBJDIR)/%.o : %.c
|
$(OBJDIR)/%.o : %.c
|
||||||
@echo
|
@echo
|
||||||
@echo $(MSG_COMPILING) $<
|
@echo $(MSG_COMPILING) $<
|
||||||
$(CC) -c $(ALL_CFLAGS) $< -o $@
|
$(CC) -c $(ALL_CFLAGS) $< -o $@
|
||||||
|
|
||||||
|
|
||||||
# Compile: create object files from C++ source files.
|
# Compile: create object files from C++ source files.
|
||||||
$(OBJDIR)/%.o : %.cpp
|
$(OBJDIR)/%.o : %.cpp
|
||||||
@echo
|
@echo
|
||||||
@echo $(MSG_COMPILING_CPP) $<
|
@echo $(MSG_COMPILING_CPP) $<
|
||||||
$(CC) -c $(ALL_CPPFLAGS) $< -o $@
|
$(CC) -c $(ALL_CPPFLAGS) $< -o $@
|
||||||
|
|
||||||
|
|
||||||
# Compile: create assembler files from C source files.
|
# Compile: create assembler files from C source files.
|
||||||
%.s : %.c
|
%.s : %.c
|
||||||
$(CC) -S $(ALL_CFLAGS) $< -o $@
|
$(CC) -S $(ALL_CFLAGS) $< -o $@
|
||||||
|
|
||||||
|
|
||||||
# Compile: create assembler files from C++ source files.
|
# Compile: create assembler files from C++ source files.
|
||||||
%.s : %.cpp
|
%.s : %.cpp
|
||||||
$(CC) -S $(ALL_CPPFLAGS) $< -o $@
|
$(CC) -S $(ALL_CPPFLAGS) $< -o $@
|
||||||
|
|
||||||
|
|
||||||
# Assemble: create object files from assembler source files.
|
# Assemble: create object files from assembler source files.
|
||||||
$(OBJDIR)/%.o : %.S
|
$(OBJDIR)/%.o : %.S
|
||||||
@echo
|
@echo
|
||||||
@echo $(MSG_ASSEMBLING) $<
|
@echo $(MSG_ASSEMBLING) $<
|
||||||
$(CC) -c $(ALL_ASFLAGS) $< -o $@
|
$(CC) -c $(ALL_ASFLAGS) $< -o $@
|
||||||
|
|
||||||
|
|
||||||
# Create preprocessed source for use in sending a bug report.
|
# Create preprocessed source for use in sending a bug report.
|
||||||
%.i : %.c
|
%.i : %.c
|
||||||
$(CC) -E -mmcu=$(MCU) -I. $(CFLAGS) $< -o $@
|
$(CC) -E -mmcu=$(MCU) -I. $(CFLAGS) $< -o $@
|
||||||
|
|
||||||
|
|
||||||
# Target: clean project.
|
# Target: clean project.
|
||||||
clean: begin clean_list end
|
clean: begin clean_list end
|
||||||
|
|
||||||
clean_list :
|
clean_list :
|
||||||
@echo
|
@echo
|
||||||
@echo $(MSG_CLEANING)
|
@echo $(MSG_CLEANING)
|
||||||
$(REMOVE) $(TARGET).hex
|
$(REMOVE) $(TARGET).hex
|
||||||
$(REMOVE) $(TARGET).eep
|
$(REMOVE) $(TARGET).eep
|
||||||
$(REMOVE) $(TARGET).cof
|
$(REMOVE) $(TARGET).cof
|
||||||
$(REMOVE) $(TARGET).elf
|
$(REMOVE) $(TARGET).elf
|
||||||
$(REMOVE) $(TARGET).map
|
$(REMOVE) $(TARGET).map
|
||||||
$(REMOVE) $(TARGET).sym
|
$(REMOVE) $(TARGET).sym
|
||||||
$(REMOVE) $(TARGET).lss
|
$(REMOVE) $(TARGET).lss
|
||||||
$(REMOVE) $(SRC:%.c=$(OBJDIR)/%.o) $(CPPSRC:%.cpp=$(OBJDIR)/%.o) $(ASRC:%.S=$(OBJDIR)/%.o)
|
$(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=$(OBJDIR)/%.lst) $(CPPSRC:%.cpp=$(OBJDIR)/%.lst) $(ASRC:%.S=$(OBJDIR)/%.lst)
|
||||||
$(REMOVE) $(SRC:.c=.s)
|
$(REMOVE) $(SRC:.c=.s)
|
||||||
$(REMOVE) $(SRC:.c=.d)
|
$(REMOVE) $(SRC:.c=.d)
|
||||||
$(REMOVE) $(SRC:.c=.i)
|
$(REMOVE) $(SRC:.c=.i)
|
||||||
$(REMOVEDIR) .dep
|
$(REMOVEDIR) .dep
|
||||||
|
|
||||||
doxygen:
|
doxygen:
|
||||||
@echo Generating Project Documentation...
|
@echo Generating Project Documentation...
|
||||||
@doxygen Doxygen.conf
|
@doxygen Doxygen.conf
|
||||||
@echo Documentation Generation Complete.
|
@echo Documentation Generation Complete.
|
||||||
|
|
||||||
clean_doxygen:
|
clean_doxygen:
|
||||||
rm -rf Documentation
|
rm -rf Documentation
|
||||||
|
|
||||||
# Create object files directory
|
# Create object files directory
|
||||||
$(shell mkdir $(OBJDIR) 2>/dev/null)
|
$(shell mkdir $(OBJDIR) 2>/dev/null)
|
||||||
|
|
||||||
|
|
||||||
# Include the dependency files.
|
# Include the dependency files.
|
||||||
-include $(shell mkdir .dep 2>/dev/null) $(wildcard .dep/*)
|
-include $(shell mkdir .dep 2>/dev/null) $(wildcard .dep/*)
|
||||||
|
|
||||||
|
|
||||||
# Listing of phony targets.
|
# Listing of phony targets.
|
||||||
.PHONY : all begin finish end sizebefore sizeafter gccversion \
|
.PHONY : all begin finish end sizebefore sizeafter gccversion \
|
||||||
build elf hex eep lss sym coff extcoff doxygen clean \
|
build elf hex eep lss sym coff extcoff doxygen clean \
|
||||||
clean_list clean_doxygen program dfu flip flip-ee dfu-ee \
|
clean_list clean_doxygen program dfu flip flip-ee dfu-ee \
|
||||||
debug gdb-config
|
debug gdb-config
|
||||||
|
|
||||||
|
@ -1,270 +1,270 @@
|
|||||||
/*
|
/*
|
||||||
LUFA Library
|
LUFA Library
|
||||||
Copyright (C) Dean Camera, 2011.
|
Copyright (C) Dean Camera, 2011.
|
||||||
|
|
||||||
dean [at] fourwalledcubicle [dot] com
|
dean [at] fourwalledcubicle [dot] com
|
||||||
www.lufa-lib.org
|
www.lufa-lib.org
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com)
|
Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com)
|
||||||
|
|
||||||
Permission to use, copy, modify, distribute, and sell this
|
Permission to use, copy, modify, distribute, and sell this
|
||||||
software and its documentation for any purpose is hereby granted
|
software and its documentation for any purpose is hereby granted
|
||||||
without fee, provided that the above copyright notice appear in
|
without fee, provided that the above copyright notice appear in
|
||||||
all copies and that both that the copyright notice and this
|
all copies and that both that the copyright notice and this
|
||||||
permission notice and warranty disclaimer appear in supporting
|
permission notice and warranty disclaimer appear in supporting
|
||||||
documentation, and that the name of the author not be used in
|
documentation, and that the name of the author not be used in
|
||||||
advertising or publicity pertaining to distribution of the
|
advertising or publicity pertaining to distribution of the
|
||||||
software without specific, written prior permission.
|
software without specific, written prior permission.
|
||||||
|
|
||||||
The author disclaim all warranties with regard to this
|
The author disclaim all warranties with regard to this
|
||||||
software, including all implied warranties of merchantability
|
software, including all implied warranties of merchantability
|
||||||
and fitness. In no event shall the author be liable for any
|
and fitness. In no event shall the author be liable for any
|
||||||
special, indirect or consequential damages or any damages
|
special, indirect or consequential damages or any damages
|
||||||
whatsoever resulting from loss of use, data or profits, whether
|
whatsoever resulting from loss of use, data or profits, whether
|
||||||
in an action of contract, negligence or other tortious action,
|
in an action of contract, negligence or other tortious action,
|
||||||
arising out of or in connection with the use or performance of
|
arising out of or in connection with the use or performance of
|
||||||
this software.
|
this software.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/** \file
|
/** \file
|
||||||
*
|
*
|
||||||
* Main source file for the AudioOutputHost demo. This file contains the main tasks of
|
* Main source file for the AudioOutputHost demo. This file contains the main tasks of
|
||||||
* the demo and is responsible for the initial application hardware configuration.
|
* the demo and is responsible for the initial application hardware configuration.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "AudioOutputHost.h"
|
#include "AudioOutputHost.h"
|
||||||
|
|
||||||
/** Main program entry point. This routine configures the hardware required by the application, then
|
/** Main program entry point. This routine configures the hardware required by the application, then
|
||||||
* enters a loop to run the application tasks in sequence.
|
* enters a loop to run the application tasks in sequence.
|
||||||
*/
|
*/
|
||||||
int main(void)
|
int main(void)
|
||||||
{
|
{
|
||||||
SetupHardware();
|
SetupHardware();
|
||||||
|
|
||||||
puts_P(PSTR(ESC_FG_CYAN "Audio Output Host Demo running.\r\n" ESC_FG_WHITE));
|
puts_P(PSTR(ESC_FG_CYAN "Audio Output Host Demo running.\r\n" ESC_FG_WHITE));
|
||||||
|
|
||||||
LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY);
|
LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY);
|
||||||
sei();
|
sei();
|
||||||
|
|
||||||
for (;;)
|
for (;;)
|
||||||
{
|
{
|
||||||
Audio_Task();
|
Audio_Task();
|
||||||
USB_USBTask();
|
USB_USBTask();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Configures the board hardware and chip peripherals for the demo's functionality. */
|
/** Configures the board hardware and chip peripherals for the demo's functionality. */
|
||||||
void SetupHardware(void)
|
void SetupHardware(void)
|
||||||
{
|
{
|
||||||
/* Disable watchdog if enabled by bootloader/fuses */
|
/* Disable watchdog if enabled by bootloader/fuses */
|
||||||
MCUSR &= ~(1 << WDRF);
|
MCUSR &= ~(1 << WDRF);
|
||||||
wdt_disable();
|
wdt_disable();
|
||||||
|
|
||||||
/* Disable clock division */
|
/* Disable clock division */
|
||||||
clock_prescale_set(clock_div_1);
|
clock_prescale_set(clock_div_1);
|
||||||
|
|
||||||
/* Hardware Initialization */
|
/* Hardware Initialization */
|
||||||
Serial_Init(9600, false);
|
Serial_Init(9600, false);
|
||||||
Buttons_Init();
|
Buttons_Init();
|
||||||
ADC_Init(ADC_FREE_RUNNING | ADC_PRESCALE_32);
|
ADC_Init(ADC_FREE_RUNNING | ADC_PRESCALE_32);
|
||||||
ADC_SetupChannel(MIC_IN_ADC_CHANNEL);
|
ADC_SetupChannel(MIC_IN_ADC_CHANNEL);
|
||||||
LEDs_Init();
|
LEDs_Init();
|
||||||
USB_Init();
|
USB_Init();
|
||||||
|
|
||||||
/* Create a stdio stream for the serial port for stdin and stdout */
|
/* Create a stdio stream for the serial port for stdin and stdout */
|
||||||
Serial_CreateStream(NULL);
|
Serial_CreateStream(NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Event handler for the USB_DeviceAttached event. This indicates that a device has been attached to the host, and
|
/** Event handler for the USB_DeviceAttached event. This indicates that a device has been attached to the host, and
|
||||||
* starts the library USB task to begin the enumeration and USB management process.
|
* starts the library USB task to begin the enumeration and USB management process.
|
||||||
*/
|
*/
|
||||||
void EVENT_USB_Host_DeviceAttached(void)
|
void EVENT_USB_Host_DeviceAttached(void)
|
||||||
{
|
{
|
||||||
puts_P(PSTR(ESC_FG_GREEN "Device Attached.\r\n" ESC_FG_WHITE));
|
puts_P(PSTR(ESC_FG_GREEN "Device Attached.\r\n" ESC_FG_WHITE));
|
||||||
LEDs_SetAllLEDs(LEDMASK_USB_ENUMERATING);
|
LEDs_SetAllLEDs(LEDMASK_USB_ENUMERATING);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Event handler for the USB_DeviceUnattached event. This indicates that a device has been removed from the host, and
|
/** Event handler for the USB_DeviceUnattached event. This indicates that a device has been removed from the host, and
|
||||||
* stops the library USB task management process.
|
* stops the library USB task management process.
|
||||||
*/
|
*/
|
||||||
void EVENT_USB_Host_DeviceUnattached(void)
|
void EVENT_USB_Host_DeviceUnattached(void)
|
||||||
{
|
{
|
||||||
puts_P(PSTR(ESC_FG_GREEN "Device Unattached.\r\n" ESC_FG_WHITE));
|
puts_P(PSTR(ESC_FG_GREEN "Device Unattached.\r\n" ESC_FG_WHITE));
|
||||||
LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY);
|
LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Event handler for the USB_DeviceEnumerationComplete event. This indicates that a device has been successfully
|
/** Event handler for the USB_DeviceEnumerationComplete event. This indicates that a device has been successfully
|
||||||
* enumerated by the host and is now ready to be used by the application.
|
* enumerated by the host and is now ready to be used by the application.
|
||||||
*/
|
*/
|
||||||
void EVENT_USB_Host_DeviceEnumerationComplete(void)
|
void EVENT_USB_Host_DeviceEnumerationComplete(void)
|
||||||
{
|
{
|
||||||
LEDs_SetAllLEDs(LEDMASK_USB_READY);
|
LEDs_SetAllLEDs(LEDMASK_USB_READY);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Event handler for the USB_HostError event. This indicates that a hardware error occurred while in host mode. */
|
/** Event handler for the USB_HostError event. This indicates that a hardware error occurred while in host mode. */
|
||||||
void EVENT_USB_Host_HostError(const uint8_t ErrorCode)
|
void EVENT_USB_Host_HostError(const uint8_t ErrorCode)
|
||||||
{
|
{
|
||||||
USB_Disable();
|
USB_Disable();
|
||||||
|
|
||||||
printf_P(PSTR(ESC_FG_RED "Host Mode Error\r\n"
|
printf_P(PSTR(ESC_FG_RED "Host Mode Error\r\n"
|
||||||
" -- Error Code %d\r\n" ESC_FG_WHITE), ErrorCode);
|
" -- Error Code %d\r\n" ESC_FG_WHITE), ErrorCode);
|
||||||
|
|
||||||
LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
|
LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
|
||||||
for(;;);
|
for(;;);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Event handler for the USB_DeviceEnumerationFailed event. This indicates that a problem occurred while
|
/** Event handler for the USB_DeviceEnumerationFailed event. This indicates that a problem occurred while
|
||||||
* enumerating an attached USB device.
|
* enumerating an attached USB device.
|
||||||
*/
|
*/
|
||||||
void EVENT_USB_Host_DeviceEnumerationFailed(const uint8_t ErrorCode,
|
void EVENT_USB_Host_DeviceEnumerationFailed(const uint8_t ErrorCode,
|
||||||
const uint8_t SubErrorCode)
|
const uint8_t SubErrorCode)
|
||||||
{
|
{
|
||||||
printf_P(PSTR(ESC_FG_RED "Dev Enum Error\r\n"
|
printf_P(PSTR(ESC_FG_RED "Dev Enum Error\r\n"
|
||||||
" -- Error Code %d\r\n"
|
" -- Error Code %d\r\n"
|
||||||
" -- Sub Error Code %d\r\n"
|
" -- Sub Error Code %d\r\n"
|
||||||
" -- In State %d\r\n" ESC_FG_WHITE), ErrorCode, SubErrorCode, USB_HostState);
|
" -- In State %d\r\n" ESC_FG_WHITE), ErrorCode, SubErrorCode, USB_HostState);
|
||||||
|
|
||||||
LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
|
LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Audio_Task(void)
|
void Audio_Task(void)
|
||||||
{
|
{
|
||||||
uint8_t ErrorCode;
|
uint8_t ErrorCode;
|
||||||
|
|
||||||
switch (USB_HostState)
|
switch (USB_HostState)
|
||||||
{
|
{
|
||||||
case HOST_STATE_Addressed:
|
case HOST_STATE_Addressed:
|
||||||
puts_P(PSTR("Getting Config Data.\r\n"));
|
puts_P(PSTR("Getting Config Data.\r\n"));
|
||||||
|
|
||||||
/* Get and process the configuration descriptor data */
|
/* Get and process the configuration descriptor data */
|
||||||
if ((ErrorCode = ProcessConfigurationDescriptor()) != SuccessfulConfigRead)
|
if ((ErrorCode = ProcessConfigurationDescriptor()) != SuccessfulConfigRead)
|
||||||
{
|
{
|
||||||
if (ErrorCode == ControlError)
|
if (ErrorCode == ControlError)
|
||||||
puts_P(PSTR(ESC_FG_RED "Control Error (Get Configuration).\r\n"));
|
puts_P(PSTR(ESC_FG_RED "Control Error (Get Configuration).\r\n"));
|
||||||
else
|
else
|
||||||
puts_P(PSTR(ESC_FG_RED "Invalid Device.\r\n"));
|
puts_P(PSTR(ESC_FG_RED "Invalid Device.\r\n"));
|
||||||
|
|
||||||
printf_P(PSTR(" -- Error Code: %d\r\n" ESC_FG_WHITE), ErrorCode);
|
printf_P(PSTR(" -- Error Code: %d\r\n" ESC_FG_WHITE), ErrorCode);
|
||||||
|
|
||||||
/* Indicate error status */
|
/* Indicate error status */
|
||||||
LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
|
LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
|
||||||
|
|
||||||
/* Wait until USB device disconnected */
|
/* Wait until USB device disconnected */
|
||||||
USB_HostState = HOST_STATE_WaitForDeviceRemoval;
|
USB_HostState = HOST_STATE_WaitForDeviceRemoval;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Set the device configuration to the first configuration (rarely do devices use multiple configurations) */
|
/* Set the device configuration to the first configuration (rarely do devices use multiple configurations) */
|
||||||
if ((ErrorCode = USB_Host_SetDeviceConfiguration(1)) != HOST_SENDCONTROL_Successful)
|
if ((ErrorCode = USB_Host_SetDeviceConfiguration(1)) != HOST_SENDCONTROL_Successful)
|
||||||
{
|
{
|
||||||
printf_P(PSTR(ESC_FG_RED "Control Error (Set Configuration).\r\n"
|
printf_P(PSTR(ESC_FG_RED "Control Error (Set Configuration).\r\n"
|
||||||
" -- Error Code: %d\r\n" ESC_FG_WHITE), ErrorCode);
|
" -- Error Code: %d\r\n" ESC_FG_WHITE), ErrorCode);
|
||||||
|
|
||||||
/* Indicate error status */
|
/* Indicate error status */
|
||||||
LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
|
LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
|
||||||
|
|
||||||
/* Wait until USB device disconnected */
|
/* Wait until USB device disconnected */
|
||||||
USB_HostState = HOST_STATE_WaitForDeviceRemoval;
|
USB_HostState = HOST_STATE_WaitForDeviceRemoval;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((ErrorCode = USB_Host_SetInterfaceAltSetting(StreamingInterfaceIndex,
|
if ((ErrorCode = USB_Host_SetInterfaceAltSetting(StreamingInterfaceIndex,
|
||||||
StreamingInterfaceAltSetting)) != HOST_SENDCONTROL_Successful)
|
StreamingInterfaceAltSetting)) != HOST_SENDCONTROL_Successful)
|
||||||
{
|
{
|
||||||
printf_P(PSTR(ESC_FG_RED "Could not set alternative streaming interface setting.\r\n"
|
printf_P(PSTR(ESC_FG_RED "Could not set alternative streaming interface setting.\r\n"
|
||||||
" -- Error Code: %d\r\n" ESC_FG_WHITE), ErrorCode);
|
" -- Error Code: %d\r\n" ESC_FG_WHITE), ErrorCode);
|
||||||
|
|
||||||
/* Indicate error status */
|
/* Indicate error status */
|
||||||
LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
|
LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
|
||||||
|
|
||||||
/* Wait until USB device disconnected */
|
/* Wait until USB device disconnected */
|
||||||
USB_HostState = HOST_STATE_WaitForDeviceRemoval;
|
USB_HostState = HOST_STATE_WaitForDeviceRemoval;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
USB_ControlRequest = (USB_Request_Header_t)
|
USB_ControlRequest = (USB_Request_Header_t)
|
||||||
{
|
{
|
||||||
.bmRequestType = (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_ENDPOINT),
|
.bmRequestType = (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_ENDPOINT),
|
||||||
.bRequest = AUDIO_REQ_SetCurrent,
|
.bRequest = AUDIO_REQ_SetCurrent,
|
||||||
.wValue = (AUDIO_EPCONTROL_SamplingFreq << 8),
|
.wValue = (AUDIO_EPCONTROL_SamplingFreq << 8),
|
||||||
.wIndex = StreamingEndpointAddress,
|
.wIndex = StreamingEndpointAddress,
|
||||||
.wLength = sizeof(USB_Audio_SampleFreq_t),
|
.wLength = sizeof(USB_Audio_SampleFreq_t),
|
||||||
};
|
};
|
||||||
|
|
||||||
USB_Audio_SampleFreq_t SampleRate = AUDIO_SAMPLE_FREQ(48000);
|
USB_Audio_SampleFreq_t SampleRate = AUDIO_SAMPLE_FREQ(48000);
|
||||||
|
|
||||||
/* Select the control pipe for the request transfer */
|
/* Select the control pipe for the request transfer */
|
||||||
Pipe_SelectPipe(PIPE_CONTROLPIPE);
|
Pipe_SelectPipe(PIPE_CONTROLPIPE);
|
||||||
|
|
||||||
/* Set the sample rate on the streaming interface endpoint */
|
/* Set the sample rate on the streaming interface endpoint */
|
||||||
if ((ErrorCode = USB_Host_SendControlRequest(&SampleRate)) != HOST_SENDCONTROL_Successful)
|
if ((ErrorCode = USB_Host_SendControlRequest(&SampleRate)) != HOST_SENDCONTROL_Successful)
|
||||||
{
|
{
|
||||||
/* Indicate error status */
|
/* Indicate error status */
|
||||||
LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
|
LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
|
||||||
|
|
||||||
/* Wait until USB device disconnected */
|
/* Wait until USB device disconnected */
|
||||||
USB_HostState = HOST_STATE_WaitForDeviceRemoval;
|
USB_HostState = HOST_STATE_WaitForDeviceRemoval;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Sample reload timer initialization */
|
/* Sample reload timer initialization */
|
||||||
TIMSK0 = (1 << OCIE0A);
|
TIMSK0 = (1 << OCIE0A);
|
||||||
OCR0A = ((F_CPU / 8 / 48000) - 1);
|
OCR0A = ((F_CPU / 8 / 48000) - 1);
|
||||||
TCCR0A = (1 << WGM01); // CTC mode
|
TCCR0A = (1 << WGM01); // CTC mode
|
||||||
TCCR0B = (1 << CS01); // Fcpu/8 speed
|
TCCR0B = (1 << CS01); // Fcpu/8 speed
|
||||||
|
|
||||||
puts_P(PSTR("Speaker Enumerated.\r\n"));
|
puts_P(PSTR("Speaker Enumerated.\r\n"));
|
||||||
|
|
||||||
USB_HostState = HOST_STATE_Configured;
|
USB_HostState = HOST_STATE_Configured;
|
||||||
break;
|
break;
|
||||||
case HOST_STATE_Configured:
|
case HOST_STATE_Configured:
|
||||||
/* Do nothing - audio stream is handled by the timer interrupt routine */
|
/* Do nothing - audio stream is handled by the timer interrupt routine */
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/** ISR to handle the reloading of the endpoint with the next sample. */
|
/** ISR to handle the reloading of the endpoint with the next sample. */
|
||||||
ISR(TIMER0_COMPA_vect, ISR_BLOCK)
|
ISR(TIMER0_COMPA_vect, ISR_BLOCK)
|
||||||
{
|
{
|
||||||
uint8_t PrevPipe = Pipe_GetCurrentPipe();
|
uint8_t PrevPipe = Pipe_GetCurrentPipe();
|
||||||
|
|
||||||
Pipe_SelectPipe(AUDIO_DATA_OUT_PIPE);
|
Pipe_SelectPipe(AUDIO_DATA_OUT_PIPE);
|
||||||
Pipe_Unfreeze();
|
Pipe_Unfreeze();
|
||||||
|
|
||||||
/* Check if the current pipe can be written to (device ready for more data) */
|
/* Check if the current pipe can be written to (device ready for more data) */
|
||||||
if (Pipe_IsOUTReady())
|
if (Pipe_IsOUTReady())
|
||||||
{
|
{
|
||||||
int16_t AudioSample;
|
int16_t AudioSample;
|
||||||
|
|
||||||
#if defined(USE_TEST_TONE)
|
#if defined(USE_TEST_TONE)
|
||||||
static uint8_t SquareWaveSampleCount;
|
static uint8_t SquareWaveSampleCount;
|
||||||
static int16_t CurrentWaveValue;
|
static int16_t CurrentWaveValue;
|
||||||
|
|
||||||
/* In test tone mode, generate a square wave at 1/256 of the sample rate */
|
/* In test tone mode, generate a square wave at 1/256 of the sample rate */
|
||||||
if (SquareWaveSampleCount++ == 0xFF)
|
if (SquareWaveSampleCount++ == 0xFF)
|
||||||
CurrentWaveValue ^= 0x8000;
|
CurrentWaveValue ^= 0x8000;
|
||||||
|
|
||||||
/* Only generate audio if the board button is being pressed */
|
/* Only generate audio if the board button is being pressed */
|
||||||
AudioSample = (Buttons_GetStatus() & BUTTONS_BUTTON1) ? CurrentWaveValue : 0;
|
AudioSample = (Buttons_GetStatus() & BUTTONS_BUTTON1) ? CurrentWaveValue : 0;
|
||||||
#else
|
#else
|
||||||
/* Audio sample is ADC value scaled to fit the entire range */
|
/* Audio sample is ADC value scaled to fit the entire range */
|
||||||
AudioSample = ((SAMPLE_MAX_RANGE / ADC_MAX_RANGE) * ADC_GetResult());
|
AudioSample = ((SAMPLE_MAX_RANGE / ADC_MAX_RANGE) * ADC_GetResult());
|
||||||
|
|
||||||
#if defined(MICROPHONE_BIASED_TO_HALF_RAIL)
|
#if defined(MICROPHONE_BIASED_TO_HALF_RAIL)
|
||||||
/* Microphone is biased to half rail voltage, subtract the bias from the sample value */
|
/* Microphone is biased to half rail voltage, subtract the bias from the sample value */
|
||||||
AudioSample -= (SAMPLE_MAX_RANGE / 2);
|
AudioSample -= (SAMPLE_MAX_RANGE / 2);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
Pipe_Write_16_LE(AudioSample);
|
Pipe_Write_16_LE(AudioSample);
|
||||||
Pipe_Write_16_LE(AudioSample);
|
Pipe_Write_16_LE(AudioSample);
|
||||||
|
|
||||||
if (!(Pipe_IsReadWriteAllowed()))
|
if (!(Pipe_IsReadWriteAllowed()))
|
||||||
Pipe_ClearOUT();
|
Pipe_ClearOUT();
|
||||||
}
|
}
|
||||||
|
|
||||||
Pipe_Freeze();
|
Pipe_Freeze();
|
||||||
Pipe_SelectPipe(PrevPipe);
|
Pipe_SelectPipe(PrevPipe);
|
||||||
}
|
}
|
||||||
|
@ -1,94 +1,94 @@
|
|||||||
/*
|
/*
|
||||||
LUFA Library
|
LUFA Library
|
||||||
Copyright (C) Dean Camera, 2011.
|
Copyright (C) Dean Camera, 2011.
|
||||||
|
|
||||||
dean [at] fourwalledcubicle [dot] com
|
dean [at] fourwalledcubicle [dot] com
|
||||||
www.lufa-lib.org
|
www.lufa-lib.org
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com)
|
Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com)
|
||||||
|
|
||||||
Permission to use, copy, modify, distribute, and sell this
|
Permission to use, copy, modify, distribute, and sell this
|
||||||
software and its documentation for any purpose is hereby granted
|
software and its documentation for any purpose is hereby granted
|
||||||
without fee, provided that the above copyright notice appear in
|
without fee, provided that the above copyright notice appear in
|
||||||
all copies and that both that the copyright notice and this
|
all copies and that both that the copyright notice and this
|
||||||
permission notice and warranty disclaimer appear in supporting
|
permission notice and warranty disclaimer appear in supporting
|
||||||
documentation, and that the name of the author not be used in
|
documentation, and that the name of the author not be used in
|
||||||
advertising or publicity pertaining to distribution of the
|
advertising or publicity pertaining to distribution of the
|
||||||
software without specific, written prior permission.
|
software without specific, written prior permission.
|
||||||
|
|
||||||
The author disclaim all warranties with regard to this
|
The author disclaim all warranties with regard to this
|
||||||
software, including all implied warranties of merchantability
|
software, including all implied warranties of merchantability
|
||||||
and fitness. In no event shall the author be liable for any
|
and fitness. In no event shall the author be liable for any
|
||||||
special, indirect or consequential damages or any damages
|
special, indirect or consequential damages or any damages
|
||||||
whatsoever resulting from loss of use, data or profits, whether
|
whatsoever resulting from loss of use, data or profits, whether
|
||||||
in an action of contract, negligence or other tortious action,
|
in an action of contract, negligence or other tortious action,
|
||||||
arising out of or in connection with the use or performance of
|
arising out of or in connection with the use or performance of
|
||||||
this software.
|
this software.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/** \file
|
/** \file
|
||||||
*
|
*
|
||||||
* Header file for AudioOutputHost.c.
|
* Header file for AudioOutputHost.c.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _AUDIO_OUTPUT_HOST_H_
|
#ifndef _AUDIO_OUTPUT_HOST_H_
|
||||||
#define _AUDIO_OUTPUT_HOST_H_
|
#define _AUDIO_OUTPUT_HOST_H_
|
||||||
|
|
||||||
/* Includes: */
|
/* Includes: */
|
||||||
#include <avr/io.h>
|
#include <avr/io.h>
|
||||||
#include <avr/wdt.h>
|
#include <avr/wdt.h>
|
||||||
#include <avr/pgmspace.h>
|
#include <avr/pgmspace.h>
|
||||||
#include <avr/power.h>
|
#include <avr/power.h>
|
||||||
#include <avr/interrupt.h>
|
#include <avr/interrupt.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
#include <LUFA/Version.h>
|
#include <LUFA/Version.h>
|
||||||
#include <LUFA/Drivers/Misc/TerminalCodes.h>
|
#include <LUFA/Drivers/Misc/TerminalCodes.h>
|
||||||
#include <LUFA/Drivers/USB/USB.h>
|
#include <LUFA/Drivers/USB/USB.h>
|
||||||
#include <LUFA/Drivers/Peripheral/Serial.h>
|
#include <LUFA/Drivers/Peripheral/Serial.h>
|
||||||
#include <LUFA/Drivers/Peripheral/ADC.h>
|
#include <LUFA/Drivers/Peripheral/ADC.h>
|
||||||
#include <LUFA/Drivers/Board/LEDs.h>
|
#include <LUFA/Drivers/Board/LEDs.h>
|
||||||
#include <LUFA/Drivers/Board/Buttons.h>
|
#include <LUFA/Drivers/Board/Buttons.h>
|
||||||
|
|
||||||
#include "ConfigDescriptor.h"
|
#include "ConfigDescriptor.h"
|
||||||
|
|
||||||
/* Macros: */
|
/* Macros: */
|
||||||
/** ADC channel number for the microphone input. */
|
/** ADC channel number for the microphone input. */
|
||||||
#define MIC_IN_ADC_CHANNEL 2
|
#define MIC_IN_ADC_CHANNEL 2
|
||||||
|
|
||||||
/** ADC channel MUX mask for the microphone input. */
|
/** ADC channel MUX mask for the microphone input. */
|
||||||
#define MIC_IN_ADC_MUX_MASK ADC_CHANNEL2
|
#define MIC_IN_ADC_MUX_MASK ADC_CHANNEL2
|
||||||
|
|
||||||
/** Maximum audio sample value for the microphone input. */
|
/** Maximum audio sample value for the microphone input. */
|
||||||
#define SAMPLE_MAX_RANGE 0xFFFF
|
#define SAMPLE_MAX_RANGE 0xFFFF
|
||||||
|
|
||||||
/** Maximum ADC range for the microphone input. */
|
/** Maximum ADC range for the microphone input. */
|
||||||
#define ADC_MAX_RANGE 0x3FF
|
#define ADC_MAX_RANGE 0x3FF
|
||||||
|
|
||||||
/** LED mask for the library LED driver, to indicate that the USB interface is not ready. */
|
/** LED mask for the library LED driver, to indicate that the USB interface is not ready. */
|
||||||
#define LEDMASK_USB_NOTREADY LEDS_LED1
|
#define LEDMASK_USB_NOTREADY LEDS_LED1
|
||||||
|
|
||||||
/** LED mask for the library LED driver, to indicate that the USB interface is enumerating. */
|
/** LED mask for the library LED driver, to indicate that the USB interface is enumerating. */
|
||||||
#define LEDMASK_USB_ENUMERATING (LEDS_LED2 | LEDS_LED3)
|
#define LEDMASK_USB_ENUMERATING (LEDS_LED2 | LEDS_LED3)
|
||||||
|
|
||||||
/** LED mask for the library LED driver, to indicate that the USB interface is ready. */
|
/** LED mask for the library LED driver, to indicate that the USB interface is ready. */
|
||||||
#define LEDMASK_USB_READY (LEDS_LED2 | LEDS_LED4)
|
#define LEDMASK_USB_READY (LEDS_LED2 | LEDS_LED4)
|
||||||
|
|
||||||
/** LED mask for the library LED driver, to indicate that an error has occurred in the USB interface. */
|
/** LED mask for the library LED driver, to indicate that an error has occurred in the USB interface. */
|
||||||
#define LEDMASK_USB_ERROR (LEDS_LED1 | LEDS_LED3)
|
#define LEDMASK_USB_ERROR (LEDS_LED1 | LEDS_LED3)
|
||||||
|
|
||||||
/* Function Prototypes: */
|
/* Function Prototypes: */
|
||||||
void Audio_Task(void);
|
void Audio_Task(void);
|
||||||
void SetupHardware(void);
|
void SetupHardware(void);
|
||||||
|
|
||||||
void EVENT_USB_Host_HostError(const uint8_t ErrorCode);
|
void EVENT_USB_Host_HostError(const uint8_t ErrorCode);
|
||||||
void EVENT_USB_Host_DeviceAttached(void);
|
void EVENT_USB_Host_DeviceAttached(void);
|
||||||
void EVENT_USB_Host_DeviceUnattached(void);
|
void EVENT_USB_Host_DeviceUnattached(void);
|
||||||
void EVENT_USB_Host_DeviceEnumerationFailed(const uint8_t ErrorCode,
|
void EVENT_USB_Host_DeviceEnumerationFailed(const uint8_t ErrorCode,
|
||||||
const uint8_t SubErrorCode);
|
const uint8_t SubErrorCode);
|
||||||
void EVENT_USB_Host_DeviceEnumerationComplete(void);
|
void EVENT_USB_Host_DeviceEnumerationComplete(void);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -1,78 +1,78 @@
|
|||||||
/** \file
|
/** \file
|
||||||
*
|
*
|
||||||
* This file contains special DoxyGen information for the generation of the main page and other special
|
* This file contains special DoxyGen information for the generation of the main page and other special
|
||||||
* documentation pages. It is not a project source file.
|
* documentation pages. It is not a project source file.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/** \mainpage Audio Output Host Demo
|
/** \mainpage Audio Output Host Demo
|
||||||
*
|
*
|
||||||
* \section Sec_Compat Demo Compatibility:
|
* \section Sec_Compat Demo Compatibility:
|
||||||
*
|
*
|
||||||
* The following list indicates what microcontrollers are compatible with this demo.
|
* The following list indicates what microcontrollers are compatible with this demo.
|
||||||
*
|
*
|
||||||
* - Series 7 USB AVRs (AT90USBxxx7)
|
* - Series 7 USB AVRs (AT90USBxxx7)
|
||||||
*
|
*
|
||||||
* \section Sec_Info USB Information:
|
* \section Sec_Info USB Information:
|
||||||
*
|
*
|
||||||
* The following table gives a rundown of the USB utilization of this demo.
|
* The following table gives a rundown of the USB utilization of this demo.
|
||||||
*
|
*
|
||||||
* <table>
|
* <table>
|
||||||
* <tr>
|
* <tr>
|
||||||
* <td><b>USB Mode:</b></td>
|
* <td><b>USB Mode:</b></td>
|
||||||
* <td>Host</td>
|
* <td>Host</td>
|
||||||
* </tr>
|
* </tr>
|
||||||
* <tr>
|
* <tr>
|
||||||
* <td><b>USB Class:</b></td>
|
* <td><b>USB Class:</b></td>
|
||||||
* <td>Audio Class</td>
|
* <td>Audio Class</td>
|
||||||
* </tr>
|
* </tr>
|
||||||
* <tr>
|
* <tr>
|
||||||
* <td><b>USB Subclass:</b></td>
|
* <td><b>USB Subclass:</b></td>
|
||||||
* <td>Standard Audio Device</td>
|
* <td>Standard Audio Device</td>
|
||||||
* </tr>
|
* </tr>
|
||||||
* <tr>
|
* <tr>
|
||||||
* <td><b>Relevant Standards:</b></td>
|
* <td><b>Relevant Standards:</b></td>
|
||||||
* <td>USBIF Audio 1.0 Class Specification \n
|
* <td>USBIF Audio 1.0 Class Specification \n
|
||||||
* USBIF Audio 1.0 Class Terminal Types Specification \n
|
* USBIF Audio 1.0 Class Terminal Types Specification \n
|
||||||
* USBIF Audio 1.0 Data Formats Specification</td>
|
* USBIF Audio 1.0 Data Formats Specification</td>
|
||||||
* </tr>
|
* </tr>
|
||||||
* <tr>
|
* <tr>
|
||||||
* <td><b>Usable Speeds:</b></td>
|
* <td><b>Usable Speeds:</b></td>
|
||||||
* <td>Full Speed Mode</td>
|
* <td>Full Speed Mode</td>
|
||||||
* </tr>
|
* </tr>
|
||||||
* </table>
|
* </table>
|
||||||
*
|
*
|
||||||
* \section Sec_Description Project Description:
|
* \section Sec_Description Project Description:
|
||||||
*
|
*
|
||||||
* Audio Output host demonstration application. This gives a simple reference
|
* Audio Output host demonstration application. This gives a simple reference
|
||||||
* application for implementing a USB Audio host, for USB Audio devices using
|
* application for implementing a USB Audio host, for USB Audio devices using
|
||||||
* the USB Audio 1.0 class profile.
|
* the USB Audio 1.0 class profile.
|
||||||
*
|
*
|
||||||
* By default, the demo will produce a square wave test tone when the board
|
* By default, the demo will produce a square wave test tone when the board
|
||||||
* button is pressed. If USE_TEST_TONE is not defined in the project makefile,
|
* button is pressed. If USE_TEST_TONE is not defined in the project makefile,
|
||||||
* incoming audio from the ADC channel 1 will be sampled and sent to the attached
|
* incoming audio from the ADC channel 1 will be sampled and sent to the attached
|
||||||
* USB audio device instead.
|
* USB audio device instead.
|
||||||
*
|
*
|
||||||
* \section Sec_Options Project Options
|
* \section Sec_Options Project Options
|
||||||
*
|
*
|
||||||
* The following defines can be found in this demo, which can control the demo behaviour when defined, or changed in value.
|
* The following defines can be found in this demo, which can control the demo behaviour when defined, or changed in value.
|
||||||
*
|
*
|
||||||
* <table>
|
* <table>
|
||||||
* <tr>
|
* <tr>
|
||||||
* <td><b>Define Name:</b></td>
|
* <td><b>Define Name:</b></td>
|
||||||
* <td><b>Location:</b></td>
|
* <td><b>Location:</b></td>
|
||||||
* <td><b>Description:</b></td>
|
* <td><b>Description:</b></td>
|
||||||
* </tr>
|
* </tr>
|
||||||
* <tr>
|
* <tr>
|
||||||
* <td>USE_TEST_TONE</td>
|
* <td>USE_TEST_TONE</td>
|
||||||
* <td>Makefile LUFA_OPTS</td>
|
* <td>Makefile LUFA_OPTS</td>
|
||||||
* <td>When defined, this alters the demo to produce a square wave test tone when the first board button is pressed
|
* <td>When defined, this alters the demo to produce a square wave test tone when the first board button is pressed
|
||||||
* instead of sampling the board microphone.</td>
|
* instead of sampling the board microphone.</td>
|
||||||
* </tr>
|
* </tr>
|
||||||
* <tr>
|
* <tr>
|
||||||
* <td>MICROPHONE_BIASED_TO_HALF_RAIL</td>
|
* <td>MICROPHONE_BIASED_TO_HALF_RAIL</td>
|
||||||
* <td>Makefile LUFA_OPTS</td>
|
* <td>Makefile LUFA_OPTS</td>
|
||||||
* <td>When defined, this alters the demo so that the half VCC bias of the microphone input is subtracted.</td>
|
* <td>When defined, this alters the demo so that the half VCC bias of the microphone input is subtracted.</td>
|
||||||
* </tr>
|
* </tr>
|
||||||
* </table>
|
* </table>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
@ -1,220 +1,220 @@
|
|||||||
/*
|
/*
|
||||||
LUFA Library
|
LUFA Library
|
||||||
Copyright (C) Dean Camera, 2011.
|
Copyright (C) Dean Camera, 2011.
|
||||||
|
|
||||||
dean [at] fourwalledcubicle [dot] com
|
dean [at] fourwalledcubicle [dot] com
|
||||||
www.lufa-lib.org
|
www.lufa-lib.org
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com)
|
Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com)
|
||||||
|
|
||||||
Permission to use, copy, modify, distribute, and sell this
|
Permission to use, copy, modify, distribute, and sell this
|
||||||
software and its documentation for any purpose is hereby granted
|
software and its documentation for any purpose is hereby granted
|
||||||
without fee, provided that the above copyright notice appear in
|
without fee, provided that the above copyright notice appear in
|
||||||
all copies and that both that the copyright notice and this
|
all copies and that both that the copyright notice and this
|
||||||
permission notice and warranty disclaimer appear in supporting
|
permission notice and warranty disclaimer appear in supporting
|
||||||
documentation, and that the name of the author not be used in
|
documentation, and that the name of the author not be used in
|
||||||
advertising or publicity pertaining to distribution of the
|
advertising or publicity pertaining to distribution of the
|
||||||
software without specific, written prior permission.
|
software without specific, written prior permission.
|
||||||
|
|
||||||
The author disclaim all warranties with regard to this
|
The author disclaim all warranties with regard to this
|
||||||
software, including all implied warranties of merchantability
|
software, including all implied warranties of merchantability
|
||||||
and fitness. In no event shall the author be liable for any
|
and fitness. In no event shall the author be liable for any
|
||||||
special, indirect or consequential damages or any damages
|
special, indirect or consequential damages or any damages
|
||||||
whatsoever resulting from loss of use, data or profits, whether
|
whatsoever resulting from loss of use, data or profits, whether
|
||||||
in an action of contract, negligence or other tortious action,
|
in an action of contract, negligence or other tortious action,
|
||||||
arising out of or in connection with the use or performance of
|
arising out of or in connection with the use or performance of
|
||||||
this software.
|
this software.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/** \file
|
/** \file
|
||||||
*
|
*
|
||||||
* USB Device Configuration Descriptor processing routines, to determine the correct pipe configurations
|
* USB Device Configuration Descriptor processing routines, to determine the correct pipe configurations
|
||||||
* needed to communication with an attached USB device. Descriptors are special computer-readable structures
|
* needed to communication with an attached USB device. Descriptors are special computer-readable structures
|
||||||
* which the host requests upon device enumeration, to determine the device's capabilities and functions.
|
* which the host requests upon device enumeration, to determine the device's capabilities and functions.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "ConfigDescriptor.h"
|
#include "ConfigDescriptor.h"
|
||||||
|
|
||||||
/** Index of the currently used Audio Streaming Interface within the device. */
|
/** Index of the currently used Audio Streaming Interface within the device. */
|
||||||
uint8_t StreamingInterfaceIndex = 0;
|
uint8_t StreamingInterfaceIndex = 0;
|
||||||
|
|
||||||
/** Alternative Setting of the currently used Audio Streaming Interface within the device. */
|
/** Alternative Setting of the currently used Audio Streaming Interface within the device. */
|
||||||
uint8_t StreamingInterfaceAltSetting = 0;
|
uint8_t StreamingInterfaceAltSetting = 0;
|
||||||
|
|
||||||
/** Address of the streaming audio endpoint currently in use within the device. */
|
/** Address of the streaming audio endpoint currently in use within the device. */
|
||||||
uint8_t StreamingEndpointAddress = 0;
|
uint8_t StreamingEndpointAddress = 0;
|
||||||
|
|
||||||
|
|
||||||
/** Reads and processes an attached device's descriptors, to determine compatibility and pipe configurations. This
|
/** Reads and processes an attached device's descriptors, to determine compatibility and pipe configurations. This
|
||||||
* routine will read in the entire configuration descriptor, and configure the hosts pipes to correctly communicate
|
* routine will read in the entire configuration descriptor, and configure the hosts pipes to correctly communicate
|
||||||
* with compatible devices.
|
* with compatible devices.
|
||||||
*
|
*
|
||||||
* This routine searches for a Streaming Audio interface descriptor containing a valid Isochronous audio endpoint.
|
* This routine searches for a Streaming Audio interface descriptor containing a valid Isochronous audio endpoint.
|
||||||
*
|
*
|
||||||
* \return An error code from the \ref AudioHost_GetConfigDescriptorDataCodes_t enum.
|
* \return An error code from the \ref AudioHost_GetConfigDescriptorDataCodes_t enum.
|
||||||
*/
|
*/
|
||||||
uint8_t ProcessConfigurationDescriptor(void)
|
uint8_t ProcessConfigurationDescriptor(void)
|
||||||
{
|
{
|
||||||
uint8_t ConfigDescriptorData[512];
|
uint8_t ConfigDescriptorData[512];
|
||||||
void* CurrConfigLocation = ConfigDescriptorData;
|
void* CurrConfigLocation = ConfigDescriptorData;
|
||||||
uint16_t CurrConfigBytesRem;
|
uint16_t CurrConfigBytesRem;
|
||||||
|
|
||||||
USB_Descriptor_Interface_t* AudioControlInterface = NULL;
|
USB_Descriptor_Interface_t* AudioControlInterface = NULL;
|
||||||
USB_Descriptor_Interface_t* AudioStreamingInterface = NULL;
|
USB_Descriptor_Interface_t* AudioStreamingInterface = NULL;
|
||||||
USB_Descriptor_Endpoint_t* DataOUTEndpoint = NULL;
|
USB_Descriptor_Endpoint_t* DataOUTEndpoint = NULL;
|
||||||
|
|
||||||
/* Retrieve the entire configuration descriptor into the allocated buffer */
|
/* Retrieve the entire configuration descriptor into the allocated buffer */
|
||||||
switch (USB_Host_GetDeviceConfigDescriptor(1, &CurrConfigBytesRem, ConfigDescriptorData, sizeof(ConfigDescriptorData)))
|
switch (USB_Host_GetDeviceConfigDescriptor(1, &CurrConfigBytesRem, ConfigDescriptorData, sizeof(ConfigDescriptorData)))
|
||||||
{
|
{
|
||||||
case HOST_GETCONFIG_Successful:
|
case HOST_GETCONFIG_Successful:
|
||||||
break;
|
break;
|
||||||
case HOST_GETCONFIG_InvalidData:
|
case HOST_GETCONFIG_InvalidData:
|
||||||
return InvalidConfigDataReturned;
|
return InvalidConfigDataReturned;
|
||||||
case HOST_GETCONFIG_BuffOverflow:
|
case HOST_GETCONFIG_BuffOverflow:
|
||||||
return DescriptorTooLarge;
|
return DescriptorTooLarge;
|
||||||
default:
|
default:
|
||||||
return ControlError;
|
return ControlError;
|
||||||
}
|
}
|
||||||
|
|
||||||
while (!(DataOUTEndpoint))
|
while (!(DataOUTEndpoint))
|
||||||
{
|
{
|
||||||
/* See if we've found a likely compatible interface, and if there is an endpoint within that interface */
|
/* See if we've found a likely compatible interface, and if there is an endpoint within that interface */
|
||||||
if (!(AudioControlInterface) ||
|
if (!(AudioControlInterface) ||
|
||||||
USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation,
|
USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation,
|
||||||
DComp_NextAudioInterfaceDataEndpoint) != DESCRIPTOR_SEARCH_COMP_Found)
|
DComp_NextAudioInterfaceDataEndpoint) != DESCRIPTOR_SEARCH_COMP_Found)
|
||||||
{
|
{
|
||||||
/* Check if we haven't found an Audio Control interface yet, or if we have run out of related Audio Streaming interfaces */
|
/* Check if we haven't found an Audio Control interface yet, or if we have run out of related Audio Streaming interfaces */
|
||||||
if (!(AudioControlInterface) ||
|
if (!(AudioControlInterface) ||
|
||||||
USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation,
|
USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation,
|
||||||
DComp_NextAudioStreamInterface) != DESCRIPTOR_SEARCH_COMP_Found)
|
DComp_NextAudioStreamInterface) != DESCRIPTOR_SEARCH_COMP_Found)
|
||||||
{
|
{
|
||||||
/* Find a new Audio Control interface if the current one doesn't contain a compatible streaming interface */
|
/* Find a new Audio Control interface if the current one doesn't contain a compatible streaming interface */
|
||||||
if (USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation,
|
if (USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation,
|
||||||
DComp_NextAudioControlInterface) != DESCRIPTOR_SEARCH_COMP_Found)
|
DComp_NextAudioControlInterface) != DESCRIPTOR_SEARCH_COMP_Found)
|
||||||
{
|
{
|
||||||
/* Descriptor not found, error out */
|
/* Descriptor not found, error out */
|
||||||
return NoCompatibleInterfaceFound;
|
return NoCompatibleInterfaceFound;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Save the interface in case we need to refer back to it later */
|
/* Save the interface in case we need to refer back to it later */
|
||||||
AudioControlInterface = DESCRIPTOR_PCAST(CurrConfigLocation, USB_Descriptor_Interface_t);
|
AudioControlInterface = DESCRIPTOR_PCAST(CurrConfigLocation, USB_Descriptor_Interface_t);
|
||||||
|
|
||||||
/* Find the next Audio Streaming interface within that Audio Control interface */
|
/* Find the next Audio Streaming interface within that Audio Control interface */
|
||||||
if (USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation,
|
if (USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation,
|
||||||
DComp_NextAudioStreamInterface) != DESCRIPTOR_SEARCH_COMP_Found)
|
DComp_NextAudioStreamInterface) != DESCRIPTOR_SEARCH_COMP_Found)
|
||||||
{
|
{
|
||||||
/* Descriptor not found, error out */
|
/* Descriptor not found, error out */
|
||||||
return NoCompatibleInterfaceFound;
|
return NoCompatibleInterfaceFound;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Save the interface in case we need to refer back to it later */
|
/* Save the interface in case we need to refer back to it later */
|
||||||
AudioStreamingInterface = DESCRIPTOR_PCAST(CurrConfigLocation, USB_Descriptor_Interface_t);
|
AudioStreamingInterface = DESCRIPTOR_PCAST(CurrConfigLocation, USB_Descriptor_Interface_t);
|
||||||
|
|
||||||
/* Skip the remainder of the loop as we have not found an endpoint yet */
|
/* Skip the remainder of the loop as we have not found an endpoint yet */
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Retrieve the endpoint address from the endpoint descriptor */
|
/* Retrieve the endpoint address from the endpoint descriptor */
|
||||||
USB_Descriptor_Endpoint_t* EndpointData = DESCRIPTOR_PCAST(CurrConfigLocation, USB_Descriptor_Endpoint_t);
|
USB_Descriptor_Endpoint_t* EndpointData = DESCRIPTOR_PCAST(CurrConfigLocation, USB_Descriptor_Endpoint_t);
|
||||||
|
|
||||||
/* Save the endpoint if it is an OUT type endpoint */
|
/* Save the endpoint if it is an OUT type endpoint */
|
||||||
if (!(EndpointData->EndpointAddress & ENDPOINT_DESCRIPTOR_DIR_IN))
|
if (!(EndpointData->EndpointAddress & ENDPOINT_DESCRIPTOR_DIR_IN))
|
||||||
DataOUTEndpoint = EndpointData;
|
DataOUTEndpoint = EndpointData;
|
||||||
}
|
}
|
||||||
|
|
||||||
StreamingInterfaceIndex = AudioStreamingInterface->InterfaceNumber;
|
StreamingInterfaceIndex = AudioStreamingInterface->InterfaceNumber;
|
||||||
StreamingInterfaceAltSetting = AudioStreamingInterface->AlternateSetting;
|
StreamingInterfaceAltSetting = AudioStreamingInterface->AlternateSetting;
|
||||||
StreamingEndpointAddress = DataOUTEndpoint->EndpointAddress;
|
StreamingEndpointAddress = DataOUTEndpoint->EndpointAddress;
|
||||||
|
|
||||||
/* Configure the Audio data OUT pipe */
|
/* Configure the Audio data OUT pipe */
|
||||||
Pipe_ConfigurePipe(AUDIO_DATA_OUT_PIPE, EP_TYPE_ISOCHRONOUS, PIPE_TOKEN_OUT,
|
Pipe_ConfigurePipe(AUDIO_DATA_OUT_PIPE, EP_TYPE_ISOCHRONOUS, PIPE_TOKEN_OUT,
|
||||||
DataOUTEndpoint->EndpointAddress, DataOUTEndpoint->EndpointSize, PIPE_BANK_DOUBLE);
|
DataOUTEndpoint->EndpointAddress, DataOUTEndpoint->EndpointSize, PIPE_BANK_DOUBLE);
|
||||||
|
|
||||||
/* Valid data found, return success */
|
/* Valid data found, return success */
|
||||||
return SuccessfulConfigRead;
|
return SuccessfulConfigRead;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Descriptor comparator function. This comparator function is can be called while processing an attached USB device's
|
/** Descriptor comparator function. This comparator function is can be called while processing an attached USB device's
|
||||||
* configuration descriptor, to search for a specific sub descriptor. It can also be used to abort the configuration
|
* configuration descriptor, to search for a specific sub descriptor. It can also be used to abort the configuration
|
||||||
* descriptor processing if an incompatible descriptor configuration is found.
|
* descriptor processing if an incompatible descriptor configuration is found.
|
||||||
*
|
*
|
||||||
* This comparator searches for the next Interface descriptor of the correct Audio Control Class, Subclass and Protocol values.
|
* This comparator searches for the next Interface descriptor of the correct Audio Control Class, Subclass and Protocol values.
|
||||||
*
|
*
|
||||||
* \return A value from the DSEARCH_Return_ErrorCodes_t enum
|
* \return A value from the DSEARCH_Return_ErrorCodes_t enum
|
||||||
*/
|
*/
|
||||||
uint8_t DComp_NextAudioControlInterface(void* CurrentDescriptor)
|
uint8_t DComp_NextAudioControlInterface(void* CurrentDescriptor)
|
||||||
{
|
{
|
||||||
USB_Descriptor_Header_t* Header = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Header_t);
|
USB_Descriptor_Header_t* Header = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Header_t);
|
||||||
|
|
||||||
if (Header->Type == DTYPE_Interface)
|
if (Header->Type == DTYPE_Interface)
|
||||||
{
|
{
|
||||||
USB_Descriptor_Interface_t* Interface = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Interface_t);
|
USB_Descriptor_Interface_t* Interface = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Interface_t);
|
||||||
|
|
||||||
if ((Interface->Class == AUDIO_CSCP_AudioClass) &&
|
if ((Interface->Class == AUDIO_CSCP_AudioClass) &&
|
||||||
(Interface->SubClass == AUDIO_CSCP_ControlSubclass) &&
|
(Interface->SubClass == AUDIO_CSCP_ControlSubclass) &&
|
||||||
(Interface->Protocol == AUDIO_CSCP_ControlProtocol))
|
(Interface->Protocol == AUDIO_CSCP_ControlProtocol))
|
||||||
{
|
{
|
||||||
return DESCRIPTOR_SEARCH_Found;
|
return DESCRIPTOR_SEARCH_Found;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return DESCRIPTOR_SEARCH_NotFound;
|
return DESCRIPTOR_SEARCH_NotFound;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Descriptor comparator function. This comparator function is can be called while processing an attached USB device's
|
/** Descriptor comparator function. This comparator function is can be called while processing an attached USB device's
|
||||||
* configuration descriptor, to search for a specific sub descriptor. It can also be used to abort the configuration
|
* configuration descriptor, to search for a specific sub descriptor. It can also be used to abort the configuration
|
||||||
* descriptor processing if an incompatible descriptor configuration is found.
|
* descriptor processing if an incompatible descriptor configuration is found.
|
||||||
*
|
*
|
||||||
* This comparator searches for the next Interface descriptor of the correct Audio Streaming Class, Subclass and Protocol values.
|
* This comparator searches for the next Interface descriptor of the correct Audio Streaming Class, Subclass and Protocol values.
|
||||||
*
|
*
|
||||||
* \return A value from the DSEARCH_Return_ErrorCodes_t enum
|
* \return A value from the DSEARCH_Return_ErrorCodes_t enum
|
||||||
*/
|
*/
|
||||||
uint8_t DComp_NextAudioStreamInterface(void* CurrentDescriptor)
|
uint8_t DComp_NextAudioStreamInterface(void* CurrentDescriptor)
|
||||||
{
|
{
|
||||||
USB_Descriptor_Header_t* Header = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Header_t);
|
USB_Descriptor_Header_t* Header = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Header_t);
|
||||||
|
|
||||||
if (Header->Type == DTYPE_Interface)
|
if (Header->Type == DTYPE_Interface)
|
||||||
{
|
{
|
||||||
USB_Descriptor_Interface_t* Interface = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Interface_t);
|
USB_Descriptor_Interface_t* Interface = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Interface_t);
|
||||||
|
|
||||||
if ((Interface->Class == AUDIO_CSCP_AudioClass) &&
|
if ((Interface->Class == AUDIO_CSCP_AudioClass) &&
|
||||||
(Interface->SubClass == AUDIO_CSCP_AudioStreamingSubclass) &&
|
(Interface->SubClass == AUDIO_CSCP_AudioStreamingSubclass) &&
|
||||||
(Interface->Protocol == AUDIO_CSCP_StreamingProtocol))
|
(Interface->Protocol == AUDIO_CSCP_StreamingProtocol))
|
||||||
{
|
{
|
||||||
return DESCRIPTOR_SEARCH_Found;
|
return DESCRIPTOR_SEARCH_Found;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return DESCRIPTOR_SEARCH_NotFound;
|
return DESCRIPTOR_SEARCH_NotFound;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Descriptor comparator function. This comparator function is can be called while processing an attached USB device's
|
/** Descriptor comparator function. This comparator function is can be called while processing an attached USB device's
|
||||||
* configuration descriptor, to search for a specific sub descriptor. It can also be used to abort the configuration
|
* configuration descriptor, to search for a specific sub descriptor. It can also be used to abort the configuration
|
||||||
* descriptor processing if an incompatible descriptor configuration is found.
|
* descriptor processing if an incompatible descriptor configuration is found.
|
||||||
*
|
*
|
||||||
* This comparator searches for the next Isochronous Endpoint descriptor within the current interface, aborting the
|
* This comparator searches for the next Isochronous Endpoint descriptor within the current interface, aborting the
|
||||||
* search if another interface descriptor is found before the next endpoint.
|
* search if another interface descriptor is found before the next endpoint.
|
||||||
*
|
*
|
||||||
* \return A value from the DSEARCH_Return_ErrorCodes_t enum
|
* \return A value from the DSEARCH_Return_ErrorCodes_t enum
|
||||||
*/
|
*/
|
||||||
uint8_t DComp_NextAudioInterfaceDataEndpoint(void* CurrentDescriptor)
|
uint8_t DComp_NextAudioInterfaceDataEndpoint(void* CurrentDescriptor)
|
||||||
{
|
{
|
||||||
USB_Descriptor_Header_t* Header = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Header_t);
|
USB_Descriptor_Header_t* Header = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Header_t);
|
||||||
|
|
||||||
if (Header->Type == DTYPE_Endpoint)
|
if (Header->Type == DTYPE_Endpoint)
|
||||||
{
|
{
|
||||||
USB_Descriptor_Endpoint_t* Endpoint = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Endpoint_t);
|
USB_Descriptor_Endpoint_t* Endpoint = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Endpoint_t);
|
||||||
|
|
||||||
if ((Endpoint->Attributes & EP_TYPE_MASK) == EP_TYPE_ISOCHRONOUS)
|
if ((Endpoint->Attributes & EP_TYPE_MASK) == EP_TYPE_ISOCHRONOUS)
|
||||||
return DESCRIPTOR_SEARCH_Found;
|
return DESCRIPTOR_SEARCH_Found;
|
||||||
}
|
}
|
||||||
else if (Header->Type == DTYPE_Interface)
|
else if (Header->Type == DTYPE_Interface)
|
||||||
{
|
{
|
||||||
return DESCRIPTOR_SEARCH_Fail;
|
return DESCRIPTOR_SEARCH_Fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
return DESCRIPTOR_SEARCH_NotFound;
|
return DESCRIPTOR_SEARCH_NotFound;
|
||||||
}
|
}
|
||||||
|
@ -1,72 +1,72 @@
|
|||||||
/*
|
/*
|
||||||
LUFA Library
|
LUFA Library
|
||||||
Copyright (C) Dean Camera, 2011.
|
Copyright (C) Dean Camera, 2011.
|
||||||
|
|
||||||
dean [at] fourwalledcubicle [dot] com
|
dean [at] fourwalledcubicle [dot] com
|
||||||
www.lufa-lib.org
|
www.lufa-lib.org
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com)
|
Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com)
|
||||||
|
|
||||||
Permission to use, copy, modify, distribute, and sell this
|
Permission to use, copy, modify, distribute, and sell this
|
||||||
software and its documentation for any purpose is hereby granted
|
software and its documentation for any purpose is hereby granted
|
||||||
without fee, provided that the above copyright notice appear in
|
without fee, provided that the above copyright notice appear in
|
||||||
all copies and that both that the copyright notice and this
|
all copies and that both that the copyright notice and this
|
||||||
permission notice and warranty disclaimer appear in supporting
|
permission notice and warranty disclaimer appear in supporting
|
||||||
documentation, and that the name of the author not be used in
|
documentation, and that the name of the author not be used in
|
||||||
advertising or publicity pertaining to distribution of the
|
advertising or publicity pertaining to distribution of the
|
||||||
software without specific, written prior permission.
|
software without specific, written prior permission.
|
||||||
|
|
||||||
The author disclaim all warranties with regard to this
|
The author disclaim all warranties with regard to this
|
||||||
software, including all implied warranties of merchantability
|
software, including all implied warranties of merchantability
|
||||||
and fitness. In no event shall the author be liable for any
|
and fitness. In no event shall the author be liable for any
|
||||||
special, indirect or consequential damages or any damages
|
special, indirect or consequential damages or any damages
|
||||||
whatsoever resulting from loss of use, data or profits, whether
|
whatsoever resulting from loss of use, data or profits, whether
|
||||||
in an action of contract, negligence or other tortious action,
|
in an action of contract, negligence or other tortious action,
|
||||||
arising out of or in connection with the use or performance of
|
arising out of or in connection with the use or performance of
|
||||||
this software.
|
this software.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/** \file
|
/** \file
|
||||||
*
|
*
|
||||||
* Header file for ConfigDescriptor.c.
|
* Header file for ConfigDescriptor.c.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _CONFIGDESCRIPTOR_H_
|
#ifndef _CONFIGDESCRIPTOR_H_
|
||||||
#define _CONFIGDESCRIPTOR_H_
|
#define _CONFIGDESCRIPTOR_H_
|
||||||
|
|
||||||
/* Includes: */
|
/* Includes: */
|
||||||
#include <LUFA/Drivers/USB/USB.h>
|
#include <LUFA/Drivers/USB/USB.h>
|
||||||
|
|
||||||
#include "AudioOutputHost.h"
|
#include "AudioOutputHost.h"
|
||||||
|
|
||||||
/* Macros: */
|
/* Macros: */
|
||||||
/** Pipe number for the Audio data OUT pipe. */
|
/** Pipe number for the Audio data OUT pipe. */
|
||||||
#define AUDIO_DATA_OUT_PIPE 1
|
#define AUDIO_DATA_OUT_PIPE 1
|
||||||
|
|
||||||
/* Enums: */
|
/* Enums: */
|
||||||
/** Enum for the possible return codes of the \ref ProcessConfigurationDescriptor() function. */
|
/** Enum for the possible return codes of the \ref ProcessConfigurationDescriptor() function. */
|
||||||
enum AudioHost_GetConfigDescriptorDataCodes_t
|
enum AudioHost_GetConfigDescriptorDataCodes_t
|
||||||
{
|
{
|
||||||
SuccessfulConfigRead = 0, /**< Configuration Descriptor was processed successfully */
|
SuccessfulConfigRead = 0, /**< Configuration Descriptor was processed successfully */
|
||||||
ControlError = 1, /**< A control request to the device failed to complete successfully */
|
ControlError = 1, /**< A control request to the device failed to complete successfully */
|
||||||
DescriptorTooLarge = 2, /**< The device's Configuration Descriptor is too large to process */
|
DescriptorTooLarge = 2, /**< The device's Configuration Descriptor is too large to process */
|
||||||
InvalidConfigDataReturned = 3, /**< The device returned an invalid Configuration Descriptor */
|
InvalidConfigDataReturned = 3, /**< The device returned an invalid Configuration Descriptor */
|
||||||
NoCompatibleInterfaceFound = 4, /**< A compatible interface with the required endpoints was not found */
|
NoCompatibleInterfaceFound = 4, /**< A compatible interface with the required endpoints was not found */
|
||||||
};
|
};
|
||||||
|
|
||||||
/* External Variables: */
|
/* External Variables: */
|
||||||
extern uint8_t StreamingInterfaceIndex;
|
extern uint8_t StreamingInterfaceIndex;
|
||||||
extern uint8_t StreamingInterfaceAltSetting;
|
extern uint8_t StreamingInterfaceAltSetting;
|
||||||
extern uint8_t StreamingEndpointAddress;
|
extern uint8_t StreamingEndpointAddress;
|
||||||
|
|
||||||
/* Function Prototypes: */
|
/* Function Prototypes: */
|
||||||
uint8_t ProcessConfigurationDescriptor(void);
|
uint8_t ProcessConfigurationDescriptor(void);
|
||||||
|
|
||||||
uint8_t DComp_NextAudioControlInterface(void* CurrentDescriptor);
|
uint8_t DComp_NextAudioControlInterface(void* CurrentDescriptor);
|
||||||
uint8_t DComp_NextAudioStreamInterface(void* CurrentDescriptor);
|
uint8_t DComp_NextAudioStreamInterface(void* CurrentDescriptor);
|
||||||
uint8_t DComp_NextAudioInterfaceDataEndpoint(void* CurrentDescriptor);
|
uint8_t DComp_NextAudioInterfaceDataEndpoint(void* CurrentDescriptor);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -1,717 +1,717 @@
|
|||||||
# Hey Emacs, this is a -*- makefile -*-
|
# Hey Emacs, this is a -*- makefile -*-
|
||||||
#----------------------------------------------------------------------------
|
#----------------------------------------------------------------------------
|
||||||
# WinAVR Makefile Template written by Eric B. Weddington, Jörg Wunsch, et al.
|
# WinAVR Makefile Template written by Eric B. Weddington, Jörg Wunsch, et al.
|
||||||
# >> Modified for use with the LUFA project. <<
|
# >> Modified for use with the LUFA project. <<
|
||||||
#
|
#
|
||||||
# Released to the Public Domain
|
# Released to the Public Domain
|
||||||
#
|
#
|
||||||
# Additional material for this makefile was written by:
|
# Additional material for this makefile was written by:
|
||||||
# Peter Fleury
|
# Peter Fleury
|
||||||
# Tim Henigan
|
# Tim Henigan
|
||||||
# Colin O'Flynn
|
# Colin O'Flynn
|
||||||
# Reiner Patommel
|
# Reiner Patommel
|
||||||
# Markus Pfaff
|
# Markus Pfaff
|
||||||
# Sander Pool
|
# Sander Pool
|
||||||
# Frederik Rouleau
|
# Frederik Rouleau
|
||||||
# Carlos Lamas
|
# Carlos Lamas
|
||||||
# Dean Camera
|
# Dean Camera
|
||||||
# Opendous Inc.
|
# Opendous Inc.
|
||||||
# Denver Gingerich
|
# Denver Gingerich
|
||||||
#
|
#
|
||||||
#----------------------------------------------------------------------------
|
#----------------------------------------------------------------------------
|
||||||
# On command line:
|
# On command line:
|
||||||
#
|
#
|
||||||
# make all = Make software.
|
# make all = Make software.
|
||||||
#
|
#
|
||||||
# make clean = Clean out built project files.
|
# make clean = Clean out built project files.
|
||||||
#
|
#
|
||||||
# make coff = Convert ELF to AVR COFF.
|
# make coff = Convert ELF to AVR COFF.
|
||||||
#
|
#
|
||||||
# make extcoff = Convert ELF to AVR Extended COFF.
|
# make extcoff = Convert ELF to AVR Extended COFF.
|
||||||
#
|
#
|
||||||
# make program = Download the hex file to the device, using avrdude.
|
# make program = Download the hex file to the device, using avrdude.
|
||||||
# Please customize the avrdude settings below first!
|
# Please customize the avrdude settings below first!
|
||||||
#
|
#
|
||||||
# make dfu = Download the hex file to the device, using dfu-programmer (must
|
# make dfu = Download the hex file to the device, using dfu-programmer (must
|
||||||
# have dfu-programmer installed).
|
# have dfu-programmer installed).
|
||||||
#
|
#
|
||||||
# make flip = Download the hex file to the device, using Atmel FLIP (must
|
# make flip = Download the hex file to the device, using Atmel FLIP (must
|
||||||
# have Atmel FLIP installed).
|
# have Atmel FLIP installed).
|
||||||
#
|
#
|
||||||
# make dfu-ee = Download the eeprom file to the device, using dfu-programmer
|
# make dfu-ee = Download the eeprom file to the device, using dfu-programmer
|
||||||
# (must have dfu-programmer installed).
|
# (must have dfu-programmer installed).
|
||||||
#
|
#
|
||||||
# make flip-ee = Download the eeprom file to the device, using Atmel FLIP
|
# make flip-ee = Download the eeprom file to the device, using Atmel FLIP
|
||||||
# (must have Atmel FLIP installed).
|
# (must have Atmel FLIP installed).
|
||||||
#
|
#
|
||||||
# make doxygen = Generate DoxyGen documentation for the project (must have
|
# make doxygen = Generate DoxyGen documentation for the project (must have
|
||||||
# DoxyGen installed)
|
# DoxyGen installed)
|
||||||
#
|
#
|
||||||
# make debug = Start either simulavr or avarice as specified for debugging,
|
# make debug = Start either simulavr or avarice as specified for debugging,
|
||||||
# with avr-gdb or avr-insight as the front end 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.s = Just compile filename.c into the assembler code only.
|
||||||
#
|
#
|
||||||
# make filename.i = Create a preprocessed source file for use in submitting
|
# make filename.i = Create a preprocessed source file for use in submitting
|
||||||
# bug reports to the GCC project.
|
# bug reports to the GCC project.
|
||||||
#
|
#
|
||||||
# To rebuild project do "make clean" then "make all".
|
# To rebuild project do "make clean" then "make all".
|
||||||
#----------------------------------------------------------------------------
|
#----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
# MCU name
|
# MCU name
|
||||||
MCU = at90usb1287
|
MCU = at90usb1287
|
||||||
|
|
||||||
|
|
||||||
# Target architecture (see library "Board Types" documentation).
|
# Target architecture (see library "Board Types" documentation).
|
||||||
ARCH = AVR8
|
ARCH = AVR8
|
||||||
|
|
||||||
|
|
||||||
# Target board (see library "Board Types" documentation, NONE for projects not requiring
|
# 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
|
# LUFA board drivers). If USER is selected, put custom board drivers in a directory called
|
||||||
# "Board" inside the application directory.
|
# "Board" inside the application directory.
|
||||||
BOARD = USBKEY
|
BOARD = USBKEY
|
||||||
|
|
||||||
|
|
||||||
# Processor frequency.
|
# Processor frequency.
|
||||||
# This will define a symbol, F_CPU, in all source code files equal to the
|
# 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
|
# 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
|
# 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.
|
# 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
|
# 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
|
# 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
|
# 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
|
# reflect the processor speed set externally so that the code can use accurate
|
||||||
# software delays.
|
# software delays.
|
||||||
F_CPU = 8000000
|
F_CPU = 8000000
|
||||||
|
|
||||||
|
|
||||||
# Input clock frequency.
|
# Input clock frequency.
|
||||||
# This will define a symbol, F_USB, in all source code files equal to the
|
# 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
|
# 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
|
# 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
|
# 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'
|
# 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
|
# at the end, this will be done automatically to create a 32-bit value in your
|
||||||
# source code.
|
# source code.
|
||||||
#
|
#
|
||||||
# If no clock division is performed on the input clock inside the AVR (via the
|
# 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.
|
# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
|
||||||
F_USB = $(F_CPU)
|
F_USB = $(F_CPU)
|
||||||
|
|
||||||
|
|
||||||
# Output format. (can be srec, ihex, binary)
|
# Output format. (can be srec, ihex, binary)
|
||||||
FORMAT = ihex
|
FORMAT = ihex
|
||||||
|
|
||||||
|
|
||||||
# Target file name (without extension).
|
# Target file name (without extension).
|
||||||
TARGET = AudioOutputHost
|
TARGET = AudioOutputHost
|
||||||
|
|
||||||
|
|
||||||
# Object files directory
|
# Object files directory
|
||||||
# To put object files in current directory, use a dot (.), do NOT make
|
# To put object files in current directory, use a dot (.), do NOT make
|
||||||
# this an empty or blank macro!
|
# this an empty or blank macro!
|
||||||
OBJDIR = .
|
OBJDIR = .
|
||||||
|
|
||||||
|
|
||||||
# Path to the LUFA library
|
# Path to the LUFA library
|
||||||
LUFA_PATH = ../../../..
|
LUFA_PATH = ../../../..
|
||||||
|
|
||||||
|
|
||||||
# LUFA library compile-time options and predefined tokens
|
# LUFA library compile-time options and predefined tokens
|
||||||
LUFA_OPTS = -D USB_HOST_ONLY
|
LUFA_OPTS = -D USB_HOST_ONLY
|
||||||
LUFA_OPTS += -D USE_STATIC_OPTIONS="(USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"
|
LUFA_OPTS += -D USE_STATIC_OPTIONS="(USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"
|
||||||
|
|
||||||
LUFA_OPTS += -D MICROPHONE_BIASED_TO_HALF_RAIL
|
LUFA_OPTS += -D MICROPHONE_BIASED_TO_HALF_RAIL
|
||||||
LUFA_OPTS += -D USE_TEST_TONE
|
LUFA_OPTS += -D USE_TEST_TONE
|
||||||
|
|
||||||
|
|
||||||
# Create the LUFA source path variables by including the LUFA root makefile
|
# Create the LUFA source path variables by including the LUFA root makefile
|
||||||
include $(LUFA_PATH)/LUFA/makefile
|
include $(LUFA_PATH)/LUFA/makefile
|
||||||
|
|
||||||
|
|
||||||
# List C source files here. (C dependencies are automatically generated.)
|
# List C source files here. (C dependencies are automatically generated.)
|
||||||
SRC = $(TARGET).c \
|
SRC = $(TARGET).c \
|
||||||
ConfigDescriptor.c \
|
ConfigDescriptor.c \
|
||||||
$(LUFA_SRC_USB) \
|
$(LUFA_SRC_USB) \
|
||||||
$(LUFA_SRC_SERIAL)
|
$(LUFA_SRC_SERIAL)
|
||||||
|
|
||||||
|
|
||||||
# List C++ source files here. (C dependencies are automatically generated.)
|
# List C++ source files here. (C dependencies are automatically generated.)
|
||||||
CPPSRC =
|
CPPSRC =
|
||||||
|
|
||||||
|
|
||||||
# List Assembler source files here.
|
# List Assembler source files here.
|
||||||
# Make them always end in a capital .S. Files ending in a lowercase .s
|
# Make them always end in a capital .S. Files ending in a lowercase .s
|
||||||
# will not be considered source files but generated files (assembler
|
# will not be considered source files but generated files (assembler
|
||||||
# output from the compiler), and will be deleted upon "make clean"!
|
# output from the compiler), and will be deleted upon "make clean"!
|
||||||
# Even though the DOS/Win* filesystem matches both .s and .S the same,
|
# 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
|
# it will preserve the spelling of the filenames, and gcc itself does
|
||||||
# care about how the name is spelled on its command-line.
|
# care about how the name is spelled on its command-line.
|
||||||
ASRC =
|
ASRC =
|
||||||
|
|
||||||
|
|
||||||
# Optimization level, can be [0, 1, 2, 3, s].
|
# Optimization level, can be [0, 1, 2, 3, s].
|
||||||
# 0 = turn off optimization. s = optimize for size.
|
# 0 = turn off optimization. s = optimize for size.
|
||||||
# (Note: 3 is not always the best optimization level. See avr-libc FAQ.)
|
# (Note: 3 is not always the best optimization level. See avr-libc FAQ.)
|
||||||
OPT = s
|
OPT = s
|
||||||
|
|
||||||
|
|
||||||
# Debugging format.
|
# Debugging format.
|
||||||
# Native formats for AVR-GCC's -g are dwarf-2 [default] or stabs.
|
# Native formats for AVR-GCC's -g are dwarf-2 [default] or stabs.
|
||||||
# AVR Studio 4.10 requires dwarf-2.
|
# AVR Studio 4.10 requires dwarf-2.
|
||||||
# AVR [Extended] COFF format requires stabs, plus an avr-objcopy run.
|
# AVR [Extended] COFF format requires stabs, plus an avr-objcopy run.
|
||||||
DEBUG = dwarf-2
|
DEBUG = dwarf-2
|
||||||
|
|
||||||
|
|
||||||
# List any extra directories to look for include files here.
|
# List any extra directories to look for include files here.
|
||||||
# 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)/
|
||||||
|
|
||||||
|
|
||||||
# Compiler flag to set the C Standard level.
|
# Compiler flag to set the C Standard level.
|
||||||
# c89 = "ANSI" C
|
# c89 = "ANSI" C
|
||||||
# gnu89 = c89 plus GCC extensions
|
# gnu89 = c89 plus GCC extensions
|
||||||
# c99 = ISO C99 standard (not yet fully implemented)
|
# c99 = ISO C99 standard (not yet fully implemented)
|
||||||
# gnu99 = c99 plus GCC extensions
|
# gnu99 = c99 plus GCC extensions
|
||||||
CSTANDARD = -std=c99
|
CSTANDARD = -std=c99
|
||||||
|
|
||||||
|
|
||||||
# Place -D or -U options here for C sources
|
# Place -D or -U options here for C sources
|
||||||
CDEFS = -DF_CPU=$(F_CPU)UL
|
CDEFS = -DF_CPU=$(F_CPU)UL
|
||||||
CDEFS += -DF_USB=$(F_USB)UL
|
CDEFS += -DF_USB=$(F_USB)UL
|
||||||
CDEFS += -DBOARD=BOARD_$(BOARD) -DARCH=ARCH_$(ARCH)
|
CDEFS += -DBOARD=BOARD_$(BOARD) -DARCH=ARCH_$(ARCH)
|
||||||
CDEFS += $(LUFA_OPTS)
|
CDEFS += $(LUFA_OPTS)
|
||||||
|
|
||||||
|
|
||||||
# Place -D or -U options here for ASM sources
|
# Place -D or -U options here for ASM sources
|
||||||
ADEFS = -DF_CPU=$(F_CPU)
|
ADEFS = -DF_CPU=$(F_CPU)
|
||||||
ADEFS += -DF_USB=$(F_USB)UL
|
ADEFS += -DF_USB=$(F_USB)UL
|
||||||
ADEFS += -DBOARD=BOARD_$(BOARD)
|
ADEFS += -DBOARD=BOARD_$(BOARD)
|
||||||
ADEFS += $(LUFA_OPTS)
|
ADEFS += $(LUFA_OPTS)
|
||||||
|
|
||||||
# Place -D or -U options here for C++ sources
|
# Place -D or -U options here for C++ sources
|
||||||
CPPDEFS = -DF_CPU=$(F_CPU)UL
|
CPPDEFS = -DF_CPU=$(F_CPU)UL
|
||||||
CPPDEFS += -DF_USB=$(F_USB)UL
|
CPPDEFS += -DF_USB=$(F_USB)UL
|
||||||
CPPDEFS += -DBOARD=BOARD_$(BOARD)
|
CPPDEFS += -DBOARD=BOARD_$(BOARD)
|
||||||
CPPDEFS += $(LUFA_OPTS)
|
CPPDEFS += $(LUFA_OPTS)
|
||||||
#CPPDEFS += -D__STDC_LIMIT_MACROS
|
#CPPDEFS += -D__STDC_LIMIT_MACROS
|
||||||
#CPPDEFS += -D__STDC_CONSTANT_MACROS
|
#CPPDEFS += -D__STDC_CONSTANT_MACROS
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#---------------- Compiler Options C ----------------
|
#---------------- Compiler Options C ----------------
|
||||||
# -g*: generate debugging information
|
# -g*: generate debugging information
|
||||||
# -O*: optimization level
|
# -O*: optimization level
|
||||||
# -f...: tuning, see GCC manual and avr-libc documentation
|
# -f...: tuning, see GCC manual and avr-libc documentation
|
||||||
# -Wall...: warning level
|
# -Wall...: warning level
|
||||||
# -Wa,...: tell GCC to pass this to the assembler.
|
# -Wa,...: tell GCC to pass this to the assembler.
|
||||||
# -adhlns...: create assembler listing
|
# -adhlns...: create assembler listing
|
||||||
CFLAGS = -g$(DEBUG)
|
CFLAGS = -g$(DEBUG)
|
||||||
CFLAGS += $(CDEFS)
|
CFLAGS += $(CDEFS)
|
||||||
CFLAGS += -O$(OPT)
|
CFLAGS += -O$(OPT)
|
||||||
CFLAGS += -funsigned-char
|
CFLAGS += -funsigned-char
|
||||||
CFLAGS += -funsigned-bitfields
|
CFLAGS += -funsigned-bitfields
|
||||||
CFLAGS += -ffunction-sections
|
CFLAGS += -ffunction-sections
|
||||||
CFLAGS += -fno-inline-small-functions
|
CFLAGS += -fno-inline-small-functions
|
||||||
CFLAGS += -fpack-struct
|
CFLAGS += -fpack-struct
|
||||||
CFLAGS += -fshort-enums
|
CFLAGS += -fshort-enums
|
||||||
CFLAGS += -fno-strict-aliasing
|
CFLAGS += -fno-strict-aliasing
|
||||||
CFLAGS += -Wall
|
CFLAGS += -Wall
|
||||||
CFLAGS += -Wstrict-prototypes
|
CFLAGS += -Wstrict-prototypes
|
||||||
#CFLAGS += -mshort-calls
|
#CFLAGS += -mshort-calls
|
||||||
#CFLAGS += -fno-unit-at-a-time
|
#CFLAGS += -fno-unit-at-a-time
|
||||||
#CFLAGS += -Wundef
|
#CFLAGS += -Wundef
|
||||||
#CFLAGS += -Wunreachable-code
|
#CFLAGS += -Wunreachable-code
|
||||||
#CFLAGS += -Wsign-compare
|
#CFLAGS += -Wsign-compare
|
||||||
CFLAGS += -Wa,-adhlns=$(<:%.c=$(OBJDIR)/%.lst)
|
CFLAGS += -Wa,-adhlns=$(<:%.c=$(OBJDIR)/%.lst)
|
||||||
CFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS))
|
CFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS))
|
||||||
CFLAGS += $(CSTANDARD)
|
CFLAGS += $(CSTANDARD)
|
||||||
|
|
||||||
|
|
||||||
#---------------- Compiler Options C++ ----------------
|
#---------------- Compiler Options C++ ----------------
|
||||||
# -g*: generate debugging information
|
# -g*: generate debugging information
|
||||||
# -O*: optimization level
|
# -O*: optimization level
|
||||||
# -f...: tuning, see GCC manual and avr-libc documentation
|
# -f...: tuning, see GCC manual and avr-libc documentation
|
||||||
# -Wall...: warning level
|
# -Wall...: warning level
|
||||||
# -Wa,...: tell GCC to pass this to the assembler.
|
# -Wa,...: tell GCC to pass this to the assembler.
|
||||||
# -adhlns...: create assembler listing
|
# -adhlns...: create assembler listing
|
||||||
CPPFLAGS = -g$(DEBUG)
|
CPPFLAGS = -g$(DEBUG)
|
||||||
CPPFLAGS += $(CPPDEFS)
|
CPPFLAGS += $(CPPDEFS)
|
||||||
CPPFLAGS += -O$(OPT)
|
CPPFLAGS += -O$(OPT)
|
||||||
CPPFLAGS += -funsigned-char
|
CPPFLAGS += -funsigned-char
|
||||||
CPPFLAGS += -funsigned-bitfields
|
CPPFLAGS += -funsigned-bitfields
|
||||||
CPPFLAGS += -fpack-struct
|
CPPFLAGS += -fpack-struct
|
||||||
CPPFLAGS += -fshort-enums
|
CPPFLAGS += -fshort-enums
|
||||||
CPPFLAGS += -fno-exceptions
|
CPPFLAGS += -fno-exceptions
|
||||||
CPPFLAGS += -Wall
|
CPPFLAGS += -Wall
|
||||||
CPPFLAGS += -Wundef
|
CPPFLAGS += -Wundef
|
||||||
#CPPFLAGS += -mshort-calls
|
#CPPFLAGS += -mshort-calls
|
||||||
#CPPFLAGS += -fno-unit-at-a-time
|
#CPPFLAGS += -fno-unit-at-a-time
|
||||||
#CPPFLAGS += -Wstrict-prototypes
|
#CPPFLAGS += -Wstrict-prototypes
|
||||||
#CPPFLAGS += -Wunreachable-code
|
#CPPFLAGS += -Wunreachable-code
|
||||||
#CPPFLAGS += -Wsign-compare
|
#CPPFLAGS += -Wsign-compare
|
||||||
CPPFLAGS += -Wa,-adhlns=$(<:%.cpp=$(OBJDIR)/%.lst)
|
CPPFLAGS += -Wa,-adhlns=$(<:%.cpp=$(OBJDIR)/%.lst)
|
||||||
CPPFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS))
|
CPPFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS))
|
||||||
#CPPFLAGS += $(CSTANDARD)
|
#CPPFLAGS += $(CSTANDARD)
|
||||||
|
|
||||||
|
|
||||||
#---------------- Assembler Options ----------------
|
#---------------- Assembler Options ----------------
|
||||||
# -Wa,...: tell GCC to pass this to the assembler.
|
# -Wa,...: tell GCC to pass this to the assembler.
|
||||||
# -adhlns: create listing
|
# -adhlns: create listing
|
||||||
# -gstabs: have the assembler create line number information; note that
|
# -gstabs: have the assembler create line number information; note that
|
||||||
# for use in COFF files, additional information about filenames
|
# for use in COFF files, additional information about filenames
|
||||||
# and function names needs to be present in the assembler source
|
# and function names needs to be present in the assembler source
|
||||||
# files -- see avr-libc docs [FIXME: not yet described there]
|
# files -- see avr-libc docs [FIXME: not yet described there]
|
||||||
# -listing-cont-lines: Sets the maximum number of continuation lines of hex
|
# -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.
|
# 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
|
ASFLAGS = $(ADEFS) -Wa,-adhlns=$(<:%.S=$(OBJDIR)/%.lst),-gstabs,--listing-cont-lines=100
|
||||||
|
|
||||||
|
|
||||||
#---------------- Library Options ----------------
|
#---------------- Library Options ----------------
|
||||||
# Minimalistic printf version
|
# Minimalistic printf version
|
||||||
PRINTF_LIB_MIN = -Wl,-u,vfprintf -lprintf_min
|
PRINTF_LIB_MIN = -Wl,-u,vfprintf -lprintf_min
|
||||||
|
|
||||||
# Floating point printf version (requires MATH_LIB = -lm below)
|
# Floating point printf version (requires MATH_LIB = -lm below)
|
||||||
PRINTF_LIB_FLOAT = -Wl,-u,vfprintf -lprintf_flt
|
PRINTF_LIB_FLOAT = -Wl,-u,vfprintf -lprintf_flt
|
||||||
|
|
||||||
# If this is left blank, then it will use the Standard printf version.
|
# If this is left blank, then it will use the Standard printf version.
|
||||||
PRINTF_LIB =
|
PRINTF_LIB =
|
||||||
#PRINTF_LIB = $(PRINTF_LIB_MIN)
|
#PRINTF_LIB = $(PRINTF_LIB_MIN)
|
||||||
#PRINTF_LIB = $(PRINTF_LIB_FLOAT)
|
#PRINTF_LIB = $(PRINTF_LIB_FLOAT)
|
||||||
|
|
||||||
|
|
||||||
# Minimalistic scanf version
|
# Minimalistic scanf version
|
||||||
SCANF_LIB_MIN = -Wl,-u,vfscanf -lscanf_min
|
SCANF_LIB_MIN = -Wl,-u,vfscanf -lscanf_min
|
||||||
|
|
||||||
# Floating point + %[ scanf version (requires MATH_LIB = -lm below)
|
# Floating point + %[ scanf version (requires MATH_LIB = -lm below)
|
||||||
SCANF_LIB_FLOAT = -Wl,-u,vfscanf -lscanf_flt
|
SCANF_LIB_FLOAT = -Wl,-u,vfscanf -lscanf_flt
|
||||||
|
|
||||||
# If this is left blank, then it will use the Standard scanf version.
|
# If this is left blank, then it will use the Standard scanf version.
|
||||||
SCANF_LIB =
|
SCANF_LIB =
|
||||||
#SCANF_LIB = $(SCANF_LIB_MIN)
|
#SCANF_LIB = $(SCANF_LIB_MIN)
|
||||||
#SCANF_LIB = $(SCANF_LIB_FLOAT)
|
#SCANF_LIB = $(SCANF_LIB_FLOAT)
|
||||||
|
|
||||||
|
|
||||||
MATH_LIB = -lm
|
MATH_LIB = -lm
|
||||||
|
|
||||||
|
|
||||||
# List any extra directories to look for libraries here.
|
# List any extra directories to look for libraries here.
|
||||||
# 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.
|
||||||
EXTRALIBDIRS =
|
EXTRALIBDIRS =
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#---------------- External Memory Options ----------------
|
#---------------- External Memory Options ----------------
|
||||||
|
|
||||||
# 64 KB of external RAM, starting after internal RAM (ATmega128!),
|
# 64 KB of external RAM, starting after internal RAM (ATmega128!),
|
||||||
# used for variables (.data/.bss) and heap (malloc()).
|
# used for variables (.data/.bss) and heap (malloc()).
|
||||||
#EXTMEMOPTS = -Wl,-Tdata=0x801100,--defsym=__heap_end=0x80ffff
|
#EXTMEMOPTS = -Wl,-Tdata=0x801100,--defsym=__heap_end=0x80ffff
|
||||||
|
|
||||||
# 64 KB of external RAM, starting after internal RAM (ATmega128!),
|
# 64 KB of external RAM, starting after internal RAM (ATmega128!),
|
||||||
# only used for heap (malloc()).
|
# only used for heap (malloc()).
|
||||||
#EXTMEMOPTS = -Wl,--section-start,.data=0x801100,--defsym=__heap_end=0x80ffff
|
#EXTMEMOPTS = -Wl,--section-start,.data=0x801100,--defsym=__heap_end=0x80ffff
|
||||||
|
|
||||||
EXTMEMOPTS =
|
EXTMEMOPTS =
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#---------------- Linker Options ----------------
|
#---------------- Linker Options ----------------
|
||||||
# -Wl,...: tell GCC to pass this to linker.
|
# -Wl,...: tell GCC to pass this to linker.
|
||||||
# -Map: create map file
|
# -Map: create map file
|
||||||
# --cref: add cross reference to map file
|
# --cref: add cross reference to map file
|
||||||
LDFLAGS = -Wl,-Map=$(TARGET).map,--cref
|
LDFLAGS = -Wl,-Map=$(TARGET).map,--cref
|
||||||
LDFLAGS += -Wl,--relax
|
LDFLAGS += -Wl,--relax
|
||||||
LDFLAGS += -Wl,--gc-sections
|
LDFLAGS += -Wl,--gc-sections
|
||||||
LDFLAGS += $(EXTMEMOPTS)
|
LDFLAGS += $(EXTMEMOPTS)
|
||||||
LDFLAGS += $(patsubst %,-L%,$(EXTRALIBDIRS))
|
LDFLAGS += $(patsubst %,-L%,$(EXTRALIBDIRS))
|
||||||
LDFLAGS += $(PRINTF_LIB) $(SCANF_LIB) $(MATH_LIB)
|
LDFLAGS += $(PRINTF_LIB) $(SCANF_LIB) $(MATH_LIB)
|
||||||
#LDFLAGS += -T linker_script.x
|
#LDFLAGS += -T linker_script.x
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#---------------- Programming Options (avrdude) ----------------
|
#---------------- Programming Options (avrdude) ----------------
|
||||||
|
|
||||||
# Programming hardware
|
# Programming hardware
|
||||||
# Type: avrdude -c ?
|
# Type: avrdude -c ?
|
||||||
# to get a full listing.
|
# to get a full listing.
|
||||||
#
|
#
|
||||||
AVRDUDE_PROGRAMMER = jtagmkII
|
AVRDUDE_PROGRAMMER = jtagmkII
|
||||||
|
|
||||||
# com1 = serial port. Use lpt1 to connect to parallel port.
|
# com1 = serial port. Use lpt1 to connect to parallel port.
|
||||||
AVRDUDE_PORT = usb
|
AVRDUDE_PORT = usb
|
||||||
|
|
||||||
AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex
|
AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex
|
||||||
#AVRDUDE_WRITE_EEPROM = -U eeprom:w:$(TARGET).eep
|
#AVRDUDE_WRITE_EEPROM = -U eeprom:w:$(TARGET).eep
|
||||||
|
|
||||||
|
|
||||||
# Uncomment the following if you want avrdude's erase cycle counter.
|
# Uncomment the following if you want avrdude's erase cycle counter.
|
||||||
# Note that this counter needs to be initialized first using -Yn,
|
# Note that this counter needs to be initialized first using -Yn,
|
||||||
# see avrdude manual.
|
# see avrdude manual.
|
||||||
#AVRDUDE_ERASE_COUNTER = -y
|
#AVRDUDE_ERASE_COUNTER = -y
|
||||||
|
|
||||||
# Uncomment the following if you do /not/ wish a verification to be
|
# Uncomment the following if you do /not/ wish a verification to be
|
||||||
# performed after programming the device.
|
# performed after programming the device.
|
||||||
#AVRDUDE_NO_VERIFY = -V
|
#AVRDUDE_NO_VERIFY = -V
|
||||||
|
|
||||||
# Increase verbosity level. Please use this when submitting bug
|
# Increase verbosity level. Please use this when submitting bug
|
||||||
# reports about avrdude. See <http://savannah.nongnu.org/projects/avrdude>
|
# reports about avrdude. See <http://savannah.nongnu.org/projects/avrdude>
|
||||||
# to submit bug reports.
|
# to submit bug reports.
|
||||||
#AVRDUDE_VERBOSE = -v -v
|
#AVRDUDE_VERBOSE = -v -v
|
||||||
|
|
||||||
AVRDUDE_FLAGS = -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER)
|
AVRDUDE_FLAGS = -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER)
|
||||||
AVRDUDE_FLAGS += $(AVRDUDE_NO_VERIFY)
|
AVRDUDE_FLAGS += $(AVRDUDE_NO_VERIFY)
|
||||||
AVRDUDE_FLAGS += $(AVRDUDE_VERBOSE)
|
AVRDUDE_FLAGS += $(AVRDUDE_VERBOSE)
|
||||||
AVRDUDE_FLAGS += $(AVRDUDE_ERASE_COUNTER)
|
AVRDUDE_FLAGS += $(AVRDUDE_ERASE_COUNTER)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#---------------- Debugging Options ----------------
|
#---------------- Debugging Options ----------------
|
||||||
|
|
||||||
# For simulavr only - target MCU frequency.
|
# For simulavr only - target MCU frequency.
|
||||||
DEBUG_MFREQ = $(F_CPU)
|
DEBUG_MFREQ = $(F_CPU)
|
||||||
|
|
||||||
# Set the DEBUG_UI to either gdb or insight.
|
# Set the DEBUG_UI to either gdb or insight.
|
||||||
# DEBUG_UI = gdb
|
# DEBUG_UI = gdb
|
||||||
DEBUG_UI = insight
|
DEBUG_UI = insight
|
||||||
|
|
||||||
# Set the debugging back-end to either avarice, simulavr.
|
# Set the debugging back-end to either avarice, simulavr.
|
||||||
DEBUG_BACKEND = avarice
|
DEBUG_BACKEND = avarice
|
||||||
#DEBUG_BACKEND = simulavr
|
#DEBUG_BACKEND = simulavr
|
||||||
|
|
||||||
# GDB Init Filename.
|
# GDB Init Filename.
|
||||||
GDBINIT_FILE = __avr_gdbinit
|
GDBINIT_FILE = __avr_gdbinit
|
||||||
|
|
||||||
# When using avarice settings for the JTAG
|
# When using avarice settings for the JTAG
|
||||||
JTAG_DEV = /dev/com1
|
JTAG_DEV = /dev/com1
|
||||||
|
|
||||||
# Debugging port used to communicate between GDB / avarice / simulavr.
|
# Debugging port used to communicate between GDB / avarice / simulavr.
|
||||||
DEBUG_PORT = 4242
|
DEBUG_PORT = 4242
|
||||||
|
|
||||||
# Debugging host used to communicate between GDB / avarice / simulavr, normally
|
# Debugging host used to communicate between GDB / avarice / simulavr, normally
|
||||||
# just set to localhost unless doing some sort of crazy debugging when
|
# just set to localhost unless doing some sort of crazy debugging when
|
||||||
# avarice is running on a different computer.
|
# avarice is running on a different computer.
|
||||||
DEBUG_HOST = localhost
|
DEBUG_HOST = localhost
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#============================================================================
|
#============================================================================
|
||||||
|
|
||||||
|
|
||||||
# Define programs and commands.
|
# Define programs and commands.
|
||||||
SHELL = sh
|
SHELL = sh
|
||||||
CC = avr-gcc
|
CC = avr-gcc
|
||||||
OBJCOPY = avr-objcopy
|
OBJCOPY = avr-objcopy
|
||||||
OBJDUMP = avr-objdump
|
OBJDUMP = avr-objdump
|
||||||
SIZE = avr-size
|
SIZE = avr-size
|
||||||
AR = avr-ar rcs
|
AR = avr-ar rcs
|
||||||
NM = avr-nm
|
NM = avr-nm
|
||||||
AVRDUDE = avrdude
|
AVRDUDE = avrdude
|
||||||
REMOVE = rm -f
|
REMOVE = rm -f
|
||||||
REMOVEDIR = rm -rf
|
REMOVEDIR = rm -rf
|
||||||
COPY = cp
|
COPY = cp
|
||||||
WINSHELL = cmd
|
WINSHELL = cmd
|
||||||
|
|
||||||
|
|
||||||
# Define Messages
|
# Define Messages
|
||||||
# English
|
# English
|
||||||
MSG_ERRORS_NONE = Errors: none
|
MSG_ERRORS_NONE = Errors: none
|
||||||
MSG_BEGIN = -------- begin --------
|
MSG_BEGIN = -------- begin --------
|
||||||
MSG_END = -------- end --------
|
MSG_END = -------- end --------
|
||||||
MSG_SIZE_BEFORE = Size before:
|
MSG_SIZE_BEFORE = Size before:
|
||||||
MSG_SIZE_AFTER = Size after:
|
MSG_SIZE_AFTER = Size after:
|
||||||
MSG_COFF = Converting to AVR COFF:
|
MSG_COFF = Converting to AVR COFF:
|
||||||
MSG_EXTENDED_COFF = Converting to AVR Extended COFF:
|
MSG_EXTENDED_COFF = Converting to AVR Extended COFF:
|
||||||
MSG_FLASH = Creating load file for Flash:
|
MSG_FLASH = Creating load file for Flash:
|
||||||
MSG_EEPROM = Creating load file for EEPROM:
|
MSG_EEPROM = Creating load file for EEPROM:
|
||||||
MSG_EXTENDED_LISTING = Creating Extended Listing:
|
MSG_EXTENDED_LISTING = Creating Extended Listing:
|
||||||
MSG_SYMBOL_TABLE = Creating Symbol Table:
|
MSG_SYMBOL_TABLE = Creating Symbol Table:
|
||||||
MSG_LINKING = Linking:
|
MSG_LINKING = Linking:
|
||||||
MSG_COMPILING = Compiling C:
|
MSG_COMPILING = Compiling C:
|
||||||
MSG_COMPILING_CPP = Compiling C++:
|
MSG_COMPILING_CPP = Compiling C++:
|
||||||
MSG_ASSEMBLING = Assembling:
|
MSG_ASSEMBLING = Assembling:
|
||||||
MSG_CLEANING = Cleaning project:
|
MSG_CLEANING = Cleaning project:
|
||||||
MSG_CREATING_LIBRARY = Creating library:
|
MSG_CREATING_LIBRARY = Creating library:
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Define all object files.
|
# Define all object files.
|
||||||
OBJ = $(SRC:%.c=$(OBJDIR)/%.o) $(CPPSRC:%.cpp=$(OBJDIR)/%.o) $(ASRC:%.S=$(OBJDIR)/%.o)
|
OBJ = $(SRC:%.c=$(OBJDIR)/%.o) $(CPPSRC:%.cpp=$(OBJDIR)/%.o) $(ASRC:%.S=$(OBJDIR)/%.o)
|
||||||
|
|
||||||
# Define all listing files.
|
# Define all listing files.
|
||||||
LST = $(SRC:%.c=$(OBJDIR)/%.lst) $(CPPSRC:%.cpp=$(OBJDIR)/%.lst) $(ASRC:%.S=$(OBJDIR)/%.lst)
|
LST = $(SRC:%.c=$(OBJDIR)/%.lst) $(CPPSRC:%.cpp=$(OBJDIR)/%.lst) $(ASRC:%.S=$(OBJDIR)/%.lst)
|
||||||
|
|
||||||
|
|
||||||
# Compiler flags to generate dependency files.
|
# Compiler flags to generate dependency files.
|
||||||
GENDEPFLAGS = -MMD -MP -MF .dep/$(@F).d
|
GENDEPFLAGS = -MMD -MP -MF .dep/$(@F).d
|
||||||
|
|
||||||
|
|
||||||
# Combine all necessary flags and optional flags.
|
# Combine all necessary flags and optional flags.
|
||||||
# Add target processor to flags.
|
# Add target processor to flags.
|
||||||
ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS) $(GENDEPFLAGS)
|
ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS) $(GENDEPFLAGS)
|
||||||
ALL_CPPFLAGS = -mmcu=$(MCU) -I. -x c++ $(CPPFLAGS) $(GENDEPFLAGS)
|
ALL_CPPFLAGS = -mmcu=$(MCU) -I. -x c++ $(CPPFLAGS) $(GENDEPFLAGS)
|
||||||
ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS)
|
ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Default target.
|
# Default target.
|
||||||
all: begin gccversion sizebefore build sizeafter end
|
all: begin gccversion sizebefore build sizeafter end
|
||||||
|
|
||||||
# Change the build target to build a HEX file or a library.
|
# Change the build target to build a HEX file or a library.
|
||||||
build: elf hex eep lss sym
|
build: elf hex eep lss sym
|
||||||
#build: lib
|
#build: lib
|
||||||
|
|
||||||
|
|
||||||
elf: $(TARGET).elf
|
elf: $(TARGET).elf
|
||||||
hex: $(TARGET).hex
|
hex: $(TARGET).hex
|
||||||
eep: $(TARGET).eep
|
eep: $(TARGET).eep
|
||||||
lss: $(TARGET).lss
|
lss: $(TARGET).lss
|
||||||
sym: $(TARGET).sym
|
sym: $(TARGET).sym
|
||||||
LIBNAME=lib$(TARGET).a
|
LIBNAME=lib$(TARGET).a
|
||||||
lib: $(LIBNAME)
|
lib: $(LIBNAME)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Eye candy.
|
# Eye candy.
|
||||||
# AVR Studio 3.x does not check make's exit code but relies on
|
# 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.
|
# the following magic strings to be generated by the compile job.
|
||||||
begin:
|
begin:
|
||||||
@echo
|
@echo
|
||||||
@echo $(MSG_BEGIN)
|
@echo $(MSG_BEGIN)
|
||||||
|
|
||||||
end:
|
end:
|
||||||
@echo $(MSG_END)
|
@echo $(MSG_END)
|
||||||
@echo
|
@echo
|
||||||
|
|
||||||
|
|
||||||
# Display size of file.
|
# Display size of file.
|
||||||
HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex
|
HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex
|
||||||
ELFSIZE = $(SIZE) $(MCU_FLAG) $(FORMAT_FLAG) $(TARGET).elf
|
ELFSIZE = $(SIZE) $(MCU_FLAG) $(FORMAT_FLAG) $(TARGET).elf
|
||||||
MCU_FLAG = $(shell $(SIZE) --help | grep -- --mcu > /dev/null && echo --mcu=$(MCU) )
|
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 )
|
FORMAT_FLAG = $(shell $(SIZE) --help | grep -- --format=.*avr > /dev/null && echo --format=avr )
|
||||||
|
|
||||||
|
|
||||||
sizebefore:
|
sizebefore:
|
||||||
@if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_BEFORE); $(ELFSIZE); \
|
@if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_BEFORE); $(ELFSIZE); \
|
||||||
2>/dev/null; echo; fi
|
2>/dev/null; echo; fi
|
||||||
|
|
||||||
sizeafter:
|
sizeafter:
|
||||||
@if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_AFTER); $(ELFSIZE); \
|
@if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_AFTER); $(ELFSIZE); \
|
||||||
2>/dev/null; echo; fi
|
2>/dev/null; echo; fi
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Display compiler version information.
|
# Display compiler version information.
|
||||||
gccversion :
|
gccversion :
|
||||||
@$(CC) --version
|
@$(CC) --version
|
||||||
|
|
||||||
|
|
||||||
# Program the device.
|
# Program the device.
|
||||||
program: $(TARGET).hex $(TARGET).eep
|
program: $(TARGET).hex $(TARGET).eep
|
||||||
$(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM)
|
$(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM)
|
||||||
|
|
||||||
flip: $(TARGET).hex
|
flip: $(TARGET).hex
|
||||||
batchisp -hardware usb -device $(MCU) -operation erase f
|
batchisp -hardware usb -device $(MCU) -operation erase f
|
||||||
batchisp -hardware usb -device $(MCU) -operation loadbuffer $(TARGET).hex program
|
batchisp -hardware usb -device $(MCU) -operation loadbuffer $(TARGET).hex program
|
||||||
batchisp -hardware usb -device $(MCU) -operation start reset 0
|
batchisp -hardware usb -device $(MCU) -operation start reset 0
|
||||||
|
|
||||||
dfu: $(TARGET).hex
|
dfu: $(TARGET).hex
|
||||||
dfu-programmer $(MCU) erase
|
dfu-programmer $(MCU) erase
|
||||||
dfu-programmer $(MCU) flash $(TARGET).hex
|
dfu-programmer $(MCU) flash $(TARGET).hex
|
||||||
dfu-programmer $(MCU) reset
|
dfu-programmer $(MCU) reset
|
||||||
|
|
||||||
flip-ee: $(TARGET).hex $(TARGET).eep
|
flip-ee: $(TARGET).hex $(TARGET).eep
|
||||||
$(COPY) $(TARGET).eep $(TARGET)eep.hex
|
$(COPY) $(TARGET).eep $(TARGET)eep.hex
|
||||||
batchisp -hardware usb -device $(MCU) -operation memory EEPROM erase
|
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 memory EEPROM loadbuffer $(TARGET)eep.hex program
|
||||||
batchisp -hardware usb -device $(MCU) -operation start reset 0
|
batchisp -hardware usb -device $(MCU) -operation start reset 0
|
||||||
$(REMOVE) $(TARGET)eep.hex
|
$(REMOVE) $(TARGET)eep.hex
|
||||||
|
|
||||||
dfu-ee: $(TARGET).hex $(TARGET).eep
|
dfu-ee: $(TARGET).hex $(TARGET).eep
|
||||||
dfu-programmer $(MCU) eeprom-flash $(TARGET).eep
|
dfu-programmer $(MCU) eeprom-flash $(TARGET).eep
|
||||||
dfu-programmer $(MCU) reset
|
dfu-programmer $(MCU) reset
|
||||||
|
|
||||||
|
|
||||||
# Generate avr-gdb config/init file which does the following:
|
# Generate avr-gdb config/init file which does the following:
|
||||||
# define the reset signal, load the target file, connect to target, and set
|
# define the reset signal, load the target file, connect to target, and set
|
||||||
# a breakpoint at main().
|
# a breakpoint at main().
|
||||||
gdb-config:
|
gdb-config:
|
||||||
@$(REMOVE) $(GDBINIT_FILE)
|
@$(REMOVE) $(GDBINIT_FILE)
|
||||||
@echo define reset >> $(GDBINIT_FILE)
|
@echo define reset >> $(GDBINIT_FILE)
|
||||||
@echo SIGNAL SIGHUP >> $(GDBINIT_FILE)
|
@echo SIGNAL SIGHUP >> $(GDBINIT_FILE)
|
||||||
@echo end >> $(GDBINIT_FILE)
|
@echo end >> $(GDBINIT_FILE)
|
||||||
@echo file $(TARGET).elf >> $(GDBINIT_FILE)
|
@echo file $(TARGET).elf >> $(GDBINIT_FILE)
|
||||||
@echo target remote $(DEBUG_HOST):$(DEBUG_PORT) >> $(GDBINIT_FILE)
|
@echo target remote $(DEBUG_HOST):$(DEBUG_PORT) >> $(GDBINIT_FILE)
|
||||||
ifeq ($(DEBUG_BACKEND),simulavr)
|
ifeq ($(DEBUG_BACKEND),simulavr)
|
||||||
@echo load >> $(GDBINIT_FILE)
|
@echo load >> $(GDBINIT_FILE)
|
||||||
endif
|
endif
|
||||||
@echo break main >> $(GDBINIT_FILE)
|
@echo break main >> $(GDBINIT_FILE)
|
||||||
|
|
||||||
debug: gdb-config $(TARGET).elf
|
debug: gdb-config $(TARGET).elf
|
||||||
ifeq ($(DEBUG_BACKEND), avarice)
|
ifeq ($(DEBUG_BACKEND), avarice)
|
||||||
@echo Starting AVaRICE - Press enter when "waiting to connect" message displays.
|
@echo Starting AVaRICE - Press enter when "waiting to connect" message displays.
|
||||||
@$(WINSHELL) /c start avarice --jtag $(JTAG_DEV) --erase --program --file \
|
@$(WINSHELL) /c start avarice --jtag $(JTAG_DEV) --erase --program --file \
|
||||||
$(TARGET).elf $(DEBUG_HOST):$(DEBUG_PORT)
|
$(TARGET).elf $(DEBUG_HOST):$(DEBUG_PORT)
|
||||||
@$(WINSHELL) /c pause
|
@$(WINSHELL) /c pause
|
||||||
|
|
||||||
else
|
else
|
||||||
@$(WINSHELL) /c start simulavr --gdbserver --device $(MCU) --clock-freq \
|
@$(WINSHELL) /c start simulavr --gdbserver --device $(MCU) --clock-freq \
|
||||||
$(DEBUG_MFREQ) --port $(DEBUG_PORT)
|
$(DEBUG_MFREQ) --port $(DEBUG_PORT)
|
||||||
endif
|
endif
|
||||||
@$(WINSHELL) /c start avr-$(DEBUG_UI) --command=$(GDBINIT_FILE)
|
@$(WINSHELL) /c start avr-$(DEBUG_UI) --command=$(GDBINIT_FILE)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Convert ELF to COFF for use in debugging / simulating in AVR Studio or VMLAB.
|
# Convert ELF to COFF for use in debugging / simulating in AVR Studio or VMLAB.
|
||||||
COFFCONVERT = $(OBJCOPY) --debugging
|
COFFCONVERT = $(OBJCOPY) --debugging
|
||||||
COFFCONVERT += --change-section-address .data-0x800000
|
COFFCONVERT += --change-section-address .data-0x800000
|
||||||
COFFCONVERT += --change-section-address .bss-0x800000
|
COFFCONVERT += --change-section-address .bss-0x800000
|
||||||
COFFCONVERT += --change-section-address .noinit-0x800000
|
COFFCONVERT += --change-section-address .noinit-0x800000
|
||||||
COFFCONVERT += --change-section-address .eeprom-0x810000
|
COFFCONVERT += --change-section-address .eeprom-0x810000
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
coff: $(TARGET).elf
|
coff: $(TARGET).elf
|
||||||
@echo
|
@echo
|
||||||
@echo $(MSG_COFF) $(TARGET).cof
|
@echo $(MSG_COFF) $(TARGET).cof
|
||||||
$(COFFCONVERT) -O coff-avr $< $(TARGET).cof
|
$(COFFCONVERT) -O coff-avr $< $(TARGET).cof
|
||||||
|
|
||||||
|
|
||||||
extcoff: $(TARGET).elf
|
extcoff: $(TARGET).elf
|
||||||
@echo
|
@echo
|
||||||
@echo $(MSG_EXTENDED_COFF) $(TARGET).cof
|
@echo $(MSG_EXTENDED_COFF) $(TARGET).cof
|
||||||
$(COFFCONVERT) -O coff-ext-avr $< $(TARGET).cof
|
$(COFFCONVERT) -O coff-ext-avr $< $(TARGET).cof
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Create final output files (.hex, .eep) from ELF output file.
|
# Create final output files (.hex, .eep) from ELF output file.
|
||||||
%.hex: %.elf
|
%.hex: %.elf
|
||||||
@echo
|
@echo
|
||||||
@echo $(MSG_FLASH) $@
|
@echo $(MSG_FLASH) $@
|
||||||
$(OBJCOPY) -O $(FORMAT) -R .eeprom -R .fuse -R .lock $< $@
|
$(OBJCOPY) -O $(FORMAT) -R .eeprom -R .fuse -R .lock $< $@
|
||||||
|
|
||||||
%.eep: %.elf
|
%.eep: %.elf
|
||||||
@echo
|
@echo
|
||||||
@echo $(MSG_EEPROM) $@
|
@echo $(MSG_EEPROM) $@
|
||||||
-$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \
|
-$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \
|
||||||
--change-section-lma .eeprom=0 --no-change-warnings -O $(FORMAT) $< $@ || exit 0
|
--change-section-lma .eeprom=0 --no-change-warnings -O $(FORMAT) $< $@ || exit 0
|
||||||
|
|
||||||
# Create extended listing file from ELF output file.
|
# Create extended listing file from ELF output file.
|
||||||
%.lss: %.elf
|
%.lss: %.elf
|
||||||
@echo
|
@echo
|
||||||
@echo $(MSG_EXTENDED_LISTING) $@
|
@echo $(MSG_EXTENDED_LISTING) $@
|
||||||
$(OBJDUMP) -h -S -z $< > $@
|
$(OBJDUMP) -h -S -z $< > $@
|
||||||
|
|
||||||
# Create a symbol table from ELF output file.
|
# Create a symbol table from ELF output file.
|
||||||
%.sym: %.elf
|
%.sym: %.elf
|
||||||
@echo
|
@echo
|
||||||
@echo $(MSG_SYMBOL_TABLE) $@
|
@echo $(MSG_SYMBOL_TABLE) $@
|
||||||
$(NM) -n $< > $@
|
$(NM) -n $< > $@
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Create library from object files.
|
# Create library from object files.
|
||||||
.SECONDARY : $(TARGET).a
|
.SECONDARY : $(TARGET).a
|
||||||
.PRECIOUS : $(OBJ)
|
.PRECIOUS : $(OBJ)
|
||||||
%.a: $(OBJ)
|
%.a: $(OBJ)
|
||||||
@echo
|
@echo
|
||||||
@echo $(MSG_CREATING_LIBRARY) $@
|
@echo $(MSG_CREATING_LIBRARY) $@
|
||||||
$(AR) $@ $(OBJ)
|
$(AR) $@ $(OBJ)
|
||||||
|
|
||||||
|
|
||||||
# Link: create ELF output file from object files.
|
# Link: create ELF output file from object files.
|
||||||
.SECONDARY : $(TARGET).elf
|
.SECONDARY : $(TARGET).elf
|
||||||
.PRECIOUS : $(OBJ)
|
.PRECIOUS : $(OBJ)
|
||||||
%.elf: $(OBJ)
|
%.elf: $(OBJ)
|
||||||
@echo
|
@echo
|
||||||
@echo $(MSG_LINKING) $@
|
@echo $(MSG_LINKING) $@
|
||||||
$(CC) $(ALL_CFLAGS) $^ --output $@ $(LDFLAGS)
|
$(CC) $(ALL_CFLAGS) $^ --output $@ $(LDFLAGS)
|
||||||
|
|
||||||
|
|
||||||
# Compile: create object files from C source files.
|
# Compile: create object files from C source files.
|
||||||
$(OBJDIR)/%.o : %.c
|
$(OBJDIR)/%.o : %.c
|
||||||
@echo
|
@echo
|
||||||
@echo $(MSG_COMPILING) $<
|
@echo $(MSG_COMPILING) $<
|
||||||
$(CC) -c $(ALL_CFLAGS) $< -o $@
|
$(CC) -c $(ALL_CFLAGS) $< -o $@
|
||||||
|
|
||||||
|
|
||||||
# Compile: create object files from C++ source files.
|
# Compile: create object files from C++ source files.
|
||||||
$(OBJDIR)/%.o : %.cpp
|
$(OBJDIR)/%.o : %.cpp
|
||||||
@echo
|
@echo
|
||||||
@echo $(MSG_COMPILING_CPP) $<
|
@echo $(MSG_COMPILING_CPP) $<
|
||||||
$(CC) -c $(ALL_CPPFLAGS) $< -o $@
|
$(CC) -c $(ALL_CPPFLAGS) $< -o $@
|
||||||
|
|
||||||
|
|
||||||
# Compile: create assembler files from C source files.
|
# Compile: create assembler files from C source files.
|
||||||
%.s : %.c
|
%.s : %.c
|
||||||
$(CC) -S $(ALL_CFLAGS) $< -o $@
|
$(CC) -S $(ALL_CFLAGS) $< -o $@
|
||||||
|
|
||||||
|
|
||||||
# Compile: create assembler files from C++ source files.
|
# Compile: create assembler files from C++ source files.
|
||||||
%.s : %.cpp
|
%.s : %.cpp
|
||||||
$(CC) -S $(ALL_CPPFLAGS) $< -o $@
|
$(CC) -S $(ALL_CPPFLAGS) $< -o $@
|
||||||
|
|
||||||
|
|
||||||
# Assemble: create object files from assembler source files.
|
# Assemble: create object files from assembler source files.
|
||||||
$(OBJDIR)/%.o : %.S
|
$(OBJDIR)/%.o : %.S
|
||||||
@echo
|
@echo
|
||||||
@echo $(MSG_ASSEMBLING) $<
|
@echo $(MSG_ASSEMBLING) $<
|
||||||
$(CC) -c $(ALL_ASFLAGS) $< -o $@
|
$(CC) -c $(ALL_ASFLAGS) $< -o $@
|
||||||
|
|
||||||
|
|
||||||
# Create preprocessed source for use in sending a bug report.
|
# Create preprocessed source for use in sending a bug report.
|
||||||
%.i : %.c
|
%.i : %.c
|
||||||
$(CC) -E -mmcu=$(MCU) -I. $(CFLAGS) $< -o $@
|
$(CC) -E -mmcu=$(MCU) -I. $(CFLAGS) $< -o $@
|
||||||
|
|
||||||
|
|
||||||
# Target: clean project.
|
# Target: clean project.
|
||||||
clean: begin clean_list end
|
clean: begin clean_list end
|
||||||
|
|
||||||
clean_list :
|
clean_list :
|
||||||
@echo
|
@echo
|
||||||
@echo $(MSG_CLEANING)
|
@echo $(MSG_CLEANING)
|
||||||
$(REMOVE) $(TARGET).hex
|
$(REMOVE) $(TARGET).hex
|
||||||
$(REMOVE) $(TARGET).eep
|
$(REMOVE) $(TARGET).eep
|
||||||
$(REMOVE) $(TARGET).cof
|
$(REMOVE) $(TARGET).cof
|
||||||
$(REMOVE) $(TARGET).elf
|
$(REMOVE) $(TARGET).elf
|
||||||
$(REMOVE) $(TARGET).map
|
$(REMOVE) $(TARGET).map
|
||||||
$(REMOVE) $(TARGET).sym
|
$(REMOVE) $(TARGET).sym
|
||||||
$(REMOVE) $(TARGET).lss
|
$(REMOVE) $(TARGET).lss
|
||||||
$(REMOVE) $(SRC:%.c=$(OBJDIR)/%.o) $(CPPSRC:%.cpp=$(OBJDIR)/%.o) $(ASRC:%.S=$(OBJDIR)/%.o)
|
$(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=$(OBJDIR)/%.lst) $(CPPSRC:%.cpp=$(OBJDIR)/%.lst) $(ASRC:%.S=$(OBJDIR)/%.lst)
|
||||||
$(REMOVE) $(SRC:.c=.s)
|
$(REMOVE) $(SRC:.c=.s)
|
||||||
$(REMOVE) $(SRC:.c=.d)
|
$(REMOVE) $(SRC:.c=.d)
|
||||||
$(REMOVE) $(SRC:.c=.i)
|
$(REMOVE) $(SRC:.c=.i)
|
||||||
$(REMOVEDIR) .dep
|
$(REMOVEDIR) .dep
|
||||||
|
|
||||||
doxygen:
|
doxygen:
|
||||||
@echo Generating Project Documentation...
|
@echo Generating Project Documentation...
|
||||||
@doxygen Doxygen.conf
|
@doxygen Doxygen.conf
|
||||||
@echo Documentation Generation Complete.
|
@echo Documentation Generation Complete.
|
||||||
|
|
||||||
clean_doxygen:
|
clean_doxygen:
|
||||||
rm -rf Documentation
|
rm -rf Documentation
|
||||||
|
|
||||||
# Create object files directory
|
# Create object files directory
|
||||||
$(shell mkdir $(OBJDIR) 2>/dev/null)
|
$(shell mkdir $(OBJDIR) 2>/dev/null)
|
||||||
|
|
||||||
|
|
||||||
# Include the dependency files.
|
# Include the dependency files.
|
||||||
-include $(shell mkdir .dep 2>/dev/null) $(wildcard .dep/*)
|
-include $(shell mkdir .dep 2>/dev/null) $(wildcard .dep/*)
|
||||||
|
|
||||||
|
|
||||||
# Listing of phony targets.
|
# Listing of phony targets.
|
||||||
.PHONY : all begin finish end sizebefore sizeafter gccversion \
|
.PHONY : all begin finish end sizebefore sizeafter gccversion \
|
||||||
build elf hex eep lss sym coff extcoff doxygen clean \
|
build elf hex eep lss sym coff extcoff doxygen clean \
|
||||||
clean_list clean_doxygen program dfu flip flip-ee dfu-ee \
|
clean_list clean_doxygen program dfu flip flip-ee dfu-ee \
|
||||||
debug gdb-config
|
debug gdb-config
|
||||||
|
|
||||||
|
@ -1,247 +1,247 @@
|
|||||||
/*
|
/*
|
||||||
LUFA Library
|
LUFA Library
|
||||||
Copyright (C) Dean Camera, 2011.
|
Copyright (C) Dean Camera, 2011.
|
||||||
|
|
||||||
dean [at] fourwalledcubicle [dot] com
|
dean [at] fourwalledcubicle [dot] com
|
||||||
www.lufa-lib.org
|
www.lufa-lib.org
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com)
|
Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com)
|
||||||
|
|
||||||
Permission to use, copy, modify, distribute, and sell this
|
Permission to use, copy, modify, distribute, and sell this
|
||||||
software and its documentation for any purpose is hereby granted
|
software and its documentation for any purpose is hereby granted
|
||||||
without fee, provided that the above copyright notice appear in
|
without fee, provided that the above copyright notice appear in
|
||||||
all copies and that both that the copyright notice and this
|
all copies and that both that the copyright notice and this
|
||||||
permission notice and warranty disclaimer appear in supporting
|
permission notice and warranty disclaimer appear in supporting
|
||||||
documentation, and that the name of the author not be used in
|
documentation, and that the name of the author not be used in
|
||||||
advertising or publicity pertaining to distribution of the
|
advertising or publicity pertaining to distribution of the
|
||||||
software without specific, written prior permission.
|
software without specific, written prior permission.
|
||||||
|
|
||||||
The author disclaim all warranties with regard to this
|
The author disclaim all warranties with regard to this
|
||||||
software, including all implied warranties of merchantability
|
software, including all implied warranties of merchantability
|
||||||
and fitness. In no event shall the author be liable for any
|
and fitness. In no event shall the author be liable for any
|
||||||
special, indirect or consequential damages or any damages
|
special, indirect or consequential damages or any damages
|
||||||
whatsoever resulting from loss of use, data or profits, whether
|
whatsoever resulting from loss of use, data or profits, whether
|
||||||
in an action of contract, negligence or other tortious action,
|
in an action of contract, negligence or other tortious action,
|
||||||
arising out of or in connection with the use or performance of
|
arising out of or in connection with the use or performance of
|
||||||
this software.
|
this software.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define __INCLUDE_FROM_USB_DRIVER
|
#define __INCLUDE_FROM_USB_DRIVER
|
||||||
#include "../../Core/USBMode.h"
|
#include "../../Core/USBMode.h"
|
||||||
|
|
||||||
#if defined(USB_CAN_BE_HOST)
|
#if defined(USB_CAN_BE_HOST)
|
||||||
|
|
||||||
#define __INCLUDE_FROM_AUDIO_DRIVER
|
#define __INCLUDE_FROM_AUDIO_DRIVER
|
||||||
#define __INCLUDE_FROM_AUDIO_HOST_C
|
#define __INCLUDE_FROM_AUDIO_HOST_C
|
||||||
#include "Audio.h"
|
#include "Audio.h"
|
||||||
|
|
||||||
uint8_t Audio_Host_ConfigurePipes(USB_ClassInfo_Audio_Host_t* const AudioInterfaceInfo,
|
uint8_t Audio_Host_ConfigurePipes(USB_ClassInfo_Audio_Host_t* const AudioInterfaceInfo,
|
||||||
uint16_t ConfigDescriptorSize,
|
uint16_t ConfigDescriptorSize,
|
||||||
void* ConfigDescriptorData)
|
void* ConfigDescriptorData)
|
||||||
{
|
{
|
||||||
USB_Descriptor_Endpoint_t* DataINEndpoint = NULL;
|
USB_Descriptor_Endpoint_t* DataINEndpoint = NULL;
|
||||||
USB_Descriptor_Endpoint_t* DataOUTEndpoint = NULL;
|
USB_Descriptor_Endpoint_t* DataOUTEndpoint = NULL;
|
||||||
USB_Descriptor_Interface_t* AudioControlInterface = NULL;
|
USB_Descriptor_Interface_t* AudioControlInterface = NULL;
|
||||||
USB_Descriptor_Interface_t* AudioStreamingInterface = NULL;
|
USB_Descriptor_Interface_t* AudioStreamingInterface = NULL;
|
||||||
|
|
||||||
memset(&AudioInterfaceInfo->State, 0x00, sizeof(AudioInterfaceInfo->State));
|
memset(&AudioInterfaceInfo->State, 0x00, sizeof(AudioInterfaceInfo->State));
|
||||||
|
|
||||||
if (DESCRIPTOR_TYPE(ConfigDescriptorData) != DTYPE_Configuration)
|
if (DESCRIPTOR_TYPE(ConfigDescriptorData) != DTYPE_Configuration)
|
||||||
return AUDIO_ENUMERROR_InvalidConfigDescriptor;
|
return AUDIO_ENUMERROR_InvalidConfigDescriptor;
|
||||||
|
|
||||||
while ((AudioInterfaceInfo->Config.DataINPipeNumber && !(DataINEndpoint)) ||
|
while ((AudioInterfaceInfo->Config.DataINPipeNumber && !(DataINEndpoint)) ||
|
||||||
(AudioInterfaceInfo->Config.DataOUTPipeNumber && !(DataOUTEndpoint)))
|
(AudioInterfaceInfo->Config.DataOUTPipeNumber && !(DataOUTEndpoint)))
|
||||||
{
|
{
|
||||||
if (!(AudioControlInterface) ||
|
if (!(AudioControlInterface) ||
|
||||||
USB_GetNextDescriptorComp(&ConfigDescriptorSize, &ConfigDescriptorData,
|
USB_GetNextDescriptorComp(&ConfigDescriptorSize, &ConfigDescriptorData,
|
||||||
DCOMP_Audio_Host_NextAudioInterfaceDataEndpoint) != DESCRIPTOR_SEARCH_COMP_Found)
|
DCOMP_Audio_Host_NextAudioInterfaceDataEndpoint) != DESCRIPTOR_SEARCH_COMP_Found)
|
||||||
{
|
{
|
||||||
if (!(AudioControlInterface) ||
|
if (!(AudioControlInterface) ||
|
||||||
USB_GetNextDescriptorComp(&ConfigDescriptorSize, &ConfigDescriptorData,
|
USB_GetNextDescriptorComp(&ConfigDescriptorSize, &ConfigDescriptorData,
|
||||||
DCOMP_Audio_Host_NextAudioStreamInterface) != DESCRIPTOR_SEARCH_COMP_Found)
|
DCOMP_Audio_Host_NextAudioStreamInterface) != DESCRIPTOR_SEARCH_COMP_Found)
|
||||||
{
|
{
|
||||||
if (USB_GetNextDescriptorComp(&ConfigDescriptorSize, &ConfigDescriptorData,
|
if (USB_GetNextDescriptorComp(&ConfigDescriptorSize, &ConfigDescriptorData,
|
||||||
DCOMP_Audio_Host_NextAudioControlInterface) != DESCRIPTOR_SEARCH_COMP_Found)
|
DCOMP_Audio_Host_NextAudioControlInterface) != DESCRIPTOR_SEARCH_COMP_Found)
|
||||||
{
|
{
|
||||||
return AUDIO_ENUMERROR_NoCompatibleInterfaceFound;
|
return AUDIO_ENUMERROR_NoCompatibleInterfaceFound;
|
||||||
}
|
}
|
||||||
|
|
||||||
AudioControlInterface = DESCRIPTOR_PCAST(ConfigDescriptorData, USB_Descriptor_Interface_t);
|
AudioControlInterface = DESCRIPTOR_PCAST(ConfigDescriptorData, USB_Descriptor_Interface_t);
|
||||||
|
|
||||||
if (USB_GetNextDescriptorComp(&ConfigDescriptorSize, &ConfigDescriptorData,
|
if (USB_GetNextDescriptorComp(&ConfigDescriptorSize, &ConfigDescriptorData,
|
||||||
DCOMP_Audio_Host_NextAudioStreamInterface) != DESCRIPTOR_SEARCH_COMP_Found)
|
DCOMP_Audio_Host_NextAudioStreamInterface) != DESCRIPTOR_SEARCH_COMP_Found)
|
||||||
{
|
{
|
||||||
return AUDIO_ENUMERROR_NoCompatibleInterfaceFound;
|
return AUDIO_ENUMERROR_NoCompatibleInterfaceFound;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
AudioStreamingInterface = DESCRIPTOR_PCAST(ConfigDescriptorData, USB_Descriptor_Interface_t);
|
AudioStreamingInterface = DESCRIPTOR_PCAST(ConfigDescriptorData, USB_Descriptor_Interface_t);
|
||||||
|
|
||||||
DataINEndpoint = NULL;
|
DataINEndpoint = NULL;
|
||||||
DataOUTEndpoint = NULL;
|
DataOUTEndpoint = NULL;
|
||||||
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
USB_Descriptor_Endpoint_t* EndpointData = DESCRIPTOR_PCAST(ConfigDescriptorData, USB_Descriptor_Endpoint_t);
|
USB_Descriptor_Endpoint_t* EndpointData = DESCRIPTOR_PCAST(ConfigDescriptorData, USB_Descriptor_Endpoint_t);
|
||||||
|
|
||||||
if (EndpointData->EndpointAddress & ENDPOINT_DESCRIPTOR_DIR_IN)
|
if (EndpointData->EndpointAddress & ENDPOINT_DESCRIPTOR_DIR_IN)
|
||||||
DataINEndpoint = EndpointData;
|
DataINEndpoint = EndpointData;
|
||||||
else
|
else
|
||||||
DataOUTEndpoint = EndpointData;
|
DataOUTEndpoint = EndpointData;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (uint8_t PipeNum = 1; PipeNum < PIPE_TOTAL_PIPES; PipeNum++)
|
for (uint8_t PipeNum = 1; PipeNum < PIPE_TOTAL_PIPES; PipeNum++)
|
||||||
{
|
{
|
||||||
uint16_t Size;
|
uint16_t Size;
|
||||||
uint8_t Type;
|
uint8_t Type;
|
||||||
uint8_t Token;
|
uint8_t Token;
|
||||||
uint8_t EndpointAddress;
|
uint8_t EndpointAddress;
|
||||||
bool DoubleBanked;
|
bool DoubleBanked;
|
||||||
|
|
||||||
if (PipeNum == AudioInterfaceInfo->Config.DataINPipeNumber)
|
if (PipeNum == AudioInterfaceInfo->Config.DataINPipeNumber)
|
||||||
{
|
{
|
||||||
Size = DataINEndpoint->EndpointSize;
|
Size = DataINEndpoint->EndpointSize;
|
||||||
EndpointAddress = DataINEndpoint->EndpointAddress;
|
EndpointAddress = DataINEndpoint->EndpointAddress;
|
||||||
Token = PIPE_TOKEN_IN;
|
Token = PIPE_TOKEN_IN;
|
||||||
Type = EP_TYPE_ISOCHRONOUS;
|
Type = EP_TYPE_ISOCHRONOUS;
|
||||||
DoubleBanked = true;
|
DoubleBanked = true;
|
||||||
|
|
||||||
AudioInterfaceInfo->State.DataINPipeSize = DataINEndpoint->EndpointSize;
|
AudioInterfaceInfo->State.DataINPipeSize = DataINEndpoint->EndpointSize;
|
||||||
}
|
}
|
||||||
else if (PipeNum == AudioInterfaceInfo->Config.DataOUTPipeNumber)
|
else if (PipeNum == AudioInterfaceInfo->Config.DataOUTPipeNumber)
|
||||||
{
|
{
|
||||||
Size = DataOUTEndpoint->EndpointSize;
|
Size = DataOUTEndpoint->EndpointSize;
|
||||||
EndpointAddress = DataOUTEndpoint->EndpointAddress;
|
EndpointAddress = DataOUTEndpoint->EndpointAddress;
|
||||||
Token = PIPE_TOKEN_OUT;
|
Token = PIPE_TOKEN_OUT;
|
||||||
Type = EP_TYPE_ISOCHRONOUS;
|
Type = EP_TYPE_ISOCHRONOUS;
|
||||||
DoubleBanked = true;
|
DoubleBanked = true;
|
||||||
|
|
||||||
AudioInterfaceInfo->State.DataOUTPipeSize = DataOUTEndpoint->EndpointSize;
|
AudioInterfaceInfo->State.DataOUTPipeSize = DataOUTEndpoint->EndpointSize;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(Pipe_ConfigurePipe(PipeNum, Type, Token, EndpointAddress, Size,
|
if (!(Pipe_ConfigurePipe(PipeNum, Type, Token, EndpointAddress, Size,
|
||||||
DoubleBanked ? PIPE_BANK_DOUBLE : PIPE_BANK_SINGLE)))
|
DoubleBanked ? PIPE_BANK_DOUBLE : PIPE_BANK_SINGLE)))
|
||||||
{
|
{
|
||||||
return AUDIO_ENUMERROR_PipeConfigurationFailed;
|
return AUDIO_ENUMERROR_PipeConfigurationFailed;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
AudioInterfaceInfo->State.ControlInterfaceNumber = AudioControlInterface->InterfaceNumber;
|
AudioInterfaceInfo->State.ControlInterfaceNumber = AudioControlInterface->InterfaceNumber;
|
||||||
AudioInterfaceInfo->State.StreamingInterfaceNumber = AudioStreamingInterface->InterfaceNumber;
|
AudioInterfaceInfo->State.StreamingInterfaceNumber = AudioStreamingInterface->InterfaceNumber;
|
||||||
AudioInterfaceInfo->State.EnabledStreamingAltIndex = AudioStreamingInterface->AlternateSetting;
|
AudioInterfaceInfo->State.EnabledStreamingAltIndex = AudioStreamingInterface->AlternateSetting;
|
||||||
AudioInterfaceInfo->State.IsActive = true;
|
AudioInterfaceInfo->State.IsActive = true;
|
||||||
|
|
||||||
return AUDIO_ENUMERROR_NoError;
|
return AUDIO_ENUMERROR_NoError;
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint8_t DCOMP_Audio_Host_NextAudioControlInterface(void* CurrentDescriptor)
|
static uint8_t DCOMP_Audio_Host_NextAudioControlInterface(void* CurrentDescriptor)
|
||||||
{
|
{
|
||||||
USB_Descriptor_Header_t* Header = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Header_t);
|
USB_Descriptor_Header_t* Header = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Header_t);
|
||||||
|
|
||||||
if (Header->Type == DTYPE_Interface)
|
if (Header->Type == DTYPE_Interface)
|
||||||
{
|
{
|
||||||
USB_Descriptor_Interface_t* Interface = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Interface_t);
|
USB_Descriptor_Interface_t* Interface = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Interface_t);
|
||||||
|
|
||||||
if ((Interface->Class == AUDIO_CSCP_AudioClass) &&
|
if ((Interface->Class == AUDIO_CSCP_AudioClass) &&
|
||||||
(Interface->SubClass == AUDIO_CSCP_ControlSubclass) &&
|
(Interface->SubClass == AUDIO_CSCP_ControlSubclass) &&
|
||||||
(Interface->Protocol == AUDIO_CSCP_ControlProtocol))
|
(Interface->Protocol == AUDIO_CSCP_ControlProtocol))
|
||||||
{
|
{
|
||||||
return DESCRIPTOR_SEARCH_Found;
|
return DESCRIPTOR_SEARCH_Found;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return DESCRIPTOR_SEARCH_NotFound;
|
return DESCRIPTOR_SEARCH_NotFound;
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint8_t DCOMP_Audio_Host_NextAudioStreamInterface(void* CurrentDescriptor)
|
static uint8_t DCOMP_Audio_Host_NextAudioStreamInterface(void* CurrentDescriptor)
|
||||||
{
|
{
|
||||||
USB_Descriptor_Header_t* Header = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Header_t);
|
USB_Descriptor_Header_t* Header = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Header_t);
|
||||||
|
|
||||||
if (Header->Type == DTYPE_Interface)
|
if (Header->Type == DTYPE_Interface)
|
||||||
{
|
{
|
||||||
USB_Descriptor_Interface_t* Interface = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Interface_t);
|
USB_Descriptor_Interface_t* Interface = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Interface_t);
|
||||||
|
|
||||||
if ((Interface->Class == AUDIO_CSCP_AudioClass) &&
|
if ((Interface->Class == AUDIO_CSCP_AudioClass) &&
|
||||||
(Interface->SubClass == AUDIO_CSCP_AudioStreamingSubclass) &&
|
(Interface->SubClass == AUDIO_CSCP_AudioStreamingSubclass) &&
|
||||||
(Interface->Protocol == AUDIO_CSCP_StreamingProtocol))
|
(Interface->Protocol == AUDIO_CSCP_StreamingProtocol))
|
||||||
{
|
{
|
||||||
return DESCRIPTOR_SEARCH_Found;
|
return DESCRIPTOR_SEARCH_Found;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return DESCRIPTOR_SEARCH_NotFound;
|
return DESCRIPTOR_SEARCH_NotFound;
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint8_t DCOMP_Audio_Host_NextAudioInterfaceDataEndpoint(void* CurrentDescriptor)
|
static uint8_t DCOMP_Audio_Host_NextAudioInterfaceDataEndpoint(void* CurrentDescriptor)
|
||||||
{
|
{
|
||||||
USB_Descriptor_Header_t* Header = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Header_t);
|
USB_Descriptor_Header_t* Header = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Header_t);
|
||||||
|
|
||||||
if (Header->Type == DTYPE_Endpoint)
|
if (Header->Type == DTYPE_Endpoint)
|
||||||
{
|
{
|
||||||
USB_Descriptor_Endpoint_t* Endpoint = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Endpoint_t);
|
USB_Descriptor_Endpoint_t* Endpoint = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Endpoint_t);
|
||||||
|
|
||||||
if ((Endpoint->Attributes & EP_TYPE_MASK) == EP_TYPE_ISOCHRONOUS)
|
if ((Endpoint->Attributes & EP_TYPE_MASK) == EP_TYPE_ISOCHRONOUS)
|
||||||
return DESCRIPTOR_SEARCH_Found;
|
return DESCRIPTOR_SEARCH_Found;
|
||||||
}
|
}
|
||||||
else if (Header->Type == DTYPE_Interface)
|
else if (Header->Type == DTYPE_Interface)
|
||||||
{
|
{
|
||||||
return DESCRIPTOR_SEARCH_Fail;
|
return DESCRIPTOR_SEARCH_Fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
return DESCRIPTOR_SEARCH_NotFound;
|
return DESCRIPTOR_SEARCH_NotFound;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t Audio_Host_StartStopStreaming(USB_ClassInfo_Audio_Host_t* const AudioInterfaceInfo,
|
uint8_t Audio_Host_StartStopStreaming(USB_ClassInfo_Audio_Host_t* const AudioInterfaceInfo,
|
||||||
const bool EnableStreaming)
|
const bool EnableStreaming)
|
||||||
{
|
{
|
||||||
if (!(AudioInterfaceInfo->State.IsActive))
|
if (!(AudioInterfaceInfo->State.IsActive))
|
||||||
return HOST_SENDCONTROL_DeviceDisconnected;
|
return HOST_SENDCONTROL_DeviceDisconnected;
|
||||||
|
|
||||||
return USB_Host_SetInterfaceAltSetting(AudioInterfaceInfo->State.StreamingInterfaceNumber,
|
return USB_Host_SetInterfaceAltSetting(AudioInterfaceInfo->State.StreamingInterfaceNumber,
|
||||||
EnableStreaming ? AudioInterfaceInfo->State.EnabledStreamingAltIndex : 0);
|
EnableStreaming ? AudioInterfaceInfo->State.EnabledStreamingAltIndex : 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t Audio_Host_GetSetEndpointProperty(USB_ClassInfo_Audio_Host_t* const AudioInterfaceInfo,
|
uint8_t Audio_Host_GetSetEndpointProperty(USB_ClassInfo_Audio_Host_t* const AudioInterfaceInfo,
|
||||||
const uint8_t DataPipeIndex,
|
const uint8_t DataPipeIndex,
|
||||||
const uint8_t EndpointProperty,
|
const uint8_t EndpointProperty,
|
||||||
const uint8_t EndpointControl,
|
const uint8_t EndpointControl,
|
||||||
const uint16_t DataLength,
|
const uint16_t DataLength,
|
||||||
void* const Data)
|
void* const Data)
|
||||||
{
|
{
|
||||||
if (!(AudioInterfaceInfo->State.IsActive))
|
if (!(AudioInterfaceInfo->State.IsActive))
|
||||||
return HOST_SENDCONTROL_DeviceDisconnected;
|
return HOST_SENDCONTROL_DeviceDisconnected;
|
||||||
|
|
||||||
uint8_t RequestType;
|
uint8_t RequestType;
|
||||||
uint8_t EndpointAddress;
|
uint8_t EndpointAddress;
|
||||||
|
|
||||||
if (EndpointProperty & 0x80)
|
if (EndpointProperty & 0x80)
|
||||||
RequestType = (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_ENDPOINT);
|
RequestType = (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_ENDPOINT);
|
||||||
else
|
else
|
||||||
RequestType = (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_ENDPOINT);
|
RequestType = (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_ENDPOINT);
|
||||||
|
|
||||||
Pipe_SelectPipe(DataPipeIndex);
|
Pipe_SelectPipe(DataPipeIndex);
|
||||||
EndpointAddress = Pipe_GetBoundEndpointAddress();
|
EndpointAddress = Pipe_GetBoundEndpointAddress();
|
||||||
|
|
||||||
USB_ControlRequest = (USB_Request_Header_t)
|
USB_ControlRequest = (USB_Request_Header_t)
|
||||||
{
|
{
|
||||||
.bmRequestType = RequestType,
|
.bmRequestType = RequestType,
|
||||||
.bRequest = EndpointProperty,
|
.bRequest = EndpointProperty,
|
||||||
.wValue = ((uint16_t)EndpointControl << 8),
|
.wValue = ((uint16_t)EndpointControl << 8),
|
||||||
.wIndex = EndpointAddress,
|
.wIndex = EndpointAddress,
|
||||||
.wLength = DataLength,
|
.wLength = DataLength,
|
||||||
};
|
};
|
||||||
|
|
||||||
Pipe_SelectPipe(PIPE_CONTROLPIPE);
|
Pipe_SelectPipe(PIPE_CONTROLPIPE);
|
||||||
|
|
||||||
return USB_Host_SendControlRequest(Data);
|
return USB_Host_SendControlRequest(Data);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -1,410 +1,410 @@
|
|||||||
/*
|
/*
|
||||||
LUFA Library
|
LUFA Library
|
||||||
Copyright (C) Dean Camera, 2011.
|
Copyright (C) Dean Camera, 2011.
|
||||||
|
|
||||||
dean [at] fourwalledcubicle [dot] com
|
dean [at] fourwalledcubicle [dot] com
|
||||||
www.lufa-lib.org
|
www.lufa-lib.org
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com)
|
Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com)
|
||||||
|
|
||||||
Permission to use, copy, modify, distribute, and sell this
|
Permission to use, copy, modify, distribute, and sell this
|
||||||
software and its documentation for any purpose is hereby granted
|
software and its documentation for any purpose is hereby granted
|
||||||
without fee, provided that the above copyright notice appear in
|
without fee, provided that the above copyright notice appear in
|
||||||
all copies and that both that the copyright notice and this
|
all copies and that both that the copyright notice and this
|
||||||
permission notice and warranty disclaimer appear in supporting
|
permission notice and warranty disclaimer appear in supporting
|
||||||
documentation, and that the name of the author not be used in
|
documentation, and that the name of the author not be used in
|
||||||
advertising or publicity pertaining to distribution of the
|
advertising or publicity pertaining to distribution of the
|
||||||
software without specific, written prior permission.
|
software without specific, written prior permission.
|
||||||
|
|
||||||
The author disclaim all warranties with regard to this
|
The author disclaim all warranties with regard to this
|
||||||
software, including all implied warranties of merchantability
|
software, including all implied warranties of merchantability
|
||||||
and fitness. In no event shall the author be liable for any
|
and fitness. In no event shall the author be liable for any
|
||||||
special, indirect or consequential damages or any damages
|
special, indirect or consequential damages or any damages
|
||||||
whatsoever resulting from loss of use, data or profits, whether
|
whatsoever resulting from loss of use, data or profits, whether
|
||||||
in an action of contract, negligence or other tortious action,
|
in an action of contract, negligence or other tortious action,
|
||||||
arising out of or in connection with the use or performance of
|
arising out of or in connection with the use or performance of
|
||||||
this software.
|
this software.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/** \file
|
/** \file
|
||||||
* \brief Host mode driver for the library USB Audio 1.0 Class driver.
|
* \brief Host mode driver for the library USB Audio 1.0 Class driver.
|
||||||
*
|
*
|
||||||
* Host mode driver for the library USB Audio 1.0 Class driver.
|
* Host mode driver for the library USB Audio 1.0 Class driver.
|
||||||
*
|
*
|
||||||
* \note This file should not be included directly. It is automatically included as needed by the USB module driver
|
* \note This file should not be included directly. It is automatically included as needed by the USB module driver
|
||||||
* dispatch header located in LUFA/Drivers/USB.h.
|
* dispatch header located in LUFA/Drivers/USB.h.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/** \ingroup Group_USBClassAudio
|
/** \ingroup Group_USBClassAudio
|
||||||
* \defgroup Group_USBClassAudioHost Audio 1.0 Class Host Mode Driver
|
* \defgroup Group_USBClassAudioHost Audio 1.0 Class Host Mode Driver
|
||||||
*
|
*
|
||||||
* \section Sec_Dependencies Module Source Dependencies
|
* \section Sec_Dependencies Module Source Dependencies
|
||||||
* The following files must be built with any user project that uses this module:
|
* The following files must be built with any user project that uses this module:
|
||||||
* - LUFA/Drivers/USB/Class/Host/Audio.c <i>(Makefile source module name: LUFA_SRC_USBCLASS)</i>
|
* - LUFA/Drivers/USB/Class/Host/Audio.c <i>(Makefile source module name: LUFA_SRC_USBCLASS)</i>
|
||||||
*
|
*
|
||||||
* \section Sec_ModDescription Module Description
|
* \section Sec_ModDescription Module Description
|
||||||
* Host Mode USB Class driver framework interface, for the Audio 1.0 USB Class driver.
|
* Host Mode USB Class driver framework interface, for the Audio 1.0 USB Class driver.
|
||||||
*
|
*
|
||||||
* @{
|
* @{
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef __AUDIO_CLASS_HOST_H__
|
#ifndef __AUDIO_CLASS_HOST_H__
|
||||||
#define __AUDIO_CLASS_HOST_H__
|
#define __AUDIO_CLASS_HOST_H__
|
||||||
|
|
||||||
/* Includes: */
|
/* Includes: */
|
||||||
#include "../../USB.h"
|
#include "../../USB.h"
|
||||||
#include "../Common/Audio.h"
|
#include "../Common/Audio.h"
|
||||||
|
|
||||||
/* Enable C linkage for C++ Compilers: */
|
/* Enable C linkage for C++ Compilers: */
|
||||||
#if defined(__cplusplus)
|
#if defined(__cplusplus)
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Preprocessor Checks: */
|
/* Preprocessor Checks: */
|
||||||
#if !defined(__INCLUDE_FROM_AUDIO_DRIVER)
|
#if !defined(__INCLUDE_FROM_AUDIO_DRIVER)
|
||||||
#error Do not include this file directly. Include LUFA/Drivers/USB.h instead.
|
#error Do not include this file directly. Include LUFA/Drivers/USB.h instead.
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Public Interface - May be used in end-application: */
|
/* Public Interface - May be used in end-application: */
|
||||||
/* Type Defines: */
|
/* Type Defines: */
|
||||||
/** \brief Audio Class Host Mode Configuration and State Structure.
|
/** \brief Audio Class Host Mode Configuration and State Structure.
|
||||||
*
|
*
|
||||||
* Class state structure. An instance of this structure should be made within the user application,
|
* Class state structure. An instance of this structure should be made within the user application,
|
||||||
* and passed to each of the Audio class driver functions as the \c AudioInterfaceInfo parameter. This
|
* and passed to each of the Audio class driver functions as the \c AudioInterfaceInfo parameter. This
|
||||||
* stores each Audio interface's configuration and state information.
|
* stores each Audio interface's configuration and state information.
|
||||||
*/
|
*/
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
const struct
|
const struct
|
||||||
{
|
{
|
||||||
uint8_t DataINPipeNumber; /**< Pipe number of the Audio interface's IN data pipe. If this interface should not
|
uint8_t DataINPipeNumber; /**< Pipe number of the Audio interface's IN data pipe. If this interface should not
|
||||||
* bind to an IN endpoint, this may be set to 0 to disable audio input streaming for
|
* bind to an IN endpoint, this may be set to 0 to disable audio input streaming for
|
||||||
* this driver instance.
|
* this driver instance.
|
||||||
*/
|
*/
|
||||||
uint8_t DataOUTPipeNumber; /**< Pipe number of the Audio interface's OUT data pipe. If this interface should not
|
uint8_t DataOUTPipeNumber; /**< Pipe number of the Audio interface's OUT data pipe. If this interface should not
|
||||||
* bind to an OUT endpoint, this may be set to 0 to disable audio output streaming for
|
* bind to an OUT endpoint, this may be set to 0 to disable audio output streaming for
|
||||||
* this driver instance.
|
* this driver instance.
|
||||||
*/
|
*/
|
||||||
} Config; /**< Config data for the USB class interface within the device. All elements in this section
|
} Config; /**< Config data for the USB class interface within the device. All elements in this section
|
||||||
* <b>must</b> be set or the interface will fail to enumerate and operate correctly.
|
* <b>must</b> be set or the interface will fail to enumerate and operate correctly.
|
||||||
*/
|
*/
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
bool IsActive; /**< Indicates if the current interface instance is connected to an attached device, valid
|
bool IsActive; /**< Indicates if the current interface instance is connected to an attached device, valid
|
||||||
* after \ref Audio_Host_ConfigurePipes() is called and the Host state machine is in the
|
* after \ref Audio_Host_ConfigurePipes() is called and the Host state machine is in the
|
||||||
* Configured state.
|
* Configured state.
|
||||||
*/
|
*/
|
||||||
uint8_t ControlInterfaceNumber; /**< Interface index of the Audio Control interface within the attached device. */
|
uint8_t ControlInterfaceNumber; /**< Interface index of the Audio Control interface within the attached device. */
|
||||||
uint8_t StreamingInterfaceNumber; /**< Interface index of the Audio Streaming interface within the attached device. */
|
uint8_t StreamingInterfaceNumber; /**< Interface index of the Audio Streaming interface within the attached device. */
|
||||||
|
|
||||||
uint8_t EnabledStreamingAltIndex; /**< Alternative setting index of the Audio Streaming interface when the stream is enabled. */
|
uint8_t EnabledStreamingAltIndex; /**< Alternative setting index of the Audio Streaming interface when the stream is enabled. */
|
||||||
|
|
||||||
uint16_t DataINPipeSize; /**< Size in bytes of the Audio interface's IN data pipe. */
|
uint16_t DataINPipeSize; /**< Size in bytes of the Audio interface's IN data pipe. */
|
||||||
uint16_t DataOUTPipeSize; /**< Size in bytes of the Audio interface's OUT data pipe. */
|
uint16_t DataOUTPipeSize; /**< Size in bytes of the Audio interface's OUT data pipe. */
|
||||||
} State; /**< State data for the USB class interface within the device. All elements in this section
|
} State; /**< State data for the USB class interface within the device. All elements in this section
|
||||||
* <b>may</b> be set to initial values, but may also be ignored to default to sane values when
|
* <b>may</b> be set to initial values, but may also be ignored to default to sane values when
|
||||||
* the interface is enumerated.
|
* the interface is enumerated.
|
||||||
*/
|
*/
|
||||||
} USB_ClassInfo_Audio_Host_t;
|
} USB_ClassInfo_Audio_Host_t;
|
||||||
|
|
||||||
/* Enums: */
|
/* Enums: */
|
||||||
/** Enum for the possible error codes returned by the \ref Audio_Host_ConfigurePipes() function. */
|
/** Enum for the possible error codes returned by the \ref Audio_Host_ConfigurePipes() function. */
|
||||||
enum AUDIO_Host_EnumerationFailure_ErrorCodes_t
|
enum AUDIO_Host_EnumerationFailure_ErrorCodes_t
|
||||||
{
|
{
|
||||||
AUDIO_ENUMERROR_NoError = 0, /**< Configuration Descriptor was processed successfully. */
|
AUDIO_ENUMERROR_NoError = 0, /**< Configuration Descriptor was processed successfully. */
|
||||||
AUDIO_ENUMERROR_InvalidConfigDescriptor = 1, /**< The device returned an invalid Configuration Descriptor. */
|
AUDIO_ENUMERROR_InvalidConfigDescriptor = 1, /**< The device returned an invalid Configuration Descriptor. */
|
||||||
AUDIO_ENUMERROR_NoCompatibleInterfaceFound = 2, /**< A compatible AUDIO interface was not found in the device's Configuration Descriptor. */
|
AUDIO_ENUMERROR_NoCompatibleInterfaceFound = 2, /**< A compatible AUDIO interface was not found in the device's Configuration Descriptor. */
|
||||||
AUDIO_ENUMERROR_PipeConfigurationFailed = 3, /**< One or more pipes for the specified interface could not be configured correctly. */
|
AUDIO_ENUMERROR_PipeConfigurationFailed = 3, /**< One or more pipes for the specified interface could not be configured correctly. */
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Function Prototypes: */
|
/* Function Prototypes: */
|
||||||
/** Host interface configuration routine, to configure a given Audio host interface instance using the Configuration
|
/** Host interface configuration routine, to configure a given Audio host interface instance using the Configuration
|
||||||
* Descriptor read from an attached USB device. This function automatically updates the given Audio Host instance's
|
* Descriptor read from an attached USB device. This function automatically updates the given Audio Host instance's
|
||||||
* state values and configures the pipes required to communicate with the interface if it is found within the
|
* state values and configures the pipes required to communicate with the interface if it is found within the
|
||||||
* device. This should be called once after the stack has enumerated the attached device, while the host state
|
* device. This should be called once after the stack has enumerated the attached device, while the host state
|
||||||
* machine is in the Addressed state.
|
* machine is in the Addressed state.
|
||||||
*
|
*
|
||||||
* \param[in,out] AudioInterfaceInfo Pointer to a structure containing an Audio Class host configuration and state.
|
* \param[in,out] AudioInterfaceInfo Pointer to a structure containing an Audio Class host configuration and state.
|
||||||
* \param[in] ConfigDescriptorSize Length of the attached device's Configuration Descriptor.
|
* \param[in] ConfigDescriptorSize Length of the attached device's Configuration Descriptor.
|
||||||
* \param[in] DeviceConfigDescriptor Pointer to a buffer containing the attached device's Configuration Descriptor.
|
* \param[in] DeviceConfigDescriptor Pointer to a buffer containing the attached device's Configuration Descriptor.
|
||||||
*
|
*
|
||||||
* \return A value from the \ref AUDIO_Host_EnumerationFailure_ErrorCodes_t enum.
|
* \return A value from the \ref AUDIO_Host_EnumerationFailure_ErrorCodes_t enum.
|
||||||
*/
|
*/
|
||||||
uint8_t Audio_Host_ConfigurePipes(USB_ClassInfo_Audio_Host_t* const AudioInterfaceInfo,
|
uint8_t Audio_Host_ConfigurePipes(USB_ClassInfo_Audio_Host_t* const AudioInterfaceInfo,
|
||||||
uint16_t ConfigDescriptorSize,
|
uint16_t ConfigDescriptorSize,
|
||||||
void* DeviceConfigDescriptor) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(3);
|
void* DeviceConfigDescriptor) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(3);
|
||||||
|
|
||||||
/** Starts or stops the audio streaming for the given configured Audio Host interface, allowing for audio samples to be
|
/** Starts or stops the audio streaming for the given configured Audio Host interface, allowing for audio samples to be
|
||||||
* send and/or received.
|
* send and/or received.
|
||||||
*
|
*
|
||||||
* \param[in,out] AudioInterfaceInfo Pointer to a structure containing an Audio Class host configuration and state.
|
* \param[in,out] AudioInterfaceInfo Pointer to a structure containing an Audio Class host configuration and state.
|
||||||
* \param[in] EnableStreaming Boolean true to enable streaming of the specified interface, false to disable
|
* \param[in] EnableStreaming Boolean true to enable streaming of the specified interface, false to disable
|
||||||
*
|
*
|
||||||
* \return A value from the \ref USB_Host_SendControlErrorCodes_t enum.
|
* \return A value from the \ref USB_Host_SendControlErrorCodes_t enum.
|
||||||
*/
|
*/
|
||||||
uint8_t Audio_Host_StartStopStreaming(USB_ClassInfo_Audio_Host_t* const AudioInterfaceInfo,
|
uint8_t Audio_Host_StartStopStreaming(USB_ClassInfo_Audio_Host_t* const AudioInterfaceInfo,
|
||||||
const bool EnableStreaming);
|
const bool EnableStreaming);
|
||||||
|
|
||||||
/** Gets or sets the specified property of a streaming audio class endpoint that is bound to a pipe in the given
|
/** Gets or sets the specified property of a streaming audio class endpoint that is bound to a pipe in the given
|
||||||
* class instance.
|
* class instance.
|
||||||
*
|
*
|
||||||
* \param[in,out] AudioInterfaceInfo Pointer to a structure containing an Audio Class host configuration and state.
|
* \param[in,out] AudioInterfaceInfo Pointer to a structure containing an Audio Class host configuration and state.
|
||||||
* \param[in] DataPipeIndex Index of the data pipe whose bound endpoint is to be altered.
|
* \param[in] DataPipeIndex Index of the data pipe whose bound endpoint is to be altered.
|
||||||
* \param[in] EndpointProperty Property of the endpoint to get or set, a value from \ref Audio_ClassRequests_t.
|
* \param[in] EndpointProperty Property of the endpoint to get or set, a value from \ref Audio_ClassRequests_t.
|
||||||
* \param[in] EndpointControl Parameter of the endpoint to get or set, a value from \ref Audio_EndpointControls_t.
|
* \param[in] EndpointControl Parameter of the endpoint to get or set, a value from \ref Audio_EndpointControls_t.
|
||||||
* \param[in,out] DataLength For SET operations, the length of the parameter data to set. For GET operations, the maximum
|
* \param[in,out] DataLength For SET operations, the length of the parameter data to set. For GET operations, the maximum
|
||||||
* length of the retrieved data.
|
* length of the retrieved data.
|
||||||
* \param[in,out] Data Pointer to a location where the parameter data is stored for SET operations, or where
|
* \param[in,out] Data Pointer to a location where the parameter data is stored for SET operations, or where
|
||||||
* the retrieved data is to be stored for GET operations.
|
* the retrieved data is to be stored for GET operations.
|
||||||
*
|
*
|
||||||
* \return A value from the \ref USB_Host_SendControlErrorCodes_t enum.
|
* \return A value from the \ref USB_Host_SendControlErrorCodes_t enum.
|
||||||
*/
|
*/
|
||||||
uint8_t Audio_Host_GetSetEndpointProperty(USB_ClassInfo_Audio_Host_t* const AudioInterfaceInfo,
|
uint8_t Audio_Host_GetSetEndpointProperty(USB_ClassInfo_Audio_Host_t* const AudioInterfaceInfo,
|
||||||
const uint8_t DataPipeIndex,
|
const uint8_t DataPipeIndex,
|
||||||
const uint8_t EndpointProperty,
|
const uint8_t EndpointProperty,
|
||||||
const uint8_t EndpointControl,
|
const uint8_t EndpointControl,
|
||||||
const uint16_t DataLength,
|
const uint16_t DataLength,
|
||||||
void* const Data);
|
void* const Data);
|
||||||
|
|
||||||
/* Inline Functions: */
|
/* Inline Functions: */
|
||||||
/** General management task for a given Audio host class interface, required for the correct operation of
|
/** General management task for a given Audio host class interface, required for the correct operation of
|
||||||
* the interface. This should be called frequently in the main program loop, before the master USB management task
|
* the interface. This should be called frequently in the main program loop, before the master USB management task
|
||||||
* \ref USB_USBTask().
|
* \ref USB_USBTask().
|
||||||
*
|
*
|
||||||
* \param[in,out] AudioInterfaceInfo Pointer to a structure containing an Audio Class host configuration and state.
|
* \param[in,out] AudioInterfaceInfo Pointer to a structure containing an Audio Class host configuration and state.
|
||||||
*/
|
*/
|
||||||
static inline void Audio_Host_USBTask(USB_ClassInfo_Audio_Host_t* const AudioInterfaceInfo);
|
static inline void Audio_Host_USBTask(USB_ClassInfo_Audio_Host_t* const AudioInterfaceInfo);
|
||||||
static inline void Audio_Host_USBTask(USB_ClassInfo_Audio_Host_t* const AudioInterfaceInfo)
|
static inline void Audio_Host_USBTask(USB_ClassInfo_Audio_Host_t* const AudioInterfaceInfo)
|
||||||
{
|
{
|
||||||
(void)AudioInterfaceInfo;
|
(void)AudioInterfaceInfo;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Determines if the given audio interface is ready for a sample to be read from it, and selects the streaming
|
/** Determines if the given audio interface is ready for a sample to be read from it, and selects the streaming
|
||||||
* IN pipe ready for reading.
|
* IN pipe ready for reading.
|
||||||
*
|
*
|
||||||
* \pre This function must only be called when the Host state machine is in the \ref HOST_STATE_Configured state or
|
* \pre This function must only be called when the Host state machine is in the \ref HOST_STATE_Configured state or
|
||||||
* the call will fail.
|
* the call will fail.
|
||||||
*
|
*
|
||||||
* \param[in,out] AudioInterfaceInfo Pointer to a structure containing an Audio Class configuration and state.
|
* \param[in,out] AudioInterfaceInfo Pointer to a structure containing an Audio Class configuration and state.
|
||||||
*
|
*
|
||||||
* \return Boolean \c true if the given Audio interface has a sample to be read, \c false otherwise.
|
* \return Boolean \c true if the given Audio interface has a sample to be read, \c false otherwise.
|
||||||
*/
|
*/
|
||||||
static inline bool Audio_Host_IsSampleReceived(USB_ClassInfo_Audio_Host_t* const AudioInterfaceInfo)
|
static inline bool Audio_Host_IsSampleReceived(USB_ClassInfo_Audio_Host_t* const AudioInterfaceInfo)
|
||||||
ATTR_NON_NULL_PTR_ARG(1) ATTR_ALWAYS_INLINE;
|
ATTR_NON_NULL_PTR_ARG(1) ATTR_ALWAYS_INLINE;
|
||||||
static inline bool Audio_Host_IsSampleReceived(USB_ClassInfo_Audio_Host_t* const AudioInterfaceInfo)
|
static inline bool Audio_Host_IsSampleReceived(USB_ClassInfo_Audio_Host_t* const AudioInterfaceInfo)
|
||||||
{
|
{
|
||||||
if ((USB_HostState != HOST_STATE_Configured) || !(AudioInterfaceInfo->State.IsActive))
|
if ((USB_HostState != HOST_STATE_Configured) || !(AudioInterfaceInfo->State.IsActive))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
bool SampleReceived = false;
|
bool SampleReceived = false;
|
||||||
|
|
||||||
Pipe_SelectPipe(AudioInterfaceInfo->Config.DataINPipeNumber);
|
Pipe_SelectPipe(AudioInterfaceInfo->Config.DataINPipeNumber);
|
||||||
Pipe_Unfreeze();
|
Pipe_Unfreeze();
|
||||||
SampleReceived = Pipe_IsINReceived();
|
SampleReceived = Pipe_IsINReceived();
|
||||||
Pipe_Freeze();
|
Pipe_Freeze();
|
||||||
|
|
||||||
return SampleReceived;
|
return SampleReceived;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Determines if the given audio interface is ready to accept the next sample to be written to it, and selects
|
/** Determines if the given audio interface is ready to accept the next sample to be written to it, and selects
|
||||||
* the streaming OUT pipe ready for writing.
|
* the streaming OUT pipe ready for writing.
|
||||||
*
|
*
|
||||||
* \pre This function must only be called when the Host state machine is in the \ref HOST_STATE_Configured state or
|
* \pre This function must only be called when the Host state machine is in the \ref HOST_STATE_Configured state or
|
||||||
* the call will fail.
|
* the call will fail.
|
||||||
*
|
*
|
||||||
* \param[in,out] AudioInterfaceInfo Pointer to a structure containing an Audio Class configuration and state.
|
* \param[in,out] AudioInterfaceInfo Pointer to a structure containing an Audio Class configuration and state.
|
||||||
*
|
*
|
||||||
* \return Boolean \c true if the given Audio interface is ready to accept the next sample, \c false otherwise.
|
* \return Boolean \c true if the given Audio interface is ready to accept the next sample, \c false otherwise.
|
||||||
*/
|
*/
|
||||||
static inline bool Audio_Host_IsReadyForNextSample(USB_ClassInfo_Audio_Host_t* const AudioInterfaceInfo)
|
static inline bool Audio_Host_IsReadyForNextSample(USB_ClassInfo_Audio_Host_t* const AudioInterfaceInfo)
|
||||||
ATTR_NON_NULL_PTR_ARG(1) ATTR_ALWAYS_INLINE;
|
ATTR_NON_NULL_PTR_ARG(1) ATTR_ALWAYS_INLINE;
|
||||||
static inline bool Audio_Host_IsReadyForNextSample(USB_ClassInfo_Audio_Host_t* const AudioInterfaceInfo)
|
static inline bool Audio_Host_IsReadyForNextSample(USB_ClassInfo_Audio_Host_t* const AudioInterfaceInfo)
|
||||||
{
|
{
|
||||||
if ((USB_HostState != HOST_STATE_Configured) || !(AudioInterfaceInfo->State.IsActive))
|
if ((USB_HostState != HOST_STATE_Configured) || !(AudioInterfaceInfo->State.IsActive))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
Pipe_SelectPipe(AudioInterfaceInfo->Config.DataOUTPipeNumber);
|
Pipe_SelectPipe(AudioInterfaceInfo->Config.DataOUTPipeNumber);
|
||||||
return Pipe_IsOUTReady();
|
return Pipe_IsOUTReady();
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Reads the next 8-bit audio sample from the current audio interface.
|
/** Reads the next 8-bit audio sample from the current audio interface.
|
||||||
*
|
*
|
||||||
* \pre This should be preceded immediately by a call to the \ref Audio_Host_IsSampleReceived() function to ensure
|
* \pre This should be preceded immediately by a call to the \ref Audio_Host_IsSampleReceived() function to ensure
|
||||||
* that the correct pipe is selected and ready for data.
|
* that the correct pipe is selected and ready for data.
|
||||||
*
|
*
|
||||||
* \param[in,out] AudioInterfaceInfo Pointer to a structure containing an Audio Class configuration and state.
|
* \param[in,out] AudioInterfaceInfo Pointer to a structure containing an Audio Class configuration and state.
|
||||||
*
|
*
|
||||||
* \return Signed 8-bit audio sample from the audio interface.
|
* \return Signed 8-bit audio sample from the audio interface.
|
||||||
*/
|
*/
|
||||||
static inline int8_t Audio_Host_ReadSample8(USB_ClassInfo_Audio_Host_t* const AudioInterfaceInfo)
|
static inline int8_t Audio_Host_ReadSample8(USB_ClassInfo_Audio_Host_t* const AudioInterfaceInfo)
|
||||||
ATTR_NON_NULL_PTR_ARG(1) ATTR_ALWAYS_INLINE;
|
ATTR_NON_NULL_PTR_ARG(1) ATTR_ALWAYS_INLINE;
|
||||||
static inline int8_t Audio_Host_ReadSample8(USB_ClassInfo_Audio_Host_t* const AudioInterfaceInfo)
|
static inline int8_t Audio_Host_ReadSample8(USB_ClassInfo_Audio_Host_t* const AudioInterfaceInfo)
|
||||||
{
|
{
|
||||||
int8_t Sample;
|
int8_t Sample;
|
||||||
|
|
||||||
(void)AudioInterfaceInfo;
|
(void)AudioInterfaceInfo;
|
||||||
|
|
||||||
Sample = Pipe_Read_8();
|
Sample = Pipe_Read_8();
|
||||||
|
|
||||||
if (!(Pipe_BytesInPipe()))
|
if (!(Pipe_BytesInPipe()))
|
||||||
{
|
{
|
||||||
Pipe_Unfreeze();
|
Pipe_Unfreeze();
|
||||||
Pipe_ClearIN();
|
Pipe_ClearIN();
|
||||||
Pipe_Freeze();
|
Pipe_Freeze();
|
||||||
}
|
}
|
||||||
|
|
||||||
return Sample;
|
return Sample;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Reads the next 16-bit audio sample from the current audio interface.
|
/** Reads the next 16-bit audio sample from the current audio interface.
|
||||||
*
|
*
|
||||||
* \pre This should be preceded immediately by a call to the \ref Audio_Host_IsSampleReceived() function to ensure
|
* \pre This should be preceded immediately by a call to the \ref Audio_Host_IsSampleReceived() function to ensure
|
||||||
* that the correct pipe is selected and ready for data.
|
* that the correct pipe is selected and ready for data.
|
||||||
*
|
*
|
||||||
* \param[in,out] AudioInterfaceInfo Pointer to a structure containing an Audio Class configuration and state.
|
* \param[in,out] AudioInterfaceInfo Pointer to a structure containing an Audio Class configuration and state.
|
||||||
*
|
*
|
||||||
* \return Signed 16-bit audio sample from the audio interface.
|
* \return Signed 16-bit audio sample from the audio interface.
|
||||||
*/
|
*/
|
||||||
static inline int16_t Audio_Host_ReadSample16(USB_ClassInfo_Audio_Host_t* const AudioInterfaceInfo)
|
static inline int16_t Audio_Host_ReadSample16(USB_ClassInfo_Audio_Host_t* const AudioInterfaceInfo)
|
||||||
ATTR_NON_NULL_PTR_ARG(1) ATTR_ALWAYS_INLINE;
|
ATTR_NON_NULL_PTR_ARG(1) ATTR_ALWAYS_INLINE;
|
||||||
static inline int16_t Audio_Host_ReadSample16(USB_ClassInfo_Audio_Host_t* const AudioInterfaceInfo)
|
static inline int16_t Audio_Host_ReadSample16(USB_ClassInfo_Audio_Host_t* const AudioInterfaceInfo)
|
||||||
{
|
{
|
||||||
int16_t Sample;
|
int16_t Sample;
|
||||||
|
|
||||||
(void)AudioInterfaceInfo;
|
(void)AudioInterfaceInfo;
|
||||||
|
|
||||||
Sample = (int16_t)Pipe_Read_16_LE();
|
Sample = (int16_t)Pipe_Read_16_LE();
|
||||||
|
|
||||||
if (!(Pipe_BytesInPipe()))
|
if (!(Pipe_BytesInPipe()))
|
||||||
{
|
{
|
||||||
Pipe_Unfreeze();
|
Pipe_Unfreeze();
|
||||||
Pipe_ClearIN();
|
Pipe_ClearIN();
|
||||||
Pipe_Freeze();
|
Pipe_Freeze();
|
||||||
}
|
}
|
||||||
|
|
||||||
return Sample;
|
return Sample;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Reads the next 24-bit audio sample from the current audio interface.
|
/** Reads the next 24-bit audio sample from the current audio interface.
|
||||||
*
|
*
|
||||||
* \pre This should be preceded immediately by a call to the \ref Audio_Host_IsSampleReceived() function to ensure
|
* \pre This should be preceded immediately by a call to the \ref Audio_Host_IsSampleReceived() function to ensure
|
||||||
* that the correct pipe is selected and ready for data.
|
* that the correct pipe is selected and ready for data.
|
||||||
*
|
*
|
||||||
* \param[in,out] AudioInterfaceInfo Pointer to a structure containing an Audio Class configuration and state.
|
* \param[in,out] AudioInterfaceInfo Pointer to a structure containing an Audio Class configuration and state.
|
||||||
*
|
*
|
||||||
* \return Signed 24-bit audio sample from the audio interface.
|
* \return Signed 24-bit audio sample from the audio interface.
|
||||||
*/
|
*/
|
||||||
static inline int32_t Audio_Host_ReadSample24(USB_ClassInfo_Audio_Host_t* const AudioInterfaceInfo)
|
static inline int32_t Audio_Host_ReadSample24(USB_ClassInfo_Audio_Host_t* const AudioInterfaceInfo)
|
||||||
ATTR_NON_NULL_PTR_ARG(1) ATTR_ALWAYS_INLINE;
|
ATTR_NON_NULL_PTR_ARG(1) ATTR_ALWAYS_INLINE;
|
||||||
static inline int32_t Audio_Host_ReadSample24(USB_ClassInfo_Audio_Host_t* const AudioInterfaceInfo)
|
static inline int32_t Audio_Host_ReadSample24(USB_ClassInfo_Audio_Host_t* const AudioInterfaceInfo)
|
||||||
{
|
{
|
||||||
int32_t Sample;
|
int32_t Sample;
|
||||||
|
|
||||||
(void)AudioInterfaceInfo;
|
(void)AudioInterfaceInfo;
|
||||||
|
|
||||||
Sample = (((uint32_t)Pipe_Read_8() << 16) | Pipe_Read_16_LE());
|
Sample = (((uint32_t)Pipe_Read_8() << 16) | Pipe_Read_16_LE());
|
||||||
|
|
||||||
if (!(Pipe_BytesInPipe()))
|
if (!(Pipe_BytesInPipe()))
|
||||||
{
|
{
|
||||||
Pipe_Unfreeze();
|
Pipe_Unfreeze();
|
||||||
Pipe_ClearIN();
|
Pipe_ClearIN();
|
||||||
Pipe_Freeze();
|
Pipe_Freeze();
|
||||||
}
|
}
|
||||||
|
|
||||||
return Sample;
|
return Sample;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Writes the next 8-bit audio sample to the current audio interface.
|
/** Writes the next 8-bit audio sample to the current audio interface.
|
||||||
*
|
*
|
||||||
* \pre This should be preceded immediately by a call to the \ref Audio_Host_IsReadyForNextSample() function to
|
* \pre This should be preceded immediately by a call to the \ref Audio_Host_IsReadyForNextSample() function to
|
||||||
* ensure that the correct pipe is selected and ready for data.
|
* ensure that the correct pipe is selected and ready for data.
|
||||||
*
|
*
|
||||||
* \param[in,out] AudioInterfaceInfo Pointer to a structure containing an Audio Class configuration and state.
|
* \param[in,out] AudioInterfaceInfo Pointer to a structure containing an Audio Class configuration and state.
|
||||||
* \param[in] Sample Signed 8-bit audio sample.
|
* \param[in] Sample Signed 8-bit audio sample.
|
||||||
*/
|
*/
|
||||||
static inline void Audio_Host_WriteSample8(USB_ClassInfo_Audio_Host_t* const AudioInterfaceInfo,
|
static inline void Audio_Host_WriteSample8(USB_ClassInfo_Audio_Host_t* const AudioInterfaceInfo,
|
||||||
const int8_t Sample) ATTR_NON_NULL_PTR_ARG(1) ATTR_ALWAYS_INLINE;
|
const int8_t Sample) ATTR_NON_NULL_PTR_ARG(1) ATTR_ALWAYS_INLINE;
|
||||||
static inline void Audio_Host_WriteSample8(USB_ClassInfo_Audio_Host_t* const AudioInterfaceInfo,
|
static inline void Audio_Host_WriteSample8(USB_ClassInfo_Audio_Host_t* const AudioInterfaceInfo,
|
||||||
const int8_t Sample)
|
const int8_t Sample)
|
||||||
{
|
{
|
||||||
Pipe_Write_8(Sample);
|
Pipe_Write_8(Sample);
|
||||||
|
|
||||||
if (!(Pipe_IsReadWriteAllowed()))
|
if (!(Pipe_IsReadWriteAllowed()))
|
||||||
{
|
{
|
||||||
Pipe_Unfreeze();
|
Pipe_Unfreeze();
|
||||||
Pipe_ClearOUT();
|
Pipe_ClearOUT();
|
||||||
Pipe_WaitUntilReady();
|
Pipe_WaitUntilReady();
|
||||||
Pipe_Freeze();
|
Pipe_Freeze();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Writes the next 16-bit audio sample to the current audio interface.
|
/** Writes the next 16-bit audio sample to the current audio interface.
|
||||||
*
|
*
|
||||||
* \pre This should be preceded immediately by a call to the \ref Audio_Host_IsReadyForNextSample() function to
|
* \pre This should be preceded immediately by a call to the \ref Audio_Host_IsReadyForNextSample() function to
|
||||||
* ensure that the correct pipe is selected and ready for data.
|
* ensure that the correct pipe is selected and ready for data.
|
||||||
*
|
*
|
||||||
* \param[in,out] AudioInterfaceInfo Pointer to a structure containing an Audio Class configuration and state.
|
* \param[in,out] AudioInterfaceInfo Pointer to a structure containing an Audio Class configuration and state.
|
||||||
* \param[in] Sample Signed 16-bit audio sample.
|
* \param[in] Sample Signed 16-bit audio sample.
|
||||||
*/
|
*/
|
||||||
static inline void Audio_Host_WriteSample16(USB_ClassInfo_Audio_Host_t* const AudioInterfaceInfo,
|
static inline void Audio_Host_WriteSample16(USB_ClassInfo_Audio_Host_t* const AudioInterfaceInfo,
|
||||||
const int16_t Sample) ATTR_NON_NULL_PTR_ARG(1) ATTR_ALWAYS_INLINE;
|
const int16_t Sample) ATTR_NON_NULL_PTR_ARG(1) ATTR_ALWAYS_INLINE;
|
||||||
static inline void Audio_Host_WriteSample16(USB_ClassInfo_Audio_Host_t* const AudioInterfaceInfo,
|
static inline void Audio_Host_WriteSample16(USB_ClassInfo_Audio_Host_t* const AudioInterfaceInfo,
|
||||||
const int16_t Sample)
|
const int16_t Sample)
|
||||||
{
|
{
|
||||||
Pipe_Write_16_LE(Sample);
|
Pipe_Write_16_LE(Sample);
|
||||||
|
|
||||||
if (!(Pipe_IsReadWriteAllowed()))
|
if (!(Pipe_IsReadWriteAllowed()))
|
||||||
{
|
{
|
||||||
Pipe_Unfreeze();
|
Pipe_Unfreeze();
|
||||||
Pipe_ClearOUT();
|
Pipe_ClearOUT();
|
||||||
Pipe_WaitUntilReady();
|
Pipe_WaitUntilReady();
|
||||||
Pipe_Freeze();
|
Pipe_Freeze();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Writes the next 24-bit audio sample to the current audio interface.
|
/** Writes the next 24-bit audio sample to the current audio interface.
|
||||||
*
|
*
|
||||||
* \pre This should be preceded immediately by a call to the \ref Audio_Host_IsReadyForNextSample() function to
|
* \pre This should be preceded immediately by a call to the \ref Audio_Host_IsReadyForNextSample() function to
|
||||||
* ensure that the correct pipe is selected and ready for data.
|
* ensure that the correct pipe is selected and ready for data.
|
||||||
*
|
*
|
||||||
* \param[in,out] AudioInterfaceInfo Pointer to a structure containing an Audio Class configuration and state.
|
* \param[in,out] AudioInterfaceInfo Pointer to a structure containing an Audio Class configuration and state.
|
||||||
* \param[in] Sample Signed 24-bit audio sample.
|
* \param[in] Sample Signed 24-bit audio sample.
|
||||||
*/
|
*/
|
||||||
static inline void Audio_Host_WriteSample24(USB_ClassInfo_Audio_Host_t* const AudioInterfaceInfo,
|
static inline void Audio_Host_WriteSample24(USB_ClassInfo_Audio_Host_t* const AudioInterfaceInfo,
|
||||||
const int32_t Sample) ATTR_NON_NULL_PTR_ARG(1) ATTR_ALWAYS_INLINE;
|
const int32_t Sample) ATTR_NON_NULL_PTR_ARG(1) ATTR_ALWAYS_INLINE;
|
||||||
static inline void Audio_Host_WriteSample24(USB_ClassInfo_Audio_Host_t* const AudioInterfaceInfo,
|
static inline void Audio_Host_WriteSample24(USB_ClassInfo_Audio_Host_t* const AudioInterfaceInfo,
|
||||||
const int32_t Sample)
|
const int32_t Sample)
|
||||||
{
|
{
|
||||||
Pipe_Write_16_LE(Sample);
|
Pipe_Write_16_LE(Sample);
|
||||||
Pipe_Write_8(Sample >> 16);
|
Pipe_Write_8(Sample >> 16);
|
||||||
|
|
||||||
if (!(Pipe_IsReadWriteAllowed()))
|
if (!(Pipe_IsReadWriteAllowed()))
|
||||||
{
|
{
|
||||||
Pipe_Unfreeze();
|
Pipe_Unfreeze();
|
||||||
Pipe_ClearOUT();
|
Pipe_ClearOUT();
|
||||||
Pipe_WaitUntilReady();
|
Pipe_WaitUntilReady();
|
||||||
Pipe_Freeze();
|
Pipe_Freeze();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Private Interface - For use in library only: */
|
/* Private Interface - For use in library only: */
|
||||||
#if !defined(__DOXYGEN__)
|
#if !defined(__DOXYGEN__)
|
||||||
/* Function Prototypes: */
|
/* Function Prototypes: */
|
||||||
#if defined(__INCLUDE_FROM_AUDIO_HOST_C)
|
#if defined(__INCLUDE_FROM_AUDIO_HOST_C)
|
||||||
static uint8_t DCOMP_Audio_Host_NextAudioControlInterface(void* CurrentDescriptor);
|
static uint8_t DCOMP_Audio_Host_NextAudioControlInterface(void* CurrentDescriptor);
|
||||||
static uint8_t DCOMP_Audio_Host_NextAudioStreamInterface(void* CurrentDescriptor);
|
static uint8_t DCOMP_Audio_Host_NextAudioStreamInterface(void* CurrentDescriptor);
|
||||||
static uint8_t DCOMP_Audio_Host_NextAudioInterfaceDataEndpoint(void* CurrentDescriptor);
|
static uint8_t DCOMP_Audio_Host_NextAudioInterfaceDataEndpoint(void* CurrentDescriptor);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Disable C linkage for C++ Compilers: */
|
/* Disable C linkage for C++ Compilers: */
|
||||||
#if defined(__cplusplus)
|
#if defined(__cplusplus)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/** @} */
|
/** @} */
|
||||||
|
|
||||||
|
@ -1,249 +1,249 @@
|
|||||||
/*
|
/*
|
||||||
LUFA Library
|
LUFA Library
|
||||||
Copyright (C) Dean Camera, 2011.
|
Copyright (C) Dean Camera, 2011.
|
||||||
|
|
||||||
dean [at] fourwalledcubicle [dot] com
|
dean [at] fourwalledcubicle [dot] com
|
||||||
www.lufa-lib.org
|
www.lufa-lib.org
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com)
|
Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com)
|
||||||
|
|
||||||
Permission to use, copy, modify, distribute, and sell this
|
Permission to use, copy, modify, distribute, and sell this
|
||||||
software and its documentation for any purpose is hereby granted
|
software and its documentation for any purpose is hereby granted
|
||||||
without fee, provided that the above copyright notice appear in
|
without fee, provided that the above copyright notice appear in
|
||||||
all copies and that both that the copyright notice and this
|
all copies and that both that the copyright notice and this
|
||||||
permission notice and warranty disclaimer appear in supporting
|
permission notice and warranty disclaimer appear in supporting
|
||||||
documentation, and that the name of the author not be used in
|
documentation, and that the name of the author not be used in
|
||||||
advertising or publicity pertaining to distribution of the
|
advertising or publicity pertaining to distribution of the
|
||||||
software without specific, written prior permission.
|
software without specific, written prior permission.
|
||||||
|
|
||||||
The author disclaim all warranties with regard to this
|
The author disclaim all warranties with regard to this
|
||||||
software, including all implied warranties of merchantability
|
software, including all implied warranties of merchantability
|
||||||
and fitness. In no event shall the author be liable for any
|
and fitness. In no event shall the author be liable for any
|
||||||
special, indirect or consequential damages or any damages
|
special, indirect or consequential damages or any damages
|
||||||
whatsoever resulting from loss of use, data or profits, whether
|
whatsoever resulting from loss of use, data or profits, whether
|
||||||
in an action of contract, negligence or other tortious action,
|
in an action of contract, negligence or other tortious action,
|
||||||
arising out of or in connection with the use or performance of
|
arising out of or in connection with the use or performance of
|
||||||
this software.
|
this software.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/** \file
|
/** \file
|
||||||
*
|
*
|
||||||
* USB Device Descriptors, for library use when in USB device mode. Descriptors are special
|
* USB Device Descriptors, for library use when in USB device mode. Descriptors are special
|
||||||
* computer-readable structures which the host requests upon device enumeration, to determine
|
* computer-readable structures which the host requests upon device enumeration, to determine
|
||||||
* the device's capabilities and functions.
|
* the device's capabilities and functions.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "Descriptors.h"
|
#include "Descriptors.h"
|
||||||
|
|
||||||
/** HID class report descriptor. This is a special descriptor constructed with values from the
|
/** HID class report descriptor. This is a special descriptor constructed with values from the
|
||||||
* USBIF HID class specification to describe the reports and capabilities of the HID device. This
|
* USBIF HID class specification to describe the reports and capabilities of the HID device. This
|
||||||
* descriptor is parsed by the host and its contents used to determine what data (and in what encoding)
|
* descriptor is parsed by the host and its contents used to determine what data (and in what encoding)
|
||||||
* the device will send, and what it may be sent back from the host. Refer to the HID specification for
|
* the device will send, and what it may be sent back from the host. Refer to the HID specification for
|
||||||
* more details on HID report descriptors.
|
* more details on HID report descriptors.
|
||||||
*/
|
*/
|
||||||
const USB_Descriptor_HIDReport_Datatype_t PROGMEM MediaControlReport[] =
|
const USB_Descriptor_HIDReport_Datatype_t PROGMEM MediaControlReport[] =
|
||||||
{
|
{
|
||||||
HID_RI_USAGE_PAGE(8, 0x0C), /* Consumer Page */
|
HID_RI_USAGE_PAGE(8, 0x0C), /* Consumer Page */
|
||||||
HID_RI_USAGE(8, 0x01), /* Consumer Controls */
|
HID_RI_USAGE(8, 0x01), /* Consumer Controls */
|
||||||
HID_RI_COLLECTION(8, 0x01), /* Application */
|
HID_RI_COLLECTION(8, 0x01), /* Application */
|
||||||
HID_RI_USAGE(8, 0xB0), /* Play */
|
HID_RI_USAGE(8, 0xB0), /* Play */
|
||||||
HID_RI_USAGE(8, 0xB1), /* Pause */
|
HID_RI_USAGE(8, 0xB1), /* Pause */
|
||||||
HID_RI_USAGE(8, 0xB3), /* Fast Forward */
|
HID_RI_USAGE(8, 0xB3), /* Fast Forward */
|
||||||
HID_RI_USAGE(8, 0xB4), /* Rewind */
|
HID_RI_USAGE(8, 0xB4), /* Rewind */
|
||||||
HID_RI_USAGE(8, 0xB5), /* Next Track */
|
HID_RI_USAGE(8, 0xB5), /* Next Track */
|
||||||
HID_RI_USAGE(8, 0xB6), /* Previous Track */
|
HID_RI_USAGE(8, 0xB6), /* Previous Track */
|
||||||
HID_RI_USAGE(8, 0xB7), /* Stop */
|
HID_RI_USAGE(8, 0xB7), /* Stop */
|
||||||
HID_RI_USAGE(8, 0xCD), /* Play/Pause (toggle) */
|
HID_RI_USAGE(8, 0xCD), /* Play/Pause (toggle) */
|
||||||
HID_RI_USAGE(8, 0xE2), /* Mute */
|
HID_RI_USAGE(8, 0xE2), /* Mute */
|
||||||
HID_RI_USAGE(8, 0xE9), /* Volume Up */
|
HID_RI_USAGE(8, 0xE9), /* Volume Up */
|
||||||
HID_RI_USAGE(8, 0xEA), /* Volume Down */
|
HID_RI_USAGE(8, 0xEA), /* Volume Down */
|
||||||
HID_RI_REPORT_SIZE(8, 0x01),
|
HID_RI_REPORT_SIZE(8, 0x01),
|
||||||
HID_RI_REPORT_COUNT(8, 0x0B),
|
HID_RI_REPORT_COUNT(8, 0x0B),
|
||||||
HID_RI_LOGICAL_MINIMUM(8, 0),
|
HID_RI_LOGICAL_MINIMUM(8, 0),
|
||||||
HID_RI_LOGICAL_MAXIMUM(8, 1),
|
HID_RI_LOGICAL_MAXIMUM(8, 1),
|
||||||
HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_RELATIVE),
|
HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_RELATIVE),
|
||||||
HID_RI_REPORT_COUNT(8, 0x05),
|
HID_RI_REPORT_COUNT(8, 0x05),
|
||||||
HID_RI_INPUT(8, HID_IOF_CONSTANT),
|
HID_RI_INPUT(8, HID_IOF_CONSTANT),
|
||||||
HID_RI_END_COLLECTION(0),
|
HID_RI_END_COLLECTION(0),
|
||||||
};
|
};
|
||||||
|
|
||||||
/** Device descriptor structure. This descriptor, located in FLASH memory, describes the overall
|
/** Device descriptor structure. This descriptor, located in FLASH memory, describes the overall
|
||||||
* device characteristics, including the supported USB version, control endpoint size and the
|
* device characteristics, including the supported USB version, control endpoint size and the
|
||||||
* number of device configurations. The descriptor is read out by the USB host when the enumeration
|
* number of device configurations. The descriptor is read out by the USB host when the enumeration
|
||||||
* process begins.
|
* process begins.
|
||||||
*/
|
*/
|
||||||
const USB_Descriptor_Device_t PROGMEM DeviceDescriptor =
|
const USB_Descriptor_Device_t PROGMEM DeviceDescriptor =
|
||||||
{
|
{
|
||||||
.Header = {.Size = sizeof(USB_Descriptor_Device_t), .Type = DTYPE_Device},
|
.Header = {.Size = sizeof(USB_Descriptor_Device_t), .Type = DTYPE_Device},
|
||||||
|
|
||||||
.USBSpecification = VERSION_BCD(01.10),
|
.USBSpecification = VERSION_BCD(01.10),
|
||||||
.Class = USB_CSCP_NoDeviceClass,
|
.Class = USB_CSCP_NoDeviceClass,
|
||||||
.SubClass = USB_CSCP_NoDeviceSubclass,
|
.SubClass = USB_CSCP_NoDeviceSubclass,
|
||||||
.Protocol = USB_CSCP_NoDeviceProtocol,
|
.Protocol = USB_CSCP_NoDeviceProtocol,
|
||||||
|
|
||||||
.Endpoint0Size = FIXED_CONTROL_ENDPOINT_SIZE,
|
.Endpoint0Size = FIXED_CONTROL_ENDPOINT_SIZE,
|
||||||
|
|
||||||
.VendorID = 0x03EB,
|
.VendorID = 0x03EB,
|
||||||
.ProductID = 0x206A,
|
.ProductID = 0x206A,
|
||||||
.ReleaseNumber = VERSION_BCD(00.01),
|
.ReleaseNumber = VERSION_BCD(00.01),
|
||||||
|
|
||||||
.ManufacturerStrIndex = 0x01,
|
.ManufacturerStrIndex = 0x01,
|
||||||
.ProductStrIndex = 0x02,
|
.ProductStrIndex = 0x02,
|
||||||
.SerialNumStrIndex = NO_DESCRIPTOR,
|
.SerialNumStrIndex = NO_DESCRIPTOR,
|
||||||
|
|
||||||
.NumberOfConfigurations = FIXED_NUM_CONFIGURATIONS
|
.NumberOfConfigurations = FIXED_NUM_CONFIGURATIONS
|
||||||
};
|
};
|
||||||
|
|
||||||
/** Configuration descriptor structure. This descriptor, located in FLASH memory, describes the usage
|
/** Configuration descriptor structure. This descriptor, located in FLASH memory, describes the usage
|
||||||
* of the device in one of its supported configurations, including information about any device interfaces
|
* of the device in one of its supported configurations, including information about any device interfaces
|
||||||
* and endpoints. The descriptor is read out by the USB host during the enumeration process when selecting
|
* and endpoints. The descriptor is read out by the USB host during the enumeration process when selecting
|
||||||
* a configuration so that the host may correctly communicate with the USB device.
|
* a configuration so that the host may correctly communicate with the USB device.
|
||||||
*/
|
*/
|
||||||
const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
|
const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
|
||||||
{
|
{
|
||||||
.Config =
|
.Config =
|
||||||
{
|
{
|
||||||
.Header = {.Size = sizeof(USB_Descriptor_Configuration_Header_t), .Type = DTYPE_Configuration},
|
.Header = {.Size = sizeof(USB_Descriptor_Configuration_Header_t), .Type = DTYPE_Configuration},
|
||||||
|
|
||||||
.TotalConfigurationSize = sizeof(USB_Descriptor_Configuration_t),
|
.TotalConfigurationSize = sizeof(USB_Descriptor_Configuration_t),
|
||||||
.TotalInterfaces = 1,
|
.TotalInterfaces = 1,
|
||||||
|
|
||||||
.ConfigurationNumber = 1,
|
.ConfigurationNumber = 1,
|
||||||
.ConfigurationStrIndex = NO_DESCRIPTOR,
|
.ConfigurationStrIndex = NO_DESCRIPTOR,
|
||||||
|
|
||||||
.ConfigAttributes = (USB_CONFIG_ATTR_BUSPOWERED | USB_CONFIG_ATTR_SELFPOWERED),
|
.ConfigAttributes = (USB_CONFIG_ATTR_BUSPOWERED | USB_CONFIG_ATTR_SELFPOWERED),
|
||||||
|
|
||||||
.MaxPowerConsumption = USB_CONFIG_POWER_MA(100)
|
.MaxPowerConsumption = USB_CONFIG_POWER_MA(100)
|
||||||
},
|
},
|
||||||
|
|
||||||
.HID_Interface =
|
.HID_Interface =
|
||||||
{
|
{
|
||||||
.Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface},
|
.Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface},
|
||||||
|
|
||||||
.InterfaceNumber = 0x00,
|
.InterfaceNumber = 0x00,
|
||||||
.AlternateSetting = 0x00,
|
.AlternateSetting = 0x00,
|
||||||
|
|
||||||
.TotalEndpoints = 1,
|
.TotalEndpoints = 1,
|
||||||
|
|
||||||
.Class = HID_CSCP_HIDClass,
|
.Class = HID_CSCP_HIDClass,
|
||||||
.SubClass = HID_CSCP_NonBootSubclass,
|
.SubClass = HID_CSCP_NonBootSubclass,
|
||||||
.Protocol = HID_CSCP_NonBootProtocol,
|
.Protocol = HID_CSCP_NonBootProtocol,
|
||||||
|
|
||||||
.InterfaceStrIndex = NO_DESCRIPTOR
|
.InterfaceStrIndex = NO_DESCRIPTOR
|
||||||
},
|
},
|
||||||
|
|
||||||
.HID_MediaControlHID =
|
.HID_MediaControlHID =
|
||||||
{
|
{
|
||||||
.Header = {.Size = sizeof(USB_HID_Descriptor_HID_t), .Type = HID_DTYPE_HID},
|
.Header = {.Size = sizeof(USB_HID_Descriptor_HID_t), .Type = HID_DTYPE_HID},
|
||||||
|
|
||||||
.HIDSpec = VERSION_BCD(01.11),
|
.HIDSpec = VERSION_BCD(01.11),
|
||||||
.CountryCode = 0x00,
|
.CountryCode = 0x00,
|
||||||
.TotalReportDescriptors = 1,
|
.TotalReportDescriptors = 1,
|
||||||
.HIDReportType = HID_DTYPE_Report,
|
.HIDReportType = HID_DTYPE_Report,
|
||||||
.HIDReportLength = sizeof(MediaControlReport)
|
.HIDReportLength = sizeof(MediaControlReport)
|
||||||
},
|
},
|
||||||
|
|
||||||
.HID_ReportINEndpoint =
|
.HID_ReportINEndpoint =
|
||||||
{
|
{
|
||||||
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
|
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
|
||||||
|
|
||||||
.EndpointAddress = (ENDPOINT_DESCRIPTOR_DIR_IN | MEDIACONTROL_HID_EPNUM),
|
.EndpointAddress = (ENDPOINT_DESCRIPTOR_DIR_IN | MEDIACONTROL_HID_EPNUM),
|
||||||
.Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
|
.Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
|
||||||
.EndpointSize = MEDIACONTROL_HID_EPSIZE,
|
.EndpointSize = MEDIACONTROL_HID_EPSIZE,
|
||||||
.PollingIntervalMS = 0x01
|
.PollingIntervalMS = 0x01
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
/** Language descriptor structure. This descriptor, located in FLASH memory, is returned when the host requests
|
/** Language descriptor structure. This descriptor, located in FLASH memory, is returned when the host requests
|
||||||
* the string descriptor with index 0 (the first index). It is actually an array of 16-bit integers, which indicate
|
* the string descriptor with index 0 (the first index). It is actually an array of 16-bit integers, which indicate
|
||||||
* via the language ID table available at USB.org what languages the device supports for its string descriptors.
|
* via the language ID table available at USB.org what languages the device supports for its string descriptors.
|
||||||
*/
|
*/
|
||||||
const USB_Descriptor_String_t PROGMEM LanguageString =
|
const USB_Descriptor_String_t PROGMEM LanguageString =
|
||||||
{
|
{
|
||||||
.Header = {.Size = USB_STRING_LEN(1), .Type = DTYPE_String},
|
.Header = {.Size = USB_STRING_LEN(1), .Type = DTYPE_String},
|
||||||
|
|
||||||
.UnicodeString = {LANGUAGE_ID_ENG}
|
.UnicodeString = {LANGUAGE_ID_ENG}
|
||||||
};
|
};
|
||||||
|
|
||||||
/** Manufacturer descriptor string. This is a Unicode string containing the manufacturer's details in human readable
|
/** Manufacturer descriptor string. This is a Unicode string containing the manufacturer's details in human readable
|
||||||
* form, and is read out upon request by the host when the appropriate string ID is requested, listed in the Device
|
* form, and is read out upon request by the host when the appropriate string ID is requested, listed in the Device
|
||||||
* Descriptor.
|
* Descriptor.
|
||||||
*/
|
*/
|
||||||
const USB_Descriptor_String_t PROGMEM ManufacturerString =
|
const USB_Descriptor_String_t PROGMEM ManufacturerString =
|
||||||
{
|
{
|
||||||
.Header = {.Size = USB_STRING_LEN(11), .Type = DTYPE_String},
|
.Header = {.Size = USB_STRING_LEN(11), .Type = DTYPE_String},
|
||||||
|
|
||||||
.UnicodeString = L"Dean Camera"
|
.UnicodeString = L"Dean Camera"
|
||||||
};
|
};
|
||||||
|
|
||||||
/** Product descriptor string. This is a Unicode string containing the product's details in human readable form,
|
/** Product descriptor string. This is a Unicode string containing the product's details in human readable form,
|
||||||
* and is read out upon request by the host when the appropriate string ID is requested, listed in the Device
|
* and is read out upon request by the host when the appropriate string ID is requested, listed in the Device
|
||||||
* Descriptor.
|
* Descriptor.
|
||||||
*/
|
*/
|
||||||
const USB_Descriptor_String_t PROGMEM ProductString =
|
const USB_Descriptor_String_t PROGMEM ProductString =
|
||||||
{
|
{
|
||||||
.Header = {.Size = USB_STRING_LEN(21), .Type = DTYPE_String},
|
.Header = {.Size = USB_STRING_LEN(21), .Type = DTYPE_String},
|
||||||
|
|
||||||
.UnicodeString = L"LUFA Media Controller"
|
.UnicodeString = L"LUFA Media Controller"
|
||||||
};
|
};
|
||||||
|
|
||||||
/** This function is called by the library when in device mode, and must be overridden (see library "USB Descriptors"
|
/** This function is called by the library when in device mode, and must be overridden (see library "USB Descriptors"
|
||||||
* documentation) by the application code so that the address and size of a requested descriptor can be given
|
* documentation) by the application code so that the address and size of a requested descriptor can be given
|
||||||
* to the USB library. When the device receives a Get Descriptor request on the control endpoint, this function
|
* to the USB library. When the device receives a Get Descriptor request on the control endpoint, this function
|
||||||
* is called so that the descriptor details can be passed back and the appropriate descriptor sent back to the
|
* is called so that the descriptor details can be passed back and the appropriate descriptor sent back to the
|
||||||
* USB host.
|
* USB host.
|
||||||
*/
|
*/
|
||||||
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,
|
||||||
const void** const DescriptorAddress)
|
const void** const DescriptorAddress)
|
||||||
{
|
{
|
||||||
const uint8_t DescriptorType = (wValue >> 8);
|
const uint8_t DescriptorType = (wValue >> 8);
|
||||||
const uint8_t DescriptorNumber = (wValue & 0xFF);
|
const uint8_t DescriptorNumber = (wValue & 0xFF);
|
||||||
|
|
||||||
const void* Address = NULL;
|
const void* Address = NULL;
|
||||||
uint16_t Size = NO_DESCRIPTOR;
|
uint16_t Size = NO_DESCRIPTOR;
|
||||||
|
|
||||||
switch (DescriptorType)
|
switch (DescriptorType)
|
||||||
{
|
{
|
||||||
case DTYPE_Device:
|
case DTYPE_Device:
|
||||||
Address = &DeviceDescriptor;
|
Address = &DeviceDescriptor;
|
||||||
Size = sizeof(USB_Descriptor_Device_t);
|
Size = sizeof(USB_Descriptor_Device_t);
|
||||||
break;
|
break;
|
||||||
case DTYPE_Configuration:
|
case DTYPE_Configuration:
|
||||||
Address = &ConfigurationDescriptor;
|
Address = &ConfigurationDescriptor;
|
||||||
Size = sizeof(USB_Descriptor_Configuration_t);
|
Size = sizeof(USB_Descriptor_Configuration_t);
|
||||||
break;
|
break;
|
||||||
case DTYPE_String:
|
case DTYPE_String:
|
||||||
switch (DescriptorNumber)
|
switch (DescriptorNumber)
|
||||||
{
|
{
|
||||||
case 0x00:
|
case 0x00:
|
||||||
Address = &LanguageString;
|
Address = &LanguageString;
|
||||||
Size = pgm_read_byte(&LanguageString.Header.Size);
|
Size = pgm_read_byte(&LanguageString.Header.Size);
|
||||||
break;
|
break;
|
||||||
case 0x01:
|
case 0x01:
|
||||||
Address = &ManufacturerString;
|
Address = &ManufacturerString;
|
||||||
Size = pgm_read_byte(&ManufacturerString.Header.Size);
|
Size = pgm_read_byte(&ManufacturerString.Header.Size);
|
||||||
break;
|
break;
|
||||||
case 0x02:
|
case 0x02:
|
||||||
Address = &ProductString;
|
Address = &ProductString;
|
||||||
Size = pgm_read_byte(&ProductString.Header.Size);
|
Size = pgm_read_byte(&ProductString.Header.Size);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
case HID_DTYPE_HID:
|
case HID_DTYPE_HID:
|
||||||
Address = &ConfigurationDescriptor.HID_MediaControlHID;
|
Address = &ConfigurationDescriptor.HID_MediaControlHID;
|
||||||
Size = sizeof(USB_HID_Descriptor_HID_t);
|
Size = sizeof(USB_HID_Descriptor_HID_t);
|
||||||
break;
|
break;
|
||||||
case HID_DTYPE_Report:
|
case HID_DTYPE_Report:
|
||||||
Address = &MediaControlReport;
|
Address = &MediaControlReport;
|
||||||
Size = sizeof(MediaControlReport);
|
Size = sizeof(MediaControlReport);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
*DescriptorAddress = Address;
|
*DescriptorAddress = Address;
|
||||||
return Size;
|
return Size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,71 +1,71 @@
|
|||||||
/*
|
/*
|
||||||
LUFA Library
|
LUFA Library
|
||||||
Copyright (C) Dean Camera, 2011.
|
Copyright (C) Dean Camera, 2011.
|
||||||
|
|
||||||
dean [at] fourwalledcubicle [dot] com
|
dean [at] fourwalledcubicle [dot] com
|
||||||
www.lufa-lib.org
|
www.lufa-lib.org
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com)
|
Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com)
|
||||||
|
|
||||||
Permission to use, copy, modify, distribute, and sell this
|
Permission to use, copy, modify, distribute, and sell this
|
||||||
software and its documentation for any purpose is hereby granted
|
software and its documentation for any purpose is hereby granted
|
||||||
without fee, provided that the above copyright notice appear in
|
without fee, provided that the above copyright notice appear in
|
||||||
all copies and that both that the copyright notice and this
|
all copies and that both that the copyright notice and this
|
||||||
permission notice and warranty disclaimer appear in supporting
|
permission notice and warranty disclaimer appear in supporting
|
||||||
documentation, and that the name of the author not be used in
|
documentation, and that the name of the author not be used in
|
||||||
advertising or publicity pertaining to distribution of the
|
advertising or publicity pertaining to distribution of the
|
||||||
software without specific, written prior permission.
|
software without specific, written prior permission.
|
||||||
|
|
||||||
The author disclaim all warranties with regard to this
|
The author disclaim all warranties with regard to this
|
||||||
software, including all implied warranties of merchantability
|
software, including all implied warranties of merchantability
|
||||||
and fitness. In no event shall the author be liable for any
|
and fitness. In no event shall the author be liable for any
|
||||||
special, indirect or consequential damages or any damages
|
special, indirect or consequential damages or any damages
|
||||||
whatsoever resulting from loss of use, data or profits, whether
|
whatsoever resulting from loss of use, data or profits, whether
|
||||||
in an action of contract, negligence or other tortious action,
|
in an action of contract, negligence or other tortious action,
|
||||||
arising out of or in connection with the use or performance of
|
arising out of or in connection with the use or performance of
|
||||||
this software.
|
this software.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/** \file
|
/** \file
|
||||||
*
|
*
|
||||||
* Header file for Descriptors.c.
|
* Header file for Descriptors.c.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _DESCRIPTORS_H_
|
#ifndef _DESCRIPTORS_H_
|
||||||
#define _DESCRIPTORS_H_
|
#define _DESCRIPTORS_H_
|
||||||
|
|
||||||
/* Includes: */
|
/* Includes: */
|
||||||
#include <avr/pgmspace.h>
|
#include <avr/pgmspace.h>
|
||||||
|
|
||||||
#include <LUFA/Drivers/USB/USB.h>
|
#include <LUFA/Drivers/USB/USB.h>
|
||||||
|
|
||||||
/* 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
|
||||||
* vary between devices, and which describe the device's usage to the host.
|
* vary between devices, and which describe the device's usage to the host.
|
||||||
*/
|
*/
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
USB_Descriptor_Configuration_Header_t Config;
|
USB_Descriptor_Configuration_Header_t Config;
|
||||||
USB_Descriptor_Interface_t HID_Interface;
|
USB_Descriptor_Interface_t HID_Interface;
|
||||||
USB_HID_Descriptor_HID_t HID_MediaControlHID;
|
USB_HID_Descriptor_HID_t HID_MediaControlHID;
|
||||||
USB_Descriptor_Endpoint_t HID_ReportINEndpoint;
|
USB_Descriptor_Endpoint_t HID_ReportINEndpoint;
|
||||||
} USB_Descriptor_Configuration_t;
|
} USB_Descriptor_Configuration_t;
|
||||||
|
|
||||||
/* Macros: */
|
/* Macros: */
|
||||||
/** Endpoint number of the Media Control HID reporting IN endpoint. */
|
/** Endpoint number of the Media Control HID reporting IN endpoint. */
|
||||||
#define MEDIACONTROL_HID_EPNUM 1
|
#define MEDIACONTROL_HID_EPNUM 1
|
||||||
|
|
||||||
/** Size in bytes of the Media Control HID reporting IN and OUT endpoints. */
|
/** Size in bytes of the Media Control HID reporting IN and OUT endpoints. */
|
||||||
#define MEDIACONTROL_HID_EPSIZE 8
|
#define MEDIACONTROL_HID_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,
|
||||||
const void** const DescriptorAddress)
|
const void** const DescriptorAddress)
|
||||||
ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(3);
|
ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(3);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -1,178 +1,178 @@
|
|||||||
/*
|
/*
|
||||||
LUFA Library
|
LUFA Library
|
||||||
Copyright (C) Dean Camera, 2011.
|
Copyright (C) Dean Camera, 2011.
|
||||||
|
|
||||||
dean [at] fourwalledcubicle [dot] com
|
dean [at] fourwalledcubicle [dot] com
|
||||||
www.lufa-lib.org
|
www.lufa-lib.org
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com)
|
Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com)
|
||||||
|
|
||||||
Permission to use, copy, modify, distribute, and sell this
|
Permission to use, copy, modify, distribute, and sell this
|
||||||
software and its documentation for any purpose is hereby granted
|
software and its documentation for any purpose is hereby granted
|
||||||
without fee, provided that the above copyright notice appear in
|
without fee, provided that the above copyright notice appear in
|
||||||
all copies and that both that the copyright notice and this
|
all copies and that both that the copyright notice and this
|
||||||
permission notice and warranty disclaimer appear in supporting
|
permission notice and warranty disclaimer appear in supporting
|
||||||
documentation, and that the name of the author not be used in
|
documentation, and that the name of the author not be used in
|
||||||
advertising or publicity pertaining to distribution of the
|
advertising or publicity pertaining to distribution of the
|
||||||
software without specific, written prior permission.
|
software without specific, written prior permission.
|
||||||
|
|
||||||
The author disclaim all warranties with regard to this
|
The author disclaim all warranties with regard to this
|
||||||
software, including all implied warranties of merchantability
|
software, including all implied warranties of merchantability
|
||||||
and fitness. In no event shall the author be liable for any
|
and fitness. In no event shall the author be liable for any
|
||||||
special, indirect or consequential damages or any damages
|
special, indirect or consequential damages or any damages
|
||||||
whatsoever resulting from loss of use, data or profits, whether
|
whatsoever resulting from loss of use, data or profits, whether
|
||||||
in an action of contract, negligence or other tortious action,
|
in an action of contract, negligence or other tortious action,
|
||||||
arising out of or in connection with the use or performance of
|
arising out of or in connection with the use or performance of
|
||||||
this software.
|
this software.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/** \file
|
/** \file
|
||||||
*
|
*
|
||||||
* Main source file for the MediaControl project. This file contains the main tasks of
|
* Main source file for the MediaControl project. This file contains the main tasks of
|
||||||
* the demo and is responsible for the initial application hardware configuration.
|
* the demo and is responsible for the initial application hardware configuration.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "MediaController.h"
|
#include "MediaController.h"
|
||||||
|
|
||||||
/** Buffer to hold the previously generated Media Control HID report, for comparison purposes inside the HID class driver. */
|
/** Buffer to hold the previously generated Media Control HID report, for comparison purposes inside the HID class driver. */
|
||||||
static uint8_t PrevMediaControlHIDReportBuffer[sizeof(USB_MediaReport_Data_t)];
|
static uint8_t PrevMediaControlHIDReportBuffer[sizeof(USB_MediaReport_Data_t)];
|
||||||
|
|
||||||
/** LUFA HID Class driver interface configuration and state information. This structure is
|
/** LUFA HID Class driver interface configuration and state information. This structure is
|
||||||
* passed to all HID Class driver functions, so that multiple instances of the same class
|
* passed to all HID Class driver functions, so that multiple instances of the same class
|
||||||
* within a device can be differentiated from one another.
|
* within a device can be differentiated from one another.
|
||||||
*/
|
*/
|
||||||
USB_ClassInfo_HID_Device_t MediaControl_HID_Interface =
|
USB_ClassInfo_HID_Device_t MediaControl_HID_Interface =
|
||||||
{
|
{
|
||||||
.Config =
|
.Config =
|
||||||
{
|
{
|
||||||
.InterfaceNumber = 0,
|
.InterfaceNumber = 0,
|
||||||
|
|
||||||
.ReportINEndpointNumber = MEDIACONTROL_HID_EPNUM,
|
.ReportINEndpointNumber = MEDIACONTROL_HID_EPNUM,
|
||||||
.ReportINEndpointSize = MEDIACONTROL_HID_EPSIZE,
|
.ReportINEndpointSize = MEDIACONTROL_HID_EPSIZE,
|
||||||
.ReportINEndpointDoubleBank = false,
|
.ReportINEndpointDoubleBank = false,
|
||||||
|
|
||||||
.PrevReportINBuffer = PrevMediaControlHIDReportBuffer,
|
.PrevReportINBuffer = PrevMediaControlHIDReportBuffer,
|
||||||
.PrevReportINBufferSize = sizeof(PrevMediaControlHIDReportBuffer),
|
.PrevReportINBufferSize = sizeof(PrevMediaControlHIDReportBuffer),
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
/** Main program entry point. This routine contains the overall program flow, including initial
|
/** Main program entry point. This routine contains the overall program flow, including initial
|
||||||
* setup of all components and the main program loop.
|
* setup of all components and the main program loop.
|
||||||
*/
|
*/
|
||||||
int main(void)
|
int main(void)
|
||||||
{
|
{
|
||||||
SetupHardware();
|
SetupHardware();
|
||||||
|
|
||||||
LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY);
|
LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY);
|
||||||
sei();
|
sei();
|
||||||
|
|
||||||
for (;;)
|
for (;;)
|
||||||
{
|
{
|
||||||
HID_Device_USBTask(&MediaControl_HID_Interface);
|
HID_Device_USBTask(&MediaControl_HID_Interface);
|
||||||
USB_USBTask();
|
USB_USBTask();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Configures the board hardware and chip peripherals for the demo's functionality. */
|
/** Configures the board hardware and chip peripherals for the demo's functionality. */
|
||||||
void SetupHardware()
|
void SetupHardware()
|
||||||
{
|
{
|
||||||
/* Disable watchdog if enabled by bootloader/fuses */
|
/* Disable watchdog if enabled by bootloader/fuses */
|
||||||
MCUSR &= ~(1 << WDRF);
|
MCUSR &= ~(1 << WDRF);
|
||||||
wdt_disable();
|
wdt_disable();
|
||||||
|
|
||||||
/* Disable clock division */
|
/* Disable clock division */
|
||||||
clock_prescale_set(clock_div_1);
|
clock_prescale_set(clock_div_1);
|
||||||
|
|
||||||
/* Hardware Initialization */
|
/* Hardware Initialization */
|
||||||
Joystick_Init();
|
Joystick_Init();
|
||||||
LEDs_Init();
|
LEDs_Init();
|
||||||
Buttons_Init();
|
Buttons_Init();
|
||||||
USB_Init();
|
USB_Init();
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Event handler for the library USB Connection event. */
|
/** Event handler for the library USB Connection event. */
|
||||||
void EVENT_USB_Device_Connect(void)
|
void EVENT_USB_Device_Connect(void)
|
||||||
{
|
{
|
||||||
LEDs_SetAllLEDs(LEDMASK_USB_ENUMERATING);
|
LEDs_SetAllLEDs(LEDMASK_USB_ENUMERATING);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Event handler for the library USB Disconnection event. */
|
/** Event handler for the library USB Disconnection event. */
|
||||||
void EVENT_USB_Device_Disconnect(void)
|
void EVENT_USB_Device_Disconnect(void)
|
||||||
{
|
{
|
||||||
LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY);
|
LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Event handler for the library USB Configuration Changed event. */
|
/** Event handler for the library USB Configuration Changed event. */
|
||||||
void EVENT_USB_Device_ConfigurationChanged(void)
|
void EVENT_USB_Device_ConfigurationChanged(void)
|
||||||
{
|
{
|
||||||
bool ConfigSuccess = true;
|
bool ConfigSuccess = true;
|
||||||
|
|
||||||
ConfigSuccess &= HID_Device_ConfigureEndpoints(&MediaControl_HID_Interface);
|
ConfigSuccess &= HID_Device_ConfigureEndpoints(&MediaControl_HID_Interface);
|
||||||
|
|
||||||
USB_Device_EnableSOFEvents();
|
USB_Device_EnableSOFEvents();
|
||||||
|
|
||||||
LEDs_SetAllLEDs(ConfigSuccess ? LEDMASK_USB_READY : LEDMASK_USB_ERROR);
|
LEDs_SetAllLEDs(ConfigSuccess ? LEDMASK_USB_READY : LEDMASK_USB_ERROR);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Event handler for the library USB Control Request reception event. */
|
/** Event handler for the library USB Control Request reception event. */
|
||||||
void EVENT_USB_Device_ControlRequest(void)
|
void EVENT_USB_Device_ControlRequest(void)
|
||||||
{
|
{
|
||||||
HID_Device_ProcessControlRequest(&MediaControl_HID_Interface);
|
HID_Device_ProcessControlRequest(&MediaControl_HID_Interface);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Event handler for the USB device Start Of Frame event. */
|
/** Event handler for the USB device Start Of Frame event. */
|
||||||
void EVENT_USB_Device_StartOfFrame(void)
|
void EVENT_USB_Device_StartOfFrame(void)
|
||||||
{
|
{
|
||||||
HID_Device_MillisecondElapsed(&MediaControl_HID_Interface);
|
HID_Device_MillisecondElapsed(&MediaControl_HID_Interface);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** HID class driver callback function for the creation of HID reports to the host.
|
/** HID class driver callback function for the creation of HID reports to the host.
|
||||||
*
|
*
|
||||||
* \param[in] HIDInterfaceInfo Pointer to the HID class interface configuration structure being referenced
|
* \param[in] HIDInterfaceInfo Pointer to the HID class interface configuration structure being referenced
|
||||||
* \param[in,out] ReportID Report ID requested by the host if non-zero, otherwise callback should set to the generated report ID
|
* \param[in,out] ReportID Report ID requested by the host if non-zero, otherwise callback should set to the generated report ID
|
||||||
* \param[in] ReportType Type of the report to create, either HID_REPORT_ITEM_In or HID_REPORT_ITEM_Feature
|
* \param[in] ReportType Type of the report to create, either HID_REPORT_ITEM_In or HID_REPORT_ITEM_Feature
|
||||||
* \param[out] ReportData Pointer to a buffer where the created report should be stored
|
* \param[out] ReportData Pointer to a buffer where the created report should be stored
|
||||||
* \param[out] ReportSize Number of bytes written in the report (or zero if no report is to be sent
|
* \param[out] ReportSize Number of bytes written in the report (or zero if no report is to be sent
|
||||||
*
|
*
|
||||||
* \return Boolean true to force the sending of the report, false to let the library determine if it needs to be sent
|
* \return Boolean true to force the sending of the report, false to let the library determine if it needs to be sent
|
||||||
*/
|
*/
|
||||||
bool CALLBACK_HID_Device_CreateHIDReport(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo, uint8_t* const ReportID,
|
bool CALLBACK_HID_Device_CreateHIDReport(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo, uint8_t* const ReportID,
|
||||||
const uint8_t ReportType, void* ReportData, uint16_t* const ReportSize)
|
const uint8_t ReportType, void* ReportData, uint16_t* const ReportSize)
|
||||||
{
|
{
|
||||||
USB_MediaReport_Data_t* MediaReport = (USB_MediaReport_Data_t*)ReportData;
|
USB_MediaReport_Data_t* MediaReport = (USB_MediaReport_Data_t*)ReportData;
|
||||||
|
|
||||||
uint8_t JoyStatus_LCL = Joystick_GetStatus();
|
uint8_t JoyStatus_LCL = Joystick_GetStatus();
|
||||||
uint8_t ButtonStatus_LCL = Buttons_GetStatus();
|
uint8_t ButtonStatus_LCL = Buttons_GetStatus();
|
||||||
|
|
||||||
/* Update the Media Control report with the user button presses */
|
/* Update the Media Control report with the user button presses */
|
||||||
MediaReport->Mute = ((ButtonStatus_LCL & BUTTONS_BUTTON1) ? true : false);
|
MediaReport->Mute = ((ButtonStatus_LCL & BUTTONS_BUTTON1) ? true : false);
|
||||||
MediaReport->PlayPause = ((JoyStatus_LCL & JOY_PRESS) ? true : false);
|
MediaReport->PlayPause = ((JoyStatus_LCL & JOY_PRESS) ? true : false);
|
||||||
MediaReport->VolumeUp = ((JoyStatus_LCL & JOY_UP) ? true : false);
|
MediaReport->VolumeUp = ((JoyStatus_LCL & JOY_UP) ? true : false);
|
||||||
MediaReport->VolumeDown = ((JoyStatus_LCL & JOY_DOWN) ? true : false);
|
MediaReport->VolumeDown = ((JoyStatus_LCL & JOY_DOWN) ? true : false);
|
||||||
MediaReport->PreviousTrack = ((JoyStatus_LCL & JOY_LEFT) ? true : false);
|
MediaReport->PreviousTrack = ((JoyStatus_LCL & JOY_LEFT) ? true : false);
|
||||||
MediaReport->NextTrack = ((JoyStatus_LCL & JOY_RIGHT) ? true : false);
|
MediaReport->NextTrack = ((JoyStatus_LCL & JOY_RIGHT) ? true : false);
|
||||||
|
|
||||||
*ReportSize = sizeof(USB_MediaReport_Data_t);
|
*ReportSize = sizeof(USB_MediaReport_Data_t);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** HID class driver callback function for the processing of HID reports from the host.
|
/** HID class driver callback function for the processing of HID reports from the host.
|
||||||
*
|
*
|
||||||
* \param[in] HIDInterfaceInfo Pointer to the HID class interface configuration structure being referenced
|
* \param[in] HIDInterfaceInfo Pointer to the HID class interface configuration structure being referenced
|
||||||
* \param[in] ReportID Report ID of the received report from the host
|
* \param[in] ReportID Report ID of the received report from the host
|
||||||
* \param[in] ReportType The type of report that the host has sent, either HID_REPORT_ITEM_Out or HID_REPORT_ITEM_Feature
|
* \param[in] ReportType The type of report that the host has sent, either HID_REPORT_ITEM_Out or HID_REPORT_ITEM_Feature
|
||||||
* \param[in] ReportData Pointer to a buffer where the received report has been stored
|
* \param[in] ReportData Pointer to a buffer where the received report has been stored
|
||||||
* \param[in] ReportSize Size in bytes of the received HID report
|
* \param[in] ReportSize Size in bytes of the received HID report
|
||||||
*/
|
*/
|
||||||
void CALLBACK_HID_Device_ProcessHIDReport(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo,
|
void CALLBACK_HID_Device_ProcessHIDReport(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo,
|
||||||
const uint8_t ReportID,
|
const uint8_t ReportID,
|
||||||
const uint8_t ReportType,
|
const uint8_t ReportType,
|
||||||
const void* ReportData,
|
const void* ReportData,
|
||||||
const uint16_t ReportSize)
|
const uint16_t ReportSize)
|
||||||
{
|
{
|
||||||
// Unused (but mandatory for the HID class driver) in this demo, since there are no Host->Device reports
|
// Unused (but mandatory for the HID class driver) in this demo, since there are no Host->Device reports
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,110 +1,110 @@
|
|||||||
/*
|
/*
|
||||||
LUFA Library
|
LUFA Library
|
||||||
Copyright (C) Dean Camera, 2011.
|
Copyright (C) Dean Camera, 2011.
|
||||||
|
|
||||||
dean [at] fourwalledcubicle [dot] com
|
dean [at] fourwalledcubicle [dot] com
|
||||||
www.lufa-lib.org
|
www.lufa-lib.org
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com)
|
Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com)
|
||||||
|
|
||||||
Permission to use, copy, modify, distribute, and sell this
|
Permission to use, copy, modify, distribute, and sell this
|
||||||
software and its documentation for any purpose is hereby granted
|
software and its documentation for any purpose is hereby granted
|
||||||
without fee, provided that the above copyright notice appear in
|
without fee, provided that the above copyright notice appear in
|
||||||
all copies and that both that the copyright notice and this
|
all copies and that both that the copyright notice and this
|
||||||
permission notice and warranty disclaimer appear in supporting
|
permission notice and warranty disclaimer appear in supporting
|
||||||
documentation, and that the name of the author not be used in
|
documentation, and that the name of the author not be used in
|
||||||
advertising or publicity pertaining to distribution of the
|
advertising or publicity pertaining to distribution of the
|
||||||
software without specific, written prior permission.
|
software without specific, written prior permission.
|
||||||
|
|
||||||
The author disclaim all warranties with regard to this
|
The author disclaim all warranties with regard to this
|
||||||
software, including all implied warranties of merchantability
|
software, including all implied warranties of merchantability
|
||||||
and fitness. In no event shall the author be liable for any
|
and fitness. In no event shall the author be liable for any
|
||||||
special, indirect or consequential damages or any damages
|
special, indirect or consequential damages or any damages
|
||||||
whatsoever resulting from loss of use, data or profits, whether
|
whatsoever resulting from loss of use, data or profits, whether
|
||||||
in an action of contract, negligence or other tortious action,
|
in an action of contract, negligence or other tortious action,
|
||||||
arising out of or in connection with the use or performance of
|
arising out of or in connection with the use or performance of
|
||||||
this software.
|
this software.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/** \file
|
/** \file
|
||||||
*
|
*
|
||||||
* Header file for MediaControl.c.
|
* Header file for MediaControl.c.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _MEDIACONTROL_H_
|
#ifndef _MEDIACONTROL_H_
|
||||||
#define _MEDIACONTROL_H_
|
#define _MEDIACONTROL_H_
|
||||||
|
|
||||||
/* Includes: */
|
/* Includes: */
|
||||||
#include <avr/io.h>
|
#include <avr/io.h>
|
||||||
#include <avr/wdt.h>
|
#include <avr/wdt.h>
|
||||||
#include <avr/power.h>
|
#include <avr/power.h>
|
||||||
#include <avr/interrupt.h>
|
#include <avr/interrupt.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include "Descriptors.h"
|
#include "Descriptors.h"
|
||||||
|
|
||||||
#include <LUFA/Version.h>
|
#include <LUFA/Version.h>
|
||||||
#include <LUFA/Drivers/Board/Joystick.h>
|
#include <LUFA/Drivers/Board/Joystick.h>
|
||||||
#include <LUFA/Drivers/Board/LEDs.h>
|
#include <LUFA/Drivers/Board/LEDs.h>
|
||||||
#include <LUFA/Drivers/Board/Buttons.h>
|
#include <LUFA/Drivers/Board/Buttons.h>
|
||||||
#include <LUFA/Drivers/USB/USB.h>
|
#include <LUFA/Drivers/USB/USB.h>
|
||||||
|
|
||||||
/* Macros: */
|
/* Macros: */
|
||||||
/** LED mask for the library LED driver, to indicate that the USB interface is not ready. */
|
/** LED mask for the library LED driver, to indicate that the USB interface is not ready. */
|
||||||
#define LEDMASK_USB_NOTREADY LEDS_LED1
|
#define LEDMASK_USB_NOTREADY LEDS_LED1
|
||||||
|
|
||||||
/** LED mask for the library LED driver, to indicate that the USB interface is enumerating. */
|
/** LED mask for the library LED driver, to indicate that the USB interface is enumerating. */
|
||||||
#define LEDMASK_USB_ENUMERATING (LEDS_LED2 | LEDS_LED3)
|
#define LEDMASK_USB_ENUMERATING (LEDS_LED2 | LEDS_LED3)
|
||||||
|
|
||||||
/** LED mask for the library LED driver, to indicate that the USB interface is ready. */
|
/** LED mask for the library LED driver, to indicate that the USB interface is ready. */
|
||||||
#define LEDMASK_USB_READY (LEDS_LED2 | LEDS_LED4)
|
#define LEDMASK_USB_READY (LEDS_LED2 | LEDS_LED4)
|
||||||
|
|
||||||
/** LED mask for the library LED driver, to indicate that an error has occurred in the USB interface. */
|
/** LED mask for the library LED driver, to indicate that an error has occurred in the USB interface. */
|
||||||
#define LEDMASK_USB_ERROR (LEDS_LED1 | LEDS_LED3)
|
#define LEDMASK_USB_ERROR (LEDS_LED1 | LEDS_LED3)
|
||||||
|
|
||||||
/* Type Defines: */
|
/* Type Defines: */
|
||||||
/** Type define for a Media Control HID report. This report contains the bits to match the usages defined
|
/** Type define for a Media Control HID report. This report contains the bits to match the usages defined
|
||||||
* in the HID report of the device. When set to a true value, the relevant media controls on the host will
|
* in the HID report of the device. When set to a true value, the relevant media controls on the host will
|
||||||
* be triggered.
|
* be triggered.
|
||||||
*/
|
*/
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
unsigned Play : 1;
|
unsigned Play : 1;
|
||||||
unsigned Pause : 1;
|
unsigned Pause : 1;
|
||||||
unsigned FForward : 1;
|
unsigned FForward : 1;
|
||||||
unsigned Rewind : 1;
|
unsigned Rewind : 1;
|
||||||
unsigned NextTrack : 1;
|
unsigned NextTrack : 1;
|
||||||
unsigned PreviousTrack : 1;
|
unsigned PreviousTrack : 1;
|
||||||
unsigned Stop : 1;
|
unsigned Stop : 1;
|
||||||
unsigned PlayPause : 1;
|
unsigned PlayPause : 1;
|
||||||
unsigned Mute : 1;
|
unsigned Mute : 1;
|
||||||
unsigned VolumeUp : 1;
|
unsigned VolumeUp : 1;
|
||||||
unsigned VolumeDown : 1;
|
unsigned VolumeDown : 1;
|
||||||
unsigned RESERVED : 5;
|
unsigned RESERVED : 5;
|
||||||
} ATTR_PACKED USB_MediaReport_Data_t;
|
} ATTR_PACKED USB_MediaReport_Data_t;
|
||||||
|
|
||||||
/* Function Prototypes: */
|
/* Function Prototypes: */
|
||||||
void SetupHardware(void);
|
void SetupHardware(void);
|
||||||
|
|
||||||
void EVENT_USB_Device_Connect(void);
|
void EVENT_USB_Device_Connect(void);
|
||||||
void EVENT_USB_Device_Disconnect(void);
|
void EVENT_USB_Device_Disconnect(void);
|
||||||
void EVENT_USB_Device_ConfigurationChanged(void);
|
void EVENT_USB_Device_ConfigurationChanged(void);
|
||||||
void EVENT_USB_Device_ControlRequest(void);
|
void EVENT_USB_Device_ControlRequest(void);
|
||||||
void EVENT_USB_Device_StartOfFrame(void);
|
void EVENT_USB_Device_StartOfFrame(void);
|
||||||
|
|
||||||
bool CALLBACK_HID_Device_CreateHIDReport(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo,
|
bool CALLBACK_HID_Device_CreateHIDReport(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo,
|
||||||
uint8_t* const ReportID,
|
uint8_t* const ReportID,
|
||||||
const uint8_t ReportType,
|
const uint8_t ReportType,
|
||||||
void* ReportData,
|
void* ReportData,
|
||||||
uint16_t* const ReportSize);
|
uint16_t* const ReportSize);
|
||||||
void CALLBACK_HID_Device_ProcessHIDReport(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo,
|
void CALLBACK_HID_Device_ProcessHIDReport(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo,
|
||||||
const uint8_t ReportID,
|
const uint8_t ReportID,
|
||||||
const uint8_t ReportType,
|
const uint8_t ReportType,
|
||||||
const void* ReportData,
|
const void* ReportData,
|
||||||
const uint16_t ReportSize);
|
const uint16_t ReportSize);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -1,66 +1,66 @@
|
|||||||
/** \file
|
/** \file
|
||||||
*
|
*
|
||||||
* This file contains special DoxyGen information for the generation of the main page and other special
|
* This file contains special DoxyGen information for the generation of the main page and other special
|
||||||
* documentation pages. It is not a project source file.
|
* documentation pages. It is not a project source file.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/** \mainpage Media Controller Project
|
/** \mainpage Media Controller Project
|
||||||
*
|
*
|
||||||
* \section Sec_Compat Project Compatibility:
|
* \section Sec_Compat Project Compatibility:
|
||||||
*
|
*
|
||||||
* The following list indicates what microcontrollers are compatible with this project.
|
* The following list indicates what microcontrollers are compatible with this project.
|
||||||
*
|
*
|
||||||
* - Series 7 USB AVRs (AT90USBxxx7)
|
* - Series 7 USB AVRs (AT90USBxxx7)
|
||||||
* - Series 6 USB AVRs (AT90USBxxx6)
|
* - Series 6 USB AVRs (AT90USBxxx6)
|
||||||
* - Series 4 USB AVRs (ATMEGAxxU4)
|
* - Series 4 USB AVRs (ATMEGAxxU4)
|
||||||
* - Series 2 USB AVRs (AT90USBxx2, ATMEGAxxU2)
|
* - Series 2 USB AVRs (AT90USBxx2, ATMEGAxxU2)
|
||||||
*
|
*
|
||||||
* \section Sec_Info USB Information:
|
* \section Sec_Info USB Information:
|
||||||
*
|
*
|
||||||
* The following table gives a rundown of the USB utilization of this demo.
|
* The following table gives a rundown of the USB utilization of this demo.
|
||||||
*
|
*
|
||||||
* <table>
|
* <table>
|
||||||
* <tr>
|
* <tr>
|
||||||
* <td><b>USB Mode:</b></td>
|
* <td><b>USB Mode:</b></td>
|
||||||
* <td>Device</td>
|
* <td>Device</td>
|
||||||
* </tr>
|
* </tr>
|
||||||
* <tr>
|
* <tr>
|
||||||
* <td><b>USB Class:</b></td>
|
* <td><b>USB Class:</b></td>
|
||||||
* <td>Human Interface Device (HID)</td>
|
* <td>Human Interface Device (HID)</td>
|
||||||
* </tr>
|
* </tr>
|
||||||
* <tr>
|
* <tr>
|
||||||
* <td><b>USB Subclass:</b></td>
|
* <td><b>USB Subclass:</b></td>
|
||||||
* <td>N/A</td>
|
* <td>N/A</td>
|
||||||
* </tr>
|
* </tr>
|
||||||
* <tr>
|
* <tr>
|
||||||
* <td><b>Relevant Standards:</b></td>
|
* <td><b>Relevant Standards:</b></td>
|
||||||
* <td>USBIF HID Specification \n
|
* <td>USBIF HID Specification \n
|
||||||
* USBIF HID Usage Tables</td>
|
* USBIF HID Usage Tables</td>
|
||||||
* </tr>
|
* </tr>
|
||||||
* <tr>
|
* <tr>
|
||||||
* <td><b>Usable Speeds:</b></td>
|
* <td><b>Usable Speeds:</b></td>
|
||||||
* <td>Low Speed Mode \n
|
* <td>Low Speed Mode \n
|
||||||
* Full Speed Mode</td>
|
* Full Speed Mode</td>
|
||||||
* </tr>
|
* </tr>
|
||||||
* </table>
|
* </table>
|
||||||
*
|
*
|
||||||
* \section Sec_Description Project Description:
|
* \section Sec_Description Project Description:
|
||||||
*
|
*
|
||||||
* Media Controller project. This project implements a basic Media Control device, to signal the host to play, pause, toggle playback,
|
* Media Controller project. This project implements a basic Media Control device, to signal the host to play, pause, toggle playback,
|
||||||
* mute and/or adjust the host volume, in addition to other such media commands. This project may be extended to create a dedicated
|
* mute and/or adjust the host volume, in addition to other such media commands. This project may be extended to create a dedicated
|
||||||
* media playback control device, for home media centers or other equipment. By default, some of the most commonly used playback controls
|
* media playback control device, for home media centers or other equipment. By default, some of the most commonly used playback controls
|
||||||
* are controlled by the board joystick and LEDs, however this may be altered as desired.
|
* are controlled by the board joystick and LEDs, however this may be altered as desired.
|
||||||
*
|
*
|
||||||
* \section Sec_Options Project Options
|
* \section Sec_Options Project Options
|
||||||
*
|
*
|
||||||
* The following defines can be found in this project, which can control the project behaviour when defined, or changed in value.
|
* The following defines can be found in this project, which can control the project behaviour when defined, or changed in value.
|
||||||
*
|
*
|
||||||
* <table>
|
* <table>
|
||||||
* <tr>
|
* <tr>
|
||||||
* <td>
|
* <td>
|
||||||
* None
|
* None
|
||||||
* </td>
|
* </td>
|
||||||
* </tr>
|
* </tr>
|
||||||
* </table>
|
* </table>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
@ -1,717 +1,717 @@
|
|||||||
# Hey Emacs, this is a -*- makefile -*-
|
# Hey Emacs, this is a -*- makefile -*-
|
||||||
#----------------------------------------------------------------------------
|
#----------------------------------------------------------------------------
|
||||||
# WinAVR Makefile Template written by Eric B. Weddington, Jörg Wunsch, et al.
|
# WinAVR Makefile Template written by Eric B. Weddington, Jörg Wunsch, et al.
|
||||||
# >> Modified for use with the LUFA project. <<
|
# >> Modified for use with the LUFA project. <<
|
||||||
#
|
#
|
||||||
# Released to the Public Domain
|
# Released to the Public Domain
|
||||||
#
|
#
|
||||||
# Additional material for this makefile was written by:
|
# Additional material for this makefile was written by:
|
||||||
# Peter Fleury
|
# Peter Fleury
|
||||||
# Tim Henigan
|
# Tim Henigan
|
||||||
# Colin O'Flynn
|
# Colin O'Flynn
|
||||||
# Reiner Patommel
|
# Reiner Patommel
|
||||||
# Markus Pfaff
|
# Markus Pfaff
|
||||||
# Sander Pool
|
# Sander Pool
|
||||||
# Frederik Rouleau
|
# Frederik Rouleau
|
||||||
# Carlos Lamas
|
# Carlos Lamas
|
||||||
# Dean Camera
|
# Dean Camera
|
||||||
# Opendous Inc.
|
# Opendous Inc.
|
||||||
# Denver Gingerich
|
# Denver Gingerich
|
||||||
#
|
#
|
||||||
#----------------------------------------------------------------------------
|
#----------------------------------------------------------------------------
|
||||||
# On command line:
|
# On command line:
|
||||||
#
|
#
|
||||||
# make all = Make software.
|
# make all = Make software.
|
||||||
#
|
#
|
||||||
# make clean = Clean out built project files.
|
# make clean = Clean out built project files.
|
||||||
#
|
#
|
||||||
# make coff = Convert ELF to AVR COFF.
|
# make coff = Convert ELF to AVR COFF.
|
||||||
#
|
#
|
||||||
# make extcoff = Convert ELF to AVR Extended COFF.
|
# make extcoff = Convert ELF to AVR Extended COFF.
|
||||||
#
|
#
|
||||||
# make program = Download the hex file to the device, using avrdude.
|
# make program = Download the hex file to the device, using avrdude.
|
||||||
# Please customize the avrdude settings below first!
|
# Please customize the avrdude settings below first!
|
||||||
#
|
#
|
||||||
# make dfu = Download the hex file to the device, using dfu-programmer (must
|
# make dfu = Download the hex file to the device, using dfu-programmer (must
|
||||||
# have dfu-programmer installed).
|
# have dfu-programmer installed).
|
||||||
#
|
#
|
||||||
# make flip = Download the hex file to the device, using Atmel FLIP (must
|
# make flip = Download the hex file to the device, using Atmel FLIP (must
|
||||||
# have Atmel FLIP installed).
|
# have Atmel FLIP installed).
|
||||||
#
|
#
|
||||||
# make dfu-ee = Download the eeprom file to the device, using dfu-programmer
|
# make dfu-ee = Download the eeprom file to the device, using dfu-programmer
|
||||||
# (must have dfu-programmer installed).
|
# (must have dfu-programmer installed).
|
||||||
#
|
#
|
||||||
# make flip-ee = Download the eeprom file to the device, using Atmel FLIP
|
# make flip-ee = Download the eeprom file to the device, using Atmel FLIP
|
||||||
# (must have Atmel FLIP installed).
|
# (must have Atmel FLIP installed).
|
||||||
#
|
#
|
||||||
# make doxygen = Generate DoxyGen documentation for the project (must have
|
# make doxygen = Generate DoxyGen documentation for the project (must have
|
||||||
# DoxyGen installed)
|
# DoxyGen installed)
|
||||||
#
|
#
|
||||||
# make debug = Start either simulavr or avarice as specified for debugging,
|
# make debug = Start either simulavr or avarice as specified for debugging,
|
||||||
# with avr-gdb or avr-insight as the front end 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.s = Just compile filename.c into the assembler code only.
|
||||||
#
|
#
|
||||||
# make filename.i = Create a preprocessed source file for use in submitting
|
# make filename.i = Create a preprocessed source file for use in submitting
|
||||||
# bug reports to the GCC project.
|
# bug reports to the GCC project.
|
||||||
#
|
#
|
||||||
# To rebuild project do "make clean" then "make all".
|
# To rebuild project do "make clean" then "make all".
|
||||||
#----------------------------------------------------------------------------
|
#----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
# MCU name
|
# MCU name
|
||||||
MCU = at90usb1287
|
MCU = at90usb1287
|
||||||
|
|
||||||
|
|
||||||
# Target architecture (see library "Board Types" documentation).
|
# Target architecture (see library "Board Types" documentation).
|
||||||
ARCH = AVR8
|
ARCH = AVR8
|
||||||
|
|
||||||
|
|
||||||
# Target board (see library "Board Types" documentation, NONE for projects not requiring
|
# 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
|
# LUFA board drivers). If USER is selected, put custom board drivers in a directory called
|
||||||
# "Board" inside the application directory.
|
# "Board" inside the application directory.
|
||||||
BOARD = USBKEY
|
BOARD = USBKEY
|
||||||
|
|
||||||
|
|
||||||
# Processor frequency.
|
# Processor frequency.
|
||||||
# This will define a symbol, F_CPU, in all source code files equal to the
|
# 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
|
# 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
|
# 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.
|
# 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
|
# 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
|
# 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
|
# 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
|
# reflect the processor speed set externally so that the code can use accurate
|
||||||
# software delays.
|
# software delays.
|
||||||
F_CPU = 8000000
|
F_CPU = 8000000
|
||||||
|
|
||||||
|
|
||||||
# Input clock frequency.
|
# Input clock frequency.
|
||||||
# This will define a symbol, F_USB, in all source code files equal to the
|
# 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
|
# 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
|
# 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
|
# 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'
|
# 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
|
# at the end, this will be done automatically to create a 32-bit value in your
|
||||||
# source code.
|
# source code.
|
||||||
#
|
#
|
||||||
# If no clock division is performed on the input clock inside the AVR (via the
|
# 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.
|
# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
|
||||||
F_USB = $(F_CPU)
|
F_USB = $(F_CPU)
|
||||||
|
|
||||||
|
|
||||||
# Output format. (can be srec, ihex, binary)
|
# Output format. (can be srec, ihex, binary)
|
||||||
FORMAT = ihex
|
FORMAT = ihex
|
||||||
|
|
||||||
|
|
||||||
# Target file name (without extension).
|
# Target file name (without extension).
|
||||||
TARGET = MediaController
|
TARGET = MediaController
|
||||||
|
|
||||||
|
|
||||||
# Object files directory
|
# Object files directory
|
||||||
# To put object files in current directory, use a dot (.), do NOT make
|
# To put object files in current directory, use a dot (.), do NOT make
|
||||||
# this an empty or blank macro!
|
# this an empty or blank macro!
|
||||||
OBJDIR = .
|
OBJDIR = .
|
||||||
|
|
||||||
|
|
||||||
# Path to the LUFA library
|
# Path to the LUFA library
|
||||||
LUFA_PATH = ../..
|
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 USB_DEVICE_ONLY
|
||||||
LUFA_OPTS += -D FIXED_CONTROL_ENDPOINT_SIZE=8
|
LUFA_OPTS += -D FIXED_CONTROL_ENDPOINT_SIZE=8
|
||||||
LUFA_OPTS += -D FIXED_NUM_CONFIGURATIONS=1
|
LUFA_OPTS += -D FIXED_NUM_CONFIGURATIONS=1
|
||||||
LUFA_OPTS += -D USE_FLASH_DESCRIPTORS
|
LUFA_OPTS += -D USE_FLASH_DESCRIPTORS
|
||||||
LUFA_OPTS += -D USE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"
|
LUFA_OPTS += -D USE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"
|
||||||
|
|
||||||
|
|
||||||
# Create the LUFA source path variables by including the LUFA root makefile
|
# Create the LUFA source path variables by including the LUFA root makefile
|
||||||
include $(LUFA_PATH)/LUFA/makefile
|
include $(LUFA_PATH)/LUFA/makefile
|
||||||
|
|
||||||
|
|
||||||
# List C source files here. (C dependencies are automatically generated.)
|
# List C source files here. (C dependencies are automatically generated.)
|
||||||
SRC = $(TARGET).c \
|
SRC = $(TARGET).c \
|
||||||
Descriptors.c \
|
Descriptors.c \
|
||||||
$(LUFA_SRC_USB) \
|
$(LUFA_SRC_USB) \
|
||||||
$(LUFA_SRC_USBCLASS)
|
$(LUFA_SRC_USBCLASS)
|
||||||
|
|
||||||
|
|
||||||
# List C++ source files here. (C dependencies are automatically generated.)
|
# List C++ source files here. (C dependencies are automatically generated.)
|
||||||
CPPSRC =
|
CPPSRC =
|
||||||
|
|
||||||
|
|
||||||
# List Assembler source files here.
|
# List Assembler source files here.
|
||||||
# Make them always end in a capital .S. Files ending in a lowercase .s
|
# Make them always end in a capital .S. Files ending in a lowercase .s
|
||||||
# will not be considered source files but generated files (assembler
|
# will not be considered source files but generated files (assembler
|
||||||
# output from the compiler), and will be deleted upon "make clean"!
|
# output from the compiler), and will be deleted upon "make clean"!
|
||||||
# Even though the DOS/Win* filesystem matches both .s and .S the same,
|
# 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
|
# it will preserve the spelling of the filenames, and gcc itself does
|
||||||
# care about how the name is spelled on its command-line.
|
# care about how the name is spelled on its command-line.
|
||||||
ASRC =
|
ASRC =
|
||||||
|
|
||||||
|
|
||||||
# Optimization level, can be [0, 1, 2, 3, s].
|
# Optimization level, can be [0, 1, 2, 3, s].
|
||||||
# 0 = turn off optimization. s = optimize for size.
|
# 0 = turn off optimization. s = optimize for size.
|
||||||
# (Note: 3 is not always the best optimization level. See avr-libc FAQ.)
|
# (Note: 3 is not always the best optimization level. See avr-libc FAQ.)
|
||||||
OPT = s
|
OPT = s
|
||||||
|
|
||||||
|
|
||||||
# Debugging format.
|
# Debugging format.
|
||||||
# Native formats for AVR-GCC's -g are dwarf-2 [default] or stabs.
|
# Native formats for AVR-GCC's -g are dwarf-2 [default] or stabs.
|
||||||
# AVR Studio 4.10 requires dwarf-2.
|
# AVR Studio 4.10 requires dwarf-2.
|
||||||
# AVR [Extended] COFF format requires stabs, plus an avr-objcopy run.
|
# AVR [Extended] COFF format requires stabs, plus an avr-objcopy run.
|
||||||
DEBUG = dwarf-2
|
DEBUG = dwarf-2
|
||||||
|
|
||||||
|
|
||||||
# List any extra directories to look for include files here.
|
# List any extra directories to look for include files here.
|
||||||
# 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)/
|
||||||
|
|
||||||
|
|
||||||
# Compiler flag to set the C Standard level.
|
# Compiler flag to set the C Standard level.
|
||||||
# c89 = "ANSI" C
|
# c89 = "ANSI" C
|
||||||
# gnu89 = c89 plus GCC extensions
|
# gnu89 = c89 plus GCC extensions
|
||||||
# c99 = ISO C99 standard (not yet fully implemented)
|
# c99 = ISO C99 standard (not yet fully implemented)
|
||||||
# gnu99 = c99 plus GCC extensions
|
# gnu99 = c99 plus GCC extensions
|
||||||
CSTANDARD = -std=c99
|
CSTANDARD = -std=c99
|
||||||
|
|
||||||
|
|
||||||
# Place -D or -U options here for C sources
|
# Place -D or -U options here for C sources
|
||||||
CDEFS = -DF_CPU=$(F_CPU)UL
|
CDEFS = -DF_CPU=$(F_CPU)UL
|
||||||
CDEFS += -DF_USB=$(F_USB)UL
|
CDEFS += -DF_USB=$(F_USB)UL
|
||||||
CDEFS += -DBOARD=BOARD_$(BOARD) -DARCH=ARCH_$(ARCH)
|
CDEFS += -DBOARD=BOARD_$(BOARD) -DARCH=ARCH_$(ARCH)
|
||||||
CDEFS += $(LUFA_OPTS)
|
CDEFS += $(LUFA_OPTS)
|
||||||
|
|
||||||
|
|
||||||
# Place -D or -U options here for ASM sources
|
# Place -D or -U options here for ASM sources
|
||||||
ADEFS = -DF_CPU=$(F_CPU)
|
ADEFS = -DF_CPU=$(F_CPU)
|
||||||
ADEFS += -DF_USB=$(F_USB)UL
|
ADEFS += -DF_USB=$(F_USB)UL
|
||||||
ADEFS += -DBOARD=BOARD_$(BOARD) -DARCH=ARCH_$(ARCH)
|
ADEFS += -DBOARD=BOARD_$(BOARD) -DARCH=ARCH_$(ARCH)
|
||||||
ADEFS += $(LUFA_OPTS)
|
ADEFS += $(LUFA_OPTS)
|
||||||
|
|
||||||
# Place -D or -U options here for C++ sources
|
# Place -D or -U options here for C++ sources
|
||||||
CPPDEFS = -DF_CPU=$(F_CPU)UL
|
CPPDEFS = -DF_CPU=$(F_CPU)UL
|
||||||
CPPDEFS += -DF_USB=$(F_USB)UL
|
CPPDEFS += -DF_USB=$(F_USB)UL
|
||||||
CPPDEFS += -DBOARD=BOARD_$(BOARD) -DARCH=ARCH_$(ARCH)
|
CPPDEFS += -DBOARD=BOARD_$(BOARD) -DARCH=ARCH_$(ARCH)
|
||||||
CPPDEFS += $(LUFA_OPTS)
|
CPPDEFS += $(LUFA_OPTS)
|
||||||
#CPPDEFS += -D__STDC_LIMIT_MACROS
|
#CPPDEFS += -D__STDC_LIMIT_MACROS
|
||||||
#CPPDEFS += -D__STDC_CONSTANT_MACROS
|
#CPPDEFS += -D__STDC_CONSTANT_MACROS
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#---------------- Compiler Options C ----------------
|
#---------------- Compiler Options C ----------------
|
||||||
# -g*: generate debugging information
|
# -g*: generate debugging information
|
||||||
# -O*: optimization level
|
# -O*: optimization level
|
||||||
# -f...: tuning, see GCC manual and avr-libc documentation
|
# -f...: tuning, see GCC manual and avr-libc documentation
|
||||||
# -Wall...: warning level
|
# -Wall...: warning level
|
||||||
# -Wa,...: tell GCC to pass this to the assembler.
|
# -Wa,...: tell GCC to pass this to the assembler.
|
||||||
# -adhlns...: create assembler listing
|
# -adhlns...: create assembler listing
|
||||||
CFLAGS = -g$(DEBUG)
|
CFLAGS = -g$(DEBUG)
|
||||||
CFLAGS += $(CDEFS)
|
CFLAGS += $(CDEFS)
|
||||||
CFLAGS += -O$(OPT)
|
CFLAGS += -O$(OPT)
|
||||||
CFLAGS += -funsigned-char
|
CFLAGS += -funsigned-char
|
||||||
CFLAGS += -funsigned-bitfields
|
CFLAGS += -funsigned-bitfields
|
||||||
CFLAGS += -ffunction-sections
|
CFLAGS += -ffunction-sections
|
||||||
CFLAGS += -fno-inline-small-functions
|
CFLAGS += -fno-inline-small-functions
|
||||||
CFLAGS += -fpack-struct
|
CFLAGS += -fpack-struct
|
||||||
CFLAGS += -fshort-enums
|
CFLAGS += -fshort-enums
|
||||||
CFLAGS += -fno-strict-aliasing
|
CFLAGS += -fno-strict-aliasing
|
||||||
CFLAGS += -Wall
|
CFLAGS += -Wall
|
||||||
CFLAGS += -Wstrict-prototypes
|
CFLAGS += -Wstrict-prototypes
|
||||||
#CFLAGS += -mshort-calls
|
#CFLAGS += -mshort-calls
|
||||||
#CFLAGS += -fno-unit-at-a-time
|
#CFLAGS += -fno-unit-at-a-time
|
||||||
#CFLAGS += -Wundef
|
#CFLAGS += -Wundef
|
||||||
#CFLAGS += -Wunreachable-code
|
#CFLAGS += -Wunreachable-code
|
||||||
#CFLAGS += -Wsign-compare
|
#CFLAGS += -Wsign-compare
|
||||||
CFLAGS += -Wa,-adhlns=$(<:%.c=$(OBJDIR)/%.lst)
|
CFLAGS += -Wa,-adhlns=$(<:%.c=$(OBJDIR)/%.lst)
|
||||||
CFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS))
|
CFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS))
|
||||||
CFLAGS += $(CSTANDARD)
|
CFLAGS += $(CSTANDARD)
|
||||||
|
|
||||||
|
|
||||||
#---------------- Compiler Options C++ ----------------
|
#---------------- Compiler Options C++ ----------------
|
||||||
# -g*: generate debugging information
|
# -g*: generate debugging information
|
||||||
# -O*: optimization level
|
# -O*: optimization level
|
||||||
# -f...: tuning, see GCC manual and avr-libc documentation
|
# -f...: tuning, see GCC manual and avr-libc documentation
|
||||||
# -Wall...: warning level
|
# -Wall...: warning level
|
||||||
# -Wa,...: tell GCC to pass this to the assembler.
|
# -Wa,...: tell GCC to pass this to the assembler.
|
||||||
# -adhlns...: create assembler listing
|
# -adhlns...: create assembler listing
|
||||||
CPPFLAGS = -g$(DEBUG)
|
CPPFLAGS = -g$(DEBUG)
|
||||||
CPPFLAGS += $(CPPDEFS)
|
CPPFLAGS += $(CPPDEFS)
|
||||||
CPPFLAGS += -O$(OPT)
|
CPPFLAGS += -O$(OPT)
|
||||||
CPPFLAGS += -funsigned-char
|
CPPFLAGS += -funsigned-char
|
||||||
CPPFLAGS += -funsigned-bitfields
|
CPPFLAGS += -funsigned-bitfields
|
||||||
CPPFLAGS += -fpack-struct
|
CPPFLAGS += -fpack-struct
|
||||||
CPPFLAGS += -fshort-enums
|
CPPFLAGS += -fshort-enums
|
||||||
CPPFLAGS += -fno-exceptions
|
CPPFLAGS += -fno-exceptions
|
||||||
CPPFLAGS += -Wall
|
CPPFLAGS += -Wall
|
||||||
CPPFLAGS += -Wundef
|
CPPFLAGS += -Wundef
|
||||||
#CPPFLAGS += -mshort-calls
|
#CPPFLAGS += -mshort-calls
|
||||||
#CPPFLAGS += -fno-unit-at-a-time
|
#CPPFLAGS += -fno-unit-at-a-time
|
||||||
#CPPFLAGS += -Wstrict-prototypes
|
#CPPFLAGS += -Wstrict-prototypes
|
||||||
#CPPFLAGS += -Wunreachable-code
|
#CPPFLAGS += -Wunreachable-code
|
||||||
#CPPFLAGS += -Wsign-compare
|
#CPPFLAGS += -Wsign-compare
|
||||||
CPPFLAGS += -Wa,-adhlns=$(<:%.cpp=$(OBJDIR)/%.lst)
|
CPPFLAGS += -Wa,-adhlns=$(<:%.cpp=$(OBJDIR)/%.lst)
|
||||||
CPPFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS))
|
CPPFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS))
|
||||||
#CPPFLAGS += $(CSTANDARD)
|
#CPPFLAGS += $(CSTANDARD)
|
||||||
|
|
||||||
|
|
||||||
#---------------- Assembler Options ----------------
|
#---------------- Assembler Options ----------------
|
||||||
# -Wa,...: tell GCC to pass this to the assembler.
|
# -Wa,...: tell GCC to pass this to the assembler.
|
||||||
# -adhlns: create listing
|
# -adhlns: create listing
|
||||||
# -gstabs: have the assembler create line number information; note that
|
# -gstabs: have the assembler create line number information; note that
|
||||||
# for use in COFF files, additional information about filenames
|
# for use in COFF files, additional information about filenames
|
||||||
# and function names needs to be present in the assembler source
|
# and function names needs to be present in the assembler source
|
||||||
# files -- see avr-libc docs [FIXME: not yet described there]
|
# files -- see avr-libc docs [FIXME: not yet described there]
|
||||||
# -listing-cont-lines: Sets the maximum number of continuation lines of hex
|
# -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.
|
# 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
|
ASFLAGS = $(ADEFS) -Wa,-adhlns=$(<:%.S=$(OBJDIR)/%.lst),-gstabs,--listing-cont-lines=100
|
||||||
|
|
||||||
|
|
||||||
#---------------- Library Options ----------------
|
#---------------- Library Options ----------------
|
||||||
# Minimalistic printf version
|
# Minimalistic printf version
|
||||||
PRINTF_LIB_MIN = -Wl,-u,vfprintf -lprintf_min
|
PRINTF_LIB_MIN = -Wl,-u,vfprintf -lprintf_min
|
||||||
|
|
||||||
# Floating point printf version (requires MATH_LIB = -lm below)
|
# Floating point printf version (requires MATH_LIB = -lm below)
|
||||||
PRINTF_LIB_FLOAT = -Wl,-u,vfprintf -lprintf_flt
|
PRINTF_LIB_FLOAT = -Wl,-u,vfprintf -lprintf_flt
|
||||||
|
|
||||||
# If this is left blank, then it will use the Standard printf version.
|
# If this is left blank, then it will use the Standard printf version.
|
||||||
PRINTF_LIB =
|
PRINTF_LIB =
|
||||||
#PRINTF_LIB = $(PRINTF_LIB_MIN)
|
#PRINTF_LIB = $(PRINTF_LIB_MIN)
|
||||||
#PRINTF_LIB = $(PRINTF_LIB_FLOAT)
|
#PRINTF_LIB = $(PRINTF_LIB_FLOAT)
|
||||||
|
|
||||||
|
|
||||||
# Minimalistic scanf version
|
# Minimalistic scanf version
|
||||||
SCANF_LIB_MIN = -Wl,-u,vfscanf -lscanf_min
|
SCANF_LIB_MIN = -Wl,-u,vfscanf -lscanf_min
|
||||||
|
|
||||||
# Floating point + %[ scanf version (requires MATH_LIB = -lm below)
|
# Floating point + %[ scanf version (requires MATH_LIB = -lm below)
|
||||||
SCANF_LIB_FLOAT = -Wl,-u,vfscanf -lscanf_flt
|
SCANF_LIB_FLOAT = -Wl,-u,vfscanf -lscanf_flt
|
||||||
|
|
||||||
# If this is left blank, then it will use the Standard scanf version.
|
# If this is left blank, then it will use the Standard scanf version.
|
||||||
SCANF_LIB =
|
SCANF_LIB =
|
||||||
#SCANF_LIB = $(SCANF_LIB_MIN)
|
#SCANF_LIB = $(SCANF_LIB_MIN)
|
||||||
#SCANF_LIB = $(SCANF_LIB_FLOAT)
|
#SCANF_LIB = $(SCANF_LIB_FLOAT)
|
||||||
|
|
||||||
|
|
||||||
MATH_LIB = -lm
|
MATH_LIB = -lm
|
||||||
|
|
||||||
|
|
||||||
# List any extra directories to look for libraries here.
|
# List any extra directories to look for libraries here.
|
||||||
# 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.
|
||||||
EXTRALIBDIRS =
|
EXTRALIBDIRS =
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#---------------- External Memory Options ----------------
|
#---------------- External Memory Options ----------------
|
||||||
|
|
||||||
# 64 KB of external RAM, starting after internal RAM (ATmega128!),
|
# 64 KB of external RAM, starting after internal RAM (ATmega128!),
|
||||||
# used for variables (.data/.bss) and heap (malloc()).
|
# used for variables (.data/.bss) and heap (malloc()).
|
||||||
#EXTMEMOPTS = -Wl,-Tdata=0x801100,--defsym=__heap_end=0x80ffff
|
#EXTMEMOPTS = -Wl,-Tdata=0x801100,--defsym=__heap_end=0x80ffff
|
||||||
|
|
||||||
# 64 KB of external RAM, starting after internal RAM (ATmega128!),
|
# 64 KB of external RAM, starting after internal RAM (ATmega128!),
|
||||||
# only used for heap (malloc()).
|
# only used for heap (malloc()).
|
||||||
#EXTMEMOPTS = -Wl,--section-start,.data=0x801100,--defsym=__heap_end=0x80ffff
|
#EXTMEMOPTS = -Wl,--section-start,.data=0x801100,--defsym=__heap_end=0x80ffff
|
||||||
|
|
||||||
EXTMEMOPTS =
|
EXTMEMOPTS =
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#---------------- Linker Options ----------------
|
#---------------- Linker Options ----------------
|
||||||
# -Wl,...: tell GCC to pass this to linker.
|
# -Wl,...: tell GCC to pass this to linker.
|
||||||
# -Map: create map file
|
# -Map: create map file
|
||||||
# --cref: add cross reference to map file
|
# --cref: add cross reference to map file
|
||||||
LDFLAGS = -Wl,-Map=$(TARGET).map,--cref
|
LDFLAGS = -Wl,-Map=$(TARGET).map,--cref
|
||||||
LDFLAGS += -Wl,--relax
|
LDFLAGS += -Wl,--relax
|
||||||
LDFLAGS += -Wl,--gc-sections
|
LDFLAGS += -Wl,--gc-sections
|
||||||
LDFLAGS += $(EXTMEMOPTS)
|
LDFLAGS += $(EXTMEMOPTS)
|
||||||
LDFLAGS += $(patsubst %,-L%,$(EXTRALIBDIRS))
|
LDFLAGS += $(patsubst %,-L%,$(EXTRALIBDIRS))
|
||||||
LDFLAGS += $(PRINTF_LIB) $(SCANF_LIB) $(MATH_LIB)
|
LDFLAGS += $(PRINTF_LIB) $(SCANF_LIB) $(MATH_LIB)
|
||||||
#LDFLAGS += -T linker_script.x
|
#LDFLAGS += -T linker_script.x
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#---------------- Programming Options (avrdude) ----------------
|
#---------------- Programming Options (avrdude) ----------------
|
||||||
|
|
||||||
# Programming hardware
|
# Programming hardware
|
||||||
# Type: avrdude -c ?
|
# Type: avrdude -c ?
|
||||||
# to get a full listing.
|
# to get a full listing.
|
||||||
#
|
#
|
||||||
AVRDUDE_PROGRAMMER = jtagmkII
|
AVRDUDE_PROGRAMMER = jtagmkII
|
||||||
|
|
||||||
# com1 = serial port. Use lpt1 to connect to parallel port.
|
# com1 = serial port. Use lpt1 to connect to parallel port.
|
||||||
AVRDUDE_PORT = usb
|
AVRDUDE_PORT = usb
|
||||||
|
|
||||||
AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex
|
AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex
|
||||||
#AVRDUDE_WRITE_EEPROM = -U eeprom:w:$(TARGET).eep
|
#AVRDUDE_WRITE_EEPROM = -U eeprom:w:$(TARGET).eep
|
||||||
|
|
||||||
|
|
||||||
# Uncomment the following if you want avrdude's erase cycle counter.
|
# Uncomment the following if you want avrdude's erase cycle counter.
|
||||||
# Note that this counter needs to be initialized first using -Yn,
|
# Note that this counter needs to be initialized first using -Yn,
|
||||||
# see avrdude manual.
|
# see avrdude manual.
|
||||||
#AVRDUDE_ERASE_COUNTER = -y
|
#AVRDUDE_ERASE_COUNTER = -y
|
||||||
|
|
||||||
# Uncomment the following if you do /not/ wish a verification to be
|
# Uncomment the following if you do /not/ wish a verification to be
|
||||||
# performed after programming the device.
|
# performed after programming the device.
|
||||||
#AVRDUDE_NO_VERIFY = -V
|
#AVRDUDE_NO_VERIFY = -V
|
||||||
|
|
||||||
# Increase verbosity level. Please use this when submitting bug
|
# Increase verbosity level. Please use this when submitting bug
|
||||||
# reports about avrdude. See <http://savannah.nongnu.org/projects/avrdude>
|
# reports about avrdude. See <http://savannah.nongnu.org/projects/avrdude>
|
||||||
# to submit bug reports.
|
# to submit bug reports.
|
||||||
#AVRDUDE_VERBOSE = -v -v
|
#AVRDUDE_VERBOSE = -v -v
|
||||||
|
|
||||||
AVRDUDE_FLAGS = -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER)
|
AVRDUDE_FLAGS = -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER)
|
||||||
AVRDUDE_FLAGS += $(AVRDUDE_NO_VERIFY)
|
AVRDUDE_FLAGS += $(AVRDUDE_NO_VERIFY)
|
||||||
AVRDUDE_FLAGS += $(AVRDUDE_VERBOSE)
|
AVRDUDE_FLAGS += $(AVRDUDE_VERBOSE)
|
||||||
AVRDUDE_FLAGS += $(AVRDUDE_ERASE_COUNTER)
|
AVRDUDE_FLAGS += $(AVRDUDE_ERASE_COUNTER)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#---------------- Debugging Options ----------------
|
#---------------- Debugging Options ----------------
|
||||||
|
|
||||||
# For simulavr only - target MCU frequency.
|
# For simulavr only - target MCU frequency.
|
||||||
DEBUG_MFREQ = $(F_CPU)
|
DEBUG_MFREQ = $(F_CPU)
|
||||||
|
|
||||||
# Set the DEBUG_UI to either gdb or insight.
|
# Set the DEBUG_UI to either gdb or insight.
|
||||||
# DEBUG_UI = gdb
|
# DEBUG_UI = gdb
|
||||||
DEBUG_UI = insight
|
DEBUG_UI = insight
|
||||||
|
|
||||||
# Set the debugging back-end to either avarice, simulavr.
|
# Set the debugging back-end to either avarice, simulavr.
|
||||||
DEBUG_BACKEND = avarice
|
DEBUG_BACKEND = avarice
|
||||||
#DEBUG_BACKEND = simulavr
|
#DEBUG_BACKEND = simulavr
|
||||||
|
|
||||||
# GDB Init Filename.
|
# GDB Init Filename.
|
||||||
GDBINIT_FILE = __avr_gdbinit
|
GDBINIT_FILE = __avr_gdbinit
|
||||||
|
|
||||||
# When using avarice settings for the JTAG
|
# When using avarice settings for the JTAG
|
||||||
JTAG_DEV = /dev/com1
|
JTAG_DEV = /dev/com1
|
||||||
|
|
||||||
# Debugging port used to communicate between GDB / avarice / simulavr.
|
# Debugging port used to communicate between GDB / avarice / simulavr.
|
||||||
DEBUG_PORT = 4242
|
DEBUG_PORT = 4242
|
||||||
|
|
||||||
# Debugging host used to communicate between GDB / avarice / simulavr, normally
|
# Debugging host used to communicate between GDB / avarice / simulavr, normally
|
||||||
# just set to localhost unless doing some sort of crazy debugging when
|
# just set to localhost unless doing some sort of crazy debugging when
|
||||||
# avarice is running on a different computer.
|
# avarice is running on a different computer.
|
||||||
DEBUG_HOST = localhost
|
DEBUG_HOST = localhost
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#============================================================================
|
#============================================================================
|
||||||
|
|
||||||
|
|
||||||
# Define programs and commands.
|
# Define programs and commands.
|
||||||
SHELL = sh
|
SHELL = sh
|
||||||
CC = avr-gcc
|
CC = avr-gcc
|
||||||
OBJCOPY = avr-objcopy
|
OBJCOPY = avr-objcopy
|
||||||
OBJDUMP = avr-objdump
|
OBJDUMP = avr-objdump
|
||||||
SIZE = avr-size
|
SIZE = avr-size
|
||||||
AR = avr-ar rcs
|
AR = avr-ar rcs
|
||||||
NM = avr-nm
|
NM = avr-nm
|
||||||
AVRDUDE = avrdude
|
AVRDUDE = avrdude
|
||||||
REMOVE = rm -f
|
REMOVE = rm -f
|
||||||
REMOVEDIR = rm -rf
|
REMOVEDIR = rm -rf
|
||||||
COPY = cp
|
COPY = cp
|
||||||
WINSHELL = cmd
|
WINSHELL = cmd
|
||||||
|
|
||||||
|
|
||||||
# Define Messages
|
# Define Messages
|
||||||
# English
|
# English
|
||||||
MSG_ERRORS_NONE = Errors: none
|
MSG_ERRORS_NONE = Errors: none
|
||||||
MSG_BEGIN = -------- begin --------
|
MSG_BEGIN = -------- begin --------
|
||||||
MSG_END = -------- end --------
|
MSG_END = -------- end --------
|
||||||
MSG_SIZE_BEFORE = Size before:
|
MSG_SIZE_BEFORE = Size before:
|
||||||
MSG_SIZE_AFTER = Size after:
|
MSG_SIZE_AFTER = Size after:
|
||||||
MSG_COFF = Converting to AVR COFF:
|
MSG_COFF = Converting to AVR COFF:
|
||||||
MSG_EXTENDED_COFF = Converting to AVR Extended COFF:
|
MSG_EXTENDED_COFF = Converting to AVR Extended COFF:
|
||||||
MSG_FLASH = Creating load file for Flash:
|
MSG_FLASH = Creating load file for Flash:
|
||||||
MSG_EEPROM = Creating load file for EEPROM:
|
MSG_EEPROM = Creating load file for EEPROM:
|
||||||
MSG_EXTENDED_LISTING = Creating Extended Listing:
|
MSG_EXTENDED_LISTING = Creating Extended Listing:
|
||||||
MSG_SYMBOL_TABLE = Creating Symbol Table:
|
MSG_SYMBOL_TABLE = Creating Symbol Table:
|
||||||
MSG_LINKING = Linking:
|
MSG_LINKING = Linking:
|
||||||
MSG_COMPILING = Compiling C:
|
MSG_COMPILING = Compiling C:
|
||||||
MSG_COMPILING_CPP = Compiling C++:
|
MSG_COMPILING_CPP = Compiling C++:
|
||||||
MSG_ASSEMBLING = Assembling:
|
MSG_ASSEMBLING = Assembling:
|
||||||
MSG_CLEANING = Cleaning project:
|
MSG_CLEANING = Cleaning project:
|
||||||
MSG_CREATING_LIBRARY = Creating library:
|
MSG_CREATING_LIBRARY = Creating library:
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Define all object files.
|
# Define all object files.
|
||||||
OBJ = $(SRC:%.c=$(OBJDIR)/%.o) $(CPPSRC:%.cpp=$(OBJDIR)/%.o) $(ASRC:%.S=$(OBJDIR)/%.o)
|
OBJ = $(SRC:%.c=$(OBJDIR)/%.o) $(CPPSRC:%.cpp=$(OBJDIR)/%.o) $(ASRC:%.S=$(OBJDIR)/%.o)
|
||||||
|
|
||||||
# Define all listing files.
|
# Define all listing files.
|
||||||
LST = $(SRC:%.c=$(OBJDIR)/%.lst) $(CPPSRC:%.cpp=$(OBJDIR)/%.lst) $(ASRC:%.S=$(OBJDIR)/%.lst)
|
LST = $(SRC:%.c=$(OBJDIR)/%.lst) $(CPPSRC:%.cpp=$(OBJDIR)/%.lst) $(ASRC:%.S=$(OBJDIR)/%.lst)
|
||||||
|
|
||||||
|
|
||||||
# Compiler flags to generate dependency files.
|
# Compiler flags to generate dependency files.
|
||||||
GENDEPFLAGS = -MMD -MP -MF .dep/$(@F).d
|
GENDEPFLAGS = -MMD -MP -MF .dep/$(@F).d
|
||||||
|
|
||||||
|
|
||||||
# Combine all necessary flags and optional flags.
|
# Combine all necessary flags and optional flags.
|
||||||
# Add target processor to flags.
|
# Add target processor to flags.
|
||||||
ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS) $(GENDEPFLAGS)
|
ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS) $(GENDEPFLAGS)
|
||||||
ALL_CPPFLAGS = -mmcu=$(MCU) -I. -x c++ $(CPPFLAGS) $(GENDEPFLAGS)
|
ALL_CPPFLAGS = -mmcu=$(MCU) -I. -x c++ $(CPPFLAGS) $(GENDEPFLAGS)
|
||||||
ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS)
|
ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Default target.
|
# Default target.
|
||||||
all: begin gccversion sizebefore build sizeafter end
|
all: begin gccversion sizebefore build sizeafter end
|
||||||
|
|
||||||
# Change the build target to build a HEX file or a library.
|
# Change the build target to build a HEX file or a library.
|
||||||
build: elf hex eep lss sym
|
build: elf hex eep lss sym
|
||||||
#build: lib
|
#build: lib
|
||||||
|
|
||||||
|
|
||||||
elf: $(TARGET).elf
|
elf: $(TARGET).elf
|
||||||
hex: $(TARGET).hex
|
hex: $(TARGET).hex
|
||||||
eep: $(TARGET).eep
|
eep: $(TARGET).eep
|
||||||
lss: $(TARGET).lss
|
lss: $(TARGET).lss
|
||||||
sym: $(TARGET).sym
|
sym: $(TARGET).sym
|
||||||
LIBNAME=lib$(TARGET).a
|
LIBNAME=lib$(TARGET).a
|
||||||
lib: $(LIBNAME)
|
lib: $(LIBNAME)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Eye candy.
|
# Eye candy.
|
||||||
# AVR Studio 3.x does not check make's exit code but relies on
|
# 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.
|
# the following magic strings to be generated by the compile job.
|
||||||
begin:
|
begin:
|
||||||
@echo
|
@echo
|
||||||
@echo $(MSG_BEGIN)
|
@echo $(MSG_BEGIN)
|
||||||
|
|
||||||
end:
|
end:
|
||||||
@echo $(MSG_END)
|
@echo $(MSG_END)
|
||||||
@echo
|
@echo
|
||||||
|
|
||||||
|
|
||||||
# Display size of file.
|
# Display size of file.
|
||||||
HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex
|
HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex
|
||||||
ELFSIZE = $(SIZE) $(MCU_FLAG) $(FORMAT_FLAG) $(TARGET).elf
|
ELFSIZE = $(SIZE) $(MCU_FLAG) $(FORMAT_FLAG) $(TARGET).elf
|
||||||
MCU_FLAG = $(shell $(SIZE) --help | grep -- --mcu > /dev/null && echo --mcu=$(MCU) )
|
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 )
|
FORMAT_FLAG = $(shell $(SIZE) --help | grep -- --format=.*avr > /dev/null && echo --format=avr )
|
||||||
|
|
||||||
|
|
||||||
sizebefore:
|
sizebefore:
|
||||||
@if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_BEFORE); $(ELFSIZE); \
|
@if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_BEFORE); $(ELFSIZE); \
|
||||||
2>/dev/null; echo; fi
|
2>/dev/null; echo; fi
|
||||||
|
|
||||||
sizeafter:
|
sizeafter:
|
||||||
@if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_AFTER); $(ELFSIZE); \
|
@if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_AFTER); $(ELFSIZE); \
|
||||||
2>/dev/null; echo; fi
|
2>/dev/null; echo; fi
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Display compiler version information.
|
# Display compiler version information.
|
||||||
gccversion :
|
gccversion :
|
||||||
@$(CC) --version
|
@$(CC) --version
|
||||||
|
|
||||||
|
|
||||||
# Program the device.
|
# Program the device.
|
||||||
program: $(TARGET).hex $(TARGET).eep
|
program: $(TARGET).hex $(TARGET).eep
|
||||||
$(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM)
|
$(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM)
|
||||||
|
|
||||||
flip: $(TARGET).hex
|
flip: $(TARGET).hex
|
||||||
batchisp -hardware usb -device $(MCU) -operation erase f
|
batchisp -hardware usb -device $(MCU) -operation erase f
|
||||||
batchisp -hardware usb -device $(MCU) -operation loadbuffer $(TARGET).hex program
|
batchisp -hardware usb -device $(MCU) -operation loadbuffer $(TARGET).hex program
|
||||||
batchisp -hardware usb -device $(MCU) -operation start reset 0
|
batchisp -hardware usb -device $(MCU) -operation start reset 0
|
||||||
|
|
||||||
dfu: $(TARGET).hex
|
dfu: $(TARGET).hex
|
||||||
dfu-programmer $(MCU) erase
|
dfu-programmer $(MCU) erase
|
||||||
dfu-programmer $(MCU) flash $(TARGET).hex
|
dfu-programmer $(MCU) flash $(TARGET).hex
|
||||||
dfu-programmer $(MCU) reset
|
dfu-programmer $(MCU) reset
|
||||||
|
|
||||||
flip-ee: $(TARGET).hex $(TARGET).eep
|
flip-ee: $(TARGET).hex $(TARGET).eep
|
||||||
$(COPY) $(TARGET).eep $(TARGET)eep.hex
|
$(COPY) $(TARGET).eep $(TARGET)eep.hex
|
||||||
batchisp -hardware usb -device $(MCU) -operation memory EEPROM erase
|
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 memory EEPROM loadbuffer $(TARGET)eep.hex program
|
||||||
batchisp -hardware usb -device $(MCU) -operation start reset 0
|
batchisp -hardware usb -device $(MCU) -operation start reset 0
|
||||||
$(REMOVE) $(TARGET)eep.hex
|
$(REMOVE) $(TARGET)eep.hex
|
||||||
|
|
||||||
dfu-ee: $(TARGET).hex $(TARGET).eep
|
dfu-ee: $(TARGET).hex $(TARGET).eep
|
||||||
dfu-programmer $(MCU) eeprom-flash $(TARGET).eep
|
dfu-programmer $(MCU) eeprom-flash $(TARGET).eep
|
||||||
dfu-programmer $(MCU) reset
|
dfu-programmer $(MCU) reset
|
||||||
|
|
||||||
|
|
||||||
# Generate avr-gdb config/init file which does the following:
|
# Generate avr-gdb config/init file which does the following:
|
||||||
# define the reset signal, load the target file, connect to target, and set
|
# define the reset signal, load the target file, connect to target, and set
|
||||||
# a breakpoint at main().
|
# a breakpoint at main().
|
||||||
gdb-config:
|
gdb-config:
|
||||||
@$(REMOVE) $(GDBINIT_FILE)
|
@$(REMOVE) $(GDBINIT_FILE)
|
||||||
@echo define reset >> $(GDBINIT_FILE)
|
@echo define reset >> $(GDBINIT_FILE)
|
||||||
@echo SIGNAL SIGHUP >> $(GDBINIT_FILE)
|
@echo SIGNAL SIGHUP >> $(GDBINIT_FILE)
|
||||||
@echo end >> $(GDBINIT_FILE)
|
@echo end >> $(GDBINIT_FILE)
|
||||||
@echo file $(TARGET).elf >> $(GDBINIT_FILE)
|
@echo file $(TARGET).elf >> $(GDBINIT_FILE)
|
||||||
@echo target remote $(DEBUG_HOST):$(DEBUG_PORT) >> $(GDBINIT_FILE)
|
@echo target remote $(DEBUG_HOST):$(DEBUG_PORT) >> $(GDBINIT_FILE)
|
||||||
ifeq ($(DEBUG_BACKEND),simulavr)
|
ifeq ($(DEBUG_BACKEND),simulavr)
|
||||||
@echo load >> $(GDBINIT_FILE)
|
@echo load >> $(GDBINIT_FILE)
|
||||||
endif
|
endif
|
||||||
@echo break main >> $(GDBINIT_FILE)
|
@echo break main >> $(GDBINIT_FILE)
|
||||||
|
|
||||||
debug: gdb-config $(TARGET).elf
|
debug: gdb-config $(TARGET).elf
|
||||||
ifeq ($(DEBUG_BACKEND), avarice)
|
ifeq ($(DEBUG_BACKEND), avarice)
|
||||||
@echo Starting AVaRICE - Press enter when "waiting to connect" message displays.
|
@echo Starting AVaRICE - Press enter when "waiting to connect" message displays.
|
||||||
@$(WINSHELL) /c start avarice --jtag $(JTAG_DEV) --erase --program --file \
|
@$(WINSHELL) /c start avarice --jtag $(JTAG_DEV) --erase --program --file \
|
||||||
$(TARGET).elf $(DEBUG_HOST):$(DEBUG_PORT)
|
$(TARGET).elf $(DEBUG_HOST):$(DEBUG_PORT)
|
||||||
@$(WINSHELL) /c pause
|
@$(WINSHELL) /c pause
|
||||||
|
|
||||||
else
|
else
|
||||||
@$(WINSHELL) /c start simulavr --gdbserver --device $(MCU) --clock-freq \
|
@$(WINSHELL) /c start simulavr --gdbserver --device $(MCU) --clock-freq \
|
||||||
$(DEBUG_MFREQ) --port $(DEBUG_PORT)
|
$(DEBUG_MFREQ) --port $(DEBUG_PORT)
|
||||||
endif
|
endif
|
||||||
@$(WINSHELL) /c start avr-$(DEBUG_UI) --command=$(GDBINIT_FILE)
|
@$(WINSHELL) /c start avr-$(DEBUG_UI) --command=$(GDBINIT_FILE)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Convert ELF to COFF for use in debugging / simulating in AVR Studio or VMLAB.
|
# Convert ELF to COFF for use in debugging / simulating in AVR Studio or VMLAB.
|
||||||
COFFCONVERT = $(OBJCOPY) --debugging
|
COFFCONVERT = $(OBJCOPY) --debugging
|
||||||
COFFCONVERT += --change-section-address .data-0x800000
|
COFFCONVERT += --change-section-address .data-0x800000
|
||||||
COFFCONVERT += --change-section-address .bss-0x800000
|
COFFCONVERT += --change-section-address .bss-0x800000
|
||||||
COFFCONVERT += --change-section-address .noinit-0x800000
|
COFFCONVERT += --change-section-address .noinit-0x800000
|
||||||
COFFCONVERT += --change-section-address .eeprom-0x810000
|
COFFCONVERT += --change-section-address .eeprom-0x810000
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
coff: $(TARGET).elf
|
coff: $(TARGET).elf
|
||||||
@echo
|
@echo
|
||||||
@echo $(MSG_COFF) $(TARGET).cof
|
@echo $(MSG_COFF) $(TARGET).cof
|
||||||
$(COFFCONVERT) -O coff-avr $< $(TARGET).cof
|
$(COFFCONVERT) -O coff-avr $< $(TARGET).cof
|
||||||
|
|
||||||
|
|
||||||
extcoff: $(TARGET).elf
|
extcoff: $(TARGET).elf
|
||||||
@echo
|
@echo
|
||||||
@echo $(MSG_EXTENDED_COFF) $(TARGET).cof
|
@echo $(MSG_EXTENDED_COFF) $(TARGET).cof
|
||||||
$(COFFCONVERT) -O coff-ext-avr $< $(TARGET).cof
|
$(COFFCONVERT) -O coff-ext-avr $< $(TARGET).cof
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Create final output files (.hex, .eep) from ELF output file.
|
# Create final output files (.hex, .eep) from ELF output file.
|
||||||
%.hex: %.elf
|
%.hex: %.elf
|
||||||
@echo
|
@echo
|
||||||
@echo $(MSG_FLASH) $@
|
@echo $(MSG_FLASH) $@
|
||||||
$(OBJCOPY) -O $(FORMAT) -R .eeprom -R .fuse -R .lock $< $@
|
$(OBJCOPY) -O $(FORMAT) -R .eeprom -R .fuse -R .lock $< $@
|
||||||
|
|
||||||
%.eep: %.elf
|
%.eep: %.elf
|
||||||
@echo
|
@echo
|
||||||
@echo $(MSG_EEPROM) $@
|
@echo $(MSG_EEPROM) $@
|
||||||
-$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \
|
-$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \
|
||||||
--change-section-lma .eeprom=0 --no-change-warnings -O $(FORMAT) $< $@ || exit 0
|
--change-section-lma .eeprom=0 --no-change-warnings -O $(FORMAT) $< $@ || exit 0
|
||||||
|
|
||||||
# Create extended listing file from ELF output file.
|
# Create extended listing file from ELF output file.
|
||||||
%.lss: %.elf
|
%.lss: %.elf
|
||||||
@echo
|
@echo
|
||||||
@echo $(MSG_EXTENDED_LISTING) $@
|
@echo $(MSG_EXTENDED_LISTING) $@
|
||||||
$(OBJDUMP) -h -S -z $< > $@
|
$(OBJDUMP) -h -S -z $< > $@
|
||||||
|
|
||||||
# Create a symbol table from ELF output file.
|
# Create a symbol table from ELF output file.
|
||||||
%.sym: %.elf
|
%.sym: %.elf
|
||||||
@echo
|
@echo
|
||||||
@echo $(MSG_SYMBOL_TABLE) $@
|
@echo $(MSG_SYMBOL_TABLE) $@
|
||||||
$(NM) -n $< > $@
|
$(NM) -n $< > $@
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Create library from object files.
|
# Create library from object files.
|
||||||
.SECONDARY : $(TARGET).a
|
.SECONDARY : $(TARGET).a
|
||||||
.PRECIOUS : $(OBJ)
|
.PRECIOUS : $(OBJ)
|
||||||
%.a: $(OBJ)
|
%.a: $(OBJ)
|
||||||
@echo
|
@echo
|
||||||
@echo $(MSG_CREATING_LIBRARY) $@
|
@echo $(MSG_CREATING_LIBRARY) $@
|
||||||
$(AR) $@ $(OBJ)
|
$(AR) $@ $(OBJ)
|
||||||
|
|
||||||
|
|
||||||
# Link: create ELF output file from object files.
|
# Link: create ELF output file from object files.
|
||||||
.SECONDARY : $(TARGET).elf
|
.SECONDARY : $(TARGET).elf
|
||||||
.PRECIOUS : $(OBJ)
|
.PRECIOUS : $(OBJ)
|
||||||
%.elf: $(OBJ)
|
%.elf: $(OBJ)
|
||||||
@echo
|
@echo
|
||||||
@echo $(MSG_LINKING) $@
|
@echo $(MSG_LINKING) $@
|
||||||
$(CC) $(ALL_CFLAGS) $^ --output $@ $(LDFLAGS)
|
$(CC) $(ALL_CFLAGS) $^ --output $@ $(LDFLAGS)
|
||||||
|
|
||||||
|
|
||||||
# Compile: create object files from C source files.
|
# Compile: create object files from C source files.
|
||||||
$(OBJDIR)/%.o : %.c
|
$(OBJDIR)/%.o : %.c
|
||||||
@echo
|
@echo
|
||||||
@echo $(MSG_COMPILING) $<
|
@echo $(MSG_COMPILING) $<
|
||||||
$(CC) -c $(ALL_CFLAGS) $< -o $@
|
$(CC) -c $(ALL_CFLAGS) $< -o $@
|
||||||
|
|
||||||
|
|
||||||
# Compile: create object files from C++ source files.
|
# Compile: create object files from C++ source files.
|
||||||
$(OBJDIR)/%.o : %.cpp
|
$(OBJDIR)/%.o : %.cpp
|
||||||
@echo
|
@echo
|
||||||
@echo $(MSG_COMPILING_CPP) $<
|
@echo $(MSG_COMPILING_CPP) $<
|
||||||
$(CC) -c $(ALL_CPPFLAGS) $< -o $@
|
$(CC) -c $(ALL_CPPFLAGS) $< -o $@
|
||||||
|
|
||||||
|
|
||||||
# Compile: create assembler files from C source files.
|
# Compile: create assembler files from C source files.
|
||||||
%.s : %.c
|
%.s : %.c
|
||||||
$(CC) -S $(ALL_CFLAGS) $< -o $@
|
$(CC) -S $(ALL_CFLAGS) $< -o $@
|
||||||
|
|
||||||
|
|
||||||
# Compile: create assembler files from C++ source files.
|
# Compile: create assembler files from C++ source files.
|
||||||
%.s : %.cpp
|
%.s : %.cpp
|
||||||
$(CC) -S $(ALL_CPPFLAGS) $< -o $@
|
$(CC) -S $(ALL_CPPFLAGS) $< -o $@
|
||||||
|
|
||||||
|
|
||||||
# Assemble: create object files from assembler source files.
|
# Assemble: create object files from assembler source files.
|
||||||
$(OBJDIR)/%.o : %.S
|
$(OBJDIR)/%.o : %.S
|
||||||
@echo
|
@echo
|
||||||
@echo $(MSG_ASSEMBLING) $<
|
@echo $(MSG_ASSEMBLING) $<
|
||||||
$(CC) -c $(ALL_ASFLAGS) $< -o $@
|
$(CC) -c $(ALL_ASFLAGS) $< -o $@
|
||||||
|
|
||||||
|
|
||||||
# Create preprocessed source for use in sending a bug report.
|
# Create preprocessed source for use in sending a bug report.
|
||||||
%.i : %.c
|
%.i : %.c
|
||||||
$(CC) -E -mmcu=$(MCU) -I. $(CFLAGS) $< -o $@
|
$(CC) -E -mmcu=$(MCU) -I. $(CFLAGS) $< -o $@
|
||||||
|
|
||||||
|
|
||||||
# Target: clean project.
|
# Target: clean project.
|
||||||
clean: begin clean_list end
|
clean: begin clean_list end
|
||||||
|
|
||||||
clean_list :
|
clean_list :
|
||||||
@echo
|
@echo
|
||||||
@echo $(MSG_CLEANING)
|
@echo $(MSG_CLEANING)
|
||||||
$(REMOVE) $(TARGET).hex
|
$(REMOVE) $(TARGET).hex
|
||||||
$(REMOVE) $(TARGET).eep
|
$(REMOVE) $(TARGET).eep
|
||||||
$(REMOVE) $(TARGET).cof
|
$(REMOVE) $(TARGET).cof
|
||||||
$(REMOVE) $(TARGET).elf
|
$(REMOVE) $(TARGET).elf
|
||||||
$(REMOVE) $(TARGET).map
|
$(REMOVE) $(TARGET).map
|
||||||
$(REMOVE) $(TARGET).sym
|
$(REMOVE) $(TARGET).sym
|
||||||
$(REMOVE) $(TARGET).lss
|
$(REMOVE) $(TARGET).lss
|
||||||
$(REMOVE) $(SRC:%.c=$(OBJDIR)/%.o) $(CPPSRC:%.cpp=$(OBJDIR)/%.o) $(ASRC:%.S=$(OBJDIR)/%.o)
|
$(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=$(OBJDIR)/%.lst) $(CPPSRC:%.cpp=$(OBJDIR)/%.lst) $(ASRC:%.S=$(OBJDIR)/%.lst)
|
||||||
$(REMOVE) $(SRC:.c=.s)
|
$(REMOVE) $(SRC:.c=.s)
|
||||||
$(REMOVE) $(SRC:.c=.d)
|
$(REMOVE) $(SRC:.c=.d)
|
||||||
$(REMOVE) $(SRC:.c=.i)
|
$(REMOVE) $(SRC:.c=.i)
|
||||||
$(REMOVEDIR) .dep
|
$(REMOVEDIR) .dep
|
||||||
|
|
||||||
doxygen:
|
doxygen:
|
||||||
@echo Generating Project Documentation...
|
@echo Generating Project Documentation...
|
||||||
@doxygen Doxygen.conf
|
@doxygen Doxygen.conf
|
||||||
@echo Documentation Generation Complete.
|
@echo Documentation Generation Complete.
|
||||||
|
|
||||||
clean_doxygen:
|
clean_doxygen:
|
||||||
rm -rf Documentation
|
rm -rf Documentation
|
||||||
|
|
||||||
# Create object files directory
|
# Create object files directory
|
||||||
$(shell mkdir $(OBJDIR) 2>/dev/null)
|
$(shell mkdir $(OBJDIR) 2>/dev/null)
|
||||||
|
|
||||||
|
|
||||||
# Include the dependency files.
|
# Include the dependency files.
|
||||||
-include $(shell mkdir .dep 2>/dev/null) $(wildcard .dep/*)
|
-include $(shell mkdir .dep 2>/dev/null) $(wildcard .dep/*)
|
||||||
|
|
||||||
|
|
||||||
# Listing of phony targets.
|
# Listing of phony targets.
|
||||||
.PHONY : all begin finish end sizebefore sizeafter gccversion \
|
.PHONY : all begin finish end sizebefore sizeafter gccversion \
|
||||||
build elf hex eep lss sym coff extcoff doxygen clean \
|
build elf hex eep lss sym coff extcoff doxygen clean \
|
||||||
clean_list clean_doxygen program dfu flip flip-ee dfu-ee \
|
clean_list clean_doxygen program dfu flip flip-ee dfu-ee \
|
||||||
debug gdb-config
|
debug gdb-config
|
||||||
|
|
||||||
|
Loading…
Reference in new issue