From 88051e78a281f5776538558aec113ff2b66e056c Mon Sep 17 00:00:00 2001 From: Dean Camera Date: Thu, 19 Mar 2009 14:16:12 +0000 Subject: [PATCH] Combined Mouse, MouseViaInt and MouseFullInt demos into a single unified demo. Corrections to Keyboard demo. Removed AVRISP_Programmer project due to code quality concerns. --- Bootloaders/CDC/BootloaderCDC.txt | 38 +- Bootloaders/DFU/BootloaderDFU.txt | 69 +- Bootloaders/TeensyHID/TeensyHID.h | 4 +- Bootloaders/TeensyHID/TeensyHID.txt | 36 +- Demos/AudioInput/AudioInput.c | 4 - Demos/AudioInput/AudioInput.txt | 52 +- Demos/AudioOutput/AudioOutput.c | 7 - Demos/AudioOutput/AudioOutput.txt | 68 +- Demos/AudioOutput/makefile | 2 +- Demos/CDC/CDC.txt | 44 +- Demos/CDCHost/CDCHost.txt | 39 +- Demos/DualCDC/DualCDC.txt | 60 +- Demos/Joystick/Joystick.txt | 42 +- Demos/Keyboard/Keyboard.c | 14 + Demos/Keyboard/Keyboard.txt | 1 + Demos/KeyboardHost/KeyboardHost.txt | 48 +- Demos/KeyboardHostViaInt/KeyboardHostViaInt.h | 2 +- .../KeyboardHostViaInt/KeyboardHostViaInt.txt | 52 +- .../KeyboardHostWithParser.txt | 44 +- Demos/KeyboardMouse/KeyboardMouse.txt | 50 +- Demos/MIDI/MIDI.txt | 47 +- Demos/MassStorage/MassStorage.h | 5 +- Demos/MassStorage/MassStorage.txt | 62 +- Demos/MassStorageHost/MassStorageHost.txt | 36 +- Demos/Mouse/Mouse.c | 149 +- Demos/Mouse/Mouse.h | 5 +- Demos/Mouse/Mouse.txt | 54 +- Demos/Mouse/makefile | 1 - Demos/MouseHost/MouseHost.txt | 50 +- Demos/MouseHostViaInt/MouseHostViaInt.txt | 54 +- .../MouseHostWithParser.txt | 44 +- Demos/RNDISEthernet/RNDISEthernet.txt | 55 +- Demos/StillImageHost/StillImageHost.txt | 34 +- Demos/TestApp/TestApp.txt | 54 +- Demos/USBtoSerial/USBtoSerial.txt | 49 +- Demos/makefile | 8 - LUFA.pnproj | 2 +- LUFA/ChangeLog.txt | 4 +- .../AVRISP_Firmware_Design.txt | 176 -- .../AVRISP_Programmer/AVRISP_Programmer.aps | 1 - .../AVRISP_Programmer/AVRISP_Programmer.c | 763 --------- .../AVRISP_Programmer/AVRISP_Programmer.h | 195 --- .../AVRISP_Programmer/AVRISP_Programmer.txt | 89 - .../AVRISP_Programmer_Picture.jpg | Bin 74610 -> 0 bytes Projects/AVRISP_Programmer/Descriptors.c | 263 --- Projects/AVRISP_Programmer/Descriptors.h | 98 -- Projects/AVRISP_Programmer/Doxygen.conf | 1485 ----------------- .../LUFA AVRISP_Programmer.inf | 55 - Projects/AVRISP_Programmer/RingBuff.c | 120 -- Projects/AVRISP_Programmer/RingBuff.h | 116 -- .../Sample_Programming_Session.txt | 104 -- Projects/AVRISP_Programmer/makefile | 726 -------- Projects/Magstripe/Magstripe.txt | 72 +- Projects/makefile | 4 - 54 files changed, 1043 insertions(+), 4613 deletions(-) delete mode 100644 Projects/AVRISP_Programmer/AVRISP_Firmware_Design.txt delete mode 100644 Projects/AVRISP_Programmer/AVRISP_Programmer.aps delete mode 100644 Projects/AVRISP_Programmer/AVRISP_Programmer.c delete mode 100644 Projects/AVRISP_Programmer/AVRISP_Programmer.h delete mode 100644 Projects/AVRISP_Programmer/AVRISP_Programmer.txt delete mode 100644 Projects/AVRISP_Programmer/AVRISP_Programmer_Picture.jpg delete mode 100644 Projects/AVRISP_Programmer/Descriptors.c delete mode 100644 Projects/AVRISP_Programmer/Descriptors.h delete mode 100644 Projects/AVRISP_Programmer/Doxygen.conf delete mode 100644 Projects/AVRISP_Programmer/LUFA AVRISP_Programmer.inf delete mode 100644 Projects/AVRISP_Programmer/RingBuff.c delete mode 100644 Projects/AVRISP_Programmer/RingBuff.h delete mode 100644 Projects/AVRISP_Programmer/Sample_Programming_Session.txt delete mode 100644 Projects/AVRISP_Programmer/makefile diff --git a/Bootloaders/CDC/BootloaderCDC.txt b/Bootloaders/CDC/BootloaderCDC.txt index cb6f9f01f1..1f8970d57e 100644 --- a/Bootloaders/CDC/BootloaderCDC.txt +++ b/Bootloaders/CDC/BootloaderCDC.txt @@ -5,15 +5,10 @@ */ /** \mainpage CDC Class USB AVR Bootloader - * - * This bootloader enumerates to the host as a CDC Class device (virtual serial port), allowing for AVR109 - * protocol compatible programming software to load firmware onto the AVR. - * - * Out of the box this bootloader builds for the USB1287, and will fit into 4KB of bootloader space. If - * you wish to enlarge this space and/or change the AVR model, you will need to edit the BOOT_START and MCU - * values in the accompanying makefile. - * - * This bootloader is compatible with the open source application AVRDUDE, or Atmel's AVRPROG. + * + * \section SSec_Info USB Information: + * + * The following table gives a rundown of the USB utilization of this demo. * * * @@ -37,4 +32,27 @@ * * *
Full Speed Mode
- */ + * + * \section SSec_Description Project Description: + * + * This bootloader enumerates to the host as a CDC Class device (virtual serial port), allowing for AVR109 + * protocol compatible programming software to load firmware onto the AVR. + * + * Out of the box this bootloader builds for the USB1287, and will fit into 4KB of bootloader space. If + * you wish to enlarge this space and/or change the AVR model, you will need to edit the BOOT_START and MCU + * values in the accompanying makefile. + * + * This bootloader is compatible with the open source application AVRDUDE, or Atmel's AVRPROG. + * + * \section SSec_Options Project Options + * + * The following defines can be found in this demo, which can control the demo behaviour when defined, or changed in value. + * + * + * + * + * + *
+ * None + *
+ */ \ No newline at end of file diff --git a/Bootloaders/DFU/BootloaderDFU.txt b/Bootloaders/DFU/BootloaderDFU.txt index 091ce40839..7107cc1232 100644 --- a/Bootloaders/DFU/BootloaderDFU.txt +++ b/Bootloaders/DFU/BootloaderDFU.txt @@ -5,27 +5,10 @@ */ /** \mainpage DFU Class USB AVR Bootloader - * - * This bootloader enumerates to the host as a DFU Class device, allowing for DFU-compatible programming - * software to load firmware onto the AVR. - * - * This bootloader is compatible with Atmel's FLIP application. However, it requires the use of Atmel's - * DFU drivers. You will need to install Atmel's DFU drivers prior to using this bootloader. - * - * As an open-source option, this bootloader is also compatible with the Linux Atmel USB DFU Programmer - * software, available for download at http://sourceforge.net/projects/dfu-programmer/. - * - * If SECURE_MODE is defined as true, upon startup the bootloader will be locked, with only the chip erase - * function available (similar to Atmel's DFU bootloader). If SECURE_MODE is defined as false, all functions - * are usable on startup without the prerequisite firmware erase. - * - * Out of the box this bootloader builds for the USB1287, and should fit into 4KB of bootloader space. If - * you wish to enlarge this space and/or change the AVR model, you will need to edit the BOOT_START and MCU - * values in the accompanying makefile. - * - * NOTE: This device spoofs Atmel's DFU Bootloader USB VID and PID so that the Atmel DFU bootloader - * drivers included with FLIP will work. If you do not wish to use Atmel's ID codes, please - * manually change them in Descriptors.c and alter your driver's INF file accordingly. + * + * \section SSec_Info USB Information: + * + * The following table gives a rundown of the USB utilization of this demo. * * * @@ -49,4 +32,46 @@ * * *
Full Speed Mode
- */ + * + * \section SSec_Description Project Description: + * + * This bootloader enumerates to the host as a DFU Class device, allowing for DFU-compatible programming + * software to load firmware onto the AVR. + * + * This bootloader is compatible with Atmel's FLIP application. However, it requires the use of Atmel's + * DFU drivers. You will need to install Atmel's DFU drivers prior to using this bootloader. + * + * As an open-source option, this bootloader is also compatible with the Linux Atmel USB DFU Programmer + * software, available for download at http://sourceforge.net/projects/dfu-programmer/. + * + * If SECURE_MODE is defined as true, upon startup the bootloader will be locked, with only the chip erase + * function available (similar to Atmel's DFU bootloader). If SECURE_MODE is defined as false, all functions + * are usable on startup without the prerequisite firmware erase. + * + * Out of the box this bootloader builds for the USB1287, and should fit into 4KB of bootloader space. If + * you wish to enlarge this space and/or change the AVR model, you will need to edit the BOOT_START and MCU + * values in the accompanying makefile. + * + * NOTE: This device spoofs Atmel's DFU Bootloader USB VID and PID so that the Atmel DFU bootloader + * drivers included with FLIP will work. If you do not wish to use Atmel's ID codes, please + * manually change them in Descriptors.c and alter your driver's INF file accordingly. + * + * \section SSec_Options Project Options + * + * The following defines can be found in this demo, which can control the demo behaviour when defined, or changed in value. + * + * + * + * + * + * + * + * + * + * + * + * + *
Define Name:Location:Description:
SECURE_MODEBootloaderDFU.hIf defined to true, the bootloader will not accept any memory commands other than a chip erase on statup, until an + * erase has been perfomed. This can be used in conjunction with the AVR's lockbits to prevent the AVRs firmware from + * being dumped by unauthorized persons.
+ */ \ No newline at end of file diff --git a/Bootloaders/TeensyHID/TeensyHID.h b/Bootloaders/TeensyHID/TeensyHID.h index a4773f8f54..ae180f7781 100644 --- a/Bootloaders/TeensyHID/TeensyHID.h +++ b/Bootloaders/TeensyHID/TeensyHID.h @@ -57,9 +57,9 @@ /* Macros: */ /** HID Class specific request to send the next HID report to the device. */ - #define REQ_SetReport 0x09 + #define REQ_SetReport 0x09 - #define TEENSY_STARTAPPLICATION 0xFFFF + #define TEENSY_STARTAPPLICATION 0xFFFF /* Event Handlers: */ /** Indicates that this module will catch the USB_Disconnect event when thrown by the library. */ diff --git a/Bootloaders/TeensyHID/TeensyHID.txt b/Bootloaders/TeensyHID/TeensyHID.txt index 973819cf87..1d83510d89 100644 --- a/Bootloaders/TeensyHID/TeensyHID.txt +++ b/Bootloaders/TeensyHID/TeensyHID.txt @@ -5,15 +5,11 @@ */ /** \mainpage Teensy HID Class USB AVR Bootloader - * - * This bootloader enumerates to the host as a HID Class device, allowing for Teensy compatible programming - * software to load firmware onto the AVR, such as the official software at http://www.pjrc.com/teensy/. - * - * Out of the box this bootloader builds for the USB162, and will fit into 2KB of bootloader space. * - * This spoofs (with permission) the offical Teensy bootloader's VID and PID, so that the software remains - * compatible with no changes. - * + * \section SSec_Info USB Information: + * + * The following table gives a rundown of the USB utilization of this demo. + * * * * @@ -38,4 +34,26 @@ * * *
USB Mode:Full Speed Mode
- */ + * + * \section SSec_Description Project Description: + * + * This bootloader enumerates to the host as a HID Class device, allowing for Teensy compatible programming + * software to load firmware onto the AVR, such as the official software at http://www.pjrc.com/teensy/. + * + * Out of the box this bootloader builds for the USB162, and will fit into 2KB of bootloader space. + * + * This spoofs (with permission) the offical Teensy bootloader's VID and PID, so that the software remains + * compatible with no changes. + * + * \section SSec_Options Project Options + * + * The following defines can be found in this demo, which can control the demo behaviour when defined, or changed in value. + * + * + * + * + * + *
+ * None + *
+ */ \ No newline at end of file diff --git a/Demos/AudioInput/AudioInput.c b/Demos/AudioInput/AudioInput.c index 6ead7a0153..f41306f3b2 100644 --- a/Demos/AudioInput/AudioInput.c +++ b/Demos/AudioInput/AudioInput.c @@ -33,10 +33,6 @@ * Main source file for the Audio Input demo. This file contains the main tasks of the demo and * is responsible for the initial application hardware configuration. */ - -/* --- Project Configuration --- */ -//#define MICROPHONE_BIASED_TO_HALF_RAIL -/* --- --- --- --- --- --- --- --- */ #include "AudioInput.h" diff --git a/Demos/AudioInput/AudioInput.txt b/Demos/AudioInput/AudioInput.txt index 09b77f7ec9..36e71e9750 100644 --- a/Demos/AudioInput/AudioInput.txt +++ b/Demos/AudioInput/AudioInput.txt @@ -5,21 +5,10 @@ */ /** \mainpage Audio Input Device Demo - * - * Audio demonstration application. This gives a simple reference - * application for implementing a USB Audio Input device using the - * basic USB Audio drivers in all modern OSes (i.e. no special drivers - * required). - * - * On startup the system will automatically enumerate and function - * as a USB microphone. Incomming audio from the ADC channel 1 will - * be sampled and sent to the host computer. - * - * To use, connect a microphone to the ADC channel 2. - * - * Under Windows, if a driver request dialogue pops up, select the option - * to automatically install the appropriate drivers. - * + * + * \section SSec_Info USB Information: + * + * The following table gives a rundown of the USB utilization of this demo. * * * @@ -45,4 +34,37 @@ * * *
Full Speed Mode
+ * + * \section SSec_Description Project Description: + * + * Audio demonstration application. This gives a simple reference + * application for implementing a USB Audio Input device using the + * basic USB Audio drivers in all modern OSes (i.e. no special drivers + * required). + * + * On startup the system will automatically enumerate and function + * as a USB microphone. Incomming audio from the ADC channel 1 will + * be sampled and sent to the host computer. + * + * To use, connect a microphone to the ADC channel 2. + * + * Under Windows, if a driver request dialogue pops up, select the option + * to automatically install the appropriate drivers. + * + * \section SSec_Options Project Options + * + * The following defines can be found in this demo, which can control the demo behaviour when defined, or changed in value. + * + * + * + * + * + * + * + * + * + * + * + * + *
Define Name:Location:Description:
MICROPHONE_BIASED_TO_HALF_RAILMakefile CDEFSWhen defined, this alters the demo so that the half VCC bias of the microphone input is subtracted.
*/ \ No newline at end of file diff --git a/Demos/AudioOutput/AudioOutput.c b/Demos/AudioOutput/AudioOutput.c index 87afd36062..0f390f0019 100644 --- a/Demos/AudioOutput/AudioOutput.c +++ b/Demos/AudioOutput/AudioOutput.c @@ -34,13 +34,6 @@ * is responsible for the initial application hardware configuration. */ -/* --- Project Configuration (Choose ONE) --- */ -//#define AUDIO_OUT_MONO -#define AUDIO_OUT_STEREO -//#define AUDIO_OUT_LEDS -//#define AUDIO_OUT_PORTC -/* --- --- --- --- --- --- --- --- --- --- --- */ - #include "AudioOutput.h" /* Project Tags, for reading out using the ButtLoad project */ diff --git a/Demos/AudioOutput/AudioOutput.txt b/Demos/AudioOutput/AudioOutput.txt index ce7d4ed943..0638c47f96 100644 --- a/Demos/AudioOutput/AudioOutput.txt +++ b/Demos/AudioOutput/AudioOutput.txt @@ -5,7 +5,38 @@ */ /** \mainpage Audio Output Device Demo - * + * + * \section SSec_Info USB Information: + * + * The following table gives a rundown of the USB utilization of this demo. + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
USB Mode:Device
USB Class:Audio Class
USB Subclass:Standard Audio Device
Relevant Standards:USBIF Audio Class SpecificationUSBIF Audio Class Terminal Types SpecificationUSBIF Audio Data Formats Specification
Usable Speeds:Full Speed Mode
+ * + * \section SSec_Description Project Description: + * * Audio demonstration application. This gives a simple reference * application for implementing a USB Audio Output device using the * basic USB Audio drivers in all modern OSes (i.e. no special drivers @@ -21,30 +52,37 @@ * * Under Windows, if a driver request dialogue pops up, select the option * to automatically install the appropriate drivers. - * + * + * \section SSec_Options Project Options + * + * The following defines can be found in this demo, which can control the demo behaviour when defined, or changed in value. * * * - * - * + * + * + * * * - * - * + * + * + * * - * - * - * + * + * + * + * * * - * - * - * - * + * + * + * * * - * - * + * + * + * * *
USB Mode:DeviceDefine Name:Location:Description:
USB Class:Audio ClassAUDIO_OUT_STEREOMakefile CDEFSWhen defined, this outputs the audio samples in stereo to the timer output pins of the microcontroller.
USB Subclass:Standard Audio Device
AUDIO_OUT_MONOMakefile CDEFSWhen defined, this outputs the audio samples in mono to the timer output pin of the microcontroller.
Relevant Standards:USBIF Audio Class SpecificationUSBIF Audio Class Terminal Types SpecificationUSBIF Audio Data Formats SpecificationAUDIO_OUT_LEDSMakefile CDEFSWhen defined, this outputs the audio samples in stereo to the board LEDs.
Usable Speeds:Full Speed ModeAUDIO_OUT_PORTCMakefile CDEFSWhen defined, this outputs the audio samples in mono to port C of the microcontroller, for connection to an + * external DAC.
*/ \ No newline at end of file diff --git a/Demos/AudioOutput/makefile b/Demos/AudioOutput/makefile index 3584d55f90..af99358f5a 100644 --- a/Demos/AudioOutput/makefile +++ b/Demos/AudioOutput/makefile @@ -176,7 +176,7 @@ CSTANDARD = -std=gnu99 CDEFS = -DF_CPU=$(F_CPU)UL -DF_CLOCK=$(F_CLOCK)UL -DBOARD=BOARD_$(BOARD) CDEFS += -DUSE_NONSTANDARD_DESCRIPTOR_NAMES -DNO_STREAM_CALLBACKS -DUSB_DEVICE_ONLY CDEFS += -DUSE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)" - +CDEFS += -DAUDIO_OUT_STEREO # Place -D or -U options here for ASM sources ADEFS = -DF_CPU=$(F_CPU) diff --git a/Demos/CDC/CDC.txt b/Demos/CDC/CDC.txt index 34e1c82a19..8e13b55b45 100644 --- a/Demos/CDC/CDC.txt +++ b/Demos/CDC/CDC.txt @@ -6,19 +6,9 @@ /** \mainpage Communications Device Class Device (Virtual Serial Port) * - * Communications Device Class demonstration application. - * This gives a simple reference application for implementing - * a CDC device acting as a virtual serial port. Joystick - * actions are transmitted to the host as strings. The device - * does not respond to serial data sent from the host. - * - * After running this demo for the first time on a new computer, - * you will need to supply the .INF file located in this demo - * project's directory as the device's driver when running under - * Windows. This will enable Windows to use its inbuilt CDC drivers, - * negating the need for custom drivers for the device. Other - * Operating Systems should automatically use their own inbuilt - * CDC-ACM drivers. + * \section SSec_Info USB Information: + * + * The following table gives a rundown of the USB utilization of this demo. * * * @@ -42,4 +32,32 @@ * * *
Full Speed Mode
+ * + * \section SSec_Description Project Description: + * + * Communications Device Class demonstration application. + * This gives a simple reference application for implementing + * a CDC device acting as a virtual serial port. Joystick + * actions are transmitted to the host as strings. The device + * does not respond to serial data sent from the host. + * + * After running this demo for the first time on a new computer, + * you will need to supply the .INF file located in this demo + * project's directory as the device's driver when running under + * Windows. This will enable Windows to use its inbuilt CDC drivers, + * negating the need for custom drivers for the device. Other + * Operating Systems should automatically use their own inbuilt + * CDC-ACM drivers. + * + * \section SSec_Options Project Options + * + * The following defines can be found in this demo, which can control the demo behaviour when defined, or changed in value. + * + * + * + * + * + *
+ * None + *
*/ \ No newline at end of file diff --git a/Demos/CDCHost/CDCHost.txt b/Demos/CDCHost/CDCHost.txt index 5f8dc8cc02..39e2357bae 100644 --- a/Demos/CDCHost/CDCHost.txt +++ b/Demos/CDCHost/CDCHost.txt @@ -5,17 +5,10 @@ */ /** \mainpage CDC Host Demo - * - * CDC host demonstration application. This gives a simple reference application - * for implementing a USB CDC host, for CDC devices using the standard ACM profile. - * - * This demo prints out received CDC data through the serial port. - * - * Not that this demo is only compatible with devices which report the correct CDC - * and ACM class, subclass and protocol values. Most USB-Serial cables have vendor - * specific features, thus use vendor-specfic class/subclass/protocol codes to force - * the user to use specialized drivers. This demo is not compaible with such devices. - * + * + * \section SSec_Info USB Information: + * + * The following table gives a rundown of the USB utilization of this demo. * * * @@ -39,4 +32,28 @@ * * *
Full Speed Mode
+ * + * \section SSec_Description Project Description: + * + * CDC host demonstration application. This gives a simple reference application + * for implementing a USB CDC host, for CDC devices using the standard ACM profile. + * + * This demo prints out received CDC data through the serial port. + * + * Not that this demo is only compatible with devices which report the correct CDC + * and ACM class, subclass and protocol values. Most USB-Serial cables have vendor + * specific features, thus use vendor-specfic class/subclass/protocol codes to force + * the user to use specialized drivers. This demo is not compaible with such devices. + * + * \section SSec_Options Project Options + * + * The following defines can be found in this demo, which can control the demo behaviour when defined, or changed in value. + * + * + * + * + * + *
+ * None + *
*/ \ No newline at end of file diff --git a/Demos/DualCDC/DualCDC.txt b/Demos/DualCDC/DualCDC.txt index aebbec3531..6e086029b0 100644 --- a/Demos/DualCDC/DualCDC.txt +++ b/Demos/DualCDC/DualCDC.txt @@ -5,6 +5,38 @@ */ /** \mainpage Dual Communications Device Class Device (Dual Virtual Serial Port) + * + * \section SSec_Info USB Information: + * + * The following table gives a rundown of the USB utilization of this demo. + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
USB Mode:Device
USB Class:Miscellaneous Device Class( Sub-Interface: Communications Device Class (CDC) )
USB Subclass:Common Class( Sub-Interface: Abstract Control Model (ACM) )
Relevant Standards:USBIF Interface Association Descriptor ECNUSBIF CDC Class Standard
Usable Speeds:Full Speed Mode
+ * + * \section SSec_Description Project Description: * * Dual Communications Device Class demonstration application. * This gives a simple reference application for implementing @@ -29,29 +61,15 @@ * Operating Systems should automatically use their own inbuilt * CDC-ACM drivers. * + * \section SSec_Options Project Options + * + * The following defines can be found in this demo, which can control the demo behaviour when defined, or changed in value. + * * * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * + * * *
USB Mode:Device
USB Class:Miscellaneous Device Class( Sub-Interface: Communications Device Class (CDC) )
USB Subclass:Common Class( Sub-Interface: Abstract Control Model (ACM) )
Relevant Standards:USBIF Interface Association Descriptor ECNUSBIF CDC Class Standard
Usable Speeds:Full Speed Mode + * None + *
*/ \ No newline at end of file diff --git a/Demos/Joystick/Joystick.txt b/Demos/Joystick/Joystick.txt index 6229aa042d..7d47ae92fc 100644 --- a/Demos/Joystick/Joystick.txt +++ b/Demos/Joystick/Joystick.txt @@ -6,18 +6,9 @@ /** \mainpage Joystick Device Demo * - * Joystick demonstration application. This gives a simple reference - * application for implementing a USB Keyboard device, for USB Joysticks - * using the standard Keyboard HID profile. - * - * This device will show up as a generic joystick device, with two buttons. - * Pressing the joystick inwards is the first button, and the HWB button - * is the second. - * - * Moving the joystick on the selected board moves the joystick location on - * the host computer. - * - * Currently only single interface joysticks are supported. + * \section SSec_Info USB Information: + * + * The following table gives a rundown of the USB utilization of this demo. * * * @@ -41,4 +32,31 @@ * * *
Low Speed Mode, Full Speed Mode
+ * + * \section SSec_Description Project Description: + * + * Joystick demonstration application. This gives a simple reference + * application for implementing a USB Keyboard device, for USB Joysticks + * using the standard Keyboard HID profile. + * + * This device will show up as a generic joystick device, with two buttons. + * Pressing the joystick inwards is the first button, and the HWB button + * is the second. + * + * Moving the joystick on the selected board moves the joystick location on + * the host computer. + * + * Currently only single interface joysticks are supported. + * + * \section SSec_Options Project Options + * + * The following defines can be found in this demo, which can control the demo behaviour when defined, or changed in value. + * + * + * + * + * + *
+ * None + *
*/ \ No newline at end of file diff --git a/Demos/Keyboard/Keyboard.c b/Demos/Keyboard/Keyboard.c index 3884eeb163..f506070c0f 100644 --- a/Demos/Keyboard/Keyboard.c +++ b/Demos/Keyboard/Keyboard.c @@ -140,6 +140,15 @@ EVENT_HANDLER(USB_Reset) */ EVENT_HANDLER(USB_Disconnect) { + /* Stop running keyboard reporting and USB management tasks */ + #if !defined(INTERRUPT_DATA_ENDPOINT) + Scheduler_SetTaskMode(USB_Keyboard_Report, TASK_STOP); + #endif + + #if !defined(INTERRUPT_CONTROL_ENDPOINT) + Scheduler_SetTaskMode(USB_USBTask, TASK_STOP); + #endif + /* Indicate USB not ready */ UpdateStatus(Status_USBNotReady); } @@ -171,6 +180,11 @@ EVENT_HANDLER(USB_ConfigurationChanged) /* Indicate USB connected and ready */ UpdateStatus(Status_USBReady); + + #if !defined(INTERRUPT_DATA_ENDPOINT) + /* Start running keyboard reporting task */ + Scheduler_SetTaskMode(USB_Keyboard_Report, TASK_RUN); + #endif } /** Event handler for the USB_UnhandledControlPacket event. This is used to catch standard and class specific diff --git a/Demos/Keyboard/Keyboard.txt b/Demos/Keyboard/Keyboard.txt index 7939035a0a..a09d83507e 100644 --- a/Demos/Keyboard/Keyboard.txt +++ b/Demos/Keyboard/Keyboard.txt @@ -34,6 +34,7 @@ * * * \section SSec_Description Project Description: + * * Keyboard demonstration application. This gives a simple reference application * for implementing a USB Keyboard using the basic USB HID drivers in all modern * OSes (i.e. no special drivers required). It is boot protocol compatible, and thus diff --git a/Demos/KeyboardHost/KeyboardHost.txt b/Demos/KeyboardHost/KeyboardHost.txt index 92e380789d..db0e14ad66 100644 --- a/Demos/KeyboardHost/KeyboardHost.txt +++ b/Demos/KeyboardHost/KeyboardHost.txt @@ -5,21 +5,10 @@ */ /** \mainpage Keyboard Host Demo - * - * Keyboard host demonstration application. This gives a simple reference - * application for implementing a USB Mouse keyboard, for USB keyboards using - * the standard keyboard HID profile. - * - * Pressed alpha-numeric, enter or space key is transmitted through the serial - * USART at serial settings 9600, 8, N, 1. - * - * This uses a naive method where the keyboard is set to Boot Protocol mode, so - * that the report structure is fixed and known. A better implementation - * uses the HID report parser for correct report data processing across - * all compatable mice with advanced characteristics, as shown in the - * KeyboardHostWithParser demo application. - * - * Currently only single interface keyboards are supported. + * + * \section SSec_Info USB Information: + * + * The following table gives a rundown of the USB utilization of this demo. * * * @@ -43,4 +32,33 @@ * * *
Low Speed Mode, Full Speed Mode
+ * + * \section SSec_Description Project Description: + * + * Keyboard host demonstration application. This gives a simple reference + * application for implementing a USB Mouse keyboard, for USB keyboards using + * the standard keyboard HID profile. + * + * Pressed alpha-numeric, enter or space key is transmitted through the serial + * USART at serial settings 9600, 8, N, 1. + * + * This uses a naive method where the keyboard is set to Boot Protocol mode, so + * that the report structure is fixed and known. A better implementation + * uses the HID report parser for correct report data processing across + * all compatable mice with advanced characteristics, as shown in the + * KeyboardHostWithParser demo application. + * + * Currently only single interface keyboards are supported. + * + * \section SSec_Options Project Options + * + * The following defines can be found in this demo, which can control the demo behaviour when defined, or changed in value. + * + * + * + * + * + *
+ * None + *
*/ \ No newline at end of file diff --git a/Demos/KeyboardHostViaInt/KeyboardHostViaInt.h b/Demos/KeyboardHostViaInt/KeyboardHostViaInt.h index 7ae54e6ada..06cd02a9f8 100644 --- a/Demos/KeyboardHostViaInt/KeyboardHostViaInt.h +++ b/Demos/KeyboardHostViaInt/KeyboardHostViaInt.h @@ -59,7 +59,7 @@ #define KEYBOARD_DATAPIPE 1 /** HID Class Specific request to set the report protocol mode */ - #define REQ_SetProtocol 0x0B + #define REQ_SetProtocol 0x0B /* Type Defines: */ /** Type define for a standard Boot Protocol Keyboard report */ diff --git a/Demos/KeyboardHostViaInt/KeyboardHostViaInt.txt b/Demos/KeyboardHostViaInt/KeyboardHostViaInt.txt index 07c1108489..de61d32fea 100644 --- a/Demos/KeyboardHostViaInt/KeyboardHostViaInt.txt +++ b/Demos/KeyboardHostViaInt/KeyboardHostViaInt.txt @@ -4,23 +4,11 @@ * documentation pages. It is not a project source file. */ -/** \mainpage Keyboard Host Demo - * - * Keyboard host demonstration application, using pipe interrupts. This gives - * a simple reference application for implementing a USB Keyboard host utilizing - * the LUFA pipe interrupt system, for USB keyboards using the standard Keyboard - * HID profile. - * - * Pressed alpha-numeric, enter or space key is transmitted through the serial - * USART at serial settings 9600, 8, N, 1. - * - * This uses a naive method where the keyboard is set to Boot Protocol mode, so - * that the report structure is fixed and known. A better implementation - * uses the HID report parser for correct report data processing across - * all compatable mice with advanced characteristics, as shown in the - * KeyboardHostWithParser demo application. - * - * Currently only single interface keyboards are supported. +/** \mainpage Keyboard Host Demo (via interrupts) + * + * \section SSec_Info USB Information: + * + * The following table gives a rundown of the USB utilization of this demo. * * * @@ -44,4 +32,34 @@ * * *
Low Speed Mode, Full Speed Mode
+ * + * \section SSec_Description Project Description: + * + * Keyboard host demonstration application, using pipe interrupts. This gives + * a simple reference application for implementing a USB Keyboard host utilizing + * the LUFA pipe interrupt system, for USB keyboards using the standard Keyboard + * HID profile. + * + * Pressed alpha-numeric, enter or space key is transmitted through the serial + * USART at serial settings 9600, 8, N, 1. + * + * This uses a naive method where the keyboard is set to Boot Protocol mode, so + * that the report structure is fixed and known. A better implementation + * uses the HID report parser for correct report data processing across + * all compatable mice with advanced characteristics, as shown in the + * KeyboardHostWithParser demo application. + * + * Currently only single interface keyboards are supported. + * + * \section SSec_Options Project Options + * + * The following defines can be found in this demo, which can control the demo behaviour when defined, or changed in value. + * + * + * + * + * + *
+ * None + *
*/ \ No newline at end of file diff --git a/Demos/KeyboardHostWithParser/KeyboardHostWithParser.txt b/Demos/KeyboardHostWithParser/KeyboardHostWithParser.txt index 09a83ca570..cd36706739 100644 --- a/Demos/KeyboardHostWithParser/KeyboardHostWithParser.txt +++ b/Demos/KeyboardHostWithParser/KeyboardHostWithParser.txt @@ -5,19 +5,10 @@ */ /** \mainpage Keyboard Host With HID Descriptor Parser Demo - * - * Keyboard host demonstration application. This gives a simple reference - * application for implementing a USB Keyboard host, for USB keyboards using - * the standard Keyboard HID profile. It uses a HID parser for the HID reports, - * allowing for correct operation across all USB keyboards. This demo supports - * keyboards with a single HID report. - * - * Pressed alpha-numeric, enter or space key is transmitted through the serial - * USART at serial settings 9600, 8, N, 1. On connection to a USB keyboard, the - * report items will be processed and printed as a formatted list through the - * USART before the keyboard is fully enumerated. - * - * Currently only single interface keyboards are supported. + * + * \section SSec_Info USB Information: + * + * The following table gives a rundown of the USB utilization of this demo. * * * @@ -41,4 +32,31 @@ * * *
Low Speed Mode, Full Speed Mode
+ * + * \section SSec_Description Project Description: + * + * Keyboard host demonstration application. This gives a simple reference + * application for implementing a USB Keyboard host, for USB keyboards using + * the standard Keyboard HID profile. It uses a HID parser for the HID reports, + * allowing for correct operation across all USB keyboards. This demo supports + * keyboards with a single HID report. + * + * Pressed alpha-numeric, enter or space key is transmitted through the serial + * USART at serial settings 9600, 8, N, 1. On connection to a USB keyboard, the + * report items will be processed and printed as a formatted list through the + * USART before the keyboard is fully enumerated. + * + * Currently only single interface keyboards are supported. + * + * \section SSec_Options Project Options + * + * The following defines can be found in this demo, which can control the demo behaviour when defined, or changed in value. + * + * + * + * + * + *
+ * None + *
*/ \ No newline at end of file diff --git a/Demos/KeyboardMouse/KeyboardMouse.txt b/Demos/KeyboardMouse/KeyboardMouse.txt index 969e2871b4..6388e9803d 100644 --- a/Demos/KeyboardMouse/KeyboardMouse.txt +++ b/Demos/KeyboardMouse/KeyboardMouse.txt @@ -6,22 +6,9 @@ /** \mainpage Dual HID Keyboard and Mouse Device Demo * - * Keyboard/Mouse demonstration application. This gives a simple reference - * application for implementing a composite device containing both USB Keyboard - * and USB Mouse functionality using the basic USB HID drivers in all modern OSes - * (i.e. no special drivers required). This example uses two seperate HID - * interfaces for each function. It is boot protocol compatible, and thus works under - * compatible BIOS as if it was a native keyboard and mouse (e.g. PS/2). - * - * On startup the system will automatically enumerate and function - * as a keyboard when the USB connection to a host is present and the HWB is not - * pressed. When enabled, manipulate the joystick to send the letters - * a, b, c, d and e. See the USB HID documentation for more information - * on sending keyboard event and keypresses. - * - * When the HWB is pressed, the mouse mode is enabled. When enabled, move the - * joystick to move the pointer, and push the joystick inwards to simulate a - * left-button click. + * \section SSec_Info USB Information: + * + * The following table gives a rundown of the USB utilization of this demo. * * * @@ -45,4 +32,35 @@ * * *
Low Speed Mode, Full Speed Mode
+ * + * \section SSec_Description Project Description: + * + * Keyboard/Mouse demonstration application. This gives a simple reference + * application for implementing a composite device containing both USB Keyboard + * and USB Mouse functionality using the basic USB HID drivers in all modern OSes + * (i.e. no special drivers required). This example uses two seperate HID + * interfaces for each function. It is boot protocol compatible, and thus works under + * compatible BIOS as if it was a native keyboard and mouse (e.g. PS/2). + * + * On startup the system will automatically enumerate and function + * as a keyboard when the USB connection to a host is present and the HWB is not + * pressed. When enabled, manipulate the joystick to send the letters + * a, b, c, d and e. See the USB HID documentation for more information + * on sending keyboard event and keypresses. + * + * When the HWB is pressed, the mouse mode is enabled. When enabled, move the + * joystick to move the pointer, and push the joystick inwards to simulate a + * left-button click. + * + * \section SSec_Options Project Options + * + * The following defines can be found in this demo, which can control the demo behaviour when defined, or changed in value. + * + * + * + * + * + *
+ * None + *
*/ \ No newline at end of file diff --git a/Demos/MIDI/MIDI.txt b/Demos/MIDI/MIDI.txt index 0b34ccb66d..3eb60cdc61 100644 --- a/Demos/MIDI/MIDI.txt +++ b/Demos/MIDI/MIDI.txt @@ -5,21 +5,10 @@ */ /** \mainpage MIDI Input Device Demo - * - * MIDI demonstration application. This gives a simple reference - * application for implementing the USB-MIDI class in USB devices. - * It is built upon the USB Audio class. - * - * Joystick movements are translated into note on/off messages and - * are sent to the host PC as MIDI streams which can be read by any - * MIDI program supporting MIDI IN devices. - * - * If the HWB is not pressed, channel 1 (default piano) is used. If - * the HWB is set, then channel 10 (default percussion) is selected. - * - * This device implements MIDI-THRU mode, with the IN MIDI data being - * generated by the device itself. OUT MIDI data is discarded. - * + * + * \section SSec_Info USB Information: + * + * The following table gives a rundown of the USB utilization of this demo. * * * @@ -45,4 +34,32 @@ * * *
Full Speed Mode
+ * + * \section SSec_Description Project Description: + * + * MIDI demonstration application. This gives a simple reference + * application for implementing the USB-MIDI class in USB devices. + * It is built upon the USB Audio class. + * + * Joystick movements are translated into note on/off messages and + * are sent to the host PC as MIDI streams which can be read by any + * MIDI program supporting MIDI IN devices. + * + * If the HWB is not pressed, channel 1 (default piano) is used. If + * the HWB is set, then channel 10 (default percussion) is selected. + * + * This device implements MIDI-THRU mode, with the IN MIDI data being + * generated by the device itself. OUT MIDI data is discarded. + * + * \section SSec_Options Project Options + * + * The following defines can be found in this demo, which can control the demo behaviour when defined, or changed in value. + * + * + * + * + * + *
+ * None + *
*/ \ No newline at end of file diff --git a/Demos/MassStorage/MassStorage.h b/Demos/MassStorage/MassStorage.h index 3525340ffd..a30e7f7466 100644 --- a/Demos/MassStorage/MassStorage.h +++ b/Demos/MassStorage/MassStorage.h @@ -62,8 +62,9 @@ /** Maximum length of a SCSI command which can be issued by the device or host in a Mass Storage bulk wrapper. */ #define MAX_SCSI_COMMAND_LENGTH 16 - /** Total number of Logical Units (drives) in the device. By default, the total device capacity is shared equally between - * each drive - this can be set to any positive non-zero amount. */ + /** Total number of Logical Units (drives) in the device. The total device capacity is shared equally between + * each drive - this can be set to any positive non-zero amount. + */ #define TOTAL_LUNS 2 /** Blocks in each LUN, calculated from the total capacity divided by the total number of Logical Units in the device. */ diff --git a/Demos/MassStorage/MassStorage.txt b/Demos/MassStorage/MassStorage.txt index 428faa8e04..4e8adadbc9 100644 --- a/Demos/MassStorage/MassStorage.txt +++ b/Demos/MassStorage/MassStorage.txt @@ -6,25 +6,9 @@ /** \mainpage Mass Storage Device Demo * - * Dual LUN Mass Storage demonstration application. This gives a simple - * reference application for implementing a multiple LUN USB Mass Storage - * device using the basic USB UFI drivers in all modern OSes (i.e. no - * special drivers required). - * - * On startup the system will automatically enumerate and function as an - * external mass storage device with two LUNs (seperate disks) which may - * be formatted and used in the same manner as commercial USB Mass Storage - * devices. - * - * You will need to format the mass storage drives upon first run of this - * demonstration - as the device acts only as a data block transport between - * the host and the storage media, it does not matter what file system is used, - * as the data interpretation is performed by the host and not the USB device. - * - * This demo is not restricted to only two LUNs; by changing the TOTAL_LUNS - * value in MassStorageDualLUN.h, any number of LUNs can be used (from 1 to - * 255), with each LUN being allocated an equal portion of the available - * Dataflash memory. + * \section SSec_Info USB Information: + * + * The following table gives a rundown of the USB utilization of this demo. * * * @@ -51,4 +35,44 @@ * * *
Full Speed Mode
+ * + * \section SSec_Description Project Description: + * + * Dual LUN Mass Storage demonstration application. This gives a simple + * reference application for implementing a multiple LUN USB Mass Storage + * device using the basic USB UFI drivers in all modern OSes (i.e. no + * special drivers required). + * + * On startup the system will automatically enumerate and function as an + * external mass storage device with two LUNs (seperate disks) which may + * be formatted and used in the same manner as commercial USB Mass Storage + * devices. + * + * You will need to format the mass storage drives upon first run of this + * demonstration - as the device acts only as a data block transport between + * the host and the storage media, it does not matter what file system is used, + * as the data interpretation is performed by the host and not the USB device. + * + * This demo is not restricted to only two LUNs; by changing the TOTAL_LUNS + * value in MassStorageDualLUN.h, any number of LUNs can be used (from 1 to + * 255), with each LUN being allocated an equal portion of the available + * Dataflash memory. + * + * \section SSec_Options Project Options + * + * The following defines can be found in this demo, which can control the demo behaviour when defined, or changed in value. + * + * + * + * + * + * + * + * + * + * + * + * + *
Define Name:Location:Description:
TOTAL_LUNSMassStorage.hTotal number of Logical Units (drives) in the device. The total device capacity is shared equally between each drive + * - this can be set to any positive non-zero amount.
*/ \ No newline at end of file diff --git a/Demos/MassStorageHost/MassStorageHost.txt b/Demos/MassStorageHost/MassStorageHost.txt index 2defd7fe8e..88b42e9373 100644 --- a/Demos/MassStorageHost/MassStorageHost.txt +++ b/Demos/MassStorageHost/MassStorageHost.txt @@ -5,15 +5,10 @@ */ /** \mainpage Mass Storage Host Demo - * - * Mass Storage host demonstration application. This gives a simple reference - * application for implementing a USB Mass Storage host, for USB storage devices - * using the standard Mass Storage USB profile. - * - * The first 512 bytes (boot sector) of an attached disk's memory will be dumped - * out of the serial port in HEX and ASCII form when it is attached to the AT90USB1287 - * AVR. The device will then wait for HWB to be pressed, whereupon the entire ASCII contents - * of the disk will be dumped to the serial port. + * + * \section SSec_Info USB Information: + * + * The following table gives a rundown of the USB utilization of this demo. * * * @@ -40,4 +35,27 @@ * * *
Full Speed Mode
+ * + * \section SSec_Description Project Description: + * + * Mass Storage host demonstration application. This gives a simple reference + * application for implementing a USB Mass Storage host, for USB storage devices + * using the standard Mass Storage USB profile. + * + * The first 512 bytes (boot sector) of an attached disk's memory will be dumped + * out of the serial port in HEX and ASCII form when it is attached to the AT90USB1287 + * AVR. The device will then wait for HWB to be pressed, whereupon the entire ASCII contents + * of the disk will be dumped to the serial port. + * + * \section SSec_Options Project Options + * + * The following defines can be found in this demo, which can control the demo behaviour when defined, or changed in value. + * + * + * + * + * + *
+ * None + *
*/ \ No newline at end of file diff --git a/Demos/Mouse/Mouse.c b/Demos/Mouse/Mouse.c index f8ec0a0f5b..b61850abe5 100644 --- a/Demos/Mouse/Mouse.c +++ b/Demos/Mouse/Mouse.c @@ -45,8 +45,13 @@ BUTTLOADTAG(LUFAVersion, "LUFA V" LUFA_VERSION_STRING); /* Scheduler Task List */ TASK_LIST { + #if !defined(INTERRUPT_CONTROL_ENDPOINT) { Task: USB_USBTask , TaskStatus: TASK_STOP }, + #endif + + #if !defined(INTERRUPT_DATA_ENDPOINT) { Task: USB_Mouse_Report , TaskStatus: TASK_STOP }, + #endif }; /* Global Variables */ @@ -118,14 +123,34 @@ EVENT_HANDLER(USB_Connect) UsingReportProtocol = true; } +/** Event handler for the USB_Reset event. This fires when the USB interface is reset by the USB host, before the + * enumeration process begins, and enables the control endpoint interrupt so that control requests can be handled + * asynchronously when they arrive rather than when the control endpoint is polled manually. + */ +EVENT_HANDLER(USB_Reset) +{ + #if defined(INTERRUPT_CONTROL_ENDPOINT) + /* Select the control endpoint */ + Endpoint_SelectEndpoint(ENDPOINT_CONTROLEP); + + /* Enable the endpoint SETUP interrupt ISR for the control endpoint */ + USB_INT_Enable(ENDPOINT_INT_SETUP); + #endif +} + /** Event handler for the USB_Disconnect event. This indicates that the device is no longer connected to a host via * the status LEDs and stops the USB management and Mouse reporting tasks. */ EVENT_HANDLER(USB_Disconnect) { - /* Stop running mouse reporting and USB management tasks */ + /* Stop running keyboard reporting and USB management tasks */ + #if !defined(INTERRUPT_DATA_ENDPOINT) Scheduler_SetTaskMode(USB_Mouse_Report, TASK_STOP); + #endif + + #if !defined(INTERRUPT_CONTROL_ENDPOINT) Scheduler_SetTaskMode(USB_USBTask, TASK_STOP); + #endif /* Indicate USB not ready */ UpdateStatus(Status_USBNotReady); @@ -141,11 +166,18 @@ EVENT_HANDLER(USB_ConfigurationChanged) ENDPOINT_DIR_IN, MOUSE_EPSIZE, ENDPOINT_BANK_SINGLE); + #if defined(INTERRUPT_DATA_ENDPOINT) + /* Enable the endpoint IN interrupt ISR for the report endpoint */ + USB_INT_Enable(ENDPOINT_INT_IN); + #endif + /* Indicate USB connected and ready */ UpdateStatus(Status_USBReady); + #if !defined(INTERRUPT_DATA_ENDPOINT) /* Start running mouse reporting task */ Scheduler_SetTaskMode(USB_Mouse_Report, TASK_RUN); + #endif } /** Event handler for the USB_UnhandledControlPacket event. This is used to catch standard and class specific @@ -163,7 +195,7 @@ EVENT_HANDLER(USB_UnhandledControlPacket) USB_MouseReport_Data_t MouseReportData; /* Create the next mouse report for transmission to the host */ - GetNextReport(&MouseReportData); + CreateMouseReport(&MouseReportData); /* Ignore report type and ID number value */ Endpoint_Discard_Word(); @@ -278,7 +310,7 @@ ISR(TIMER0_COMPA_vect, ISR_BLOCK) * * \return Boolean true if the new report differs from the last report, false otherwise */ -bool GetNextReport(USB_MouseReport_Data_t* ReportData) +bool CreateMouseReport(USB_MouseReport_Data_t* ReportData) { static uint8_t PrevJoyStatus = 0; static bool PrevHWBStatus = false; @@ -315,6 +347,45 @@ bool GetNextReport(USB_MouseReport_Data_t* ReportData) return InputChanged; } +/** Sends the next HID report to the host, via the keyboard data endpoint. */ +static inline void SendNextReport(void) +{ + USB_MouseReport_Data_t MouseReportData; + bool SendReport = true; + + /* Create the next mouse report for transmission to the host */ + CreateMouseReport(&MouseReportData); + + /* Check if the idle period is set*/ + if (IdleCount) + { + /* Determine if the idle period has elapsed */ + if (!(IdleMSRemaining)) + { + /* Reset the idle time remaining counter, must multiply by 4 to get the duration in milliseconds */ + IdleMSRemaining = (IdleCount << 2); + } + else + { + /* Idle period not elapsed, indicate that a report must not be sent */ + SendReport = false; + } + } + + /* Select the Mouse Report Endpoint */ + Endpoint_SelectEndpoint(MOUSE_EPNUM); + + /* Check if Mouse Endpoint Ready for Read/Write and if we should send a new report */ + if (Endpoint_ReadWriteAllowed() && SendReport) + { + /* Write Mouse Report Data */ + Endpoint_Write_Stream_LE(&MouseReportData, sizeof(MouseReportData)); + + /* Finalize the stream transfer to send the last packet */ + Endpoint_ClearCurrentBank(); + } +} + /** Function to manage status updates to the user. This is done via LEDs on the given board, if available, but may be changed to * log to a serial port, or anything else that is suitable for status updates. * @@ -342,45 +413,57 @@ void UpdateStatus(uint8_t CurrentStatus) LEDs_SetAllLEDs(LEDMask); } +#if !defined(INTERRUPT_DATA_ENDPOINT) /** Task to manage HID report generation and transmission to the host, when in report mode. */ TASK(USB_Mouse_Report) { - USB_MouseReport_Data_t MouseReportData; - bool SendReport = true; - - /* Create the next mouse report for transmission to the host */ - GetNextReport(&MouseReportData); - - /* Check if the idle period is set*/ - if (IdleCount) + /* Check if the USB system is connected to a host */ + if (USB_IsConnected) { - /* Determine if the idle period has elapsed */ - if (!(IdleMSRemaining)) - { - /* Reset the idle time remaining counter, must multiply by 4 to get the duration in milliseconds */ - IdleMSRemaining = (IdleCount << 2); - } - else - { - /* Idle period not elapsed, indicate that a report must not be sent */ - SendReport = false; - } + /* Send the next mouse report to the host */ + SendNextReport(); } +} +#endif + +/** ISR for the general Pipe/Endpoint interrupt vector. This ISR fires when an endpoint's status changes (such as + * a packet has been received) on an endpoint with its corresponding ISR enabling bits set. This is used to send + * HID packets to the host each time the HID interrupt endpoints polling period elapses, as managed by the USB + * controller. It is also used to respond to standard and class specific requests send to the device on the control + * endpoint, by handing them off to the LUFA library when they are received. + */ +ISR(ENDPOINT_PIPE_vect, ISR_BLOCK) +{ + #if defined(INTERRUPT_CONTROL_ENDPOINT) + /* Check if the control endpoint has received a request */ + if (Endpoint_HasEndpointInterrupted(ENDPOINT_CONTROLEP)) + { + /* Clear the endpoint interrupt */ + Endpoint_ClearEndpointInterrupt(ENDPOINT_CONTROLEP); + + /* Process the control request */ + USB_USBTask(); + + /* Handshake the endpoint setup interrupt - must be after the call to USB_USBTask() */ + USB_INT_Clear(ENDPOINT_INT_SETUP); + } + #endif - /* Check if the USB system is connected to a host */ - if (USB_IsConnected) + #if defined(INTERRUPT_DATA_ENDPOINT) + /* Check if mouse endpoint has interrupted */ + if (Endpoint_HasEndpointInterrupted(MOUSE_EPNUM)) { /* Select the Mouse Report Endpoint */ Endpoint_SelectEndpoint(MOUSE_EPNUM); - /* Check if Mouse Endpoint Ready for Read/Write and if we should send a new report */ - if (Endpoint_ReadWriteAllowed() && SendReport) - { - /* Write Mouse Report Data */ - Endpoint_Write_Stream_LE(&MouseReportData, sizeof(MouseReportData)); - - /* Finalize the stream transfer to send the last packet */ - Endpoint_ClearCurrentBank(); - } + /* Clear the endpoint IN interrupt flag */ + USB_INT_Clear(ENDPOINT_INT_IN); + + /* Clear the Mouse Report endpoint interrupt and select the endpoint */ + Endpoint_ClearEndpointInterrupt(MOUSE_EPNUM); + + /* Send the next mouse report to the host */ + SendNextReport(); } + #endif } diff --git a/Demos/Mouse/Mouse.h b/Demos/Mouse/Mouse.h index 50908129aa..8723b78409 100644 --- a/Demos/Mouse/Mouse.h +++ b/Demos/Mouse/Mouse.h @@ -103,6 +103,9 @@ /** Indicates that this module will catch the USB_Disconnect event when thrown by the library. */ HANDLES_EVENT(USB_Disconnect); + /** Indicates that this module will catch the USB_Reset event when thrown by the library. */ + HANDLES_EVENT(USB_Reset); + /** Indicates that this module will catch the USB_ConfigurationChanged event when thrown by the library. */ HANDLES_EVENT(USB_ConfigurationChanged); @@ -110,7 +113,7 @@ HANDLES_EVENT(USB_UnhandledControlPacket); /* Function Prototypes: */ - bool GetNextReport(USB_MouseReport_Data_t* ReportData); + bool CreateMouseReport(USB_MouseReport_Data_t* ReportData); void UpdateStatus(uint8_t CurrentStatus); #endif diff --git a/Demos/Mouse/Mouse.txt b/Demos/Mouse/Mouse.txt index 7b7360f0ea..6764275ce8 100644 --- a/Demos/Mouse/Mouse.txt +++ b/Demos/Mouse/Mouse.txt @@ -6,17 +6,9 @@ /** \mainpage Mouse Device Demo * - * Mouse demonstration application. This gives a simple reference - * application for implementing a USB Mouse using the basic USB HID - * drivers in all modern OSes (i.e. no special drivers required). It is - * boot protocol compatible, and thus works under compatible BIOS as if - * it was a native mouse (e.g. PS/2). - * - * On startup the system will automatically enumerate and function - * as a mouse when the USB connection to a host is present. To use - * the mouse, move the joystick to move the pointer, and push the - * joystick inwards to simulate a left-button click. The HWB serves as - * the right mouse button. + * \section SSec_Info USB Information: + * + * The following table gives a rundown of the USB utilization of this demo. * * * @@ -40,4 +32,44 @@ * * *
Low Speed Mode, Full Speed Mode
+ * + * \section SSec_Description Project Description: + * + * Mouse demonstration application. This gives a simple reference + * application for implementing a USB Mouse using the basic USB HID + * drivers in all modern OSes (i.e. no special drivers required). It is + * boot protocol compatible, and thus works under compatible BIOS as if + * it was a native mouse (e.g. PS/2). + * + * On startup the system will automatically enumerate and function + * as a mouse when the USB connection to a host is present. To use + * the mouse, move the joystick to move the pointer, and push the + * joystick inwards to simulate a left-button click. The HWB serves as + * the right mouse button. + * + * \section SSec_Options Project Options + * + * The following defines can be found in this demo, which can control the demo behaviour when defined, or changed in value. + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
Define Name:Location:Description:
INTERRUPT_CONTROL_ENDPOINTMakefile CDEFSWhen defined, this causes the demo to enable interrupts for the control endpoint, + * which services control requests from the host. If not defined, the control endpoint + * is serviced via polling using the task scheduler.
INTERRUPT_DATA_ENDPOINTMakefile CDEFSWhen defined, this causes the demo to enable interrupts for the data endpoint, + * which services outgoing mouse button and movement reports to the host. If not defined, + * the data endpoint is serviced via polling using the task scheduler.
*/ \ No newline at end of file diff --git a/Demos/Mouse/makefile b/Demos/Mouse/makefile index a731e205eb..27ca1d8096 100644 --- a/Demos/Mouse/makefile +++ b/Demos/Mouse/makefile @@ -177,7 +177,6 @@ CDEFS = -DF_CPU=$(F_CPU)UL -DF_CLOCK=$(F_CLOCK)UL -DBOARD=BOARD_$(BOARD) CDEFS += -DUSE_NONSTANDARD_DESCRIPTOR_NAMES -DNO_STREAM_CALLBACKS -DUSB_DEVICE_ONLY CDEFS += -DUSE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)" - # Place -D or -U options here for ASM sources ADEFS = -DF_CPU=$(F_CPU) diff --git a/Demos/MouseHost/MouseHost.txt b/Demos/MouseHost/MouseHost.txt index 11c434c696..a6d1ba8283 100644 --- a/Demos/MouseHost/MouseHost.txt +++ b/Demos/MouseHost/MouseHost.txt @@ -5,22 +5,10 @@ */ /** \mainpage Mouse Host Demo - * - * Mouse host demonstration application. This gives a simple reference - * application for implementing a USB Mouse host, for USB mice using - * the standard mouse HID profile. - * - * Mouse movement and button presses are displayed on the board LEDs, - * as well as printed out the serial terminal as formatted dY, dY and - * button status information. - * - * This uses a naive method where the mouse is set to Boot Protocol mode, so - * that the report structure is fixed and known. A better implementation - * uses the HID report parser for correct report data processing across - * all compatable mice with advanced characteristics, as shown in the - * MouseHostWithParser demo application. - * - * Currently only single interface mice are supported. + * + * \section SSec_Info USB Information: + * + * The following table gives a rundown of the USB utilization of this demo. * * * @@ -44,4 +32,34 @@ * * *
Low Speed Mode, Full Speed Mode
+ * + * \section SSec_Description Project Description: + * + * Mouse host demonstration application. This gives a simple reference + * application for implementing a USB Mouse host, for USB mice using + * the standard mouse HID profile. + * + * Mouse movement and button presses are displayed on the board LEDs, + * as well as printed out the serial terminal as formatted dY, dY and + * button status information. + * + * This uses a naive method where the mouse is set to Boot Protocol mode, so + * that the report structure is fixed and known. A better implementation + * uses the HID report parser for correct report data processing across + * all compatable mice with advanced characteristics, as shown in the + * MouseHostWithParser demo application. + * + * Currently only single interface mice are supported. + * + * \section SSec_Options Project Options + * + * The following defines can be found in this demo, which can control the demo behaviour when defined, or changed in value. + * + * + * + * + * + *
+ * None + *
*/ \ No newline at end of file diff --git a/Demos/MouseHostViaInt/MouseHostViaInt.txt b/Demos/MouseHostViaInt/MouseHostViaInt.txt index 72ee1dbeee..7498655443 100644 --- a/Demos/MouseHostViaInt/MouseHostViaInt.txt +++ b/Demos/MouseHostViaInt/MouseHostViaInt.txt @@ -4,24 +4,9 @@ * documentation pages. It is not a project source file. */ -/** \mainpage Mouse Host Demo - * - * Mouse host demonstration application, using pipe interrupts. This - * gives a simple reference application for implementing a USB Mouse - * host utilizing the LUFA pipe interrupt system, for USB mice using - * the standard mouse HID profile. - * - * Mouse movement and button presses are displayed on the board LEDs, - * as well as printed out the serial terminal as formatted dY, dY and - * button status information. - * - * This uses a naive method where the mouse is set to Boot Protocol mode, so - * that the report structure is fixed and known. A better implementation - * uses the HID report parser for correct report data processing across - * all compatable mice with advanced characteristics, as shown in the - * MouseHostWithParser demo application. - * - * Currently only single interface mice are supported. +/** \mainpage Mouse Host Demo (via interrupts) + * + * \section SSec_Info USB Information: * * * @@ -45,4 +30,37 @@ * * *
Low Speed Mode, Full Speed Mode
+ * + * \section SSec_Description Project Description: + * + * The following table gives a rundown of the USB utilization of this demo. + * + * Mouse host demonstration application, using pipe interrupts. This + * gives a simple reference application for implementing a USB Mouse + * host utilizing the LUFA pipe interrupt system, for USB mice using + * the standard mouse HID profile. + * + * Mouse movement and button presses are displayed on the board LEDs, + * as well as printed out the serial terminal as formatted dY, dY and + * button status information. + * + * This uses a naive method where the mouse is set to Boot Protocol mode, so + * that the report structure is fixed and known. A better implementation + * uses the HID report parser for correct report data processing across + * all compatable mice with advanced characteristics, as shown in the + * MouseHostWithParser demo application. + * + * Currently only single interface mice are supported. + * + * \section SSec_Options Project Options + * + * The following defines can be found in this demo, which can control the demo behaviour when defined, or changed in value. + * + * + * + * + * + *
+ * None + *
*/ \ No newline at end of file diff --git a/Demos/MouseHostWithParser/MouseHostWithParser.txt b/Demos/MouseHostWithParser/MouseHostWithParser.txt index 97ee8bfb86..3c83341a27 100644 --- a/Demos/MouseHostWithParser/MouseHostWithParser.txt +++ b/Demos/MouseHostWithParser/MouseHostWithParser.txt @@ -5,19 +5,10 @@ */ /** \mainpage Mouse Host With HID Descriptor Parser Demo - * - * Mouse host demonstration application. This gives a simple reference - * application for implementing a USB Mouse host, for USB mice using - * the standard mouse HID profile. It uses a HID parser for the HID - * reports, allowing for correct operation across all USB mice. This - * demo supports mice with a single HID report. - * - * Mouse movement and button presses are displayed on the board LEDs. - * On connection to a USB mouse, the report items will be processed and - * printed as a formatted list through the USART before the mouse is - * fully enumerated. - * - * Currently only single interface mice are supported. + * + * \section SSec_Info USB Information: + * + * The following table gives a rundown of the USB utilization of this demo. * * * @@ -41,4 +32,31 @@ * * *
Low Speed Mode, Full Speed Mode
+ * + * \section SSec_Description Project Description: + * + * Mouse host demonstration application. This gives a simple reference + * application for implementing a USB Mouse host, for USB mice using + * the standard mouse HID profile. It uses a HID parser for the HID + * reports, allowing for correct operation across all USB mice. This + * demo supports mice with a single HID report. + * + * Mouse movement and button presses are displayed on the board LEDs. + * On connection to a USB mouse, the report items will be processed and + * printed as a formatted list through the USART before the mouse is + * fully enumerated. + * + * Currently only single interface mice are supported. + * + * \section SSec_Options Project Options + * + * The following defines can be found in this demo, which can control the demo behaviour when defined, or changed in value. + * + * + * + * + * + *
+ * None + *
*/ \ No newline at end of file diff --git a/Demos/RNDISEthernet/RNDISEthernet.txt b/Demos/RNDISEthernet/RNDISEthernet.txt index bd4ff69e81..306cf85261 100644 --- a/Demos/RNDISEthernet/RNDISEthernet.txt +++ b/Demos/RNDISEthernet/RNDISEthernet.txt @@ -5,7 +5,11 @@ */ /** \mainpage RNDIS Class Ethernet Demo (with Webserver/Telnet) - * + * + * \section SSec_Info USB Information: + * + * The following table gives a rundown of the USB utilization of this demo. + * * Remote Network Driver Interface demonstration application. * This gives a simple reference application for implementing * a CDC RNDIS device acting as a simple network interface for @@ -37,6 +41,8 @@ * recommended that it be replaced with an external open source TCP/IP * stack that is feature complete, such as the uIP stack. * + * \section SSec_Description Project Description: + * * * * @@ -59,4 +65,51 @@ * * *
USB Mode:Full Speed Mode
+ * + * \section SSec_Options Project Options + * + * The following defines can be found in this demo, which can control the demo behaviour when defined, or changed in value. + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
Define Name:Location:Description:
NO_DECODE_ETHERNETMakefile CDEFSWhen defined, received Ethernet headers will not be decoded and printed to the device serial port.
NO_DECODE_ARPMakefile CDEFSWhen defined, received ARP headers will not be decoded and printed to the device serial port.
NO_DECODE_IPMakefile CDEFSWhen defined, received IP headers will not be decoded and printed to the device serial port.
NO_DECODE_ICMPMakefile CDEFSWhen defined, received ICMP headers will not be decoded and printed to the device serial port.
NO_DECODE_TCPMakefile CDEFSWhen defined, received TCP headers will not be decoded and printed to the device serial port.
NO_DECODE_UDPMakefile CDEFSWhen defined, received UDP headers will not be decoded and printed to the device serial port.
NO_DECODE_DHCPMakefile CDEFSWhen defined, received DHCP headers will not be decoded and printed to the device serial port.
*/ \ No newline at end of file diff --git a/Demos/StillImageHost/StillImageHost.txt b/Demos/StillImageHost/StillImageHost.txt index 6e2657be69..4cdfe63466 100644 --- a/Demos/StillImageHost/StillImageHost.txt +++ b/Demos/StillImageHost/StillImageHost.txt @@ -5,14 +5,10 @@ */ /** \mainpage Still Image Host Demo - * - * Still Image host demonstration application. This gives a simple reference - * application for implementing a Still Image host, for USB devices such as - * digital cameras. - * - * This demo will enumerate an attached USB Still Image device, print out its - * information structure, open a session with the device and finally close the - * session. + * + * \section SSec_Info USB Information: + * + * The following table gives a rundown of the USB utilization of this demo. * * * @@ -37,4 +33,26 @@ * * *
Full Speed Mode
+ * + * \section SSec_Description Project Description: + * + * Still Image host demonstration application. This gives a simple reference + * application for implementing a Still Image host, for USB devices such as + * digital cameras. + * + * This demo will enumerate an attached USB Still Image device, print out its + * information structure, open a session with the device and finally close the + * session. + * + * \section SSec_Options Project Options + * + * The following defines can be found in this demo, which can control the demo behaviour when defined, or changed in value. + * + * + * + * + * + *
+ * None + *
*/ \ No newline at end of file diff --git a/Demos/TestApp/TestApp.txt b/Demos/TestApp/TestApp.txt index e5b268aa54..aef55b761a 100644 --- a/Demos/TestApp/TestApp.txt +++ b/Demos/TestApp/TestApp.txt @@ -6,25 +6,9 @@ /** \mainpage Test Application for the LUFA library * - * Test application. Demonstrates several aspects of the LUFA - * Library. On startup the current temperature will be printed - * through the USART every 10 seconds, and the current joystick - * position will be indicated via the LEDs on the selected board. - * Pressing the HWB will initiate the USB subsystem, enumerating - * the device (which has no actual functionality beyond - * enumeration as a device or as a host in this demo, and serves - * only to demonstrate the USB portion of the library). It will - * also suspend the joystick and temperature monitoring tasks. - * - * Pressing the HWB a second time will turn off the USB system - * and resume the temperature printing task (but not the joystick - * monitoring task). - * - * When activated, the USB events will be printed through the - * serial USART. + * \section SSec_Info USB Information: * - * When the USB subsystem is activated, the board LEDs will show - * the current USB status. + * The following table gives a rundown of the USB utilization of this demo. * * * @@ -48,4 +32,38 @@ * * *
Low Speed Mode, Full Speed Mode
+ * + * \section SSec_Description Project Description: + * + * Test application. Demonstrates several aspects of the LUFA + * Library. On startup the current temperature will be printed + * through the USART every 10 seconds, and the current joystick + * position will be indicated via the LEDs on the selected board. + * Pressing the HWB will initiate the USB subsystem, enumerating + * the device (which has no actual functionality beyond + * enumeration as a device or as a host in this demo, and serves + * only to demonstrate the USB portion of the library). It will + * also suspend the joystick and temperature monitoring tasks. + * + * Pressing the HWB a second time will turn off the USB system + * and resume the temperature printing task (but not the joystick + * monitoring task). + * + * When activated, the USB events will be printed through the + * serial USART. + * + * When the USB subsystem is activated, the board LEDs will show + * the current USB status. + * + * \section SSec_Options Project Options + * + * The following defines can be found in this demo, which can control the demo behaviour when defined, or changed in value. + * + * + * + * + * + *
+ * None + *
*/ \ No newline at end of file diff --git a/Demos/USBtoSerial/USBtoSerial.txt b/Demos/USBtoSerial/USBtoSerial.txt index 992f00f472..e334672178 100644 --- a/Demos/USBtoSerial/USBtoSerial.txt +++ b/Demos/USBtoSerial/USBtoSerial.txt @@ -6,19 +6,9 @@ /** \mainpage USB to Serial Converter Demo (via CDC-ACM class) * - * Communications Device Class demonstration application. - * This gives a simple reference application for implementing - * a USB to Serial converter using the CDC class. Sent and - * received data on the serial port is communicated to the USB - * host. - * - * After running this demo for the first time on a new computer, - * you will need to supply the .INF file located in this demo - * project's directory as the device's driver when running under - * Windows. This will enable Windows to use its inbuilt CDC drivers, - * negating the need for custom drivers for the device. Other - * Operating Systems should automatically use their own inbuilt - * CDC-ACM drivers. + * \section SSec_Info USB Information: + * + * The following table gives a rundown of the USB utilization of this demo. * * * @@ -42,4 +32,37 @@ * * *
Full Speed Mode
+ * + * \section SSec_Description Project Description: + * + * Communications Device Class demonstration application. + * This gives a simple reference application for implementing + * a USB to Serial converter using the CDC class. Sent and + * received data on the serial port is communicated to the USB + * host. + * + * After running this demo for the first time on a new computer, + * you will need to supply the .INF file located in this demo + * project's directory as the device's driver when running under + * Windows. This will enable Windows to use its inbuilt CDC drivers, + * negating the need for custom drivers for the device. Other + * Operating Systems should automatically use their own inbuilt + * CDC-ACM drivers. + * + * \section SSec_Options Project Options + * + * The following defines can be found in this demo, which can control the demo behaviour when defined, or changed in value. + * + * + * + * + * + * + * + * + * + * + * + * + *
Define Name:Location:Description:
BUFF_STATICSIZERingBuff.hDefines the maximum number of bytes which can be buffered in each Ring Buffer.
*/ \ No newline at end of file diff --git a/Demos/makefile b/Demos/makefile index 2fd957a364..8f441461ad 100644 --- a/Demos/makefile +++ b/Demos/makefile @@ -58,12 +58,6 @@ all: make -C Mouse clean make -C Mouse all - - make -C MouseFullInt clean - make -C MouseFullInt all - - make -C MouseViaInt clean - make -C MouseViaInt all make -C MouseHost clean make -C MouseHost all @@ -102,8 +96,6 @@ all: make -C MassStorageHost $@ make -C MIDI $@ make -C Mouse $@ - make -C MouseFullInt $@ - make -C MouseViaInt $@ make -C MouseHost $@ make -C MouseHostWithParser $@ make -C MouseHostViaInt $@ diff --git a/LUFA.pnproj b/LUFA.pnproj index 3e21d735c9..77cdbe3630 100644 --- a/LUFA.pnproj +++ b/LUFA.pnproj @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/LUFA/ChangeLog.txt b/LUFA/ChangeLog.txt index c1de86f1b9..ad7f7bb5ea 100644 --- a/LUFA/ChangeLog.txt +++ b/LUFA/ChangeLog.txt @@ -8,7 +8,6 @@ * * \section Sec_ChangeLogXXXXXX Version XXXXXX * - * - Added new incomplete BluetoothHost demo * - Changed AVRISP Programmer descriptors to use a newly allocated 0x204F PID value * - Fixed MagStripe project configuration descriptor containing an unused (blank) endpoint descriptor * - Incorporated makefile changes by Denver Gingerich to retain compatibility with stock (non-WinAVR) AVR-GCC installations @@ -37,9 +36,10 @@ * to Kenneth Clubb) * - Added DataflashManager_WriteBlocks_RAM() and DataflashManager_ReadBlocks_RAM() functions to the MassStorage demo, to allow for easy * interfacing with a FAT library for dataflash file level access - * - Incomplete non-functional BluetoothHost demo removed until it has reached a stable state to prevent confusion * - Corrected CDC class bootloader to fix a few bugs, changed address counter to store x2 addresses for convenience * - Fixed typos in the SPI driver SPI_SPEED_FCPU_DIV_64 and SPI_SPEED_FCPU_DIV_128 masks (thanks to Markus Zocholl) + * - Keyboard and Mouse demos (normal, data interrupt and fully interrupt driven) combined into unified keyboard and mouse demos + * - Removed AVRISP_Programmer project due to code quality concerns * * \section Sec_ChangeLog090209 Version 090209 * diff --git a/Projects/AVRISP_Programmer/AVRISP_Firmware_Design.txt b/Projects/AVRISP_Programmer/AVRISP_Firmware_Design.txt deleted file mode 100644 index 643454d481..0000000000 --- a/Projects/AVRISP_Programmer/AVRISP_Firmware_Design.txt +++ /dev/null @@ -1,176 +0,0 @@ -Instructions for converting the LUFA USBtoSerial Demo to an AVR ISP Programmer. -By Opendous Inc., Copyright under the Creative Commons Attribution License: -http://creativecommons.org/licenses/by/3.0/ - -1) Start with the LUFA/Demos/USBtoSerial firmware. - - rename USBtoSerial.c, USBtoSerial.h, and USBtoSerial.aps to - AVRISP_Programmer.* - - edit AVRISP_Programmer.aps and rename all instances of "USBtoSerial" to - "AVRISP_Programmer" - - copy AVRISP_Programmer.txt from an older version of AVRISP_Programmer - -2) Edit makefile by changing TARGET from "USBtoSerial" to "AVRISP_Programmer" - -3) Edit AVRISP_Programmer.h: - - change ifdef _USB_TO_SERIAL_H to _AVRISP_PROGRAMMER_H_ - - rename ReconfigureUSART(void) to ReconfigureSPI(void) - - add void processHostSPIRequest(void); & void delay_ms(uint8_t dly); - - replace the define for Serial.h with one for SPI.h: - #include - -4) Make alterations to Descriptors.c - - change manufacturer string to "www.AVRopendous.org", length=19 - - change product string to "LUFA-Based AVR ISP Programmer", length=29 - -5) Edit Ringbuff.h to enable the Peek Command: #define BUFF_USEPEEK - -6) Edit AVRISP_Programmer.c: - - change #include "USBtoSerial.h" to #include "AVRISP_Programmer.h" - - change BUTTLOADTAG(ProjName to "LUFA AVR910 ISP Programmer" - - in main(), rename ReconfigureUSART() to Reconfigure(); - - in EVENT_HANDLER(USB_UnhandledControlPacket), rename ReconfigureUSART - - delete the ISRs: ISR(USART1_RX_vect) & ISR(USART1_TX_vect) - - delete ReconfigureUSART(void) - - add void ReconfigureSPI(void), void processHostSPIRequest(void), - and void delay_ms(uint8_t dly) from a previous version - - add Timer1 and SPI initialization code to main(): - /* Hardware Initialization */ - //LEDs_Init(); - DDRB = 0; - PORTB = 0; - DDRC |= ((1 << PC2) | (1 << PC4) | (1 << PC5) | (1 << PC6) | (1 << PC7)); //AT90USBxx2 - // PC2 is also used for RESET, so set it HIGH initially - note 'P' command sets it to LOW (Active) - PORTC |= ((1 << PC2) | (1 << PC4) | (1 << PC5) | (1 << PC6) | (1 << PC7)); //AT90USBxx2 - DDRD = 0; - PORTD = (1 << PB7); // only PB7(HWB) should be High as this is the bootloader pin - // Prepare PortB for SPI - set PB0(^SS), PB1(SCK), PB2(MOSI) as output as well as all other pins except PB3(MISO) - DDRB = (1 << PB0) | (1 << PB1) | (1 << PB2) | (0 << PB3) | (1 << PB4) | (1 << PB5) | (1 << PB6) | (1 << PB7); - PORTB |= (1 << PB0); - - // initialize Timer1 for use in delay function - TCCR1A = 0; - //TCCR1B = (1 << CS10); // no prescaling, use CLK - TCCR1B = ((1 << CS12) | (1 << CS10)); // prescale by CLK/1024 - // 8MHz/1024 = 7813 ticks per second --> ~8 ticks per millisecond (ms) - timerval = TCNT1; // start timer1 - - - In TASK(CDC_Task) in the - if (USB_IsConnected) { - if (Endpoint_ReadWriteAllowed()) { - while (Endpoint_BytesInEndpoint()) { - ... - structure, after Buffer_StoreElement(&Rx_Buffer, Endpoint_Read_Byte()): - - /* Each time there is an element, check which comand should be - run and if enough data is available to run that command. - There are 1-byte, 2-byte, 3-byte, 4-byte commands, and 5-byte commands - Remember that the "which command" byte counts as 1 */ - if (Rx_Buffer.Elements == 0) { - // do nothing, wait for data - } else { - tempByte = Buffer_PeekElement(&Rx_Buffer); // peek at first element - - /* make sure the issued command and associated data are all ready */ - if (Rx_Buffer.Elements == 1) { // zero data byte command - if ((tempByte == 'P') | (tempByte == 'a') | (tempByte == 'm') | - (tempByte == 'R') | (tempByte == 'd') | (tempByte == 'e') | - (tempByte == 'L') | (tempByte == 's') | (tempByte == 't') | - (tempByte == 'S') | (tempByte == 'V') | (tempByte == 'v') | - (tempByte == 'p') | (tempByte == 'F')) { - processHostSPIRequest(); // command has enough data, process it - } - } else if (Rx_Buffer.Elements == 2) { // one data byte command - if ((tempByte == 'T') | (tempByte == 'c') | (tempByte == 'C') | - (tempByte == 'D') | (tempByte == 'l') | (tempByte == 'f') | - (tempByte == 'x') | (tempByte == 'y')) { - processHostSPIRequest(); // command has enough data, process it - } - } else if (Rx_Buffer.Elements == 3) { // two data byte command - if ((tempByte == 'A') | (tempByte == 'Z')) { - processHostSPIRequest(); // command has enough data, process it - } - } else if (Rx_Buffer.Elements == 4) { // three data byte command - if ((tempByte == ':')) { - processHostSPIRequest(); // command has enough data, process it - } - } else if (Rx_Buffer.Elements == 5) { // four data byte command - if ((tempByte == '.')) { - processHostSPIRequest(); // command has enough data, process it - } - } else { - // do nothing - } - } - - - need to add code to flush the buffer. Change: - /* Check if Rx buffer contains data */ - if (Rx_Buffer.Elements) - { - /* Initiate the transmission of the buffer contents if USART idle*/ - if (!(Transmitting)) - { - Transmitting = true; - Serial_TxByte(Buffer_GetElement(&Rx_Buffer)); - } - } - To: - /* Check if Rx buffer contains data */ - if (Rx_Buffer.Elements) - { - /* Initiate the transmission of the buffer contents if USART idle*/ - if (!(Transmitting)) - { - Transmitting = true; - /* The following flushes the receive buffer to prepare for new - data and commands. Need to flush the buffer as the command - byte which is peeked above needs to be dealt with, otherwise - the command bytes will overflow the buffer eventually */ - //Buffer_GetElement(&Rx_Buffer); // also works - Buffer_Initialize(&Rx_Buffer); - } - } - - - need to add the following defines and globals: - #define RESETPORT PORTB - #define RESETPIN PB0 - #define RESETPORT2 PORTC - #define RESETPIN2 PC2 - #define CR_HEX '\r' - - #define DELAY_VERYSHORT 0x01 - #define DELAY_SHORT 0x02 - #define DELAY_MEDIUM 0x03 - #define DELAY_LONG 0x05 - #define DELAY_MULTIPLE 0x04 - - /* AVR Device Codes - Can have a maximum of 14 but can be any you want. - Note that these are completely irrelevent. If AVRdude supports a - device, then that device is programmable. Use -F switch to ignore - device codes. */ - #define AVRDEVCODE01 0x55 /* ATtiny12 */ - #define AVRDEVCODE02 0x56 /* ATtiny15 */ - #define AVRDEVCODE03 0x5E /* ATtiny261 */ - #define AVRDEVCODE04 0x76 /* ATmega8 */ - #define AVRDEVCODE05 0x74 /* ATmega16 */ - #define AVRDEVCODE06 0x72 /* ATmega32 */ - #define AVRDEVCODE07 0x45 /* ATmega64 */ - #define AVRDEVCODE08 0x74 /* ATmega644 */ - #define AVRDEVCODE09 0x43 /* ATmega128 */ - #define AVRDEVCODE10 0x63 /* ATmega162 */ - #define AVRDEVCODE11 0x78 /* ATmega169 */ - #define AVRDEVCODE12 0x6C /* AT90S4434 */ - #define AVRDEVCODE13 0x38 /* AT90S8515A */ - #define AVRDEVCODE14 0x65 /* AT90S8555 */ - - /* some global variables used throughout */ - uint8_t tempIOreg = 0; - uint8_t tempIOreg2 = 0; - uint8_t tempIOreg3 = 0; - uint8_t tempIOreg4 = 0; - uint8_t dataWidth = 0; - uint8_t firstRun = 1; - uint8_t deviceCode = 0; - uint8_t tempByte = 0; - uint16_t currAddress = 0; - uint16_t timerval = 0; - diff --git a/Projects/AVRISP_Programmer/AVRISP_Programmer.aps b/Projects/AVRISP_Programmer/AVRISP_Programmer.aps deleted file mode 100644 index 7480023174..0000000000 --- a/Projects/AVRISP_Programmer/AVRISP_Programmer.aps +++ /dev/null @@ -1 +0,0 @@ -AVRISP_Programmer30-Sep-2008 14:18:3930-Sep-2008 14:18:52241030-Sep-2008 14:18:3944, 14, 0, 589AVR GCCC:\Users\Dean\Documents\Electronics\Projects\WORK\MyUSBWORK\Demos\AVRISP_Programmer\falseR00R01R02R03R04R05R06R07R08R09R10R11R12R13R14R15R16R17R18R19R20R21R22R23R24R25R26R27R28R29R30R31Auto000Descriptors.cRingBuff.cAVRISP_Programmer.cDescriptors.hRingBuff.hAVRISP_Programmer.hmakefiledefaultYESmakefileatmega128111AVRISP_Programmer.elfdefault\1-Wall -gdwarf-2 -std=gnu99 -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enumsdefault1C:\WinAVR-20080512\bin\avr-gcc.exeC:\WinAVR-20080512\utils\bin\make.exe diff --git a/Projects/AVRISP_Programmer/AVRISP_Programmer.c b/Projects/AVRISP_Programmer/AVRISP_Programmer.c deleted file mode 100644 index 58593670e0..0000000000 --- a/Projects/AVRISP_Programmer/AVRISP_Programmer.c +++ /dev/null @@ -1,763 +0,0 @@ -/* - LUFA Library - Copyright (C) Dean Camera, 2009. - - dean [at] fourwalledcubicle [dot] com - www.fourwalledcubicle.com -*/ - -/* - Copyright 2009 Dean Camera (dean [at] fourwalledcubicle [dot] com) - AVR ISP Programmer code Copyright 2009 Opendous Inc. (www.opendous.org) - For more info and usage instructions for this firmware, visit: - http://code.google.com/p/avropendous/wiki/AVR_ISP_Programmer - - Note that this firmware is designed to work with AVRdude: - http://savannah.nongnu.org/projects/avrdude - But should work with other software that supports the AVR910 ISP - programmer or STK200 hardware. - - 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. -*/ - -/* - Usage: - avrdude -vv -F -P COM7 -c avr910 -p t261 - Note -F flag which overrides signature check and enables programming - of any "In-System Programmable via SPI Port" AVR MCU. Part number, - t261, should be set to your target device. - avrdude -vv -F -P COM7 -c avr910 -p t261 -U flash:w:PROG.hex - PROG.hex is the hex file to program your t261 AVR with - avrdude -vv -F -P COM7 -b 115200 -c avr910 -p t261 -U flash:w:test.hex - The -b 115200 sets the SPI clock to 62.5kHz from the default 125kHz and may - work when the default programming speed fails. - AVROSP.exe -dATtiny261 -cCOM7 -rf - AVRosp is the Open Source AVR ISP Programming Software available from Atmel.com - - Note: on Linux systems, COM7 should be replaced with someting like /dev/ttyACM0 - You can determine this value by running dmesg after plugging in the device - Note: you must RESET the programmer after each use (AVRdude session). - - Note: If you experience errors with older devices, try changing the DELAY defines - - MISO, MOSI, and SCK are connected directly from the AVRopendous board - to the pin of the same functionality on the target. RESET pin on the target - can be connected either to SS (PB0), or PC2. Do not have any other pins - connected - especially HWB pin, to avoid unintentional behaviour. - - AVR910 functionality was overlayed on USBtoSerial functionality. - Keep this in mind when looking over the code. - Default target speed is 125kHz and corresponds to 19200 baud, which - is the default setting for AVRdude. - - Changing "Baud-Rate" will change the SPI speed. Defualt SPI clock speed - is 8Mhz / 4 = 2MHz. 8Mhz is the device clock speed. This is the setting at - 9600 baud. The following is a table of baud-rate vs. SPI Speed that will result - 9600 = 2Mhz - 14400 = 1MHz - 19200 = 125kHz (AVRdude Default) - 38400 = 250kHz - 57600 = 500kHz - 115200 = 62.5kHz - - Before running, you will need to install the INF file that - is located in the project directory. This will enable - Windows to use its inbuilt CDC drivers, negating the need - for special Windows drivers for the device. To install, - right-click the .INF file and choose the Install option. -*/ - -/* TODO: - fix the requirement that a RESET must be performed after each session, which - is only an issue under Windows. Everything works fine under Linux -*/ - -#include "AVRISP_Programmer.h" - -/* Project Tags, for reading out using the ButtLoad project */ -BUTTLOADTAG(ProjName, "LUFA AVR910 ISP Programmer"); -BUTTLOADTAG(BuildTime, __TIME__); -BUTTLOADTAG(BuildDate, __DATE__); -BUTTLOADTAG(LUFAVersion, "LUFA V" LUFA_VERSION_STRING); - - -#define RESETPORT PORTB -#define RESETPIN PB0 -#define RESETPORT2 PORTC -#define RESETPIN2 PC2 -#define CR_HEX '\r' - -#define DELAY_VERYSHORT 0x01 -#define DELAY_SHORT 0x02 -#define DELAY_MEDIUM 0x03 -#define DELAY_LONG 0x05 -#define DELAY_MULTIPLE 0x02 - - -/* AVR Device Codes - Can have a maximum of 14 but can be any you want. - Note that these are completely irrelevent. If AVRdude supports a device, - then that device is programmable. Use -F switch to ignore device codes. */ -#define AVRDEVCODE01 0x55 /* ATtiny12 */ -#define AVRDEVCODE02 0x56 /* ATtiny15 */ -#define AVRDEVCODE03 0x5E /* ATtiny261 */ -#define AVRDEVCODE04 0x76 /* ATmega8 */ -#define AVRDEVCODE05 0x74 /* ATmega16 */ -#define AVRDEVCODE06 0x72 /* ATmega32 */ -#define AVRDEVCODE07 0x45 /* ATmega64 */ -#define AVRDEVCODE08 0x74 /* ATmega644 */ -#define AVRDEVCODE09 0x43 /* ATmega128 */ -#define AVRDEVCODE10 0x63 /* ATmega162 */ -#define AVRDEVCODE11 0x78 /* ATmega169 */ -#define AVRDEVCODE12 0x6C /* AT90S4434 */ -#define AVRDEVCODE13 0x38 /* AT90S8515A */ -#define AVRDEVCODE14 0x65 /* AT90S8555 */ - - -/* Scheduler Task List */ -TASK_LIST -{ - { Task: USB_USBTask , TaskStatus: TASK_STOP }, - { Task: CDC_Task , TaskStatus: TASK_STOP }, -}; - -/* Globals: */ -/** Contains the current baud rate and other settings of the virtual serial port. - * - These values are set by the host via a class-specific request, and the physical USART should be reconfigured to match the - new settings each time they are changed by the host. - */ -CDC_Line_Coding_t LineCoding = { BaudRateBPS: 9600, - CharFormat: OneStopBit, - ParityType: Parity_None, - DataBits: 8 }; - -/** Ring (circular) buffer to hold the RX data - data from the host to the attached device on the serial port. */ -RingBuff_t Rx_Buffer; - -/** Ring (circular) buffer to hold the TX data - data from the attached device on the serial port to the host. */ -RingBuff_t Tx_Buffer; - -/** Flag to indicate if the USART is currently transmitting data from the Rx_Buffer circular buffer. */ -volatile bool Transmitting = false; - -/* some global variables used throughout */ -uint16_t currAddress = 0; - -/** Main program entry point. This routine configures the hardware required by the application, then - starts the scheduler to run the application tasks. - */ -int main(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(); - ReconfigureSPI(); - - DDRC |= ((1 << PC2) | (1 << PC4) | (1 << PC5) | (1 << PC6) | (1 << PC7)); //AT90USBxx2 - // PC2 is also used for RESET, so set it HIGH initially - note 'P' command sets it to LOW (Active) - PORTC |= ((1 << PC2) | (1 << PC4) | (1 << PC5) | (1 << PC6) | (1 << PC7)); //AT90USBxx2 - DDRD = 0; - PORTD = (1 << PB7); // only PB7(HWB) should be High as this is the bootloader pin - // Prepare PortB for SPI - set PB0(^SS), PB1(SCK), PB2(MOSI) as output as well as all other pins except PB3(MISO) - DDRB = (1 << PB0) | (1 << PB1) | (1 << PB2) | (0 << PB3) | (1 << PB4) | (1 << PB5) | (1 << PB6) | (1 << PB7); - PORTB |= (1 << PB0); - // make sure DataFlash devices to not interfere - deselect them by setting PE0 and PE1 HIGH: - PORTE = 0xFF; - DDRE = 0xFF; - - /* Ringbuffer Initialization */ - Buffer_Initialize(&Rx_Buffer); - Buffer_Initialize(&Tx_Buffer); - - /* Indicate USB not ready */ - UpdateStatus(Status_USBNotReady); - - /* Initialize Scheduler so that it can be used */ - Scheduler_Init(); - - /* Initialize USB Subsystem */ - USB_Init(); - - /* Scheduling - routine never returns, so put this last in the main function */ - Scheduler_Start(); -} - -/** Event handler for the USB_Connect event. This indicates that the device is enumerating via the status LEDs and - starts the library USB task to begin the enumeration and USB management process. - */ -EVENT_HANDLER(USB_Connect) -{ - /* Start USB management task */ - Scheduler_SetTaskMode(USB_USBTask, TASK_RUN); - - /* Indicate USB enumerating */ - UpdateStatus(Status_USBEnumerating); -} - -/** Event handler for the USB_Disconnect event. This indicates that the device is no longer connected to a host via - the status LEDs and stops the USB management and CDC management tasks. - */ -EVENT_HANDLER(USB_Disconnect) -{ - /* Stop running CDC and USB management tasks */ - Scheduler_SetTaskMode(CDC_Task, TASK_STOP); - Scheduler_SetTaskMode(USB_USBTask, TASK_STOP); - - /* Indicate USB not ready */ - UpdateStatus(Status_USBNotReady); -} - -/** Event handler for the USB_ConfigurationChanged event. This is fired when the host set the current configuration - of the USB device after enumeration - the device endpoints are configured and the CDC management task started. - */ -EVENT_HANDLER(USB_ConfigurationChanged) -{ - /* Setup CDC Notification, Rx and Tx Endpoints */ - Endpoint_ConfigureEndpoint(CDC_NOTIFICATION_EPNUM, EP_TYPE_INTERRUPT, - ENDPOINT_DIR_IN, CDC_NOTIFICATION_EPSIZE, - ENDPOINT_BANK_SINGLE); - - Endpoint_ConfigureEndpoint(CDC_TX_EPNUM, EP_TYPE_BULK, - ENDPOINT_DIR_IN, CDC_TXRX_EPSIZE, - ENDPOINT_BANK_SINGLE); - - Endpoint_ConfigureEndpoint(CDC_RX_EPNUM, EP_TYPE_BULK, - ENDPOINT_DIR_OUT, CDC_TXRX_EPSIZE, - ENDPOINT_BANK_SINGLE); - - /* Indicate USB connected and ready */ - UpdateStatus(Status_USBReady); - - /* Start CDC task */ - Scheduler_SetTaskMode(CDC_Task, TASK_RUN); -} - -/** Event handler for the USB_UnhandledControlPacket event. This is used to catch standard and class specific - control requests that are not handled internally by the USB library (including the CDC control commands, - which are all issued via the control endpoint), so that they can be handled appropriately for the application. - */ -EVENT_HANDLER(USB_UnhandledControlPacket) -{ - uint8_t* LineCodingData = (uint8_t*)&LineCoding; - - /* Process CDC specific control requests */ - switch (bRequest) - { - case REQ_GetLineEncoding: - if (bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE)) - { - /* Acknowledge the SETUP packet, ready for data transfer */ - Endpoint_ClearSetupReceived(); - - /* Write the line coding data to the control endpoint */ - Endpoint_Write_Control_Stream_LE(LineCodingData, sizeof(LineCoding)); - - /* Finalize the stream transfer to send the last packet or clear the host abort */ - Endpoint_ClearSetupOUT(); - } - - break; - case REQ_SetLineEncoding: - if (bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE)) - { - /* Acknowledge the SETUP packet, ready for data transfer */ - Endpoint_ClearSetupReceived(); - - /* Read the line coding data in from the host into the global struct */ - Endpoint_Read_Control_Stream_LE(LineCodingData, sizeof(LineCoding)); - - /* Finalize the stream transfer to clear the last packet from the host */ - Endpoint_ClearSetupIN(); - - /* Reconfigure the USART with the new settings */ - ReconfigureSPI(); - } - - break; - case REQ_SetControlLineState: - if (bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE)) - { - /* Acknowledge the SETUP packet, ready for data transfer */ - Endpoint_ClearSetupReceived(); - - /* Acknowledge status stage */ - while (!(Endpoint_IsSetupINReady())); - Endpoint_ClearSetupIN(); - } - - break; - } -} - -/** Task to manage CDC data transmission and reception to and from the host, from and to the physical USART. */ -TASK(CDC_Task) -{ - if (USB_IsConnected) - { - /* Select the Serial Rx Endpoint */ - Endpoint_SelectEndpoint(CDC_RX_EPNUM); - - if (Endpoint_ReadWriteAllowed()) - { - /* Read the received data endpoint into the transmission buffer */ - while (Endpoint_BytesInEndpoint()) - { - /* Wait until the buffer has space for a new character */ - while (!((BUFF_STATICSIZE - Rx_Buffer.Elements))); - - /* Store each character from the endpoint */ - Buffer_StoreElement(&Rx_Buffer, Endpoint_Read_Byte()); - - /* Run the given command once enough data is available. */ - if (Rx_Buffer.Elements) - { - const uint8_t ZeroDataByteCommands[] = {'P', 'a', 'm', 'R', 'd', 'e', 'L', 's', 't', 'S', 'V', 'v', 'p', 'F'}; - const uint8_t OneDataByteCommands[] = {'T', 'c', 'C', 'D', 'l', 'f', 'x', 'y'}; - const uint8_t TwoDataByteCommands[] = {'A', 'Z'}; - const uint8_t ThreeDataByteCommands[] = {':'}; - const uint8_t FourDataByteCommands[] = {'.'}; - - const struct - { - const uint8_t TotalCommands; - const uint8_t* CommandBytes; - } AVR910Commands[] = {{sizeof(ZeroDataByteCommands), ZeroDataByteCommands}, - {sizeof(OneDataByteCommands), OneDataByteCommands}, - {sizeof(TwoDataByteCommands), TwoDataByteCommands}, - {sizeof(ThreeDataByteCommands), ThreeDataByteCommands}, - {sizeof(FourDataByteCommands), FourDataByteCommands}}; - - /* Determine the data length of the issued command */ - uint8_t CommandDataLength = (Rx_Buffer.Elements - 1); - - /* Loop through each of the possible command bytes allowable from the given command data length */ - for (uint8_t CurrentCommand = 0; CurrentCommand < AVR910Commands[CommandDataLength].TotalCommands; CurrentCommand++) - { - /* If issues command matches an allowable command, process it */ - if (Buffer_PeekElement(&Rx_Buffer) == AVR910Commands[CommandDataLength].CommandBytes[CurrentCommand]) - processHostSPIRequest(); - } - } - } - - /* Clear the endpoint buffer */ - Endpoint_ClearCurrentBank(); - } - - /* Select the Serial Tx Endpoint */ - Endpoint_SelectEndpoint(CDC_TX_EPNUM); - - /* Check if the Tx buffer contains anything to be sent to the host */ - if (Tx_Buffer.Elements) - { - /* Wait until Serial Tx Endpoint Ready for Read/Write */ - while (!(Endpoint_ReadWriteAllowed())); - - /* Check before sending the data if the endpoint is completely full */ - bool IsFull = (Endpoint_BytesInEndpoint() == CDC_TXRX_EPSIZE); - - /* Write the transmission buffer contents to the received data endpoint */ - while (Tx_Buffer.Elements && (Endpoint_BytesInEndpoint() < CDC_TXRX_EPSIZE)) - Endpoint_Write_Byte(Buffer_GetElement(&Tx_Buffer)); - - /* Send the data */ - Endpoint_ClearCurrentBank(); - - /* If a full endpoint was sent, we need to send an empty packet afterwards to terminate the transfer */ - if (IsFull) - { - /* Wait until Serial Tx Endpoint Ready for Read/Write */ - while (!(Endpoint_ReadWriteAllowed())); - - /* Send an empty packet to terminate the transfer */ - Endpoint_ClearCurrentBank(); - } - } - } -} - -/** Function to manage status updates to the user. This is done via LEDs on the given board, if available, but may be changed to - * log to a serial port, or anything else that is suitable for status updates. - * - * \param CurrentStatus Current status of the system, from the USBtoSerial_StatusCodes_t enum - */ -void UpdateStatus(uint8_t CurrentStatus) -{ - uint8_t LEDMask = LEDS_NO_LEDS; - - /* Set the LED mask to the appropriate LED mask based on the given status code */ - switch (CurrentStatus) - { - case Status_USBNotReady: - LEDMask = (LEDS_LED1); - break; - case Status_USBEnumerating: - LEDMask = (LEDS_LED1 | LEDS_LED2); - break; - case Status_USBReady: - LEDMask = (LEDS_LED2 | LEDS_LED4); - break; - } - - /* Set the board LEDs to the new LED mask */ - LEDs_SetAllLEDs(LEDMask); -} - -/** Reconfigures SPI to match the current serial port settings issued by the host. */ -void ReconfigureSPI(void) -{ - uint8_t SPCRmask = (1 << SPE) | (1 << MSTR); // always enable SPI as Master - uint8_t SPSRmask = 0; - - /* Determine stop bits - 1.5 stop bits is set as 1 stop bit due to hardware limitations */ - /* For SPI, determine whether format is LSB or MSB */ - if (LineCoding.CharFormat == TwoStopBits) { - SPCRmask |= (1 << DORD); - } else if (LineCoding.CharFormat == OneStopBit) { - SPCRmask |= (0 << DORD); - } - - /* Determine data size - 5, 6, 7, or 8 bits are supported */ - /* Changing line coding changes SPI Mode - CPOL=0, CPHA=0 Sample (Rising) Setup (Falling) SPI-Mode0 == 8 bits line coding - CPOL=0, CPHA=1 Setup (Rising) Sample (Falling) SPI-Mode1 == 7 bits line coding - CPOL=1, CPHA=0 Sample (Falling) Setup (Rising) SPI-Mode2 == 6 bits line coding - CPOL=1, CPHA=1 Setup (Falling) Sample (Rising) SPI-Mode3 == 5 bits line coding - */ - if (LineCoding.DataBits == 5) { - SPCRmask |= ((1 << CPOL) | (1 << CPHA)); - } else if (LineCoding.DataBits == 6) { - SPCRmask |= ((1 << CPOL) | (0 << CPHA)); - } else if (LineCoding.DataBits == 7) { - SPCRmask |= ((0 << CPOL) | (1 << CPHA)); - } else if (LineCoding.DataBits == 8) { - SPCRmask |= ((0 << CPOL) | (0 << CPHA)); - } - - - /* Set the USART baud rate register to the desired baud rate value */ - /* also alter the SPI speed via value of baud rate */ - if (LineCoding.BaudRateBPS == 9600) { // 2Mhz SPI (Fosc / 4) - SPCRmask |= ((0 << SPR1) | (0 << SPR0)); - SPSRmask |= (0 << SPI2X); - } else if (LineCoding.BaudRateBPS == 14400) { // 1Mhz SPI (Fosc / 8) - SPCRmask |= ((0 << SPR1) | (1 << SPR0)); - SPSRmask |= (1 << SPI2X); - } else if (LineCoding.BaudRateBPS == 57600) { // 500kHz SPI (Fosc / 16) - SPCRmask |= ((0 << SPR1) | (1 << SPR0)); - SPSRmask |= (0 << SPI2X); - } else if (LineCoding.BaudRateBPS == 38400) { // 250kHz SPI (Fosc / 32) - SPCRmask |= ((1 << SPR1) | (0 << SPR0)); - SPSRmask |= (1 << SPI2X); - } else if (LineCoding.BaudRateBPS == 19200) { // 125kHz SPI (Fosc / 64) - SPCRmask |= ((1 << SPR1) | (0 << SPR0)); - SPSRmask |= (0 << SPI2X); - } else if (LineCoding.BaudRateBPS == 115200) { // 62.5kHz SPI (Fosc / 128) - SPCRmask |= ((1 << SPR1) | (1 << SPR0)); - SPSRmask |= (0 << SPI2X); - } - - SPCR = SPCRmask; - SPSR = SPSRmask; -} - - -/* process data according to AVR910 protocol */ -void processHostSPIRequest(void) { - - uint8_t readByte1 = 0; - uint8_t readByte2 = 0; - uint8_t readByte3 = 0; - uint8_t readByte4 = 0; - uint8_t firstByte = 0; - - /* Taken from a90isp_ver23.asm: - +-------------+------------+------+ - ;* Commands | Host writes | Host reads | | - ;* -------- +-----+-------+------+-----+ | - ;* | ID | data | data | | Note | - ;* +-----------------------------------+-----+-------+------+-----+------+ - ;* | Enter programming mode | 'P' | | | 13d | 1 | - ;* | Report autoincrement address | 'a' | | | 'Y' | | - ;* | Set address | 'A' | ah al | | 13d | 2 | - ;* | Write program memory, low byte | 'c' | dd | | 13d | 3 | - ;* | Write program memory, high byte | 'C' | dd | | 13d | 3 | - ;* | Issue Page Write | 'm' | | | 13d | | - ;* | Read program memory | 'R' | |dd(dd)| | 4 | - ;* | Write data memory | 'D' | dd | | 13d | | - ;* | Read data memory | 'd' | | dd | | | - ;* | Chip erase | 'e' | | | 13d | | - ;* | Write lock bits | 'l' | dd | | 13d | | - ;* | Write fuse bits | 'f' | dd | | 13d | 11 | - ;* | Read fuse and lock bits | 'F' | | dd | | 11 | - ;* | Leave programming mode | 'L' | | | 13d | 5 | - ;* | Select device type | 'T' | dd | | 13d | 6 | - ;* | Read signature bytes | 's' | | 3*dd | | | - ;* | Return supported device codes | 't' | | n*dd | 00d | 7 | - ;* | Return software identifier | 'S' | | s[7] | | 8 | - ;* | Return sofware version | 'V' | |dd dd | | 9 | - ;* | Return hardware version | 'v' | |dd dd | | 9 | - ;* | Return programmer type | 'p' | | dd | | 10 | - ;* | Set LED | 'x' | dd | | 13d | 12 | - ;* | Clear LED | 'y' | dd | | 13d | 12 | - ;* | Universial command | ':' | 3*dd | dd | 13d | | - ;* | New universal command | '.' | 4*dd | dd | 13d | | - ;* | Special test command | 'Z' | 2*dd | dd | | | - */ - - firstByte = Buffer_GetElement(&Rx_Buffer); - Buffer_Initialize(&Tx_Buffer); // make sure the buffer is clear before proceeding - - if (firstByte == 'P') { // enter Programming mode - // enable SPI -- already done - // enter programming mode on target: - //PORTB = 0; // set clock to zero - RESETPORT = (1 << RESETPIN); // set RESET pin on target to 1 - RESETPORT2 = (1 << RESETPIN2); - _delay_ms(DELAY_SHORT); - //RESETPORT = (RESETPORT & ~(1 << RESETPIN)); // set RESET pin on target to 0 - Active - RESETPORT = 0x00; - RESETPORT2 = 0; - _delay_ms(DELAY_SHORT); - SPI_SendByte(0xAC); - SPI_SendByte(0x53); - SPI_SendByte(0x00); - SPI_SendByte(0x00); - _delay_ms(DELAY_VERYSHORT); - Buffer_StoreElement(&Tx_Buffer, CR_HEX); // return carriage return (CR_HEX) if successful - - } else if (firstByte == 'T') { // Select device type - Buffer_GetElement(&Rx_Buffer); // set device type - Buffer_StoreElement(&Tx_Buffer, CR_HEX); // return carriage return (CR_HEX) if successful - - } else if (firstByte == 'a') { // Report autoincrement address - Buffer_StoreElement(&Tx_Buffer, 'Y'); // return 'Y' - Auto-increment enabled - - } else if (firstByte == 'A') { //Load Address - // get two bytes over serial and set currAddress to them - readByte1 = Buffer_GetElement(&Rx_Buffer); // high byte - readByte2 = Buffer_GetElement(&Rx_Buffer); // low byte - currAddress = (readByte1 << 8) | (readByte2); - Buffer_StoreElement(&Tx_Buffer, CR_HEX); // return carriage return (CR_HEX) if successful - - } else if (firstByte == 'c') { // Write program memory, low byte - // send 4 bytes over SPI; 0x40, then Address High Byte, then Low, then data - readByte1 = Buffer_GetElement(&Rx_Buffer); - SPI_SendByte(0x40); - SPI_SendByte((currAddress >> 8)); // high byte - SPI_SendByte((currAddress)); // low byte - SPI_SendByte(readByte1); // data - _delay_ms(DELAY_MEDIUM); // certain MCUs require a delay of about 24585 cycles - Buffer_StoreElement(&Tx_Buffer, CR_HEX); // return carriage return (CR_HEX) if successful - - } else if (firstByte == 'C') { // Write program memory, high byte - // send 4 bytes over SPI; 0x48, then Address High Byte, then Low, then data - readByte1 = Buffer_GetElement(&Rx_Buffer); - SPI_SendByte(0x48); - SPI_SendByte((currAddress >> 8)); // high byte - SPI_SendByte((currAddress)); // low byte - SPI_SendByte(readByte1); // data - currAddress++; // increment currAddress - Buffer_StoreElement(&Tx_Buffer, CR_HEX); // return carriage return (CR_HEX) if successful - - } else if (firstByte == 'm') { // Write Program Memory Page - // send 4 bytes over SPI; 0x4c, then Address High Byte, then Low, then 0x00 - SPI_SendByte(0x4C); - SPI_SendByte((currAddress >> 8)); // high byte - SPI_SendByte((currAddress)); // low byte - SPI_SendByte(0x00); - _delay_ms(DELAY_LONG); - Buffer_StoreElement(&Tx_Buffer, CR_HEX); // return carriage return (CR_HEX) if successful - - } else if (firstByte == 'R') { // Read Program Memory - // send 4 bytes over SPI; 0x28, then Address High Byte, then Low, then send back read data from 4th byte over serial - SPI_SendByte(0x28); - SPI_SendByte((currAddress >> 8)); // high byte - SPI_SendByte((currAddress)); // low byte - readByte1 = SPI_TransferByte(0x00); // read in data - Buffer_StoreElement(&Tx_Buffer, readByte1); - // send 4 bytes over SPI; 0x20, then Address High Byte, then Low, then send back read data from 4th byte over serial - SPI_SendByte(0x20); - SPI_SendByte((currAddress >> 8)); // high byte - SPI_SendByte((currAddress)); // low byte - readByte2 = SPI_TransferByte(0x00); // read in data - Buffer_StoreElement(&Tx_Buffer, readByte2); - currAddress++; // increment currAddress - - } else if (firstByte == 'D') { // Write Data Memory - // send 4 bytes over SPI; 0xc0, then Address High Byte, then Low, then data - readByte1 = Buffer_GetElement(&Rx_Buffer); - SPI_SendByte(0xC0); - SPI_SendByte((currAddress >> 8)); // high byte - SPI_SendByte((currAddress)); // low byte - SPI_SendByte(readByte1); // data - _delay_ms(DELAY_MEDIUM); - currAddress++; // increment currAddress - Buffer_StoreElement(&Tx_Buffer, CR_HEX); // return carriage return (CR_HEX) if successful - - } else if (firstByte == 'd') { // Read Data Memory - // send 4 bytes over SPI; 0xa0, then Address High Byte, then Low, then send back read data from 4th byte over serial - SPI_SendByte(0xA0); - SPI_SendByte((currAddress >> 8)); // high byte - SPI_SendByte((currAddress)); // low byte - readByte1 = SPI_TransferByte(0x00); // read in data - Buffer_StoreElement(&Tx_Buffer, readByte1); - currAddress++; // increment currAddress - - } else if (firstByte == 'e') { // erase the target device - // send 4 bytes over SPI; 0xac, 0x80, 0x04, 0x00 - SPI_SendByte(0xAC); - SPI_SendByte(0x80); - SPI_SendByte(0x04); - SPI_SendByte(0x00); - _delay_ms(DELAY_LONG); - Buffer_StoreElement(&Tx_Buffer, CR_HEX); // return carriage return (CR_HEX) if successful - - } else if (firstByte == 'l') { // write lock bits - // send 4 bytes over SPI; 0xac, [andi s_data 0x06], 0xe0, 0x00 - readByte1 = Buffer_GetElement(&Rx_Buffer); // read in lock bits data - SPI_SendByte(0xAC); - SPI_SendByte(((0x06 & readByte1) | 0xE0)); // TODO - is this correct??? - SPI_SendByte(0x00); - SPI_SendByte(0x00); - _delay_ms(DELAY_MEDIUM); - Buffer_StoreElement(&Tx_Buffer, CR_HEX); // return carriage return (CR_HEX) if successful - - } else if (firstByte == 'f') { // write fuse bits - // ignore this command, but need to remove data from the receive buffer - readByte1 = Buffer_GetElement(&Rx_Buffer); - Buffer_StoreElement(&Tx_Buffer, CR_HEX); // return carriage return (CR_HEX) if successful - - } else if (firstByte == 'L') { // leave programming mode - RESETPORT |= (1 << RESETPIN); // set RESET pin on target to 1 - RESETPORT2 |= (1 << RESETPIN2); // set RESET pin on target to 1 - Buffer_StoreElement(&Tx_Buffer, CR_HEX); // return carriage return (CR_HEX) if successful - - } else if (firstByte == 's') { // Read signature bytes - // send 4 bytes over SPI; 0x30, 0x00, 0x02, read and send last byte over serial - SPI_SendByte(0x30); - SPI_SendByte(0x00); - SPI_SendByte(0x02); - readByte1 = SPI_TransferByte(0x00); // read in data - Buffer_StoreElement(&Tx_Buffer, readByte1); - SPI_SendByte(0x30); - SPI_SendByte(0x00); - SPI_SendByte(0x01); - readByte1 = SPI_TransferByte(0x00); // read in data - Buffer_StoreElement(&Tx_Buffer, readByte1); - SPI_SendByte(0x30); - SPI_SendByte(0x00); - SPI_SendByte(0x00); - readByte1 = SPI_TransferByte(0x00); // read in data - Buffer_StoreElement(&Tx_Buffer, readByte1); - - } else if (firstByte == 't') { // Return supported device codes - Buffer_StoreElement(&Tx_Buffer, AVRDEVCODE01); - Buffer_StoreElement(&Tx_Buffer, AVRDEVCODE02); - Buffer_StoreElement(&Tx_Buffer, AVRDEVCODE03); - Buffer_StoreElement(&Tx_Buffer, AVRDEVCODE04); - Buffer_StoreElement(&Tx_Buffer, AVRDEVCODE05); - Buffer_StoreElement(&Tx_Buffer, AVRDEVCODE06); - Buffer_StoreElement(&Tx_Buffer, AVRDEVCODE07); - Buffer_StoreElement(&Tx_Buffer, AVRDEVCODE08); - Buffer_StoreElement(&Tx_Buffer, AVRDEVCODE09); - Buffer_StoreElement(&Tx_Buffer, AVRDEVCODE10); - Buffer_StoreElement(&Tx_Buffer, AVRDEVCODE11); - Buffer_StoreElement(&Tx_Buffer, AVRDEVCODE12); - Buffer_StoreElement(&Tx_Buffer, AVRDEVCODE13); - Buffer_StoreElement(&Tx_Buffer, AVRDEVCODE14); - Buffer_StoreElement(&Tx_Buffer, 0x00); - - } else if (firstByte == 'S') { // Return software identifier - // return string[7] with "AVR ISP" - Buffer_StoreElement(&Tx_Buffer, 'A'); - Buffer_StoreElement(&Tx_Buffer, 'V'); - Buffer_StoreElement(&Tx_Buffer, 'R'); - Buffer_StoreElement(&Tx_Buffer, 0x20); - Buffer_StoreElement(&Tx_Buffer, 'I'); - Buffer_StoreElement(&Tx_Buffer, 'S'); - Buffer_StoreElement(&Tx_Buffer, 'P'); - - } else if (firstByte == 'V') { // Return sofware version - //return two bytes, software Major then Minor - Buffer_StoreElement(&Tx_Buffer, '2'); - Buffer_StoreElement(&Tx_Buffer, '3'); - - } else if (firstByte == 'v') { // Return hardware version - //return two bytes, hardware Major then Minor - Buffer_StoreElement(&Tx_Buffer, ('1')); - Buffer_StoreElement(&Tx_Buffer, ('0')); - - } else if (firstByte == 'p') { // Return programmer type - // return 'S' for Serial Programmer - Buffer_StoreElement(&Tx_Buffer, 'S'); - - } else if (firstByte == 'x') { // set LED - // ignore this command, but need to remove data from the receive buffer - readByte1 = Buffer_GetElement(&Rx_Buffer); - Buffer_StoreElement(&Tx_Buffer, CR_HEX); // return carriage return (CR_HEX) if successful - - } else if (firstByte == 'y') { // clear LED - // ignore this command, but need to remove data from the receive buffer - readByte1 = Buffer_GetElement(&Rx_Buffer); - Buffer_StoreElement(&Tx_Buffer, CR_HEX); // return carriage return (CR_HEX) if successful - - } else if (firstByte == ':') { // Universal Command - // get 3 bytes over serial - readByte1 = Buffer_GetElement(&Rx_Buffer); - readByte2 = Buffer_GetElement(&Rx_Buffer); - readByte3 = Buffer_GetElement(&Rx_Buffer); - SPI_SendByte(readByte1); - SPI_SendByte(readByte2); - SPI_SendByte(readByte3); - readByte1 = SPI_TransferByte(0x00); - Buffer_StoreElement(&Tx_Buffer, readByte1); - _delay_ms(DELAY_MEDIUM); - Buffer_StoreElement(&Tx_Buffer, CR_HEX); // return carriage return (CR_HEX) if successful - - } else if (firstByte == '.') { // New Universal Command - // get 4 bytes over serial - readByte1 = Buffer_GetElement(&Rx_Buffer); - readByte2 = Buffer_GetElement(&Rx_Buffer); - readByte3 = Buffer_GetElement(&Rx_Buffer); - readByte4 = Buffer_GetElement(&Rx_Buffer); - SPI_SendByte(readByte1); - SPI_SendByte(readByte2); - SPI_SendByte(readByte3); - readByte1 = SPI_TransferByte(readByte4); - Buffer_StoreElement(&Tx_Buffer, readByte1); - _delay_ms(DELAY_MEDIUM); - Buffer_StoreElement(&Tx_Buffer, CR_HEX); // return carriage return (CR_HEX) if successful - - } else if (firstByte == 'Z') { // Special test command - // do nothing, but need to remove data from the receive buffer - readByte1 = Buffer_GetElement(&Rx_Buffer); - readByte2 = Buffer_GetElement(&Rx_Buffer); - - } else { - // do nothing, but need to return with a carriage return - Buffer_StoreElement(&Tx_Buffer, CR_HEX); // return carriage return (CR_HEX) if successful - } -} - diff --git a/Projects/AVRISP_Programmer/AVRISP_Programmer.h b/Projects/AVRISP_Programmer/AVRISP_Programmer.h deleted file mode 100644 index c6ac13fe7b..0000000000 --- a/Projects/AVRISP_Programmer/AVRISP_Programmer.h +++ /dev/null @@ -1,195 +0,0 @@ -/* - 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 - * - * Header file for USBtoSerial.c. - */ - -#ifndef _AVRISP_PROGRAMMER_H_ -#define _AVRISP_PROGRAMMER_H_ - - /* Includes: */ - #include - #include - #include - #include - #include - - #include "Descriptors.h" - #include "RingBuff.h" - - #include // Library Version Information - #include // PROGMEM tags readable by the ButtLoad project - #include // USB Functionality - #include // SPI driver - #include // LEDs driver - #include // Simple scheduler for task management - - /* Macros: */ - /** CDC Class specific request to get the current virtual serial port configuration settings. */ - #define REQ_GetLineEncoding 0x21 - - /** CDC Class specific request to set the current virtual serial port configuration settings. */ - #define REQ_SetLineEncoding 0x20 - - /** CDC Class specific request to set the current virtual serial port handshake line states. */ - #define REQ_SetControlLineState 0x22 - - /** Notification type constant for a change in the virtual serial port handshake line states, for - * use with a USB_Notification_Header_t notification structure when sent to the host via the CDC - * notification endpoint. - */ - #define NOTIF_SerialState 0x20 - - /** Mask for the DTR handshake line for use with the REQ_SetControlLineState class specific request - * from the host, to indicate that the DTR line state should be high. - */ - #define CONTROL_LINE_OUT_DTR (1 << 0) - - /** Mask for the RTS handshake line for use with the REQ_SetControlLineState class specific request - * from the host, to indicate that theRTS line state should be high. - */ - #define CONTROL_LINE_OUT_RTS (1 << 1) - - /** Mask for the DCD handshake line for use with the a NOTIF_SerialState class specific notification - * from the device to the host, to indicate that the DCD line state is currently high. - */ - #define CONTROL_LINE_IN_DCD (1 << 0) - - /** Mask for the DSR handshake line for use with the a NOTIF_SerialState class specific notification - * from the device to the host, to indicate that the DSR line state is currently high. - */ - #define CONTROL_LINE_IN_DSR (1 << 1) - - /** Mask for the BREAK handshake line for use with the a NOTIF_SerialState class specific notification - * from the device to the host, to indicate that the BREAK line state is currently high. - */ - #define CONTROL_LINE_IN_BREAK (1 << 2) - - /** Mask for the RING handshake line for use with the a NOTIF_SerialState class specific notification - * from the device to the host, to indicate that the RING line state is currently high. - */ - #define CONTROL_LINE_IN_RING (1 << 3) - - /** Mask for use with the a NOTIF_SerialState class specific notification from the device to the host, - * to indicate that a framing error has ocurred on the virtual serial port. - */ - #define CONTROL_LINE_IN_FRAMEERROR (1 << 4) - - /** Mask for use with the a NOTIF_SerialState class specific notification from the device to the host, - * to indicate that a parity error has ocurred on the virtual serial port. - */ - #define CONTROL_LINE_IN_PARITYERROR (1 << 5) - - /** Mask for use with the a NOTIF_SerialState class specific notification from the device to the host, - * to indicate that a data overrun error has ocurred on the virtual serial port. - */ - #define CONTROL_LINE_IN_OVERRUNERROR (1 << 6) - - /* Event Handlers: */ - /** Indicates that this module will catch the USB_Connect event when thrown by the library. */ - HANDLES_EVENT(USB_Connect); - - /** Indicates that this module will catch the USB_Disconnect event when thrown by the library. */ - HANDLES_EVENT(USB_Disconnect); - - /** Indicates that this module will catch the USB_ConfigurationChanged event when thrown by the library. */ - HANDLES_EVENT(USB_ConfigurationChanged); - - /** Indicates that this module will catch the USB_UnhandledControlPacket event when thrown by the library. */ - HANDLES_EVENT(USB_UnhandledControlPacket); - - /* Type Defines: */ - /** Type define for the virtual serial port line encoding settings, for storing the current USART configuration - * as set by the host via a class specific request. - */ - typedef struct - { - uint32_t BaudRateBPS; /**< Baud rate of the virtual serial port, in bits per second */ - uint8_t CharFormat; /**< Character format of the virtual serial port, a value from the - * CDCDevice_CDC_LineCodingFormats_t enum - */ - uint8_t ParityType; /**< Parity setting of the virtual serial port, a value from the - * CDCDevice_LineCodingParity_t enum - */ - uint8_t DataBits; /**< Bits of data per charater of the virtual serial port */ - } CDC_Line_Coding_t; - - /** Type define for a CDC notification, sent to the host via the CDC notification endpoint to indicate a - * change in the device state asynchronously. - */ - typedef struct - { - uint8_t NotificationType; /**< Notification type, a mask of REQDIR_*, REQTYPE_* and REQREC_* constants - * from the library StdRequestType.h header - */ - uint8_t Notification; /**< Notification value, a NOTIF_* constant */ - uint16_t wValue; /**< Notification wValue, notification-specific */ - uint16_t wIndex; /**< Notification wIndex, notification-specific */ - uint16_t wLength; /**< Notification wLength, notification-specific */ - } USB_Notification_Header_t; - - /* Enums: */ - /** Enum for the possible line encoding formats of a virtual serial port. */ - enum CDCDevice_CDC_LineCodingFormats_t - { - OneStopBit = 0, /**< Each frame contains one stop bit */ - OneAndAHalfStopBits = 1, /**< Each frame contains one and a half stop bits */ - TwoStopBits = 2, /**< Each frame contains two stop bits */ - }; - - /** Enum for the possible line encoding parity settings of a virtual serial port. */ - enum CDCDevice_LineCodingParity_t - { - Parity_None = 0, /**< No parity bit mode on each frame */ - Parity_Odd = 1, /**< Odd parity bit mode on each frame */ - Parity_Even = 2, /**< Even parity bit mode on each frame */ - Parity_Mark = 3, /**< Mark parity bit mode on each frame */ - Parity_Space = 4, /**< Space parity bit mode on each frame */ - }; - - /** Enum for the possible status codes for passing to the UpdateStatus() function. */ - enum USBtoSerial_StatusCodes_t - { - Status_USBNotReady = 0, /**< USB is not ready (disconnected from a USB host) */ - Status_USBEnumerating = 1, /**< USB interface is enumerating */ - Status_USBReady = 2, /**< USB interface is connected and ready */ - }; - - /* Tasks: */ - TASK(CDC_Task); - - /* Function Prototypes: */ - void ReconfigureSPI(void); - void UpdateStatus(uint8_t CurrentStatus); - void processHostSPIRequest(void); - -#endif diff --git a/Projects/AVRISP_Programmer/AVRISP_Programmer.txt b/Projects/AVRISP_Programmer/AVRISP_Programmer.txt deleted file mode 100644 index 1872cfb5e7..0000000000 --- a/Projects/AVRISP_Programmer/AVRISP_Programmer.txt +++ /dev/null @@ -1,89 +0,0 @@ -/** \file - * - * 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. - */ - -/** \mainpage AVRISP_Programmer - * - * Communications Device Class demonstration application. - * This gives a simple reference application for implementing - * a USB to Serial converter using the CDC class. Data communicated - * over the USB Virtual Serial Port according to Atmel's AVR910 - * protocol is used to program AVR MCUs that are - * "In-System Programmable via SPI Port". - * - * After running this firmware for the first time on a new computer, - * you will need to supply the .INF file located in this demo - * project's directory as the device's driver when running under - * Windows. This will enable Windows to use its inbuilt CDC drivers, - * negating the need for custom drivers for the device. Other - * Operating Systems should automatically use their own inbuilt - * CDC-ACM drivers. - * - * Usage: - * avrdude -vv -F -P COM7 -c avr910 -p t261 - * Note -F flag which overrides signature check and enables programming - * of any "In-System Programmable via SPI Port" AVR MCU. Part number, - * t261, should be set to your target device. - * avrdude -vv -F -P COM7 -c avr910 -p t261 -U flash:w:PROG.hex - * PROG.hex is the hex file to program your t261 AVR with - * avrdude -vv -F -P COM7 -b 115200 -c avr910 -p t261 -U flash:w:test.hex - * The -b 115200 sets the SPI clock to 62.5kHz from the default 125kHz and may - * work when the default programming speed fails. - * AVROSP.exe -dATtiny261 -cCOM7 -rf - * AVRosp is the Open Source AVR ISP Programming Software available from Atmel.com - * - * Note: on Linux systems, COM7 should be replaced with someting like /dev/ttyACM0 - * You can determine this value by running dmesg after plugging in the device - * Note: you must RESET the programmer after each use (AVRdude session). - * - * Note: If you experience errors with older devices, try changing DELAY_LONG - * to a larger value, such as 0xFF in AVRISP_Programmer.c - * - * MISO, MOSI, and SCK are connected directly from the AVRopendous board - * to the pin of the same functionality on the target. RESET pin on the target - * can be connected either to SS (PB0), or PC2. Do not have any other pins - * connected - especially HWB pin, to avoid unintentional behaviour. - * - * AVR910 functionality was overlayed on USBtoSerial functionality. - * Keep this in mind when looking over the code. - * Default target speed is 125kHz and corresponds to 19200 baud, which - * is the default setting for AVRdude. - * - * Changing "Baud-Rate" will change the SPI speed. Defualt SPI clock speed - * is 8Mhz / 4 = 2MHz. 8Mhz is the device clock speed. This is the setting at - * 9600 baud. The following is a table of baud-rate vs. SPI Speed that will result - * 9600 = 2Mhz - * 14400 = 1MHz - * 19200 = 125kHz (AVRdude Default) - * 38400 = 250kHz - * 57600 = 500kHz - * 115200 = 62.5kHz - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - *
USB Mode:Device
USB Class:Communications Device Class (CDC)
USB Subclass:Abstract Control Model (ACM)
Relevant Standards:USBIF CDC Class Standard
Usable Speeds:Full Speed Mode
- */ diff --git a/Projects/AVRISP_Programmer/AVRISP_Programmer_Picture.jpg b/Projects/AVRISP_Programmer/AVRISP_Programmer_Picture.jpg deleted file mode 100644 index 87ec3d43ee0df3937060894b2773b04fb36aa91e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 74610 zcmce-WmH^2v?khEkOT-CT!J>10KuhkX{4cP+=7MR?iMV;-Q5~@mp}r+3GVK}-5Yz{ zd2h|koj3Di)|&Uu`Ek~+U8kzfUT5$6>f2S%bI)slw_q8082}Oz5};KA#GRcT zEsR~9E$nP*6fI25Y@N)W7Xgw0G*nbHR1`EcRJ2#G&|YESU}B)7W8l5P#=;@QBO)Zg zBOo9qp(ZDONA-??fSiGXiiVbsj*f_o5y z|KGlze*^F^kg-u{P>|jOknxaE@Q|Ln0h9nF05USl%ZLBh>lHdG8Zrt766T9q>n#8Y z1qB7^6$xEKx;aQxs4qI#_1*F z@+MB-kuZF!?OK;ogKeJim;}bxF-n`7IXMR<{F!`dnf#^8|J?6?h%XjGe^K(|y$lKo z1sUZP8Vc%5@ypm=`o%-Vr$yr=5LbQmp3BJLl+Zsmx2AJ^orsQGf*49~eCGJP0C@9K z85s`+4*&vO>jS|^VCXk!LJlFE8STFpI#2x#rGcuyshr`gH2+2a|2+P4wg2?a{~+kw zbxeId@Kh+aNb22g-Uxuk?#u6qxk5{htPqkGO3Vw3O@-3OpBZRB{#FpXZ>_|*5mWbg z2Ed-;7W!0Vb$J__jODdA-oDnB&DH4?xRFzm^gQ39n#ptuv@+>vQH;c^T8-IP0pVLV zw_ZQyuvfMI;fs!rnT1Ko20dgLOi|~R{fXltI^F@YBs*tvsFl*N&n7g%ATg?g(fwpe zT0-=*tv^hXmOt=de|Yqs3fZH222=p){hZ0-BBQrV7*1RtS?HSh>x?Fq|9-|X6<{KH z1_0#IA4?-gA8CZ7nrl|HZDyLS;~bmvvN4{{v-)O9D$78-EoEjjk1fSEGh57`^O!tn zVs~Z8sZ&dQeqAa}?ppiQ6d#{wjyREGbAiwp%rDAstwzKGvZn79lP2bzwD*Qgj>Lj*zTN6pnt#@z&g9rILHx;cODw{dpwy0!3xWS?+L0 znC%6Fo+20a)CCBexNTo!m97(Xa54RsU|K(dQ37(ckn7!`q**M z`!$|c7jUi96=L!%*rmon_k=SVxlexvo`|^O5xlPM2#hapc9%@pl^wL60oJAY@xP>o zX|8u@^sDf;dEbY~n*K!9;k4L76?u$cZr^3E{xb&D6baqQ)sz(pFc+{-|k&4bQzyq&{ zD1I#p>C}HxD|fEP)<(*Yy6R_+Yl!A<&kz(f^*#`#&cA<*Fw38DZR=^hK_g(B+!zh{ z)q1HJw}CrNA2wWtwZLN#7tU!F@F9)r5c7ok`vzQgc`K3Eegl0fi)E$SHNBFZJ=Lz= zVph;=L_PVvBxpre&!ia0bZ?;ks-P{WFj@whOD5Ey#9B$EXZ7hkJ=YQ~m|CNLNpQ@$_OJ$P`I}Eks?RJfWZB`aDFr$>vpQ33} z!mme*+W3R&h4by(vdH}@C25`kHu`TtATg`nh5H75r3Kix574$YPxY2IYdv@Z!ql8q zbRS`y+a@eU6@P?&nO-|L5A(sF5z#rIA$(4L{pwXE=9ZY$*& z1sgFr(l&ZEA7y{(qwp+aS}D*$uhG}6N?07r$IwWmNROz7&Qs4(>LDEVr9I0eeWMpZ zvabq;qOX_7Ni@4h#h4}9Rc4nVH3BMECGJ)~=L7o@pjv&4%4NwJFSRc66vp+BH;S9H zjxC0_$Yo=m3YXBjE^JV_?WmpsfPnbzu@3rJ`L-q1rkSVIOC0=+OAF3AbS0r{b&}l6 zq+eMUFbzc0>U1gecaXeS5P)_ROob(s^R7C*Pk?{Mf+ip*zyWZem@E%R@T5+AW?IxR zzGcm~^Vo)|XMjuhy5z29_>^D%r*OS|=fmDd#y2w$a>kNytUHFSi*qdWf2mB z4tb1+_ysu51Ng+*NgkI}ctbD>^B{{AcZb5Im6k%peZJbpy25)cdv{cqL-f>r+i6Y>zN23nVB z!J6#i%)B^~oZ~~$Wj89>Ag3{p8FG2E0C8SxD`zINQJ+RSuFN5q9wQ*N;JKUSYQfJI z<^H;BpH?>0xE~x*OgJqE%hB`H3&IGbnbMAlHp3~(f@Mf|YqQ3eg&paK-tK_ z8)00Q7+1|Xr31s(;lW+K#=Y~3UWL%1IKa6zRY!U>wP+#{DdZOh(RR4f>eWh~o|iC? z?{!dOGKESX>J@a#9c3x)s_4tFe4At?+7iU?29H*g_ngWmpL}Hze~v3bbvqiz@#8Z} z1ZL7r%HmQQ=o}wPmo-n=^N`k0P7wM6MOk(|K~Fe0$Gez0|MKw{LE?5w2H$lv^Q7M1_V@FE95POucf+wB^2~ooKxH;a5B@ zvw4F2y};2c-llqXTsWuQn0@G}e5XXKt=zr}MDns^*xf{7pS5b?h(oXgS5F%T9Zbsn zMKZT;%`aG-@i}mml)^vS=xe5#-K?N~dPRK+x`U;Z%V{GeWJTh~nrt!6-L!DeQA|+X zANqPYi_}Y~{a-+p|5K6lze7Qqe`m;li%vAVgdF1tLH!uEOw@C!a*=bunPFsYUS$n7R`*+veR;cpDD zgn+IO8xpBeH3{9L*{zQc9WIH~_i~-Yhjy2)l5&xLvxl~ZucIxs);xlRo&mUM2-kdAw zdFXJqA>13!`dXniudA!^mscZiZtpvGl)G8E8J(|}Q@nxaX{&d$(Oq#dNJygd$SsVL z@)RXBW%m*_x8dG-Du{=lrRFu-Q`bOLjGHp6V0~T%@zFJ_&r{8#o6Rwkse3h_cTTHF z8i4dMu4{K+YE?GPlku`d&yfH0rRqrKRL622^8&Q+#Zm0m!Ug zxY~xsgg5UFexO8MZJay_Po9Okg(e=!Bzil1y}V)_J@rzY`pZnTL^p&!sAwAfKyE4h zx}hy(!=;dWbs_3J_U>)frkc*+sxNkHd*0r)-zqh91umBBTJ$9by;nBF=&bY zNu9B2--~_Pi$-sw^_Y7Z9q@v#F#lCXjwOF_E}5}7eg;HYJbhV7fNNQY{nzQqW3uV# z?~=x{8+@#=QUyklMz$~EDJ;?p&}Gm;crTQCDhfC! z-9ixI*t5=#@cu~CwasOeA0T!gqP((c*1d-d093zMfagUN*-Y>H`FcF8qKMo)OF zDmm|`O_M{Zys9=Ihz3j&yo_EeM8a)~fmozq|9-le7IpDC+dP*cie)+{FYia;oR9<6 z?YXe063JOR;2kPr`j{?(DIgatrr4x%@!$w7pYz{x9sYJWS`#*Iv$`qiSe_(^WDAK+jYyb@oc?JJV|H6He5`%shIO*4;s`ORO(zu!Lh{C%W9ZmsuIf4b#i)-=iV%^5 zO(6O`^Dc<{L}##M@kIXA-uP-+Y1=DC_|AAt^WgfAO+#y;)1&9|R=pjZe^k zwnB1v8QV^osxB+tgDlG9Lc16M@CtBFSP?RgaYumpHTn_kg9o!-wdG z_s~GMyi)<9ffHvT>~rjcDvw1Z3O~*?EET|YmVzHA)eQd-{-V>F{yx@s#aoR13~=N^ zKP5__>FyOJituzZu4P@P&=8PbG}-+uV$vWt+O12|mesbIYuK&PzKjQ75pYsoaPvL= zJ_iaRt+?g6uFX;u+_=wsS^Sx`ieDv?OQ=*m?cKaZA7iCXv@~<&E;7(C0Xc;4Car*f z+z&8alrbiBeQ8f)=LshW@Qa1W9V)^-{Jnv4kIDI_*~KbPMDW;ojp7iPmLp+7l$gy% zB6Z$3l(VwqMBT!sWs3Xuti9`-Dr(8U=jEPZ(}{X)7jI+lE$n{EQSB>>Jy>B97Pn24}@r^BQL#88q)tMe+4@^~m9dtc&7ux45_c78*eka7=%&(#0!tVS=!HJ6> zZo(x$CyP!uMWrVu>ja~ zgkuw{cV0s#NB?oL+GqfQZ26O#rtD!ERBD$mL5IFaow9wmVE=e%yW@|zCb<|_3LPmk z%2nvVIgq^OpGsQ8!A4wS4*WBag@h&|fJG%~-t>>QY}h?$x>A>FVxhR1Z^87n(jrr$ zv;ne4mEIc)M3cevfdP&Bx4o!&7v*pV4sXi&B2pt7l(wj|_>09pD$6R>Yw=>rDg6X( z!<4*|GxCpcTLD#v{Ob7Q9OPd;su`{jYQGQDeyB8eox*USMCbpUc=_MA6P zdM5QM->^+#>jd~QrPP<p;>A`fs8xccWzughzH2JNm~YdIQRvCZ@69>=Oz+0RXDzE1p!x z>%3Q!b(Cm)^)_z!bK_90xKI+tdxf_-9SHC2WT$^1LgcWQmf@Fj7awgg7 z@}MvD7r;=ks*UJyoicM5#>b9w)D|^cR22ZVcWsE>ih)!yNZDKEHx7TP5P=g|G_|Ta z{|x3$q*+(u9=95e-Jz7r zer!Kv^B=3#{HXc&X8_a27r0y#R~6Y0%Js+bhhgb@(PZBXmvAh>k3|?uIb7s&`}yZY z2d`Z^L`oOBndLBy5{~4a%$KezbaMXP^k0zaWNSHoZX;q(-?x zv?u^gAE2&zi9AEl3!Lx&zft`gXhQjCER8oq!?jCs=1cEoP%?fZR3DVS(z~YS)3L#a zm8@8(lsbt0mWPc-Sliel)sp`Z57@9^b<8@0)uWr<=0AoUm)$Zp`%S(IyJ#!-dLUmt zg?VdvCRGr_&&&Msnd*ymeM)zm1PwQ7JX?cva8seuHtSX*JPsOjeD}KhpxV%{Os6AO zEd3xZ{K;k9Fl=ANm5JuuuMV_IB`oq6^8J!u7GOEyHCzoX=g$l!CS=?#+K`NpR$^khC zgvspXpy%hNL;<}ON9J-)OJ)U^M0t2o_A9~bmC z=vEK32+1C;IxU4?L28zWY^L4-8;XvL&l96pz(4yQGRX3J_(g_J4jxA-ee@;g?`{*l zuI`=ziCa(Rc}S?pIN}#@bwN#y%BceBw2iFBvY-zo=G*((b{_^SWR@g{8G4fv8>_Kk z@iDT+Wh@O^9p*KAnb0UWBvcJi^~n(q)X1b8{8iA+$3~g6C!&p6_tV4!f?AP`pL<0s z<{huL(qkyyq-`}UxG+(?8#mm`39cnhhC=hQ?T|rayN}Ejzewk$EX3S%Arhf|QYEkD zAFii#Ysq5`tlZG(HCwl(#ZH?yhZa`Gd0Ks9<0)m2zGSlA;;tr!Q!=F4_te#$Ls+_hlk)kirysbJRM3BL)HNvB6rd2A=B(hud^cCdQ z!i3|e!6NprV2~Uh1ZRHz6eVQ=`;3sWm@&C7xEjg9Jds`N0vgJ+quIBt?bAT%Zl0PTfd{px?s6Qg}nN92lw}s?fV$)>cT?lB-R2|Q`FwIeBf^8DHbNp>M(YdRjd#aUnDPKs$N3WsehAAb=X2xWHSyBsm!uUhCRFn`Uw`@i=WO~ zen!Y;-*AZ@h@IVD-5Hl#9vCHU%GxAB-%iS7NQkWgKBBp5ENE#7=_q}2u9qpk!-6Kp zn?e)zX1+ml$kH1s1d3pdq#l|Adux3`5&;kh{?qOaDZQthztx_Ef51VfgLgr^^e#c>X=&pxn%_3Y@JN|=9&QF%A50(~YhpSpE_=&QO zP1X?}3U$*<@lS8DI{Gc z(1gg;9?ipbSO}zb>6qmi(Ac1OC-%5SyPc4I8j$d$Znfxz5gF6=cn(W+IbLrhRrbNu z*ziraG_yNwlGQy`Gl^!9ye>?X+nIe$kDF8EZ`#2qePs}uzX{RUIfy=Bdj_B-5)s>Z5*UJ5 zx9IVr3PS!UMsr6d@=0EHVW>^H{u#gx?6_GTk4!yT+ovP-2 zOfE}J3%ZPSARnL#DiMmlHyLb4a+nbGJj$*wPujy`5?YD~C`as&7VFPe4>O2J+sE@R ztUm+RO^N8UovYlo!=l&IZnZ&IBbmjUs>&eQ$JE@W>qSvgj46a4@FLdMN#KrF_8B0e zMT|3k*;@c5_jk6yPkaW{4m_%*UIHFZPUF?F7ps@$ZNZ73+hm)$kRBCss(1Pwp}qy` zCO-AchsxhwDB-u3OqjaEw}d`P!Yl}~@T9z7YzUGLK+&3| zf==#I+EP|Ua~AQ$FAt{vC)wQoDwe&hi3X~4s4DVS(Z-8eO;eLqqs8y#5qO$WNk?e| zUhFk);0kV{UVWid)oZ7r2d%rbOwVRfhClq7vh(c*S-8$_f2N%fd1y{e$`hJ!-D6+I z`&{l+faStxU>{%xZEPO2?YjZY|%W$5;N=mR|TwJTa#wh_fbW!uL04`x)! z_r2v_tRW{8m>Fak3P|7({O6c1{6HT6#!I1ZupeBe>057U(xs-XbjwkUpxiZ-o_q;K@;)E z|MxMdA)#wQ{I-@I;2s>g%=5`gfx(g58kfC~NJHU~_H%E-fqdg%HzVLuK!i798dsI@ zlp&wh@KDyqCEY{9yQQ?@vFMc?xE!?J|}<+dh6(u;LbBZ`?agX zHPNJKb}8uYKvY=KJ@)EDsXDDq658`~;k@hLEx7 zaZGX3bKVX*^;@W1MfB_?;1UW|U&9=p0eB_u#kSEUt`jAa2ZVQ`nK(}t7!MvS#;rC-4Z-tr8Dt~-=8^FbVpk5HQ zP#>4xRmt(@vfB;Ek7Y(+kt1&O8DQ}iLQ(ze){-j?v*#{Ju`LFSL)2KG{WaN?-gd+? zby~l^N3mBrsE#urK+gdT<;|v@$Wyw$U`WR5_#0M$yMPbbSufszYO_V;|MTpn53Dvl zi}+Vv8TG+vCvf8DEcInvoG@~KR~$OaZ7t{1w)rz)26Mo~sG;vSDU0IppJxEJIlfg* z(+sGe$mTYe&H zF-KO)g8LgdLvpcS##`$&!n|lxT_&utyWKKnc!i+>AJgCtSFj?7-ciN}B7RXaOX1kP zlR@ukerY*|Ja6Hoxup9ZHbuM^AbJ3*uSyGfKyTO9+0k!<8#dNY7TXL|;ceRaLNf^b zV@K)EDqyx#pKMAef*2odrQDBDa~oIWyPzKdDA_E9JWXF+^=(RR_+INJzq4)(pi+xS zh=b*}0WNN&WoF9txG{^*m4u8t$Y+}Tt!>1ubyHrejLK4Uf{ufpcp{4$NXBn4YJXdK zb=STwVZvN1{w91Don(p6@%^m0l25i;9eBk?u$6J^$EJx%RyfTH)xmGV?OKSdVE~gL zP4n}4pCdoof+O@3amk3pq5JD{|p1Rw*KD zs6 zQ#kyPP0d9<=KJ!i0fwckZz@1kDr_kis(R^Y)rE=>i^SA0wCUz`h->6;d;mIAoOdhC zb#oyyYtj~{6l}^?^n1z-4QS~9n@HBuN0S@2N+c>lKq-XsRRWWqt`hSuEpj147SB5~ zDs{|7=gup(+sDxOX&iNVOL51A2un`gP*DNvwv}j1<{Ts#UkhsZS5?wiT^tyf5`pf0@rFLLeRBkr0mS7_^l{wPN`K}VKzcVxr&!;33eGT_ z&~f*V!>{Cfb9Ot8-#FwecNM$$NS7I9&Vw{tg961cO|eu;eM)h}*wAMe7f>YM2Nk!8n(n!M4U}T09lh=(h%CYFjN1nl z*NJBIbP?kCtE%=5kh|}vL39>P=X*hQqiOvQ9j&gI4T*ps z%{=q52Zns~9$_Og_UdW*)sG^cC)9O`3yiGUQ;~m*?{l(1UD8m`c(HvElG?HY1H?*v z_uLb2dlOX&=%Z-E!SR_u@A~cRGy?|>TP5o=hr5i43A@EKb7@6+-6@rFOS*us+sh{^mY=r;wb5)RUivW zj3XDuTHq+nM#E1b=A*yLmA_;sMBtNyoCcJUj_tmW3Vw>Kn)uf8T}yxofx&g zMr0FS`z%f%B9~cC7|*Wsp8%I9A<1m4PI{*}a1`ugy=Vvx> zEM9TsDOf5vZRgSZ^npr^NKmQIOdfb9>S_&r&b@38+e^S2nEx$N@jp*W{zr!WKWSJ? z!2u?0+2Esci|!ER&mJ(Q(>m6c9fMhFU7K3I$87@tJs7jwRa6-hi@IKWwOn@+RDBCF zQo?v%Jf!33Ej7znpB{ggI<#+0My00`KQHiD|ADE46(>iJ z5~yX@To&A^zu?fKeTUV^T)S|fy0(hUg&SLGjz#)=gw+A=9Ix`++fnIty!Tx4 z`D$T67?GXaU~S8eTA{@R9F^=W_AUzK)JiWrY>(Iy8rH?ZGTgt3 zgLDRe%D2eaa^=#qRbVa!Ma1~{?JU%6rAFxHJz!`%S;|b&#K;QJ-#gsS=pV!CdHd$K zCr%e*5(xSP1Rg+StI{d_t4zZ-oEafAGE>1tqynNYBX^?SMkG=;46K-Fv`jRy1C?cq z=W~iq7|jO#ta38qqnU1o98UNts~8&z<@D@G0wjHmb#eTMJ{|pOT^pq|5>Zp|-ySsC zpu6jmqYnIk7QjvnBdE3u9RBB~k+96s?=1#ZZw{YVdB}S7H>kwYZxuRWkF=!syN^}i zr2?)58*Wl@;kX!GRU)Oczhu}9OXK?U@vq!XfA$Z`qtVC4PC4(hRvr#Dk^A0j?rT8( zV;uVB&@Tomlyjy&{LP?Lz?+B*h+90fuSu`{cJXtnxU9pdVTB1;s>aw>2ols95!vaZ>^X~0 zH|pA*MCzP8o=v7XwdI2N(wG|9(986iMgr@JpBitu6EXWPt(EVK5j#<6&^CB^*xvWe z)Ev1DOLq`OGFD&e!$C%hTGr%WPEzv?UHU{clalg}a-Xgm^%hZY4D3^5d4b}l+hU0* z(Y}c#Z9P5>T)IhwKk!-@E0Lb#R;{rBBNf;&jfZF3MwTRJ}aYoVBuf@VU^xYH}U(>A=0x+WHJh5T}q5IvT z(qfq*`o?zcat$%HqAHU`gEvY? z;c;9v*@5*Uw3h3IgVAGO>IGkowUs%lGQKxO_qILJSRyLJ+(92{iX+i&lr>@asu1-p z3j#45;#oHSBArE;l;V^sPCFqhB;Jp5Fl;GM++|Q6UE48og{^UKqN|(j*43#T?lXA6 zGk2N>O#wgM-T#WzP9n#*Niqy{=e^S&92`&B5m=+%(GBA2HeJUAbM6AUz{c8?%|6$7 zF}zgrRE8-9CkZoi<D9syR@K*%<=Z_-m`VPm ztfO?y3!G0kn<|Z=5~LUALM2|hzz^sWjXfSOq-x+ulWtI3`SuTeU4K@ZH?ujH@R-$l zDJ$ksw%?82w=I>N)j$r)9*~bk|Jn{}wq?F^y%DP_Q+sFEd7iYv_`O{H-XnTB`(N5G zJ5GPB6NSpxU=0tfe2`j>TYgww;m%23q{Rgi)i zOCbY|BQBz2(7NhhfUIk$wJzA|c!~_HB~gDU$N8| zEBoM`L)@ugz}Ap;PKDKn5_d{Lf)m}ZTvc%yM)K3MfFH|haw;BHTP74#f!QpPy0l9b z+fM9G=$_xyegtR`9YST_H}t742_kuFrV5Bmyx)y1wbg`=hNbL%+0=U z?T7EfMFwFLW4fLE6j^?VSueL`nec%3?ZtM?S_kXmA|e>YR+`O`i)2r+^Nex|7MPNM z`@tVG;`o8WTiJt+crF|nN}Y{!jVrKoe-+h~)d%D{`qOG_8J?<;q_%P%_9Q)v8ryT* zq#Ka&mzfdqt{*@4{#gk;ntS?g!T(O%>T2Y+d^{Qpip=URk8(J+teMvQy%j=y`!T8e zi$4^4pPm>W5hr%1!SyeCuZ&YOhB%>$s^?|9B!OxzG(s;qmxVbp$$IHNX`hFxJmCkC z)l4N&j`WT4w~%dvHg5)|{n9v{<2b6x(``c`*?U1)(*4Nx+_34J&51Hs<6aIXOvIOD z`1kdNq@WWPn{EbC5Ad+%UPIL3X8+>!t{*mk!A0EQy-yHD(?UbL>0Rl2P%LsiS$4gR zZs8VJx^2M^$A}A~uYT(U!Ef%VE%S`6JXAl_2CS1>$^qrTYC%u$;oOz)xASed39}9} zcY&f(6q^?n!xNBrh^kaB_Fmlez0)k_Z&;aU`}DgPn&D6Tb-3@03U=cS*(4j=IvitA zA+q=`S6q*}o7%I&tYcHj?l?g;BGDx084#cr0_P4n6(WIBLdSjLxz<)#nZQI+k5lZRe{;|@v- z!}wlb=TfnQgLe2wldJ@DA5#ZzD@Q6UM_dc?PZZ>of2^+qLY!Sgk2(bH!&PhnQ;| zpqtGK+-Ug^HHU28Pc zd+xwz0NhrygnekXF||2^rl(18Fbjr$>j0KPUm92!ktGUVHa`jcaB{^%7B+2X{K;8z zQuE%cO3}!leJ>nip$JOI@16yfqkwTY@>@*a^v9H+GxkLsiZzkn_Gu7;6L8#^?~rKca*6HaQf%Z3+ZY<|N=*Oh>%XY)rd*+$EoztMNGfVOerz20efGu!c3FUr7011u z)sTtY>DU&q+<|hgv9H|Sn33q=a4-rt#QZc!YZ)$&$8j}B|8c{>tambC;T#K6h;7Vx z!OR@gDu#{{)>_4z{;FxZNuaSTZ|r{GQ9j}-clPyXGw^c#h5w$4s?nrXS_v0V5U)PR zvGO8azt~=%D*)hy!}^7ov4!!_N*E7KpZ?thVFSK0QstM!jp;fj;6|a{oO9jmt8Kmt zn@+J~75!QXiO_>}u=1D)Nbp}K9~^snU|`lY=R5%hwXVe!1K@IrT~rqA*?d}_8YR2# z(udw8uuL=adh9iQ;XGtDVpOk#>`C?3T4HDlg*QnGC`4l`<^GyJ?Cn!QqMD<-Rd=f8 z@60?_KyxYow7KAET?j%$C7X=ukoHGh4+t;$s%96omMcjlkX`6PIZkl$ zPD7(QCioZac4L5B4v>VDl!1W>lM*)(eDx}&&hqi=_TZlq_7ImTbhLK+tqS>tjAF`) z7%{*OdjEx1rPi^$(lv7`4uc~G>WS)J+P~=Osx~425ze%%zty^Ue%!ChC&sD3Hw=Yo zDT8={y{l6cUXGAOO|Z{~Q{YU|Ghl28DQ)rZe*32;g(7F)v(qR)Q=^|Ri-@D}`7HrH#;4(_R%6}8 zDY&%R&J2Je3x7q7$~!t!T8Ya5NKwyQ^ay@#1MsJ?*WSgwy{PnCxljvA9wz&cox(Ebp+bYn|5%zODd zAWhfu1oJ+}^s>CabSbZ2Ty1%cR@9^9VVNs^`Hq`y*2_{4ip19XG;N>d$Qe5}Yt|+? z7+FHvD%PP*2T@q754m}ph~{BUzg2dS*2=BLb)?POmyi?_bK-B)?8acA{?6%Vn|^|> zIIGS#Fgi#a+A(I_V$;@|{6#F55gc9y14>B9KqPAJ^_=t{Q|6flf4$$c&VEHOa|O3> z)$2{6)r(R484(*@L}cu3+Q`m){7Jcy#Edfx3l{wo7oD!s%BbkFd|4*A6sMbaA!^4! zW2y*HR@G0%qUJDu{&~rlcbx@gSl&T@!$e7PP=$&AG|rD~ev!72o{scq1CheXYq3-H zNl>EIqG!NeW>)+-kBG8%K)3fIU84v$LwH!y@wCmLn5|MB)#pkWuP@^w_SN^>6J670@oNB;712S$UQ>1Yw}j1O>_JDJ1Pw>e z+m=3^X{Ur49TCw+O4fNqlQ#XrN$;MoLM`IwBldQ$ZAN`vuL>CVMwi;K zeY8RHq%}e;Bos?r%h`+s3HS`yJFnDv8fLN9l~kGY=$+U|=-5X6=FLAM+EA2SSm`+b z3QW&G$$VOn6B8qXrrfF?3YI0NT85|@)hCnx=7qR|jngTyNwH2~ z|AfI8JNuS26_gH5%Q^??O2gV+d;EauSXJ4qXn~anL_N zjXqM^R$swsUWu6fw}{vlOr|&%!!p~roUc}9-}UHwd{|dDexoTnOl6pt?5Uz3zGJ0a z#?AL!wM%Mxb9r7-PO7PIRk1EoW(rh==B~C*0tcZY$o9;e$!-0EH9QH56=}w2?vt^V zZ$CF5y6eL3bNuU~+(-Oa##TctPe`Sa#3DXVr`pbhOt_XM@T*P(TRIg#H89hEBIHf{ zTqMw!OLcc%-XISmC9*`_nP{N7QMmeK{CJp}r11?3o>B z=+m>Qp6`F*c48wg+Nu&QojEe2oobfMMp|lYe&9&xvU)U>mnbZWApzoV)NeJeT@q7t zT-8U0d~CO-T)xjteaW(sU+t5Ii>B}w%gg`F$H5+T(j#|Au%Pvx5wpqT)T~IU?Mqd( zukj11^}bSH=fC8M8OiyP>pa~)OP+Qx+1A6_8uNW3AQ|f;->1543=vCU>B-op#SrXL z`KMwloWz4mT+`Ezcb1~ip7VcfptAB!C~os;DKCkuI3Ua-AE}ZVKV2Z%Y)h^2why2_1FS~i5IBl>uL07VAuVn6Dcp0O znu+Di5m!i0Uo9k-Bm=FnQwJS|?wiNIMnqcIlnAFla355tL{4YU-3E#Y_TL)}yL!^9R5IsaiAI?>6#_h1M85f%fq?PnlD%X`IB@$wVP_ z#FD!5qWI_l?*l)ySKPZEJ2*2BQt`hjEljEYGA%{&D_}cD8(s%<`p?lf2ydtuSR~XF z+QT}|P?7fCM?{cH^OZieaQ?wi-sX?{7W+@GN1ZIWKK*<96mPndGO&%kL`cV!iuk9I zGPT;42>L9ap}FF_4;t$MetH3r{;2pHY?C3~~+{bcl zy{0TCDCBw?TwWc*?YM@6c?%#IWYSIQ@3$&^_gGTdu6^&mrw;Xf3%)jMph$O11lR6k zVmS(I$I|mXTVd8TnZ6B+q%Y8#OZ+vJEkO9u$Mb5$)wY!T--i`LzmjXw;F-^553j1y zw!7|#9|Im=L$yjqQLP%K5)7b)};+!d55lfcW1vL+qNBIB=&RXPs6)RJY&v&4K%7U)B>{6uM$ zXEd7}w~xx8dP>U6yH9r&*M5@+4;fw`{dtE9f*VigjdksqzbDDKW;pj53TCQX&AS$Q zsdMt&$18d3NdpoKJl;Az14OUP)YDuutW4JHS#}cAarD)9eosmsgm3Nn?>xq$+u~k%?+XXcz3dWD{Hl;J*Zg(wO)m@O z##}Re8ZNLElr(|am$ZISQocHoUzalT^?VcLln&fLUgLfPpK-(#nyO8@r9o-1+=?(Y zjYdv9K8Qe!u{sR!51Yq$-uV?O0JTx1KalR*=Dchs*w(~FY!$>uzO@HEeRu{8RJ}hL z5!;#QAaazkFYP4}arRTpdl$XSM`d{3_Y8PnAv)ycRqL8+uV3>qyJ0zQ-hoYU%>jqr zWv(V7HY*6%dTsM!o<#t?e=1vMHFE+nIPMnV+Jb%AEOw#nEx8{jJ5xlI{M{(KSb${s zE6@AiLE`1)G9|_rCV}=5KWo?vT30;RCFwwsRy^!WuY|$-{6x}K-$OZe67SXBeDf0@ zGq571P}X#M1>`C^T3MU-i_&c5S1$Z%iqCYk*+v@S7@mR{a=%raDxB6&-wQS?+btW& zdKgejh^eabkMI+*PAcav9L{>DAp594C3+ZJjRrn-{sXM6L+ zPqZuyY3zlCjwt{ku@3ZCmqgjI<$E;@%;m(OM;pQiB3ySq9@uHjdz1awN=!n2bx59Ua1)@*}wc zQ85Djf2-`wXsU+FKDu;af3#T>ws`{IR)|Xm_8&wge(=-k{5JKj{CX#aw|~?d!0@W1X7rxRhRY|$faUS$MPHi=>?e`t}I;G-oy-NF?%ZlZ0}G_h%6#S|A4 zc-Zgn&_Cu~HlmtD_Ab!M<6Gt<3|e zy$jp6ZZ4%9E@JGvEgmih&do2bFbPLQWedjZId>DzbG%E}|Jxr;rsfd0u$eSdUjeV+ zppt_usq{i5N6U@5py92A>yKJmOAtEJyst&(B16pA$(X9PVB!|MzlBn+sjzJ~W-$wF z1_iq>#2e6vU{j~<9urruGPVWZ6H%W*g}(~yydjkhf=6niq=2?IcG{S}>sDzz9U0v0a0&-oizl-bID#Y(IaPhIB6VDGuw+qX z5g75=t4UGES2(;};i2rZb`4Wyl=#2+IuCv}-^Xp6HL9pto1#QYi&A?Ri5+{E+9N9V z-lI0Lir9O^Ol(?et5G7@sq zsTPQ?ez%{-&QFLfWTq4sb#ky5bkIly&w7hgd16>x+sE7fd`5!RPSpT|dKs>otF^v? z$pvWr7DoW}RC}j3mRui&U`wg3xj4g=&k+u;C{TiQtw2MQ?0TYWs|n6Y!UaOYK?Tu-R6d!HAymc5fsH@09A)n$gLB&QPVmBhW zJ56Ge=4@p>MV0zrqI^Ufjrllc6Dsp@>NZyjMFgKNKG!SkqEl9Y?PPc&-|c%O6!wM} zvT83KL{w8BnWza{wMWVMM)>UvGfrzmT~qh(3XGBp9&(c6H36pgeJ>puW3dGki#%$d zPH4YtJo<|C z&p}8zWdSKC?kl!|P5f0)ZM(vMe#PBKE!wtrv!#frc(lB$6$a8K*mAtUM?xd=3 zmL^Z&GO~tn@a0~UQmdJj&gi4lh60i$6^-o4ZngfK%wzK9*+FXKK!(%0%=WK)5h z*-S2WiHq^)uSvM63mikrcF{Y+uVhaAah>NdR=SY|P#OfbT{y;j@F3?;3H#-BPU`jPd7;u=x z`0q?avTO#}K+$=DYc0w54P%MP;EY-xj!XqxYtM60TZsxo4msb<^rMCJov@KAYLCnd zsFe3HF)0|HLd>&L(vjSFkNkH#W1z<|zvif&1vsuWNt&%P%UAID%2Nh9`N8%hjonm$ z>UrD2(Xor@it>*kuGJ)uTSMWhxyq)t(b`%ci93?L{g3@ST&`PI=$>y$lC(`-$CE{q zCSL=TjjpKq<@sgezg6nQom=2GH3(7aw2B)L6G_7$w3=^0hl|e}qQ>FKMAVoKt^Xz* zcDvqMyDNz<&@~o#OE>l1ciI$^o`u&2ZUu^6KSKL^is|`New6ilaaa8b^Cq=RTI_*~PBlmac~D*-TL0a?w81M%_fl(7N1@4P?1L;6_ zg(cSKzRa`t^zYDtQwk5ng-yd|Z-(UyO~Cz0K>?92DR! zOM21Zx8(9TSFFC5H3z{v+?{ZXi?;<+_B-N?u2;g#gSx8{)6th)_JB#Vjfm-%jtWJw zMDZ62+@c3(bnx=0qb)S0C%>)Ur`FMv|3v4Fjy+o{SMY-soK`Bx@r1)EGKr-H_l$hH zt-SqbUI{djP2-QLk&rH^o<<~5e_e$QID^W#oJNM+9ZGCej5>#LY)zB%Y&gowm<&Qo zlK2+eyp`H7GG1VrQ)WiUZApn37o*_dv{`9q+#ILxv2=tk)cI<$g7--`45Wo@kX5~^#fJw^}G*V$BZZ-i9a z%x4tg&&f6NeRzga$leJ49h;YWmfUjB zmv9$=dFiUkw?y2#Q;$|DS;*Wat6S&Z`DNgXm6)P zxtPsABFKRo5H7cc;+E;k_s+LzH6O{uU%fP$YFv?#KMNpTitAhEEMtRN^E{z-^rI>n zHnrui0myTnSXa^RYfdaVEyL{0;Q3pT@LGg*lB^Kl7YyAlx zzkBPQ*;dfi@(1KwMNc-*&d@$H+3>baXlyP=@s2};eo=iMz6$c7cr$_{TC&v&JI#mf z%}k?V%zC$n@=7<^=rK>4@Fwkr$;#gt9gPuhp#^u-1E?Y)w@t)leGABrYmtVtyOqhOeG$A#GS}xPW0J^||0rtX|_zAh#RKjlw!HrkSmA+!T^a9NaDAfOuz3 zWmSfO4`ET1aEj?>208s+RFu6KgGi{wb<&i8DC;CNb6D4Kg#*ludD_Ol8hMc)_D5@3{#9`t3xqJ5n7eHE$WartwlTBc)ztH|)jxo{K)1kA%j8R>9LoawLO7R7Ch& z5G;E7r|tare~klT0a>gNh~PcfLmk-!`D-3}4o4*bm{cl9kj{7E@4hO#Zpo;ZDmlCv z@&~uDdxGV6B~GQakS?qLqR+lZBJ5 zk^|3lx`B@9CG{$ykIrF?Lh`)2+*iD536aM{_*H|N68P^mu5Y{>Rbm7V0NPYErGv(# zBz)pJ40~yltmWnYbc%FL=G&_-iAyQ@Yd{5aVwmF4U1Mg}njs`m7RKqr&P0`9s=8_F z-r;b9S{w*>8S$>^_Y-Kf&fup)9@_|k^&;2gHh~1d;lyv#jh&*6z3@f`K2d&LZhT#i+YnpS#pPXK8U53!k)xYW+l2TcQx+$c|@wED|^gs;zy@O{0*k-} z1a#BPXH|ezgnKlD#9AN?WsSWv>X4`B4Xg+EcK*{8!Gx9aiH?^B4^$Q)Paxgu9vgnEB4ILTuT70&S$-{SFwy<*LL#j`3bnhEdBrN@RsC z^DcPuk9Fh+@j75rHi7@N=3uYh(nxi_PyAHJ?I)+>mhxJPotcc8wd<>%Gc`%1Nce(S{IR3I>}F40l2pjl zZd)O6i`$llh%f1d_BSC8`Tifu85LAnavXOCiSI?lN7zGZw2)BdU}yId7z+%Gco_vX zI6Rf(AqWnUXjg9IW>xz`JhHD{C{Bk}L2$bf3Xz<^aO)f~3~Jw)#1i`I)wY$< zMxCZl=3f=yEozh&TLTow7FxnX`@%rWDdNobGWv{j#gYr=J=_0W#d8j-!!IpoMj)pK z>u1|q>MU){xWh;bM0femN=}P473j|&cwttvG=x;}G`KiXTDa7i=@Z?$Ne6%{ci&39 zXJvnSQ9G#-i#Sf$96rxPBS{$|XJ2)3_kcET>*u#7)?`<2CAWJxOOU110zCbO12D;s z2#5XQd%M8@v&M;86q?wt%m4DtLQ^_C5-t(El)7%k5<{(#gdmkY+EUyA%g5zwBn-)+~v`1v+Sbn;sVOOQqx zctMQ7G9_5wB&y|Lnr>9Nd-$yY=7YHt-T$g60)e= z?*<=+KljE(GLV(P23O_T^?6DJs%8_bXZ$jFdy~E;e@50Pgr%WaA314|>gV^xaG~-H zE;LuG%nuC}U^6GBtP%LM)oGI@?ZyLnN}(*0C_hF-u2|v{Ga+O?<~GV^+FxYxp>+y9KphxV*KW zrH6XRX@sIFZV+r4rt6d5PhvGT$X`Z{c!AT`N3kFt1orU(4lR)9f#DcWB8Owo)OqAHREZE+=jAuQXro2_akLvlnq@qRf1src8!jEiI zji_{KCDCX=A^};Hp)2dch#eXIw%oc)W^SJKBZ(?m@;oH2NO)?JTfT6@ylTB48Zd#MCG3BW>kH&n)%vX;TkV-wRU_vCYNlU%&f_usLEEj+P2!^%!#}B6 z)<2k~QU4E2AJcxi+yn>U*;oz(;B)cwhzngjm=goy}NB}RQN$~%L zcRL`^2~}~_k;N}FgUT=LfG4G8wkiY(7ly%X+y3*r)5nu~Ls&+d`bS@B{6l`t7Oa{4 zHFclSJ&ZC4kXRdcv{LmP6~L1kBxcp8oi>je$K*)YRM$b@rQGnhl#eh4TW+$IIeXRH zH+iZ(9X(b{Wmqbe0BOxigSyWkFZz((89;hXBgrfL)I6$22ai_s?ZMlK-fA2<1RGIXX7lF!hpUVFQg_&tXQ5cx03m+D#%NClb+W(9p!7fx z4nD%;#E9rSFE4MXvc!jWu8a=S1`;X5?>h_|%rNDz0!f;37lo3GpocHAcHURxJ1q`G zswX2M{b;D%-@uF@!ktIv=}ufiCxiKjDFMNgZkVav3H3rlry~WmtG9wJAp8-25viP! zvGm& zEHh;gyGS!}5)L7WpjwmEQ1W+q%cR$`QN^n}9zzw5I^_A#3lh`WC$5j3n9|g0mv&|t zp6I02P)*{E#Qy-FF93FHNaO7(b|H)%CCRzwyrhHwfn*}8HAY+JDvR8%tsUiPw{ zm#dd|Sj%P-fpJgaM=O^;-gVE@OHhba9$e%5>WhbTQ?<&mZ^1_BPjq@?cjeGk+%s{K z8)SD2zEi?o4mz8xY>Ki9tO`r&vQpv7m+%k3l<*KUn#@-%tlu;7ChpxDME5Mxe?jTD z@wbsRnWz#)v^x`}9%0z>Tn;G~k(rN@@wk?4Z>6r1J|*I(!B*1qX6pH{$BA zfNa+bqudjIqzalh)TqBdzA`1_7w)9se%%$ld3Hl2`F6T8v;y-xSK9JY(ydQx>=@gZ zWT7dPV4W{XH=a-1p36O>_bs&&IXR#Jzx7t~6Bq_Tlu1mDSf9gv@DI#MdO8D8W*@49 zekaHW4dK`Jfek1ZGEEJJcMWK8S*axMu?3nU60dd-s&!xbxCabyQK#t9Y-&@i>&awL zO&g32bdP;&Rg%aI9)XAJ=a)Sjnj{s;Ht62{ZJGIxp5=Qq>hFrW)eDj8fW}cDBGUvk z4{JOAvzyAcTZT6Qqf`A57;dw<5BpQ_p z7ltI>JZkwBtbN~JAU2^t(^@p%;iG?M!+KM|1P<<(iOTn^(xjFM`>1V|BY27F6)Pf3 zM5~qY<+g>F&Vwuf3@I$uJsB{LJ&IOdOgnPyWOo%(7!lOe&xqVonLM#M+jIs&3rdiN ziz2Pjk8k$dA}Hd8mlh1gQOw8Y>67RS^PXA4(j|OLcr+_{%wTU1!|4di1gdf z9ml!N>MVbp#?=ds)GqgY%4pH6@3@;anTRfw|FO@Jx8|BZ<6X{!{N z5A3k{2()wbt*2|(Q^juP2RTul^ydHl?(NzH{b7e1b1R@Soo{NZgn_iKeJDu&P4!kn zKqFH3Fx?x}(F!#0AWbwoX>pOLEAz7^0A*cgAolD}HDLk;@oK<_`qFed;Ruf6;y&S< z&>_m2AD$ZSi5t5X|pbj3v$@oplx(VVy2WsLg-$y_5i}1*vVP`}TsWAV-vPbu~Sdb*>=0BWQYr6bAY;EW*W3D8R38ycd z-6l*bq%e808d|=4Sv3g=q#~dRqE#pM=S*KVh6jFKtvO_oBfa?e(#_6fgS@Wl@Jt$fYsvHHH zbyJ|B-&0e0ok6#7*iPJce|&#?`CnWXXy$hcw*bn81X}d?76C3Q6tuxiJtqs~JVhn# zCs-ZdQEI5zHoZFn)VySJi5yaj-jMkcFIm8qkmCKXUVMn*s`iEP%vdM-*&ah;*(_2r zwQ`9I3KHjRW6kfOV(gj+&WP4577z z&BZQ+Nm%g>@!$+Sbam+(-U&$3Ce_Zk={TU4YEx_msm6+So3^qEXn4uWz+lzYI|I?S z)@rYb(K6biR}1W}ntwc#lDmk8XVa<~C6W%x)~nTtGc9ACoZg|G0xN~44OSrr(WeU9 zDPk9!+s(${XA!WZ(w{HB$FP*WOSlJ|Yz-bqRKeuh$T5YNxJn-ibG7zWByHhyKjuDb zc!$`us@aEl5SC}Al+xrC@)Q{ab{+UG4^E}AaA*9hTq6w7oY4C6CBtvZ8{Wsiy=2@F zNaV|`=Vqq*E9px}9S|8*)O2`N{_|tQ@JmYLrI-;F7Cptnr-)N&pkz~~YPX_!ymO0l z=CUy5Vnxs5+B(g18Ew6Aanjx`u2o9^%ZuuG6mIK#i`Rl33X>xFNdJqE04zV96+6mQ zcf@K1Qnar5xFTZLBPUip@5Pa4u+7#@a!*rPeL3h7Y5uO-uC9DbY|Tf!UPWSgl&sa& z+o9Z)Y5IHYFm#~woc!Ck^UiMj^?g`(v3Z9cR|kXJx6By5=}%mQ+&r8dJPemrmrq1L zE*I~8J{CJ5`(jTHz(O+ENFZ_yM9dX4g;l`~Kgb-HxnZut6J47XoRv4d_=G?R?lAs? zVPVHacK>x^58d42lix3XtM)%fu*5gr|EtJf9f%i3Nd}sR0^|O)?fK!p6IVch^&_@= zrGD#YR|bgAV3~9qiig!>sW_zm!wLM3DC89r-IA8A(O$JqEkF<%I5OpB@05Sn<0>JR zQ}bYi`AsUMSJoWF#qL!ER5fd>s%quC0W0V*K0%My^ZOe|cxG7AOwo_BGWZr@ZIUuf zYPwT7=#K3jA|>vxd8PT}LaGD^Hz!4UjrqgwtXw44{Im>f292J1%26sAMH%j6@4D*u zb=O(Hm_Z-04~(3gD_MKJ^x^!Q<}nN>22Yh+OnguoX8P%_Rc8WCd^Cz?f`ER0)X0lq zk@hFV3!D_66mhwF9j>Vr;S`7L{PZ&8#GV|Aog{dQ9u`Uwp35{$o}^6^^&CQGUR45I zIKCRBUm85oV*i@Znb@-jZRmI1#nf$KpTBIF*@cm69nli7c8gsj`;Ex@nkDUA1APt9 zohx<1S@%w179m0E#~U+VG(}EJ(LaCiFbHTU(&tkB)Qdqqo?dj@l*o-w;9$S}N-Ue? zL|Z3dAg;Jpy!SXkvPyCx=wA8B_i~Y`^;{cCWKG-@cs$brM!7ZHM5Pz}o z6u(I>gPOI&)K_F?i*5pHI2_Vj`z!0DfniV;t{_3}NPUluMzm{(ZqgievOT@2J3rR$ zDGOB77DJ!e-1hPY@pM~k_0NIM;@sVf`kZs!g8jLFyF-8O^=1v@T_hdSq?*3-#+}eG zq<$o-lx+<5hGv9VLadTuQkSiSVsuw>Y)bicnt# zdQ+Z!d!5mB2PrLB(q_g8>BSlXq8{#QNwt?OzzxC7^GRW$(Q*$&?58!<}NO&qCldhHbp-W4X~xk~6L&d{(q0A9hoX##g9c zbW_u7+r$nSH0s_$SI{}-k!(?n)@!x;(zD%}Z@pCRX;FN_ZB|^)=@Rn+JSRz>5=-co>*c6=Rte->jL`oA&56^yhjuJKr-t2BcF`nkS(t79*`JBO1MOxV z;m#cir3$+SL^efn71-{uCHm!}#{IWZm^yVuK+@OKmT3u5#JwLD&FI@_8Y|w?;L6^a z2*f!g@t62yK$Pk9=Ma1Mtm~&M(-(aaS$v-SxDBg6-v3^7ot4s6wUCg>M$rIqEqp~j z?1Cuj2uBy_6vsm^jF`(D#3$GO@YRSlCx6jey6l;BlBKWcRJ6|m?%sx!Y+k~krH^aJLCWdp*lyP?u3=-M)%kJ&d6gqy$PDh^pPX!tNxtf!|J5dIV zojO!_+$Zya?uwPhC5pSFq(V^E`6p;UyJd0%t}#f<@{PL!YasDZF^DuF%*=~Dr6n`p zKOKu3p8#aHRarS#xCj6rv*Poy|mq^ytTTK(8-+{(=$snb& z2Nw|BW#A+xm>C&7bq0|!iMBE^D1MBnm4mQ8|?TJ#Jc|;t08=87>9|B+X zd+`**!(}t9zvh!E>gzq6FV;Pre7B$jN3v=K6OxbXjF52mq6{)#oWe)A9Ezk;_5{w5 z7|F&Jo}q2I4Uy0B5&cI3@3<0dIn4g)H>b}|FO$BE)i!pL>eFQzqC~}{OGMuK4Hb+w z?7@$<&d~N!IlB{|J}K5~`r}(o-jDHDsmb^D;!0t$%dqISGAb^qKXa^0tb9YhvVNAo z?{iLOG!jjHtu;ZZ&XF7E_{b3$`j}MFl_km;7r<39j41W29Gj#Q7;^_MUm)Au*C7ge zxaTr4v@Q;#i=5!U3h7Jh-sXoll8E2ug+;%sEb%THOY)Bzlf+dQh_-Z>0Z((cBN~*w z64hfKkQJJvj={_Fr4s|%Z=W~`aKmMzoR^L$wEL1>ew_l;4R7Ae@B>J+e>O_*#9!qq zza}1H4kw{45Dob5h@>W=wr}{Bxl?dl+);XBvek_t#Qh-?oZ)G6);p2JH2P9<`Fy}* z#vL`^=ma!PV|ws91&MHe$jo9gSRLNPZ)IgAdM0%i_xJcoXH%?+pP&Go6`ExdE2@#C zu8`igYto0=*1c)!zpt! zY4R%CR>LHfTmq8)iq@@){~`gAFIW)bp_6~q#Pd@aB9d@DO==Qz#%sOy?`7lN%8A`~ zd$EZX+`*uO#IRwXc(Xj&7n6P+5|`;<1%6T&F;YqtBI;B(ih4*&FK`3)s3pf& zX9V{4oWZNYEQz`slg>7aS6cbxb`ef4tf#pCW-qII(%q1Jthlb#z@;^SWu5c%gV_G2 z*0G#z%O5asn5Vi4hbT=~O#u}zxWh!YEkMr}?)OwF8lj0PDx+>lCx~eE4pLTOal-c$ z%qq9P(BId)9Pwu647%MOQyL1mB1X`ajg`iMzQ_3s+W;m zFIC>Jh;2fD?R&J2)@$m<-!Z{HGT6j7@49*3v0w}Vr>2SA;OMEGyXoQvQ`kG4H#>(Z zX(?jHJ0i^(A-t=g2)zekR%lzl`VT@%_E&auEZ{UWTh&K~$6`99;`@QsPlF0h8F@hP z@~`)rA2KU~cR}iwpx++4KPyZ9xh;ox z@fzq#%lVV*7e~UYH&l%2OBD#`#LlrQTfkzwN+`~K$=GL!H~cwjO7G_A0P@e6VBGli z3W_TD$d7YnMMH^hYB_Kk?`;(2_AoVl8zEs*E#4!DM6lOl#bxQU?hRoPE>7GX6Wy&( zO^Tfm&DF$192$ir;ccR#k(WKj?(-!Ve1A1QW>i#wTO`WROYjUp`(rg{E*mI*6rSJ& zAKtufBzMDG-c<^Vp#7yI@OJ!hd)sge;Um3L!Dsa+KB`dO!6$?y5rD^F^~tS)+G=#p_|eJ^*V#w|d3uF2$6@;sGw=$Fxb@;IIYfhKgc zp^K51_Z5?6fltJgA3Lv71@a`DO^sk8qP7B)KT2#jr6qV?PJ(Y+@&H4gO&$p@(m}wQ zev&@@u#t_?P}Ivb=%?w_&ut3sCSyt*8Y|ON4qNa2ntl$6NxBOo{!LYK|0sVjV*X%o z2u+I!UDf{cP7UcQ4x72&E@1!*GD2wYT3Sl8Xll7usb0&E#)@;zRQWB1}(r5J23bl_K{&|%QpYb|j6 zx`RuqN>CaK0-W>6+}4>mX41nVV~a|jb>*MEs&S$b9@Ptk`%~{a2RP1nzmLScS}HVV zH#c$Q=Cv%+Xqb1YaaTSJ*Zk4TMe8{TtJ0)$mribZ3l_*J*`j;!VJo~say&NkrTfkO zCBg2g$#i}!;bwaBpZAIKMKX)JfnX9+nINF`wMX(Vi)3cJ7br!ejllv+HuJVSY_$ZV zVl{QHTT==89bg3X+h0FPGE-WMyQ01F*g|Rg+eh;uZJ|YLPB(nk(%G1hmh?p~=_is$ zPBVEeF zzA`{r1VewqlTiG;u454|7}VxuexpOhMVg6hnLmq{y0qx?h+{v;f#*QpSG=P1CWtO# zHQZMugGtGhQ&a8CPJ(XbC~TgZ7^J;8d@N0JfwUfX8qSJ;&epzSv!MOmQ18MSR<3AE z!cEfKyFfm3EPYTlh$f?FZX3nWM;|5ds~O)zz|r3=aYAd!sKi+H(=h>!v;c1*blLWc z^cKf!7hQut^8%`-e>ZIt!}>+jB0Clo!WQaY`-+KA3SN7e4_ZT5mC`H6HRsI8TH7jI zmkWvb1;)o2Z)?6EZQhr} zJej{16*y8UA=H_jnc3CyXZSlX@0-T*!=mQTGBC8wRfPS`h``${vwz~C0oN;R8NJb4 zQJY1ZrtiudNYy~70L7<|Zhwf8Dh^q|xyvM?%ODTP*N^<=e0rr)$HDuja0*s1y9c%j zjV;N-v#p92P&X;z&yc8k^_qo33}F>6B-qJQG%`e6^$*c%3tB^+ZDkCGXcZJC_YFKC zL~OTwNUQ2vVSW$GMh9N_K3;L=>Y%OQGz|&U;#m#5bwR!pN6F%{a^ChwaI=#D~;=@4<<*#>L&**@t4sjMu0PQOzr5mIw z%3f&ONLnDJ%iOFwuT5ZM4CM+E9#^`&MzrlaH$5o3$feM>AA9yq zp{)BRpYZpC^=A?#ZF|%ct^m_D3q9qJr)@QjDEQyWHcgGIQ`p|6=Bh!CMRzu`$+C(E z7qeJZIR{YgL9VTQ;SwgFnM zPs(2Mo^YPv2u?^HSYi=9GMr_dX0tKpOp7ck!4exuu!sV18!FNuzjcqWwZ^XDTvu?5 zqsoG}F1$54eg*rSNU!*qk98_EE~mn#;4%CaAxY;7Yx{F%2Mx)j{Wk`qOi*^W2YurAeE&2P zX+Jk%ALF7SvnZjrFS%fCNwTB`3&k&h(4u$5BRI5hqAhKt(leBIyth);M!y|XQgGt{ zWrdtuDHoZ$@8p<>tt-UUzF^l=rU>bO&_iyo8wcHkE;+uT z6Scby=^j#|7pOEsT-jiX$;q#6Q>W|b)MHY1|5X`y*yN) zZhZiG4TF-sD)l7H@6uh%5hzU&wMUSrt7G2cZsW-sm9zozITxj!X=6!^2#qgaL^Rqu z#-`Fu&nJYYPzekvm8q||$ z9n@;8SN*m6xOMkIklH2`UQv6l7sa-$FgyGojzg;nJo=tF$ndybdFUPHAAOB{>+$%T zhv5FPS~EbNt|qZaja0t_#5?rw$PW_ox+8y<{%6qH`{`Uim{R!xSyR2{Sy5`iX~ga9 zo`K_5hiq_Q9(j9(r?YLry~p2&chCnrc>`?Vf3npSoA%!q${E zmvmP8_T{EH$LBF!hpz-%a+YrLJHv4VD#4R3K*G{ZzYjfsn8eml+btgzee0ibC|2&p z?caLgCi(blGtP0mDOB!_7$khhJ*4LxW)nQMv81=BgMqCXoV+CM%dj;Y;C67yD7`8d z8dNK2R#P8l$s6>3{)j6I*bkRKds;Ax>MjZlkOR`E= z!COf7^6!+8@8)b2NzF?Z4(}FevaWWa#UP+=E*Q@gK!RVVklwr(E_I;nqfF(@Bk#B+ zaX};hE4c4IP8ZzC5#WYb^akOF|E;{md9I^q%(i2K=JwO4>bU(#J+@dEF?5j;PI@IF z4j6{;!#3YZG98I7*@$PnB#64$nOiAa=!P+2L>;axT0l{DP=S^)-=*z7x{@KTh><^k z4yc-#4D&-8>m^+3nYu>pR*RPpT=c56c-P)Jf(U+xQxNR~p%pWL#jhIU=uU=hgeG+u zI)Hp;uP=16#s3nCkQQWgExfI=0$Bk;zTBpII;mesdwV&>#H4;RHeVh}Di>v5H69wR zKDYG82iXT}`#h=f4KKtYp4fpDT`zSR@KQ1+h_^SUo81ctuz%z zdZM3ot(d$CZyXp5z>@??pAXb{j=y9x%%`hb@}vz0J+U*n(#-+yX8$OTC6|eMHxyW| zxAMmqjyk6iOp=O4`Xj*J$InKFCeXT>*}5e|HnhkJyt$-UT6H#Y5%x0rHq^k?a!_Dr zzh8?rD9t(rkScv>XjlEAXDN9!*EhR+r2%L4s&3t}dVI z86l!d1&1Kq??B%x4sY9ek>kTl$59I0QwS~k6?qxg>Z-NWdd1zv2G^dCjdIh^^GSPnH#bUEBhw&*ap7k6`Yn0XZ~ zAM;a^(kZ)BlEaetbo@>I{d-GuJ#5$AUHRafqIjk{+HxeS%n7bvClzz*t<6^F4>Jit zVK&*K+gVHg8q*T_jwEUiJFTkP_>qWB)*wEO&q$SKr^itE%3%~Jy&&q-LK@2@s!xx3 zzKpG{3}F9^fRow4LeCBS)b;Vybe&y|5u&|*|4q-OO|_U(YX*861*hHE=xu}TB$o%L zDA(m!#M$jzd%^l|NX&*(!V|0cMllW42^0eE!QF@6705DS?(LnbrWoz;ba`?pNG)=W zc*}yT&}+jBT6mpUn};jJ>iuDs{mnPKB@}<4pJ<@c&RGp7LA!v5uQSmTTiZsJd&p`u zvhE8jS#)`sRz;7yAAdTTJx}$y+>lxR6NP$RPh_W_lSmh4$Hbqn#Kf#c#!Qh9qN)u% zky7R49b%6HMhv*16<@DjmxN?o2Y#q*Q7Ml$7&f8iYFLPi(@$|*A8qh3?qFT}i1C19 zvNqIG1zXuNSPaU4J~^~i;uXVL1%8YYV}=LrKMl00dkqz;Oh|kustZIZw|~$4>4*uG zboS^VBV*sRKgJE)6pY)$=;G-x#Ot)Z-nY)=j>!sdrH7y5j}YYN?}*sW7yZgR{P#wU z?|!!uq5E9&b+1?Y!_!6I_9`+C_?`$Kpfh}4cV*uD+oa|0e0wODa~&J@LgIA{iOy(> zG|3)B_hTbnPGFATTaporlXzbMRjwOlbKi7mO3~k1GP}+bVJ7f%<>oOMOxFb(1EEuW zY%s_2u|VLma--a@N;$KAK>2g~;zBm*qL*nbpRf_QbFifn03e`-t4etci?5^Ks;zJB z9!Td=JU2_P8ZtL#Zb|Vjs@)jo@wpwa)qw9bvihG%AvO6-w`RLodHj~jjut@D9;no- zy2&`xW;KZ*Y6i#MJXc@P_t4&hP5Yli3PtCdW z0utWQSe$|mshYWk<3Hp7;WT<*tz`S@*c;QWDwZA@fyUI7{gdryDlnnH*I!@B4iz#TLR4;W(E& zvJ&O3Xq$t3^AF7?MGsJp;l3Z$*wa}6dKlIp+1;3u8bwIP3ffB?`QxPF(`vevx&7uo zVX1)k#7HfqCWucn;A@D@<*=+E#A1r0zr$JisZ+{S#&b{Kw5LmDgME2?B*sMSm6lkR zWX)Izvc5cIs9H@^mP3<y4VK=_~ zNc+J*>CQ&|-d2qSoDu<#O1n}1S{H)e8PK{auT5%MiVw>E7=!`>(2Fz`;Ne|n-=nWr zs+vye7!P};jw%;P3GBh}DX~^0<%%11Dk7PpUdJ3ul0~yOR?A}xz)U=|GYgFp5R(#v z)KYXID9ZH31CTa9b}xzQ8?-!fV?2*jiMP+ckaTBFU4M*ViURK#2 z7zGs<>~3Wq@jLi!JpC1;p#80i7m|*%ge(m8w|)@Yc3`itJG^F#ibpr9Ru#`wl{X^^ zHaBosC9oP1n(febVZlg%yLN4i*}iV8189f{uY|g~B!8`(z-d59LIu(j0M2|RI(*iV(2*NcOF)dO2W+^}Hg zQYCs25YIxo!Tzw^V(hv%#{BvJ2z$$*w)*g0Hxww+BBelaDZ!;JEfjZ4f(F;NNYUW# zZbbuu7PsI|a3~aacXx`rQ{J5qd-lx#oU`YA%w#4rS(91$t>=F3>#8zdg7M#^N-*ZX zp=D+t0Rfz8;O;jiBC^XlNd1d=;GwZji|glS+wANH$mHsaXzapoR+#>R?dL_wohMO4 z;jhyz88>QKo1yjSp{=}usd?rXgq)51At#hk@7dcfN#>Wl!AF!Ln@o`_Qcc5pjv5He z2VwQQ4LIDLH#caf^@Wop1oB+~x@5)()vl_1QG`{v_4RAogLc|g7jM^t#mU5eJa%4D zPdLp z3~EUrVeTv$H8j!vSk2UY1slUN@qm0HKhvR_lu)%g?ZH&5X|t%}{mF-5NXzvYKN};j zb}j4F%QdP?pOTsv({+=41{sS zNHrPdsw<2^4O&1+$u{n>IR4= zsIO1(l8f%o|=bsv% zt<4>YRPu(v#fY_!$8=$A*(c=6@vEgOT6DkxHN?}K(gU)y;$YxY(zj|&>ILG@P`iw5 zPiA5USqdD)>J3!$y4!TZld)y#757!ba2r>QK^pllY$Y`U3-qDmvBY9wlsyV}FQ>Ua z$#(6}e^_)CihE%0Vkg|L4Mx}ko=*Q@(Yf>O9k@2y-jx>UCR?5`Rsnmhj16!c;c*&Z z1&Up!4iLH>+rNOLB+F6w)nSJ@?LAcWS= zhy$W?(P8!3p4!l6=ck?g=A6&qD{k#5vGQNebO`*2+40VV@=$MwSlcxv>pXPooYC5QZOKwAJ-X)aEvbvUg7heFA zl>%#*QiRZdnuvRI>Vnp4e!ny{wEU#8uG;8p^<>n|4C|Bzo=k5ZqcokoHHV79CF`B0 zPqA9Ybn{>;7tS&qDMD#n8PJ4V#_ts{PE+gb#&kj!bP* zDqQzn6+al%+98TfksFRosCIf5h4B38wyQFmcDBry)-UmC!d0;kWrmETnSH za>?Wip+Dp;RZXx34*t+Mm-Bbp)b>js$~OdxoonPzC0sHgRgPvB^&uL$1O;^VCOj;4 zY70MDB*Mri$@X{(t}JftB}D(={v-Vz|R*>wM8$>k+)u`t< zm4t3P=91|c5fTYk&5DQUbITZ?j%Rj>E<)J~5-jZfa;ik)AHZnTv(Wx6Tj4_)cQQ`(8OJ}q-z&{io71!L)up4)at6ZhWA5i!JHqmg4j zt7|`Nd$_^3wlF7A$5=v@A%JhK(3#wBb`p6iH8QQ+z$->F49Puw%-<)0X1xZHl7`uD0-7&)IR_wq~I z&>`&XBVQW;BcPoWiBX)If0)e9;k#*G5BB-u(Yujtg>GNSd1^6?Q|Zusn*QncFX+qZ zRAAzBe~WZ3jGojQr`dlP6}Q%JS&}Q;ecnk{>oYZFNX>@_v-wDrwX(gpen)`auDXU5 z^PF?AwSn+>WP!x@0(qQ*mV_cL&4AXaJlyJSpVR;W}Z zj{AnPL)x0B^W%YY^S{GvHvB*dR-7hL@rA-G1jR|?uBa@G9N{LzUr8#DHB%OC>rFMP z_I;ani4xqhLI=hi43+ZymPU*&Q^;>GrL~rCAmncYN1Z>!0j@4~9}f=j^q7!5Tmowp zQ2!oZL|@)fJElOP`RH@zqN>(%!>I5#oK2>TFMI0+_D2AET9T{*?Wz|=24OBhC6ULX zSI&c=Fs?2KHA+1?>0hF*6*$5~;ejd{?q%4ao;DZpEQkpMv~VtIxrKYG16 z@Kj{HdGf1R%R5wlRI*Imr0mM=ou&X^=EZ*fGIW3s9CA3-szfr+#tVn8Yt zX6;<5-q=-ozQUhYKtV&S&_m!bwVc&j%+rtH<<0fy52nO-;ZEDd!y*XE2-@A%+gUN* zB}&|NTLJBJh}y>#+O5kZjp8}c(3|M$B)vX=i)@6MCbtcGg=H=SXX3+5yCf}N7Ac#? zReH0EnUB==HwhDdkg~7qm8ks&y1psz`)tCar&>u8MUq3P1m+X#DhbZ*U|ujJ?-L58 zX&!g6fcb33^4BuAOE3dTiL*C)rEn>`L42I|W{V!?DxVVbArZb(9~rP4UI)6CCa#(3 zuyXv_ns&1NjVvjqiOehQ5gzrNgZfkx;cQv+D3|)~-~V#xNkU>F8p8W+(##W37#ZGS zBHs%*SZ46#ikO#H_sN-9=5vO+nx<5Z=j)U+k)k5=CH< zKtdl*Av;UAhuRK&QzKHN;5Vluvak<>Agv{TJv@NBdXy)1S@P2<0{KbL zh#lvn-y-4oFJe05RD+WSvys?Quq6aLL#$IT8Jv|ukEgp(co5dQS7Pm%E2FY6HPDe5 zoNdX@4ki*YPt(r)ZuJYE#WAxzpdX*O?$_{+E2{*ESWA1Ic463YXK!H2$jbsJSt0UH z1I%f=^-7}H(f-b|9#u|=U3b6mueY)%hSv5Eh4Jj<5z%3)alwVG#*z$lyszU#stnW9 zYv|k5tB&4~F9+ePBKVZCD@ja*Vk8t6z~O&5{_JUXiE6Vf^Ft1EdHTQ;_i1{XtJwce ztHy#7;`R3yt`(b~eHD8kHsS2j4X3r?vRy_+Z@p?jn9zcl;7%!POJBy)^gHEU@~4SZ zT_fnYhnQ98ETKRTGX50hQ;OiV#r@zWlp$V zUmdrNgzf7uf5#&caIJi}%AmloTO0lxm)626xICpah(^=so#SHoLU$h{EAUzH`N+G6@qGyuif`8tEb#X_6EM{Ic6-<;#2FCFtc_tV#Ozw zy^)y>z$_`K3fzr>#>XCc7#F7o46ol|cFe1ZJj^OLZP!W}j(6AY*g|T!qx}}8-Yvrw zCX<$h$p?nQ7W5+{PuX=S)u^S^12tZaigNru+>SmJs1}j^a`DI^`1v1aV|W3{r1fHB zw=<1NO1gzbCjMr81U`DKG(8ciSyM1pbvwszxIlGNaJf{1==cv{A4U$bVSbh3F@?0o z;m|^twq!2Lc+!rP(q+F*eW)cHe?`XJ{akpq4ki`)4C;Ayd!ac}6}*(%Bs>dow|RMo zp_&@3bB4CSfFN14z28PeipeIMD6eQ;9h23n+J56Dg}p%aZFa|^O#SIadV&x$+DVKSZmL1=cFw9T4N4pUu=QQ%VUVv{hYyGgQ?(q}* zi?~dx8=68-@8Yq^1xXd5WFV6TYq>z-fD!~pjI`7?;ZsC}*lnk!N8KVuVojZ}WF8}v z10Gmj62bOQNdYFL1goV*W!)$hSb+YLh?F=Log^7zVsJQ$M8MN^ZFqaeNV4LT&sD-g zfTwu7NU8GliskG^+zN6YCqUSM#>Xg+`^!SPdYz4a@71D? zelH?>ygF6|81i0S3{3X6x=BvG4{iv+HSI!V9Ce(3reP?-5bOi`XOcfx*eMyDsc<~` znhZ;QRln%SOE2GXtm4|54N^P%CMn_&%Q4+v`KeXdJh3qt)KG+KY+zu{w<$ zTvqDw?`|ndH66oxiJv({krBuC1wJoKrTVKIk3mpJX^_;>5t$Uw4nF0@JA39Z z6%;v8Eju}JOx|VaDr?io%mXZw|E;Qe+!6lJ!b!R2?m4CZJ+HuSb*jDI>PODW8D`Bh zCPDU!aM1}tJNM=7-Y}6Es~$&}xqXE*qwvvy6^m$G&>!Kk?u zLOZl|UF8<35xnq44fIFN)US)v~E6UvRcTkuAx}YBI;Llo|gaJ5S}kMp%j( z815au&xr>ez)+(VEfHh#l|CbXBjY=l7~S^DT2RzggixHA(~`cfMDNZ0Ej0B?7+SGw zM6Seh~EPhsGQzXM`4)u_#xy(h`cO zb!KvL3)07M41qqB&QLQR1|&Kco6;@nDuva?#RJfG%gXUBq7W`A5o3H>N=Y1>p88B39#3L zwq-#a+f;_gyX$_=FOEoIJDcoXfiuCd5hAAJvm<@$Sc?z3Q=ZUGba2Bg1F3LRs#Z8V zwji!BM%?=B=b;YD2=Hw9A7(T5!afJ*P=96DrP*xRj1wH4$g5a#F3;7ld=tD(?U24s zP&sG~l1kT)=;r|jevaP*eREqACZ!tWQnFs~&ULOYQ5n{MDI=BXfU6)*y!KGWMMGmE zV(&pAVq7|Va{U?Q4M{>ezW88T8AcufWM`BWWCuhg%ntJH9v}|nIP{Y#)law*LIkR? zIhg2X`e=kpUz5VoXM9)Km|f=TH4o%Qf0S zI+BuyOP&(X?}{#HfJ2=|d^quBH*`2Br*o(HO3FprKI%>96DHLyrnPH7uyr0c3yN}*m&RXXB z6?w=umI6m)5u*@A62Nn*F#oi(yrHzi&QZAFdp450>9;Ba_o^AqXog60d zxIT`cH*>Q2=i%I+k;ATRQt4)W)}}|gfLG1vnRKPI;l`&qqHG0>C2kJ0^+p=oT@lO} zj}ohs`Rnv(UI?fq{9}buj<90C3yy0CY21Q4>v61lw~6A!!f&dqBz3}#?v|MKm;GE7 zw!?Yuq0i+T_q`*^^glhe@DS*KYDhBHs`QeM&bu<~S*997@o#>60qd$;nN?MA&{vO3 zUy0a^95;BUMn7>796VqUM#mGkvvO4JnP}48*W>^AQo#OrVDupD=1C-SH^Y;}8m#VmI}8keoPS0Qb^r;`5PBbI{g^^j1p5bV>%Z7C z<6(gkg&54b{vsa@PPmRr((}M%gB0qXhz5WaaCRfZ@CAF6VGIXLPsU2^oost-oXk3 z;HYH07`AV)Jffv+{lP+NvbHM(cossKQ@itT$I;#CCXl}=v5bOUm14KBA}=^EAt2IB z#Q!~x1ZTX0DnnGP=MOpZrHi@SK=K8R`O`vEnyYefkDEEgRgOf5GOkKoxe4}{!I`R9 zX}n%H(I3Lq@t&@$_J$#9r{@zPZ*oP}9)1XNz(8|prjBF?(lt|4X_tG0Mk~RW!*bKr z!JpnwmL+24nS}Z2s5CW-dLQuYKMMOSm$v*$0X>1he-NF{m07Fcg_?K z8Q1mN!f^aJr0sbx;?o^?t4XU`mDo+&r@xLi23ffP_28hzEsbU-AV~%`Wf8~mW;71N zru&}8Q@*~aM-=~V8SgKVh-zxCMqm{&P5~r*g3d#0`W8s4VRaK`X zV^**&s{_~}1=X`<1slOInRRh8$%A$Kds#3%xvmBq~ z*4?XD5|aC833+Yq>5f=lQ$y1G6&x&qae{oQ9#Q%0?Q*Yzo(rA&EP$R|WFLW2hNs#v z_~RBTS;MU)2HSS`h4R~fS@oX-*6~I@>eZ3tt>^)+43$F+W9LUurK0pEa=7DC=`6K$aJvX2Xtlh5w9-LmXEhXyd?I+-gL&i0}XNT|VI zB%sgVl&(5V+;Gh>Gh~suVoqGyOY``tN_w zZPbdAlBP|CbALa0Rjsm=DT?eV*zj+}1+7y)@e!nwPk5aKH;Qsws~nJ5dNX)9LHic0 zxU`mz1O4W2i)sH47TwCrxKRqyGCbZEwb!|_q@2&I7G^9+nTdT!!J3^V)F_X-C;2W`Zri~R~+ zdE->3UjTf`q>;b7vMF)k)V1WtTwKjkZM0- z`CY@L)d{59R+8Pl+0FnV{(Aq5(FQO)^HEc{&Nq>YN>U-^sE2BVmo~5#<4SJ7qTQ@5 zGG#rn>v*KLtm++}(09kduZ28FBJC<+eDzk zX|7psTrZ-1xk6Px!#V0kb`9|#pt_WPAn$x_;a&U>^<3GciLfOX42dT`wodD<@>>Pj3o$~Zo`dX2_;(w`fG+T8@e+^ z)?E>OZPL4F?0c?RbTO``ok(=b$$+lH{!^Ogsn*c<)`5RDJWATG&NpeQ{nT1kmq>m# zprEU~*|$|fYt0+mH*spOws3zY#^2D4cb;mi9$Pd^W%m0FmqWOcEW>j%s}T54iHnJ# zpR<2&DR?@w=o4Y3=7L5^ZIiW1OZ7Ug4LdL)gH&MO$11l)%Ew8y&z@Z$o%>vu&aU_W zil*?+ZQ?0#YH;C=;9*$9?6Ef8$%$EFJ0~w7TP0&=m*~fGd3u|*+_B&?Gvz3`Ek9DT z5_(pv|4h{*ZjJu!tI@}M&FXxDT-RnZTvUX>)Q2Tyjm5@;?I)M9GKqHkf+lCo9!G)4 z1D!(J0g(PtjKl2c@@ z;UM3u&nAYjWv;8S+i-~Nx?Qm{t@711%D4*iyJoO;9)?ZGv*H6^{=)|I$(mrl`D|0e zM24&WfeQ3665YGKt)C}nG?o|lIx4>seEor~D37~dTq~qVa6XWTE?rz`5E9g&!U0mr zu-d@eTGTz!juvF+AVQa>COd7A2a}T+KyWVi(g}vddK7Y*1kV`+oeP+m}4J z6bE12OOZo0+TIx-s7J_T{35fdBnV44duCrq!S0bqA5T5QZT8#r$)~>m1vl9vHF9m zD+!(`fF`BsBt3GjV2I=h?1&lhx5Hb>2S?){p=j~1BXjxv5*u_`k=}7Z(BP+kLvWtw zW>@^N1euHl+!9i?-BhnQZFL-i23N(3R7bZNthO4_r`>3#mlcST2t2EV*peooOrp*v zs#X82Jgdf_q1xEsf0q9AI>yJ^$KlUDM=_sPNo0oslZ(lWP_BwtvQ2$sd^p8|cB_a7 zaq0bZ`qzI9R|LN|ez~QJ7HIkDLA!G+$TvY%BTS355VmT!x=O2H`9ck30RLd1WT26<8#pTJN^*Q89-CSH5 zm+?ZMw4hrBag$a8D>eRN=2@jL@_$yXjH$b#B$J3zhnVHhdaQfcW~f5DUBAq0mjr(g zTF`CV|dXR^d}~5a6<*p z3nsSRz_jE!+oGCdb=7zgtn-En<}dzQlehQ-hdYCARjx>L&7MUe4oIZjmzcUg0}5+# z7zf+h)Ks-4`PC#`#|FEy-~@UbRgHF#_>4V1DG?L|hGTyHb>Or!2JiBu@X=#5E=c|H2;lPQZTGk-7&|MIEjN8RT|y}G43Q|VBs+UJZe zniq?2%9q1MwMOUE|m=phF;iJ?>i<_i_m`=9ULh6XE@IdM*}J1y$$BI z?yQt|lU6zwD#gwNC`WMO$y`p)tQI`Qf~HEwtf=eP;hik^zWYCRQtAyB0eCiy9dW+< z;oIWU@t0-kawz3gKd|L!^-4-aH2?WbXM{~IuG(@Sub)NXu9ypxegq6#nT?rgXsUR* z%J$gtovK#9)&)(Ak4TJ0sk(h6FjRPaB_jfmVDQEzbh@9|&^-qdz7kx9k0C9v79Z44 zV?I)lsPTQ`Hwg|D+ov?(|Jnop-+1j$La{6in5Pwt*C>)1#I2+gA)U~rNV=` zQm(AE_{qpaObph(80(F2yffn0QQvcEOviqB&Aegh)Tm*4Lhx}=TiWuQRFS=aL?}<^ z3%$Fw8L;q;z}~ zh%Ge8j4UJ-s9@N5l@{xu;~Gj=FV5IYyrF9UnKb^OTQ}ZVoKHE26XF2_AVYf;uqBz8 zmcf`ivbHR9L57(tsmb)sDN8&0?0WVn;;<#jOOhGsi3jY!#ZW?0KhI{jxOV|edT(vp-m zbH4>1p5Q66x~yA1C@u{^s05Rnnl!6U)TTUViWRF$KmKYiYF#*}HX!{IXQk#j+R1Wd zszkEM`CS#o-cEymjv?58w@EfL958D`qy*j|*O8;acOrb2>;FteJ@Z2vdI;xUIOuS7 z-ao|?0bqCscSzH^(W-oS&3z>2(p?R+SKj&%=R}s{`-`PEYVUmKr=znIO_F-;%2_)p zsb(;`H>Hw^8KCt%$8zSla-OYSh9ct2k9?+jjb*Ej&7t7O$|p0{x14G8lj zLpK4qK>*AsxI@$~*{Fo>5gM&h$5YzOJ)5d;pPTKzv>$*Agaa^iSkcI}lAB!oz80sY z2@Wf`Jgem(z4K+4hN{`gH4L7tHK(W>=WkxWN=*qJ9wD^1% z7NhGhvjPczc?#%%a`{#R!>qnea%H^m_O|2b&`7NQgL$UcMm61x)h{2RMy&FS(dure z7RjXx5A#$S1nMh_pY|moh)B{euAk+}ttB>n?C~xJm7vmeXmj~!2@=sXX6T~L6?0yi zhfCk1bw=$Zzd(9bqjfFvR_oO=L8?{(_0pW$y1DDI@7`{j){u?T+gWG5!7HX!8UTgP z9o3=iADV50-2nY`$X7H!%0MQT+?zn8mcNE_O(t|KFHjDT18bK_P=INqmTIJHiooVl z7|X+fF%hZw(H=_(LxFvD2XDmQgOakyJ$#@}tc@vE`{gNF8h&S^frgF?!Kv1JU(JdK z{42ZW+UM)b-H9k>S;8%5MrlVkdagjCDUFobyq)gM!kjNUiyX8i8^l3zs?`S!G=2^p z9_I`XQ)X6w!i?4I#NU=Q)K)LG#t?59h!GPp%v>+?j1?06&L^Fm!}!W15(^#;4!?eA zclBoc5YWo=q3!!ARQ;yXUQQARCtl}dP8tLX{HqU9{uil?&+B{aeb%j2*Z=Kjg%13l za(tRfUv>wIWXgBd_WqvYA_2e=mQ#bmIJ2~cr3af?^x_r?D?Ft+7+|;~+GDRu}=ys{G4YQ4| z<%qkCo(IoJD5wZx3vBID2>vC)5hNSn>rK4lOxAGvVc;9mjcm5eWI4V3++1|_u$>*j zg;wmyEoA{bn8Bx)v}jVnWc9(gqop{laqD8*g<>HmeTt(v)df#-RM)W7pra0C=;mGH zQjsjXE(}o$OpKFY#zflJ@5_}F^K?gx+uBG;EBmdO16q%~Zbc#Q^t(uC=F)QofsalDyFE-^{{wLV&H6VIV>c38C z@~xw$XY#KPXY17BG1rabE86Rs_p1BP0_d5bYL-s@Zc&f1BcB(7#K7PMP6tdTfFlmy zc-cm0z17cB{c_@CE6>5a85N5VHV$Q~J9XCDPboqD4_<_A=v~MQ?PN zslyMym@o5h1>KeXYa2cPZf6rNa1<%RLduD(Yq7S-jS)`IyNc z>&^Tu_V6dZpa<}|%IuvcRakglbJ}rHsiz)wY}W(b&)9`TPOn#p!WCmmkIEcct+A-I zmn8*!V)cgE%f{KaD%mqLy!e`NzO@_6mafUXOOOAG)U!dV;869bv)+7;=82|JHA@#9 zuKLe8Ftw#I;Zy-pd_q~{B4tR}+$dzq&@~-=yxZhrZki&kgS2i~STr_nyzO(h9J)_? z$@wTTO;Fq>SF&8w>ZdqhbwuMxVMOIkq^vyc%e1YV0=Z20NPH_+R&Sogo8u^EhP8Xj zx^3h?Np+*L|M%f=mhGegz-jUBh5RsU{H^9ho3q!|HC4h!)~)o9?sVB67$GThjboA}+T`FzdBoYcf-C z>RP#b@QZaap~07RTb)Aj?4ei!<|VmAMD~8%&NlSI3$P$LI#QR?Rt2-pPpmi9OXla0 z|F^T^wS{pI5E5G~Yy0qa!e&V~>1wZcvpS3d0=X>V)4U4bm3ML*|AGt)*qqtFXQ6DbYsG*c&eMU5nq6nSzV(93Tp` z?iZumy8Dx{dm)QR1KaqrgcJvkn5@=8v;=Cw6)qB+EKnwM78_r(KDVSNU$Vn2j=OWr zD{?TJp1=4j+197yJ<6HSVz_ykVv-w@vWd?*7ks0@!Bb`c1frEfu|nf}%}zoAzg`~b zJN$68*tSpFf0IZD%|@jK#df{gHvH`EYUYs&u5ac#H)YwXbp!>{5*<@;V>X}fl#9~h ze5n$Epg!8$wXmNg?SEJSdaxCm#*P#;eS})>G)uXzk_fZKawTQ=TH^kbuwg5*C2E0} znq;KmqssN#RCLwRY4FNdIi_p!dpCNxXUe4JfTM>ytC>T>h>}m>u7#QS3k%neka)&! z_AusL=8YVK1%J@UT4{{nu*39cNMx$#JWM(sSf+#pf#Sp0I0oQRm?Ici8L2hro#XdD ziYw)x69r!_D)tI5nkX>@PLO6&O(|@HMTlh1cC4%(wKDZ+^wd{sGmeI{lKLt7Ml(3S zv#;mrG#XG1M$ae`h_a~1(YP8@tI25bw(g%(SANJGXok757*&2|-Y!E`j-5>1ldep> zM!asojP<nsl+i2_8xK>uox@2Ouf`~uy>o}haqj=OnP|0O5du-+8_^v!S zX(1sFj}G{cP=2C{@;^Z1dK*)A(cbl5QOJa4ktc2CJ9{2D6UBfe3FSL^b$_I7)++?V zs{wE6w7VEi{3DhZDNW;KH|8I?%SQM&xy=$XuWY#jF$5@RUT=Bq@{S`9>z*ma%o5^9 zx+2~WKov&pRSe8mDrb>T9M{_&n}WNa9Zts`J0S{xX#ntbx?Q?y{tU{|t(9iNkAr&4 z-;ianq{LbV5>-EQv5e_LRA=MDYGb~N!&}ahcXBVwK-{+^8Gjjd0VMF!5Er#It$Iyx z0^^mW@vMh~QXO3^%j*Hl+UA5cHMEi$aE|Y>yDE0zfiRtPNJM?)Io(hVuGC%*d((4e zPb#H85QEW9mb^siN?kJRZr990vcX+2H70ejfk~mwKrgPsv8dHF>}qvpAv5C-1}BCP z%wvGmz?I%TlDoIgrJ*zT$At74!Mc)`mV(S4S||DZXfKfpCyQbV6cP9T5o|p}=U){; z@n0+@6w~_;#deY?AMMf<#%!Jy3$M$)7kIWGYKot)c@wq=4s9)SSwHL~yiwiu=2Z7)hs!N6|+r|7{x+dy9*n8R#IJ?-PXV->y!pTRtL2E$yV( zO7Tqc*A*m02jIEXV_Yr0aKA*a-=h-BHd`HAN*5W2!W`3z42RlVvf!nTAq8n%F|`(S z-H{RaP*OkBB6b0>>C@}Co8cW>7$a_21$^(G8Bn_P-^D3`$j840*qxxB(vw%Q8F%J2 zvY5o;;B~PFqYT_4XBj>mygW@VpiTLCaI06pq4?u|!}MH)x+NHB18@QOigNB9s!2*W z!}HjD=NK~ARq#F5z;$3Lg|LhtGDw`mimb%^*{MMaV!@Y?4F@;=?tYnC7DpD4v*{j#^RIxZ zAbU6EM5(6(w3w4q_zD$bu;qM#WuDUVAK}Pmu48i;O{-V!pVB4 zHv4%lTg}$v316^Z$g(T_o-gOkG)Kd4`6rGfiyvBu={K5-yO!T4;{5fcoeZEe;4%2~ zZ4&@`#U8j(>NJPa$a~(7ZZwMg`xv?9MH_=&1pERQKuc344=9TAuCj%Z{($ zaK?T7tz61q3D~p%or4+fl15GYDWN-s$R-(Y#C&(fy{O}DIOCh|+(!cW>9El$0UiAx zoQvqM((}X%xG0)G^b|^ZQ$=0%uzOZsFH8qc%3W!!^7EiQk2%Q{nfNqFcV-tn3CqF6 z*DNvE|CIXsSHu~HznKATgTSH%425+9mFR`b4@FL@D5szdffDiAl(4yD@-(n*`Kcts z(R%cLB5^&mflG!U9>K`TdNY&z_;}wIyD7q6r!*-9y8lBTJ zrgh!D2eO$=6M3U!&L5oMa9uNN%T71d6B-&Mr4AmpQQm(5syjc|air~=2eH)3=Y|fP z!Hw2G3qG@YYUEbty+km0+)u~E^dv<5gFQAG7GkQQPYb`iO> z#(qx86tCUnMaJa18v%5|BXz18ZjWv!QVmGyoE(A|vDNOVlY8ZqY0H__B`rfg6CQQA z7BMq(;9#M5&hMuJ$%_N*INqbSix6C26VX3z$uXJ+CoSSb9n5vT-w|XBUgXpgOF6z0 z_#9lZ-zfTdC^aE7qxH^aJx7)Cl$=u2wBluii6yLEl}IL0LXndE6Bonli?=%uTs^J| zl3brkk*$Sb0M^y|+p^BNj(|Q6rqKXH^D0$GEiFlb_FlRxR++6R<&P;{&15Fp^J-cA zUA&!NU%|8Rm_*X!bpwdq}`eb(Lv{F15t8 z;Mhhvjt`ScVml&O8_C%QtrhRsY{69O*uTJfnJ+}a{#Y@dryq2*3CAnsghBr2SprdJ zeItcrae)4QG3l(0(t>7M1$l;qhq?1Iu9bfNpx`o{bG!pBclC>RhVV<|C#um>LRdbfwxwU@iMjmUtGc}z1iY(7Q6n}mhuk` zFSQMurFb0Jxthj%p36y;7Oz0iVh(xg+VppBl~ug6ZvG*|;K>)8hR2xYtbu8qI6+YX z!xjribbEzjB=c4^3g5SA6f)|sxkF!#Xr`f0pSU7%k~bABjdlsOH=L93!l0p3rin=7?V%~ikqj$S=H47tJ>+r286`(b38 za1sRD?q3eLa@G{>qt_3+{*%Q&(s1CLH@%8*agL=wN5WbaYH#;1h_@ACv7suS>AAK? zy#Zr8b;*#a-F3D{7o)uE)q8#m{i~`U(J7nmG9bLAKtq@b{o$-tn`}D&ICXjbGa>*y z@#0piM&UZwYvQ``Rdl5AktqATuuR}ew?K6*&|QU6t=oJ*V}^O(nn_hDQnM8VpWOFB zZ);+_z-Q!WXE^)QtCxH)S1bSXBmF+r_p^r1hNtK{cSk1qTBBtvr>-LQq>NK;1}Fcx z4;OqjA#A===z2PA8P^!=s0+kk1S$MgxF{1{RbOJ(L&_L0Pa)CqS4OcwqeZrnNbt7 z58X`S(e8h(MIo>Z)8aE{_1r*Y6M1H_=ATE7kxAOdfw@KP!eJ4A5f%PYHt)$NP4>%H z1MN0lHW&Oa|9(Uq2_X%n4~HEZ_LQ+ygO6CJN~qg}N^6HW%gPN3HvYisGUN>4(-mz3 zG-eQd0DWeyZk?#1)znM7AVy~C6NU`=(TV!CKmoxrJZR2Y)JK?-(s!=&%QDXn=Nea; zc2~vk?UeD1AT7y0E%iP@%C#sBW%80tD+9#Bk~#$5IwJH?>|@od@;W%-cDBUMlU3PD zbf9HEyU#@$dt(mLCR>0{A1%T2CHE;ME~muwS7j`m^!FX+*_mIf-tjMF@BpjEswJIw zvz6EIa5sm`1f(m$8=HNx0-wD zk73ZTCl)5&M^&yl%B);Ma>Z>lg!KOMJ;^Mi(7aiE9q7mLQ^QYw?`kiaf4J5bxpD|6 zP1{U>;xFd&@Z}8`C#Zrlz8>}T*tF)M8>S)NqTQ9qHHTITaM**e%G7koT>7xm;<2Z% z)On%pql`^v%f$WW9B1a)%xWD>@cKW1ImwbGV4yBD(q=O~_aye((KoQTe8_g+c-yqG zW|O-KcHU{i+WcjimG*rWQ9qwn!E!bKzq2PIedJ>4-p8Ux)onlVWx7-(yFP0YSwYj@ z52a)Dt}a{pR(M`fGIS#@zyBZ*&glTg)M*&evyl_a4DLuAz%>?1J04HiM;~872VZPl zw-#*Tv#~?UvLKOo3;0vuM2T}OxWqY))&QzJ<3RIyA7i81pFV*z;96#T!D(Tei}~0e zghNYbtuSR{IVlG?TzQHN1~3C_iS5f%s;!xtm)T%oJtLI-D=SYqd6c@fcSElEp#zmK zTv5udl=bqd6!1(0th$-t4-(PFhNL=89sUr?j3sAyYf`PF16!3F3xS2l;%8P0kWbDfZR4fjcWZ$S^TqQ6T@D&@452m4uels3Dx8#A37pyh6HD zdybk%)hgj;NG1my)3KELAXYRcf>#^!R{L_conXuahdq*c)c4U4;h0(*XKNq&$G<;(gy;py5zq+b0 z9yXgRhtDy1L|({Slrau}HCrVAX0Rv>zc8oNZq+r~6X|Vy6I}U#D-@BMNIS%7DS5{4 z&ZzTO)?9B2ZJ8KPM8mJ6x4i_4;0Fk>dReB90&%a!IKeim0d~fECki(v? z?aY{8$fu!L@+p~dUMZm7%C#f96Yv~{Be^>Y(nkQ+f$*(rg0kC%0-&eb>=G^eDkZDDd+ z%F16>F5Qv+?K;%O^KFF~qEi6Bz`0-G4oV?#+VE6QJ4L%M$pxpSJw!lM0WFB}1WU0@huVn!^g&oTBi z3D46&QDywn-mT#ZOk=a-H%N)nU>;&^A5UhRRI17)a|}9Dazx~XN%5KezxV!S`D;R$ zO=u`}Yy%~Vau14Q)^^v1R+6&Bn7=PuyiP|5-tNz>&Dic5*AriBz5>CE9Jtu!!sJkh zNOg;p`FSXZXKgOkrcJ zt0oOj<-j~U)RpJ7R+FZ6<~VZt2hY6~N(oBn#2#@N>34KVs}AvQ?7sR{$uTMTiDy7i zX4lZVL=W`f?EDr7f%EaxWdmggj;NQ!bI+=N^x0AGYgE`6Y}hogn7#y|a4bq{YX=W! zWL&y$~O^(j;jg^VKa8$|OVO!ylL$Av-Z}SK)hl4)4!GIEBvD6)cXxNg+T~#-m z&roOXZ-3a`otg;xju4;B&0x-K`qiD)%6U`S)?~_dC)wp&A{%hsoBJ&Sm!#mSYg+!D zY{}O;i(hlhtv=`0D}D`mT2O2JY%A}xtPggHm5BTKuxR;JC9=ixzEGIee=+eH_Rmjw z$4fqiS*Wr|wKW(qFh9>SQz_swL6KxAUaVBuz>)pt{Am@wYjY;WrD&^MPOB?rBt20e z9r{e}7pv(=WIFG`%FVO=ejuv%M{D7|F?jCmgiZppBrd>vS!Bon4-ZTxZ6oP#`p?fU z%9K4FNi)+WZ=>%VhgYY~BRR0)|Fx}xepV%AJ?#C+7pX0XPY{D({Ptw-1d+O_3iS<( zV4CeW5Lu&9=251vMPfl>Jb*#;Y6VBl_aaAZoc?VPA0fE~AT^jHzpINMo*&fC$bx2}2mGp-9JG4MJfPAOW>;2zaI^YH zb}L=r23H`=Vf^E5py9^d&Ld_1w$f7)HAZ7W8xg zoU)P0t(P^BfBV=dmc6bBSjR-}YZ^^t`jcaE z1uct*iH=+Kwdf;4Lyuu~v+VPN`N^CNUBz=-BIrzs>S;T%SsZTArgg5^_nZcF)@54BMqEdGl8}|}qdZ4R z34jhWv4zqt^ak|J=BVZVjq$UaT_J8VBB(UdIJ5ct{$L-yB;}PO-AVPs8;$`!qS8NK zVsZN|nS{>41SGrz9Fs?nZXUwBj3sL2u2tf61zka?Us|~sw0f@jEdVr(lxTCU#|Z4L z7+IlP(v%=H9~|jWFA{`h7_5Y>k~Byp1R@o-9Ox8TM%wpElpVAFjs{nk%r8QbE%cLu z(|lC#aERW69JrO^S27@Y)ND*&;(FS&Rp_I34cA+Qw0181wrBoDFQhsM^Rq`F2o7zZ z3u%o$UrPP$;F!%yvvsreBc>VVcFMtj5=ite0~}Oeuwd_}R|lw=@K~(E(_{GpjNS&k zW{`2IRc2+`sfI7toczBWhaj~{52o>k=QaeYIC>HY& z=e;`MDUq;7prmL^$FQzLL2IuB{tsG*c{j8DPVLeXlEEnToK# z^yZm$AndC64^2=`o#*cjk0a4GSy9m|AZq6<3@Wkp4H=4N;XYlRP` zo@##gs0umuZ;EWd7q2P>#)PLL!6Zj!MSW$P@g?FlB)Cg4TjDJMMpVj~<0(re*J7DX zJspC<~bVTmNK3<}`%?x86 zphHKLBC^5xo06hvo7vbMUqMoLCFhFg`VEyvE_{qD+X%s{_h3q(iD#g21$8E&mVvf9 z2NSA;W{9MS73+VDn*HBC!HKis?{BMbt61(yUUUyW(CPXoxYG!i>62B%C?APrsTMql zUE9q$7<&aJ4d!|t#kd1Yk3|)%+Nd=W)!!)*-|N-i`T&0sa?oW+{MMWMx{E1W(s*pC zugNk;i@5zQIY5+K8R$C>pfN*ul5J=M;I2cejYlBBB~uBl+jMJMk3nRG$yBoYFx9B< z0@IcV8Zr|f?<}6==+gaON#>?>6|&C8A>w8xI=J#byf+4< zSg9;CP^C*n(@4KjRrq)@UblU$b_NV{zqs0NR|d|^`|c`^mvR5r=|u&I$5qz@EJ`l} zX5&u0{xLm}-PMf#>2vjRrF(p~)x`L0OfK?shN5qpm8LJ-#LsnB@2~bc46fT@lR~rs}YAiP^w_kX~n{eRJvl&re!x zzx>ZQ_uSQw)}+nN;GC{`?VI$|w~W4ut(oVAg(#toGLsd!>;|$xE!W*>31I)Jwfrr6 zQAS#r?&-}?w#^{$3-1N)N(iY`op;3y{JS&a2*-Ynx#DCHgAL@oFA~~-v{q4)n}!up zoA+&C!!_dn5E(=?u;F?YG0~S&lSD1|&f`J8Qw*4g2P-B6J;dXKyi_i)1d)HVlGjFe zbrR~pe(llf+RKG%v#D%k)?>A_YU4kYQXAxI4EuDJ5SS4^9L1G=+freAYq#nihbL~qxMwyZZa2XSMwLm8hs%4xn zW}WN%JNx1_xSD>d3;YUKlhM@gGUaiZ4W7$kT{L&fNpm2Bx7elViV=Sr^N>k3{lQB% zU_!`tUprb39_ktz+G1omHmK}r>uwrs9?!X$vI6E``!}BhDPeLrI*HFOuSGd4w^sADJT{z%tP#QW{GxZ)BjtM*n-`{s@?Pofah;l zim`*Ih@70WpK{JZllH!rDOGp9rE_w!A>$RU(Q7d>SZD>#YWDj~3}OT*5FO~+}> zov*bhktG(LZLSC*!}vf$k}Kh_FzBD{*vA8Min)iImp`y`_7UR6^N~rCNDLyBL1O8n zo}6NB2AJw>uLnUj< z9A3iJwV;!`&#J>j&zh%qMAg1S7tnP5ac^)ela)}7umx^(t-v!R#g;N7A-=cxaX z4V!D!MUbU5uVk-A+Lz&i2jukT*&kUkuB$l@L0HSrO3h?@#)=EC%KSRkUTTL1dU&I$ zRD+k?xJtB)w1h@^TR3ytiF{S0qSUo>%niqlk-8vX@mbc_5&UmT{?@$Q%hGTddwf3s zm5v2DD_f?Cxi*n5A62F}F#szRVJSAiVpwC9^QsZiPDvLjd$dFBhUl8=pB}dB%0abx zndxK^-z%~$-cV)#_Dy)M?fI4PxUj<$GO9I9Za70!?Q8XP#8zHNzLKNP#e&DYbw%M= zWcSLQJy^}dk&TJjb7J;5PAvMq_Tl+o*xOa$QEXxaoT=560qva{U#HX^waa4EX<6F; z{mPI*xb1Y$>;4XUT?LZI1Hu|OAYA|vY3WjUSjht9WJudHL{i`)7JW@a3{=-r{gNN@Dn(D2qf#hNkCmJgnm2u@U&ba-@x3dKG%+fJfy zE4mS7ek1mHTqAF5-QCR{; zc75+xAD~L^J&3e+Vmuvr{w5Lf_siCa^~Y>|jneDuIU|S^)7d{wStj;o`xJ4c%PKbZ zbyGb($=F&+`#XxRsR|1x?m%&{!Ol#o&P*9=ndL9Jiy}7Tr2PNwb?blr0Yy->+p}Gi{Nbj`Eaao7gJQ@1@uV7JInhML0q+70ofZb$ z;ziN0fk}r(S5ek;AuEDPd>L|c?r@f*sNQ>L#EarC4ysmE)ds~!;q?-* zxUM23Fhb5b(Qz50)Y>Wc;Drv-3RhP@WgDnlW(hPYQDVvu=enB5lr!~}!=Eije6}Xt zN*2aYpWuB%ceent=B=%V?4$zQ!-YY@Nbh&Qzdn9B9@jm}G*E3Mra_ith#H8pJ z338kc%C87y!{VR`bV%^u!#G$jn~J!0W$4=$X%BMjh01{GzrX@DcLPe`>hgz^>IhB7 z>=RF;{i*NG0sf8ag(iDlAba(xGgL$L5qipwV$tA|21|T5E&WRZx$o4A?>#`8AISo& zuOU@}gKs53u2bB#PL9Zz0=MSv@r?^1?}+0}2^5tKzC+v`x$s{FJK#4P0oHO{2JDtv z-NzkUA9wB8^s{kKJw!rOwI`*y-0y7ARI$pSWm+3*`OLdd2%&qCfBzdvndJ zDO&6x@f~Q)Bge6hV}itEwszCnG-=OImm(u-Zf46@qV@?xOs-7SZlwId0dq&clu(qx zp8=kcvo8|6n;g@?4#(ke6w2uwC*ySTd z$uUIeud+qU%y|V+e5UGZzSuFJgLT3M0gh8H9Nrfi%ESTHCVCqj<5qq+Q=-Kj)c!uup08zd8u2T1A9cz_u^m+Z>0x9tg#~x-M^P5II(8R&7|BYSMh{tGI>b z*e2zxg(fbmrW$`fIWV1P7u;SmQBv}ThrU7i?A9(JhbDKg11r)!dt4_w665x{*o-!UA-2VNfY@rfo>4p$# zxHs@UmGJUexTzX*3u@PJsNK(XbG(9%RKs7Rk$XwJ`UsPgLz<{?Ng9X zcnMmWn^}EOZB$%USN3YlsH);;VtdQX3WvQB759dUAW3gpbbZE9)YJ0z$fa688wa~3 zRX7t%qLlHXVykI!4g3?gMEHucndV*}C^xQJ`g^5#Bosv0xL&0ow$ZVfX z!3NB_S$cauKJ^ZYFZK)Jr-PZjlSO$O46jBKeY?d) zQu;_bR1d-DLfZD)e{em|D?=rrTBrqU!t%f@NrSsP+$({u)Vz@?~X{QF{^KLKjH9LM~<&?pWG$p;}NqUomV^2(Aaw>A@ioJ zm^@ZBKeVo@@lCIJ)2e0Hm9(|FRJ~Xpa?=1_eT;@XNA5DA44*S5H%QN$gfl-5KiA{i z-9en{3%7mTl$D*v*m80j^&%NJrKW#%q-o}o)B%!`GN@e7sP!A|vV>k74H>i$SL|0YtUe0O<#_)tp4)%zy9809x5F`f`9_;!9y#!0p2#Fb4|KcMd6% ze95tPAelV7NXqeyvH*L*^$Z)K{&cVIn7o6HehYH!>WNN@P3yfTd}Z^%1bI4ENySSP zcB|Abh=F;!7_hV9Ub7^m-;mmr=d+UzzS@CQcDhRp?`Gxc+dGJePS~pFFVt668YO#W z4w4@~_RaB#2~l5TC+$Z4boWm@Ypvrz*$_MHl!rJW+Q-NyRdfHidlJi4y7GVOrZdUa zade9Rr}kn!?bK;9#u-|1BO5GRmLc>c69mDj*bY}#riotLD?jv*FAtT-`)`%SO_m8k zSDp+Ox3Z&CSJ5DoE6uetwHP)OZbjm4vHvhV)b?V8IJ*!zQqOt7+Q?_@^f*?!sf!x# zd6U5s`U8IaGo4u!?6p|S&Yl#LzN_D&_(zzzvda$pJzzo&FgOtHA`Z?Z1l|S*3Kw3) zzP6J;mOWeRqBtmD`ZFA3Nd=7$eG{@zZ#8*r0%X-RBzlR>?DbTUhl=wL{!vE0=37yw zcK79vM$ZHCwlp7Qh4gG_I0Gky#Gn#0Z3bVx(mT4{Ih*ipudrm>Nl7NzAo0W!ENGjw zY1G|AcF+^RN-9=)4U8JGWM%WW69^%?Y5#R)>84xTuGt+U!30 zbzQwa$-$^FW!XExYR8*w=xvH~O&_w|Tc2P}{t192#VzvjCEbvg zS2=@%P26JP`FDb(j)T8l4ORw$2db77de}^IjweIxKU^C}Uk^DBMYGskwa*!>5}pWI3@M}2+LdrHcn zDG4F)n^Y3)Vx6R@L&b6`+@-Fw8EH#w2PF@^kB>>FOB&g}LOSV)`;~BGuJ4Xvql~x) zu{~51e1P*n{(m}UNkv=)QVq(Z(bPdR=K&b$C<|sFjPwp?%{vo+kFltnxDFCZv;hqufWfHLhW+>6%QZ`cMJdgTY{|JC@CUM= zebPrm+Tw+$h*mXeIa-@dEj>JF|A$5_ycGUV(+Tzoo|>Ed*Y2BCiRYTpt^)|*@Jf2g zl}kl$Tv5VH&)DHDG+eS+ka@-}h5rbbc*Dl-i`9?*FQ;sG!!Ifi_{`qRNxjK!X|~6u z*dL9WP<(LgU^1lhCmCjY2HlS4Gbws~@mtJ?Go!stm{*{NERu0#s7ugPrOlUAt~DYt zX{Q|>dn#PZx?Gllvp;KzwA+Kziwo;=!O7CYTVToyv>jw>*O zGac5u$!QeT1UmKzsv)bA3s}VyJBYX+IfQSc^C-YXLl`PpWA^pCm81)&qmGf~1 z4!r45K?Iwth>8PLX$lQP9N36FLrOxxG4&sor$YbkuT|Ph<{xK_!rwd0Kkz2kkRcD( zh}Z!hb+$~OY_&#$nxiB@O_ldumyGatW+uTrJM!K{=~UXYL#!H7?Kdc^ZYSSg)ILo{ z<$U?0qrJ?0H{gBkbm!s^@a! z^-hw}(BUGY6hrr~LG3+SGlgKQ+PAqqcphj#ePCi%m$$|D`}A31e@Oj$Gga3nnmV1> z;%G!$`p6oSP?2-UM|wY$FTKc(#!;F=vi9$#NYYU{*Zc9eV=);Mg+XSR@_%$V@I&4DS0=sOPzGTuxFYD6_>pF5-%d5n>Tf-afq%j=c)He4}Rz;4a%>k z^#A8@CqfDLYi;@F*MZN*u_Vt(uJU)|W@cF&mh+MQQN_(1lSmP|B=m&?lb~QS{fwIo zkAFfvawJZMcfz_xm&9c#pRCS3DcSY#GtPv}gz{%^uY}JiG^L99zb4iZf0IhU6>-r&QJQhUUP2ITS}6~u^%Pb;j!X^0Rt)np707h2Y?MK z#_u!OSEOba z?G5K0SZ<{`_H3<-hZZzpm*B2QeOXL7Bg=<{B0^4g*lTlbS36qI=S)8Xb`p95|B-G! zhJSKvAFVxXcNyQ!H#ub<4N38T-__G=V{L)eh ztWe$7r07;-%)+*K-ZeZB-zN&sWH6f=LlpHg*122uu)TGhhl4Fv@!$>1^9LeWJ$01`pmOa`HRdLH zOYoEm(N>!*-K(m1;NQzmg+h<~+1jCKm0xI`C0ggxN*q%*<4e7xEQ7YyruzHY&Sg@3w6=-HO)6`cK>U^ z0%r0xG&UQIWLv}8VZu*penH?_UVc$pa7Vn+uwE72vc}xR@LHq@vzJYio_;?z7vDTk zY`*6sU%o*DqUv${H2kaFr(rE*vp#SQNO-iyimqT4+z_iRwufMcB!d%s12)65NmWln zR3v`zKEIpQ)2mMDe=ZYM(Kbr9Nx44J$R!z+w=|}Jt>c6-*S~te# zm&)VosH`bY;D6brmv&W{(!b}HRqV+3u~NnjylUN;w}rPs^akG2gNA8^+I$MEK=$=s46lVAGRVM*#VJcQ=F|AM);r;BmBZ~_7FOpp&kV&>z2OW#+U({!L(9g` zU(qbNTeXXb4rF?OV4`>#To%!;tK`Ggn|#_tZ>DIMSNqSUw&D}9T%2jyD)}D@smtMhz0K9S>X7upC5Z+c0?On2rHAl3 zf4-d$DU5j|%1Et^tz-RKoKmj`;Pxyj`g?(o2%#FAOK2QO7As4=<9kHeT)%bqQN?So zKuU)VB-aSH);!;mKZ_+1y@FRt0{m6CB2QGgKD@>I6dCsppz<6lQlI%Yq2X=joc6uL zx$QspAqiFUrUTn*Ln72e;7ezpg)vt!1N3yl|klLCD2E3cOxDye!K)uCEX{FR`GH))E_N#&A>jl&4C z3gRLlN_KtG@lkfF!+1UM6yLw(W0@P4s$;X%XKdFB{t+zIH&wnB#s*0gMQ{cH+Jl$w z>@S~1b~;4*5K+V^(~puWnPbyK1CdH8b@p^Iu9Y%}ZxWXzFs8x^Yd!3L-V5^11(VUN ze1!=KKT1SN!*)A4L)mZvYRVhxBJfWYIwKR?g|ZMIB2f(%EUE3N)}80U#!syrEUGIL zr5wO?%v>Mc4%JdVyjTJ+OgH!(m(uDXPIE4^Pv@uYm^V$3+573zO1S5;PqZBFV< zQa_(n&oVO+I@RftxIl2HnjbzmIrsm_=5MMs2iEa8RlBU?Sx#wiWErMVkv@wX=ume4 zx!$?RZQl11DNv%V9*FLqwSqD(7{rluxfGQ527pUJ5KCp zm#SQ@#pYt`-krJB66c z%x`rI@9=wfwiswukL1FhBlocvI#1x3z=?ZzgvNR#q%Y@my>Jhc z#?`4kaQV?~#Rpw^mL(l%rmhC&JuV$J-{ky9K3fXv6SiNA?+mwbiyg{1D+1?Ji z5->xxNpblG>k9a$jgi*3Zs!!!Gb+tLlxSb@ld`c>CGAY0#y+tHt-?M{E5;2%@1!is zR7E%FiTKyK^511G0n)tG?5Dx`>f#(oRC{!;M*ivqFZqMPziF9?+LPfXkP~ObiR>&M0D3aL43h2K>@j zQqw+;ly~)PHG|@*v4sCGJKbL1AFVxe+YWxrwr{Nfe?CzoR#{&LY!O`6KsKt2^m0VP*+w{yb-@B<}=)AXH zld*wyzBaFJR_&ZZb38@x68<#wtTNM{; zQA-J7zLT+RG>vM~XiA2{V+(p#l12hGcXR+WG^?sb@+{Ol4|A&xxWl}ax7Jk+#j|N( zOpnE&sz}g}OlA&cMyN}?vZO7&oLo(PkMAH1_{#p>k&~uj3=zc&3_VfV@KpXME)6!q zwUE_u05Y4t7h1?f)9X>B%7?Uhi4?+N3uYd8F~p96#m*or4^?5)#lgmW+pnKUGEg|v zJz9w4pdQB-Mh<&R(*;pvUTkViT0alu%f)8W@iPyps457>;wtOweAFnO4b;Z%M#~oS zzR-O>db*;?m2v81Pa@TSdC>EQlDuc(9DuvUh`Arnr>f;zlX0yqZk!nRVSco*gMayv zQZo&`=}jKnc~@fin}VhrSr$C%*eG>%DGv27;UCt0!2-|IoNHNfslPjGCcVW1Uxe{_ zpX!w$>>EZo)p8)sIByw?0D66r4w^RXdJNo5T;`!J176oh97eQ#dwDtUeXY_`!q(Z1 zm3J|vjHvgqO9v?^c3k12;$)1pqYn~$Kyxs)jkdz5xtM`VB#D(S;BUl~s&Gh-J+vlqKNq!TSK7XFA6A>v z&IYQ(EW7k^^qDMjnq6`(;Z!T>BbVGkwu&yLl}Z@>bAg3$157X7bcvF$?eR$i-n1b) z31u2zN6=rVQW0hS2c*(%^> zVmlzP{4Ee`2hF(-5@&erVRiwcG~C`gD3hhr2vq;azUiaN)gc9%uiiO!wYDV#KD8j|DiFMh8NmhKYFim zdOBos!wWkfSPVxLO}DAmGBe}Fat!;KD1hQ}kti`mP&^~ID&dZetIV3NWt-)^wBojG zx=<{Q7d9xx5VM$Hprcx`mS~mP7|rhgWGGnO7$PKG*0*ybNr-Uuz=2E|naUpLNEcZc z6J-i^un*vNF>Nle>r;XANnivoIiQ5=6F@!>hu7FIzB4m@Dcr72A*0kK(`pWM_Il9! z3f7*DB5=Sm!8z`CRhhUh>LQ7WK}KcjF|sV;$ZBv95V=S7atj#wR!|WqN_uhKejU*;>zH!;{tKd%=5*jZz>jb=SnVX##*A%1)-QuiXP7dLQ2}oy^u}#951V-&K8Ty{QtzkNiVQ@Z4W1TGObF!~Taj>4Y###psmM z1eOt-o>6Ae;V56F^uqhj5vUV`RqBYO;lGc9GuX9F#G@v_ z=^hlVx)sdMSa3<8GCovZ%ht_p>xjJOxf~u|Yb3z{iAp5YJRN5-3#Ozw7Jz6Jjrf}m z0BSX1V;9i6H70)EoEP%7$wr>OkLE?68rJ8>wfrrIXA0K16Kh7a?o`$T(Xn%$*?FrR z-J4)9XfwYWHk@V)L-0Xg8j;_9baV4%n1tY67XH(_GQkEbFY##<%eW~0O&ap%9kqzz zGvaBllM5?Zy)4B&MQJ#6MBewQ_`LgSY<4#BokgRuS-%&i zSi(aY8z};dEb&?lVQZrw28sJ%X1k!@=?iK<(!*@bEYdIldn_UOzD17Lr7JUpL5`h%SZfk>18G%>UqKFYdn97CX?VN{sKmrf zR5p&${vmAiYK++)&#w7KAFdsp9m}tIxRBGnUTicViir0FhtZBn)h~`8P>V|E_ zxNcggXHue7S9Z#wVU!1KZfIw2W3p#sllJ<^>}4bK6z_SwuMb`QIXbjlQ6`6=+}-UR zHs>oS`-A)47Txf&g^@Y3`&YA+ z+ZEe>pIn#i@vyFjc;%F$(- z8jSmc#yYjNg28s6imIWaJ?&woxjQRKjst6f$_Kj7VyPzL677at2<}(o6H%q7D!QJm z1kjMABdy>V??-Bd-J&6=_V|eSv@u{coOr-54p=KNzCKjr!_$cE2t8A0DB{Jfq>Bt{ z`2^#j#|lY^39KaYd|yd}V?_gUX{)=s$d`-VUS)XkNh=|TV8fe0tC{2XNS>G_gu(jr zwFlK-CG&o+=G6+|Oj5{+p$Kr51#f8QjmxeUtH+0iKNfG-e%!*UwC}*jVE9E6GYC|^ z7D{4KMvto6!eybx`i401>Y4QT%b4aDrN{gqTJ?v{$2k z{tu28>JEy9DKIG^Q0zu>+p>-;&-ve|uZr^r`H#cs1cPhw?qwoFj3SH>Y76be?JKQ6 zLUs zIO*nPL2>@NQt=y8&*%Tpy89P(GmY*c@O zqdY+~(jRk&NqFDzUiihB8>;MgDu~485_Nk=a!zyg-G=&&m*ALl-Rt&qlXqmX#SCzZ zH}RyI-)d8S_q4;DjWL5KH{i3o_(e@rSVrwLA`;%ZDdzoyVTJ?hOppX{6*%L8!Vae^ zCH98hut!uxAvrdap8e;xchDU{B@%r-x!vGQdq3d;B|gKI%|) zOlm^~RSkeMoPJ+|vd7qOf=B~hFAIPMPMtAaL-ou||rg~a3{PmJaNC&Bx_I;H%-U*#Nm^Ydvo%Bwc# zC>Bzl7Fi0lC{e1KC5*;K)f@k+j5X5x)ChUdRtvC{mHA2B>TnVrHRaScbgS}J_Gy9Ss1bruc@sBWZqlTYtZeb4 zj)f0g^oxdZ)@N}~3F^0^?ti7R$F=N^yd3VW?{%v97I4+pN|8zZIxF)Z@P)}`){rAh zG2V-{f6`x$i;2yJlrvz6+MWF)-SN|O;1id<|5o_U+$i(+hI!TOKTpz@0K?*S&f3hU z5!Yw2BW|OM5VwP4P-Bsj7u)K4TGHkcdNHr7vf%af6*tD$>#7~m76>j2cFt_Nm8=Pp zn*Fo5w=4Uf?mgkx?|v1us%>1WHeVQ;8lg-h!r&aInlOZ@=4x6}s9_Aj*F1(fYh+k{^0{kI3 z7mw6j!gJU-rt|sQqn8uUIF(-g@<(ECIh04s4j>+J;d-24T9_k+v5{{5{Au&X{Ydb8GS2n*PpkKt&XsG(*Rc#Rg<`5b)@6!^U2FqYuKvy_Donm{2qZooqGp=s7ox@NTbb$OZplUT6od5v79BRWSW$(8vdn znv&|v?RHo}iW57!SA_yUqbzN-xZ#$HvP{IyD5G$kAOZV4>tu^n95v;t!oy>#q6)%z zPen0DJ@nHVegAzVA$(C?95_ROHz|sS|B#++(;?~OXut4rc3~hVWQDARMd?1Up-cr= zMQyWz_}78#kVvUxPNcM|(YFm_LIoddM;7feh3sDp{h&YYKeV2)>g1!Y)1Ws3Hy`9= zhYgA1YXbSZ)ZGzQK3Dj_I{lD=J0qdu+FupJ2t2ttp+E?X zP~C7~UMx;i*xpjulYqy;R=&Ks{x-gW?x`Kge5sX|wXfs;;pp-N>3Q6_?Ei) zK=Rw$YiO_{W*a;Vv{?Uxo4v12Hth&{!<~9)Bqv$&n_Mzwnab}W+5Fpp!Q65d&}|`- zJyjAeNz3?7FZvSpLhDE8b_6424M;k750u%D(S00q?U>b|m@aO&NKBl=Uie8wQk6lp zrRREh`wDwCy%o1;MBJg19(lI8V$5S!OHuWe;NJ+7&hhrQ_R(%`(+vD8a*1bi zS@0~RR)++uTJuKD9;LW@SIz8ZyJG`|t2Oj&>U2K=|%@=FYz*${8E zf(ldSAcJs){q>CzyeO@=sJh1`;3%uUKMjk#*B%R4>lp9w&kbU<3kWiLrhSmWJh{OSvimUcU%60c%$=Wpns#H zPaCQVi&XAfp=ciFQT=9iz(k^#xFY=?A8#tyHP`?Wi>?Z6&3$2A!##lNf?XvMK}d>y zK~vz5E~t{sPSi4Aa?y72B@AO)WUqz-;vf_*C&SH>8H+8LJeF*R2f-xb(OG=iz^R%P z_U@%twMbwP%#B&bD`3)a5p8?^u`BE6W=@qIpZuY|j2clsN;X-9yL_dJLe*KxDrW|I zks2EYjeb}##b+_rdezJHeJ}(n=2rE3;J#59Gbl6LCDyJcg#^*O31KIvkU>QTwS;R& z^tP%WeIJ(c6f}3>7XLZm#Zy#6OlMn%r$GeYXp6h-x3fg2MOQewa`Bznx9Qnk;?S2v>SHl@mnK1!XIE`CK_zFz7(TUsC3T*T zj!(BwQ1h%@{r^?lc}BAVzHK~38??2lJt}ICYLVEhLQ+JC5mXg5V~e8I+IvONs#!wJ zw)U*Oi`o^Vgw_gLEvh=+eEpyEp7;Iq|M+}*&hzED?{nSP{ksNX3F$>8X_~&k4Ko2z zLBYH({fr=bmzx_H7auYE>3oggbfyc(1D+l=y{Mtq;@Wx_hkpP&*1uE2_J^bs8QE(h zNLD3!_YP_*s3QYRdGpv*uh8FPV_(|*J*B>GN!|8V&t77Z<Dq)H4EB|0xT zYPhn^Vf(C7WCW4;xt2T?K>tX!%o2JiNynnmjqI%a(nu1djJ;hPj*T8`?N6m-1>eWF zodJE`O|6@Ru0sYr#xwH1#r@`L`qXckTXkm@73_!z3X^SrnEY0DE7t;%J>A&aAwn-( z#b7-#^`pWoUy0XCL+j)&{Q{~*`EJMH)%?ZJ1e=`f zO0dbqScdf{X>z$w0cU^=0P0t<%OL;{T1HPmzo(U=lbl$|iYj_`KKgiw;VNBy% zzXanDf*D>MV!@^>=zv@&CzV7yp_vb}Sgj1*Q0-)z{Cp;_(ob%#$4rh!;75)LFAr87~RgROhyawl7d^owIm7w^E;FQN|5v70Y#X4x% zTPP!fWv>=o7TH7VUaCuHRXpDfvI3iP6z=kR)wqAH(2fDICjb3VrP{y$&Ro>1*e^|B zb?3#HACyisEK#>xtm7i!(&m=?)_m=}Rj{~i&W$slHe2}|EXq4UU#Cg z4LGWAReWPHz-C70u51-{eINxZ>8sf)~N*m zfqW)q1fjzrP1Jw!emHsUKbzD3=iO=e%;1WT3j^|A!Ywix9)Pdt2LoUnx(H?VDO#MT zYEb^P&(*9SFP#!99vg3+^AeLUi7HRCDHjVf7u7biP>twYD;h`x9nNRttG9NAuKY66 zdQ;21<_Q|6hH|4#p6t2!27Md4vF#vNYaKpfKd6^YO}-rnvi%ULidn&BP;eKmL*)@4 z#pN{Gd^>Cp*cf@?W)6oUqxZ=I9tzHf`%aWV*+E1y)%TDEmfwSH1qwzGuLO7_S<23 zI*iM#kpyWFO+lpt7*e@9N%*|H^u&JS`pU&2?i@M25sd86`65IESwvv!ylT|0-E{p@ zZTO^Tz8u`-5@W{A84=@Q+tv$GR!P*fOeb+s$d3w>m#yg4xWHyKMLLUycRt~D1KAGn zJ&S^_t69D7s|`q%Mh_c5ZQlBHO!55;pS`#KnN5jF&+=f>>|yhJ{iNz-k@-c*prj}{ z0ph{jO8yS|()$A2G3L zeK$ja4Nob9 zUDRl`nL7A05oJfM-ttSrA?%+Wv`;*Z>rJK6hkw9e)jf*?Oh_T4C60}=M|{tgjvuPa z5wO4++3oQ7!?r(kx=BW*Q|eEBs^^sTS9ixV9!zT|11!-{*Kac4c>rc6j$gmb-LsY3 zhiSyndqTwfrQOOBkp$(uwJU&7e#`t6xyw$wL4@cy3w{{0@ux#z;t8J4D#F{Iy%KzCZFYOWdCwr@goEbKXha|NK(x z!$|$^B{^jhzR1G2wh%o9?!^_YOKHk6>>(j6OK`KXc+ucE@jSssfxHtg<-9Ye)wWP< zA*<5r<1t`85z|>A+_WcUCg-zUxcHH=N6RAOxawD>-0(+urt>??S9^%5R`3Rs#Ku3s zl+a)e>1!u;S=@+Mkmmh9trAq044GL(hrE zGj~);mWYCH;I+j1ZEaB?0j27wX=9%yS!=4^T3*Z5DwXM;as5i+YHD3%xYMh+_pJ6Q z9%IWunp&0(jRuwt%AlTiYvJnPg_PhzKquf2F2o6Z4J)3=j zNl>mNbPdD#+jfrpWcBvGWCe*WJ->2hLG&#XKYw(j0VSEW;p?N3Eycy$!MpAJdk>4> z7&R|Dq?Xc&bbr^cO65{8P(8|+iONlIxb27$iMt*n;t(b|YV3GQN;6Sjy6IA}P2};G z`O=>qS9XiceRM%P%<{1fG_Hr4>lgXx`}qr%G1T$)-M3}vB!wjyO4tWJF17|+#>~eh zLCgf0X^Bcj$&|2xKTCLP<(K+N#uaYJ7dG(g)W8HoVcItltB(wP{l;BwUcb8dR;r`Y zHq&uD+|zgfiA!Ko!@-{m>Sshkfr5=Mo$QYcqUu+&;|^z>mO0K-z$b>fMlf4+H?oHt zHmI`;C73as8u_-fm7wfS`qV>yzi~SU#t{$O#`hY(hhdX$F+Sj>THOdWFfiSfbee3F zkWuO)(8@{DQp}9Wo@91DgpD@E)*^dT?dD~NN9%@W45WsA1|Z#0KmoXB$oceRo0DOq z>zvLK=3~cRYP%TNy{Bbg`pmy%!Z;o(seHw9qUZ^t?!wos4QMw z^Vkb$=Dq}?pCByY8yiZiK?fun4xW7wEem1UE_D>!;B5jd z1)Y_)DOy~ZV9>bPy8mdL1fgWTQC;pq#_)g7_20(R_!sLQF-Y zTx6uhD|Kt}NjED_@tK-E0UnPICE{v6ulm)>yF5Gxr!3g~@}FsFQnaXihCecLJvYuu zami0X-f~3YVbmC02e{R+_7}A?(bur?rrO`foc2k7X8dM>Z)6cc$V5j-Zy%)**Tju( zn*Hrb1qX8}LPHZ6eiDhas$Ua>qsUb`UMM=8o`>*VzqfZY|3;Z9}-0x?J~CC4n$8#n@C9 zYT4grdPZ;s(w65XUdm6*Lr2hz1(R~zQ;V_k+h_HzsBF!40IV8KP?Z@2`-$$e*^`zu@KP;&=<$XNCOATpfse{PZ4n0R#;USLpg`oD3gfdR z?=Dczmrwry(LhAXIX5hH zPw7El4Qt-kjWt)uLIkLu5gk3AYAm?}2Y~MTdzNoVD$lIVkjT?+ySiLsrD;r|YeAgZ zqdBWt$yabS@AT&bv3hSaJ3u*{$*vj63wFf(QI%rbSRim=X`YC!P}khV`?jc}bCtQ; z@dTJPb<75AUbnfbO3FjBks^A2d+L85)lW6rRX{>&N<>Upb_|EDfLdYSswWz}Kxn4h2y&{Hp(ZkMD^ob9+=Uo^XIH@X%^v znMVD#Q*xdat*760GE#2@u>Bt5NEQ-iOCx8Rhn`Vkl-c`spC*52B3BJsXgf==fCf)cXXzrm`1BwYDR|Y~McDF3Y`5h$6 z*ehKt7!!yk(Dni0NPDR7&ofz3_wJo_;A)evcXqSW;~Ov9{sEw6VAH@C?j)Kv5X&pX z&I#jWBYbQ7`9wo8pBpIfdhs=5)*IJ3N@>7D{E-?r5x)4a64Z>BSk~zo&NIAt*76!( zLgfPstuwiE zqKLFTg@DgjQ?4JDFG<9HuWrzqW$nykmfN?xa5R7&o=d~`OVtmJf)qD)laHRE5pO!g z8hxW$CDkRi_~(Pmawm6n$M2r(*Eb72ej3S8buWg_I3u{B<@^+&Dd+^d394&af^i5q z-p{WT_1h|BHG*u6Gb^;_+@|Q_8)d2(_|L7H<^4qMo$O0st%F??c!HWwjHdF5jTG`R zU(YIdD>6ACIk0kHBXgv#!?UtY{6-9z#r4mVtJsT8W6#V?Os%+TQ~Fy68!y??E+ z7};DZpV<&4biep=`clm4N8s^@XfeaC0bpx+HqxZMZAas#SK4Ek57WEI1XgbsQ>H@^ z9sc~0P3QZ`PdpHj@kgU2vR`f}R&&|u=)TlEtDa0uf@E_219&C*#&&#$ardgA z(X3!Sf7T4Tn^^MJ#rkU&?W9i6@oAM)^g_0l?!f5U7NK3cV_7EWLiOSUI|%?w4vGFL zWM>t?oUxZ%=*Bcn5!Iq%!A&1U+_+Uq{Yqd*<(H=3;3IIpjIq!cO2AG}us9rTRkL4X z9D1;NDiDhw@&%|%^=dPMSQmt{d~S25-R-%X)Y$fT&{3t%Nn2%Q#LwMN%A++GEL--6~Z0IJGbmpoo`#MAIu&GwGe>E(cbD9VB#nD zFz-L88*Vt~K@6VD0wnpR2g#-oBdNc}(V{&Gm6GRue^TJ@{H8EL*ZUGI{hoz5yO`t! zdMM&M4B7kmZRP^F3TU9CFME5+hfebq*>KzJ6cJ8@nNBJZm_y-*Z(kdGSQ*Irw?56e ze7I>?0kfR?sG6VLw<8&nJwQ`Q zKQ(f}->;ApPOn)Beb}0W11aM1(G;C6p&)%H$ZwCirzT4vHY-ly!WDAEQG-C|TJ4Uv za>+3#I7n6eTUkoT56oRiEDy}yPPUF9>)z+;MpX#U2z}nFYoI*gXE(dW{{f1sxV9E; zaW5qvKEQ5ig63sR-g{#|9>yOU*dV^HJ5y2Le)ci5KX8Nr)9irHGfI9r-D5y#-%nXS zFCRV_=@5VOLv>ch&&uY;o@`v-)rOC~e18$qexA*eqi(k zL2`r2RY^tVGTmGpnRgY6P`Tsd_Oy;DbCAnZy5$B5nOXU#C3xfD8+gDc7n* zFq(G7Xh;00R!QBv$XXk;p^<^M`>{`+9>WPHgZhjlZ#fdx7x?)rAPi^Hms)IJ*FR5f z%EcA+C5RZye5PZK>LJ(Cx23MA7pq8U(JImQDYGYHLO_0dX=XTZ?OCW|4-v7GNHH>P zo%o_Wn679l?nbI+UeytwuTIIdZ@tBH@C%dhxpGu7YZh!wSWGW2t+gA& zAsgzjRrldWn(ET-W`Z_@^fm7xZ^*j~ubIb#j#mJV(LN3o3_8krlW_5Vet8-f6A*Ur zPAz0(xZKR6PO9v@YtjGHhu&-Sr1U!v7J|YZ9v#t@GB$YU-Zl(Hz9^~tcA+xu11i&|Jp0pT zNvxvgWk5lo8MRNmo7SYv?Ms#6w{*^Kd*|~~R*-975e0SP$eEFPC z?(mV(XM^;N{C^>}62^5FNRf`?j?7U;wav&U^gKe(s$?zWJ%dAB)Q`EV8B~$0=lL5( z=F-PHWMV!N*N?;9ZWK@(92z_9db+%@E$#mREoL;7XujJU-y;Ey(dsU&fmc6=EA?l{{coNNhkmS diff --git a/Projects/AVRISP_Programmer/Descriptors.c b/Projects/AVRISP_Programmer/Descriptors.c deleted file mode 100644 index 5f3ffca08a..0000000000 --- a/Projects/AVRISP_Programmer/Descriptors.c +++ /dev/null @@ -1,263 +0,0 @@ -/* - 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 - * - * 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 - * the device's capabilities and functions. - */ - -#include "Descriptors.h" - -/** Device descriptor structure. This descriptor, located in FLASH memory, describes the overall - * 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 - * process begins. - */ -USB_Descriptor_Device_t PROGMEM DeviceDescriptor = -{ - Header: {Size: sizeof(USB_Descriptor_Device_t), Type: DTYPE_Device}, - - USBSpecification: VERSION_BCD(01.10), - Class: 0x02, - SubClass: 0x00, - Protocol: 0x00, - - Endpoint0Size: 8, - - VendorID: 0x03EB, - ProductID: 0x204F, - ReleaseNumber: 0x0000, - - ManufacturerStrIndex: 0x01, - ProductStrIndex: 0x02, - SerialNumStrIndex: NO_DESCRIPTOR, - - NumberOfConfigurations: 1 -}; - -/** 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 - * 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. - */ -USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor = -{ - Config: - { - Header: {Size: sizeof(USB_Descriptor_Configuration_Header_t), Type: DTYPE_Configuration}, - - TotalConfigurationSize: sizeof(USB_Descriptor_Configuration_t), - TotalInterfaces: 2, - - ConfigurationNumber: 1, - ConfigurationStrIndex: NO_DESCRIPTOR, - - ConfigAttributes: (USB_CONFIG_ATTR_BUSPOWERED | USB_CONFIG_ATTR_SELFPOWERED), - - MaxPowerConsumption: USB_CONFIG_POWER_MA(100) - }, - - CCI_Interface: - { - Header: {Size: sizeof(USB_Descriptor_Interface_t), Type: DTYPE_Interface}, - - InterfaceNumber: 0, - AlternateSetting: 0, - - TotalEndpoints: 1, - - Class: 0x02, - SubClass: 0x02, - Protocol: 0x01, - - InterfaceStrIndex: NO_DESCRIPTOR - }, - - CDC_Functional_IntHeader: - { - Header: {Size: sizeof(CDC_FUNCTIONAL_DESCRIPTOR(2)), Type: 0x24}, - SubType: 0x00, - - Data: {0x01, 0x10} - }, - - CDC_Functional_CallManagement: - { - Header: {Size: sizeof(CDC_FUNCTIONAL_DESCRIPTOR(2)), Type: 0x24}, - SubType: 0x01, - - Data: {0x03, 0x01} - }, - - CDC_Functional_AbstractControlManagement: - { - Header: {Size: sizeof(CDC_FUNCTIONAL_DESCRIPTOR(1)), Type: 0x24}, - SubType: 0x02, - - Data: {0x06} - }, - - CDC_Functional_Union: - { - Header: {Size: sizeof(CDC_FUNCTIONAL_DESCRIPTOR(2)), Type: 0x24}, - SubType: 0x06, - - Data: {0x00, 0x01} - }, - - ManagementEndpoint: - { - Header: {Size: sizeof(USB_Descriptor_Endpoint_t), Type: DTYPE_Endpoint}, - - EndpointAddress: (ENDPOINT_DESCRIPTOR_DIR_IN | CDC_NOTIFICATION_EPNUM), - Attributes: EP_TYPE_INTERRUPT, - EndpointSize: CDC_NOTIFICATION_EPSIZE, - PollingIntervalMS: 0xFF - }, - - DCI_Interface: - { - Header: {Size: sizeof(USB_Descriptor_Interface_t), Type: DTYPE_Interface}, - - InterfaceNumber: 1, - AlternateSetting: 0, - - TotalEndpoints: 2, - - Class: 0x0A, - SubClass: 0x00, - Protocol: 0x00, - - InterfaceStrIndex: NO_DESCRIPTOR - }, - - DataOutEndpoint: - { - Header: {Size: sizeof(USB_Descriptor_Endpoint_t), Type: DTYPE_Endpoint}, - - EndpointAddress: (ENDPOINT_DESCRIPTOR_DIR_OUT | CDC_RX_EPNUM), - Attributes: EP_TYPE_BULK, - EndpointSize: CDC_TXRX_EPSIZE, - PollingIntervalMS: 0x00 - }, - - DataInEndpoint: - { - Header: {Size: sizeof(USB_Descriptor_Endpoint_t), Type: DTYPE_Endpoint}, - - EndpointAddress: (ENDPOINT_DESCRIPTOR_DIR_IN | CDC_TX_EPNUM), - Attributes: EP_TYPE_BULK, - EndpointSize: CDC_TXRX_EPSIZE, - PollingIntervalMS: 0x00 - } -}; - -/** 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 - * via the language ID table available at USB.org what languages the device supports for its string descriptors. - */ -USB_Descriptor_String_t PROGMEM LanguageString = -{ - Header: {Size: USB_STRING_LEN(1), Type: DTYPE_String}, - - UnicodeString: {LANGUAGE_ID_ENG} -}; - -/** 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 - * Descriptor. - */ -USB_Descriptor_String_t PROGMEM ManufacturerString = -{ - Header: {Size: USB_STRING_LEN(19), Type: DTYPE_String}, - - UnicodeString: L"www.AVRopendous.org" -}; - -/** 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 - * Descriptor. - */ -USB_Descriptor_String_t PROGMEM ProductString = -{ - Header: {Size: USB_STRING_LEN(29), Type: DTYPE_String}, - - UnicodeString: L"LUFA-Based AVR ISP Programmer" -}; - -/** This function is called by the library when in device mode, and must be overridden (see StdDescriptors.h - * 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 recieves 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 - * USB host. - */ -uint16_t USB_GetDescriptor(const uint16_t wValue, const uint8_t wIndex, void** const DescriptorAddress) -{ - const uint8_t DescriptorType = (wValue >> 8); - const uint8_t DescriptorNumber = (wValue & 0xFF); - - void* Address = NULL; - uint16_t Size = NO_DESCRIPTOR; - - switch (DescriptorType) - { - case DTYPE_Device: - Address = DESCRIPTOR_ADDRESS(DeviceDescriptor); - Size = sizeof(USB_Descriptor_Device_t); - break; - case DTYPE_Configuration: - Address = DESCRIPTOR_ADDRESS(ConfigurationDescriptor); - Size = sizeof(USB_Descriptor_Configuration_t); - break; - case DTYPE_String: - switch (DescriptorNumber) - { - case 0x00: - Address = DESCRIPTOR_ADDRESS(LanguageString); - Size = pgm_read_byte(&LanguageString.Header.Size); - break; - case 0x01: - Address = DESCRIPTOR_ADDRESS(ManufacturerString); - Size = pgm_read_byte(&ManufacturerString.Header.Size); - break; - case 0x02: - Address = DESCRIPTOR_ADDRESS(ProductString); - Size = pgm_read_byte(&ProductString.Header.Size); - break; - } - - break; - } - - *DescriptorAddress = Address; - return Size; -} diff --git a/Projects/AVRISP_Programmer/Descriptors.h b/Projects/AVRISP_Programmer/Descriptors.h deleted file mode 100644 index bec5e40d4a..0000000000 --- a/Projects/AVRISP_Programmer/Descriptors.h +++ /dev/null @@ -1,98 +0,0 @@ -/* - 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 - * - * Header file for Descriptors.c. - */ - -#ifndef _DESCRIPTORS_H_ -#define _DESCRIPTORS_H_ - - /* Includes: */ - #include - - #include - - /* Macros: */ - /** Macro to define a CDC class-specific functional descriptor. CDC functional descriptors have a - * uniform structure but variable sized data payloads, thus cannot be represented accurately by - * a single typedef struct. A macro is used instead so that functional descriptors can be created - * easily by specifying the size of the payload. This allows sizeof() to work correctly. - * - * \param DataSize Size in bytes of the CDC functional descriptor's data payload - */ - #define CDC_FUNCTIONAL_DESCRIPTOR(DataSize) \ - struct \ - { \ - USB_Descriptor_Header_t Header; \ - uint8_t SubType; \ - uint8_t Data[DataSize]; \ - } - - /** Endpoint number of the CDC device-to-host notification IN endpoint. */ - #define CDC_NOTIFICATION_EPNUM 2 - - /** Endpoint number of the CDC device-to-host data IN endpoint. */ - #define CDC_TX_EPNUM 3 - - /** Endpoint number of the CDC host-to-device data OUT endpoint. */ - #define CDC_RX_EPNUM 4 - - /** Size in bytes of the CDC device-to-host notification IN endpoint. */ - #define CDC_NOTIFICATION_EPSIZE 8 - - /** Size in bytes of the CDC data IN and OUT endpoints. */ - #define CDC_TXRX_EPSIZE 16 - - /* Type Defines: */ - /** 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 - * vary between devices, and which describe the device's usage to the host. - */ - typedef struct - { - USB_Descriptor_Configuration_Header_t Config; - USB_Descriptor_Interface_t CCI_Interface; - CDC_FUNCTIONAL_DESCRIPTOR(2) CDC_Functional_IntHeader; - CDC_FUNCTIONAL_DESCRIPTOR(2) CDC_Functional_CallManagement; - CDC_FUNCTIONAL_DESCRIPTOR(1) CDC_Functional_AbstractControlManagement; - CDC_FUNCTIONAL_DESCRIPTOR(2) CDC_Functional_Union; - USB_Descriptor_Endpoint_t ManagementEndpoint; - USB_Descriptor_Interface_t DCI_Interface; - USB_Descriptor_Endpoint_t DataOutEndpoint; - USB_Descriptor_Endpoint_t DataInEndpoint; - } USB_Descriptor_Configuration_t; - - /* Function Prototypes: */ - uint16_t USB_GetDescriptor(const uint16_t wValue, const uint8_t wIndex, void** const DescriptorAddress) - ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(3); - -#endif diff --git a/Projects/AVRISP_Programmer/Doxygen.conf b/Projects/AVRISP_Programmer/Doxygen.conf deleted file mode 100644 index 1eb8c5432e..0000000000 --- a/Projects/AVRISP_Programmer/Doxygen.conf +++ /dev/null @@ -1,1485 +0,0 @@ -# Doxyfile 1.5.7.1 - -# This file describes the settings to be used by the documentation system -# doxygen (www.doxygen.org) for a project -# -# All text after a hash (#) is considered a comment and will be ignored -# The format is: -# TAG = value [value, ...] -# For lists items can also be appended using: -# TAG += value [value, ...] -# Values that contain spaces should be placed between quotes (" ") - -#--------------------------------------------------------------------------- -# Project related configuration options -#--------------------------------------------------------------------------- - -# This tag specifies the encoding used for all characters in the config file -# that follow. The default is UTF-8 which is also the encoding used for all -# text before the first occurrence of this tag. Doxygen uses libiconv (or the -# iconv built into libc) for the transcoding. See -# http://www.gnu.org/software/libiconv for the list of possible encodings. - -DOXYFILE_ENCODING = UTF-8 - -# The PROJECT_NAME tag is a single word (or a sequence of words surrounded -# by quotes) that should identify the project. - -PROJECT_NAME = "LUFA Library - USB to Serial Device Demo" - -# The PROJECT_NUMBER tag can be used to enter a project or revision number. -# This could be handy for archiving the generated documentation or -# if some version control system is used. - -PROJECT_NUMBER = 0.0.0 - -# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) -# base path where the generated documentation will be put. -# If a relative path is entered, it will be relative to the location -# where doxygen was started. If left blank the current directory will be used. - -OUTPUT_DIRECTORY = ./Documentation/ - -# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create -# 4096 sub-directories (in 2 levels) under the output directory of each output -# format and will distribute the generated files over these directories. -# Enabling this option can be useful when feeding doxygen a huge amount of -# source files, where putting all generated files in the same directory would -# otherwise cause performance problems for the file system. - -CREATE_SUBDIRS = YES - -# The OUTPUT_LANGUAGE tag is used to specify the language in which all -# documentation generated by doxygen is written. Doxygen will use this -# information to generate all constant output in the proper language. -# The default language is English, other supported languages are: -# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, -# Croatian, Czech, Danish, Dutch, Farsi, Finnish, French, German, Greek, -# Hungarian, Italian, Japanese, Japanese-en (Japanese with English messages), -# Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, Polish, -# Portuguese, Romanian, Russian, Serbian, Serbian-Cyrilic, Slovak, Slovene, -# Spanish, Swedish, and Ukrainian. - -OUTPUT_LANGUAGE = English - -# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will -# include brief member descriptions after the members that are listed in -# the file and class documentation (similar to JavaDoc). -# Set to NO to disable this. - -BRIEF_MEMBER_DESC = YES - -# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend -# the brief description of a member or function before the detailed description. -# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the -# brief descriptions will be completely suppressed. - -REPEAT_BRIEF = YES - -# This tag implements a quasi-intelligent brief description abbreviator -# that is used to form the text in various listings. Each string -# in this list, if found as the leading text of the brief description, will be -# stripped from the text and the result after processing the whole list, is -# used as the annotated text. Otherwise, the brief description is used as-is. -# If left blank, the following values are used ("$name" is automatically -# replaced with the name of the entity): "The $name class" "The $name widget" -# "The $name file" "is" "provides" "specifies" "contains" -# "represents" "a" "an" "the" - -ABBREVIATE_BRIEF = "The $name class" \ - "The $name widget" \ - "The $name file" \ - is \ - provides \ - specifies \ - contains \ - represents \ - a \ - an \ - the - -# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then -# Doxygen will generate a detailed section even if there is only a brief -# description. - -ALWAYS_DETAILED_SEC = NO - -# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all -# inherited members of a class in the documentation of that class as if those -# members were ordinary class members. Constructors, destructors and assignment -# operators of the base classes will not be shown. - -INLINE_INHERITED_MEMB = NO - -# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full -# path before files name in the file list and in the header files. If set -# to NO the shortest path that makes the file name unique will be used. - -FULL_PATH_NAMES = YES - -# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag -# can be used to strip a user-defined part of the path. Stripping is -# only done if one of the specified strings matches the left-hand part of -# the path. The tag can be used to show relative paths in the file list. -# If left blank the directory from which doxygen is run is used as the -# path to strip. - -STRIP_FROM_PATH = - -# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of -# the path mentioned in the documentation of a class, which tells -# the reader which header file to include in order to use a class. -# If left blank only the name of the header file containing the class -# definition is used. Otherwise one should specify the include paths that -# are normally passed to the compiler using the -I flag. - -STRIP_FROM_INC_PATH = - -# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter -# (but less readable) file names. This can be useful is your file systems -# doesn't support long names like on DOS, Mac, or CD-ROM. - -SHORT_NAMES = YES - -# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen -# will interpret the first line (until the first dot) of a JavaDoc-style -# comment as the brief description. If set to NO, the JavaDoc -# comments will behave just like regular Qt-style comments -# (thus requiring an explicit @brief command for a brief description.) - -JAVADOC_AUTOBRIEF = NO - -# If the QT_AUTOBRIEF tag is set to YES then Doxygen will -# interpret the first line (until the first dot) of a Qt-style -# comment as the brief description. If set to NO, the comments -# will behave just like regular Qt-style comments (thus requiring -# an explicit \brief command for a brief description.) - -QT_AUTOBRIEF = NO - -# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen -# treat a multi-line C++ special comment block (i.e. a block of //! or /// -# comments) as a brief description. This used to be the default behaviour. -# The new default is to treat a multi-line C++ comment block as a detailed -# description. Set this tag to YES if you prefer the old behaviour instead. - -MULTILINE_CPP_IS_BRIEF = NO - -# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented -# member inherits the documentation from any documented member that it -# re-implements. - -INHERIT_DOCS = YES - -# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce -# a new page for each member. If set to NO, the documentation of a member will -# be part of the file/class/namespace that contains it. - -SEPARATE_MEMBER_PAGES = NO - -# The TAB_SIZE tag can be used to set the number of spaces in a tab. -# Doxygen uses this value to replace tabs by spaces in code fragments. - -TAB_SIZE = 4 - -# This tag can be used to specify a number of aliases that acts -# as commands in the documentation. An alias has the form "name=value". -# For example adding "sideeffect=\par Side Effects:\n" will allow you to -# put the command \sideeffect (or @sideeffect) in the documentation, which -# will result in a user-defined paragraph with heading "Side Effects:". -# You can put \n's in the value part of an alias to insert newlines. - -ALIASES = - -# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C -# sources only. Doxygen will then generate output that is more tailored for C. -# For instance, some of the names that are used will be different. The list -# of all members will be omitted, etc. - -OPTIMIZE_OUTPUT_FOR_C = YES - -# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java -# sources only. Doxygen will then generate output that is more tailored for -# Java. For instance, namespaces will be presented as packages, qualified -# scopes will look different, etc. - -OPTIMIZE_OUTPUT_JAVA = NO - -# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran -# sources only. Doxygen will then generate output that is more tailored for -# Fortran. - -OPTIMIZE_FOR_FORTRAN = NO - -# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL -# sources. Doxygen will then generate output that is tailored for -# VHDL. - -OPTIMIZE_OUTPUT_VHDL = NO - -# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want -# to include (a tag file for) the STL sources as input, then you should -# set this tag to YES in order to let doxygen match functions declarations and -# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. -# func(std::string) {}). This also make the inheritance and collaboration -# diagrams that involve STL classes more complete and accurate. - -BUILTIN_STL_SUPPORT = NO - -# If you use Microsoft's C++/CLI language, you should set this option to YES to -# enable parsing support. - -CPP_CLI_SUPPORT = NO - -# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. -# Doxygen will parse them like normal C++ but will assume all classes use public -# instead of private inheritance when no explicit protection keyword is present. - -SIP_SUPPORT = NO - -# For Microsoft's IDL there are propget and propput attributes to indicate getter -# and setter methods for a property. Setting this option to YES (the default) -# will make doxygen to replace the get and set methods by a property in the -# documentation. This will only work if the methods are indeed getting or -# setting a simple type. If this is not the case, or you want to show the -# methods anyway, you should set this option to NO. - -IDL_PROPERTY_SUPPORT = YES - -# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC -# tag is set to YES, then doxygen will reuse the documentation of the first -# member in the group (if any) for the other members of the group. By default -# all members of a group must be documented explicitly. - -DISTRIBUTE_GROUP_DOC = NO - -# Set the SUBGROUPING tag to YES (the default) to allow class member groups of -# the same type (for instance a group of public functions) to be put as a -# subgroup of that type (e.g. under the Public Functions section). Set it to -# NO to prevent subgrouping. Alternatively, this can be done per class using -# the \nosubgrouping command. - -SUBGROUPING = YES - -# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum -# is documented as struct, union, or enum with the name of the typedef. So -# typedef struct TypeS {} TypeT, will appear in the documentation as a struct -# with name TypeT. When disabled the typedef will appear as a member of a file, -# namespace, or class. And the struct will be named TypeS. This can typically -# be useful for C code in case the coding convention dictates that all compound -# types are typedef'ed and only the typedef is referenced, never the tag name. - -TYPEDEF_HIDES_STRUCT = NO - -# The SYMBOL_CACHE_SIZE determines the size of the internal cache use to -# determine which symbols to keep in memory and which to flush to disk. -# When the cache is full, less often used symbols will be written to disk. -# For small to medium size projects (<1000 input files) the default value is -# probably good enough. For larger projects a too small cache size can cause -# doxygen to be busy swapping symbols to and from disk most of the time -# causing a significant performance penality. -# If the system has enough physical memory increasing the cache will improve the -# performance by keeping more symbols in memory. Note that the value works on -# a logarithmic scale so increasing the size by one will rougly double the -# memory usage. The cache size is given by this formula: -# 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0, -# corresponding to a cache size of 2^16 = 65536 symbols - -SYMBOL_CACHE_SIZE = 0 - -#--------------------------------------------------------------------------- -# Build related configuration options -#--------------------------------------------------------------------------- - -# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in -# documentation are documented, even if no documentation was available. -# Private class members and static file members will be hidden unless -# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES - -EXTRACT_ALL = YES - -# If the EXTRACT_PRIVATE tag is set to YES all private members of a class -# will be included in the documentation. - -EXTRACT_PRIVATE = YES - -# If the EXTRACT_STATIC tag is set to YES all static members of a file -# will be included in the documentation. - -EXTRACT_STATIC = YES - -# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) -# defined locally in source files will be included in the documentation. -# If set to NO only classes defined in header files are included. - -EXTRACT_LOCAL_CLASSES = YES - -# This flag is only useful for Objective-C code. When set to YES local -# methods, which are defined in the implementation section but not in -# the interface are included in the documentation. -# If set to NO (the default) only methods in the interface are included. - -EXTRACT_LOCAL_METHODS = NO - -# If this flag is set to YES, the members of anonymous namespaces will be -# extracted and appear in the documentation as a namespace called -# 'anonymous_namespace{file}', where file will be replaced with the base -# name of the file that contains the anonymous namespace. By default -# anonymous namespace are hidden. - -EXTRACT_ANON_NSPACES = NO - -# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all -# undocumented members of documented classes, files or namespaces. -# If set to NO (the default) these members will be included in the -# various overviews, but no documentation section is generated. -# This option has no effect if EXTRACT_ALL is enabled. - -HIDE_UNDOC_MEMBERS = NO - -# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all -# undocumented classes that are normally visible in the class hierarchy. -# If set to NO (the default) these classes will be included in the various -# overviews. This option has no effect if EXTRACT_ALL is enabled. - -HIDE_UNDOC_CLASSES = NO - -# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all -# friend (class|struct|union) declarations. -# If set to NO (the default) these declarations will be included in the -# documentation. - -HIDE_FRIEND_COMPOUNDS = NO - -# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any -# documentation blocks found inside the body of a function. -# If set to NO (the default) these blocks will be appended to the -# function's detailed documentation block. - -HIDE_IN_BODY_DOCS = NO - -# The INTERNAL_DOCS tag determines if documentation -# that is typed after a \internal command is included. If the tag is set -# to NO (the default) then the documentation will be excluded. -# Set it to YES to include the internal documentation. - -INTERNAL_DOCS = NO - -# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate -# file names in lower-case letters. If set to YES upper-case letters are also -# allowed. This is useful if you have classes or files whose names only differ -# in case and if your file system supports case sensitive file names. Windows -# and Mac users are advised to set this option to NO. - -CASE_SENSE_NAMES = NO - -# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen -# will show members with their full class and namespace scopes in the -# documentation. If set to YES the scope will be hidden. - -HIDE_SCOPE_NAMES = NO - -# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen -# will put a list of the files that are included by a file in the documentation -# of that file. - -SHOW_INCLUDE_FILES = YES - -# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] -# is inserted in the documentation for inline members. - -INLINE_INFO = YES - -# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen -# will sort the (detailed) documentation of file and class members -# alphabetically by member name. If set to NO the members will appear in -# declaration order. - -SORT_MEMBER_DOCS = YES - -# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the -# brief documentation of file, namespace and class members alphabetically -# by member name. If set to NO (the default) the members will appear in -# declaration order. - -SORT_BRIEF_DOCS = NO - -# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the -# hierarchy of group names into alphabetical order. If set to NO (the default) -# the group names will appear in their defined order. - -SORT_GROUP_NAMES = NO - -# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be -# sorted by fully-qualified names, including namespaces. If set to -# NO (the default), the class list will be sorted only by class name, -# not including the namespace part. -# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. -# Note: This option applies only to the class list, not to the -# alphabetical list. - -SORT_BY_SCOPE_NAME = NO - -# The GENERATE_TODOLIST tag can be used to enable (YES) or -# disable (NO) the todo list. This list is created by putting \todo -# commands in the documentation. - -GENERATE_TODOLIST = NO - -# The GENERATE_TESTLIST tag can be used to enable (YES) or -# disable (NO) the test list. This list is created by putting \test -# commands in the documentation. - -GENERATE_TESTLIST = NO - -# The GENERATE_BUGLIST tag can be used to enable (YES) or -# disable (NO) the bug list. This list is created by putting \bug -# commands in the documentation. - -GENERATE_BUGLIST = NO - -# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or -# disable (NO) the deprecated list. This list is created by putting -# \deprecated commands in the documentation. - -GENERATE_DEPRECATEDLIST= YES - -# The ENABLED_SECTIONS tag can be used to enable conditional -# documentation sections, marked by \if sectionname ... \endif. - -ENABLED_SECTIONS = - -# The MAX_INITIALIZER_LINES tag determines the maximum number of lines -# the initial value of a variable or define consists of for it to appear in -# the documentation. If the initializer consists of more lines than specified -# here it will be hidden. Use a value of 0 to hide initializers completely. -# The appearance of the initializer of individual variables and defines in the -# documentation can be controlled using \showinitializer or \hideinitializer -# command in the documentation regardless of this setting. - -MAX_INITIALIZER_LINES = 30 - -# Set the SHOW_USED_FILES tag to NO to disable the list of files generated -# at the bottom of the documentation of classes and structs. If set to YES the -# list will mention the files that were used to generate the documentation. - -SHOW_USED_FILES = YES - -# If the sources in your project are distributed over multiple directories -# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy -# in the documentation. The default is NO. - -SHOW_DIRECTORIES = YES - -# Set the SHOW_FILES tag to NO to disable the generation of the Files page. -# This will remove the Files entry from the Quick Index and from the -# Folder Tree View (if specified). The default is YES. - -SHOW_FILES = YES - -# Set the SHOW_NAMESPACES tag to NO to disable the generation of the -# Namespaces page. This will remove the Namespaces entry from the Quick Index -# and from the Folder Tree View (if specified). The default is YES. - -SHOW_NAMESPACES = YES - -# The FILE_VERSION_FILTER tag can be used to specify a program or script that -# doxygen should invoke to get the current version for each file (typically from -# the version control system). Doxygen will invoke the program by executing (via -# popen()) the command , where is the value of -# the FILE_VERSION_FILTER tag, and is the name of an input file -# provided by doxygen. Whatever the program writes to standard output -# is used as the file version. See the manual for examples. - -FILE_VERSION_FILTER = - -# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed by -# doxygen. The layout file controls the global structure of the generated output files -# in an output format independent way. The create the layout file that represents -# doxygen's defaults, run doxygen with the -l option. You can optionally specify a -# file name after the option, if omitted DoxygenLayout.xml will be used as the name -# of the layout file. - -LAYOUT_FILE = - -#--------------------------------------------------------------------------- -# configuration options related to warning and progress messages -#--------------------------------------------------------------------------- - -# The QUIET tag can be used to turn on/off the messages that are generated -# by doxygen. Possible values are YES and NO. If left blank NO is used. - -QUIET = YES - -# The WARNINGS tag can be used to turn on/off the warning messages that are -# generated by doxygen. Possible values are YES and NO. If left blank -# NO is used. - -WARNINGS = YES - -# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings -# for undocumented members. If EXTRACT_ALL is set to YES then this flag will -# automatically be disabled. - -WARN_IF_UNDOCUMENTED = YES - -# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for -# potential errors in the documentation, such as not documenting some -# parameters in a documented function, or documenting parameters that -# don't exist or using markup commands wrongly. - -WARN_IF_DOC_ERROR = YES - -# This WARN_NO_PARAMDOC option can be abled to get warnings for -# functions that are documented, but have no documentation for their parameters -# or return value. If set to NO (the default) doxygen will only warn about -# wrong or incomplete parameter documentation, but not about the absence of -# documentation. - -WARN_NO_PARAMDOC = YES - -# The WARN_FORMAT tag determines the format of the warning messages that -# doxygen can produce. The string should contain the $file, $line, and $text -# tags, which will be replaced by the file and line number from which the -# warning originated and the warning text. Optionally the format may contain -# $version, which will be replaced by the version of the file (if it could -# be obtained via FILE_VERSION_FILTER) - -WARN_FORMAT = "$file:$line: $text" - -# The WARN_LOGFILE tag can be used to specify a file to which warning -# and error messages should be written. If left blank the output is written -# to stderr. - -WARN_LOGFILE = - -#--------------------------------------------------------------------------- -# configuration options related to the input files -#--------------------------------------------------------------------------- - -# The INPUT tag can be used to specify the files and/or directories that contain -# documented source files. You may enter file names like "myfile.cpp" or -# directories like "/usr/src/myproject". Separate the files or directories -# with spaces. - -INPUT = ./ - -# This tag can be used to specify the character encoding of the source files -# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is -# also the default input encoding. Doxygen uses libiconv (or the iconv built -# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for -# the list of possible encodings. - -INPUT_ENCODING = UTF-8 - -# If the value of the INPUT tag contains directories, you can use the -# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp -# and *.h) to filter out the source-files in the directories. If left -# blank the following patterns are tested: -# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx -# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py *.f90 - -FILE_PATTERNS = *.h \ - *.c \ - *.txt - -# The RECURSIVE tag can be used to turn specify whether or not subdirectories -# should be searched for input files as well. Possible values are YES and NO. -# If left blank NO is used. - -RECURSIVE = YES - -# The EXCLUDE tag can be used to specify files and/or directories that should -# excluded from the INPUT source files. This way you can easily exclude a -# subdirectory from a directory tree whose root is specified with the INPUT tag. - -EXCLUDE = - -# The EXCLUDE_SYMLINKS tag can be used select whether or not files or -# directories that are symbolic links (a Unix filesystem feature) are excluded -# from the input. - -EXCLUDE_SYMLINKS = NO - -# If the value of the INPUT tag contains directories, you can use the -# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude -# certain files from those directories. Note that the wildcards are matched -# against the file with absolute path, so to exclude all test directories -# for example use the pattern */test/* - -EXCLUDE_PATTERNS = */LowLevel/USBMode.h - -# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names -# (namespaces, classes, functions, etc.) that should be excluded from the -# output. The symbol name can be a fully qualified name, a word, or if the -# wildcard * is used, a substring. Examples: ANamespace, AClass, -# AClass::ANamespace, ANamespace::*Test - -EXCLUDE_SYMBOLS = __* - -# The EXAMPLE_PATH tag can be used to specify one or more files or -# directories that contain example code fragments that are included (see -# the \include command). - -EXAMPLE_PATH = - -# If the value of the EXAMPLE_PATH tag contains directories, you can use the -# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp -# and *.h) to filter out the source-files in the directories. If left -# blank all files are included. - -EXAMPLE_PATTERNS = * - -# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be -# searched for input files to be used with the \include or \dontinclude -# commands irrespective of the value of the RECURSIVE tag. -# Possible values are YES and NO. If left blank NO is used. - -EXAMPLE_RECURSIVE = NO - -# The IMAGE_PATH tag can be used to specify one or more files or -# directories that contain image that are included in the documentation (see -# the \image command). - -IMAGE_PATH = - -# The INPUT_FILTER tag can be used to specify a program that doxygen should -# invoke to filter for each input file. Doxygen will invoke the filter program -# by executing (via popen()) the command , where -# is the value of the INPUT_FILTER tag, and is the name of an -# input file. Doxygen will then use the output that the filter program writes -# to standard output. If FILTER_PATTERNS is specified, this tag will be -# ignored. - -INPUT_FILTER = - -# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern -# basis. Doxygen will compare the file name with each pattern and apply the -# filter if there is a match. The filters are a list of the form: -# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further -# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER -# is applied to all files. - -FILTER_PATTERNS = - -# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using -# INPUT_FILTER) will be used to filter the input files when producing source -# files to browse (i.e. when SOURCE_BROWSER is set to YES). - -FILTER_SOURCE_FILES = NO - -#--------------------------------------------------------------------------- -# configuration options related to source browsing -#--------------------------------------------------------------------------- - -# If the SOURCE_BROWSER tag is set to YES then a list of source files will -# be generated. Documented entities will be cross-referenced with these sources. -# Note: To get rid of all source code in the generated output, make sure also -# VERBATIM_HEADERS is set to NO. - -SOURCE_BROWSER = NO - -# Setting the INLINE_SOURCES tag to YES will include the body -# of functions and classes directly in the documentation. - -INLINE_SOURCES = NO - -# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct -# doxygen to hide any special comment blocks from generated source code -# fragments. Normal C and C++ comments will always remain visible. - -STRIP_CODE_COMMENTS = YES - -# If the REFERENCED_BY_RELATION tag is set to YES -# then for each documented function all documented -# functions referencing it will be listed. - -REFERENCED_BY_RELATION = NO - -# If the REFERENCES_RELATION tag is set to YES -# then for each documented function all documented entities -# called/used by that function will be listed. - -REFERENCES_RELATION = NO - -# If the REFERENCES_LINK_SOURCE tag is set to YES (the default) -# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from -# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will -# link to the source code. Otherwise they will link to the documentstion. - -REFERENCES_LINK_SOURCE = NO - -# If the USE_HTAGS tag is set to YES then the references to source code -# will point to the HTML generated by the htags(1) tool instead of doxygen -# built-in source browser. The htags tool is part of GNU's global source -# tagging system (see http://www.gnu.org/software/global/global.html). You -# will need version 4.8.6 or higher. - -USE_HTAGS = NO - -# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen -# will generate a verbatim copy of the header file for each class for -# which an include is specified. Set to NO to disable this. - -VERBATIM_HEADERS = NO - -#--------------------------------------------------------------------------- -# configuration options related to the alphabetical class index -#--------------------------------------------------------------------------- - -# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index -# of all compounds will be generated. Enable this if the project -# contains a lot of classes, structs, unions or interfaces. - -ALPHABETICAL_INDEX = YES - -# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then -# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns -# in which this list will be split (can be a number in the range [1..20]) - -COLS_IN_ALPHA_INDEX = 5 - -# In case all classes in a project start with a common prefix, all -# classes will be put under the same header in the alphabetical index. -# The IGNORE_PREFIX tag can be used to specify one or more prefixes that -# should be ignored while generating the index headers. - -IGNORE_PREFIX = - -#--------------------------------------------------------------------------- -# configuration options related to the HTML output -#--------------------------------------------------------------------------- - -# If the GENERATE_HTML tag is set to YES (the default) Doxygen will -# generate HTML output. - -GENERATE_HTML = YES - -# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `html' will be used as the default path. - -HTML_OUTPUT = html - -# The HTML_FILE_EXTENSION tag can be used to specify the file extension for -# each generated HTML page (for example: .htm,.php,.asp). If it is left blank -# doxygen will generate files with .html extension. - -HTML_FILE_EXTENSION = .html - -# The HTML_HEADER tag can be used to specify a personal HTML header for -# each generated HTML page. If it is left blank doxygen will generate a -# standard header. - -HTML_HEADER = - -# The HTML_FOOTER tag can be used to specify a personal HTML footer for -# each generated HTML page. If it is left blank doxygen will generate a -# standard footer. - -HTML_FOOTER = - -# The HTML_STYLESHEET tag can be used to specify a user-defined cascading -# style sheet that is used by each HTML page. It can be used to -# fine-tune the look of the HTML output. If the tag is left blank doxygen -# will generate a default style sheet. Note that doxygen will try to copy -# the style sheet file to the HTML output directory, so don't put your own -# stylesheet in the HTML output directory as well, or it will be erased! - -HTML_STYLESHEET = - -# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, -# files or namespaces will be aligned in HTML using tables. If set to -# NO a bullet list will be used. - -HTML_ALIGN_MEMBERS = YES - -# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML -# documentation will contain sections that can be hidden and shown after the -# page has loaded. For this to work a browser that supports -# JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox -# Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari). - -HTML_DYNAMIC_SECTIONS = YES - -# If the GENERATE_DOCSET tag is set to YES, additional index files -# will be generated that can be used as input for Apple's Xcode 3 -# integrated development environment, introduced with OSX 10.5 (Leopard). -# To create a documentation set, doxygen will generate a Makefile in the -# HTML output directory. Running make will produce the docset in that -# directory and running "make install" will install the docset in -# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find -# it at startup. -# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html for more information. - -GENERATE_DOCSET = NO - -# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the -# feed. A documentation feed provides an umbrella under which multiple -# documentation sets from a single provider (such as a company or product suite) -# can be grouped. - -DOCSET_FEEDNAME = "Doxygen generated docs" - -# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that -# should uniquely identify the documentation set bundle. This should be a -# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen -# will append .docset to the name. - -DOCSET_BUNDLE_ID = org.doxygen.Project - -# If the GENERATE_HTMLHELP tag is set to YES, additional index files -# will be generated that can be used as input for tools like the -# Microsoft HTML help workshop to generate a compiled HTML help file (.chm) -# of the generated HTML documentation. - -GENERATE_HTMLHELP = NO - -# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can -# be used to specify the file name of the resulting .chm file. You -# can add a path in front of the file if the result should not be -# written to the html output directory. - -CHM_FILE = - -# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can -# be used to specify the location (absolute path including file name) of -# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run -# the HTML help compiler on the generated index.hhp. - -HHC_LOCATION = - -# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag -# controls if a separate .chi index file is generated (YES) or that -# it should be included in the master .chm file (NO). - -GENERATE_CHI = NO - -# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING -# is used to encode HtmlHelp index (hhk), content (hhc) and project file -# content. - -CHM_INDEX_ENCODING = - -# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag -# controls whether a binary table of contents is generated (YES) or a -# normal table of contents (NO) in the .chm file. - -BINARY_TOC = NO - -# The TOC_EXPAND flag can be set to YES to add extra items for group members -# to the contents of the HTML help documentation and to the tree view. - -TOC_EXPAND = YES - -# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and QHP_VIRTUAL_FOLDER -# are set, an additional index file will be generated that can be used as input for -# Qt's qhelpgenerator to generate a Qt Compressed Help (.qch) of the generated -# HTML documentation. - -GENERATE_QHP = NO - -# If the QHG_LOCATION tag is specified, the QCH_FILE tag can -# be used to specify the file name of the resulting .qch file. -# The path specified is relative to the HTML output folder. - -QCH_FILE = - -# The QHP_NAMESPACE tag specifies the namespace to use when generating -# Qt Help Project output. For more information please see -# Qt Help Project / Namespace. - -QHP_NAMESPACE = org.doxygen.Project - -# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating -# Qt Help Project output. For more information please see -# Qt Help Project / Virtual Folders. - -QHP_VIRTUAL_FOLDER = doc - -# If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can -# be used to specify the location of Qt's qhelpgenerator. -# If non-empty doxygen will try to run qhelpgenerator on the generated -# .qhp file . - -QHG_LOCATION = - -# The DISABLE_INDEX tag can be used to turn on/off the condensed index at -# top of each HTML page. The value NO (the default) enables the index and -# the value YES disables it. - -DISABLE_INDEX = NO - -# This tag can be used to set the number of enum values (range [1..20]) -# that doxygen will group on one line in the generated HTML documentation. - -ENUM_VALUES_PER_LINE = 1 - -# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index -# structure should be generated to display hierarchical information. -# If the tag value is set to FRAME, a side panel will be generated -# containing a tree-like index structure (just like the one that -# is generated for HTML Help). For this to work a browser that supports -# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, -# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are -# probably better off using the HTML help feature. Other possible values -# for this tag are: HIERARCHIES, which will generate the Groups, Directories, -# and Class Hierarchy pages using a tree view instead of an ordered list; -# ALL, which combines the behavior of FRAME and HIERARCHIES; and NONE, which -# disables this behavior completely. For backwards compatibility with previous -# releases of Doxygen, the values YES and NO are equivalent to FRAME and NONE -# respectively. - -GENERATE_TREEVIEW = YES - -# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be -# used to set the initial width (in pixels) of the frame in which the tree -# is shown. - -TREEVIEW_WIDTH = 250 - -# Use this tag to change the font size of Latex formulas included -# as images in the HTML documentation. The default is 10. Note that -# when you change the font size after a successful doxygen run you need -# to manually remove any form_*.png images from the HTML output directory -# to force them to be regenerated. - -FORMULA_FONTSIZE = 10 - -#--------------------------------------------------------------------------- -# configuration options related to the LaTeX output -#--------------------------------------------------------------------------- - -# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will -# generate Latex output. - -GENERATE_LATEX = NO - -# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `latex' will be used as the default path. - -LATEX_OUTPUT = latex - -# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be -# invoked. If left blank `latex' will be used as the default command name. - -LATEX_CMD_NAME = latex - -# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to -# generate index for LaTeX. If left blank `makeindex' will be used as the -# default command name. - -MAKEINDEX_CMD_NAME = makeindex - -# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact -# LaTeX documents. This may be useful for small projects and may help to -# save some trees in general. - -COMPACT_LATEX = NO - -# The PAPER_TYPE tag can be used to set the paper type that is used -# by the printer. Possible values are: a4, a4wide, letter, legal and -# executive. If left blank a4wide will be used. - -PAPER_TYPE = a4wide - -# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX -# packages that should be included in the LaTeX output. - -EXTRA_PACKAGES = - -# The LATEX_HEADER tag can be used to specify a personal LaTeX header for -# the generated latex document. The header should contain everything until -# the first chapter. If it is left blank doxygen will generate a -# standard header. Notice: only use this tag if you know what you are doing! - -LATEX_HEADER = - -# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated -# is prepared for conversion to pdf (using ps2pdf). The pdf file will -# contain links (just like the HTML output) instead of page references -# This makes the output suitable for online browsing using a pdf viewer. - -PDF_HYPERLINKS = YES - -# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of -# plain latex in the generated Makefile. Set this option to YES to get a -# higher quality PDF documentation. - -USE_PDFLATEX = YES - -# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. -# command to the generated LaTeX files. This will instruct LaTeX to keep -# running if errors occur, instead of asking the user for help. -# This option is also used when generating formulas in HTML. - -LATEX_BATCHMODE = NO - -# If LATEX_HIDE_INDICES is set to YES then doxygen will not -# include the index chapters (such as File Index, Compound Index, etc.) -# in the output. - -LATEX_HIDE_INDICES = NO - -#--------------------------------------------------------------------------- -# configuration options related to the RTF output -#--------------------------------------------------------------------------- - -# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output -# The RTF output is optimized for Word 97 and may not look very pretty with -# other RTF readers or editors. - -GENERATE_RTF = NO - -# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `rtf' will be used as the default path. - -RTF_OUTPUT = rtf - -# If the COMPACT_RTF tag is set to YES Doxygen generates more compact -# RTF documents. This may be useful for small projects and may help to -# save some trees in general. - -COMPACT_RTF = NO - -# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated -# will contain hyperlink fields. The RTF file will -# contain links (just like the HTML output) instead of page references. -# This makes the output suitable for online browsing using WORD or other -# programs which support those fields. -# Note: wordpad (write) and others do not support links. - -RTF_HYPERLINKS = NO - -# Load stylesheet definitions from file. Syntax is similar to doxygen's -# config file, i.e. a series of assignments. You only have to provide -# replacements, missing definitions are set to their default value. - -RTF_STYLESHEET_FILE = - -# Set optional variables used in the generation of an rtf document. -# Syntax is similar to doxygen's config file. - -RTF_EXTENSIONS_FILE = - -#--------------------------------------------------------------------------- -# configuration options related to the man page output -#--------------------------------------------------------------------------- - -# If the GENERATE_MAN tag is set to YES (the default) Doxygen will -# generate man pages - -GENERATE_MAN = NO - -# The MAN_OUTPUT tag is used to specify where the man pages will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `man' will be used as the default path. - -MAN_OUTPUT = man - -# The MAN_EXTENSION tag determines the extension that is added to -# the generated man pages (default is the subroutine's section .3) - -MAN_EXTENSION = .3 - -# If the MAN_LINKS tag is set to YES and Doxygen generates man output, -# then it will generate one additional man file for each entity -# documented in the real man page(s). These additional files -# only source the real man page, but without them the man command -# would be unable to find the correct page. The default is NO. - -MAN_LINKS = NO - -#--------------------------------------------------------------------------- -# configuration options related to the XML output -#--------------------------------------------------------------------------- - -# If the GENERATE_XML tag is set to YES Doxygen will -# generate an XML file that captures the structure of -# the code including all documentation. - -GENERATE_XML = NO - -# The XML_OUTPUT tag is used to specify where the XML pages will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `xml' will be used as the default path. - -XML_OUTPUT = xml - -# The XML_SCHEMA tag can be used to specify an XML schema, -# which can be used by a validating XML parser to check the -# syntax of the XML files. - -XML_SCHEMA = - -# The XML_DTD tag can be used to specify an XML DTD, -# which can be used by a validating XML parser to check the -# syntax of the XML files. - -XML_DTD = - -# If the XML_PROGRAMLISTING tag is set to YES Doxygen will -# dump the program listings (including syntax highlighting -# and cross-referencing information) to the XML output. Note that -# enabling this will significantly increase the size of the XML output. - -XML_PROGRAMLISTING = YES - -#--------------------------------------------------------------------------- -# configuration options for the AutoGen Definitions output -#--------------------------------------------------------------------------- - -# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will -# generate an AutoGen Definitions (see autogen.sf.net) file -# that captures the structure of the code including all -# documentation. Note that this feature is still experimental -# and incomplete at the moment. - -GENERATE_AUTOGEN_DEF = NO - -#--------------------------------------------------------------------------- -# configuration options related to the Perl module output -#--------------------------------------------------------------------------- - -# If the GENERATE_PERLMOD tag is set to YES Doxygen will -# generate a Perl module file that captures the structure of -# the code including all documentation. Note that this -# feature is still experimental and incomplete at the -# moment. - -GENERATE_PERLMOD = NO - -# If the PERLMOD_LATEX tag is set to YES Doxygen will generate -# the necessary Makefile rules, Perl scripts and LaTeX code to be able -# to generate PDF and DVI output from the Perl module output. - -PERLMOD_LATEX = NO - -# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be -# nicely formatted so it can be parsed by a human reader. This is useful -# if you want to understand what is going on. On the other hand, if this -# tag is set to NO the size of the Perl module output will be much smaller -# and Perl will parse it just the same. - -PERLMOD_PRETTY = YES - -# The names of the make variables in the generated doxyrules.make file -# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. -# This is useful so different doxyrules.make files included by the same -# Makefile don't overwrite each other's variables. - -PERLMOD_MAKEVAR_PREFIX = - -#--------------------------------------------------------------------------- -# Configuration options related to the preprocessor -#--------------------------------------------------------------------------- - -# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will -# evaluate all C-preprocessor directives found in the sources and include -# files. - -ENABLE_PREPROCESSING = YES - -# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro -# names in the source code. If set to NO (the default) only conditional -# compilation will be performed. Macro expansion can be done in a controlled -# way by setting EXPAND_ONLY_PREDEF to YES. - -MACRO_EXPANSION = YES - -# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES -# then the macro expansion is limited to the macros specified with the -# PREDEFINED and EXPAND_AS_DEFINED tags. - -EXPAND_ONLY_PREDEF = YES - -# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files -# in the INCLUDE_PATH (see below) will be search if a #include is found. - -SEARCH_INCLUDES = YES - -# The INCLUDE_PATH tag can be used to specify one or more directories that -# contain include files that are not input files but should be processed by -# the preprocessor. - -INCLUDE_PATH = - -# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard -# patterns (like *.h and *.hpp) to filter out the header-files in the -# directories. If left blank, the patterns specified with FILE_PATTERNS will -# be used. - -INCLUDE_FILE_PATTERNS = - -# The PREDEFINED tag can be used to specify one or more macro names that -# are defined before the preprocessor is started (similar to the -D option of -# gcc). The argument of the tag is a list of macros of the form: name -# or name=definition (no spaces). If the definition and the = are -# omitted =1 is assumed. To prevent a macro definition from being -# undefined via #undef or recursively expanded use the := operator -# instead of the = operator. - -PREDEFINED = __DOXYGEN__ - -# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then -# this tag can be used to specify a list of macro names that should be expanded. -# The macro definition that is found in the sources will be used. -# Use the PREDEFINED tag if you want to use a different macro definition. - -EXPAND_AS_DEFINED = BUTTLOADTAG - -# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then -# doxygen's preprocessor will remove all function-like macros that are alone -# on a line, have an all uppercase name, and do not end with a semicolon. Such -# function macros are typically used for boiler-plate code, and will confuse -# the parser if not removed. - -SKIP_FUNCTION_MACROS = YES - -#--------------------------------------------------------------------------- -# Configuration::additions related to external references -#--------------------------------------------------------------------------- - -# The TAGFILES option can be used to specify one or more tagfiles. -# Optionally an initial location of the external documentation -# can be added for each tagfile. The format of a tag file without -# this location is as follows: -# TAGFILES = file1 file2 ... -# Adding location for the tag files is done as follows: -# TAGFILES = file1=loc1 "file2 = loc2" ... -# where "loc1" and "loc2" can be relative or absolute paths or -# URLs. If a location is present for each tag, the installdox tool -# does not have to be run to correct the links. -# Note that each tag file must have a unique name -# (where the name does NOT include the path) -# If a tag file is not located in the directory in which doxygen -# is run, you must also specify the path to the tagfile here. - -TAGFILES = - -# When a file name is specified after GENERATE_TAGFILE, doxygen will create -# a tag file that is based on the input files it reads. - -GENERATE_TAGFILE = - -# If the ALLEXTERNALS tag is set to YES all external classes will be listed -# in the class index. If set to NO only the inherited external classes -# will be listed. - -ALLEXTERNALS = NO - -# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed -# in the modules index. If set to NO, only the current project's groups will -# be listed. - -EXTERNAL_GROUPS = YES - -# The PERL_PATH should be the absolute path and name of the perl script -# interpreter (i.e. the result of `which perl'). - -PERL_PATH = /usr/bin/perl - -#--------------------------------------------------------------------------- -# Configuration options related to the dot tool -#--------------------------------------------------------------------------- - -# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will -# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base -# or super classes. Setting the tag to NO turns the diagrams off. Note that -# this option is superseded by the HAVE_DOT option below. This is only a -# fallback. It is recommended to install and use dot, since it yields more -# powerful graphs. - -CLASS_DIAGRAMS = NO - -# You can define message sequence charts within doxygen comments using the \msc -# command. Doxygen will then run the mscgen tool (see -# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the -# documentation. The MSCGEN_PATH tag allows you to specify the directory where -# the mscgen tool resides. If left empty the tool is assumed to be found in the -# default search path. - -MSCGEN_PATH = - -# If set to YES, the inheritance and collaboration graphs will hide -# inheritance and usage relations if the target is undocumented -# or is not a class. - -HIDE_UNDOC_RELATIONS = YES - -# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is -# available from the path. This tool is part of Graphviz, a graph visualization -# toolkit from AT&T and Lucent Bell Labs. The other options in this section -# have no effect if this option is set to NO (the default) - -HAVE_DOT = NO - -# By default doxygen will write a font called FreeSans.ttf to the output -# directory and reference it in all dot files that doxygen generates. This -# font does not include all possible unicode characters however, so when you need -# these (or just want a differently looking font) you can specify the font name -# using DOT_FONTNAME. You need need to make sure dot is able to find the font, -# which can be done by putting it in a standard location or by setting the -# DOTFONTPATH environment variable or by setting DOT_FONTPATH to the directory -# containing the font. - -DOT_FONTNAME = FreeSans - -# The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs. -# The default size is 10pt. - -DOT_FONTSIZE = 10 - -# By default doxygen will tell dot to use the output directory to look for the -# FreeSans.ttf font (which doxygen will put there itself). If you specify a -# different font using DOT_FONTNAME you can set the path where dot -# can find it using this tag. - -DOT_FONTPATH = - -# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen -# will generate a graph for each documented class showing the direct and -# indirect inheritance relations. Setting this tag to YES will force the -# the CLASS_DIAGRAMS tag to NO. - -CLASS_GRAPH = NO - -# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen -# will generate a graph for each documented class showing the direct and -# indirect implementation dependencies (inheritance, containment, and -# class references variables) of the class with other documented classes. - -COLLABORATION_GRAPH = NO - -# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen -# will generate a graph for groups, showing the direct groups dependencies - -GROUP_GRAPHS = NO - -# If the UML_LOOK tag is set to YES doxygen will generate inheritance and -# collaboration diagrams in a style similar to the OMG's Unified Modeling -# Language. - -UML_LOOK = NO - -# If set to YES, the inheritance and collaboration graphs will show the -# relations between templates and their instances. - -TEMPLATE_RELATIONS = NO - -# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT -# tags are set to YES then doxygen will generate a graph for each documented -# file showing the direct and indirect include dependencies of the file with -# other documented files. - -INCLUDE_GRAPH = NO - -# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and -# HAVE_DOT tags are set to YES then doxygen will generate a graph for each -# documented header file showing the documented files that directly or -# indirectly include this file. - -INCLUDED_BY_GRAPH = NO - -# If the CALL_GRAPH and HAVE_DOT options are set to YES then -# doxygen will generate a call dependency graph for every global function -# or class method. Note that enabling this option will significantly increase -# the time of a run. So in most cases it will be better to enable call graphs -# for selected functions only using the \callgraph command. - -CALL_GRAPH = NO - -# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then -# doxygen will generate a caller dependency graph for every global function -# or class method. Note that enabling this option will significantly increase -# the time of a run. So in most cases it will be better to enable caller -# graphs for selected functions only using the \callergraph command. - -CALLER_GRAPH = NO - -# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen -# will graphical hierarchy of all classes instead of a textual one. - -GRAPHICAL_HIERARCHY = NO - -# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES -# then doxygen will show the dependencies a directory has on other directories -# in a graphical way. The dependency relations are determined by the #include -# relations between the files in the directories. - -DIRECTORY_GRAPH = NO - -# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images -# generated by dot. Possible values are png, jpg, or gif -# If left blank png will be used. - -DOT_IMAGE_FORMAT = png - -# The tag DOT_PATH can be used to specify the path where the dot tool can be -# found. If left blank, it is assumed the dot tool can be found in the path. - -DOT_PATH = "C:/Program Files/Graphviz2.18/bin" - -# The DOTFILE_DIRS tag can be used to specify one or more directories that -# contain dot files that are included in the documentation (see the -# \dotfile command). - -DOTFILE_DIRS = - -# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of -# nodes that will be shown in the graph. If the number of nodes in a graph -# becomes larger than this value, doxygen will truncate the graph, which is -# visualized by representing a node as a red box. Note that doxygen if the -# number of direct children of the root node in a graph is already larger than -# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note -# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. - -DOT_GRAPH_MAX_NODES = 15 - -# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the -# graphs generated by dot. A depth value of 3 means that only nodes reachable -# from the root by following a path via at most 3 edges will be shown. Nodes -# that lay further from the root node will be omitted. Note that setting this -# option to 1 or 2 may greatly reduce the computation time needed for large -# code bases. Also note that the size of a graph can be further restricted by -# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. - -MAX_DOT_GRAPH_DEPTH = 2 - -# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent -# background. This is disabled by default, because dot on Windows does not -# seem to support this out of the box. Warning: Depending on the platform used, -# enabling this option may lead to badly anti-aliased labels on the edges of -# a graph (i.e. they become hard to read). - -DOT_TRANSPARENT = YES - -# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output -# files in one run (i.e. multiple -o and -T options on the command line). This -# makes dot run faster, but since only newer versions of dot (>1.8.10) -# support this, this feature is disabled by default. - -DOT_MULTI_TARGETS = NO - -# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will -# generate a legend page explaining the meaning of the various boxes and -# arrows in the dot generated graphs. - -GENERATE_LEGEND = YES - -# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will -# remove the intermediate dot files that are used to generate -# the various graphs. - -DOT_CLEANUP = YES - -#--------------------------------------------------------------------------- -# Configuration::additions related to the search engine -#--------------------------------------------------------------------------- - -# The SEARCHENGINE tag specifies whether or not a search engine should be -# used. If set to NO the values of all tags below this one will be ignored. - -SEARCHENGINE = NO diff --git a/Projects/AVRISP_Programmer/LUFA AVRISP_Programmer.inf b/Projects/AVRISP_Programmer/LUFA AVRISP_Programmer.inf deleted file mode 100644 index bd9c8bf142..0000000000 --- a/Projects/AVRISP_Programmer/LUFA AVRISP_Programmer.inf +++ /dev/null @@ -1,55 +0,0 @@ -; Windows LUFA USB to Serial Setup File -; Copyright (c) 2000 Microsoft Corporation - -[Version] -Signature="$Windows NT$" -Class=Ports -ClassGuid={4D36E978-E325-11CE-BFC1-08002BE10318} -Provider=%COMPANY% -LayoutFile=layout.inf -DriverVer=06/06/2006,1.0.0.0 - -[Manufacturer] -%MFGNAME% = ManufName - -[DestinationDirs] -DefaultDestDir=12 - -[ManufName] -%Modem3% = Modem3, USB\VID_03EB&PID_204B - -;------------------------------------------------------------------------------ -; Windows 2000/XP Sections -;------------------------------------------------------------------------------ - -[Modem3.nt] -CopyFiles=USBModemCopyFileSection -AddReg=Modem3.nt.AddReg - -[USBModemCopyFileSection] -usbser.sys,,,0x20 - -[Modem3.nt.AddReg] -HKR,,DevLoader,,*ntkern -HKR,,NTMPDriver,,usbser.sys -HKR,,EnumPropPages32,,"MsPorts.dll,SerialPortPropPageProvider" - -[Modem3.nt.Services] -AddService=usbser, 0x00000002, DriverService - -[DriverService] -DisplayName=%SERVICE% -ServiceType=1 -StartType=3 -ErrorControl=1 -ServiceBinary=%12%\usbser.sys - -;------------------------------------------------------------------------------ -; String Definitions -;------------------------------------------------------------------------------ - -[Strings] -COMPANY="LUFA Library" -MFGNAME="Dean Camera" -Modem3="USB Virtual Serial Port" -SERVICE="USB Virtual Serial Port CDC Driver" \ No newline at end of file diff --git a/Projects/AVRISP_Programmer/RingBuff.c b/Projects/AVRISP_Programmer/RingBuff.c deleted file mode 100644 index 1f477f17ab..0000000000 --- a/Projects/AVRISP_Programmer/RingBuff.c +++ /dev/null @@ -1,120 +0,0 @@ -/* - 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. -*/ - -#include "RingBuff.h" - -void Buffer_Initialize(RingBuff_t* Buffer) -{ - BUFF_ATOMIC_BLOCK - { - Buffer->InPtr = (RingBuff_Data_t*)&Buffer->Buffer; - Buffer->OutPtr = (RingBuff_Data_t*)&Buffer->Buffer; - Buffer->Elements = 0; - } -} - -void Buffer_StoreElement(RingBuff_t* Buffer, RingBuff_Data_t Data) -{ - BUFF_ATOMIC_BLOCK - { - #if defined(BUFF_DROPOLD) - if (Buffer->Elements == BUFF_LENGTH) - { - Buffer->OutPtr++; - - if (Buffer->OutPtr == &Buffer->Buffer[BUFF_LENGTH]) - Buffer->OutPtr = (RingBuff_Data_t*)&Buffer->Buffer; - } - else - { - Buffer->Elements++; - } - #elif defined(BUFF_DROPNEW) - if (Buffer->Elements == BUFF_LENGTH) - return; - - Buffer->Elements++; - #elif defined(BUFF_NODROPCHECK) - Buffer->Elements++; - #endif - - *(Buffer->InPtr) = Data; - Buffer->InPtr++; - - if (Buffer->InPtr == &Buffer->Buffer[BUFF_LENGTH]) - Buffer->InPtr = (RingBuff_Data_t*)&Buffer->Buffer; - } -} - -RingBuff_Data_t Buffer_GetElement(RingBuff_t* Buffer) -{ - RingBuff_Data_t BuffData; - - BUFF_ATOMIC_BLOCK - { -#if defined(BUFF_EMPTYRETURNSZERO) - if (!(Buffer->Elements)) - return 0; -#elif !defined(BUFF_NOEMPTYCHECK) - #error No empty buffer check behaviour specified. -#endif - - BuffData = *(Buffer->OutPtr); - - Buffer->OutPtr++; - Buffer->Elements--; - - if (Buffer->OutPtr == &Buffer->Buffer[BUFF_LENGTH]) - Buffer->OutPtr = (RingBuff_Data_t*)&Buffer->Buffer; - } - - return BuffData; -} - -#if defined(BUFF_USEPEEK) -RingBuff_Data_t Buffer_PeekElement(const RingBuff_t* Buffer) -{ - RingBuff_Data_t BuffData; - - BUFF_ATOMIC_BLOCK - { -#if defined(BUFF_EMPTYRETURNSZERO) - if (!(Buffer->Elements)) - return 0; -#elif !defined(BUFF_NOEMPTYCHECK) - #error No empty buffer check behaviour specified. -#endif - - BuffData = *(Buffer->OutPtr); - } - - return BuffData; -} -#endif diff --git a/Projects/AVRISP_Programmer/RingBuff.h b/Projects/AVRISP_Programmer/RingBuff.h deleted file mode 100644 index 68e4a6e75a..0000000000 --- a/Projects/AVRISP_Programmer/RingBuff.h +++ /dev/null @@ -1,116 +0,0 @@ -/* - 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. -*/ - -/* Buffer Configuration: */ - /* Buffer length - select static size of created ringbuffers: */ - #define BUFF_STATICSIZE 128 // Set to the static ringbuffer size for all ringbuffers (place size after define) - - /* Volatile mode - uncomment to make buffers volatile, for use in ISRs, etc: */ - #define BUFF_VOLATILE // Uncomment to cause all ring buffers to become volatile (and atomic if multi-byte) in access - - /* Drop mode - select behaviour when Buffer_StoreElement called on a full buffer: */ - #define BUFF_DROPOLD // Uncomment to cause full ring buffers to drop the oldest character to make space when full - // #define BUFF_DROPNEW // Uncomment to cause full ring buffers to drop the new character when full - // #define BUFF_NODROPCHECK // Uncomment to ignore full ring buffer checks - checking left to user! - - /* Underflow behaviour - select behaviour when Buffer_GetElement is called with an empty ringbuffer: */ - //#define BUFF_EMPTYRETURNSZERO // Uncomment to return 0 when an empty ringbuffer is read - #define BUFF_NOEMPTYCHECK // Uncomment to disable checking of empty ringbuffers - checking left to user! - - /* Buffer storage type - set the datatype for the stored data */ - #define BUFF_DATATYPE uint8_t // Change to the data type that is going to be stored into the buffer - - /* Peek routine - uncomment to include the peek routine (fetches next byte without removing it from the buffer */ - #define BUFF_USEPEEK - -#ifndef _RINGBUFF_H_ -#define _RINGBUFF_H_ - - /* Includes: */ - #include - #include - #include - #include - - #include - - /* Defines and checks: */ - #if defined(BUFF_STATICSIZE) - #define BUFF_LENGTH BUFF_STATICSIZE - #else - #error No buffer length specified! - #endif - - #if !(defined(BUFF_DROPOLD) || defined(BUFF_DROPNEW) || defined(BUFF_NODROPCHECK)) - #error No buffer drop mode specified. - #endif - - #if !defined(BUFF_DATATYPE) - #error Ringbuffer storage data type not specified. - #endif - - #if defined(BUFF_VOLATILE) - #define BUFF_MODE volatile - #define BUFF_ATOMIC_BLOCK ATOMIC_BLOCK(ATOMIC_RESTORESTATE) - #else - #define BUFF_MODE - #define BUFF_ATOMIC_BLOCK - #endif - - #if (BUFF_STATICSIZE > LONG_MAX) - #define RingBuff_Elements_t uint64_t - #elif (BUFF_STATICSIZE > INT_MAX) - #define RingBuff_Elements_t uint32_t - #elif (BUFF_STATICSIZE > CHAR_MAX) - #define RingBuff_Elements_t uint16_t - #else - #define RingBuff_Elements_t uint8_t - #endif - - /* Type Defines: */ - typedef BUFF_DATATYPE RingBuff_Data_t; - - typedef BUFF_MODE struct - { - RingBuff_Data_t Buffer[BUFF_LENGTH]; - RingBuff_Data_t* InPtr; - RingBuff_Data_t* OutPtr; - RingBuff_Elements_t Elements; - } RingBuff_t; - - /* Function Prototypes: */ - void Buffer_Initialize(RingBuff_t* Buff); - void Buffer_StoreElement(RingBuff_t* Buffer, RingBuff_Data_t Data); - RingBuff_Data_t Buffer_GetElement(RingBuff_t* Buffer); - #if defined(BUFF_USEPEEK) - RingBuff_Data_t Buffer_PeekElement(const RingBuff_t* Buffer); - #endif - -#endif diff --git a/Projects/AVRISP_Programmer/Sample_Programming_Session.txt b/Projects/AVRISP_Programmer/Sample_Programming_Session.txt deleted file mode 100644 index b5af76ebb4..0000000000 --- a/Projects/AVRISP_Programmer/Sample_Programming_Session.txt +++ /dev/null @@ -1,104 +0,0 @@ -ubuntu@ubuntu:~/LUFA/Bootloaders/LUFA_DFU_Bootloader_AT90USB162$ sudo avrdude -vv -F -P /dev/ttyACM0 -c avr910 -p usb162 -U flash:w:BootloaderDFU.hex - -avrdude: Version 5.5, compiled on May 9 2008 at 13:04:46 - Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/ - - System wide configuration file is "/etc/avrdude.conf" - User configuration file is "/home/ubuntu/.avrduderc" - User configuration file does not exist or is not a regular file, skipping - - Using Port : /dev/ttyACM0 - Using Programmer : avr910 - AVR Part : AT90USB162 - Chip Erase delay : 9000 us - PAGEL : PD7 - BS2 : PA0 - RESET disposition : dedicated - RETRY pulse : SCK - serial program mode : yes - parallel program mode : yes - Timeout : 200 - StabDelay : 100 - CmdexeDelay : 25 - SyncLoops : 32 - ByteDelay : 0 - PollIndex : 3 - PollValue : 0x53 - Memory Detail : - - Block Poll Page Polled - Memory Type Mode Delay Size Indx Paged Size Size #Pages MinW MaxW ReadBack - ----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- --------- - eeprom 65 10 8 0 no 512 4 0 9000 9000 0x00 0x00 - flash 65 6 128 0 yes 16384 128 128 4500 4500 0x00 0x00 - lfuse 0 0 0 0 no 1 0 0 9000 9000 0x00 0x00 - hfuse 0 0 0 0 no 1 0 0 9000 9000 0x00 0x00 - efuse 0 0 0 0 no 1 0 0 9000 9000 0x00 0x00 - lock 0 0 0 0 no 1 0 0 9000 9000 0x00 0x00 - calibration 0 0 0 0 no 1 0 0 0 0 0x00 0x00 - signature 0 0 0 0 no 3 0 0 0 0 0x00 0x00 - - Programmer Type : avr910 - Description : Atmel Low Cost Serial Programmer - -Found programmer: Id = "AVR ISP"; type = S - Software Version = 2.3; Hardware Version = 1.0 -Programmer supports auto addr increment. - -Programmer supports the following devices: - Device code: 0x55 = ATtiny12 - Device code: 0x56 = ATtiny15 - Device code: 0x5e = ATtiny2313 - Device code: 0x76 = ATMEGA8 - Device code: 0x74 = ATMEGA6450 - Device code: 0x72 = ATMEGA32 - Device code: 0x45 = ATMEGA64 - Device code: 0x74 = ATMEGA6450 - Device code: 0x43 = ATMEGA128 - Device code: 0x63 = ATMEGA162 - Device code: 0x78 = ATMEGA169 - Device code: 0x6c = AT90S4434 - Device code: 0x38 = AT90S8515 - Device code: 0x65 = (unknown) - -avrdude: warning: selected device is not supported by programmer: usb162 -avrdude: AVR device initialized and ready to accept instructions - -Reading | ################################################## | 100% 0.00s - -avrdude: Device signature = 0x1e9482 -avrdude: safemode: lfuse reads as 5E -avrdude: safemode: hfuse reads as D9 -avrdude: safemode: efuse reads as F4 -avrdude: NOTE: FLASH memory has been specified, an erase cycle will be performed - To disable this feature, specify the -D option. -avrdude: erasing chip -avrdude: reading input file "BootloaderDFU.hex" -avrdude: input file BootloaderDFU.hex auto detected as Intel Hex -avrdude: writing flash (16066 bytes): - -Writing | ################################################## | 100% 33.39s - - - -avrdude: 16066 bytes of flash written -avrdude: verifying flash memory against BootloaderDFU.hex: -avrdude: load data flash data from input file BootloaderDFU.hex: -avrdude: input file BootloaderDFU.hex auto detected as Intel Hex -avrdude: input file BootloaderDFU.hex contains 16066 bytes -avrdude: reading on-chip flash data: - -Reading | ################################################## | 100% 16.07s - - - -avrdude: verifying ... -avrdude: 16066 bytes of flash verified - -avrdude: safemode: lfuse reads as 5E -avrdude: safemode: hfuse reads as D9 -avrdude: safemode: efuse reads as F4 -avrdude: safemode: Fuses OK - -avrdude done. Thank you. - diff --git a/Projects/AVRISP_Programmer/makefile b/Projects/AVRISP_Programmer/makefile deleted file mode 100644 index 0938f05185..0000000000 --- a/Projects/AVRISP_Programmer/makefile +++ /dev/null @@ -1,726 +0,0 @@ -# Hey Emacs, this is a -*- makefile -*- -#---------------------------------------------------------------------------- -# WinAVR Makefile Template written by Eric B. Weddington, Jörg Wunsch, et al. -# >> Modified for use with the LUFA project. << -# -# Released to the Public Domain -# -# Additional material for this makefile was written by: -# Peter Fleury -# Tim Henigan -# Colin O'Flynn -# Reiner Patommel -# Markus Pfaff -# Sander Pool -# Frederik Rouleau -# Carlos Lamas -# Dean Camera -# Opendous Inc. -# Denver Gingerich -# -#---------------------------------------------------------------------------- -# On command line: -# -# make all = Make software. -# -# make clean = Clean out built project files. -# -# make coff = Convert ELF to AVR COFF. -# -# make extcoff = Convert ELF to AVR Extended COFF. -# -# make program = Download the hex file to the device, using avrdude. -# Please customize the avrdude settings below first! -# -# make dfu = Download the hex file to the device, using dfu-programmer (must -# have dfu-programmer installed). -# -# make flip = Download the hex file to the device, using Atmel FLIP (must -# have Atmel FLIP installed). -# -# make dfu-ee = Download the eeprom file to the device, using dfu-programmer -# (must have dfu-programmer installed). -# -# make flip-ee = Download the eeprom file to the device, using Atmel FLIP -# (must have Atmel FLIP installed). -# -# make doxygen = Generate DoxyGen documentation for the project (must have -# DoxyGen installed) -# -# make debug = Start either simulavr or avarice as specified for debugging, -# with avr-gdb or avr-insight as the front end for debugging. -# -# make filename.s = Just compile filename.c into the assembler code only. -# -# make filename.i = Create a preprocessed source file for use in submitting -# bug reports to the GCC project. -# -# To rebuild project do "make clean" then "make all". -#---------------------------------------------------------------------------- - - -# MCU name -MCU = at90usb1287 - - -# Target board (USBKEY, STK525, STK526, RZUSBSTICK, USER or blank for projects not requiring -# LUFA board drivers). If USER is selected, put custom board drivers in a directory called -# "Board" inside the application directory. -BOARD = USBKEY - - -# Processor frequency. -# This will define a symbol, F_CPU, in all source code files equal to the -# processor frequency. You can then use this symbol in your source code to -# calculate timings. Do NOT tack on a 'UL' at the end, this will be done -# automatically to create a 32-bit value in your source code. -# Typical values are: -# F_CPU = 1000000 -# F_CPU = 1843200 -# F_CPU = 2000000 -# F_CPU = 3686400 -# F_CPU = 4000000 -# F_CPU = 7372800 -# F_CPU = 8000000 -# F_CPU = 11059200 -# F_CPU = 14745600 -# F_CPU = 16000000 -# F_CPU = 18432000 -# F_CPU = 20000000 -F_CPU = 8000000 - - -# Input clock frequency. -# This will define a symbol, F_CLOCK, in all source code files equal to the -# input clock frequency (before any prescaling is performed). This value may -# differ from F_CPU if prescaling is used on the latter, and is required as the -# raw input clock is fed directly to the PLL sections of the AVR for high speed -# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' -# at the end, this will be done automatically to create a 32-bit value in your -# source code. -# -# If no clock division is performed on the input clock inside the AVR (via the -# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. -F_CLOCK = 8000000 - - -# Output format. (can be srec, ihex, binary) -FORMAT = ihex - - -# Target file name (without extension). -TARGET = AVRISP_Programmer - - -# Object files directory -# To put object files in current directory, use a dot (.), do NOT make -# this an empty or blank macro! -OBJDIR = . - - -# List C source files here. (C dependencies are automatically generated.) -SRC = $(TARGET).c \ - Descriptors.c \ - RingBuff.c \ - ../../LUFA/Scheduler/Scheduler.c \ - ../../LUFA/Drivers/AT90USBXXX/Serial.c \ - ../../LUFA/Drivers/USB/LowLevel/LowLevel.c \ - ../../LUFA/Drivers/USB/LowLevel/Endpoint.c \ - ../../LUFA/Drivers/USB/LowLevel/DevChapter9.c \ - ../../LUFA/Drivers/USB/HighLevel/USBTask.c \ - ../../LUFA/Drivers/USB/HighLevel/USBInterrupt.c \ - ../../LUFA/Drivers/USB/HighLevel/Events.c \ - ../../LUFA/Drivers/USB/HighLevel/StdDescriptors.c \ - -# List C++ source files here. (C dependencies are automatically generated.) -CPPSRC = - - -# List Assembler source files here. -# Make them always end in a capital .S. Files ending in a lowercase .s -# will not be considered source files but generated files (assembler -# output from the compiler), and will be deleted upon "make clean"! -# Even though the DOS/Win* filesystem matches both .s and .S the same, -# it will preserve the spelling of the filenames, and gcc itself does -# care about how the name is spelled on its command-line. -ASRC = - - -# Optimization level, can be [0, 1, 2, 3, s]. -# 0 = turn off optimization. s = optimize for size. -# (Note: 3 is not always the best optimization level. See avr-libc FAQ.) -OPT = s - - -# Debugging format. -# Native formats for AVR-GCC's -g are dwarf-2 [default] or stabs. -# AVR Studio 4.10 requires dwarf-2. -# AVR [Extended] COFF format requires stabs, plus an avr-objcopy run. -DEBUG = dwarf-2 - - -# List any extra directories to look for include files here. -# Each directory must be seperated by a space. -# Use forward slashes for directory separators. -# For a directory that has spaces, enclose it in quotes. -EXTRAINCDIRS = ../../ - - -# Compiler flag to set the C Standard level. -# c89 = "ANSI" C -# gnu89 = c89 plus GCC extensions -# c99 = ISO C99 standard (not yet fully implemented) -# gnu99 = c99 plus GCC extensions -CSTANDARD = -std=gnu99 - - -# Place -D or -U options here for C sources -CDEFS = -DF_CPU=$(F_CPU)UL -DF_CLOCK=$(F_CLOCK)UL -DBOARD=BOARD_$(BOARD) -CDEFS += -DUSE_NONSTANDARD_DESCRIPTOR_NAMES -DNO_STREAM_CALLBACKS -DUSB_DEVICE_ONLY -CDEFS += -DUSE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)" - - -# Place -D or -U options here for ASM sources -ADEFS = -DF_CPU=$(F_CPU) - - -# Place -D or -U options here for C++ sources -CPPDEFS = -DF_CPU=$(F_CPU)UL -#CPPDEFS += -D__STDC_LIMIT_MACROS -#CPPDEFS += -D__STDC_CONSTANT_MACROS - - - -#---------------- Compiler Options C ---------------- -# -g*: generate debugging information -# -O*: optimization level -# -f...: tuning, see GCC manual and avr-libc documentation -# -Wall...: warning level -# -Wa,...: tell GCC to pass this to the assembler. -# -adhlns...: create assembler listing -CFLAGS = -g$(DEBUG) -CFLAGS += $(CDEFS) -CFLAGS += -O$(OPT) -CFLAGS += -funsigned-char -CFLAGS += -funsigned-bitfields -CFLAGS += -ffunction-sections -CFLAGS += -fpack-struct -CFLAGS += -fshort-enums -CFLAGS += -finline-limit=20 -CFLAGS += -Wall -CFLAGS += -Wstrict-prototypes -CFLAGS += -Wundef -#CFLAGS += -fno-unit-at-a-time -#CFLAGS += -Wunreachable-code -#CFLAGS += -Wsign-compare -CFLAGS += -Wa,-adhlns=$(<:%.c=$(OBJDIR)/%.lst) -CFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS)) -CFLAGS += $(CSTANDARD) - - -#---------------- Compiler Options C++ ---------------- -# -g*: generate debugging information -# -O*: optimization level -# -f...: tuning, see GCC manual and avr-libc documentation -# -Wall...: warning level -# -Wa,...: tell GCC to pass this to the assembler. -# -adhlns...: create assembler listing -CPPFLAGS = -g$(DEBUG) -CPPFLAGS += $(CPPDEFS) -CPPFLAGS += -O$(OPT) -CPPFLAGS += -funsigned-char -CPPFLAGS += -funsigned-bitfields -CPPFLAGS += -fpack-struct -CPPFLAGS += -fshort-enums -CPPFLAGS += -fno-exceptions -CPPFLAGS += -Wall -CFLAGS += -Wundef -#CPPFLAGS += -mshort-calls -#CPPFLAGS += -fno-unit-at-a-time -#CPPFLAGS += -Wstrict-prototypes -#CPPFLAGS += -Wunreachable-code -#CPPFLAGS += -Wsign-compare -CPPFLAGS += -Wa,-adhlns=$(<:%.cpp=$(OBJDIR)/%.lst) -CPPFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS)) -#CPPFLAGS += $(CSTANDARD) - - -#---------------- Assembler Options ---------------- -# -Wa,...: tell GCC to pass this to the assembler. -# -adhlns: create listing -# -gstabs: have the assembler create line number information; note that -# for use in COFF files, additional information about filenames -# and function names needs to be present in the assembler source -# files -- see avr-libc docs [FIXME: not yet described there] -# -listing-cont-lines: Sets the maximum number of continuation lines of hex -# dump that will be displayed for a given single line of source input. -ASFLAGS = $(ADEFS) -Wa,-adhlns=$(<:%.S=$(OBJDIR)/%.lst),-gstabs,--listing-cont-lines=100 - - -#---------------- Library Options ---------------- -# Minimalistic printf version -PRINTF_LIB_MIN = -Wl,-u,vfprintf -lprintf_min - -# Floating point printf version (requires MATH_LIB = -lm below) -PRINTF_LIB_FLOAT = -Wl,-u,vfprintf -lprintf_flt - -# If this is left blank, then it will use the Standard printf version. -PRINTF_LIB = -#PRINTF_LIB = $(PRINTF_LIB_MIN) -#PRINTF_LIB = $(PRINTF_LIB_FLOAT) - - -# Minimalistic scanf version -SCANF_LIB_MIN = -Wl,-u,vfscanf -lscanf_min - -# Floating point + %[ scanf version (requires MATH_LIB = -lm below) -SCANF_LIB_FLOAT = -Wl,-u,vfscanf -lscanf_flt - -# If this is left blank, then it will use the Standard scanf version. -SCANF_LIB = -#SCANF_LIB = $(SCANF_LIB_MIN) -#SCANF_LIB = $(SCANF_LIB_FLOAT) - - -MATH_LIB = -lm - - -# List any extra directories to look for libraries here. -# Each directory must be seperated by a space. -# Use forward slashes for directory separators. -# For a directory that has spaces, enclose it in quotes. -EXTRALIBDIRS = - - - -#---------------- External Memory Options ---------------- - -# 64 KB of external RAM, starting after internal RAM (ATmega128!), -# used for variables (.data/.bss) and heap (malloc()). -#EXTMEMOPTS = -Wl,-Tdata=0x801100,--defsym=__heap_end=0x80ffff - -# 64 KB of external RAM, starting after internal RAM (ATmega128!), -# only used for heap (malloc()). -#EXTMEMOPTS = -Wl,--section-start,.data=0x801100,--defsym=__heap_end=0x80ffff - -EXTMEMOPTS = - - - -#---------------- Linker Options ---------------- -# -Wl,...: tell GCC to pass this to linker. -# -Map: create map file -# --cref: add cross reference to map file -LDFLAGS = -Wl,-Map=$(TARGET).map,--cref -LDFLAGS += -Wl,--relax -LDFLAGS += -Wl,--gc-sections -LDFLAGS += $(EXTMEMOPTS) -LDFLAGS += $(patsubst %,-L%,$(EXTRALIBDIRS)) -LDFLAGS += $(PRINTF_LIB) $(SCANF_LIB) $(MATH_LIB) -#LDFLAGS += -T linker_script.x - - - -#---------------- Programming Options (avrdude) ---------------- - -# Programming hardware: alf avr910 avrisp bascom bsd -# dt006 pavr picoweb pony-stk200 sp12 stk200 stk500 -# -# Type: avrdude -c ? -# to get a full listing. -# -AVRDUDE_PROGRAMMER = jtagmkII - -# com1 = serial port. Use lpt1 to connect to parallel port. -AVRDUDE_PORT = usb - -AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex -#AVRDUDE_WRITE_EEPROM = -U eeprom:w:$(TARGET).eep - - -# Uncomment the following if you want avrdude's erase cycle counter. -# Note that this counter needs to be initialized first using -Yn, -# see avrdude manual. -#AVRDUDE_ERASE_COUNTER = -y - -# Uncomment the following if you do /not/ wish a verification to be -# performed after programming the device. -#AVRDUDE_NO_VERIFY = -V - -# Increase verbosity level. Please use this when submitting bug -# reports about avrdude. See -# to submit bug reports. -#AVRDUDE_VERBOSE = -v -v - -AVRDUDE_FLAGS = -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER) -AVRDUDE_FLAGS += $(AVRDUDE_NO_VERIFY) -AVRDUDE_FLAGS += $(AVRDUDE_VERBOSE) -AVRDUDE_FLAGS += $(AVRDUDE_ERASE_COUNTER) - - - -#---------------- Debugging Options ---------------- - -# For simulavr only - target MCU frequency. -DEBUG_MFREQ = $(F_CPU) - -# Set the DEBUG_UI to either gdb or insight. -# DEBUG_UI = gdb -DEBUG_UI = insight - -# Set the debugging back-end to either avarice, simulavr. -DEBUG_BACKEND = avarice -#DEBUG_BACKEND = simulavr - -# GDB Init Filename. -GDBINIT_FILE = __avr_gdbinit - -# When using avarice settings for the JTAG -JTAG_DEV = /dev/com1 - -# Debugging port used to communicate between GDB / avarice / simulavr. -DEBUG_PORT = 4242 - -# Debugging host used to communicate between GDB / avarice / simulavr, normally -# just set to localhost unless doing some sort of crazy debugging when -# avarice is running on a different computer. -DEBUG_HOST = localhost - - - -#============================================================================ - - -# Define programs and commands. -SHELL = sh -CC = avr-gcc -OBJCOPY = avr-objcopy -OBJDUMP = avr-objdump -SIZE = avr-size -AR = avr-ar rcs -NM = avr-nm -AVRDUDE = avrdude -REMOVE = rm -f -REMOVEDIR = rm -rf -COPY = cp -WINSHELL = cmd - -# Define Messages -# English -MSG_ERRORS_NONE = Errors: none -MSG_BEGIN = -------- begin -------- -MSG_END = -------- end -------- -MSG_SIZE_BEFORE = Size before: -MSG_SIZE_AFTER = Size after: -MSG_COFF = Converting to AVR COFF: -MSG_EXTENDED_COFF = Converting to AVR Extended COFF: -MSG_FLASH = Creating load file for Flash: -MSG_EEPROM = Creating load file for EEPROM: -MSG_EXTENDED_LISTING = Creating Extended Listing: -MSG_SYMBOL_TABLE = Creating Symbol Table: -MSG_LINKING = Linking: -MSG_COMPILING = Compiling C: -MSG_COMPILING_CPP = Compiling C++: -MSG_ASSEMBLING = Assembling: -MSG_CLEANING = Cleaning project: -MSG_CREATING_LIBRARY = Creating library: - - - - -# Define all object files. -OBJ = $(SRC:%.c=$(OBJDIR)/%.o) $(CPPSRC:%.cpp=$(OBJDIR)/%.o) $(ASRC:%.S=$(OBJDIR)/%.o) - -# Define all listing files. -LST = $(SRC:%.c=$(OBJDIR)/%.lst) $(CPPSRC:%.cpp=$(OBJDIR)/%.lst) $(ASRC:%.S=$(OBJDIR)/%.lst) - - -# Compiler flags to generate dependency files. -GENDEPFLAGS = -MMD -MP -MF .dep/$(@F).d - - -# Combine all necessary flags and optional flags. -# Add target processor to flags. -ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS) $(GENDEPFLAGS) -ALL_CPPFLAGS = -mmcu=$(MCU) -I. -x c++ $(CPPFLAGS) $(GENDEPFLAGS) -ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS) - - - - - -# Default target. -all: begin gccversion sizebefore build checkhooks checklibmode checkboard sizeafter end - -# Change the build target to build a HEX file or a library. -build: elf hex eep lss sym -#build: lib - - -elf: $(TARGET).elf -hex: $(TARGET).hex -eep: $(TARGET).eep -lss: $(TARGET).lss -sym: $(TARGET).sym -LIBNAME=lib$(TARGET).a -lib: $(LIBNAME) - - - -# Eye candy. -# AVR Studio 3.x does not check make's exit code but relies on -# the following magic strings to be generated by the compile job. -begin: - @echo - @echo $(MSG_BEGIN) - -end: - @echo $(MSG_END) - @echo - - -# Display size of file. -HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex -ELFSIZE = $(SIZE) $(MCU_FLAG) $(FORMAT_FLAG) $(TARGET).elf -MCU_FLAG = $(shell $(SIZE) --help | grep -- --mcu > /dev/null && echo --mcu=$(MCU) ) -FORMAT_FLAG = $(shell $(SIZE) --help | grep -- --format=.*avr > /dev/null && echo --format=avr ) - -sizebefore: - @if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_BEFORE); $(ELFSIZE); \ - 2>/dev/null; echo; fi - -sizeafter: - @if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_AFTER); $(ELFSIZE); \ - 2>/dev/null; echo; fi - -checkhooks: build - @echo - @echo ------- Unhooked LUFA Events ------- - @$(shell) (grep -s '^Event.*LUFA/.*\\.o' $(TARGET).map | \ - cut -d' ' -f1 | cut -d'_' -f2- | grep ".*") || \ - echo "(None)" - @echo ------------------------------------ - -checklibmode: - @echo - @echo ----------- Library Mode ----------- - @$(shell) ($(CC) $(ALL_CFLAGS) -E -dM - < /dev/null \ - | grep 'USB_\(DEVICE\|HOST\)_ONLY' | cut -d' ' -f2 | grep ".*") \ - || echo "No specific mode (both device and host mode allowable)." - @echo ------------------------------------ - -checkboard: - @echo - @echo ---------- Selected Board ---------- - @echo Selected board model is $(BOARD). - @echo ------------------------------------ - -# Display compiler version information. -gccversion : - @$(CC) --version - - - -# Program the device. -program: $(TARGET).hex $(TARGET).eep - $(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM) - -flip: $(TARGET).hex - batchisp -hardware usb -device $(MCU) -operation erase f - batchisp -hardware usb -device $(MCU) -operation loadbuffer $(TARGET).hex program - batchisp -hardware usb -device $(MCU) -operation start reset 0 - -dfu: $(TARGET).hex - dfu-programmer $(MCU) erase - dfu-programmer $(MCU) flash --debug 1 $(TARGET).hex - dfu-programmer $(MCU) reset - -flip-ee: $(TARGET).hex $(TARGET).eep - copy $(TARGET).eep $(TARGET)eep.hex - batchisp -hardware usb -device $(MCU) -operation memory EEPROM erase - batchisp -hardware usb -device $(MCU) -operation memory EEPROM loadbuffer $(TARGET)eep.hex program - batchisp -hardware usb -device $(MCU) -operation start reset 0 - -dfu-ee: $(TARGET).hex $(TARGET).eep - dfu-programmer $(MCU) flash-eeprom --debug 1 --suppress-bootloader-mem $(TARGET).eep - dfu-programmer $(MCU) reset - - -# Generate avr-gdb config/init file which does the following: -# define the reset signal, load the target file, connect to target, and set -# a breakpoint at main(). -gdb-config: - @$(REMOVE) $(GDBINIT_FILE) - @echo define reset >> $(GDBINIT_FILE) - @echo SIGNAL SIGHUP >> $(GDBINIT_FILE) - @echo end >> $(GDBINIT_FILE) - @echo file $(TARGET).elf >> $(GDBINIT_FILE) - @echo target remote $(DEBUG_HOST):$(DEBUG_PORT) >> $(GDBINIT_FILE) -ifeq ($(DEBUG_BACKEND),simulavr) - @echo load >> $(GDBINIT_FILE) -endif - @echo break main >> $(GDBINIT_FILE) - -debug: gdb-config $(TARGET).elf -ifeq ($(DEBUG_BACKEND), avarice) - @echo Starting AVaRICE - Press enter when "waiting to connect" message displays. - @$(WINSHELL) /c start avarice --jtag $(JTAG_DEV) --erase --program --file \ - $(TARGET).elf $(DEBUG_HOST):$(DEBUG_PORT) - @$(WINSHELL) /c pause - -else - @$(WINSHELL) /c start simulavr --gdbserver --device $(MCU) --clock-freq \ - $(DEBUG_MFREQ) --port $(DEBUG_PORT) -endif - @$(WINSHELL) /c start avr-$(DEBUG_UI) --command=$(GDBINIT_FILE) - - - - -# Convert ELF to COFF for use in debugging / simulating in AVR Studio or VMLAB. -COFFCONVERT = $(OBJCOPY) --debugging -COFFCONVERT += --change-section-address .data-0x800000 -COFFCONVERT += --change-section-address .bss-0x800000 -COFFCONVERT += --change-section-address .noinit-0x800000 -COFFCONVERT += --change-section-address .eeprom-0x810000 - - - -coff: $(TARGET).elf - @echo - @echo $(MSG_COFF) $(TARGET).cof - $(COFFCONVERT) -O coff-avr $< $(TARGET).cof - - -extcoff: $(TARGET).elf - @echo - @echo $(MSG_EXTENDED_COFF) $(TARGET).cof - $(COFFCONVERT) -O coff-ext-avr $< $(TARGET).cof - - - -# Create final output files (.hex, .eep) from ELF output file. -%.hex: %.elf - @echo - @echo $(MSG_FLASH) $@ - $(OBJCOPY) -O $(FORMAT) -R .eeprom $< $@ - -%.eep: %.elf - @echo - @echo $(MSG_EEPROM) $@ - -$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \ - --change-section-lma .eeprom=0 --no-change-warnings -O $(FORMAT) $< $@ || exit 0 - -# Create extended listing file from ELF output file. -%.lss: %.elf - @echo - @echo $(MSG_EXTENDED_LISTING) $@ - $(OBJDUMP) -h -z -S $< > $@ - -# Create a symbol table from ELF output file. -%.sym: %.elf - @echo - @echo $(MSG_SYMBOL_TABLE) $@ - $(NM) -n $< > $@ - - - -# Create library from object files. -.SECONDARY : $(TARGET).a -.PRECIOUS : $(OBJ) -%.a: $(OBJ) - @echo - @echo $(MSG_CREATING_LIBRARY) $@ - $(AR) $@ $(OBJ) - - -# Link: create ELF output file from object files. -.SECONDARY : $(TARGET).elf -.PRECIOUS : $(OBJ) -%.elf: $(OBJ) - @echo - @echo $(MSG_LINKING) $@ - $(CC) $(ALL_CFLAGS) $^ --output $@ $(LDFLAGS) - - -# Compile: create object files from C source files. -$(OBJDIR)/%.o : %.c - @echo - @echo $(MSG_COMPILING) $< - $(CC) -c $(ALL_CFLAGS) $< -o $@ - - -# Compile: create object files from C++ source files. -$(OBJDIR)/%.o : %.cpp - @echo - @echo $(MSG_COMPILING_CPP) $< - $(CC) -c $(ALL_CPPFLAGS) $< -o $@ - - -# Compile: create assembler files from C source files. -%.s : %.c - $(CC) -S $(ALL_CFLAGS) $< -o $@ - - -# Compile: create assembler files from C++ source files. -%.s : %.cpp - $(CC) -S $(ALL_CPPFLAGS) $< -o $@ - - -# Assemble: create object files from assembler source files. -$(OBJDIR)/%.o : %.S - @echo - @echo $(MSG_ASSEMBLING) $< - $(CC) -c $(ALL_ASFLAGS) $< -o $@ - - -# Create preprocessed source for use in sending a bug report. -%.i : %.c - $(CC) -E -mmcu=$(MCU) -I. $(CFLAGS) $< -o $@ - - -# Target: clean project. -clean: begin clean_list clean_binary end - -clean_binary: - $(REMOVE) $(TARGET).hex - -clean_list: - @echo $(MSG_CLEANING) - $(REMOVE) $(TARGET).eep - $(REMOVE) $(TARGET)eep.hex - $(REMOVE) $(TARGET).cof - $(REMOVE) $(TARGET).elf - $(REMOVE) $(TARGET).map - $(REMOVE) $(TARGET).sym - $(REMOVE) $(TARGET).lss - $(REMOVE) $(SRC:%.c=$(OBJDIR)/%.o) - $(REMOVE) $(SRC:%.c=$(OBJDIR)/%.lst) - $(REMOVE) $(SRC:.c=.s) - $(REMOVE) $(SRC:.c=.d) - $(REMOVE) $(SRC:.c=.i) - $(REMOVEDIR) .dep - - -doxygen: - @echo Generating Project Documentation... - @doxygen Doxygen.conf - @echo Documentation Generation Complete. - -clean_doxygen: - rm -rf Documentation - -# Create object files directory -$(shell mkdir $(OBJDIR) 2>/dev/null) - - -# Include the dependency files. --include $(shell mkdir .dep 2>/dev/null) $(wildcard .dep/*) - - -# Listing of phony targets. -.PHONY : all checkhooks checklibmode checkboard \ -begin finish end sizebefore sizeafter gccversion \ -build elf hex eep lss sym coff extcoff clean \ -clean_list clean_binary program debug gdb-config \ -doxygen dfu flip flip-ee dfu-ee \ No newline at end of file diff --git a/Projects/Magstripe/Magstripe.txt b/Projects/Magstripe/Magstripe.txt index d91fddde7f..af95650593 100644 --- a/Projects/Magstripe/Magstripe.txt +++ b/Projects/Magstripe/Magstripe.txt @@ -5,7 +5,36 @@ */ /** \mainpage Denver Gingerich's USBSnoop Magnetic Card Reader Project - * + * + * \section SSec_Info USB Information: + * + * The following table gives a rundown of the USB utilization of this demo. + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
USB Mode:Device
USB Class:Human Interface Device (HID)
USB Subclass:Keyboard
Relevant Standards:USBIF HID Standard, USBIF HID Usage Tables
Usable Speeds:Low Speed Mode, Full Speed Mode
+ * + * \section SSec_Description Project Description: + * * Firmware for a USB AVR powered USB TTL magnetic stripe reader (using a card * reader such as the Omron V3B-4K) by Denver Gingerich. This project is designed * to be used with the open source Stripe Snoop project at http://stripesnoop.sourceforge.net/. @@ -51,7 +80,6 @@ * * * - * * This project is based on the LUFA Keyboard demonstration application, * written by Denver Gingerich. * @@ -60,26 +88,20 @@ * obtained from the magnetic stripe reader is "typed" through the keyboard * driver as 0's and 1's. After every card swipe, the demo will send a return key. * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - *
USB Mode:Device
USB Class:Human Interface Device (HID)
USB Subclass:Keyboard
Relevant Standards:USBIF HID Standard, USBIF HID Usage Tables
Usable Speeds:Low Speed Mode, Full Speed Mode
- */ + * \section SSec_Options Project Options + * + * The following defines can be found in this demo, which can control the demo behaviour when defined, or changed in value. + * + * + * + * + * + * + * + * + * + * + * + * + *
Define Name:Location:Description:
MAX_BITSCircularBitBuffer.hGives the maximum number of bits per track which can be buffered by the device for later transmission to a host.
+ */ \ No newline at end of file diff --git a/Projects/makefile b/Projects/makefile index 50851a3ef6..59de892bf9 100644 --- a/Projects/makefile +++ b/Projects/makefile @@ -16,10 +16,6 @@ all: make -C Magstripe clean make -C Magstripe all - - make -C AVRISP_Programmer clean - make -C AVRISP_Programmer all %: make -C Magstripe $@ - make -C AVRISP_Programmer $@