From b9b03aadb219d06fbad9d110e508db93e45461af Mon Sep 17 00:00:00 2001 From: Dean Camera Date: Fri, 5 Jun 2009 07:16:33 +0000 Subject: Move new Class Driver powered demos to a new ClassDriver subdirectory, re-add old low level demos to a LowLevel subdirectory. --- Demos/Device/ClassDriver/AudioInput/AudioInput.c | 144 +++++++++++++++++++++++ 1 file changed, 144 insertions(+) create mode 100644 Demos/Device/ClassDriver/AudioInput/AudioInput.c (limited to 'Demos/Device/ClassDriver/AudioInput/AudioInput.c') diff --git a/Demos/Device/ClassDriver/AudioInput/AudioInput.c b/Demos/Device/ClassDriver/AudioInput/AudioInput.c new file mode 100644 index 0000000000..93ffe0bf45 --- /dev/null +++ b/Demos/Device/ClassDriver/AudioInput/AudioInput.c @@ -0,0 +1,144 @@ +/* + LUFA Library + Copyright (C) Dean Camera, 2009. + + dean [at] fourwalledcubicle [dot] com + www.fourwalledcubicle.com +*/ + +/* + Copyright 2009 Dean Camera (dean [at] fourwalledcubicle [dot] com) + + Permission to use, copy, modify, and distribute this software + and its documentation for any purpose and without fee is hereby + granted, provided that the above copyright notice appear in all + copies and that both that the copyright notice and this + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the + software without specific, written prior permission. + + The author disclaim all warranties with regard to this + software, including all implied warranties of merchantability + and fitness. In no event shall the author be liable for any + special, indirect or consequential damages or any damages + whatsoever resulting from loss of use, data or profits, whether + in an action of contract, negligence or other tortious action, + arising out of or in connection with the use or performance of + this software. +*/ + +/** \file + * + * Main source file for the AudioInput demo. This file contains the main tasks of + * the demo and is responsible for the initial application hardware configuration. + */ + +#include "AudioInput.h" + +/** 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 + * within a device can be differentiated from one another. + */ +USB_ClassInfo_Audio_t Microphone_Audio_Interface = + { + .StreamingInterfaceNumber = 1, + + .DataINEndpointNumber = AUDIO_STREAM_EPNUM, + .DataINEndpointSize = AUDIO_STREAM_EPSIZE, + }; + +/** Main program entry point. This routine contains the overall program flow, including initial + * setup of all components and the main program loop. + */ +int main(void) +{ + SetupHardware(); + + LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY); + + for (;;) + { + if (Microphone_Audio_Interface.InterfaceEnabled) + ProcessNextSample(); + + USB_Audio_USBTask(&Microphone_Audio_Interface); + USB_USBTask(); + } +} + +/** Configures the board hardware and chip peripherals for the demo's functionality. */ +void SetupHardware(void) +{ + /* Disable watchdog if enabled by bootloader/fuses */ + MCUSR &= ~(1 << WDRF); + wdt_disable(); + + /* Disable clock division */ + clock_prescale_set(clock_div_1); + + /* Hardware Initialization */ + LEDs_Init(); + USB_Init(); + ADC_Init(ADC_FREE_RUNNING | ADC_PRESCALE_32); + ADC_SetupChannel(MIC_IN_ADC_CHANNEL); + + /* Start the ADC conversion in free running mode */ + ADC_StartReading(ADC_REFERENCE_AVCC | ADC_RIGHT_ADJUSTED | MIC_IN_ADC_CHANNEL); +} + +/** Processes the next audio sample by reading the last ADC conversion and writing it to the audio + * interface, each time the sample reload timer period elapses to give a constant sample rate. + */ +void ProcessNextSample(void) +{ + if ((TIFR0 & (1 << OCF0A)) && USB_Audio_IsReadyForNextSample(&Microphone_Audio_Interface)) + { + TIFR0 |= (1 << OCF0A); + + /* Audio sample is ADC value scaled to fit the entire range */ + int16_t AudioSample = ((SAMPLE_MAX_RANGE / ADC_MAX_RANGE) * ADC_GetResult()); + +#if defined(MICROPHONE_BIASED_TO_HALF_RAIL) + /* Microphone is biased to half rail voltage, subtract the bias from the sample value */ + AudioSample -= (SAMPLE_MAX_RANGE / 2)); +#endif + + USB_Audio_WriteSample16(AudioSample); + } +} + +/** Event handler for the library USB Connection event. */ +void EVENT_USB_Connect(void) +{ + LEDs_SetAllLEDs(LEDMASK_USB_ENUMERATING); + + /* Sample reload timer initialization */ + OCR0A = (F_CPU / AUDIO_SAMPLE_FREQUENCY) - 1; + TCCR0A = (1 << WGM01); // CTC mode + TCCR0B = (1 << CS00); // Fcpu speed +} + +/** Event handler for the library USB Disconnection event. */ +void EVENT_USB_Disconnect(void) +{ + /* Stop the sample reload timer */ + TCCR0B = 0; + + LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY); +} + +/** Event handler for the library USB Configuration Changed event. */ +void EVENT_USB_ConfigurationChanged(void) +{ + LEDs_SetAllLEDs(LEDMASK_USB_READY); + + if (!(USB_Audio_ConfigureEndpoints(&Microphone_Audio_Interface))) + LEDs_SetAllLEDs(LEDMASK_USB_ERROR); +} + +/** Event handler for the library USB Unhandled Control Packet event. */ +void EVENT_USB_UnhandledControlPacket(void) +{ + USB_Audio_ProcessControlPacket(&Microphone_Audio_Interface); +} -- cgit v1.2.3