From 6b3915248cbbc224b35703d0b60183fa1139cd2b Mon Sep 17 00:00:00 2001 From: Fergus Leahy Date: Wed, 5 Sep 2018 10:58:41 +0100 Subject: [PATCH 01/15] Added initial firmware for Switch - Mimics the Pokken Controller which is a Pro Controller. - Currently doesn't perform debouncing like original firmware. - When plugged in, it performs the L + R, A combo to be synced. - Uses L, R, LSTICK, RSTICK, for Dons and Kats - Needs to be fixed to use stored config - Performed some code cleanup, needs to be further refactored --- Firmware/SwitchPro/Config.c | 42 +++ Firmware/SwitchPro/Config.h | 27 ++ Firmware/SwitchPro/Config/LUFAConfig.h | 84 ++++++ Firmware/SwitchPro/Descriptors.c | 206 ++++++++++++++ Firmware/SwitchPro/Descriptors.h | 56 ++++ Firmware/SwitchPro/Joystick.c | 355 ++++++++++++++++++++++++ Firmware/SwitchPro/Joystick.h | 138 ++++++++++ Firmware/SwitchPro/asciihid.h | 145 ++++++++++ Firmware/SwitchPro/i2cmaster.S | 366 +++++++++++++++++++++++++ Firmware/SwitchPro/i2cmaster.h | 178 ++++++++++++ Firmware/SwitchPro/makefile | 85 ++++++ Firmware/SwitchPro/usbio.c | 114 ++++++++ Firmware/SwitchPro/usbio.h | 20 ++ 13 files changed, 1816 insertions(+) create mode 100644 Firmware/SwitchPro/Config.c create mode 100644 Firmware/SwitchPro/Config.h create mode 100644 Firmware/SwitchPro/Config/LUFAConfig.h create mode 100644 Firmware/SwitchPro/Descriptors.c create mode 100644 Firmware/SwitchPro/Descriptors.h create mode 100644 Firmware/SwitchPro/Joystick.c create mode 100644 Firmware/SwitchPro/Joystick.h create mode 100644 Firmware/SwitchPro/asciihid.h create mode 100644 Firmware/SwitchPro/i2cmaster.S create mode 100644 Firmware/SwitchPro/i2cmaster.h create mode 100644 Firmware/SwitchPro/makefile create mode 100644 Firmware/SwitchPro/usbio.c create mode 100644 Firmware/SwitchPro/usbio.h diff --git a/Firmware/SwitchPro/Config.c b/Firmware/SwitchPro/Config.c new file mode 100644 index 0000000..575413c --- /dev/null +++ b/Firmware/SwitchPro/Config.c @@ -0,0 +1,42 @@ +#include +#include "Joystick.h" + +#include +#include + +#define MAGIC_NUMBER 43 + +static const tatacon_config_t defaults PROGMEM = { + .switches = { + // SWITCH ORDER: CenterLeft, RimLeft, CenterRight, RimRight + // ---- osu default + SWITCH_LCLICK, + SWITCH_L, + SWITCH_A, + SWITCH_R }, + .ledsOn = true, + .debounce = 30 +}; + +uint8_t firstRun EEMEM; // init to 255 +tatacon_config_t eeConfig EEMEM; + +tatacon_config_t tataConfig; + +void InitConfig(void) { + if (eeprom_read_byte(&firstRun) != MAGIC_NUMBER) { // store defaults + memcpy_P(&tataConfig, &defaults, sizeof(tatacon_config_t)); + eeprom_write_block(&tataConfig, &eeConfig, sizeof(tatacon_config_t)); + eeprom_write_byte(&firstRun, MAGIC_NUMBER); // defaults set + } + eeprom_read_block(&tataConfig, &eeConfig, sizeof(tatacon_config_t)); + tataConfig.version = FIRMWARE_VERSION; +} + +void SetConfig(uint8_t* config) { + memcpy(&tataConfig, config, sizeof(tatacon_config_t)); + // Version is set in firmware, not software + tataConfig.version = FIRMWARE_VERSION; + + eeprom_write_block(&tataConfig, &eeConfig, sizeof(tatacon_config_t)); +} \ No newline at end of file diff --git a/Firmware/SwitchPro/Config.h b/Firmware/SwitchPro/Config.h new file mode 100644 index 0000000..6cb27b2 --- /dev/null +++ b/Firmware/SwitchPro/Config.h @@ -0,0 +1,27 @@ +#ifndef _CONFIG_H +#define _CONFIG_H + +#include +#include +#include + +// For ease of code sharing with the OsuPad +#define KB_SWITCHES 4 +#define TATACON_CONFIG_BYTES 8 +#define MAGIC_RESET_NUMBER 42 +#define FIRMWARE_VERSION 1 + +typedef struct { + // SWITCH ORDER: CenterLeft, RimLeft, CenterRight, RimRight + uint16_t switches[KB_SWITCHES]; + bool ledsOn; + uint8_t debounce; + uint8_t version; +} tatacon_config_t; + +extern tatacon_config_t tataConfig; + +extern void InitConfig(void); +extern void SetConfig(uint8_t* config); + +#endif \ No newline at end of file diff --git a/Firmware/SwitchPro/Config/LUFAConfig.h b/Firmware/SwitchPro/Config/LUFAConfig.h new file mode 100644 index 0000000..5fae1fa --- /dev/null +++ b/Firmware/SwitchPro/Config/LUFAConfig.h @@ -0,0 +1,84 @@ +/* + LUFA Library + Copyright (C) Dean Camera, 2014. + + dean [at] fourwalledcubicle [dot] com + www.lufa-lib.org +*/ + +/* + Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + + Permission to use, copy, modify, distribute, and sell this + software and its documentation for any purpose is hereby granted + without fee, provided that the above copyright notice appear in + all copies and that both that the copyright notice and this + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the + software without specific, written prior permission. + + The author disclaims all warranties with regard to this + software, including all implied warranties of merchantability + and fitness. In no event shall the author be liable for any + special, indirect or consequential damages or any damages + whatsoever resulting from loss of use, data or profits, whether + in an action of contract, negligence or other tortious action, + arising out of or in connection with the use or performance of + this software. +*/ + +/** \file + * \brief LUFA Library Configuration Header File + * + * This header file is used to configure LUFA's compile time options, + * as an alternative to the compile time constants supplied through + * a makefile. + * + * For information on what each token does, refer to the LUFA + * manual section "Summary of Compile Tokens". + */ + +#ifndef _LUFA_CONFIG_H_ +#define _LUFA_CONFIG_H_ + /* Non-USB Related Configuration Tokens: */ +// #define DISABLE_TERMINAL_CODES + + /* USB Class Driver Related Tokens: */ +// #define HID_HOST_BOOT_PROTOCOL_ONLY +// #define HID_STATETABLE_STACK_DEPTH {Insert Value Here} +// #define HID_USAGE_STACK_DEPTH {Insert Value Here} +// #define HID_MAX_COLLECTIONS {Insert Value Here} +// #define HID_MAX_REPORTITEMS {Insert Value Here} +// #define HID_MAX_REPORT_IDS {Insert Value Here} +// #define NO_CLASS_DRIVER_AUTOFLUSH + + /* General USB Driver Related Tokens: */ +// #define ORDERED_EP_CONFIG + #define USE_STATIC_OPTIONS (USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL) + #define USB_DEVICE_ONLY +// #define USB_HOST_ONLY +// #define USB_STREAM_TIMEOUT_MS {Insert Value Here} +// #define NO_LIMITED_CONTROLLER_CONNECT +// #define NO_SOF_EVENTS + + /* USB Device Mode Driver Related Tokens: */ +// #define USE_RAM_DESCRIPTORS + #define USE_FLASH_DESCRIPTORS +// #define USE_EEPROM_DESCRIPTORS +// #define NO_INTERNAL_SERIAL + #define FIXED_CONTROL_ENDPOINT_SIZE 8 +// #define DEVICE_STATE_AS_GPIOR {Insert Value Here} + #define FIXED_NUM_CONFIGURATIONS 1 +// #define CONTROL_ONLY_DEVICE +// #define INTERRUPT_CONTROL_ENDPOINT +// #define NO_DEVICE_REMOTE_WAKEUP +// #define NO_DEVICE_SELF_POWER + + /* USB Host Mode Driver Related Tokens: */ +// #define HOST_STATE_AS_GPIOR {Insert Value Here} +// #define USB_HOST_TIMEOUT_MS {Insert Value Here} +// #define HOST_DEVICE_SETTLE_DELAY_MS {Insert Value Here} +// #define NO_AUTO_VBUS_MANAGEMENT +// #define INVERTED_VBUS_ENABLE_LINE +#endif diff --git a/Firmware/SwitchPro/Descriptors.c b/Firmware/SwitchPro/Descriptors.c new file mode 100644 index 0000000..c59986a --- /dev/null +++ b/Firmware/SwitchPro/Descriptors.c @@ -0,0 +1,206 @@ +#include "Descriptors.h" + +// HID Descriptors. +const USB_Descriptor_HIDReport_Datatype_t PROGMEM JoystickReport[] = { + HID_RI_USAGE_PAGE(8,1), /* Generic Desktop */ + HID_RI_USAGE(8,5), /* Joystick */ + HID_RI_COLLECTION(8,1), /* Application */ + // Buttons (2 bytes) + HID_RI_LOGICAL_MINIMUM(8,0), + HID_RI_LOGICAL_MAXIMUM(8,1), + HID_RI_PHYSICAL_MINIMUM(8,0), + HID_RI_PHYSICAL_MAXIMUM(8,1), + // The Switch will allow us to expand the original HORI descriptors to a full 16 buttons. + // The Switch will make use of 14 of those buttons. + HID_RI_REPORT_SIZE(8,1), + HID_RI_REPORT_COUNT(8,16), + HID_RI_USAGE_PAGE(8,9), + HID_RI_USAGE_MINIMUM(8,1), + HID_RI_USAGE_MAXIMUM(8,16), + HID_RI_INPUT(8,2), + // HAT Switch (1 nibble) + HID_RI_USAGE_PAGE(8,1), + HID_RI_LOGICAL_MAXIMUM(8,7), + HID_RI_PHYSICAL_MAXIMUM(16,315), + HID_RI_REPORT_SIZE(8,4), + HID_RI_REPORT_COUNT(8,1), + HID_RI_UNIT(8,20), + HID_RI_USAGE(8,57), + HID_RI_INPUT(8,66), + // There's an additional nibble here that's utilized as part of the Switch Pro Controller. + // I believe this -might- be separate U/D/L/R bits on the Switch Pro Controller, as they're utilized as four button descriptors on the Switch Pro Controller. + HID_RI_UNIT(8,0), + HID_RI_REPORT_COUNT(8,1), + HID_RI_INPUT(8,1), + // Joystick (4 bytes) + HID_RI_LOGICAL_MAXIMUM(16,255), + HID_RI_PHYSICAL_MAXIMUM(16,255), + HID_RI_USAGE(8,48), + HID_RI_USAGE(8,49), + HID_RI_USAGE(8,50), + HID_RI_USAGE(8,53), + HID_RI_REPORT_SIZE(8,8), + HID_RI_REPORT_COUNT(8,4), + HID_RI_INPUT(8,2), + // ??? Vendor Specific (1 byte) + // This byte requires additional investigation. + HID_RI_USAGE_PAGE(16,65280), + HID_RI_USAGE(8,32), + HID_RI_REPORT_COUNT(8,1), + HID_RI_INPUT(8,2), + // Output (8 bytes) + // Original observation of this suggests it to be a mirror of the inputs that we sent. + // The Switch requires us to have these descriptors available. + HID_RI_USAGE(16,9761), + HID_RI_REPORT_COUNT(8,8), + HID_RI_OUTPUT(8,2), + HID_RI_END_COLLECTION(0), +}; + +// Device Descriptor Structure +const USB_Descriptor_Device_t PROGMEM DeviceDescriptor = { + .Header = {.Size = sizeof(USB_Descriptor_Device_t), .Type = DTYPE_Device}, + + .USBSpecification = VERSION_BCD(2,0,0), + .Class = USB_CSCP_NoDeviceClass, + .SubClass = USB_CSCP_NoDeviceSubclass, + .Protocol = USB_CSCP_NoDeviceProtocol, + + .Endpoint0Size = FIXED_CONTROL_ENDPOINT_SIZE, + + .VendorID = 0x0F0D, + .ProductID = 0x0092, + .ReleaseNumber = VERSION_BCD(1,0,0), + + .ManufacturerStrIndex = STRING_ID_Manufacturer, + .ProductStrIndex = STRING_ID_Product, + .SerialNumStrIndex = NO_DESCRIPTOR, + + .NumberOfConfigurations = FIXED_NUM_CONFIGURATIONS +}; + +// Configuration Descriptor Structure +const 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 = 1, + + .ConfigurationNumber = 1, + .ConfigurationStrIndex = NO_DESCRIPTOR, + + .ConfigAttributes = 0x80, + + .MaxPowerConsumption = USB_CONFIG_POWER_MA(500) + }, + + .HID_Interface = + { + .Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, + + .InterfaceNumber = INTERFACE_ID_Joystick, + .AlternateSetting = 0x00, + + .TotalEndpoints = 2, + + .Class = HID_CSCP_HIDClass, + .SubClass = HID_CSCP_NonBootSubclass, + .Protocol = HID_CSCP_NonBootProtocol, + + .InterfaceStrIndex = NO_DESCRIPTOR + }, + + .HID_JoystickHID = + { + .Header = {.Size = sizeof(USB_HID_Descriptor_HID_t), .Type = HID_DTYPE_HID}, + + .HIDSpec = VERSION_BCD(1,1,1), + .CountryCode = 0x00, + .TotalReportDescriptors = 1, + .HIDReportType = HID_DTYPE_Report, + .HIDReportLength = sizeof(JoystickReport) + }, + + .HID_ReportINEndpoint = + { + .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, + + .EndpointAddress = JOYSTICK_IN_EPADDR, + .Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), + .EndpointSize = JOYSTICK_EPSIZE, + .PollingIntervalMS = 0x05 + }, + + .HID_ReportOUTEndpoint = + { + .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, + + .EndpointAddress = JOYSTICK_OUT_EPADDR, + .Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), + .EndpointSize = JOYSTICK_EPSIZE, + .PollingIntervalMS = 0x05 + }, +}; + +// Language Descriptor Structure +const USB_Descriptor_String_t PROGMEM LanguageString = USB_STRING_DESCRIPTOR_ARRAY(LANGUAGE_ID_ENG); + +// Manufacturer and Product Descriptor Strings +const USB_Descriptor_String_t PROGMEM ManufacturerString = USB_STRING_DESCRIPTOR(L"HORI CO.,LTD."); +const USB_Descriptor_String_t PROGMEM ProductString = USB_STRING_DESCRIPTOR(L"POKKEN CONTROLLER"); + +// USB Device Callback - Get Descriptor +uint16_t CALLBACK_USB_GetDescriptor( + const uint16_t wValue, + const uint16_t wIndex, + const void** const DescriptorAddress +) { + const uint8_t DescriptorType = (wValue >> 8); + const uint8_t DescriptorNumber = (wValue & 0xFF); + + const void* Address = NULL; + uint16_t Size = NO_DESCRIPTOR; + + switch (DescriptorType) + { + case DTYPE_Device: + Address = &DeviceDescriptor; + Size = sizeof(USB_Descriptor_Device_t); + break; + case DTYPE_Configuration: + Address = &ConfigurationDescriptor; + Size = sizeof(USB_Descriptor_Configuration_t); + break; + case DTYPE_String: + switch (DescriptorNumber) + { + case STRING_ID_Language: + Address = &LanguageString; + Size = pgm_read_byte(&LanguageString.Header.Size); + break; + case STRING_ID_Manufacturer: + Address = &ManufacturerString; + Size = pgm_read_byte(&ManufacturerString.Header.Size); + break; + case STRING_ID_Product: + Address = &ProductString; + Size = pgm_read_byte(&ProductString.Header.Size); + break; + } + + break; + case DTYPE_HID: + Address = &ConfigurationDescriptor.HID_JoystickHID; + Size = sizeof(USB_HID_Descriptor_HID_t); + break; + case DTYPE_Report: + Address = &JoystickReport; + Size = sizeof(JoystickReport); + break; + } + + *DescriptorAddress = Address; + return Size; +} diff --git a/Firmware/SwitchPro/Descriptors.h b/Firmware/SwitchPro/Descriptors.h new file mode 100644 index 0000000..dd68463 --- /dev/null +++ b/Firmware/SwitchPro/Descriptors.h @@ -0,0 +1,56 @@ +#ifndef _DESCRIPTORS_H_ +#define _DESCRIPTORS_H_ + +// Includes +#include + +#include + +// Type Defines +// Device Configuration Descriptor Structure +typedef struct +{ + USB_Descriptor_Configuration_Header_t Config; + + // Joystick HID Interface + USB_Descriptor_Interface_t HID_Interface; + USB_HID_Descriptor_HID_t HID_JoystickHID; + USB_Descriptor_Endpoint_t HID_ReportOUTEndpoint; + USB_Descriptor_Endpoint_t HID_ReportINEndpoint; +} USB_Descriptor_Configuration_t; + +// Device Interface Descriptor IDs +enum InterfaceDescriptors_t +{ + INTERFACE_ID_Joystick = 0, /**< Joystick interface descriptor ID */ +}; + +// Device String Descriptor IDs +enum StringDescriptors_t +{ + STRING_ID_Language = 0, // Supported Languages string descriptor ID (must be zero) + STRING_ID_Manufacturer = 1, // Manufacturer string ID + STRING_ID_Product = 2, // Product string ID +}; + +// Macros +// Endpoint Addresses +#define JOYSTICK_IN_EPADDR (ENDPOINT_DIR_IN | 1) +#define JOYSTICK_OUT_EPADDR (ENDPOINT_DIR_OUT | 2) +// HID Endpoint Size +// The Switch -needs- this to be 64. +// The Wii U is flexible, allowing us to use the default of 8 (which did not match the original Hori descriptors). +#define JOYSTICK_EPSIZE 64 +// Descriptor Header Type - HID Class HID Descriptor +#define DTYPE_HID 0x21 +// Descriptor Header Type - HID Class HID Report Descriptor +#define DTYPE_Report 0x22 + +// Function Prototypes +uint16_t CALLBACK_USB_GetDescriptor( + const uint16_t wValue, + const uint16_t wIndex, + const void** const DescriptorAddress +) ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(3); + +#endif \ No newline at end of file diff --git a/Firmware/SwitchPro/Joystick.c b/Firmware/SwitchPro/Joystick.c new file mode 100644 index 0000000..cb8733f --- /dev/null +++ b/Firmware/SwitchPro/Joystick.c @@ -0,0 +1,355 @@ +#include "Joystick.h" +#include "i2cmaster.h" +#include "Config.h" + +#ifdef DEBUG +#include "usbio.h" +#include +#endif +static const tatacon_config_t tata= { + .switches = { + // SWITCH ORDER: CenterLeft, RimLeft, CenterRight, RimRight + // ---- osu default + SWITCH_LCLICK, + SWITCH_L, + SWITCH_RCLICK, + SWITCH_R }, + .ledsOn = true, + .debounce = 30 +}; +// V1 hardware has no LEDs +#ifdef V1_BUILD + #define SET(port, pin) + #define CLEAR(port, pin) + #define TOGGLE(port, pin) +#else + #define SET(port, pin) port |= _BV(pin) + #define CLEAR(port, pin) port &= ~_BV(pin) + #define TOGGLE(port, pin) port ^= _BV(pin) +#endif + +uint32_t Boot_Key ATTR_NO_INIT; +#define MAGIC_BOOT_KEY 0xDEADBE7A +// offset * word size +#define BOOTLOADER_START_ADDRESS (0x1c00 * 2) + +void Bootloader_Jump_Check(void) ATTR_INIT_SECTION(3); +void Bootloader_Jump_Check(void) { + // If the reset source was the bootloader and the key is correct, clear it and jump to the bootloader + if ((MCUSR & (1 << WDRF)) && (Boot_Key == MAGIC_BOOT_KEY)) { + Boot_Key = 0; + ((void (*)(void))BOOTLOADER_START_ADDRESS)(); + } +} + +typedef struct { + // optimise data sending + uint8_t state; + uint8_t lastReport; + uint8_t debounce; +} switch_t; + +static switch_t switches[TATACON_SWITCHES]; +static uint8_t switchesChanged = 1; +static uint8_t nunchuckReady = 0; +// Main entry point. +int main(void) { + // We'll start by performing hardware and peripheral setup. + SetupHardware(); + // We'll then enable global interrupts for our use. + GlobalInterruptEnable(); + // Once that's done, we'll enter an infinite loop. + for (;;) + { + // We need to run our task to process and deliver data for our IN and OUT endpoints. + HID_Task(); + // We also need to run the main USB management task. + USB_USBTask(); + } +} + +// Process and deliver data from IN and OUT endpoints. +void HID_Task(void) { + // If the device isn't connected and properly configured, we can't do anything here. + if (USB_DeviceState != DEVICE_STATE_Configured) { + SET(LED_PORT, DON_LED_PIN); + SET(LED_PORT, KAT_LED_PIN); + return; + } + + // We'll start with the OUT endpoint. + Endpoint_SelectEndpoint(JOYSTICK_OUT_EPADDR); + // We'll check to see if we received something on the OUT endpoint. + if (Endpoint_IsOUTReceived()) { + // If we did, and the packet has data, we'll react to it. + if (Endpoint_IsReadWriteAllowed()) { + // We'll create a place to store our data received from the host. + USB_JoystickReport_Output_t JoystickOutputData; + // We'll then take in that data, setting it up in our storage. + while(Endpoint_Read_Stream_LE(&JoystickOutputData, sizeof(JoystickOutputData), NULL) != ENDPOINT_RWSTREAM_NoError); + // At this point, we can react to this data. + // However, since we're not doing anything with this data, we abandon it. + } + // Regardless of whether we reacted to the data, we acknowledge an OUT packet on this endpoint. + Endpoint_ClearOUT(); + } + + // We'll then move on to the IN endpoint. + Endpoint_SelectEndpoint(JOYSTICK_IN_EPADDR); + // We first check to see if the host is ready to accept data. + if (Endpoint_IsINReady()) { + // We'll create an empty report. + USB_JoystickReport_Input_t JoystickInputData; + // We'll then populate this report with what we want to send to the host. + GetNextReport(&JoystickInputData); + // Once populated, we can output this data to the host. We do this by first writing the data to the control stream. + while(Endpoint_Write_Stream_LE(&JoystickInputData, sizeof(JoystickInputData), NULL) != ENDPOINT_RWSTREAM_NoError); + // We then send an IN packet on this endpoint. + Endpoint_ClearIN(); + } +} + + + + + +void nunchuck_online(void) { + if(!nunchuckReady) { + nunchuckReady = 1; + // Turn LEDs off, it returned + CLEAR(LED_PORT, DON_LED_PIN); + CLEAR(LED_PORT, KAT_LED_PIN); + } +} + +void nunchuck_offline(void) { + i2c_stop(); + if(nunchuckReady) { + nunchuckReady = 0; + // Turn LEDs on until it returns + // SET(LED_PORT, DON_LED_PIN); + // SET(LED_PORT, KAT_LED_PIN); + // Clear structs + for(int i = 0; i < KB_SWITCHES; i++) { + switches[i].state = 0; + if(switches[i].state != switches[i].lastReport) { + switchesChanged = 1; + } + } + } +} + +void nunchuck_init(void) { + // try to say hello + if(!i2c_start(NUNCHUCK_ADDR | I2C_WRITE)) { + i2c_write(0xF0); + i2c_write(0x55); + i2c_stop(); + _delay_ms(25); + + i2c_start(NUNCHUCK_ADDR | I2C_WRITE); + i2c_write(0xFB); + i2c_write(0x00); + i2c_stop(); + _delay_ms(25); + nunchuck_online(); + } else { + nunchuck_offline(); + } +} + +uint8_t nunchuck_readByte(uint8_t address) { + uint8_t data = 0xFF; + + if(!nunchuckReady) { + nunchuck_init(); + } + + if(!i2c_start(NUNCHUCK_ADDR | I2C_WRITE)) { + i2c_write(address); + i2c_stop(); + + i2c_start(NUNCHUCK_ADDR | I2C_READ); + data = i2c_readNak(); + i2c_stop(); + nunchuck_online(); + } else { + nunchuck_offline(); + } + return data; +} + +// Starting at address, read n bytes and return the last +void nunchuck_readMany(uint8_t address, uint8_t *data, uint8_t count) { + + if(!nunchuckReady) { + nunchuck_init(); + } + + if(!i2c_start(NUNCHUCK_ADDR | I2C_WRITE)) { + i2c_write(address); + i2c_stop(); + + i2c_start(NUNCHUCK_ADDR | I2C_READ); + for(uint8_t i = 0; i < count-1; i++) { + data[i] = i2c_readAck(); + } + data[count-1] = i2c_readNak(); + i2c_stop(); + nunchuck_online(); + } else { + nunchuck_offline(); + } +} + +typedef enum { + SYNC_CONTROLLER, + TATACON_PASSTHROUGH +} State_t; + +State_t state = SYNC_CONTROLLER; +#define ECHOES 2 +int echoes = 0; +int report_count = 0; +USB_JoystickReport_Input_t last_report; + +void GetNextReport(USB_JoystickReport_Input_t* const reportData) { + uint8_t data, i; + // Prepare an empty report + memset(reportData, 0, sizeof(USB_JoystickReport_Input_t)); + reportData->LX = STICK_CENTER; + reportData->LY = STICK_CENTER; + reportData->RX = STICK_CENTER; + reportData->RY = STICK_CENTER; + reportData->HAT = HAT_CENTER; + + // Repeat ECHOES times the last report + if (echoes > 0) { + memcpy(reportData, &last_report, sizeof(USB_JoystickReport_Input_t)); + echoes--; + return; + } + + // States and moves management + switch (state) { + case SYNC_CONTROLLER: + if (report_count > 100) { + report_count = 0; + state = TATACON_PASSTHROUGH; + } + else if (report_count == 25 || report_count == 50) { + reportData->Button |= SWITCH_L | SWITCH_R; + } + else if (report_count == 75 || report_count == 100) { + reportData->Button |= SWITCH_A; + } + report_count++; + break; + case TATACON_PASSTHROUGH: + // Get tatacon button data + data = nunchuck_readByte(BUTTONS_DATA); + CLEAR(LED_PORT, KAT_LED_PIN); + + // Tatacon has 4 inputs to check + for(i = 0; i < TATACON_SWITCHES; i++) { + // The I2C data starts at the 6th bit and goes down + uint8_t newState = !(data & _BV(TATACON_BUTTONS_START - i)); + if(newState) { + SET(LED_PORT, KAT_LED_PIN); + reportData->Button |= tata.switches[i]; + switches[i].state = newState; + switches[i].debounce = tata.debounce; + switchesChanged = 1; + } + } + break; + } + memcpy(&last_report, reportData, sizeof(USB_JoystickReport_Input_t)); + echoes = ECHOES; +} + + + + +void SetupHardware() { + /* Disable watchdog if enabled by bootloader/fuses */ + MCUSR &= ~(1 << WDRF); + wdt_disable(); + +#ifdef V1_BUILD + CLKPR = (1 << CLKPCE); // enable a change to CLKPR + CLKPR = 0; // set the CLKDIV to 0 - was 0011b = div by 8 taking 8MHz to 1MHz +#endif + clock_prescale_set(clock_div_1); + /* Hardware Initialization */ + SET(LED_DIR, DON_LED_PIN); + SET(LED_DIR, KAT_LED_PIN); + +#ifdef DEBUG + init_usb_stdio(); + SET(LED_PORT, DON_LED_PIN); + for(int i = 0; i < 32; i++) { + TOGGLE(LED_PORT, DON_LED_PIN); + TOGGLE(LED_PORT, KAT_LED_PIN); + _delay_ms(125); + } +#endif + // if(tataConfig.ledsOn) { + // Turn them on until we init with the nunchuck + // SET(LED_PORT, DON_LED_PIN); + // SET(LED_PORT, KAT_LED_PIN); + // } + i2c_init(); + nunchuck_init(); + USB_Init(); +} + +// LUFA USB Events + +// Fired to indicate that the device is enumerating. +void EVENT_USB_Device_Connect(void) { + // We can indicate that we're enumerating here (via status LEDs, sound, etc.). + SET(LED_PORT, DON_LED_PIN); + SET(LED_PORT, KAT_LED_PIN); +} + +// Fired to indicate that the device is no longer connected to a host. +void EVENT_USB_Device_Disconnect(void) { + // We can indicate that our device is not ready (via status LEDs, sound, etc.). + CLEAR(LED_PORT, DON_LED_PIN); + CLEAR(LED_PORT, KAT_LED_PIN); +} + +// Fired when the host set the current configuration of the USB device after enumeration. +void EVENT_USB_Device_ConfigurationChanged(void) { + bool ConfigSuccess = true; + + // We setup the HID report endpoints. + ConfigSuccess &= Endpoint_ConfigureEndpoint(JOYSTICK_OUT_EPADDR, EP_TYPE_INTERRUPT, JOYSTICK_EPSIZE, 1); + ConfigSuccess &= Endpoint_ConfigureEndpoint(JOYSTICK_IN_EPADDR, EP_TYPE_INTERRUPT, JOYSTICK_EPSIZE, 1); + + // We can read ConfigSuccess to indicate a success or failure at this point. + if (ConfigSuccess) { + CLEAR(LED_PORT, DON_LED_PIN); + CLEAR(LED_PORT, KAT_LED_PIN); + } +} + +// Process control requests sent to the device from the USB host. +void EVENT_USB_Device_ControlRequest(void) { + // We can handle two control requests: a GetReport and a SetReport. + + // Not used here, it looks like we don't receive control request from the Switch. +} + +// // Event handler for the USB device Start Of Frame event. +// void EVENT_USB_Device_StartOfFrame(void) { +// //HID_Device_MillisecondElapsed(&Keyboard_HID_Interface); +// // HID_Device_MillisecondElapsed(&Generic_HID_Interface); + +// for(int i = 0; i < TATACON_SWITCHES; i++) { +// if(switches[i].debounce) { +// switches[i].debounce--; +// } +// } +// } \ No newline at end of file diff --git a/Firmware/SwitchPro/Joystick.h b/Firmware/SwitchPro/Joystick.h new file mode 100644 index 0000000..782ba97 --- /dev/null +++ b/Firmware/SwitchPro/Joystick.h @@ -0,0 +1,138 @@ +/* + LUFA Library + Copyright (C) Dean Camera, 2014. + + dean [at] fourwalledcubicle [dot] com + www.lufa-lib.org +*/ + +/* + Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + + Permission to use, copy, modify, distribute, and sell this + software and its documentation for any purpose is hereby granted + without fee, provided that the above copyright notice appear in + all copies and that both that the copyright notice and this + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the + software without specific, written prior permission. + + The author disclaims 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 Joystick.c. + */ + +#ifndef _JOYSTICK_H_ +#define _JOYSTICK_H_ + +/* Includes: */ +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include "Descriptors.h" + +// Tatacon USB Pin Config +#define LED_DIR DDRD +#define LED_PORT PORTD +#define DON_LED_PIN 6 +#define KAT_LED_PIN 5 + +// Nunchuck I2C address +#define NUNCHUCK_ADDR (0x52 << 1) +#define BUTTONS_DATA 0x05 +#define TATACON_BUTTONS_START 6 +#define TATACON_SWITCHES 4 + +// Type Defines +// Enumeration for joystick buttons. +typedef enum { + SWITCH_Y = 0x01, + SWITCH_B = 0x02, + SWITCH_A = 0x04, + SWITCH_X = 0x08, + SWITCH_L = 0x10, + SWITCH_R = 0x20, + SWITCH_ZL = 0x40, + SWITCH_ZR = 0x80, + SWITCH_MINUS = 0x100, + SWITCH_PLUS = 0x200, + SWITCH_LCLICK = 0x400, + SWITCH_RCLICK = 0x800, + SWITCH_HOME = 0x1000, + SWITCH_CAPTURE = 0x2000, +} JoystickButtons_t; + +#define HAT_TOP 0x00 +#define HAT_TOP_RIGHT 0x01 +#define HAT_RIGHT 0x02 +#define HAT_BOTTOM_RIGHT 0x03 +#define HAT_BOTTOM 0x04 +#define HAT_BOTTOM_LEFT 0x05 +#define HAT_LEFT 0x06 +#define HAT_TOP_LEFT 0x07 +#define HAT_CENTER 0x08 + +#define STICK_MIN 0 +#define STICK_CENTER 128 +#define STICK_MAX 255 + +// Joystick HID report structure. We have an input and an output. +typedef struct { + uint16_t Button; // 16 buttons; see JoystickButtons_t for bit mapping + uint8_t HAT; // HAT switch; one nibble w/ unused nibble + uint8_t LX; // Left Stick X + uint8_t LY; // Left Stick Y + uint8_t RX; // Right Stick X + uint8_t RY; // Right Stick Y + uint8_t VendorSpec; +} USB_JoystickReport_Input_t; + +// The output is structured as a mirror of the input. +// This is based on initial observations of the Pokken Controller. +typedef struct { + uint16_t Button; // 16 buttons; see JoystickButtons_t for bit mapping + uint8_t HAT; // HAT switch; one nibble w/ unused nibble + uint8_t LX; // Left Stick X + uint8_t LY; // Left Stick Y + uint8_t RX; // Right Stick X + uint8_t RY; // Right Stick Y +} USB_JoystickReport_Output_t; + +// Function Prototypes +// Setup all necessary hardware, including USB initialization. +void SetupHardware(void); +// Process and deliver data from IN and OUT endpoints. +void HID_Task(void); +// USB device event handlers. +void EVENT_USB_Device_Connect(void); +void EVENT_USB_Device_Disconnect(void); +void EVENT_USB_Device_ConfigurationChanged(void); +void EVENT_USB_Device_ControlRequest(void); +//void EVENT_USB_Device_StartOfFrame(void); + +// Prepare the next report for the host. +void GetNextReport(USB_JoystickReport_Input_t* const ReportData); + +#endif diff --git a/Firmware/SwitchPro/asciihid.h b/Firmware/SwitchPro/asciihid.h new file mode 100644 index 0000000..9f66468 --- /dev/null +++ b/Firmware/SwitchPro/asciihid.h @@ -0,0 +1,145 @@ +// https://github.com/SFE-Chris/UNO-HIDKeyboard-Library/blob/master/HIDKeyboard.h + +#include + +// HID Values of Function Keys +#define F1 0x3a +#define F2 0x3b +#define F3 0x3c +#define F4 0x3d +#define F5 0x3e +#define F6 0x3f +#define F7 0x40 +#define F8 0x41 +#define F9 0x42 +#define F10 0x43 +#define F11 0x44 +#define F12 0x45 + +// HID Values of Special Keys +#define ENTER 0x28 +#define ESCAPE 0x29 +#define BACKSPACE 0x2a +#define TAB 0x2b +#define SPACEBAR 0x2c +#define CAPSLOCK 0x39 +#define PRINTSCREEN 0x46 +#define SCROLLLOCK 0x47 +#define PAUSE 0x48 +#define INSERT 0x49 +#define HOME 0x4a +#define PAGEUP 0x4b +#define DELETE 0x4c +#define END 0x4d +#define PAGEDOWN 0x4e +#define RIGHTARROW 0x4f +#define LEFTARROW 0x50 +#define DOWNARROW 0x51 +#define UPARROW 0x52 + +// HID Values of Keypad Keys +#define NUMLOCK 0x53 +#define KEYPADSLASH 0x54 +#define KEYPADSTAR 0x55 +#define KEYPADMINUS 0x56 +#define KEYPADPLUS 0x57 +#define KEYPADENTER 0x58 +#define KEYPAD1 0x59 +#define KEYPAD2 0x5a +#define KEYPAD3 0x5b +#define KEYPAD4 0x5c +#define KEYPAD5 0x5d +#define KEYPAD6 0x5e +#define KEYPAD7 0x5f +#define KEYPAD8 0x60 +#define KEYPAD9 0x61 +#define KEYPAD0 0x62 +#define KEYPADPERIOD 0x63 + +// HID Values of System Keys +#define KEYBOARDAPPLICATION 0x65 +#define KEYBOARDPOWER 0x66 +#define VOLUMEMUTE 0x7f +#define VOLUMEUP 0x80 +#define VOLUMEDOWN 0x81 + +// Common-use modifiers +#define CTRL 0x01 +#define SHIFT 0x02 +#define ALT 0x04 +#define GUI 0x08 + + +/**************************************************************************** + * + * ASCII->HID LOOKUP TABLE + * + * Taken from the HID Table definition at + * http://www.usb.org/developers/devclass_docs/Hut1_11.pdf + * + * This array maps the ASCII value of a type-able character to its + * corresponding HID value. + * + * Example: + * 'a' = ASCII value 97 = HID value 0x04 + * HIDTable['a'] = HIDTable[97] = 0x04 + * + * NOTE: + * "Shift Modified" HID values are the same as the non Shift-Modified values + * for any given character, e.g. the HID value for '2' is equal to the + * HID value for '@'. The Shift-Modified value is sent by setting the + * modifier value (buf[0]) to the corresponding modifier value in the + * modifier table. + * + ****************************************************************************/ +const PROGMEM uint8_t HIDTable[] = { + 0x00, // 0 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2A, 0x00, 0x28, // 10 + 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 20 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, // 30 + 0x00, 0x2c, 0x1e, 0x34, 0x20, 0x21, 0x22, 0x24, 0x34, 0x26, // 40 + 0x27, 0x25, 0x2e, 0x36, 0x2d, 0x37, 0x38, 0x27, 0x1e, 0x1f, // 50 + 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x33, 0x33, 0x36, // 60 + 0x2e, 0x37, 0x38, 0x1f, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, // 70 + 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, // 80 + 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, // 90 + 0x2f, 0x31, 0x30, 0x23, 0x2d, 0x35, 0x04, 0x05, 0x06, 0x07, // 100 + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, // 110 + 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, // 120 + 0x1c, 0x1d, 0x2f, 0x31, 0x30, 0x35, 127 // 127 +}; + + +/**************************************************************************** + * + * ASCII->MODIFIER LOOKUP TABLE + * + * Looks up whether or not the HID report should use the SHIFT modifier. + * + * Example: + * The character '2' and the character '@' have different ASCII values but + * the same HID value. This table uses the ASCII value to determine if + * we should hold shift while sending the key. e.g.: + * + * HIDTable['2'] = 0x1f and modifierTable['2'] = 0 + * HIDTable['@'] = 0x1f and modifierTable['@'] = SHIFT + * + * There's probaly a better way to do this, but it's functional. + * + ****************************************************************************/ +const PROGMEM uint8_t modifierTable[] = { + 0x00, // 0 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 10 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 20 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 30 + 0x00, 0x00, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, // 40 + SHIFT, 0x00, SHIFT, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 50 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, SHIFT, 0x00, SHIFT, // 60 + 0x00, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, // 70 + SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, // 80 + SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, // 90 + 0x00, 0x00, 0x00, SHIFT, SHIFT, 0x00, 0x00, 0x00, 0x00, 0x00, // 100 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 110 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 120 + 0x00, 0x00, SHIFT, SHIFT, SHIFT, SHIFT, 0x00 // 127 +}; \ No newline at end of file diff --git a/Firmware/SwitchPro/i2cmaster.S b/Firmware/SwitchPro/i2cmaster.S new file mode 100644 index 0000000..0670117 --- /dev/null +++ b/Firmware/SwitchPro/i2cmaster.S @@ -0,0 +1,366 @@ +;************************************************************************* +; Title : I2C (Single) Master Implementation +; Author: Peter Fleury http://jump.to/fleury +; based on Atmel Appl. Note AVR300 +; File: $Id: i2cmaster.S,v 1.12 2008/03/02 08:51:27 peter Exp $ +; Software: AVR-GCC 3.3 or higher +; Target: any AVR device +; +; DESCRIPTION +; Basic routines for communicating with I2C slave devices. This +; "single" master implementation is limited to one bus master on the +; I2C bus. +; +; Based on the Atmel Application Note AVR300, corrected and adapted +; to GNU assembler and AVR-GCC C call interface +; Replaced the incorrect quarter period delays found in AVR300 with +; half period delays. + +; Tweaked by monty for true 400KHz operation at 8MHz system clock on an +; atmega16u2. Duty cycle adjusted for correct 400KHz spec adherence. +; +; 7 cycles = 0.875us high +; 13 cycles = 1.625us low +; +; USAGE +; These routines can be called from C, refere to file i2cmaster.h. +; See example test_i2cmaster.c +; Adapt the SCL and SDA port and pin definitions and eventually +; the delay routine to your target ! +; Use 4.7k pull-up resistor on the SDA and SCL pin. +; +; NOTES +; The I2C routines can be called either from non-interrupt or +; interrupt routines, not both. +; +;************************************************************************* + +#if (__GNUC__ * 100 + __GNUC_MINOR__) < 303 +#error "This library requires AVR-GCC 3.3 or later, update to newer AVR-GCC compiler !" +#endif + + +#include + + + +;***** Adapt these SCA and SCL port and pin definition to your target !! +; +; V1 had different I2C pinouts +#ifdef V1_BUILD + #define SDA 1 ; SDA Port D, Pin 4 + #define SCL 0 ; SCL Port D, Pin 5 + #define SDA_PORT PORTD + #define SCL_PORT PORTD +#else + #define SDA 4 ; SDA Port D, Pin 4 + #define SCL 3 ; SCL Port D, Pin 3 + #define SDA_PORT PORTD + #define SCL_PORT PORTD +#endif + +;****** + +;-- map the IO register back into the IO address space +#define SDA_DDR (_SFR_IO_ADDR(SDA_PORT) - 1) +#define SCL_DDR (_SFR_IO_ADDR(SCL_PORT) - 1) +#define SDA_OUT _SFR_IO_ADDR(SDA_PORT) +#define SCL_OUT _SFR_IO_ADDR(SCL_PORT) +#define SDA_IN (_SFR_IO_ADDR(SDA_PORT) - 2) +#define SCL_IN (_SFR_IO_ADDR(SCL_PORT) - 2) + + +#ifndef __tmp_reg__ +#define __tmp_reg__ 0 +#endif + + + .section .text + +;************************************************************************* +; delay half period +; For I2C in normal mode (100kHz), use T/2 > 5us +; For I2C in fast mode (400kHz), use T/2 > 1.3us +;************************************************************************* + .stabs "",100,0,0,i2c_delay_T2 + .stabs "i2cmaster.S",100,0,0,i2c_delay_T2 + .func i2c_delay_T2 ; delay 1.25 microsec with 8 Mhz crystal +i2c_delay_T2: ; 4 cycles + ret ; 5 " + .endfunc ; total 9 cyles = 1.25 microsec with 8 Mhz crystal, IO op happens on the 10th + +;************************************************************************* +; delay 40 microseconds, to give the slave time to do stuff +;************************************************************************* + .func i2c_delay_40us +i2c_delay_40us: ; 4 cycles + push r16 ; 2 + ldi r16, 102 ; 1 +delay: + dec r16 ; 1 + brne delay ; 2 + ; 1 + pop r16 ; 2 + ret ; 5 + .endfunc ; total 321 cyles almost 40 microsec with 8 Mhz crystal + + +;************************************************************************* +; Initialization of the I2C bus interface. Need to be called only once +; +; extern void i2c_init(void) +;************************************************************************* + .global i2c_init + .func i2c_init +i2c_init: + cbi SDA_DDR,SDA ;release SDA + cbi SCL_DDR,SCL ;release SCL + cbi SDA_OUT,SDA + cbi SCL_OUT,SCL + ret + .endfunc + + +;************************************************************************* +; Issues a start condition and sends address and transfer direction. +; return 0 = device accessible, 1= failed to access device +; +; extern unsigned char i2c_start(unsigned char addr); +; addr = r24, return = r25(=0):r24 +;************************************************************************* + + .global i2c_start + .func i2c_start +i2c_start: + sbi SDA_DDR,SDA ;force SDA low + rcall i2c_delay_T2 ;delay T/2 + + rcall i2c_write ;write address + ret + .endfunc + + +;************************************************************************* +; Issues a repeated start condition and sends address and transfer direction. +; return 0 = device accessible, 1= failed to access device +; +; extern unsigned char i2c_rep_start(unsigned char addr); +; addr = r24, return = r25(=0):r24 +;************************************************************************* + + .global i2c_rep_start + .func i2c_rep_start +i2c_rep_start: + sbi SCL_DDR,SCL ;force SCL low + rcall i2c_delay_T2 ;delay T/2 + cbi SDA_DDR,SDA ;release SDA + rcall i2c_delay_T2 ;delay T/2 + cbi SCL_DDR,SCL ;release SCL + rcall i2c_delay_T2 ;delay T/2 + sbi SDA_DDR,SDA ;force SDA low + rcall i2c_delay_T2 ;delay T/2 + + rcall i2c_write ;write address + ret + .endfunc + + +;************************************************************************* +; Issues a start condition and sends address and transfer direction. +; If device is busy, use ack polling to wait until device is ready +; +; extern void i2c_start_wait(unsigned char addr); +; addr = r24 +;************************************************************************* + + .global i2c_start_wait + .func i2c_start_wait +i2c_start_wait: + mov __tmp_reg__,r24 +i2c_start_wait1: + sbi SDA_DDR,SDA ;force SDA low + rcall i2c_delay_T2 ;delay T/2 + mov r24,__tmp_reg__ + rcall i2c_write ;write address + tst r24 ;if device not busy -> done + breq i2c_start_wait_done + rcall i2c_stop ;terminate write operation + rjmp i2c_start_wait1 ;device busy, poll ack again +i2c_start_wait_done: + ret + .endfunc + + +;************************************************************************* +; Terminates the data transfer and releases the I2C bus +; +; extern void i2c_stop(void) +;************************************************************************* + + .global i2c_stop + .func i2c_stop +i2c_stop: + sbi SCL_DDR,SCL ;force SCL low + sbi SDA_DDR,SDA ;force SDA low + rcall i2c_delay_T2 ;delay T/2 + cbi SCL_DDR,SCL ;release SCL + rcall i2c_delay_T2 ;delay T/2 +i2c_stop_wait: + ;wait SCL high (in case wait states are inserted) + sbis SCL_IN,SCL ; 2 + rjmp i2c_stop_wait + cbi SDA_DDR,SDA ;release SDA + rcall i2c_delay_T2 ;delay T/2 + rcall i2c_delay_40us ; delay 40us to let slave catch its breath + ret + .endfunc + + +;************************************************************************* +; Send one byte to I2C device +; return 0 = write successful, 1 = write failed +; +; extern unsigned char i2c_write( unsigned char data ); +; data = r24, return = r25(=0):r24 +;************************************************************************* + .global i2c_write + .func i2c_write +i2c_write: + sec ;set carry flag ; + rol r24 ;shift in carry and out bit one ; + rjmp i2c_write_first ; +i2c_write_bit: + lsl r24 ;if transmit register empty ; 1 + breq i2c_get_ack ; 1 + nop ; 1 +i2c_write_first: + ; 7 since the last cbi + sbi SCL_DDR,SCL ;force SCL low ; 2 + brcc i2c_write_low ; 1 + nop ; 1 + cbi SDA_DDR,SDA ;release SDA ; 2 + rjmp i2c_write_high ; 2 +i2c_write_low: ; 1 + sbi SDA_DDR,SDA ;force SDA low ; 2 + rjmp i2c_write_high ; 2 +i2c_write_high: + nop + nop + nop + nop + nop + ; 13 since the last + cbi SCL_DDR,SCL ;release SCL ; 2 +i2c_write_wait: + ;wait SCL high (in case wait states are inserted) + sbis SCL_IN,SCL ; 2 + rjmp i2c_write_wait + + rjmp i2c_write_bit ; 2 + +i2c_get_ack: ; 1 + sbi SCL_DDR,SCL ;force SCL low + cbi SDA_DDR,SDA ;release SDA + nop + nop + nop + nop + nop + nop + nop + nop + nop + cbi SCL_DDR,SCL ;release SCL +i2c_ack_wait: + sbis SCL_IN,SCL ;wait SCL high (in case wait states are inserted) + rjmp i2c_ack_wait + + clr r24 ;return 0 + sbic SDA_IN,SDA ;if SDA high -> return 1 + ldi r24,1 + sbi SCL_DDR,SCL ;force SCL low + rcall i2c_delay_T2 ;delay T/2 + clr r25 + ret + .endfunc + + + +;************************************************************************* +; read one byte from the I2C device, send ack or nak to device +; (ack=1, send ack, request more data from device +; ack=0, send nak, read is followed by a stop condition) +; +; extern unsigned char i2c_read(unsigned char ack); +; ack = r24, return = r25(=0):r24 +; extern unsigned char i2c_readAck(void); +; extern unsigned char i2c_readNak(void); +; return = r25(=0):r24 +;************************************************************************* + .global i2c_readAck + .global i2c_readNak + .global i2c_read + .func i2c_read +i2c_readNak: + clr r24 + rjmp i2c_read +i2c_readAck: + ldi r24,0x01 +i2c_read: + ldi r23,0x01 ;data = 0x01 +i2c_read_bit: + sbi SCL_DDR,SCL ;force SCL low ; 2 + nop ; 1 + nop ; 1 + nop ; 1 + nop ; 1 + nop ; 1 + nop ; 1 + nop ; 1 + nop ; 1 + nop ; 1 + nop ; 1 + nop ; 1 + + cbi SCL_DDR,SCL ;release SCL ; 2 + +i2c_read_stretch: + ;loop until SCL is high (allow slave to stretch SCL) + sbis SCL_IN, SCL ; 2 + rjmp i2c_read_stretch + ; + clc ;clear carry flag ; 1 + sbic SDA_IN,SDA ;if SDA is high ; 2 + sec ; set carry flag + ; + rol r23 ;store bit ; 1 + ;while receive register not full + brcc i2c_read_bit ; 2 + +i2c_put_ack: + sbi SCL_DDR,SCL ;force SCL low + cpi r24,1 + breq i2c_put_ack_low ;if (ack=0) + cbi SDA_DDR,SDA ; release SDA + rjmp i2c_put_ack_high +i2c_put_ack_low: ;else + sbi SDA_DDR,SDA ; force SDA low + nop +i2c_put_ack_high: + nop + nop + nop + nop + nop + cbi SCL_DDR,SCL ;release SCL +i2c_put_ack_wait: + sbis SCL_IN,SCL ;wait SCL high + rjmp i2c_put_ack_wait + nop + mov r24,r23 + clr r25 + sbi SCL_DDR,SCL ;force SCL low + cbi SDA_DDR,SDA ;release SDA + ret + .endfunc + diff --git a/Firmware/SwitchPro/i2cmaster.h b/Firmware/SwitchPro/i2cmaster.h new file mode 100644 index 0000000..3917b9e --- /dev/null +++ b/Firmware/SwitchPro/i2cmaster.h @@ -0,0 +1,178 @@ +#ifndef _I2CMASTER_H +#define _I2CMASTER_H 1 +/************************************************************************* +* Title: C include file for the I2C master interface +* (i2cmaster.S or twimaster.c) +* Author: Peter Fleury http://jump.to/fleury +* File: $Id: i2cmaster.h,v 1.10 2005/03/06 22:39:57 Peter Exp $ +* Software: AVR-GCC 3.4.3 / avr-libc 1.2.3 +* Target: any AVR device +* Usage: see Doxygen manual +**************************************************************************/ + +#ifdef DOXYGEN +/** + @defgroup pfleury_ic2master I2C Master library + @code #include @endcode + + @brief I2C (TWI) Master Software Library + + Basic routines for communicating with I2C slave devices. This single master + implementation is limited to one bus master on the I2C bus. + + This I2c library is implemented as a compact assembler software implementation of the I2C protocol + which runs on any AVR (i2cmaster.S) and as a TWI hardware interface for all AVR with built-in TWI hardware (twimaster.c). + Since the API for these two implementations is exactly the same, an application can be linked either against the + software I2C implementation or the hardware I2C implementation. + + Use 4.7k pull-up resistor on the SDA and SCL pin. + + Adapt the SCL and SDA port and pin definitions and eventually the delay routine in the module + i2cmaster.S to your target when using the software I2C implementation ! + + Adjust the CPU clock frequence F_CPU in twimaster.c or in the Makfile when using the TWI hardware implementaion. + + @note + The module i2cmaster.S is based on the Atmel Application Note AVR300, corrected and adapted + to GNU assembler and AVR-GCC C call interface. + Replaced the incorrect quarter period delays found in AVR300 with + half period delays. + + @author Peter Fleury pfleury@gmx.ch http://jump.to/fleury + + @par API Usage Example + The following code shows typical usage of this library, see example test_i2cmaster.c + + @code + + #include + + + #define Dev24C02 0xA2 // device address of EEPROM 24C02, see datasheet + + int main(void) + { + unsigned char ret; + + i2c_init(); // initialize I2C library + + // write 0x75 to EEPROM address 5 (Byte Write) + i2c_start_wait(Dev24C02+I2C_WRITE); // set device address and write mode + i2c_write(0x05); // write address = 5 + i2c_write(0x75); // write value 0x75 to EEPROM + i2c_stop(); // set stop conditon = release bus + + + // read previously written value back from EEPROM address 5 + i2c_start_wait(Dev24C02+I2C_WRITE); // set device address and write mode + + i2c_write(0x05); // write address = 5 + i2c_rep_start(Dev24C02+I2C_READ); // set device address and read mode + + ret = i2c_readNak(); // read one byte from EEPROM + i2c_stop(); + + for(;;); + } + @endcode + +*/ +#endif /* DOXYGEN */ + +/**@{*/ + +#if (__GNUC__ * 100 + __GNUC_MINOR__) < 304 +#error "This library requires AVR-GCC 3.4 or later, update to newer AVR-GCC compiler !" +#endif + +#include + +/** defines the data direction (reading from I2C device) in i2c_start(),i2c_rep_start() */ +#define I2C_READ 1 + +/** defines the data direction (writing to I2C device) in i2c_start(),i2c_rep_start() */ +#define I2C_WRITE 0 + + +/** + @brief initialize the I2C master interace. Need to be called only once + @param void + @return none + */ +extern void i2c_init(void); + + +/** + @brief Terminates the data transfer and releases the I2C bus + @param void + @return none + */ +extern void i2c_stop(void); + + +/** + @brief Issues a start condition and sends address and transfer direction + + @param addr address and transfer direction of I2C device + @retval 0 device accessible + @retval 1 failed to access device + */ +extern unsigned char i2c_start(unsigned char addr); + + +/** + @brief Issues a repeated start condition and sends address and transfer direction + + @param addr address and transfer direction of I2C device + @retval 0 device accessible + @retval 1 failed to access device + */ +extern unsigned char i2c_rep_start(unsigned char addr); + + +/** + @brief Issues a start condition and sends address and transfer direction + + If device is busy, use ack polling to wait until device ready + @param addr address and transfer direction of I2C device + @return none + */ +extern void i2c_start_wait(unsigned char addr); + + +/** + @brief Send one byte to I2C device + @param data byte to be transfered + @retval 0 write successful + @retval 1 write failed + */ +extern unsigned char i2c_write(unsigned char data); + + +/** + @brief read one byte from the I2C device, request more data from device + @return byte read from I2C device + */ +extern unsigned char i2c_readAck(void); + +/** + @brief read one byte from the I2C device, read is followed by a stop condition + @return byte read from I2C device + */ +extern unsigned char i2c_readNak(void); + +/** + @brief read one byte from the I2C device + + Implemented as a macro, which calls either i2c_readAck or i2c_readNak + + @param ack 1 send ack, request more data from device
+ 0 send nak, read is followed by a stop condition + @return byte read from I2C device + */ +extern unsigned char i2c_read(unsigned char ack); +#define i2c_read(ack) (ack) ? i2c_readAck() : i2c_readNak(); + + +/**@}*/ +#endif diff --git a/Firmware/SwitchPro/makefile b/Firmware/SwitchPro/makefile new file mode 100644 index 0000000..2105803 --- /dev/null +++ b/Firmware/SwitchPro/makefile @@ -0,0 +1,85 @@ +# +# LUFA Library +# Copyright (C) Dean Camera, 2014. +# +# dean [at] fourwalledcubicle [dot] com +# www.lufa-lib.org +# +# -------------------------------------- +# LUFA Project Makefile. +# -------------------------------------- + +# Run "make help" for target help. + +MCU = atmega16u2 +ARCH = AVR8 +#BOARD = USER +F_CPU = 8000000 +F_USB = $(F_CPU) +OPTIMIZATION = s +TARGET = Joystick +SRC = $(TARGET).c Descriptors.c i2cmaster.S Config.c usbio.c $(LUFA_SRC_USB) +LUFA_PATH = ../LUFA +CC_FLAGS = -DUSE_LUFA_CONFIG_HEADER -IConfig/ +LD_FLAGS = + +AVRDUDE = avrdude -B 8 -c usbasp -p $(MCU) + + +# Default target +all: + +# Include LUFA-specific DMBS extension modules +DMBS_LUFA_PATH ?= $(LUFA_PATH)/Build/LUFA +include $(DMBS_LUFA_PATH)/lufa-sources.mk +include $(DMBS_LUFA_PATH)/lufa-gcc.mk + +# Include LUFA build script makefiles +DMBS_PATH ?= $(LUFA_PATH)/Build/DMBS/DMBS +include $(LUFA_PATH)/Build/lufa_core.mk +include $(LUFA_PATH)/Build/lufa_sources.mk +include $(LUFA_PATH)/Build/lufa_build.mk +include $(LUFA_PATH)/Build/lufa_cppcheck.mk +include $(LUFA_PATH)/Build/lufa_doxygen.mk +include $(LUFA_PATH)/Build/lufa_dfu.mk +include $(LUFA_PATH)/Build/lufa_hid.mk +include $(LUFA_PATH)/Build/lufa_avrdude.mk +include $(LUFA_PATH)/Build/lufa_atprogram.mk + +v1: CC_FLAGS += -DV1_BUILD +v1: clean all + +debug: CC_FLAGS += -DDEBUG +debug: clean flash + +v1debug: CC_FLAGS += -DV1_BUILD -DDEBUG +v1debug: clean all + +init: erase wfuse flashboot flash + +initboot: erase wfuse flashboot + +erase: + $(AVRDUDE) -e + +rfuse: + $(AVRDUDE) -U hfuse:r:-:h -U lfuse:r:-:h -U efuse:r:-:h + +wfuse: + $(AVRDUDE) -U lfuse:w:0xde:m -U hfuse:w:0xdb:m -U efuse:w:0xf6:m + +# To make this hex, compile HID Bootloader in LUFA +# FLASH_SIZE_KB := 16 +# BOOT_SECTION_SIZE_KB := 2 +# MCU = atmega16u2 +# ARCH = AVR8 +flashboot: + $(AVRDUDE) -U flash:w:DFU/BootloaderHID.hex:i + +flash: all + sleep 1 + python2 DFU/hid_bootloader_loader.py atmega16u2 Joystick.hex + +flashC: all + sleep 1 + ../../lufa-LUFA-170418/Bootloaders/HID/HostLoaderApp/hid_bootloader_cli -mmcu=atmega16u2 -r Joystick.hex \ No newline at end of file diff --git a/Firmware/SwitchPro/usbio.c b/Firmware/SwitchPro/usbio.c new file mode 100644 index 0000000..37f250f --- /dev/null +++ b/Firmware/SwitchPro/usbio.c @@ -0,0 +1,114 @@ +/* + * FILE: usbio.c + * + * Original UART code by Peter Sutton. + * Adapted for USB by William Toohey. + * + * Module to allow standard output routines to be used via + * USB keyboard typing. The init_serial_stdio() method must be called before + * any standard IO methods (e.g. printf). We use a circular buffer to + * store output messages. + */ + +#include +#include +#include + +#include + +/* Global variables */ +/* Circular buffer to hold outgoing characters. The insert_pos variable + * keeps track of the position (0 to OUTPUT_BUFFER_SIZE-1) that the next + * outgoing character should be written to. bytes_in_buffer keeps + * count of the number of characters currently stored in the buffer + * (ranging from 0 to OUTPUT_BUFFER_SIZE). This number of bytes immediately + * prior to the current insert_pos are the bytes waiting to be output. + * If the insert_pos reaches the end of the buffer it will wrap around + * to the beginning (assuming those bytes have been output). + * NOTE - OUTPUT_BUFFER_SIZE can not be larger than 255 without changing + * the type of the variables below. + */ +#define OUTPUT_BUFFER_SIZE 255 +char out_buffer[OUTPUT_BUFFER_SIZE]; +uint8_t out_insert_pos; +uint8_t bytes_in_out_buffer; +// Whether we should be depressing or releasing a key +uint8_t liftoff = 0; + +static int usb_put_char(char, FILE*); + +/* Setup a stream that uses the uart get and put functions. We will + * make standard input and output use this stream below. + */ +static FILE myStream = FDEV_SETUP_STREAM(usb_put_char, NULL, + _FDEV_SETUP_WRITE); + +void init_usb_stdio(void) { + /* + * Initialise our buffers + */ + out_insert_pos = 0; + bytes_in_out_buffer = 0; + + /* Set up our stream so the put function below is used + * to write characters via the USB port when we use + * stdio functions + */ + stdout = &myStream; +} + +static int usb_put_char(char c, FILE* stream) { + /* Add the character to the buffer for transmission if there + * is space to do so. We advance the insert_pos to the next + * character position. If this is beyond the end of the buffer + * we wrap around back to the beginning of the buffer + */ + // Drop overrun + if(bytes_in_out_buffer >= OUTPUT_BUFFER_SIZE) { + return 0; + } + out_buffer[out_insert_pos++] = c; + bytes_in_out_buffer++; + if(out_insert_pos == OUTPUT_BUFFER_SIZE) { + /* Wrap around buffer pointer if necessary */ + out_insert_pos = 0; + } + return 0; +} + +int make_report(USB_KeyboardReport_Data_t *KeyboardReport) { + if(liftoff) { + liftoff = 0; + return 1; + } else { + /* Check if we have data in our buffer */ + if(bytes_in_out_buffer > 0) { + /* Yes we do - remove the pending byte and output it + * via the USB. The pending byte (character) is the + * one which is "bytes_in_buffer" characters before the + * insert_pos (taking into account that we may + * need to wrap around to the end of the buffer). + */ + char c; + if(out_insert_pos - bytes_in_out_buffer < 0) { + /* Need to wrap around */ + c = out_buffer[out_insert_pos - bytes_in_out_buffer + + OUTPUT_BUFFER_SIZE]; + } else { + c = out_buffer[out_insert_pos - bytes_in_out_buffer]; + } + /* Decrement our count of the number of bytes in the + * buffer + */ + bytes_in_out_buffer--; + + /* Output the character via USB, converting to scancode */ + KeyboardReport->KeyCode[0] = pgm_read_byte(&HIDTable[(uint8_t)c]); + KeyboardReport->Modifier = pgm_read_byte(&modifierTable[(uint8_t)c]); + liftoff = 1; + return 1; + } else { + return 0; + } + } +} diff --git a/Firmware/SwitchPro/usbio.h b/Firmware/SwitchPro/usbio.h new file mode 100644 index 0000000..e3e379d --- /dev/null +++ b/Firmware/SwitchPro/usbio.h @@ -0,0 +1,20 @@ +/* + * serialio.h + * + * Author: Peter Sutton + * + * Modified by William Toohey + */ + +#ifndef SERIALIO_H_ +#define SERIALIO_H_ + +#include +#include + +/* Initialise IO using USB. + */ +void init_usb_stdio(void); +int make_report(USB_KeyboardReport_Data_t*); + +#endif /* SERIALIO_H_ */ \ No newline at end of file From c457c3a9f8e1c404f4ebc4426d0c5256316f48ed Mon Sep 17 00:00:00 2001 From: Fergus Leahy Date: Wed, 5 Sep 2018 11:03:24 +0100 Subject: [PATCH 02/15] Updated LUFA version to support Switch --- Firmware/LUFA/Build/DMBS/.gitignore | 9 + .../HID_EEPROM_Loader/HID_EEPROM_Loader.c | 39 + .../DMBS/DMBS/HID_EEPROM_Loader/makefile | 35 + Firmware/LUFA/Build/DMBS/DMBS/License.txt | 32 + .../LUFA/Build/DMBS/DMBS/ModulesOverview.md | 38 + .../Build/DMBS/DMBS/WritingYourOwnModules.md | 94 + Firmware/LUFA/Build/DMBS/DMBS/atprogram.md | 119 ++ Firmware/LUFA/Build/DMBS/DMBS/atprogram.mk | 68 + Firmware/LUFA/Build/DMBS/DMBS/avrdude.md | 124 ++ Firmware/LUFA/Build/DMBS/DMBS/avrdude.mk | 52 + Firmware/LUFA/Build/DMBS/DMBS/core.md | 136 ++ Firmware/LUFA/Build/DMBS/DMBS/core.mk | 147 ++ Firmware/LUFA/Build/DMBS/DMBS/cppcheck.md | 134 ++ Firmware/LUFA/Build/DMBS/DMBS/cppcheck.mk | 66 + Firmware/LUFA/Build/DMBS/DMBS/dfu.md | 122 ++ Firmware/LUFA/Build/DMBS/DMBS/dfu.mk | 62 + Firmware/LUFA/Build/DMBS/DMBS/doxygen.md | 118 ++ Firmware/LUFA/Build/DMBS/DMBS/doxygen.mk | 62 + Firmware/LUFA/Build/DMBS/DMBS/gcc.md | 204 ++ Firmware/LUFA/Build/DMBS/DMBS/gcc.mk | 270 +++ Firmware/LUFA/Build/DMBS/DMBS/hid.md | 129 ++ Firmware/LUFA/Build/DMBS/DMBS/hid.mk | 57 + Firmware/LUFA/Build/DMBS/Readme.md | 123 ++ Firmware/LUFA/Build/DMBS/Template/Template.c | 12 + Firmware/LUFA/Build/DMBS/Template/makefile | 32 + Firmware/LUFA/Build/LUFA/lufa-gcc.mk | 43 + Firmware/LUFA/Build/LUFA/lufa-sources.mk | 95 + Firmware/LUFA/Build/lufa_atprogram.mk | 99 +- Firmware/LUFA/Build/lufa_avrdude.mk | 82 +- Firmware/LUFA/Build/lufa_build.mk | 349 +--- Firmware/LUFA/Build/lufa_core.mk | 171 +- Firmware/LUFA/Build/lufa_cppcheck.mk | 103 +- Firmware/LUFA/Build/lufa_dfu.mk | 91 +- Firmware/LUFA/Build/lufa_doxygen.mk | 96 +- Firmware/LUFA/Build/lufa_hid.mk | 92 +- Firmware/LUFA/Build/lufa_sources.mk | 140 +- .../DeviceTemplate/Descriptors.c | 6 +- .../DeviceTemplate/Descriptors.h | 4 +- .../DeviceTemplate/DeviceApplication.c | 4 +- .../DeviceTemplate/DeviceApplication.h | 4 +- .../LUFA/CodeTemplates/DeviceTemplate/asf.xml | 110 +- .../LUFA/CodeTemplates/DriverStubs/Board.h | 4 +- .../LUFA/CodeTemplates/DriverStubs/Buttons.h | 4 +- .../CodeTemplates/DriverStubs/Dataflash.h | 4 +- .../LUFA/CodeTemplates/DriverStubs/Joystick.h | 4 +- .../LUFA/CodeTemplates/DriverStubs/LEDs.h | 4 +- .../HostTemplate/HostApplication.c | 6 +- .../HostTemplate/HostApplication.h | 4 +- .../LUFA/CodeTemplates/HostTemplate/asf.xml | 82 +- Firmware/LUFA/CodeTemplates/LUFAConfig.h | 4 +- Firmware/LUFA/CodeTemplates/makefile_template | 27 +- Firmware/LUFA/Common/ArchitectureSpecific.h | 4 +- Firmware/LUFA/Common/Architectures.h | 4 +- Firmware/LUFA/Common/Attributes.h | 4 +- Firmware/LUFA/Common/BoardTypes.h | 10 +- Firmware/LUFA/Common/Common.h | 4 +- Firmware/LUFA/Common/CompilerSpecific.h | 4 +- Firmware/LUFA/Common/Endianness.h | 8 +- Firmware/LUFA/DoxygenPages/BuildSystem.txt | 1256 +++--------- Firmware/LUFA/DoxygenPages/ChangeLog.txt | 56 + .../LUFA/DoxygenPages/CompileTimeTokens.txt | 4 +- .../LUFA/DoxygenPages/DevelopingWithLUFA.txt | 1 - Firmware/LUFA/DoxygenPages/DeviceSupport.txt | 2 + Firmware/LUFA/DoxygenPages/Donating.txt | 7 +- Firmware/LUFA/DoxygenPages/KnownIssues.txt | 64 + .../LUFA/DoxygenPages/LUFAPoweredProjects.txt | 2 + .../DoxygenPages/MigrationInformation.txt | 9 + .../LUFA/DoxygenPages/ProgrammingApps.txt | 3 - .../DoxygenPages/SoftwareBootloaderJump.txt | 2 +- .../Drivers/Board/AVR8/ADAFRUITU4/Board.h | 4 +- .../LUFA/Drivers/Board/AVR8/ADAFRUITU4/LEDs.h | 4 +- .../Drivers/Board/AVR8/ATAVRUSBRF01/Board.h | 4 +- .../Drivers/Board/AVR8/ATAVRUSBRF01/Buttons.h | 4 +- .../Drivers/Board/AVR8/ATAVRUSBRF01/LEDs.h | 4 +- .../LUFA/Drivers/Board/AVR8/BENITO/Board.h | 4 +- .../LUFA/Drivers/Board/AVR8/BENITO/Buttons.h | 4 +- .../LUFA/Drivers/Board/AVR8/BENITO/LEDs.h | 4 +- .../LUFA/Drivers/Board/AVR8/BIGMULTIO/Board.h | 4 +- .../LUFA/Drivers/Board/AVR8/BIGMULTIO/LEDs.h | 4 +- .../LUFA/Drivers/Board/AVR8/BLACKCAT/Board.h | 4 +- .../LUFA/Drivers/Board/AVR8/BLACKCAT/LEDs.h | 4 +- Firmware/LUFA/Drivers/Board/AVR8/BUI/Board.h | 4 +- Firmware/LUFA/Drivers/Board/AVR8/BUI/LEDs.h | 4 +- .../LUFA/Drivers/Board/AVR8/BUMBLEB/Board.h | 4 +- .../LUFA/Drivers/Board/AVR8/BUMBLEB/Buttons.h | 4 +- .../Drivers/Board/AVR8/BUMBLEB/Joystick.h | 4 +- .../LUFA/Drivers/Board/AVR8/BUMBLEB/LEDs.h | 4 +- .../LUFA/Drivers/Board/AVR8/CULV3/Board.h | 4 +- .../LUFA/Drivers/Board/AVR8/CULV3/Buttons.h | 4 +- Firmware/LUFA/Drivers/Board/AVR8/CULV3/LEDs.h | 4 +- Firmware/LUFA/Drivers/Board/AVR8/DUCE/Board.h | 4 +- Firmware/LUFA/Drivers/Board/AVR8/DUCE/LEDs.h | 4 +- .../LUFA/Drivers/Board/AVR8/EVK527/Board.h | 4 +- .../LUFA/Drivers/Board/AVR8/EVK527/Buttons.h | 4 +- .../Drivers/Board/AVR8/EVK527/Dataflash.h | 4 +- .../LUFA/Drivers/Board/AVR8/EVK527/Joystick.h | 4 +- .../LUFA/Drivers/Board/AVR8/EVK527/LEDs.h | 4 +- .../LUFA/Drivers/Board/AVR8/JMDBU2/Board.h | 4 +- .../LUFA/Drivers/Board/AVR8/JMDBU2/Buttons.h | 4 +- .../LUFA/Drivers/Board/AVR8/JMDBU2/LEDs.h | 4 +- .../LUFA/Drivers/Board/AVR8/LEONARDO/Board.h | 4 +- .../LUFA/Drivers/Board/AVR8/LEONARDO/LEDs.h | 4 +- .../LUFA/Drivers/Board/AVR8/MAXIMUS/Board.h | 4 +- .../LUFA/Drivers/Board/AVR8/MAXIMUS/LEDs.h | 4 +- .../LUFA/Drivers/Board/AVR8/MICRO/Board.h | 4 +- Firmware/LUFA/Drivers/Board/AVR8/MICRO/LEDs.h | 4 +- .../Drivers/Board/AVR8/MICROPENDOUS/Board.h | 4 +- .../Drivers/Board/AVR8/MICROPENDOUS/Buttons.h | 4 +- .../Drivers/Board/AVR8/MICROPENDOUS/LEDs.h | 4 +- .../Drivers/Board/AVR8/MICROSIN162/Board.h | 4 +- .../Drivers/Board/AVR8/MICROSIN162/Buttons.h | 4 +- .../Drivers/Board/AVR8/MICROSIN162/LEDs.h | 4 +- .../LUFA/Drivers/Board/AVR8/MINIMUS/Board.h | 4 +- .../LUFA/Drivers/Board/AVR8/MINIMUS/Buttons.h | 4 +- .../LUFA/Drivers/Board/AVR8/MINIMUS/LEDs.h | 4 +- .../LUFA/Drivers/Board/AVR8/MULTIO/Board.h | 4 +- .../LUFA/Drivers/Board/AVR8/MULTIO/LEDs.h | 4 +- .../LUFA/Drivers/Board/AVR8/OLIMEX162/Board.h | 4 +- .../Drivers/Board/AVR8/OLIMEX162/Buttons.h | 4 +- .../LUFA/Drivers/Board/AVR8/OLIMEX162/LEDs.h | 4 +- .../Drivers/Board/AVR8/OLIMEX32U4/Board.h | 4 +- .../Drivers/Board/AVR8/OLIMEX32U4/Buttons.h | 4 +- .../LUFA/Drivers/Board/AVR8/OLIMEX32U4/LEDs.h | 4 +- .../Drivers/Board/AVR8/OLIMEXISPMK2/Board.h | 4 +- .../Drivers/Board/AVR8/OLIMEXISPMK2/Buttons.h | 4 +- .../Drivers/Board/AVR8/OLIMEXISPMK2/LEDs.h | 4 +- .../Drivers/Board/AVR8/OLIMEXT32U4/Board.h | 4 +- .../Drivers/Board/AVR8/OLIMEXT32U4/Buttons.h | 4 +- .../Drivers/Board/AVR8/OLIMEXT32U4/LEDs.h | 4 +- .../Drivers/Board/AVR8/POLOLUMICRO/Board.h | 79 + .../Drivers/Board/AVR8/POLOLUMICRO/LEDs.h | 154 ++ .../Drivers/Board/AVR8/RZUSBSTICK/Board.h | 4 +- .../LUFA/Drivers/Board/AVR8/RZUSBSTICK/LEDs.h | 4 +- .../Drivers/Board/AVR8/SPARKFUN8U2/Board.h | 4 +- .../Drivers/Board/AVR8/SPARKFUN8U2/LEDs.h | 4 +- .../Drivers/Board/AVR8/STANGE_ISP/Board.h | 4 +- .../Drivers/Board/AVR8/STANGE_ISP/Buttons.h | 4 +- .../LUFA/Drivers/Board/AVR8/STANGE_ISP/LEDs.h | 4 +- .../LUFA/Drivers/Board/AVR8/STK525/Board.h | 4 +- .../LUFA/Drivers/Board/AVR8/STK525/Buttons.h | 4 +- .../Drivers/Board/AVR8/STK525/Dataflash.h | 4 +- .../LUFA/Drivers/Board/AVR8/STK525/Joystick.h | 4 +- .../LUFA/Drivers/Board/AVR8/STK525/LEDs.h | 4 +- .../LUFA/Drivers/Board/AVR8/STK526/Board.h | 4 +- .../LUFA/Drivers/Board/AVR8/STK526/Buttons.h | 4 +- .../Drivers/Board/AVR8/STK526/Dataflash.h | 4 +- .../LUFA/Drivers/Board/AVR8/STK526/Joystick.h | 4 +- .../LUFA/Drivers/Board/AVR8/STK526/LEDs.h | 4 +- .../LUFA/Drivers/Board/AVR8/TEENSY/Board.h | 4 +- .../LUFA/Drivers/Board/AVR8/TEENSY/LEDs.h | 4 +- Firmware/LUFA/Drivers/Board/AVR8/TUL/Board.h | 4 +- .../LUFA/Drivers/Board/AVR8/TUL/Buttons.h | 4 +- Firmware/LUFA/Drivers/Board/AVR8/TUL/LEDs.h | 4 +- Firmware/LUFA/Drivers/Board/AVR8/U2S/Board.h | 4 +- .../LUFA/Drivers/Board/AVR8/U2S/Buttons.h | 4 +- Firmware/LUFA/Drivers/Board/AVR8/U2S/LEDs.h | 4 +- Firmware/LUFA/Drivers/Board/AVR8/UDIP/Board.h | 4 +- .../LUFA/Drivers/Board/AVR8/UDIP/Buttons.h | 4 +- Firmware/LUFA/Drivers/Board/AVR8/UDIP/LEDs.h | 4 +- Firmware/LUFA/Drivers/Board/AVR8/UNO/Board.h | 10 +- Firmware/LUFA/Drivers/Board/AVR8/UNO/LEDs.h | 20 +- .../LUFA/Drivers/Board/AVR8/USB2AX/Board.h | 4 +- .../LUFA/Drivers/Board/AVR8/USB2AX/Buttons.h | 4 +- .../LUFA/Drivers/Board/AVR8/USB2AX/LEDs.h | 4 +- .../LUFA/Drivers/Board/AVR8/USBFOO/Board.h | 4 +- .../LUFA/Drivers/Board/AVR8/USBFOO/Buttons.h | 4 +- .../LUFA/Drivers/Board/AVR8/USBFOO/LEDs.h | 4 +- .../LUFA/Drivers/Board/AVR8/USBKEY/Board.h | 4 +- .../LUFA/Drivers/Board/AVR8/USBKEY/Buttons.h | 4 +- .../Drivers/Board/AVR8/USBKEY/Dataflash.h | 4 +- .../LUFA/Drivers/Board/AVR8/USBKEY/Joystick.h | 4 +- .../LUFA/Drivers/Board/AVR8/USBKEY/LEDs.h | 4 +- .../Drivers/Board/AVR8/USBTINYMKII/Board.h | 4 +- .../Drivers/Board/AVR8/USBTINYMKII/Buttons.h | 4 +- .../Drivers/Board/AVR8/USBTINYMKII/LEDs.h | 4 +- .../LUFA/Drivers/Board/AVR8/XPLAIN/Board.h | 4 +- .../Drivers/Board/AVR8/XPLAIN/Dataflash.h | 4 +- .../LUFA/Drivers/Board/AVR8/XPLAIN/LEDs.h | 4 +- .../Drivers/Board/AVR8/XPLAINED_MINI/Board.h | 78 + .../Drivers/Board/AVR8/XPLAINED_MINI/LEDs.h | 135 ++ Firmware/LUFA/Drivers/Board/AVR8/YUN/Board.h | 4 +- Firmware/LUFA/Drivers/Board/AVR8/YUN/LEDs.h | 4 +- Firmware/LUFA/Drivers/Board/Board.h | 8 +- Firmware/LUFA/Drivers/Board/Buttons.h | 9 +- Firmware/LUFA/Drivers/Board/Dataflash.h | 4 +- Firmware/LUFA/Drivers/Board/Joystick.h | 9 +- Firmware/LUFA/Drivers/Board/LEDs.h | 22 +- Firmware/LUFA/Drivers/Board/Temperature.c | 4 +- Firmware/LUFA/Drivers/Board/Temperature.h | 4 +- .../LUFA/Drivers/Board/UC3/EVK1100/Board.h | 4 +- .../LUFA/Drivers/Board/UC3/EVK1100/Buttons.h | 4 +- .../LUFA/Drivers/Board/UC3/EVK1100/Joystick.h | 4 +- .../LUFA/Drivers/Board/UC3/EVK1100/LEDs.h | 4 +- .../LUFA/Drivers/Board/UC3/EVK1101/Board.h | 4 +- .../LUFA/Drivers/Board/UC3/EVK1101/Buttons.h | 4 +- .../LUFA/Drivers/Board/UC3/EVK1101/Joystick.h | 4 +- .../LUFA/Drivers/Board/UC3/EVK1101/LEDs.h | 4 +- .../LUFA/Drivers/Board/UC3/EVK1104/Board.h | 4 +- .../LUFA/Drivers/Board/UC3/EVK1104/Buttons.h | 4 +- .../LUFA/Drivers/Board/UC3/EVK1104/LEDs.h | 4 +- .../Drivers/Board/UC3/UC3A3_XPLAINED/Board.h | 4 +- .../Board/UC3/UC3A3_XPLAINED/Buttons.h | 4 +- .../Drivers/Board/UC3/UC3A3_XPLAINED/LEDs.h | 4 +- .../Drivers/Board/XMEGA/A3BU_XPLAINED/Board.h | 4 +- .../Board/XMEGA/A3BU_XPLAINED/Buttons.h | 4 +- .../Board/XMEGA/A3BU_XPLAINED/Dataflash.h | 4 +- .../Drivers/Board/XMEGA/A3BU_XPLAINED/LEDs.h | 4 +- .../Drivers/Board/XMEGA/B1_XPLAINED/Board.h | 4 +- .../Drivers/Board/XMEGA/B1_XPLAINED/Buttons.h | 4 +- .../Board/XMEGA/B1_XPLAINED/Dataflash.h | 4 +- .../Drivers/Board/XMEGA/B1_XPLAINED/LEDs.h | 4 +- .../Drivers/Board/XMEGA/C3_XPLAINED/Board.h | 4 +- .../Drivers/Board/XMEGA/C3_XPLAINED/Buttons.h | 4 +- .../Drivers/Board/XMEGA/C3_XPLAINED/LEDs.h | 4 +- Firmware/LUFA/Drivers/Misc/AT45DB321C.h | 4 +- Firmware/LUFA/Drivers/Misc/AT45DB642D.h | 4 +- Firmware/LUFA/Drivers/Misc/RingBuffer.h | 4 +- Firmware/LUFA/Drivers/Misc/TerminalCodes.h | 4 +- Firmware/LUFA/Drivers/Peripheral/ADC.h | 4 +- .../LUFA/Drivers/Peripheral/AVR8/ADC_AVR8.h | 4 +- .../LUFA/Drivers/Peripheral/AVR8/SPI_AVR8.h | 4 +- .../Drivers/Peripheral/AVR8/SerialSPI_AVR8.h | 4 +- .../Drivers/Peripheral/AVR8/Serial_AVR8.c | 8 +- .../Drivers/Peripheral/AVR8/Serial_AVR8.h | 7 +- .../LUFA/Drivers/Peripheral/AVR8/TWI_AVR8.c | 8 +- .../LUFA/Drivers/Peripheral/AVR8/TWI_AVR8.h | 8 +- Firmware/LUFA/Drivers/Peripheral/SPI.h | 4 +- Firmware/LUFA/Drivers/Peripheral/Serial.h | 4 +- Firmware/LUFA/Drivers/Peripheral/SerialSPI.h | 4 +- Firmware/LUFA/Drivers/Peripheral/TWI.h | 4 +- .../LUFA/Drivers/Peripheral/XMEGA/SPI_XMEGA.h | 4 +- .../Peripheral/XMEGA/SerialSPI_XMEGA.h | 4 +- .../Drivers/Peripheral/XMEGA/Serial_XMEGA.c | 20 +- .../Drivers/Peripheral/XMEGA/Serial_XMEGA.h | 15 +- .../LUFA/Drivers/Peripheral/XMEGA/TWI_XMEGA.c | 8 +- .../LUFA/Drivers/Peripheral/XMEGA/TWI_XMEGA.h | 8 +- .../Drivers/USB/Class/AndroidAccessoryClass.h | 4 +- Firmware/LUFA/Drivers/USB/Class/AudioClass.h | 4 +- Firmware/LUFA/Drivers/USB/Class/CDCClass.h | 4 +- .../Common/AndroidAccessoryClassCommon.h | 4 +- .../USB/Class/Common/AudioClassCommon.h | 4 +- .../Drivers/USB/Class/Common/CDCClassCommon.h | 4 +- .../Drivers/USB/Class/Common/HIDClassCommon.h | 7 +- .../LUFA/Drivers/USB/Class/Common/HIDParser.c | 8 +- .../LUFA/Drivers/USB/Class/Common/HIDParser.h | 4 +- .../Drivers/USB/Class/Common/HIDReportData.h | 4 +- .../USB/Class/Common/MIDIClassCommon.h | 4 +- .../USB/Class/Common/MassStorageClassCommon.h | 4 +- .../USB/Class/Common/PrinterClassCommon.h | 4 +- .../USB/Class/Common/RNDISClassCommon.h | 4 +- .../USB/Class/Common/StillImageClassCommon.h | 4 +- .../USB/Class/Device/AudioClassDevice.c | 4 +- .../USB/Class/Device/AudioClassDevice.h | 4 +- .../Drivers/USB/Class/Device/CDCClassDevice.c | 25 +- .../Drivers/USB/Class/Device/CDCClassDevice.h | 38 +- .../Drivers/USB/Class/Device/HIDClassDevice.c | 4 +- .../Drivers/USB/Class/Device/HIDClassDevice.h | 4 +- .../USB/Class/Device/MIDIClassDevice.c | 4 +- .../USB/Class/Device/MIDIClassDevice.h | 4 +- .../USB/Class/Device/MassStorageClassDevice.c | 4 +- .../USB/Class/Device/MassStorageClassDevice.h | 4 +- .../USB/Class/Device/PrinterClassDevice.c | 4 +- .../USB/Class/Device/PrinterClassDevice.h | 4 +- .../USB/Class/Device/RNDISClassDevice.c | 4 +- .../USB/Class/Device/RNDISClassDevice.h | 4 +- Firmware/LUFA/Drivers/USB/Class/HIDClass.h | 4 +- .../Class/Host/AndroidAccessoryClassHost.c | 4 +- .../Class/Host/AndroidAccessoryClassHost.h | 4 +- .../Drivers/USB/Class/Host/AudioClassHost.c | 4 +- .../Drivers/USB/Class/Host/AudioClassHost.h | 4 +- .../Drivers/USB/Class/Host/CDCClassHost.c | 39 +- .../Drivers/USB/Class/Host/CDCClassHost.h | 38 +- .../Drivers/USB/Class/Host/HIDClassHost.c | 4 +- .../Drivers/USB/Class/Host/HIDClassHost.h | 4 +- .../Drivers/USB/Class/Host/MIDIClassHost.c | 4 +- .../Drivers/USB/Class/Host/MIDIClassHost.h | 4 +- .../USB/Class/Host/MassStorageClassHost.c | 4 +- .../USB/Class/Host/MassStorageClassHost.h | 4 +- .../Drivers/USB/Class/Host/PrinterClassHost.c | 4 +- .../Drivers/USB/Class/Host/PrinterClassHost.h | 4 +- .../Drivers/USB/Class/Host/RNDISClassHost.c | 4 +- .../Drivers/USB/Class/Host/RNDISClassHost.h | 4 +- .../USB/Class/Host/StillImageClassHost.c | 4 +- .../USB/Class/Host/StillImageClassHost.h | 4 +- Firmware/LUFA/Drivers/USB/Class/MIDIClass.h | 4 +- .../LUFA/Drivers/USB/Class/MassStorageClass.h | 4 +- .../LUFA/Drivers/USB/Class/PrinterClass.h | 4 +- Firmware/LUFA/Drivers/USB/Class/RNDISClass.h | 4 +- .../LUFA/Drivers/USB/Class/StillImageClass.h | 4 +- .../LUFA/Drivers/USB/Core/AVR8/Device_AVR8.c | 4 +- .../LUFA/Drivers/USB/Core/AVR8/Device_AVR8.h | 4 +- .../USB/Core/AVR8/EndpointStream_AVR8.c | 4 +- .../USB/Core/AVR8/EndpointStream_AVR8.h | 4 +- .../Drivers/USB/Core/AVR8/Endpoint_AVR8.c | 4 +- .../Drivers/USB/Core/AVR8/Endpoint_AVR8.h | 4 +- .../LUFA/Drivers/USB/Core/AVR8/Host_AVR8.c | 4 +- .../LUFA/Drivers/USB/Core/AVR8/Host_AVR8.h | 4 +- .../LUFA/Drivers/USB/Core/AVR8/OTG_AVR8.h | 4 +- .../Drivers/USB/Core/AVR8/PipeStream_AVR8.c | 4 +- .../Drivers/USB/Core/AVR8/PipeStream_AVR8.h | 4 +- .../LUFA/Drivers/USB/Core/AVR8/Pipe_AVR8.c | 4 +- .../LUFA/Drivers/USB/Core/AVR8/Pipe_AVR8.h | 4 +- .../Template/Template_Endpoint_Control_R.c | 4 +- .../Template/Template_Endpoint_Control_W.c | 4 +- .../Core/AVR8/Template/Template_Endpoint_RW.c | 4 +- .../USB/Core/AVR8/Template/Template_Pipe_RW.c | 4 +- .../USB/Core/AVR8/USBController_AVR8.c | 4 +- .../USB/Core/AVR8/USBController_AVR8.h | 4 +- .../Drivers/USB/Core/AVR8/USBInterrupt_AVR8.c | 4 +- .../Drivers/USB/Core/AVR8/USBInterrupt_AVR8.h | 4 +- .../LUFA/Drivers/USB/Core/ConfigDescriptors.c | 4 +- .../LUFA/Drivers/USB/Core/ConfigDescriptors.h | 4 +- Firmware/LUFA/Drivers/USB/Core/Device.h | 6 +- .../LUFA/Drivers/USB/Core/DeviceStandardReq.c | 25 +- .../LUFA/Drivers/USB/Core/DeviceStandardReq.h | 4 +- Firmware/LUFA/Drivers/USB/Core/Endpoint.h | 4 +- .../LUFA/Drivers/USB/Core/EndpointStream.h | 4 +- Firmware/LUFA/Drivers/USB/Core/Events.c | 4 +- Firmware/LUFA/Drivers/USB/Core/Events.h | 4 +- Firmware/LUFA/Drivers/USB/Core/Host.h | 4 +- .../LUFA/Drivers/USB/Core/HostStandardReq.c | 4 +- .../LUFA/Drivers/USB/Core/HostStandardReq.h | 4 +- Firmware/LUFA/Drivers/USB/Core/OTG.h | 4 +- Firmware/LUFA/Drivers/USB/Core/Pipe.h | 4 +- Firmware/LUFA/Drivers/USB/Core/PipeStream.h | 4 +- .../LUFA/Drivers/USB/Core/StdDescriptors.h | 4 +- .../LUFA/Drivers/USB/Core/StdRequestType.h | 4 +- .../LUFA/Drivers/USB/Core/UC3/Device_UC3.c | 4 +- .../LUFA/Drivers/USB/Core/UC3/Device_UC3.h | 4 +- .../Drivers/USB/Core/UC3/EndpointStream_UC3.c | 4 +- .../Drivers/USB/Core/UC3/EndpointStream_UC3.h | 4 +- .../LUFA/Drivers/USB/Core/UC3/Endpoint_UC3.c | 4 +- .../LUFA/Drivers/USB/Core/UC3/Endpoint_UC3.h | 4 +- Firmware/LUFA/Drivers/USB/Core/UC3/Host_UC3.c | 4 +- Firmware/LUFA/Drivers/USB/Core/UC3/Host_UC3.h | 4 +- .../Drivers/USB/Core/UC3/PipeStream_UC3.c | 4 +- .../Drivers/USB/Core/UC3/PipeStream_UC3.h | 4 +- Firmware/LUFA/Drivers/USB/Core/UC3/Pipe_UC3.c | 4 +- Firmware/LUFA/Drivers/USB/Core/UC3/Pipe_UC3.h | 4 +- .../Template/Template_Endpoint_Control_R.c | 4 +- .../Template/Template_Endpoint_Control_W.c | 4 +- .../Core/UC3/Template/Template_Endpoint_RW.c | 4 +- .../USB/Core/UC3/Template/Template_Pipe_RW.c | 4 +- .../Drivers/USB/Core/UC3/USBController_UC3.c | 4 +- .../Drivers/USB/Core/UC3/USBController_UC3.h | 4 +- .../Drivers/USB/Core/UC3/USBInterrupt_UC3.c | 4 +- .../Drivers/USB/Core/UC3/USBInterrupt_UC3.h | 4 +- .../LUFA/Drivers/USB/Core/USBController.h | 4 +- Firmware/LUFA/Drivers/USB/Core/USBInterrupt.h | 4 +- Firmware/LUFA/Drivers/USB/Core/USBMode.h | 4 +- Firmware/LUFA/Drivers/USB/Core/USBTask.c | 4 +- Firmware/LUFA/Drivers/USB/Core/USBTask.h | 4 +- .../Drivers/USB/Core/XMEGA/Device_XMEGA.c | 4 +- .../Drivers/USB/Core/XMEGA/Device_XMEGA.h | 4 +- .../USB/Core/XMEGA/EndpointStream_XMEGA.c | 4 +- .../USB/Core/XMEGA/EndpointStream_XMEGA.h | 4 +- .../Drivers/USB/Core/XMEGA/Endpoint_XMEGA.c | 4 +- .../Drivers/USB/Core/XMEGA/Endpoint_XMEGA.h | 4 +- .../LUFA/Drivers/USB/Core/XMEGA/Host_XMEGA.c | 4 +- .../Drivers/USB/Core/XMEGA/PipeStream_XMEGA.c | 4 +- .../LUFA/Drivers/USB/Core/XMEGA/Pipe_XMEGA.c | 4 +- .../Template/Template_Endpoint_Control_R.c | 4 +- .../Template/Template_Endpoint_Control_W.c | 4 +- .../XMEGA/Template/Template_Endpoint_RW.c | 4 +- .../USB/Core/XMEGA/USBController_XMEGA.c | 4 +- .../USB/Core/XMEGA/USBController_XMEGA.h | 4 +- .../USB/Core/XMEGA/USBInterrupt_XMEGA.c | 4 +- .../USB/Core/XMEGA/USBInterrupt_XMEGA.h | 4 +- Firmware/LUFA/Drivers/USB/USB.h | 4 +- Firmware/LUFA/License.txt | 2 +- Firmware/LUFA/Platform/Platform.h | 4 +- Firmware/LUFA/Platform/UC3/ClockManagement.h | 4 +- Firmware/LUFA/Platform/UC3/Exception.S | 4 +- .../LUFA/Platform/UC3/InterruptManagement.c | 4 +- .../LUFA/Platform/UC3/InterruptManagement.h | 4 +- .../LUFA/Platform/XMEGA/ClockManagement.h | 4 +- .../Docbook/mshelp/README.txt | 13 + .../Docbook/mshelp/docbook.xsl | 58 + .../Docbook/mshelp/hv1-common.xsl | 664 +++++++ .../StudioIntegration/Docbook/placeholder.txt | 2 +- .../HV1/helpcontentsetup.msha | 4 +- .../HV1/lufa_docbook_transform.xslt | 4 +- .../HV1/lufa_helpcontentsetup_transform.xslt | 24 +- .../HV1/lufa_hv1_transform.xslt | 90 +- .../HV1/lufa_studio_help_styling.css | 106 +- Firmware/LUFA/StudioIntegration/VSIX/LUFA.dll | Bin 0 -> 785920 bytes .../VSIX/[Content_Types].xml | 26 +- .../StudioIntegration/VSIX/asf-manifest.xml | 36 +- .../VSIX/extension.vsixmanifest | 65 +- .../StudioIntegration/VSIX/generate_caches.py | 76 +- .../VSIX/lufa_asfmanifest_transform.xslt | 2 +- .../VSIX/lufa_vsmanifest_transform.xslt | 2 +- .../XDK/lufa_extension_transform.xslt | 2 +- .../XDK/lufa_filelist_transform.xslt | 2 +- .../XDK/lufa_indent_transform.xslt | 2 +- .../XDK/lufa_module_transform.xslt | 2 +- Firmware/LUFA/StudioIntegration/lufa.xml | 192 +- .../LUFA/StudioIntegration/lufa_common.xml | 68 +- .../StudioIntegration/lufa_drivers_board.xml | 228 +-- .../lufa_drivers_board_names.xml | 1706 ++++++++--------- .../StudioIntegration/lufa_drivers_misc.xml | 114 +- .../lufa_drivers_peripheral.xml | 396 ++-- .../StudioIntegration/lufa_drivers_usb.xml | 64 +- .../lufa_drivers_usb_class.xml | 64 +- .../lufa_drivers_usb_class_android.xml | 2 +- .../lufa_drivers_usb_class_audio.xml | 4 +- .../lufa_drivers_usb_class_cdc.xml | 2 +- .../lufa_drivers_usb_class_hid.xml | 2 +- .../lufa_drivers_usb_class_midi.xml | 2 +- .../lufa_drivers_usb_class_ms.xml | 2 +- .../lufa_drivers_usb_class_printer.xml | 2 +- .../lufa_drivers_usb_class_rndis.xml | 2 +- .../lufa_drivers_usb_class_si.xml | 2 +- .../lufa_drivers_usb_core.xml | 170 +- .../lufa_drivers_usb_core_avr8.xml | 86 +- .../lufa_drivers_usb_core_uc3.xml | 84 +- .../lufa_drivers_usb_core_xmega.xml | 72 +- .../LUFA/StudioIntegration/lufa_platform.xml | 120 +- .../StudioIntegration/lufa_platform_uc3.xml | 52 +- .../StudioIntegration/lufa_platform_xmega.xml | 46 +- .../LUFA/StudioIntegration/lufa_toolchain.xml | 88 +- Firmware/LUFA/StudioIntegration/makefile | 14 +- Firmware/LUFA/Version.h | 27 +- Firmware/LUFA/doxyfile | 234 ++- Firmware/LUFA/makefile | 45 +- 425 files changed, 7217 insertions(+), 5127 deletions(-) create mode 100644 Firmware/LUFA/Build/DMBS/.gitignore create mode 100644 Firmware/LUFA/Build/DMBS/DMBS/HID_EEPROM_Loader/HID_EEPROM_Loader.c create mode 100644 Firmware/LUFA/Build/DMBS/DMBS/HID_EEPROM_Loader/makefile create mode 100644 Firmware/LUFA/Build/DMBS/DMBS/License.txt create mode 100644 Firmware/LUFA/Build/DMBS/DMBS/ModulesOverview.md create mode 100644 Firmware/LUFA/Build/DMBS/DMBS/WritingYourOwnModules.md create mode 100644 Firmware/LUFA/Build/DMBS/DMBS/atprogram.md create mode 100644 Firmware/LUFA/Build/DMBS/DMBS/atprogram.mk create mode 100644 Firmware/LUFA/Build/DMBS/DMBS/avrdude.md create mode 100644 Firmware/LUFA/Build/DMBS/DMBS/avrdude.mk create mode 100644 Firmware/LUFA/Build/DMBS/DMBS/core.md create mode 100644 Firmware/LUFA/Build/DMBS/DMBS/core.mk create mode 100644 Firmware/LUFA/Build/DMBS/DMBS/cppcheck.md create mode 100644 Firmware/LUFA/Build/DMBS/DMBS/cppcheck.mk create mode 100644 Firmware/LUFA/Build/DMBS/DMBS/dfu.md create mode 100644 Firmware/LUFA/Build/DMBS/DMBS/dfu.mk create mode 100644 Firmware/LUFA/Build/DMBS/DMBS/doxygen.md create mode 100644 Firmware/LUFA/Build/DMBS/DMBS/doxygen.mk create mode 100644 Firmware/LUFA/Build/DMBS/DMBS/gcc.md create mode 100644 Firmware/LUFA/Build/DMBS/DMBS/gcc.mk create mode 100644 Firmware/LUFA/Build/DMBS/DMBS/hid.md create mode 100644 Firmware/LUFA/Build/DMBS/DMBS/hid.mk create mode 100644 Firmware/LUFA/Build/DMBS/Readme.md create mode 100644 Firmware/LUFA/Build/DMBS/Template/Template.c create mode 100644 Firmware/LUFA/Build/DMBS/Template/makefile create mode 100644 Firmware/LUFA/Build/LUFA/lufa-gcc.mk create mode 100644 Firmware/LUFA/Build/LUFA/lufa-sources.mk create mode 100644 Firmware/LUFA/Drivers/Board/AVR8/POLOLUMICRO/Board.h create mode 100644 Firmware/LUFA/Drivers/Board/AVR8/POLOLUMICRO/LEDs.h create mode 100644 Firmware/LUFA/Drivers/Board/AVR8/XPLAINED_MINI/Board.h create mode 100644 Firmware/LUFA/Drivers/Board/AVR8/XPLAINED_MINI/LEDs.h create mode 100644 Firmware/LUFA/StudioIntegration/Docbook/mshelp/README.txt create mode 100644 Firmware/LUFA/StudioIntegration/Docbook/mshelp/docbook.xsl create mode 100644 Firmware/LUFA/StudioIntegration/Docbook/mshelp/hv1-common.xsl create mode 100644 Firmware/LUFA/StudioIntegration/VSIX/LUFA.dll diff --git a/Firmware/LUFA/Build/DMBS/.gitignore b/Firmware/LUFA/Build/DMBS/.gitignore new file mode 100644 index 0000000..9387689 --- /dev/null +++ b/Firmware/LUFA/Build/DMBS/.gitignore @@ -0,0 +1,9 @@ +*.lss +*.bin +*.elf +*.hex +*.eep +*.map +*.o +*.d +*.sym diff --git a/Firmware/LUFA/Build/DMBS/DMBS/HID_EEPROM_Loader/HID_EEPROM_Loader.c b/Firmware/LUFA/Build/DMBS/DMBS/HID_EEPROM_Loader/HID_EEPROM_Loader.c new file mode 100644 index 0000000..35ea2d7 --- /dev/null +++ b/Firmware/LUFA/Build/DMBS/DMBS/HID_EEPROM_Loader/HID_EEPROM_Loader.c @@ -0,0 +1,39 @@ +/* + DMBS Build System + Released into the public domain. + + dean [at] fourwalledcubicle [dot] com + www.fourwalledcubicle.com + */ + +/** \file + * + * Special application to extract an EEPROM image stored in FLASH memory, and + * copy it to the device EEPROM. This application is designed to be used with + * the HID build system module of DMBS to program the EEPROM of a target device + * that uses the HID bootloader protocol, which does not have native EEPROM + * programming support. + */ + +#include +#include +#include + +/* References to the binary EEPROM data linked in the AVR's FLASH memory space */ +extern const char _binary_InputEEData_bin_start[]; +extern const char _binary_InputEEData_bin_end[]; +extern const char _binary_InputEEData_bin_size[]; + +/* Friendly names for the embedded binary data stored in FLASH memory space */ +#define InputEEData _binary_InputEEData_bin_start +#define InputEEData_size ((int)_binary_InputEEData_bin_size) + +int main(void) +{ + /* Copy out the embedded EEPROM data from FLASH to EEPROM memory space */ + for (uint16_t i = 0; i < InputEEData_size; i++) + eeprom_update_byte((uint8_t*)i, pgm_read_byte(&InputEEData[i])); + + /* Infinite loop once complete */ + for (;;); +} diff --git a/Firmware/LUFA/Build/DMBS/DMBS/HID_EEPROM_Loader/makefile b/Firmware/LUFA/Build/DMBS/DMBS/HID_EEPROM_Loader/makefile new file mode 100644 index 0000000..879eda8 --- /dev/null +++ b/Firmware/LUFA/Build/DMBS/DMBS/HID_EEPROM_Loader/makefile @@ -0,0 +1,35 @@ +# +# DMBS Build System +# Released into the public domain. +# +# dean [at] fourwalledcubicle [dot] com +# www.fourwalledcubicle.com +# + +# Run "make help" for target help. + +MCU = atmega128 +ARCH = AVR8 +F_CPU = 1000000 +OPTIMIZATION = s +TARGET = HID_EEPROM_Loader +SRC = $(TARGET).c +CC_FLAGS = +LD_FLAGS = +OBJECT_FILES = InputEEData.o + +# Default target +all: + +# Determine the AVR sub-architecture of the build main application object file +FIND_AVR_SUBARCH = avr$(shell avr-objdump -f $(TARGET).o | grep architecture | cut -d':' -f3 | cut -d',' -f1) + +# Create a linkable object file with the input binary EEPROM data stored in the FLASH section +InputEEData.o: InputEEData.bin $(TARGET).o $(MAKEFILE_LIST) + @echo $(MSG_OBJCPY_CMD) Converting \"$<\" to a object file \"$@\" + avr-objcopy -I binary -O elf32-avr -B $(call FIND_AVR_SUBARCH) --rename-section .data=.progmem.data,contents,alloc,readonly,data $< $@ + +# Include LUFA build script makefiles +include ../core.mk +include ../gcc.mk +include ../hid.mk diff --git a/Firmware/LUFA/Build/DMBS/DMBS/License.txt b/Firmware/LUFA/Build/DMBS/DMBS/License.txt new file mode 100644 index 0000000..322c762 --- /dev/null +++ b/Firmware/LUFA/Build/DMBS/DMBS/License.txt @@ -0,0 +1,32 @@ + DMBS Build System + Released into the public domain. + + dean [at] fourwalledcubicle [dot] com + www.fourwalledcubicle.com + + + +This is free and unencumbered software released into the public domain. + +Anyone is free to copy, modify, publish, use, compile, sell, or +distribute this software, either in source code form or as a compiled +binary, for any purpose, commercial or non-commercial, and by any +means. + +In jurisdictions that recognize copyright laws, the author or authors +of this software dedicate any and all copyright interest in the +software to the public domain. We make this dedication for the benefit +of the public at large and to the detriment of our heirs and +successors. We intend this dedication to be an overt act of +relinquishment in perpetuity of all present and future rights to this +software under copyright law. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +For more information, please refer to diff --git a/Firmware/LUFA/Build/DMBS/DMBS/ModulesOverview.md b/Firmware/LUFA/Build/DMBS/DMBS/ModulesOverview.md new file mode 100644 index 0000000..1fd9cc1 --- /dev/null +++ b/Firmware/LUFA/Build/DMBS/DMBS/ModulesOverview.md @@ -0,0 +1,38 @@ +DMBS - Dean's Makefile Build System +=================================== + + +Modules Overview +---------------- + +The following modules are currently included: + + - [ATPROGRAM](atprogram.md) - Device Programming + - [AVRDUDE](avrdude.md) - Device Programming + - [CORE](core.md) - DMBS Core Functionality + - [CPPCHECK](cppcheck.md) - Static Code Analysis + - [DFU](dfu.md) - Device Programming + - [DOXYGEN](doxygen.md) - Automated Source Code Documentation + - [GCC](gcc.md) - Compiling/Assembling/Linking with GCC + - [HID](hid.md) - Device Programming + +## Importing modules into your project makefile + +To use a module, it is recommended to add the following boilerplate to your +makefile: + + # Include DMBS build script makefiles + DMBS_PATH ?= ../DMBS + +Which can then used to indicate the location of your DMBS installation, relative +to the current directory, when importing modules. For example: + + DMBS_PATH ?= ../DMBS + include $(DMBS_PATH)/core.mk + include $(DMBS_PATH)/gcc.mk + +Imports the `CORE` and `GCC` modules from DMBS using a single path relative to +your project's makefile. + +If you wish to write your own DMBS module(s), +[see the documentation here for more details.](WritingYourOwnModules.md) diff --git a/Firmware/LUFA/Build/DMBS/DMBS/WritingYourOwnModules.md b/Firmware/LUFA/Build/DMBS/DMBS/WritingYourOwnModules.md new file mode 100644 index 0000000..3ecbb33 --- /dev/null +++ b/Firmware/LUFA/Build/DMBS/DMBS/WritingYourOwnModules.md @@ -0,0 +1,94 @@ +DMBS - Dean's Makefile Build System +=================================== + + +Writing Your Own Modules +------------------------ + +A DMBS module consists of the several boilerplate sections, explained below. + +## The DMBS module hooks + +Your module needs to advertise to DMBS its name, its makefile targets, the +required and optional variables, and the variables and macros the module +provides for use elsewhere. This is achieved with the following section: + + DMBS_BUILD_MODULES += EXAMPLE + DMBS_BUILD_TARGETS += example-target another-target + DMBS_BUILD_MANDATORY_VARS += MANDATORY_NAME ALSO_MANDATORY + DMBS_BUILD_OPTIONAL_VARS += OPTIONAL_NAME ALSO_OPTIONAL + DMBS_BUILD_PROVIDED_VARS += MEANING_OF_LIFE + DMBS_BUILD_PROVIDED_MACROS += STRIP_WHITESPACE + +The example above declares that this module is called `EXAMPLE`, and exposes the +listed targets, variable requirements and provides variables and macros. + +Your module name and provided variable/macro names must be unique, however you +can (and should) re-use variable names where appropriate if they apply to +several modules (such as `ARCH` to specify the project's microcontroller +architecture). Re-using targets is not recommended, but can be used to extend +the dependencies of another module's targets. + +## Importing the CORE module + +Next, your module should always import the DMBS `CORE` module, via the +following: + + # Conditionally import the CORE module of DMBS if it is not already imported + DMBS_MODULE_PATH := $(patsubst %/,%,$(dir $(lastword $(MAKEFILE_LIST)))) + ifeq ($(findstring CORE, $(DMBS_BUILD_MODULES)),) + include $(DMBS_MODULE_PATH)/core.mk + endif + +This ensures that the `make help` target is always available. In addition, the +`CORE` module exposes some [commonly used macros and variables](core.md) to +your module. + +## Setting optional variable's defaults + +If a variable is optional, you should provide a default value. Do this via the +`?=` operator of `make`, which sets a variable's value if it has not yet been +set: + + MY_OPTIONAL_VARIABLE ?= some_default_value + +## Sanity checking user input + +Sanity checks are what make DMBS useful. Where possible, validate user input and +convert generated errors to human-friendly messages. This can be achieved by +enforcing that all the declared module mandatory variables have been set by the +user: + + # Sanity-check values of mandatory user-supplied variables + $(foreach MANDATORY_VAR, $(DMBS_BUILD_MANDATORY_VARS), $(call ERROR_IF_UNSET, $(MANDATORY_VAR))) + +As well as complaining if they are set, but currently empty: + $(call ERROR_IF_EMPTY, SOME_MANDATORY_VARIABLE) + $(call ERROR_IF_EMPTY, SOME_OPTIONAL_BUT_NON_EMPTY_VARIABLE) + +Or even if they are boolean (`Y` or `N`) variables that have an invalid value: + + $(call ERROR_IF_NONBOOL, SOME_BOOL_VARIABLE) + +## Adding targets + +The meat of a DMBS module is the targets, which are run when the user types +`make {target name}` from the command line. These can be as complex or simple +as you like. See the GNU make manual for information on writing make targets. + + example-target: + echo "Your DMBS module works!" + +## And finally, list the PHONYs + +Important in GNU Make is the concept of phony targets; this special directive +tells make that a given target should never be considered a valid file. Listing +phonies ensures that, for example, if your module had a target called `build`, +it would always run when the user types `make build` from the command line, even +if a file called `build` existed in the user project folder. + +You can list module-internal targets here, as well as mark all public targets +via the module header's `DMBS_BUILD_TARGETS` variable. + + # Phony build targets for this module + .PHONY: $(DMBS_BUILD_TARGETS) some-module-internal-target another-internal-target diff --git a/Firmware/LUFA/Build/DMBS/DMBS/atprogram.md b/Firmware/LUFA/Build/DMBS/DMBS/atprogram.md new file mode 100644 index 0000000..ea1b0d9 --- /dev/null +++ b/Firmware/LUFA/Build/DMBS/DMBS/atprogram.md @@ -0,0 +1,119 @@ +DMBS - Dean's Makefile Build System +=================================== + + +Module: ATPROGRAM +----------------- + +The ATPROGRAM module provides build targets for use with the official +`ATPROGRAM` back-end utility distributed with the free +[Atmel Studio](http://www.atmel.com) software released by Atmel. + +## Importing This Module into a Makefile: + +To use this module in your application makefile, add the following code to your +makefile: + + include $(DMBS_PATH)/atprogram.mk + +## Prerequisites: + +This module requires the `atprogram.exe` utility to be available in your +system's `PATH` variable. The `atprogram.exe` utility is distributed in Atmel +Studio (usually) inside the application install folder's `atbackend` +subdirectory. + +## Build Targets: + +The following targets are supported by this module: + + + + + + + + + + + + +
atprogramProgram the device FLASH memory with the application's executable data.
atprogram-eeProgram the device EEPROM memory with the application's EEPROM data.
+ +## Mandatory Variables: + +The following variables must be defined (with a `NAME = VALUE` syntax, one +variable per line) in the user makefile to be able to use this module: + + + + + + + + + + + + +
MCUName of the Atmel processor model (e.g. `at90usb1287`).
TARGETName of the application output file prefix (e.g. `TestApplication`).
+ +## Optional Variables: + +The following variables may be defined (with a `NAME = VALUE` syntax, one +variable per line) in the user makefile. If not specified, a default value will +be assumed. + + + + + + + + + + + + + + + + +
ATPROGRAM_PROGRAMMERName of the Atmel programmer or debugger tool to communicate with (e.g. `jtagice3`). Default is `atmelice`.
ATPROGRAM_INTERFACEName of the programming interface to use when programming the target (e.g. `spi`). Default is `jtag`.
ATPROGRAM_PORTName of the communication port to use when when programming with a serially connected tool (e.g. `COM2`). Default is `usb`.
+ +## Provided Variables: + +The following variables may be referenced in a user makefile (via `$(NAME)` +syntax) if desired, as they are provided by this module. + + + + + + + + +
N/AThis module provides no variables.
+ +## Provided Macros: + +The following macros may be referenced in a user makefile (via +`$(call NAME, ARG1, ARG2, ...)` syntax) if desired, as they are provided by +this module. + + + + + + + + +
N/AThis module provides no macros.
+ +## Module Changelog: + +The changes to this module since its initial release are listed below, as of the +DMBS version where the change was made. + +### 20160403 +Initial release. diff --git a/Firmware/LUFA/Build/DMBS/DMBS/atprogram.mk b/Firmware/LUFA/Build/DMBS/DMBS/atprogram.mk new file mode 100644 index 0000000..a505275 --- /dev/null +++ b/Firmware/LUFA/Build/DMBS/DMBS/atprogram.mk @@ -0,0 +1,68 @@ +# +# DMBS Build System +# Released into the public domain. +# +# dean [at] fourwalledcubicle [dot] com +# www.fourwalledcubicle.com +# + +DMBS_BUILD_MODULES += ATPROGRAM +DMBS_BUILD_TARGETS += atprogram atprogram-ee +DMBS_BUILD_MANDATORY_VARS += MCU TARGET +DMBS_BUILD_OPTIONAL_VARS += ATPROGRAM_PROGRAMMER ATPROGRAM_INTERFACE ATPROGRAM_PORT +DMBS_BUILD_PROVIDED_VARS += +DMBS_BUILD_PROVIDED_MACROS += + +# Conditionally import the CORE module of DMBS if it is not already imported +DMBS_MODULE_PATH := $(patsubst %/,%,$(dir $(lastword $(MAKEFILE_LIST)))) +ifeq ($(findstring CORE, $(DMBS_BUILD_MODULES)),) + include $(DMBS_MODULE_PATH)/core.mk +endif + +# Default values of optionally user-supplied variables +ATPROGRAM_PROGRAMMER ?= atmelice +ATPROGRAM_INTERFACE ?= jtag +ATPROGRAM_PORT ?= + +# Sanity check user supplied values +$(foreach MANDATORY_VAR, $(DMBS_BUILD_MANDATORY_VARS), $(call ERROR_IF_UNSET, $(MANDATORY_VAR))) +$(call ERROR_IF_EMPTY, MCU) +$(call ERROR_IF_EMPTY, TARGET) +$(call ERROR_IF_EMPTY, ATPROGRAM_PROGRAMMER) +$(call ERROR_IF_EMPTY, ATPROGRAM_INTERFACE) + +# Output Messages +MSG_ATPROGRAM_CMD := ' [ATPRGRM] :' + +# Construct base atprogram command flags +BASE_ATPROGRAM_FLAGS := --tool $(ATPROGRAM_PROGRAMMER) --interface $(ATPROGRAM_INTERFACE) --device $(MCU) +ifneq ($(ATPROGRAM_PORT),) + BASE_ATPROGRAM_FLAGS += --port $(ATPROGRAM_PORT) +endif + +# Construct the flags to use for the various memory spaces +ifeq ($(ARCH), AVR8) + ATPROGRAM_FLASH_FLAGS := --chiperase --flash + ATPROGRAM_EEPROM_FLAGS := --eeprom +else ifeq ($(ARCH), XMEGA) + ATPROGRAM_FLASH_FLAGS := --erase --flash + ATPROGRAM_EEPROM_FLAGS := --eeprom +else ifeq ($(ARCH), UC3) + ATPROGRAM_FLASH_FLAGS := --erase + ATPROGRAM_EEPROM_FLAGS := --eeprom +else + $(error Unsupported architecture "$(ARCH)") +endif + +# Programs in the target FLASH memory using ATPROGRAM +atprogram: $(TARGET).elf $(MAKEFILE_LIST) + @echo $(MSG_ATPROGRAM_CMD) Programming device \"$(MCU)\" FLASH using \"$(ATPROGRAM_PROGRAMMER)\" + atprogram $(BASE_ATPROGRAM_FLAGS) program $(ATPROGRAM_FLASH_FLAGS) --file $< + +# Programs in the target EEPROM memory using ATPROGRAM +atprogram-ee: $(TARGET).elf $(MAKEFILE_LIST) + @echo $(MSG_ATPROGRAM_CMD) Programming device \"$(MCU)\" EEPROM using \"$(ATPROGRAM_PROGRAMMER)\" + atprogram $(BASE_ATPROGRAM_FLAGS) program $(ATPROGRAM_EEPROM_FLAGS) --file $< + +# Phony build targets for this module +.PHONY: $(DMBS_BUILD_TARGETS) diff --git a/Firmware/LUFA/Build/DMBS/DMBS/avrdude.md b/Firmware/LUFA/Build/DMBS/DMBS/avrdude.md new file mode 100644 index 0000000..d6c71ce --- /dev/null +++ b/Firmware/LUFA/Build/DMBS/DMBS/avrdude.md @@ -0,0 +1,124 @@ +DMBS - Dean's Makefile Build System +=================================== + + +Module: AVRDUDE +----------------- + +The AVRDUDE module provides build targets for use with the official +open source `AVRDUDE` programmer utility, for the reprogramming of Atmel devices +using a wide variety of official and non-official programming devices and +bootloaders. + +## Importing This Module into a Makefile: + +To use this module in your application makefile, add the following code to your +makefile: + + include $(DMBS_PATH)/avrdude.mk + +## Prerequisites: + +This module requires the `avrdude` utility to be available in your +system's `PATH` variable. The `avrdude` utility is distributed on the project's +[official site](https://savannah.nongnu.org/projects/avrdude) but is also +made available in many *nix operating system's package managers. + +## Build Targets: + +The following targets are supported by this module: + + + + + + + + + + + + +
avrdudeProgram the device FLASH memory with the application's executable data.
avrdude-eeProgram the device EEPROM memory with the application's EEPROM data.
+ +## Mandatory Variables: + +The following variables must be defined (with a `NAME = VALUE` syntax, one +variable per line) in the user makefile to be able to use this module: + + + + + + + + + + + + +
MCUName of the Atmel processor model (e.g. `at90usb1287`).
TARGETName of the application output file prefix (e.g. `TestApplication`).
+ +## Optional Variables: + +The following variables may be defined (with a `NAME = VALUE` syntax, one +variable per line) in the user makefile. If not specified, a default value will +be assumed. + + + + + + + + + + + + + + + + + + + + +
AVRDUDE_PROGRAMMERName of the programmer/debugger tool or bootloader to communicate with (e.g. `jtagicemkii`). Default is `jtagicemkii`.
AVRDUDE_PORTName of the communication port to use when when programming with a serially connected tool (e.g. `COM2`). Default is `usb`.
AVRDUDE_FLAGSAdditional flags to pass to `avrdude` when invoking the tool. Default is empty (no additional flags).
AVRDUDE_MEMORYMemory space to program when executing the `avrdude` target (e.g. 'application` for an XMEGA device). Default is `flash`.
+ +## Provided Variables: + +The following variables may be referenced in a user makefile (via `$(NAME)` +syntax) if desired, as they are provided by this module. + + + + + + + + +
N/AThis module provides no variables.
+ +## Provided Macros: + +The following macros may be referenced in a user makefile (via +`$(call NAME, ARG1, ARG2, ...)` syntax) if desired, as they are provided by +this module. + + + + + + + + +
N/AThis module provides no macros.
+ +## Module Changelog: + +The changes to this module since its initial release are listed below, as of the +DMBS version where the change was made. + +### 20160403 +Initial release. diff --git a/Firmware/LUFA/Build/DMBS/DMBS/avrdude.mk b/Firmware/LUFA/Build/DMBS/DMBS/avrdude.mk new file mode 100644 index 0000000..c4bac8f --- /dev/null +++ b/Firmware/LUFA/Build/DMBS/DMBS/avrdude.mk @@ -0,0 +1,52 @@ +# +# DMBS Build System +# Released into the public domain. +# +# dean [at] fourwalledcubicle [dot] com +# www.fourwalledcubicle.com +# + +DMBS_BUILD_MODULES += AVRDUDE +DMBS_BUILD_TARGETS += avrdude avrdude-ee +DMBS_BUILD_MANDATORY_VARS += MCU TARGET +DMBS_BUILD_OPTIONAL_VARS += AVRDUDE_PROGRAMMER AVRDUDE_PORT AVRDUDE_FLAGS AVRDUDE_MEMORY +DMBS_BUILD_PROVIDED_VARS += +DMBS_BUILD_PROVIDED_MACROS += + +# Conditionally import the CORE module of DMBS if it is not already imported +DMBS_MODULE_PATH := $(patsubst %/,%,$(dir $(lastword $(MAKEFILE_LIST)))) +ifeq ($(findstring CORE, $(DMBS_BUILD_MODULES)),) + include $(DMBS_MODULE_PATH)/core.mk +endif + +# Default values of optionally user-supplied variables +AVRDUDE_PROGRAMMER ?= jtagicemkii +AVRDUDE_PORT ?= usb +AVRDUDE_FLAGS ?= +AVRDUDE_MEMORY ?= flash + +# Sanity check user supplied values +$(foreach MANDATORY_VAR, $(DMBS_BUILD_MANDATORY_VARS), $(call ERROR_IF_UNSET, $(MANDATORY_VAR))) +$(call ERROR_IF_EMPTY, MCU) +$(call ERROR_IF_EMPTY, TARGET) +$(call ERROR_IF_EMPTY, AVRDUDE_PROGRAMMER) +$(call ERROR_IF_EMPTY, AVRDUDE_PORT) + +# Output Messages +MSG_AVRDUDE_CMD := ' [AVRDUDE] :' + +# Construct base avrdude command flags +BASE_AVRDUDE_FLAGS := -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER) + +# Programs in the target FLASH memory using AVRDUDE +avrdude: $(TARGET).hex $(MAKEFILE_LIST) + @echo $(MSG_AVRDUDE_CMD) Programming device \"$(MCU)\" FLASH using \"$(AVRDUDE_PROGRAMMER)\" on port \"$(AVRDUDE_PORT)\" + avrdude $(BASE_AVRDUDE_FLAGS) -U $(AVRDUDE_MEMORY):w:$< $(AVRDUDE_FLAGS) + +# Programs in the target EEPROM memory using AVRDUDE +avrdude-ee: $(TARGET).eep $(MAKEFILE_LIST) + @echo $(MSG_AVRDUDE_CMD) Programming device \"$(MCU)\" EEPROM using \"$(AVRDUDE_PROGRAMMER)\" on port \"$(AVRDUDE_PORT)\" + avrdude $(BASE_AVRDUDE_FLAGS) -U eeprom:w:$< $(AVRDUDE_FLAGS) + +# Phony build targets for this module +.PHONY: $(DMBS_BUILD_TARGETS) diff --git a/Firmware/LUFA/Build/DMBS/DMBS/core.md b/Firmware/LUFA/Build/DMBS/DMBS/core.md new file mode 100644 index 0000000..c7c9767 --- /dev/null +++ b/Firmware/LUFA/Build/DMBS/DMBS/core.md @@ -0,0 +1,136 @@ +DMBS - Dean's Makefile Build System +=================================== + + +Module: CORE +------------ + +The CORE module provides the core DMBS infrastructure used by other DMBS +modules, and must always be imported. Additionally, this module provides the +help system for DMBS. + +## Importing This Module into a Makefile: + +To use this module in your application makefile, add the following code to your +makefile: + + include $(DMBS_PATH)/core.mk + +## Prerequisites: + +None. + +## Build Targets: + +The following targets are supported by this module: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
helpShow help for the current project, including a list of all available targets, variables and macros from the imported modules.
list_targetsShow a list of all build targets from the imported modules.
list_modulesShow a list of all imported modules.
list_mandatoryShow a list of all mandatory variables from the imported modules.
list_optionalShow a list of all optional variables from the imported modules.
list_providedShow a list of all variables provided by the imported modules.
list_macrosShow a list of all macros provided by the imported modules.
+ +## Mandatory Variables: + +The following variables must be defined (with a `NAME = VALUE` syntax, one +variable per line) in the user makefile to be able to use this module: + + + + + + + + +
N/AThis module has no mandatory variables.
+ +## Optional Variables: + +The following variables may be defined (with a `NAME = VALUE` syntax, one +variable per line) in the user makefile. If not specified, a default value will +be assumed. + + + + + + + + +
N/AThis module has no optional variables.
+ +## Provided Variables: + +The following variables may be referenced in a user makefile (via `$(NAME)` +syntax) if desired, as they are provided by this module. + + + + + + + + +
DMBS_VERSIONCurrent version of this DMBS release, as a ISO 8601 integer (such as `160403` for `2016-04-03`).
+ +## Provided Macros: + +The following macros may be referenced in a user makefile (via +`$(call NAME, ARG1, ARG2, ...)` syntax) if desired, as they are provided by +this module. + + + + + + + + + + + + + + + + + + + + +
DMBS_CHECK_VERSIONMacro to check the current DMBS version against the first argument and abort if the required version is newer than the current version.
ERROR_IF_UNSETMacro to check the given makefile variable name passed as the first argument, and abort if it has not been set by any makefile module.
ERROR_IF_EMPTYMacro to check the given makefile variable name passed as the first argument, and abort if it has an empty value.
ERROR_IF_NONBOOLMacro to check the given makefile variable name passed as the first argument, and abort if it has a value other than `Y` or `N`.
+ +## Module Changelog: + +The changes to this module since its initial release are listed below, as of the +DMBS version where the change was made. + +### 20160403 +Initial release. diff --git a/Firmware/LUFA/Build/DMBS/DMBS/core.mk b/Firmware/LUFA/Build/DMBS/DMBS/core.mk new file mode 100644 index 0000000..1c55569 --- /dev/null +++ b/Firmware/LUFA/Build/DMBS/DMBS/core.mk @@ -0,0 +1,147 @@ +# +# DMBS Build System +# Released into the public domain. +# +# dean [at] fourwalledcubicle [dot] com +# www.fourwalledcubicle.com +# + +DMBS_BUILD_MODULES += CORE +DMBS_BUILD_TARGETS += help list_targets list_modules list_mandatory list_optional list_provided list_macros +DMBS_BUILD_MANDATORY_VARS += +DMBS_BUILD_OPTIONAL_VARS += +DMBS_BUILD_PROVIDED_VARS += DMBS_VERSION +DMBS_BUILD_PROVIDED_MACROS += DMBS_CHECK_VERSION ERROR_IF_UNSET ERROR_IF_EMPTY ERROR_IF_NONBOOL + +SHELL = /bin/sh + +# Current DMBS release version +DMBS_VERSION := 20160717 + +# Macro to check the DMBS version, aborts if the given DMBS version is below the current version +DMBS_CHECK_VERSION ?= $(if $(filter-out 0, $(shell test $(DMBS_VERSION) -lt $(1); echo $$?)), , $(error DMBS version $(1) or newer required, current version is $(DMBS_VERSION))) + +# Macros to use in other modules to check various conditions +ERROR_IF_UNSET ?= $(if $(filter undefined, $(origin $(strip $(1)))), $(error Makefile $(strip $(1)) value not set)) +ERROR_IF_EMPTY ?= $(if $(strip $($(strip $(1)))), , $(error Makefile $(strip $(1)) option cannot be blank)) +ERROR_IF_NONBOOL ?= $(if $(filter Y N, $($(strip $(1)))), , $(error Makefile $(strip $(1)) option must be Y or N)) + +# Converts a given input to a printable output using "(None)" if no items are in the list +CONVERT_TO_PRINTABLE = $(if $(strip $(1)), $(1), (None)) + +# Build sorted and filtered lists of the included build module data +SORTED_DMBS_BUILD_MODULES = $(sort $(DMBS_BUILD_MODULES)) +SORTED_DMBS_BUILD_TARGETS = $(sort $(DMBS_BUILD_TARGETS)) +SORTED_DMBS_MANDATORY_VARS = $(sort $(DMBS_BUILD_MANDATORY_VARS)) +SORTED_DMBS_OPTIONAL_VARS = $(filter-out $(SORTED_DMBS_MANDATORY_VARS), $(sort $(DMBS_BUILD_OPTIONAL_VARS))) +SORTED_DMBS_PROVIDED_VARS = $(sort $(DMBS_BUILD_PROVIDED_VARS)) +SORTED_DMBS_PROVIDED_MACROS = $(sort $(DMBS_BUILD_PROVIDED_MACROS)) + +# Create printable versions of the sorted build module data (use "(None)" when no data is available) +PRINTABLE_DMBS_BUILD_MODULES = $(call CONVERT_TO_PRINTABLE, $(SORTED_DMBS_BUILD_MODULES)) +PRINTABLE_DMBS_BUILD_TARGETS = $(call CONVERT_TO_PRINTABLE, $(SORTED_DMBS_BUILD_TARGETS)) +PRINTABLE_DMBS_MANDATORY_VARS = $(call CONVERT_TO_PRINTABLE, $(SORTED_DMBS_MANDATORY_VARS)) +PRINTABLE_DMBS_OPTIONAL_VARS = $(call CONVERT_TO_PRINTABLE, $(SORTED_DMBS_OPTIONAL_VARS)) +PRINTABLE_DMBS_PROVIDED_VARS = $(call CONVERT_TO_PRINTABLE, $(SORTED_DMBS_PROVIDED_VARS)) +PRINTABLE_DMBS_PROVIDED_MACROS = $(call CONVERT_TO_PRINTABLE, $(SORTED_DMBS_PROVIDED_MACROS)) + +help: + @echo "===================================================================" + @echo " The DMBS Build System " + @echo " By Dean Camera { dean @ fourwalledcubicle . com } " + @echo "===================================================================" + @echo "DESCRIPTION: " + @echo " This build system is a set of makefile modules for (GNU) Make, to " + @echo " provide a simple system for building DMBS powered applications. " + @echo " Each makefile module can be included from within a user makefile, " + @echo " to expose the build rules documented in the comments at the top of" + @echo " each build module. " + @echo " " + @echo "USAGE: " + @echo " To execute a rule, define all variables indicated in the desired " + @echo " module as a required parameter before including the build module " + @echo " in your project makefile. Parameters marked as optional will " + @echo " assume a default value in the modules if not user-assigned. " + @echo " " + @echo " By default the target output shows both a friendly summary, as " + @echo " well as the actual invoked command. To suppress the output of the " + @echo " invoked commands and show only the friendly command output, run " + @echo " make with the \"-s\" switch added before the target(s). " + @echo "===================================================================" + @echo " " + @echo " Currently used build system modules in this application: " + @echo " " + @printf " %b" "$(PRINTABLE_DMBS_BUILD_MODULES:%= - %\n)" + @echo " " + @echo " " + @echo " Currently available build targets in this application: " + @echo " " + @printf " %b" "$(PRINTABLE_DMBS_BUILD_TARGETS:%= - %\n)" + @echo " " + @echo " " + @echo " Mandatory variables required by the selected build Modules: " + @echo " " + @printf " %b" "$(PRINTABLE_DMBS_MANDATORY_VARS:%= - %\n)" + @echo " " + @echo " " + @echo " Optional variables required by the selected build Modules: " + @echo " " + @printf " %b" "$(PRINTABLE_DMBS_OPTIONAL_VARS:%= - %\n)" + @echo " " + @echo " " + @echo " Variables provided by the selected build Modules: " + @echo " " + @printf " %b" "$(PRINTABLE_DMBS_PROVIDED_VARS:%= - %\n)" + @echo " " + @echo " " + @echo " Macros provided by the selected build Modules: " + @echo " " + @printf " %b" "$(PRINTABLE_DMBS_PROVIDED_MACROS:%= - %\n)" + @echo " " + @echo "===================================================================" + @echo " The DMBS Build System $(DMBS_VERSION) - Making MAKE easier." + @echo "===================================================================" + +# Lists build modules included by the project makefile, in alphabetical order +list_modules: + @echo Currently Used Build System Modules: + @printf " %b" "$(PRINTABLE_DMBS_BUILD_MODULES:%= - %\n)" + +# Lists build targets included by the project makefile, in alphabetical order +list_targets: + @echo Currently Available Build Targets: + @printf " %b" "$(PRINTABLE_DMBS_BUILD_TARGETS:%= - %\n)" + +# Lists mandatory variables that must be set by the project makefile, in alphabetical order +list_mandatory: + @echo Mandatory Variables for Included Modules: + @printf " %b" "$(PRINTABLE_DMBS_MANDATORY_VARS:%= - %\n)" + +# Lists optional variables that must be set by the project makefile, in alphabetical order +list_optional: + @echo Optional Variables for Included Modules: + @printf " %b" "$(PRINTABLE_DMBS_OPTIONAL_VARS:%= - %\n)" + +# Lists variables provided by the included build modules, in alphabetical order +list_provided: + @echo Variables Provided by the Included Modules: + @printf " %b" "$(PRINTABLE_DMBS_PROVIDED_VARS:%= - %\n)" + +# Lists macros provided by the included build modules, in alphabetical order +list_macros: + @echo Macros Provided by the Included Modules: + @printf " %b" "$(PRINTABLE_DMBS_PROVIDED_MACROS:%= - %\n)" + +# Debugging; "make print-VARNAME" will output the variable VARNAME's value +print-%: + @printf "%s = %s" $(@:print-%=%) $($(@:print-%=%)) + +# Disable default in-built make rules (those that are needed are explicitly +# defined, and doing so has performance benefits when recursively building) +ifeq ($(filter -r,$(MAKEFLAGS)),) + MAKEFLAGS += -r +endif +.SUFFIXES: + +# Phony build targets for this module +.PHONY: $(DMBS_BUILD_TARGETS) diff --git a/Firmware/LUFA/Build/DMBS/DMBS/cppcheck.md b/Firmware/LUFA/Build/DMBS/DMBS/cppcheck.md new file mode 100644 index 0000000..ec0e38d --- /dev/null +++ b/Firmware/LUFA/Build/DMBS/DMBS/cppcheck.md @@ -0,0 +1,134 @@ +DMBS - Dean's Makefile Build System +=================================== + + +Module: CPPCHECK +----------------- + +The CPPCHECK module provides build targets to perform static analysis of the +user application, using the open source `cppcheck` tool. + +## Importing This Module into a Makefile: + +To use this module in your application makefile, add the following code to your +makefile: + + include $(DMBS_PATH)/cppcheck.mk + +## Prerequisites: + +This module requires the `cppcheck` utility to be available in your system's +`PATH` variable. The `cppcheck` utility is distributed on the project's +[official site](http://cppcheck.sourceforge.net/) but is also +made available in many *nix operating system's package managers. + +## Build Targets: + +The following targets are supported by this module: + + + + + + + + + + + + +
cppcheckScan the project with CPPCHECK, and show all discovered issues.
cppcheck-configCheck the project with CPPCHECK, to find missing header paths.
+ +## Mandatory Variables: + +The following variables must be defined (with a `NAME = VALUE` syntax, one +variable per line) in the user makefile to be able to use this module: + + + + + + + + +
SRCList of all project source files to scan.
+ +## Optional Variables: + +The following variables may be defined (with a `NAME = VALUE` syntax, one +variable per line) in the user makefile. If not specified, a default value will +be assumed. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
CPPCHECK_INCLUDESExtra include paths to search, for any missing header files. Default is empty (no additional paths).
CPPCHECK_EXCLUDESList of source files, file paths or path fragments to exclude from the scan. Default is empty (no exclusions).
CPPCHECK_MSG_TEMPLATETemplate for error and warning message output. Default is `{file}:{line}: {severity} ({id}): {message}`.
CPPCHECK_ENABLEList of CPPCHECK checks to enable. Default is `all`.
CPPCHECK_SUPPRESSList of CPPCHECK checks to ignore. Default is `variableScope missingInclude`.
CPPCHECK_FAIL_ON_WARNINGBoolean, if `Y` the build will fail if CPPCHECK discovers any errors or warnings. If `N`, fail only on errors. Default is `Y`.
CPPCHECK_QUIETBoolean, if `Y` CPPCHECK will suppress all output except for discovered errors or warnings. If `N`, scan progress will be emitted. Default is `Y`.
CPPCHECK_FLAGS_Additional flags to pass to CPPCHECK when scans are started. Default is empty (no additional flags).
+ +## Provided Variables: + +The following variables may be referenced in a user makefile (via `$(NAME)` +syntax) if desired, as they are provided by this module. + + + + + + + + +
N/AThis module provides no variables.
+ +## Provided Macros: + +The following macros may be referenced in a user makefile (via +`$(call NAME, ARG1, ARG2, ...)` syntax) if desired, as they are provided by +this module. + + + + + + + + +
N/AThis module provides no macros.
+ +## Module Changelog: + +The changes to this module since its initial release are listed below, as of the +DMBS version where the change was made. + +### 20160403 +Initial release. diff --git a/Firmware/LUFA/Build/DMBS/DMBS/cppcheck.mk b/Firmware/LUFA/Build/DMBS/DMBS/cppcheck.mk new file mode 100644 index 0000000..9b82fc3 --- /dev/null +++ b/Firmware/LUFA/Build/DMBS/DMBS/cppcheck.mk @@ -0,0 +1,66 @@ +# +# DMBS Build System +# Released into the public domain. +# +# dean [at] fourwalledcubicle [dot] com +# www.fourwalledcubicle.com +# + +DMBS_BUILD_MODULES += CPPCHECK +DMBS_BUILD_TARGETS += cppcheck cppcheck-config +DMBS_BUILD_MANDATORY_VARS += SRC +DMBS_BUILD_OPTIONAL_VARS += CPPCHECK_INCLUDES CPPCHECK_EXCLUDES CPPCHECK_MSG_TEMPLATE CPPCHECK_ENABLE \ + CPPCHECK_SUPPRESS CPPCHECK_FAIL_ON_WARNING CPPCHECK_QUIET CPPCHECK_FLAGS +DMBS_BUILD_PROVIDED_VARS += +DMBS_BUILD_PROVIDED_MACROS += + +# Conditionally import the CORE module of DMBS if it is not already imported +DMBS_MODULE_PATH := $(patsubst %/,%,$(dir $(lastword $(MAKEFILE_LIST)))) +ifeq ($(findstring CORE, $(DMBS_BUILD_MODULES)),) + include $(DMBS_MODULE_PATH)/core.mk +endif + +# Default values of optionally user-supplied variables +CPPCHECK_INCLUDES ?= +CPPCHECK_EXCLUDES ?= +CPPCHECK_MSG_TEMPLATE ?= {file}:{line}: {severity} ({id}): {message} +CPPCHECK_ENABLE ?= all +CPPCHECK_SUPPRESS ?= variableScope missingInclude +CPPCHECK_FAIL_ON_WARNING ?= Y +CPPCHECK_QUIET ?= Y +CPPCHECK_FLAGS ?= + +# Sanity check user supplied values +$(foreach MANDATORY_VAR, $(DMBS_BUILD_MANDATORY_VARS), $(call ERROR_IF_UNSET, $(MANDATORY_VAR))) +$(call ERROR_IF_EMPTY, SRC) +$(call ERROR_IF_EMPTY, CPPCHECK_MSG_TEMPLATE) +$(call ERROR_IF_EMPTY, CPPCHECK_ENABLE) +$(call ERROR_IF_NONBOOL, CPPCHECK_FAIL_ON_WARNING) +$(call ERROR_IF_NONBOOL, CPPCHECK_QUIET) + +# Build a default argument list for cppcheck +BASE_CPPCHECK_FLAGS := --template="$(CPPCHECK_MSG_TEMPLATE)" $(CPPCHECK_INCLUDES:%=-I%) $(CPPCHECK_EXCLUDES:%=-i%) --inline-suppr --force --std=c99 + +# Sanity check parameters and construct additional command line arguments to cppcheck +ifeq ($(CPPCHECK_FAIL_ON_WARNING), Y) + BASE_CPPCHECK_FLAGS += --error-exitcode=1 +endif +ifeq ($(CPPCHECK_QUIET), Y) + BASE_CPPCHECK_FLAGS += --quiet +endif + +# Output Messages +MSG_CPPCHECK_CMD := ' [CPPCHECK]:' + +# Checks the CPPCheck configuration as used in the user project, to determine if any paths are missing or invalid +cppcheck-config: $(MAKEFILE_LIST) + @echo $(MSG_CPPCHECK_CMD) Checking cppcheck configuration check on source files + cppcheck $(BASE_CPPCHECK_FLAGS) --check-config $(CPPCHECK_FLAGS) $(SRC) + +# Runs a static analysis using CPPCheck to determine if there are any issues +cppcheck: $(MAKEFILE_LIST) + @echo $(MSG_CPPCHECK_CMD) Performing static analysis on source files + cppcheck $(BASE_CPPCHECK_FLAGS) --enable=$(CPPCHECK_ENABLE) $(CPPCHECK_SUPPRESS:%=--suppress=%) $(CPPCHECK_FLAGS) $(SRC) + +# Phony build targets for this module +.PHONY: $(DMBS_BUILD_TARGETS) diff --git a/Firmware/LUFA/Build/DMBS/DMBS/dfu.md b/Firmware/LUFA/Build/DMBS/DMBS/dfu.md new file mode 100644 index 0000000..456bbf6 --- /dev/null +++ b/Firmware/LUFA/Build/DMBS/DMBS/dfu.md @@ -0,0 +1,122 @@ +DMBS - Dean's Makefile Build System +=================================== + + +Module: DFU +----------------- + +The DFU module provides build targets to program a USB connected target running +a DFU class bootloader, via the official Atmel FLIP utility running via the +command line, or the open source `DFU-Programmer` tool. + +## Importing This Module into a Makefile: + +To use this module in your application makefile, add the following code to your +makefile: + + include $(DMBS_PATH)/dfu.mk + +## Prerequisites: + +This module requires the `batchisp` utility to be available in your system's +`PATH` variable. The `batchisp` utility is distributed as part of Atmel's FLIP +software which can be downloaded from the [official site](http://www.atmel.com). + +This module requires the `dfu-programmer` utility to be available in your +system's `PATH` variable. The `dfu-programmer` utility is distributed from the +[official project site](https://dfu-programmer.github.io/). + +## Build Targets: + +The following targets are supported by this module: + + + + + + + + + + + + + + + + + + + + +
flipProgram the application into the device's flash memory, using Atmel FLIP.
flip-eeProgram the application's EEPROM data into the device's EEPROM memory, using Atmel FLIP.
dfuProgram the application into the device's flash memory, using `dfu-programmer`.
dfu-eeProgram the application's EEPROM data into the device's EEPROM memory, using `dfu-programmer`.
+ +## Mandatory Variables: + +The following variables must be defined (with a `NAME = VALUE` syntax, one +variable per line) in the user makefile to be able to use this module: + + + + + + + + + + + + +
MCUName of the Atmel processor model (e.g. `at90usb1287`).
TARGETName of the application output file prefix (e.g. `TestApplication`).
+ +## Optional Variables: + +The following variables may be defined (with a `NAME = VALUE` syntax, one +variable per line) in the user makefile. If not specified, a default value will +be assumed. + + + + + + + + +
N/AThis module has no optional variables.
+ +## Provided Variables: + +The following variables may be referenced in a user makefile (via `$(NAME)` +syntax) if desired, as they are provided by this module. + + + + + + + + +
N/AThis module provides no variables.
+ +## Provided Macros: + +The following macros may be referenced in a user makefile (via +`$(call NAME, ARG1, ARG2, ...)` syntax) if desired, as they are provided by +this module. + + + + + + + + +
N/AThis module provides no macros.
+ +## Module Changelog: + +The changes to this module since its initial release are listed below, as of the +DMBS version where the change was made. + +### 20160403 +Initial release. diff --git a/Firmware/LUFA/Build/DMBS/DMBS/dfu.mk b/Firmware/LUFA/Build/DMBS/DMBS/dfu.mk new file mode 100644 index 0000000..1eb22b8 --- /dev/null +++ b/Firmware/LUFA/Build/DMBS/DMBS/dfu.mk @@ -0,0 +1,62 @@ +# +# DMBS Build System +# Released into the public domain. +# +# dean [at] fourwalledcubicle [dot] com +# www.fourwalledcubicle.com +# + +DMBS_BUILD_MODULES += DFU +DMBS_BUILD_TARGETS += flip flip-ee dfu dfu-ee +DMBS_BUILD_MANDATORY_VARS += MCU TARGET +DMBS_BUILD_OPTIONAL_VARS += +DMBS_BUILD_PROVIDED_VARS += +DMBS_BUILD_PROVIDED_MACROS += + +# Conditionally import the CORE module of DMBS if it is not already imported +DMBS_MODULE_PATH := $(patsubst %/,%,$(dir $(lastword $(MAKEFILE_LIST)))) +ifeq ($(findstring CORE, $(DMBS_BUILD_MODULES)),) + include $(DMBS_MODULE_PATH)/core.mk +endif + +# Sanity-check values of mandatory user-supplied variables +$(foreach MANDATORY_VAR, $(DMBS_BUILD_MANDATORY_VARS), $(call ERROR_IF_UNSET, $(MANDATORY_VAR))) +$(call ERROR_IF_EMPTY, MCU) +$(call ERROR_IF_EMPTY, TARGET) + +# Output Messages +MSG_COPY_CMD := ' [CP] :' +MSG_REMOVE_CMD := ' [RM] :' +MSG_DFU_CMD := ' [DFU] :' + +# Programs in the target FLASH memory using BATCHISP, the command line tool used by FLIP +flip: $(TARGET).hex $(MAKEFILE_LIST) + @echo $(MSG_DFU_CMD) Programming FLASH with batchisp using \"$<\" + batchisp -hardware usb -device $(MCU) -operation erase f loadbuffer $< program + batchisp -hardware usb -device $(MCU) -operation start reset 0 + +# Programs in the target EEPROM memory using BATCHISP, the command line tool used by FLIP +flip-ee: $(TARGET).eep $(MAKEFILE_LIST) + @echo $(MSG_COPY_CMD) Copying EEP file to temporary file \"$<.hex\" + cp $< $<.hex + @echo $(MSG_DFU_CMD) Programming EEPROM with batchisp using \"$<.hex\" + batchisp -hardware usb -device $(MCU) -operation memory EEPROM loadbuffer $<.hex program + batchisp -hardware usb -device $(MCU) -operation start reset 0 + @echo $(MSG_REMOVE_CMD) Removing temporary file \"$<.hex\" + rm $<.hex + +# Programs in the target FLASH memory using DFU-PROGRAMMER +dfu: $(TARGET).hex $(MAKEFILE_LIST) + @echo $(MSG_DFU_CMD) Programming FLASH with dfu-programmer using \"$<\" + dfu-programmer $(MCU) erase + dfu-programmer $(MCU) flash $< + dfu-programmer $(MCU) reset + +# Programs in the target EEPROM memory using DFU-PROGRAMMER +dfu-ee: $(TARGET).eep $(MAKEFILE_LIST) + @echo $(MSG_DFU_CMD) Programming EEPROM with dfu-programmer using \"$<\" + dfu-programmer $(MCU) flash --eeprom $< + dfu-programmer $(MCU) reset + +# Phony build targets for this module +.PHONY: $(DMBS_BUILD_TARGETS) diff --git a/Firmware/LUFA/Build/DMBS/DMBS/doxygen.md b/Firmware/LUFA/Build/DMBS/DMBS/doxygen.md new file mode 100644 index 0000000..837704a --- /dev/null +++ b/Firmware/LUFA/Build/DMBS/DMBS/doxygen.md @@ -0,0 +1,118 @@ +DMBS - Dean's Makefile Build System +=================================== + + +Module: DOXYGEN +----------------- + +The DOXYGEN module provides build targets to automatically generate API +documentation for a project, using the open-source Doxygen tool. + +## Importing This Module into a Makefile: + +To use this module in your application makefile, add the following code to your +makefile: + + include $(DMBS_PATH)/doxygen.mk + +## Prerequisites: + +This module requires the `doxygen` utility to be available in your system's +`PATH` variable. The `doxygen` utility is distributed on the project's +[official site](http://doxygen.org/) but is also +made available in many *nix operating system's package managers. + +## Build Targets: + +The following targets are supported by this module: + + + + + + + + + + + + + + + + +
doxygenGenerate project documentation, via Doxygen.
doxygen-createCreate a new project Doxygen template, which can then be customized.
doxygen-upgradeUpgrade an existing project Doxygen template to the latest Doxygen version.
+ +## Mandatory Variables: + +The following variables must be defined (with a `NAME = VALUE` syntax, one +variable per line) in the user makefile to be able to use this module: + + + + + + + + +
N/AThis module has no mandatory variables.
+ +## Optional Variables: + +The following variables may be defined (with a `NAME = VALUE` syntax, one +variable per line) in the user makefile. If not specified, a default value will +be assumed. + + + + + + + + + + + + + + + + +
DOXYGEN_CONFName of the Doxygen project configuration file that should be used when generating documentation, or creating/upgrading the configuration file.
DOXYGEN_FAIL_ON_WARNINGBoolean, if `Y` the build will fail if Doxygen encounters any errors or warnings. If `N`, fail only on errors. Default is `Y`.
DOXYGEN_OVERRIDE_PARAMSList of `NAME=VALUE` parameters which should override the values specified in the project configuration file, when building documentation.
+ +## Provided Variables: + +The following variables may be referenced in a user makefile (via `$(NAME)` +syntax) if desired, as they are provided by this module. + + + + + + + + +
N/AThis module provides no variables.
+ +## Provided Macros: + +The following macros may be referenced in a user makefile (via +`$(call NAME, ARG1, ARG2, ...)` syntax) if desired, as they are provided by +this module. + + + + + + + + +
N/AThis module provides no macros.
+ +## Module Changelog: + +The changes to this module since its initial release are listed below, as of the +DMBS version where the change was made. + +### 20160403 +Initial release. diff --git a/Firmware/LUFA/Build/DMBS/DMBS/doxygen.mk b/Firmware/LUFA/Build/DMBS/DMBS/doxygen.mk new file mode 100644 index 0000000..45639ad --- /dev/null +++ b/Firmware/LUFA/Build/DMBS/DMBS/doxygen.mk @@ -0,0 +1,62 @@ +# +# DMBS Build System +# Released into the public domain. +# +# dean [at] fourwalledcubicle [dot] com +# www.fourwalledcubicle.com +# + +DMBS_BUILD_MODULES += DOXYGEN +DMBS_BUILD_TARGETS += doxygen doxygen-upgrade doxygen-create +DMBS_BUILD_MANDATORY_VARS += +DMBS_BUILD_OPTIONAL_VARS += DOXYGEN_CONF DOXYGEN_FAIL_ON_WARNING DOXYGEN_OVERRIDE_PARAMS +DMBS_BUILD_PROVIDED_VARS += +DMBS_BUILD_PROVIDED_MACROS += + +# Conditionally import the CORE module of DMBS if it is not already imported +DMBS_MODULE_PATH := $(patsubst %/,%,$(dir $(lastword $(MAKEFILE_LIST)))) +ifeq ($(findstring CORE, $(DMBS_BUILD_MODULES)),) + include $(DMBS_MODULE_PATH)/core.mk +endif + +# Default values of optionally user-supplied variables +DOXYGEN_CONF ?= doxyfile +DOXYGEN_FAIL_ON_WARNING ?= Y +DOXYGEN_OVERRIDE_PARAMS ?= QUIET=YES + +# Sanity check user supplied values +$(foreach MANDATORY_VAR, $(DMBS_BUILD_MANDATORY_VARS), $(call ERROR_IF_UNSET, $(MANDATORY_VAR))) +$(call ERROR_IF_EMPTY, DOXYGEN_CONF) +$(call ERROR_IF_NONBOOL, DOXYGEN_FAIL_ON_WARNING) + +# Output Messages +MSG_DOXYGEN_CMD := ' [DOXYGEN] :' + +# Determine Doxygen invocation command +BASE_DOXYGEN_CMD := ( cat $(DOXYGEN_CONF) $(DOXYGEN_OVERRIDE_PARAMS:%=; echo "%") ) | doxygen - +ifeq ($(DOXYGEN_FAIL_ON_WARNING), Y) + DOXYGEN_CMD := if ( $(BASE_DOXYGEN_CMD) 2>&1 | grep -v "warning: ignoring unsupported tag" ;); then exit 1; fi; +else + DOXYGEN_CMD := $(BASE_DOXYGEN_CMD) +endif + +# Error if the specified Doxygen configuration file does not exist +$(DOXYGEN_CONF): + $(error Doxygen configuration file $@ does not exist) + +# Builds the project documentation using the specified configuration file and the DOXYGEN tool +doxygen: $(DOXYGEN_CONF) $(MAKEFILE_LIST) + @echo $(MSG_DOXYGEN_CMD) Configuration file \"$(DOXYGEN_CONF)\" with parameters \"$(DOXYGEN_OVERRIDE_PARAMS)\" + $(DOXYGEN_CMD) + +# Upgrades an existing Doxygen configuration file to the latest Doxygen template, preserving settings +doxygen-upgrade: $(DOXYGEN_CONF) $(MAKEFILE_LIST) + @echo $(MSG_DOXYGEN_CMD) Upgrading configuration file \"$(DOXYGEN_CONF)\" with latest template + doxygen -u $(DOXYGEN_CONF) > /dev/null + +# Creates a new Doxygen configuration file with the set file name +doxygen-create: $(MAKEFILE_LIST) + @echo $(MSG_DOXYGEN_CMD) Creating new configuration file \"$(DOXYGEN_CONF)\" with latest template + doxygen -g $(DOXYGEN_CONF) > /dev/null + + diff --git a/Firmware/LUFA/Build/DMBS/DMBS/gcc.md b/Firmware/LUFA/Build/DMBS/DMBS/gcc.md new file mode 100644 index 0000000..f516da5 --- /dev/null +++ b/Firmware/LUFA/Build/DMBS/DMBS/gcc.md @@ -0,0 +1,204 @@ +DMBS - Dean's Makefile Build System +=================================== + + +Module: GCC +----------------- + +The GCC module provides build targets to compile a user application, using a +variant of GCC for a specific target architecture (such as `avr-gcc`). + +## Importing This Module into a Makefile: + +To use this module in your application makefile, add the following code to your +makefile: + + include $(DMBS_PATH)/gcc.mk + +## Prerequisites: + +This module requires the GCC compiler to be installed and available in the +system's `PATH` variable for the desired target architecture. + +## Build Targets: + +The following targets are supported by this module: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
sizeShow the compiled binary size for the various memory segments.
symbol-sizesShow the size of each symbol in the compiled binary (useful to find large functions to optimize further).
allBuild application and generate all binary (BIN, ELF, HEX) and auxiliary (LSS, MAP, SYM, etc.) output files.
libGenerate a static `.a` library from the application code, containing the flash region's data.
elfGenerate an ELF debug file from the application code, containing all region's data.
binGenerate a flat BIN binary file from the application code, containing the flash region's data.
hexGenerate a pair of Intel HEX files from the application code, containing the flash region's data (HEX) and EEPROM data (EEP).
lssGenerate a LSS listing file showing the disassembly of the compiled application.
cleanRemove all generated project intermediary and binary output files.
mostlycleanRemove all generated project intermediary output files, but preserve the binary output files.
+ +## Mandatory Variables: + +The following variables must be defined (with a `NAME = VALUE` syntax, one +variable per line) in the user makefile to be able to use this module: + + + + + + + + + + + + + + + + + + + + +
MCUName of the Atmel processor model (e.g. `at90usb1287`).
TARGETName of the application output file prefix (e.g. `TestApplication`).
ARCHTarget device architecture (e.g. `AVR8`).
SRCList of all project source files (C, C++, ASM).
+ +## Optional Variables: + +The following variables may be defined (with a `NAME = VALUE` syntax, one +variable per line) in the user makefile. If not specified, a default value will +be assumed. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
OPTIMIZATIONOptimization level to use when compiling C and C++ source files. Default is `s` (optimize for smallest size).
C_STANDARDC language standard used when compiling C language source files. Default is `gnu99` (C99 standard with GNU extensions)./td> +
CPP_STANDARDC++ language standard used when compiling C++ language source files. Default is `gnu++98` (C++98 standard with GNU extensions)./td> +
F_CPUProcessor core clock frequency, in Hz. This is used by some architectures for functions such as software spin-loop delays. Default is blank (no value defined).
C_FLAGSCommon GCC flags passed to the compiler for C language (C) input files. Default is blank (no additional flags).
CPP_FLAGSCommon GCC flags passed to the compiler for C++ language (CPP) input files. Default is blank (no additional flags).
ASM_FLAGSCommon GCC flags passed to the assembler for assembly language (S) input files. Default is blank (no additional flags).
CC_FLAGSCommon GCC flags passed to the compiler for all source file types. Default is blank (no additional flags).
LD_FLAGSExtra flags to pass to the GNU linker when linking the compiled object files into the resulting binary. Default is blank (no additional flags).
LINKER_RELAXATIONSBoolean, if `Y` linker relaxations will be enabled to slightly reduce the resulting binary's size. Default is `Y`.
OBJDIRDirectory to store the intermediate object files, as they are generated from the source files. Default is `obj`.
OBJECT_FILESList of additional `.o` object files to link into the final binary. Default is blank (no additional objects).
DEBUG_FORMATDebug ELF file format to generate. Default is `dwarf-2`.
DEBUG_LEVELLevel of the debugging information to generate in the compiled object files. Debug is 2 (medium level debugging information).
COMPILER_PATHPath to the compiler to use, in case a specific compiler should be substituted for the one in the system's `PATH` variable. Default is blank (use `PATH` provided compiler).
+ +## Provided Variables: + +The following variables may be referenced in a user makefile (via `$(NAME)` +syntax) if desired, as they are provided by this module. + + + + + + + + +
N/AThis module provides no variables.
+ +## Provided Macros: + +The following macros may be referenced in a user makefile (via +`$(call NAME, ARG1, ARG2, ...)` syntax) if desired, as they are provided by +this module. + + + + + + + + +
N/AThis module provides no macros.
+ +## Module Changelog: + +The changes to this module since its initial release are listed below, as of the +DMBS version where the change was made. + +### 20160403 +Initial release. diff --git a/Firmware/LUFA/Build/DMBS/DMBS/gcc.mk b/Firmware/LUFA/Build/DMBS/DMBS/gcc.mk new file mode 100644 index 0000000..3affa63 --- /dev/null +++ b/Firmware/LUFA/Build/DMBS/DMBS/gcc.mk @@ -0,0 +1,270 @@ +# +# DMBS Build System +# Released into the public domain. +# +# dean [at] fourwalledcubicle [dot] com +# www.fourwalledcubicle.com +# + +DMBS_BUILD_MODULES += GCC +DMBS_BUILD_TARGETS += size symbol-sizes all lib elf bin hex lss clean mostlyclean +DMBS_BUILD_MANDATORY_VARS += TARGET ARCH MCU SRC +DMBS_BUILD_OPTIONAL_VARS += BOARD OPTIMIZATION C_STANDARD CPP_STANDARD F_CPU C_FLAGS CPP_FLAGS ASM_FLAGS CC_FLAGS LD_FLAGS OBJDIR OBJECT_FILES DEBUG_TYPE DEBUG_LEVEL LINKER_RELAXATIONS COMPILER_PATH +DMBS_BUILD_PROVIDED_VARS += +DMBS_BUILD_PROVIDED_MACROS += + +# Conditionally import the CORE module of DMBS if it is not already imported +DMBS_MODULE_PATH := $(patsubst %/,%,$(dir $(lastword $(MAKEFILE_LIST)))) +ifeq ($(findstring CORE, $(DMBS_BUILD_MODULES)),) + include $(DMBS_MODULE_PATH)/core.mk +endif + +# Default values of optionally user-supplied variables +COMPILER_PATH ?= +OPTIMIZATION ?= s +F_CPU ?= +C_STANDARD ?= gnu99 +CPP_STANDARD ?= gnu++98 +C_FLAGS ?= +CPP_FLAGS ?= +ASM_FLAGS ?= +CC_FLAGS ?= +OBJDIR ?= obj +OBJECT_FILES ?= +DEBUG_FORMAT ?= dwarf-2 +DEBUG_LEVEL ?= 2 +LINKER_RELAXATIONS ?= Y + +# Sanity check user supplied values +$(foreach MANDATORY_VAR, $(DMBS_BUILD_MANDATORY_VARS), $(call ERROR_IF_UNSET, $(MANDATORY_VAR))) +$(call ERROR_IF_EMPTY, MCU) +$(call ERROR_IF_EMPTY, TARGET) +$(call ERROR_IF_EMPTY, ARCH) +$(call ERROR_IF_EMPTY, OPTIMIZATION) +$(call ERROR_IF_EMPTY, C_STANDARD) +$(call ERROR_IF_EMPTY, CPP_STANDARD) +$(call ERROR_IF_EMPTY, OBJDIR) +$(call ERROR_IF_EMPTY, DEBUG_FORMAT) +$(call ERROR_IF_EMPTY, DEBUG_LEVEL) +$(call ERROR_IF_NONBOOL, LINKER_RELAXATIONS) + +# Determine the utility prefix to use for the selected architecture +ifeq ($(ARCH), AVR8) + CROSS := $(COMPILER_PATH)avr +else ifeq ($(ARCH), XMEGA) + CROSS := $(COMPILER_PATH)avr +else ifeq ($(ARCH), UC3) + CROSS := $(COMPILER_PATH)avr32 +else + $(error Unsupported architecture "$(ARCH)") +endif + +# Output Messages +MSG_INFO_MESSAGE := ' [INFO] :' +MSG_COMPILE_CMD := ' [GCC] :' +MSG_ASSEMBLE_CMD := ' [GAS] :' +MSG_NM_CMD := ' [NM] :' +MSG_REMOVE_CMD := ' [RM] :' +MSG_LINK_CMD := ' [LNK] :' +MSG_ARCHIVE_CMD := ' [AR] :' +MSG_SIZE_CMD := ' [SIZE] :' +MSG_OBJCPY_CMD := ' [OBJCPY] :' +MSG_OBJDMP_CMD := ' [OBJDMP] :' + +# Convert input source file list to differentiate them by type +C_SOURCE := $(filter %.c, $(SRC)) +CPP_SOURCE := $(filter %.cpp, $(SRC)) +ASM_SOURCE := $(filter %.S, $(SRC)) + +# Create a list of unknown source file types, if any are found throw an error +UNKNOWN_SOURCE := $(filter-out $(C_SOURCE) $(CPP_SOURCE) $(ASM_SOURCE), $(SRC)) +ifneq ($(UNKNOWN_SOURCE),) + $(error Unknown input source file formats: $(UNKNOWN_SOURCE)) +endif + +# Convert input source filenames into a list of required output object files +OBJECT_FILES += $(addsuffix .o, $(basename $(SRC))) + +# Check if an output object file directory was specified instead of the input file location +ifneq ($(OBJDIR),.) + # Prefix all the object filenames with the output object file directory path + OBJECT_FILES := $(addprefix $(patsubst %/,%,$(OBJDIR))/, $(notdir $(OBJECT_FILES))) + + # Check if any object file (without path) appears more than once in the object file list + ifneq ($(words $(sort $(OBJECT_FILES))), $(words $(OBJECT_FILES))) + $(error Cannot build with OBJDIR parameter set - one or more object file name is not unique) + endif + + # Create the output object file directory if it does not exist and add it to the virtual path list + $(shell mkdir -p $(OBJDIR) 2> /dev/null) + VPATH += $(dir $(SRC)) +endif + +# Create a list of dependency files from the list of object files +DEPENDENCY_FILES := $(OBJECT_FILES:%.o=%.d) + +# Create a list of common flags to pass to the compiler/linker/assembler +BASE_CC_FLAGS := -pipe -g$(DEBUG_FORMAT) -g$(DEBUG_LEVEL) +ifneq ($(findstring $(ARCH), AVR8 XMEGA),) + BASE_CC_FLAGS += -mmcu=$(MCU) -fshort-enums -fno-inline-small-functions -fpack-struct +else ifneq ($(findstring $(ARCH), UC3),) + BASE_CC_FLAGS += -mpart=$(MCU:at32%=%) -masm-addr-pseudos +endif +BASE_CC_FLAGS += -Wall -fno-strict-aliasing -funsigned-char -funsigned-bitfields -ffunction-sections +BASE_CC_FLAGS += -I. +BASE_CC_FLAGS += -DARCH=ARCH_$(ARCH) +ifneq ($(F_CPU),) + BASE_CC_FLAGS += -DF_CPU=$(F_CPU)UL +endif +ifeq ($(LINKER_RELAXATIONS), Y) +BASE_CC_FLAGS += -mrelax +endif + +# Additional language specific compiler flags +BASE_C_FLAGS := -x c -O$(OPTIMIZATION) -std=$(C_STANDARD) -Wstrict-prototypes +BASE_CPP_FLAGS := -x c++ -O$(OPTIMIZATION) -std=$(CPP_STANDARD) +BASE_ASM_FLAGS := -x assembler-with-cpp + +# This flag is required for bootloaders as GCC will emit invalid jump table +# assembly code for devices with large amounts of flash; the jump table target +# is extracted from FLASH without using the correct ELPM instruction, resulting +# in a pseudo-random jump target. +BASE_CC_FLAGS += -fno-jump-tables + +# Create a list of flags to pass to the linker +BASE_LD_FLAGS := -lm -Wl,-Map=$(TARGET).map,--cref -Wl,--gc-sections +ifeq ($(LINKER_RELAXATIONS), Y) + BASE_LD_FLAGS += -Wl,--relax +endif +ifneq ($(findstring $(ARCH), AVR8 XMEGA),) + BASE_LD_FLAGS += -mmcu=$(MCU) +else ifneq ($(findstring $(ARCH), UC3),) + BASE_LD_FLAGS += -mpart=$(MCU:at32%=%) --rodata-writable --direct-data +endif + +# Determine flags to pass to the size utility based on its reported features (only invoke if size target required) +# and on an architecture where this non-standard patch is available +ifneq ($(ARCH), UC3) +size: SIZE_MCU_FLAG := $(shell $(CROSS)-size --help | grep -- --mcu > /dev/null && echo --mcu=$(MCU) ) +size: SIZE_FORMAT_FLAG := $(shell $(CROSS)-size --help | grep -- --format=.*avr > /dev/null && echo --format=avr ) +endif + +# Pre-build informational target, to give compiler and project name information when building +build_begin: + @echo $(MSG_INFO_MESSAGE) Begin compilation of project \"$(TARGET)\"... + @echo "" + @$(CROSS)-gcc --version + +# Post-build informational target, to project name information when building has completed +build_end: + @echo $(MSG_INFO_MESSAGE) Finished building project \"$(TARGET)\". + +# Prints size information of a compiled application (FLASH, RAM and EEPROM usages) +size: $(TARGET).elf + @echo $(MSG_SIZE_CMD) Determining size of \"$<\" + @echo "" + $(CROSS)-size $(SIZE_MCU_FLAG) $(SIZE_FORMAT_FLAG) $< + +# Prints size information on the symbols within a compiled application in decimal bytes +symbol-sizes: $(TARGET).elf + @echo $(MSG_NM_CMD) Extracting \"$<\" symbols with decimal byte sizes + $(CROSS)-nm --size-sort --demangle --radix=d $< + +# Cleans intermediary build files, leaving only the compiled application files +mostlyclean: + @echo $(MSG_REMOVE_CMD) Removing object files of \"$(TARGET)\" + rm -f $(OBJECT_FILES) + @echo $(MSG_REMOVE_CMD) Removing dependency files of \"$(TARGET)\" + rm -f $(DEPENDENCY_FILES) + +# Cleans all build files, leaving only the original source code +clean: mostlyclean + @echo $(MSG_REMOVE_CMD) Removing output files of \"$(TARGET)\" + rm -f $(TARGET).elf $(TARGET).hex $(TARGET).bin $(TARGET).eep $(TARGET).map $(TARGET).lss $(TARGET).sym lib$(TARGET).a + +# Performs a complete build of the user application and prints size information afterwards +all: build_begin elf hex bin lss sym size build_end + +# Helper targets, to build a specific type of output file without having to know the project target name +lib: lib$(TARGET).a +elf: $(TARGET).elf +hex: $(TARGET).hex $(TARGET).eep +bin: $(TARGET).bin +lss: $(TARGET).lss +sym: $(TARGET).sym + +# Default target to *create* the user application's specified source files; if this rule is executed by +# make, the input source file doesn't exist and an error needs to be presented to the user +$(SRC): + $(error Source file does not exist: $@) + +# Compiles an input C source file and generates an assembly listing for it +%.s: %.c $(MAKEFILE_LIST) + @echo $(MSG_COMPILE_CMD) Generating assembly from C file \"$(notdir $<)\" + $(CROSS)-gcc -S $(BASE_CC_FLAGS) $(BASE_C_FLAGS) $(CC_FLAGS) $(C_FLAGS) $< -o $@ + +# Compiles an input C++ source file and generates an assembly listing for it +%.s: %.cpp $(MAKEFILE_LIST) + @echo $(MSG_COMPILE_CMD) Generating assembly from C++ file \"$(notdir $<)\" + $(CROSS)-gcc -S $(BASE_CC_FLAGS) $(BASE_CPP_FLAGS) $(CC_FLAGS) $(CPP_FLAGS) $< -o $@ + +# Compiles an input C source file and generates a linkable object file for it +$(OBJDIR)/%.o: %.c $(MAKEFILE_LIST) + @echo $(MSG_COMPILE_CMD) Compiling C file \"$(notdir $<)\" + $(CROSS)-gcc -c $(BASE_CC_FLAGS) $(BASE_C_FLAGS) $(CC_FLAGS) $(C_FLAGS) -MMD -MP -MF $(@:%.o=%.d) $< -o $@ + +# Compiles an input C++ source file and generates a linkable object file for it +$(OBJDIR)/%.o: %.cpp $(MAKEFILE_LIST) + @echo $(MSG_COMPILE_CMD) Compiling C++ file \"$(notdir $<)\" + $(CROSS)-gcc -c $(BASE_CC_FLAGS) $(BASE_CPP_FLAGS) $(CC_FLAGS) $(CPP_FLAGS) -MMD -MP -MF $(@:%.o=%.d) $< -o $@ + +# Assembles an input ASM source file and generates a linkable object file for it +$(OBJDIR)/%.o: %.S $(MAKEFILE_LIST) + @echo $(MSG_ASSEMBLE_CMD) Assembling \"$(notdir $<)\" + $(CROSS)-gcc -c $(BASE_CC_FLAGS) $(BASE_ASM_FLAGS) $(CC_FLAGS) $(ASM_FLAGS) -MMD -MP -MF $(@:%.o=%.d) $< -o $@ + +# Generates a library archive file from the user application, which can be linked into other applications +.PRECIOUS : $(OBJECT_FILES) +.SECONDARY : %.a +%.a: $(OBJECT_FILES) + @echo $(MSG_ARCHIVE_CMD) Archiving object files into \"$@\" + $(CROSS)-ar rcs $@ $(OBJECT_FILES) + +# Generates an ELF debug file from the user application, which can be further processed for FLASH and EEPROM data +# files, or used for programming and debugging directly +.PRECIOUS : $(OBJECT_FILES) +.SECONDARY : %.elf +%.elf: $(OBJECT_FILES) + @echo $(MSG_LINK_CMD) Linking object files into \"$@\" + $(CROSS)-gcc $^ -o $@ $(BASE_LD_FLAGS) $(LD_FLAGS) + +# Extracts out the loadable FLASH memory data from the project ELF file, and creates an Intel HEX format file of it +%.hex: %.elf + @echo $(MSG_OBJCPY_CMD) Extracting HEX file data from \"$<\" + $(CROSS)-objcopy -O ihex -R .eeprom -R .fuse -R .lock -R .signature $< $@ + +# Extracts out the loadable FLASH memory data from the project ELF file, and creates an Binary format file of it +%.bin: %.elf + @echo $(MSG_OBJCPY_CMD) Extracting BIN file data from \"$<\" + $(CROSS)-objcopy -O binary -R .eeprom -R .fuse -R .lock -R .signature $< $@ + +# Extracts out the loadable EEPROM memory data from the project ELF file, and creates an Intel HEX format file of it +%.eep: %.elf + @echo $(MSG_OBJCPY_CMD) Extracting EEP file data from \"$<\" + $(CROSS)-objcopy -O ihex -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 --no-change-warnings $< $@ || exit 0 + +# Creates an assembly listing file from an input project ELF file, containing interleaved assembly and source data +%.lss: %.elf + @echo $(MSG_OBJDMP_CMD) Extracting LSS file data from \"$<\" + $(CROSS)-objdump -h -d -S -z $< > $@ + +# Creates a symbol file listing the loadable and discarded symbols from an input project ELF file +%.sym: %.elf + @echo $(MSG_NM_CMD) Extracting SYM file data from \"$<\" + $(CROSS)-nm -n $< > $@ + +# Include build dependency files +-include $(DEPENDENCY_FILES) + +# Phony build targets for this module +.PHONY: build_begin build_end $(DMBS_BUILD_TARGETS) diff --git a/Firmware/LUFA/Build/DMBS/DMBS/hid.md b/Firmware/LUFA/Build/DMBS/DMBS/hid.md new file mode 100644 index 0000000..b2dfbf7 --- /dev/null +++ b/Firmware/LUFA/Build/DMBS/DMBS/hid.md @@ -0,0 +1,129 @@ +DMBS - Dean's Makefile Build System +=================================== + + +Module: HID +----------------- + +The HID module provides build targets to program a target running a PJRC Teensy +or LUFA compatible HID class bootloader. + +## Importing This Module into a Makefile: + +To use this module in your application makefile, add the following code to your +makefile: + + include $(DMBS_PATH)/hid.mk + +## Prerequisites: + +This module requires the `teensy_loader_cli` utility to be available in your +system's `PATH` variable. The `teensy_loader_cli` utility is distributed in +a modified form (from PJRC) in the LUFA project's +[official site](http://www.lufa-lib.org/), but is also +made available in its original form directly from the +[PJRC website](https://www.pjrc.com/teensy/loader_cli.html). Note that the +original tool works with Teensy boards only, and not LUFA HID bootloader +devices. + +This module requires the `hid_bootloader_cli` utility to be available in your +system's `PATH` variable. The `hid_bootloader_cli` Python script utility is +distributed in LUFA project's [official site](http://www.lufa-lib.org/). + +This module requires the AVR-GCC compiler to be installed and available in the +system's `PATH` variable. + +## Build Targets: + +The following targets are supported by this module: + + + + + + + + + + + + + + + + + + + + +
hidProgram a LUFA HID class bootloader device, using the `hid_bootloader_cli.py` Python script.
hid-eeProgram a LUFA HID class bootloader device's EEPROM, using the `hid_bootloader_cli.py` Python script and a shim application which is programmed into the target's flash.
teensyProgram a LUFA HID class bootloader device or Teensy board, using the `teensy_loader_cli` tool.
teensy-eeProgram a LUFA HID class bootloader device's EEPROM, using the `teensy_loader_cli` tool and a shim application which is programmed into the target's flash.
+ +## Mandatory Variables: + +The following variables must be defined (with a `NAME = VALUE` syntax, one +variable per line) in the user makefile to be able to use this module: + + + + + + + + + + + + +
MCUName of the Atmel processor model (e.g. `at90usb1287`).
TARGETName of the application output file prefix (e.g. `TestApplication`).
+ +## Optional Variables: + +The following variables may be defined (with a `NAME = VALUE` syntax, one +variable per line) in the user makefile. If not specified, a default value will +be assumed. + + + + + + + + +
N/AThis module has no optional variables.
+ +## Provided Variables: + +The following variables may be referenced in a user makefile (via `$(NAME)` +syntax) if desired, as they are provided by this module. + + + + + + + + +
N/AThis module provides no variables.
+ +## Provided Macros: + +The following macros may be referenced in a user makefile (via +`$(call NAME, ARG1, ARG2, ...)` syntax) if desired, as they are provided by +this module. + + + + + + + + +
N/AThis module provides no macros.
+ +## Module Changelog: + +The changes to this module since its initial release are listed below, as of the +DMBS version where the change was made. + +### 20160403 +Initial release. diff --git a/Firmware/LUFA/Build/DMBS/DMBS/hid.mk b/Firmware/LUFA/Build/DMBS/DMBS/hid.mk new file mode 100644 index 0000000..7a0ad9d --- /dev/null +++ b/Firmware/LUFA/Build/DMBS/DMBS/hid.mk @@ -0,0 +1,57 @@ +# +# DMBS Build System +# Released into the public domain. +# +# dean [at] fourwalledcubicle [dot] com +# www.fourwalledcubicle.com +# + +DMBS_BUILD_MODULES += HID +DMBS_BUILD_TARGETS += hid hid-ee teensy teensy-ee +DMBS_BUILD_MANDATORY_VARS += MCU TARGET +DMBS_BUILD_OPTIONAL_VARS += +DMBS_BUILD_PROVIDED_VARS += +DMBS_BUILD_PROVIDED_MACROS += + +# Conditionally import the CORE module of DMBS if it is not already imported +DMBS_MODULE_PATH := $(patsubst %/,%,$(dir $(lastword $(MAKEFILE_LIST)))) +ifeq ($(findstring CORE, $(DMBS_BUILD_MODULES)),) + include $(DMBS_MODULE_PATH)/core.mk +endif + +# Sanity-check values of mandatory user-supplied variables +$(foreach MANDATORY_VAR, $(DMBS_BUILD_MANDATORY_VARS), $(call ERROR_IF_UNSET, $(MANDATORY_VAR))) +$(call ERROR_IF_EMPTY, MCU) +$(call ERROR_IF_EMPTY, TARGET) + +# Output Messages +MSG_HID_BOOTLOADER_CMD := ' [HID] :' +MSG_OBJCPY_CMD := ' [OBJCPY] :' +MSG_MAKE_CMD := ' [MAKE] :' + +# Programs in the target FLASH memory using the HID_BOOTLOADER_CLI tool +hid: $(TARGET).hex $(MAKEFILE_LIST) + @echo $(MSG_HID_BOOTLOADER_CMD) Programming FLASH with hid_bootloader_cli using \"$<\" + hid_bootloader_cli -mmcu=$(MCU) -v $< + +# Programs in the target EEPROM memory using the HID_BOOTLOADER_CLI tool (note: clears target FLASH memory) +hid-ee: $(TARGET).eep $(MAKEFILE_LIST) + @echo $(MSG_OBJCPY_CMD) Converting \"$<\" to a binary file \"InputEEData.bin\" + avr-objcopy -I ihex -O binary $< $(DMBS_MODULE_PATH)/HID_EEPROM_Loader/InputEEData.bin + @echo $(MSG_MAKE_CMD) Making EEPROM loader application for \"$<\" + $(MAKE) -C $(DMBS_MODULE_PATH)/HID_EEPROM_Loader/ MCU=$(MCU) clean hid + +# Programs in the target FLASH memory using the TEENSY_BOOTLOADER_CLI tool +teensy: $(TARGET).hex $(MAKEFILE_LIST) + @echo $(MSG_HID_BOOTLOADER_CMD) Programming FLASH with teensy_loader_cli using \"$<\" + teensy_loader_cli -mmcu=$(MCU) -v $< + +# Programs in the target EEPROM memory using the TEENSY_BOOTLOADER_CLI tool (note: clears target FLASH memory) +teensy-ee: $(TARGET).hex $(MAKEFILE_LIST) + @echo $(MSG_OBJCPY_CMD) Converting \"$<\" to a binary file \"InputEEData.bin\" + avr-objcopy -I ihex -O binary $< $(DMBS_MODULE_PATH)/HID_EEPROM_Loader/InputEEData.bin + @echo $(MSG_MAKE_CMD) Making EEPROM loader application for \"$<\" + $(MAKE) -s -C $(DMBS_MODULE_PATH)/HID_EEPROM_Loader/ MCU=$(MCU) clean teensy + +# Phony build targets for this module +.PHONY: $(DMBS_BUILD_TARGETS) diff --git a/Firmware/LUFA/Build/DMBS/Readme.md b/Firmware/LUFA/Build/DMBS/Readme.md new file mode 100644 index 0000000..f4f7a5f --- /dev/null +++ b/Firmware/LUFA/Build/DMBS/Readme.md @@ -0,0 +1,123 @@ +DMBS - Dean's Makefile Build System +=================================== + + +Project Overview +---------------- + +GNU Make is scary, and it's tough to get the rules right sometimes. Many +projects get by via simple copy-pasting of old makefiles, resulting in many +redundant copies of the same old rules. DMBS aims to solve this by providing a +simple modular set of makefiles which can be included by your project to quickly +add various build functionality. + +This aims to replace the old WinAVR "mfile" makefile template, giving better +functionality and much simpler user makefiles. + + +Benefits: +---------------- + +Apart from much simpler, cleaner makefiles DMBS carries the aim of making the +process of troubleshooting build issues a little easier. Lots can go wrong, so +DMBS tries to sanity check its inputs wherever possible, and produce +human-readable error messages. Forgotten to set a variable? Get a +`Makefile {X} value not set.` message, rather than a possibly unrelated message. +Have the wrong filename? See `Source file does not exist: {X}` rather than the +infamous `No rule to make target {X}` message. + + +Use: +---------------- + +A template user makefile is provided in the `Template` directory. DMBS modules +are included via a GNU Make `include` directive. While the DMBS `core` module is +always required, you can pick and choose what other modules you wish to add to +your user project. + +[See here for the documentation on the individual modules provided by DMBS.](DMBS/ModulesOverview.md) +If you're interested in writing your own DMBS module(s), [see here.](DMBS/WritingYourOwnModules.md) + +Here's an example user makefile: + + MCU = atmega128 + ARCH = AVR8 + F_CPU = 8000000 + OPTIMIZATION = s + TARGET = Template + SRC = $(TARGET).c + CC_FLAGS = + LD_FLAGS = + + # Default target + all: + + # Include DMBS build script makefiles + DMBS_PATH ?= ../DMBS + include $(DMBS_PATH)/core.mk + include $(DMBS_PATH)/gcc.mk + include $(DMBS_PATH)/cppcheck.mk + include $(DMBS_PATH)/doxygen.mk + include $(DMBS_PATH)/dfu.mk + include $(DMBS_PATH)/hid.mk + include $(DMBS_PATH)/avrdude.mk + include $(DMBS_PATH)/atprogram.mk + +Each DMBS module can optionally supply one or more Make variables and macros, +which you can reference in your user makefile. Additionally, modules can require +one or more variables to be set by the user makefile, with (in some cases) sane +defaults used if left out. + +As modules are added, you can get a list of available targets by simply typing +`make help` from the command line. This will produce a formatted list of targets +as well as mandatory and optional variables and exposed variables and macros. + + +Distribution +---------------- + +You can embed DMBS in your project any way you like - some options are: +1. A git submodule +2. A source tarball +3. A manually copied extracted archive + +The intention of DMBS is that users can just import it from whatever source +they like. If your project needs to extend the existing modules in an unusual +manner, or if you want to provide your own modules, you can include them in +your project repository (or submit a patch to DMBS if your module is generic +enough to warrant wide use). + + +License +---------------- + +DMBS is released into the public domain, making is suitable for use everywhere, +by everyone. Contributions are greatly appreciated however, in order to make +DMBS better for everyone. + +The actual license text is as follows: + + This is free and unencumbered software released into the public domain. + + Anyone is free to copy, modify, publish, use, compile, sell, or + distribute this software, either in source code form or as a compiled + binary, for any purpose, commercial or non-commercial, and by any + means. + + In jurisdictions that recognize copyright laws, the author or authors + of this software dedicate any and all copyright interest in the + software to the public domain. We make this dedication for the benefit + of the public at large and to the detriment of our heirs and + successors. We intend this dedication to be an overt act of + relinquishment in perpetuity of all present and future rights to this + software under copyright law. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + For more information, please refer to diff --git a/Firmware/LUFA/Build/DMBS/Template/Template.c b/Firmware/LUFA/Build/DMBS/Template/Template.c new file mode 100644 index 0000000..95d36f7 --- /dev/null +++ b/Firmware/LUFA/Build/DMBS/Template/Template.c @@ -0,0 +1,12 @@ +/* + DMBS Build System + Released into the public domain. + + dean [at] fourwalledcubicle [dot] com + www.fourwalledcubicle.com + */ + +int main(void) +{ + // Application code here. +} diff --git a/Firmware/LUFA/Build/DMBS/Template/makefile b/Firmware/LUFA/Build/DMBS/Template/makefile new file mode 100644 index 0000000..d882923 --- /dev/null +++ b/Firmware/LUFA/Build/DMBS/Template/makefile @@ -0,0 +1,32 @@ +# +# DMBS Build System +# Released into the public domain. +# +# dean [at] fourwalledcubicle [dot] com +# www.fourwalledcubicle.com +# + +# Run "make help" for target help. + +MCU = atmega128 +ARCH = AVR8 +F_CPU = 8000000 +OPTIMIZATION = s +TARGET = Template +SRC = $(TARGET).c +CC_FLAGS = +LD_FLAGS = + +# Default target +all: + +# Include DMBS build script makefiles +DMBS_PATH ?= ../DMBS +include $(DMBS_PATH)/core.mk +include $(DMBS_PATH)/gcc.mk +include $(DMBS_PATH)/cppcheck.mk +include $(DMBS_PATH)/doxygen.mk +include $(DMBS_PATH)/dfu.mk +include $(DMBS_PATH)/hid.mk +include $(DMBS_PATH)/avrdude.mk +include $(DMBS_PATH)/atprogram.mk diff --git a/Firmware/LUFA/Build/LUFA/lufa-gcc.mk b/Firmware/LUFA/Build/LUFA/lufa-gcc.mk new file mode 100644 index 0000000..f824362 --- /dev/null +++ b/Firmware/LUFA/Build/LUFA/lufa-gcc.mk @@ -0,0 +1,43 @@ +# +# LUFA Library +# Copyright (C) Dean Camera, 2015. +# +# dean [at] fourwalledcubicle [dot] com +# www.lufa-lib.org +# + +DMBS_BUILD_MODULES += LUFA_GCC +DMBS_BUILD_TARGETS += +DMBS_BUILD_MANDATORY_VARS += LUFA_PATH ARCH F_USB +DMBS_BUILD_OPTIONAL_VARS += BOARD +DMBS_BUILD_PROVIDED_VARS += +DMBS_BUILD_PROVIDED_MACROS += + +SHELL = /bin/sh + +ERROR_IF_UNSET ?= $(if $(filter undefined, $(origin $(strip $(1)))), $(error Makefile $(strip $(1)) value not set)) +ERROR_IF_EMPTY ?= $(if $(strip $($(strip $(1)))), , $(error Makefile $(strip $(1)) option cannot be blank)) +ERROR_IF_NONBOOL ?= $(if $(filter Y N, $($(strip $(1)))), , $(error Makefile $(strip $(1)) option must be Y or N)) + +# Sanity check user supplied values +$(call ERROR_IF_EMPTY, LUFA_PATH) +$(call ERROR_IF_EMPTY, ARCH) +$(call ERROR_IF_EMPTY, F_USB) + +# Default values of optionally user-supplied variables +BOARD ?= NONE + +# Determine the utility prefix to use for the selected architecture +ifeq ($(ARCH), XMEGA) + $(warning The XMEGA device support is currently EXPERIMENTAL (incomplete and/or non-functional), and is included for preview purposes only.) +else ifeq ($(ARCH), UC3) + $(warning The UC3 device support is currently EXPERIMENTAL (incomplete and/or non-functional), and is included for preview purposes only.) +endif + +# Common LUFA C/C++ includes/definitions +LUFA_CXX_INCLUDES = -I. -I$(patsubst %/,%,$(LUFA_PATH))/.. +LUFA_CXX_DEFINES = -DARCH=ARCH_$(ARCH) -DBOARD=BOARD_$(BOARD) -DF_USB=$(F_USB)UL + +# LUFA specific standard build options +C_FLAGS += $(LUFA_CXX_INCLUDES) $(LUFA_CXX_DEFINES) $(LUFA_CXX_FLAGS) +CPP_FLAGS += $(LUFA_CXX_INCLUDES) $(LUFA_CXX_DEFINES) $(LUFA_CXX_FLAGS) diff --git a/Firmware/LUFA/Build/LUFA/lufa-sources.mk b/Firmware/LUFA/Build/LUFA/lufa-sources.mk new file mode 100644 index 0000000..7ca9a28 --- /dev/null +++ b/Firmware/LUFA/Build/LUFA/lufa-sources.mk @@ -0,0 +1,95 @@ +# +# LUFA Library +# Copyright (C) Dean Camera, 2015. +# +# dean [at] fourwalledcubicle [dot] com +# www.lufa-lib.org +# + +DMBS_BUILD_MODULES += LUFA_SOURCES +DMBS_BUILD_TARGETS += +DMBS_BUILD_MANDATORY_VARS += LUFA_PATH ARCH +DMBS_BUILD_OPTIONAL_VARS += +DMBS_BUILD_PROVIDED_VARS += LUFA_SRC_USB_DEVICE LUFA_SRC_USB_HOST \ + LUFA_SRC_USB LUFA_SRC_USBCLASS_DEVICE \ + LUFA_SRC_USBCLASS_HOST LUFA_SRC_USBCLASS \ + LUFA_SRC_TEMPERATURE LUFA_SRC_SERIAL \ + LUFA_SRC_TWI LUFA_SRC_PLATFORM +DMBS_BUILD_PROVIDED_MACROS += + +SHELL = /bin/sh + +ERROR_IF_UNSET ?= $(if $(filter undefined, $(origin $(strip $(1)))), $(error Makefile $(strip $(1)) value not set)) +ERROR_IF_EMPTY ?= $(if $(strip $($(strip $(1)))), , $(error Makefile $(strip $(1)) option cannot be blank)) +ERROR_IF_NONBOOL ?= $(if $(filter Y N, $($(strip $(1)))), , $(error Makefile $(strip $(1)) option must be Y or N)) + +# Sanity check user supplied values +$(foreach MANDATORY_VAR, $(LUFA_BUILD_MANDATORY_VARS), $(call ERROR_IF_UNSET, $(MANDATORY_VAR))) +$(call ERROR_IF_EMPTY, LUFA_PATH) +$(call ERROR_IF_EMPTY, ARCH) + +# Allow LUFA_ROOT_PATH to be overridden elsewhere to support legacy LUFA makefiles +LUFA_ROOT_PATH ?= $(patsubst %/,%,$(LUFA_PATH)) + +# Construct LUFA module source variables +LUFA_SRC_USB_COMMON := $(LUFA_ROOT_PATH)/Drivers/USB/Core/$(ARCH)/USBController_$(ARCH).c \ + $(LUFA_ROOT_PATH)/Drivers/USB/Core/$(ARCH)/USBInterrupt_$(ARCH).c \ + $(LUFA_ROOT_PATH)/Drivers/USB/Core/ConfigDescriptors.c \ + $(LUFA_ROOT_PATH)/Drivers/USB/Core/Events.c \ + $(LUFA_ROOT_PATH)/Drivers/USB/Core/USBTask.c \ + $(LUFA_ROOT_PATH)/Drivers/USB/Class/Common/HIDParser.c \ + +LUFA_SRC_USB_HOST := $(LUFA_ROOT_PATH)/Drivers/USB/Core/$(ARCH)/Host_$(ARCH).c \ + $(LUFA_ROOT_PATH)/Drivers/USB/Core/$(ARCH)/Pipe_$(ARCH).c \ + $(LUFA_ROOT_PATH)/Drivers/USB/Core/$(ARCH)/PipeStream_$(ARCH).c \ + $(LUFA_ROOT_PATH)/Drivers/USB/Core/HostStandardReq.c \ + $(LUFA_SRC_USB_COMMON) + +LUFA_SRC_USB_DEVICE := $(LUFA_ROOT_PATH)/Drivers/USB/Core/$(ARCH)/Device_$(ARCH).c \ + $(LUFA_ROOT_PATH)/Drivers/USB/Core/$(ARCH)/Endpoint_$(ARCH).c \ + $(LUFA_ROOT_PATH)/Drivers/USB/Core/$(ARCH)/EndpointStream_$(ARCH).c \ + $(LUFA_ROOT_PATH)/Drivers/USB/Core/DeviceStandardReq.c \ + $(LUFA_SRC_USB_COMMON) + +LUFA_SRC_USBCLASS_DEVICE := $(LUFA_ROOT_PATH)/Drivers/USB/Class/Device/AudioClassDevice.c \ + $(LUFA_ROOT_PATH)/Drivers/USB/Class/Device/CDCClassDevice.c \ + $(LUFA_ROOT_PATH)/Drivers/USB/Class/Device/HIDClassDevice.c \ + $(LUFA_ROOT_PATH)/Drivers/USB/Class/Device/MassStorageClassDevice.c \ + $(LUFA_ROOT_PATH)/Drivers/USB/Class/Device/MIDIClassDevice.c \ + $(LUFA_ROOT_PATH)/Drivers/USB/Class/Device/PrinterClassDevice.c \ + $(LUFA_ROOT_PATH)/Drivers/USB/Class/Device/RNDISClassDevice.c \ + +LUFA_SRC_USBCLASS_HOST := $(LUFA_ROOT_PATH)/Drivers/USB/Class/Host/AndroidAccessoryClassHost.c \ + $(LUFA_ROOT_PATH)/Drivers/USB/Class/Host/AudioClassHost.c \ + $(LUFA_ROOT_PATH)/Drivers/USB/Class/Host/CDCClassHost.c \ + $(LUFA_ROOT_PATH)/Drivers/USB/Class/Host/HIDClassHost.c \ + $(LUFA_ROOT_PATH)/Drivers/USB/Class/Host/MassStorageClassHost.c \ + $(LUFA_ROOT_PATH)/Drivers/USB/Class/Host/MIDIClassHost.c \ + $(LUFA_ROOT_PATH)/Drivers/USB/Class/Host/PrinterClassHost.c \ + $(LUFA_ROOT_PATH)/Drivers/USB/Class/Host/RNDISClassHost.c \ + $(LUFA_ROOT_PATH)/Drivers/USB/Class/Host/StillImageClassHost.c + +LUFA_SRC_USB := $(sort $(LUFA_SRC_USB_COMMON) $(LUFA_SRC_USB_HOST) $(LUFA_SRC_USB_DEVICE)) + +LUFA_SRC_USBCLASS := $(LUFA_SRC_USBCLASS_DEVICE) $(LUFA_SRC_USBCLASS_HOST) + +LUFA_SRC_TEMPERATURE := $(LUFA_ROOT_PATH)/Drivers/Board/Temperature.c + +LUFA_SRC_SERIAL := $(LUFA_ROOT_PATH)/Drivers/Peripheral/$(ARCH)/Serial_$(ARCH).c + +LUFA_SRC_TWI := $(LUFA_ROOT_PATH)/Drivers/Peripheral/$(ARCH)/TWI_$(ARCH).c + +ifeq ($(ARCH), UC3) + LUFA_SRC_PLATFORM := $(LUFA_ROOT_PATH)/Platform/UC3/Exception.S \ + $(LUFA_ROOT_PATH)/Platform/UC3/InterruptManagement.c +else + LUFA_SRC_PLATFORM := +endif + +# Build a list of all available module sources +LUFA_SRC_ALL_FILES := $(LUFA_SRC_USB) \ + $(LUFA_SRC_USBCLASS) \ + $(LUFA_SRC_TEMPERATURE) \ + $(LUFA_SRC_SERIAL) \ + $(LUFA_SRC_TWI) \ + $(LUFA_SRC_PLATFORM) diff --git a/Firmware/LUFA/Build/lufa_atprogram.mk b/Firmware/LUFA/Build/lufa_atprogram.mk index 9433834..86988d1 100644 --- a/Firmware/LUFA/Build/lufa_atprogram.mk +++ b/Firmware/LUFA/Build/lufa_atprogram.mk @@ -1,103 +1,10 @@ # # LUFA Library -# Copyright (C) Dean Camera, 2014. +# Copyright (C) Dean Camera, 2015. # # dean [at] fourwalledcubicle [dot] com # www.lufa-lib.org # -LUFA_BUILD_MODULES += ATPROGRAM -LUFA_BUILD_TARGETS += atprogram atprogram-ee -LUFA_BUILD_MANDATORY_VARS += MCU TARGET -LUFA_BUILD_OPTIONAL_VARS += ATPROGRAM_PROGRAMMER ATPROGRAM_INTERFACE ATPROGRAM_PORT -LUFA_BUILD_PROVIDED_VARS += -LUFA_BUILD_PROVIDED_MACROS += - -# ----------------------------------------------------------------------------- -# LUFA ATPROGRAM Programmer Buildsystem Makefile Module. -# ----------------------------------------------------------------------------- -# DESCRIPTION: -# Provides a set of targets to re-program a device using the Atmel atprogram -# utility in AVR Studio 5.x and Atmel Studio 6.0 onwards. -# ----------------------------------------------------------------------------- -# TARGETS: -# -# atprogram - Program target FLASH with application using -# atprogram -# atprogram-ee - Program target EEPROM with application data -# using atprogram -# -# MANDATORY PARAMETERS: -# -# MCU - Microcontroller device model name -# TARGET - Application name -# -# OPTIONAL PARAMETERS: -# -# ATPROGRAM_PROGRAMMER - Name of programming hardware to use -# ATPROGRAM_INTERFACE - Name of programming interface to use -# ATPROGRAM_PORT - Name of communication port to use -# -# PROVIDED VARIABLES: -# -# (None) -# -# PROVIDED MACROS: -# -# (None) -# -# ----------------------------------------------------------------------------- - -SHELL = /bin/sh - -ERROR_IF_UNSET ?= $(if $(filter undefined, $(origin $(strip $(1)))), $(error Makefile $(strip $(1)) value not set)) -ERROR_IF_EMPTY ?= $(if $(strip $($(strip $(1)))), , $(error Makefile $(strip $(1)) option cannot be blank)) -ERROR_IF_NONBOOL ?= $(if $(filter Y N, $($(strip $(1)))), , $(error Makefile $(strip $(1)) option must be Y or N)) - -# Default values of optionally user-supplied variables -ATPROGRAM_PROGRAMMER ?= jtagice3 -ATPROGRAM_INTERFACE ?= jtag -ATPROGRAM_PORT ?= - -# Sanity check user supplied values -$(foreach MANDATORY_VAR, $(LUFA_BUILD_MANDATORY_VARS), $(call ERROR_IF_UNSET, $(MANDATORY_VAR))) -$(call ERROR_IF_EMPTY, MCU) -$(call ERROR_IF_EMPTY, TARGET) -$(call ERROR_IF_EMPTY, ATPROGRAM_PROGRAMMER) -$(call ERROR_IF_EMPTY, ATPROGRAM_INTERFACE) - -# Output Messages -MSG_ATPROGRAM_CMD := ' [ATPRGRM] :' - -# Construct base atprogram command flags -BASE_ATPROGRAM_FLAGS := --tool $(ATPROGRAM_PROGRAMMER) --interface $(ATPROGRAM_INTERFACE) --device $(MCU) -ifneq ($(ATPROGRAM_PORT),) - BASE_ATPROGRAM_FLAGS += --port $(ATPROGRAM_PORT) -endif - -# Construct the flags to use for the various memory spaces -ifeq ($(ARCH), AVR8) - ATPROGRAM_FLASH_FLAGS := --chiperase --flash - ATPROGRAM_EEPROM_FLAGS := --eeprom -else ifeq ($(ARCH), XMEGA) - ATPROGRAM_FLASH_FLAGS := --erase --flash - ATPROGRAM_EEPROM_FLAGS := --eeprom -else ifeq ($(ARCH), UC3) - ATPROGRAM_FLASH_FLAGS := --erase - ATPROGRAM_EEPROM_FLAGS := --eeprom -else - $(error Unsupported architecture "$(ARCH)") -endif - -# Programs in the target FLASH memory using ATPROGRAM -atprogram: $(TARGET).elf $(MAKEFILE_LIST) - @echo $(MSG_ATPROGRAM_CMD) Programming device \"$(MCU)\" FLASH using \"$(ATPROGRAM_PROGRAMMER)\" - atprogram $(BASE_ATPROGRAM_FLAGS) program $(ATPROGRAM_FLASH_FLAGS) --file $< - -# Programs in the target EEPROM memory using ATPROGRAM -atprogram-ee: $(TARGET).elf $(MAKEFILE_LIST) - @echo $(MSG_ATPROGRAM_CMD) Programming device \"$(MCU)\" EEPROM using \"$(ATPROGRAM_PROGRAMMER)\" - atprogram $(BASE_ATPROGRAM_FLAGS) program $(ATPROGRAM_EEPROM_FLAGS) --file $< - -# Phony build targets for this module -.PHONY: atprogram atprogram-ee +DMBS_PATH := $(LUFA_PATH)/Build/DMBS/DMBS +include $(DMBS_PATH)/atprogram.mk diff --git a/Firmware/LUFA/Build/lufa_avrdude.mk b/Firmware/LUFA/Build/lufa_avrdude.mk index 4eff418..649215f 100644 --- a/Firmware/LUFA/Build/lufa_avrdude.mk +++ b/Firmware/LUFA/Build/lufa_avrdude.mk @@ -1,86 +1,10 @@ # # LUFA Library -# Copyright (C) Dean Camera, 2014. +# Copyright (C) Dean Camera, 2015. # # dean [at] fourwalledcubicle [dot] com # www.lufa-lib.org # -LUFA_BUILD_MODULES += AVRDUDE -LUFA_BUILD_TARGETS += avrdude avrdude-ee -LUFA_BUILD_MANDATORY_VARS += MCU TARGET -LUFA_BUILD_OPTIONAL_VARS += AVRDUDE_PROGRAMMER AVRDUDE_PORT AVRDUDE_FLAGS -LUFA_BUILD_PROVIDED_VARS += -LUFA_BUILD_PROVIDED_MACROS += - -# ----------------------------------------------------------------------------- -# LUFA AVRDUDE Programmer Buildsystem Makefile Module. -# ----------------------------------------------------------------------------- -# DESCRIPTION: -# Provides a set of targets to re-program a device using the open source -# avr-dude utility. -# ----------------------------------------------------------------------------- -# TARGETS: -# -# avrdude - Program target FLASH with application using -# avrdude -# avrdude-ee - Program target EEPROM with application data -# using avrdude -# -# MANDATORY PARAMETERS: -# -# MCU - Microcontroller device model name -# TARGET - Application name -# -# OPTIONAL PARAMETERS: -# -# AVRDUDE_PROGRAMMER - Name of programming hardware to use -# AVRDUDE_PORT - Name of communication port to use -# AVRDUDE_FLAGS - Flags to pass to avr-dude -# -# PROVIDED VARIABLES: -# -# (None) -# -# PROVIDED MACROS: -# -# (None) -# -# ----------------------------------------------------------------------------- - -SHELL = /bin/sh - -ERROR_IF_UNSET ?= $(if $(filter undefined, $(origin $(strip $(1)))), $(error Makefile $(strip $(1)) value not set)) -ERROR_IF_EMPTY ?= $(if $(strip $($(strip $(1)))), , $(error Makefile $(strip $(1)) option cannot be blank)) -ERROR_IF_NONBOOL ?= $(if $(filter Y N, $($(strip $(1)))), , $(error Makefile $(strip $(1)) option must be Y or N)) - -# Default values of optionally user-supplied variables -AVRDUDE_PROGRAMMER ?= jtagicemkii -AVRDUDE_PORT ?= usb -AVRDUDE_FLAGS ?= - -# Sanity check user supplied values -$(foreach MANDATORY_VAR, $(LUFA_BUILD_MANDATORY_VARS), $(call ERROR_IF_UNSET, $(MANDATORY_VAR))) -$(call ERROR_IF_EMPTY, MCU) -$(call ERROR_IF_EMPTY, TARGET) -$(call ERROR_IF_EMPTY, AVRDUDE_PROGRAMMER) -$(call ERROR_IF_EMPTY, AVRDUDE_PORT) - -# Output Messages -MSG_AVRDUDE_CMD := ' [AVRDUDE] :' - -# Construct base avrdude command flags -BASE_AVRDUDE_FLAGS := -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER) - -# Programs in the target FLASH memory using AVRDUDE -avrdude: $(TARGET).hex $(MAKEFILE_LIST) - @echo $(MSG_AVRDUDE_CMD) Programming device \"$(MCU)\" FLASH using \"$(AVRDUDE_PROGRAMMER)\" on port \"$(AVRDUDE_PORT)\" - avrdude $(BASE_AVRDUDE_FLAGS) -U flash:w:$< $(AVRDUDE_FLAGS) - -# Programs in the target EEPROM memory using AVRDUDE -avrdude-ee: $(TARGET).eep $(MAKEFILE_LIST) - @echo $(MSG_AVRDUDE_CMD) Programming device \"$(MCU)\" EEPROM using \"$(AVRDUDE_PROGRAMMER)\" on port \"$(AVRDUDE_PORT)\" - avrdude $(BASE_AVRDUDE_FLAGS) -U eeprom:w:$< $(AVRDUDE_FLAGS) - -# Phony build targets for this module -.PHONY: avrdude avrdude-ee +DMBS_PATH := $(LUFA_PATH)/Build/DMBS/DMBS +include $(DMBS_PATH)/avrdude.mk diff --git a/Firmware/LUFA/Build/lufa_build.mk b/Firmware/LUFA/Build/lufa_build.mk index b9b144a..f7c496e 100644 --- a/Firmware/LUFA/Build/lufa_build.mk +++ b/Firmware/LUFA/Build/lufa_build.mk @@ -1,351 +1,12 @@ # # LUFA Library -# Copyright (C) Dean Camera, 2014. +# Copyright (C) Dean Camera, 2015. # # dean [at] fourwalledcubicle [dot] com # www.lufa-lib.org # -LUFA_BUILD_MODULES += BUILD -LUFA_BUILD_TARGETS += size symbol-sizes all lib elf bin hex lss clean mostlyclean -LUFA_BUILD_MANDATORY_VARS += TARGET ARCH MCU SRC F_USB LUFA_PATH -LUFA_BUILD_OPTIONAL_VARS += BOARD OPTIMIZATION C_STANDARD CPP_STANDARD F_CPU C_FLAGS CPP_FLAGS ASM_FLAGS CC_FLAGS LD_FLAGS OBJDIR OBJECT_FILES DEBUG_TYPE DEBUG_LEVEL LINKER_RELAXATIONS COMPILER_PATH -LUFA_BUILD_PROVIDED_VARS += -LUFA_BUILD_PROVIDED_MACROS += - -# ----------------------------------------------------------------------------- -# LUFA GCC Compiler Buildsystem Makefile Module. -# ----------------------------------------------------------------------------- -# DESCRIPTION: -# Provides a set of targets to build a C, C++ and/or Assembly application -# via the AVR-GCC compiler. -# ----------------------------------------------------------------------------- -# TARGETS: -# -# size - List built application size -# symbol-sizes - Print application symbols from the binary ELF -# file as a list sorted by size in bytes -# all - Build application and list size -# lib - Build and archive source files into a library -# elf - Build application ELF debug object file -# bin - Build application BIN binary object file -# hex - Build application HEX object file -# lss - Build application LSS assembly listing file -# clean - Remove all project intermediary and binary -# output files -# mostlyclean - Remove intermediary output files, but -# preserve binaries -# .s - Compile C/C++ source file into an assembly file -# for manual code inspection -# -# MANDATORY PARAMETERS: -# -# TARGET - Application name -# ARCH - Device architecture name -# MCU - Microcontroller device model name -# SRC - List of input source files (*.c, *.cpp, *.S) -# F_USB - Speed of the input clock of the USB controller -# in Hz -# LUFA_PATH - Path to the LUFA library core -# -# OPTIONAL PARAMETERS: -# -# BOARD - LUFA board hardware -# OPTIMIZATION - Optimization level -# C_STANDARD - C Language Standard to use -# CPP_STANDARD - C++ Language Standard to use -# F_CPU - Speed of the CPU, in Hz -# C_FLAGS - Flags to pass to the C compiler only -# CPP_FLAGS - Flags to pass to the C++ compiler only -# ASM_FLAGS - Flags to pass to the assembler only -# CC_FLAGS - Common flags to pass to the C/C++ compiler and -# assembler -# LD_FLAGS - Flags to pass to the linker -# LINKER_RELAXATIONS - Enable or disable linker relaxations to -# decrease binary size (note: can cause link -# failures on systems with an unpatched binutils) -# OBJDIR - Directory for the output object and dependency -# files; if equal to ".", the output files will -# be generated in the same folder as the sources -# OBJECT_FILES - Extra object files to link in to the binaries -# DEBUG_FORMAT - Format of the debugging information to -# generate in the compiled object files -# DEBUG_LEVEL - Level the debugging information to generate in -# the compiled object files -# COMPILER_PATH - Location of the GCC toolchain to use -# -# PROVIDED VARIABLES: -# -# (None) -# -# PROVIDED MACROS: -# -# (None) -# -# ----------------------------------------------------------------------------- - -SHELL = /bin/sh - -ERROR_IF_UNSET ?= $(if $(filter undefined, $(origin $(strip $(1)))), $(error Makefile $(strip $(1)) value not set)) -ERROR_IF_EMPTY ?= $(if $(strip $($(strip $(1)))), , $(error Makefile $(strip $(1)) option cannot be blank)) -ERROR_IF_NONBOOL ?= $(if $(filter Y N, $($(strip $(1)))), , $(error Makefile $(strip $(1)) option must be Y or N)) - -# Default values of optionally user-supplied variables -COMPILER_PATH ?= -BOARD ?= NONE -OPTIMIZATION ?= s -F_CPU ?= -C_STANDARD ?= gnu99 -CPP_STANDARD ?= gnu++98 -C_FLAGS ?= -CPP_FLAGS ?= -ASM_FLAGS ?= -CC_FLAGS ?= -OBJDIR ?= . -OBJECT_FILES ?= -DEBUG_FORMAT ?= dwarf-2 -DEBUG_LEVEL ?= 2 -LINKER_RELAXATIONS ?= Y - -# Sanity check user supplied values -$(foreach MANDATORY_VAR, $(LUFA_BUILD_MANDATORY_VARS), $(call ERROR_IF_UNSET, $(MANDATORY_VAR))) -$(call ERROR_IF_EMPTY, MCU) -$(call ERROR_IF_EMPTY, TARGET) -$(call ERROR_IF_EMPTY, ARCH) -$(call ERROR_IF_EMPTY, F_USB) -$(call ERROR_IF_EMPTY, LUFA_PATH) -$(call ERROR_IF_EMPTY, BOARD) -$(call ERROR_IF_EMPTY, OPTIMIZATION) -$(call ERROR_IF_EMPTY, C_STANDARD) -$(call ERROR_IF_EMPTY, CPP_STANDARD) -$(call ERROR_IF_EMPTY, OBJDIR) -$(call ERROR_IF_EMPTY, DEBUG_FORMAT) -$(call ERROR_IF_EMPTY, DEBUG_LEVEL) -$(call ERROR_IF_NONBOOL, LINKER_RELAXATIONS) - -# Determine the utility prefix to use for the selected architecture -ifeq ($(ARCH), AVR8) - CROSS := $(COMPILER_PATH)avr -else ifeq ($(ARCH), XMEGA) - CROSS := $(COMPILER_PATH)avr - $(warning The XMEGA device support is currently EXPERIMENTAL (incomplete and/or non-functional), and is included for preview purposes only.) -else ifeq ($(ARCH), UC3) - CROSS := $(COMPILER_PATH)avr32 - $(warning The UC3 device support is currently EXPERIMENTAL (incomplete and/or non-functional), and is included for preview purposes only.) -else - $(error Unsupported architecture "$(ARCH)") -endif - -# Output Messages -MSG_INFO_MESSAGE := ' [INFO] :' -MSG_COMPILE_CMD := ' [GCC] :' -MSG_ASSEMBLE_CMD := ' [GAS] :' -MSG_NM_CMD := ' [NM] :' -MSG_REMOVE_CMD := ' [RM] :' -MSG_LINK_CMD := ' [LNK] :' -MSG_ARCHIVE_CMD := ' [AR] :' -MSG_SIZE_CMD := ' [SIZE] :' -MSG_OBJCPY_CMD := ' [OBJCPY] :' -MSG_OBJDMP_CMD := ' [OBJDMP] :' - -# Convert input source file list to differentiate them by type -C_SOURCE := $(filter %.c, $(SRC)) -CPP_SOURCE := $(filter %.cpp, $(SRC)) -ASM_SOURCE := $(filter %.S, $(SRC)) - -# Create a list of unknown source file types, if any are found throw an error -UNKNOWN_SOURCE := $(filter-out $(C_SOURCE) $(CPP_SOURCE) $(ASM_SOURCE), $(SRC)) -ifneq ($(UNKNOWN_SOURCE),) - $(error Unknown input source file formats: $(UNKNOWN_SOURCE)) -endif - -# Convert input source filenames into a list of required output object files -OBJECT_FILES += $(addsuffix .o, $(basename $(SRC))) - -# Check if an output object file directory was specified instead of the input file location -ifneq ($(OBJDIR),.) - # Prefix all the object filenames with the output object file directory path - OBJECT_FILES := $(addprefix $(patsubst %/,%,$(OBJDIR))/, $(notdir $(OBJECT_FILES))) - - # Check if any object file (without path) appears more than once in the object file list - ifneq ($(words $(sort $(OBJECT_FILES))), $(words $(OBJECT_FILES))) - $(error Cannot build with OBJDIR parameter set - one or more object file name is not unique) - endif - - # Create the output object file directory if it does not exist and add it to the virtual path list - $(shell mkdir $(OBJDIR) 2> /dev/null) - VPATH += $(dir $(SRC)) -endif - -# Create a list of dependency files from the list of object files -DEPENDENCY_FILES := $(OBJECT_FILES:%.o=%.d) - -# Create a list of common flags to pass to the compiler/linker/assembler -BASE_CC_FLAGS := -pipe -g$(DEBUG_FORMAT) -g$(DEBUG_LEVEL) -ifeq ($(ARCH), AVR8) - BASE_CC_FLAGS += -mmcu=$(MCU) -fshort-enums -fno-inline-small-functions -fpack-struct -else ifeq ($(ARCH), XMEGA) - BASE_CC_FLAGS += -mmcu=$(MCU) -fshort-enums -fno-inline-small-functions -fpack-struct -else ifeq ($(ARCH), UC3) - BASE_CC_FLAGS += -mpart=$(MCU:at32%=%) -masm-addr-pseudos -endif -BASE_CC_FLAGS += -Wall -fno-strict-aliasing -funsigned-char -funsigned-bitfields -ffunction-sections -BASE_CC_FLAGS += -I. -I$(patsubst %/,%,$(LUFA_PATH))/.. -BASE_CC_FLAGS += -DARCH=ARCH_$(ARCH) -DBOARD=BOARD_$(BOARD) -DF_USB=$(F_USB)UL -ifneq ($(F_CPU),) - BASE_CC_FLAGS += -DF_CPU=$(F_CPU)UL -endif -ifeq ($(LINKER_RELAXATIONS), Y) -BASE_CC_FLAGS += -mrelax -endif - -# This flag is required for bootloaders as GCC will emit invalid jump table -# assembly code for devices with large amounts of flash; the jump table target -# is extracted from FLASH without using the correct ELPM instruction, resulting -# in a pseudo-random jump target. -BASE_CC_FLAGS += -fno-jump-tables - -# Additional language specific compiler flags -BASE_C_FLAGS := -x c -O$(OPTIMIZATION) -std=$(C_STANDARD) -Wstrict-prototypes -BASE_CPP_FLAGS := -x c++ -O$(OPTIMIZATION) -std=$(CPP_STANDARD) -BASE_ASM_FLAGS := -x assembler-with-cpp - -# Create a list of flags to pass to the linker -BASE_LD_FLAGS := -lm -Wl,-Map=$(TARGET).map,--cref -Wl,--gc-sections -ifeq ($(LINKER_RELAXATIONS), Y) - BASE_LD_FLAGS += -Wl,--relax -endif -ifeq ($(ARCH), AVR8) - BASE_LD_FLAGS += -mmcu=$(MCU) -else ifeq ($(ARCH), XMEGA) - BASE_LD_FLAGS += -mmcu=$(MCU) -else ifeq ($(ARCH), UC3) - BASE_LD_FLAGS += -mpart=$(MCU:at32%=%) --rodata-writable --direct-data -endif - -# Determine flags to pass to the size utility based on its reported features (only invoke if size target required) -# and on an architecture where this non-standard patch is available -ifneq ($(ARCH), UC3) -size: SIZE_MCU_FLAG := $(shell $(CROSS)-size --help | grep -- --mcu > /dev/null && echo --mcu=$(MCU) ) -size: SIZE_FORMAT_FLAG := $(shell $(CROSS)-size --help | grep -- --format=.*avr > /dev/null && echo --format=avr ) -endif - -# Pre-build informational target, to give compiler and project name information when building -build_begin: - @echo $(MSG_INFO_MESSAGE) Begin compilation of project \"$(TARGET)\"... - @echo "" - @$(CROSS)-gcc --version - -# Post-build informational target, to project name information when building has completed -build_end: - @echo $(MSG_INFO_MESSAGE) Finished building project \"$(TARGET)\". - -# Prints size information of a compiled application (FLASH, RAM and EEPROM usages) -size: $(TARGET).elf - @echo $(MSG_SIZE_CMD) Determining size of \"$<\" - @echo "" - $(CROSS)-size $(SIZE_MCU_FLAG) $(SIZE_FORMAT_FLAG) $< - -# Prints size information on the symbols within a compiled application in decimal bytes -symbol-sizes: $(TARGET).elf - @echo $(MSG_NM_CMD) Extracting \"$<\" symbols with decimal byte sizes - $(CROSS)-nm --size-sort --demangle --radix=d $< - -# Cleans intermediary build files, leaving only the compiled application files -mostlyclean: - @echo $(MSG_REMOVE_CMD) Removing object files of \"$(TARGET)\" - rm -f $(OBJECT_FILES) - @echo $(MSG_REMOVE_CMD) Removing dependency files of \"$(TARGET)\" - rm -f $(DEPENDENCY_FILES) - -# Cleans all build files, leaving only the original source code -clean: mostlyclean - @echo $(MSG_REMOVE_CMD) Removing output files of \"$(TARGET)\" - rm -f $(TARGET).elf $(TARGET).hex $(TARGET).bin $(TARGET).eep $(TARGET).map $(TARGET).lss $(TARGET).sym lib$(TARGET).a - -# Performs a complete build of the user application and prints size information afterwards -all: build_begin elf hex bin lss sym size build_end - -# Helper targets, to build a specific type of output file without having to know the project target name -lib: lib$(TARGET).a -elf: $(TARGET).elf -hex: $(TARGET).hex $(TARGET).eep -bin: $(TARGET).bin -lss: $(TARGET).lss -sym: $(TARGET).sym - -# Default target to *create* the user application's specified source files; if this rule is executed by -# make, the input source file doesn't exist and an error needs to be presented to the user -$(SRC): - $(error Source file does not exist: $@) - -# Compiles an input C source file and generates an assembly listing for it -%.s: %.c $(MAKEFILE_LIST) - @echo $(MSG_COMPILE_CMD) Generating assembly from C file \"$(notdir $<)\" - $(CROSS)-gcc -S $(BASE_CC_FLAGS) $(BASE_C_FLAGS) $(CC_FLAGS) $(C_FLAGS) $< -o $@ - -# Compiles an input C++ source file and generates an assembly listing for it -%.s: %.cpp $(MAKEFILE_LIST) - @echo $(MSG_COMPILE_CMD) Generating assembly from C++ file \"$(notdir $<)\" - $(CROSS)-gcc -S $(BASE_CC_FLAGS) $(BASE_CPP_FLAGS) $(CC_FLAGS) $(CPP_FLAGS) $< -o $@ - -# Compiles an input C source file and generates a linkable object file for it -$(OBJDIR)/%.o: %.c $(MAKEFILE_LIST) - @echo $(MSG_COMPILE_CMD) Compiling C file \"$(notdir $<)\" - $(CROSS)-gcc -c $(BASE_CC_FLAGS) $(BASE_C_FLAGS) $(CC_FLAGS) $(C_FLAGS) -MMD -MP -MF $(@:%.o=%.d) $< -o $@ - -# Compiles an input C++ source file and generates a linkable object file for it -$(OBJDIR)/%.o: %.cpp $(MAKEFILE_LIST) - @echo $(MSG_COMPILE_CMD) Compiling C++ file \"$(notdir $<)\" - $(CROSS)-gcc -c $(BASE_CC_FLAGS) $(BASE_CPP_FLAGS) $(CC_FLAGS) $(CPP_FLAGS) -MMD -MP -MF $(@:%.o=%.d) $< -o $@ - -# Assembles an input ASM source file and generates a linkable object file for it -$(OBJDIR)/%.o: %.S $(MAKEFILE_LIST) - @echo $(MSG_ASSEMBLE_CMD) Assembling \"$(notdir $<)\" - $(CROSS)-gcc -c $(BASE_CC_FLAGS) $(BASE_ASM_FLAGS) $(CC_FLAGS) $(ASM_FLAGS) -MMD -MP -MF $(@:%.o=%.d) $< -o $@ - -# Generates a library archive file from the user application, which can be linked into other applications -.PRECIOUS : $(OBJECT_FILES) -.SECONDARY : %.a -%.a: $(OBJECT_FILES) - @echo $(MSG_ARCHIVE_CMD) Archiving object files into \"$@\" - $(CROSS)-ar rcs $@ $(OBJECT_FILES) - -# Generates an ELF debug file from the user application, which can be further processed for FLASH and EEPROM data -# files, or used for programming and debugging directly -.PRECIOUS : $(OBJECT_FILES) -.SECONDARY : %.elf -%.elf: $(OBJECT_FILES) - @echo $(MSG_LINK_CMD) Linking object files into \"$@\" - $(CROSS)-gcc $^ -o $@ $(BASE_LD_FLAGS) $(LD_FLAGS) - -# Extracts out the loadable FLASH memory data from the project ELF file, and creates an Intel HEX format file of it -%.hex: %.elf - @echo $(MSG_OBJCPY_CMD) Extracting HEX file data from \"$<\" - $(CROSS)-objcopy -O ihex -R .eeprom -R .fuse -R .lock -R .signature $< $@ - -# Extracts out the loadable FLASH memory data from the project ELF file, and creates an Binary format file of it -%.bin: %.elf - @echo $(MSG_OBJCPY_CMD) Extracting BIN file data from \"$<\" - $(CROSS)-objcopy -O binary -R .eeprom -R .fuse -R .lock -R .signature $< $@ - -# Extracts out the loadable EEPROM memory data from the project ELF file, and creates an Intel HEX format file of it -%.eep: %.elf - @echo $(MSG_OBJCPY_CMD) Extracting EEP file data from \"$<\" - $(CROSS)-objcopy -O ihex -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 --no-change-warnings $< $@ || exit 0 - -# Creates an assembly listing file from an input project ELF file, containing interleaved assembly and source data -%.lss: %.elf - @echo $(MSG_OBJDMP_CMD) Extracting LSS file data from \"$<\" - $(CROSS)-objdump -h -d -S -z $< > $@ - -# Creates a symbol file listing the loadable and discarded symbols from an input project ELF file -%.sym: %.elf - @echo $(MSG_NM_CMD) Extracting SYM file data from \"$<\" - $(CROSS)-nm -n $< > $@ - -# Include build dependency files --include $(DEPENDENCY_FILES) - -# Phony build targets for this module -.PHONY: build_begin build_end size symbol-sizes lib elf hex lss clean mostlyclean +DMBS_PATH ?= $(LUFA_PATH)/Build/DMBS/DMBS +DMBS_LUFA_PATH ?= $(LUFA_PATH)/Build/LUFA +include $(DMBS_PATH)/gcc.mk +include $(DMBS_LUFA_PATH)/lufa-gcc.mk diff --git a/Firmware/LUFA/Build/lufa_core.mk b/Firmware/LUFA/Build/lufa_core.mk index 7d97466..62cef90 100644 --- a/Firmware/LUFA/Build/lufa_core.mk +++ b/Firmware/LUFA/Build/lufa_core.mk @@ -1,175 +1,10 @@ # # LUFA Library -# Copyright (C) Dean Camera, 2014. +# Copyright (C) Dean Camera, 2015. # # dean [at] fourwalledcubicle [dot] com # www.lufa-lib.org # -LUFA_BUILD_MODULES += CORE -LUFA_BUILD_TARGETS += help list_targets list_modules list_mandatory list_optional list_provided list_macros -LUFA_BUILD_MANDATORY_VARS += -LUFA_BUILD_OPTIONAL_VARS += -LUFA_BUILD_PROVIDED_VARS += -LUFA_BUILD_PROVIDED_MACROS += - -# ----------------------------------------------------------------------------- -# LUFA Core Build System Makefile Module. -# ----------------------------------------------------------------------------- -# DESCRIPTION: -# Provides a set of core build targets for the LUFA build system -# ----------------------------------------------------------------------------- -# TARGETS: -# -# help - Build system help -# list_targets - List all build targets -# list_modules - List all build modules -# list_mandatory - List all mandatory make variables required by -# the included build modules of the application -# list_optional - List all optional make variables required by -# the included build modules of the application -# list_provided - List all provided make variables from the -# included build modules of the application -# list_macros - List all provided make macros from the -# included build modules of the application -# -# MANDATORY PARAMETERS: -# -# (None) -# -# OPTIONAL PARAMETERS: -# -# (None) -# -# PROVIDED VARIABLES: -# -# (None) -# -# PROVIDED MACROS: -# -# (None) -# -# ----------------------------------------------------------------------------- - -SHELL = /bin/sh - -# Converts a given input to a printable output using "(None)" if no items are in the list -CONVERT_TO_PRINTABLE = $(if $(strip $(1)), $(1), (None)) - - -# Build sorted and filtered lists of the included build module data -SORTED_LUFA_BUILD_MODULES = $(sort $(LUFA_BUILD_MODULES)) -SORTED_LUFA_BUILD_TARGETS = $(sort $(LUFA_BUILD_TARGETS)) -SORTED_LUFA_MANDATORY_VARS = $(sort $(LUFA_BUILD_MANDATORY_VARS)) -SORTED_LUFA_OPTIONAL_VARS = $(filter-out $(SORTED_LUFA_MANDATORY_VARS), $(sort $(LUFA_BUILD_OPTIONAL_VARS))) -SORTED_LUFA_PROVIDED_VARS = $(sort $(LUFA_BUILD_PROVIDED_VARS)) -SORTED_LUFA_PROVIDED_MACROS = $(sort $(LUFA_BUILD_PROVIDED_MACROS)) - -# Create printable versions of the sorted build module data (use "(None)" when no data is available) -PRINTABLE_LUFA_BUILD_MODULES = $(call CONVERT_TO_PRINTABLE, $(SORTED_LUFA_BUILD_MODULES)) -PRINTABLE_LUFA_BUILD_TARGETS = $(call CONVERT_TO_PRINTABLE, $(SORTED_LUFA_BUILD_TARGETS)) -PRINTABLE_LUFA_MANDATORY_VARS = $(call CONVERT_TO_PRINTABLE, $(SORTED_LUFA_MANDATORY_VARS)) -PRINTABLE_LUFA_OPTIONAL_VARS = $(call CONVERT_TO_PRINTABLE, $(SORTED_LUFA_OPTIONAL_VARS)) -PRINTABLE_LUFA_PROVIDED_VARS = $(call CONVERT_TO_PRINTABLE, $(SORTED_LUFA_PROVIDED_VARS)) -PRINTABLE_LUFA_PROVIDED_MACROS = $(call CONVERT_TO_PRINTABLE, $(SORTED_LUFA_PROVIDED_MACROS)) - -help: - @echo "===================================================================" - @echo " LUFA Build System 2.0 " - @echo " (C) Dean Camera, 2014 { dean @ fourwalledcubicle . com } " - @echo "===================================================================" - @echo "DESCRIPTION: " - @echo " This build system is a set of makefile modules for (GNU) Make, to " - @echo " provide a simple system for building LUFA powered applications. " - @echo " Each makefile module can be included from within a user makefile, " - @echo " to expose the build rules documented in the comments at the top of" - @echo " each build module. " - @echo " " - @echo "USAGE: " - @echo " To execute a rule, define all variables indicated in the desired " - @echo " module as a required parameter before including the build module " - @echo " in your project makefile. Parameters marked as optional will " - @echo " assume a default value in the modules if not user-assigned. " - @echo " " - @echo " By default the target output shows both a friendly summary, as " - @echo " well as the actual invoked command. To suppress the output of the " - @echo " invoked commands and show only the friendly command output, run " - @echo " make with the \"-s\" switch added before the target(s). " - @echo " " - @echo "SEE ALSO: " - @echo " For more information, see the 'Build System' chapter of the LUFA " - @echo " project documentation. " - @echo "===================================================================" - @echo " " - @echo " Currently used build system modules in this application: " - @echo " " - @printf " %b" "$(PRINTABLE_LUFA_BUILD_MODULES:%= - %\n)" - @echo " " - @echo " " - @echo " Currently available build targets in this application: " - @echo " " - @printf " %b" "$(PRINTABLE_LUFA_BUILD_TARGETS:%= - %\n)" - @echo " " - @echo " " - @echo " Mandatory variables required by the selected build Modules: " - @echo " " - @printf " %b" "$(PRINTABLE_LUFA_MANDATORY_VARS:%= - %\n)" - @echo " " - @echo " " - @echo " Optional variables required by the selected build Modules: " - @echo " " - @printf " %b" "$(PRINTABLE_LUFA_OPTIONAL_VARS:%= - %\n)" - @echo " " - @echo " " - @echo " Variables provided by the selected build Modules: " - @echo " " - @printf " %b" "$(PRINTABLE_LUFA_PROVIDED_VARS:%= - %\n)" - @echo " " - @echo " " - @echo " Macros provided by the selected build Modules: " - @echo " " - @printf " %b" "$(PRINTABLE_LUFA_PROVIDED_MACROS:%= - %\n)" - @echo " " - @echo "===================================================================" - @echo " The LUFA BuildSystem 2.0 - Powered By Positive Thinking (tm) " - @echo "===================================================================" - -# Lists build modules included by the project makefile, in alphabetical order -list_modules: - @echo Currently Used Build System Modules: - @printf " %b" "$(PRINTABLE_LUFA_BUILD_MODULES:%= - %\n)" - -# Lists build targets included by the project makefile, in alphabetical order -list_targets: - @echo Currently Available Build Targets: - @printf " %b" "$(PRINTABLE_LUFA_BUILD_TARGETS:%= - %\n)" - -# Lists mandatory variables that must be set by the project makefile, in alphabetical order -list_mandatory: - @echo Mandatory Variables for Included Modules: - @printf " %b" "$(PRINTABLE_LUFA_MANDATORY_VARS:%= - %\n)" - -# Lists optional variables that must be set by the project makefile, in alphabetical order -list_optional: - @echo Optional Variables for Included Modules: - @printf " %b" "$(PRINTABLE_LUFA_OPTIONAL_VARS:%= - %\n)" - -# Lists variables provided by the included build modules, in alphabetical order -list_provided: - @echo Variables Provided by the Included Modules: - @printf " %b" "$(PRINTABLE_LUFA_PROVIDED_VARS:%= - %\n)" - -# Lists macros provided by the included build modules, in alphabetical order -list_macros: - @echo Macros Provided by the Included Modules: - @printf " %b" "$(PRINTABLE_LUFA_PROVIDED_MACROS:%= - %\n)" - -# Disable default in-built make rules (those that are needed are explicitly -# defined, and doing so has performance benefits when recursively building) -ifeq ($(filter -r,$(MAKEFLAGS)),) - MAKEFLAGS += -r -endif -.SUFFIXES: - -# Phony build targets for this module -.PHONY: help list_modules list_targets list_mandatory list_optional list_provided list_macros +DMBS_PATH := $(LUFA_PATH)/Build/DMBS/DMBS +include $(DMBS_PATH)/core.mk diff --git a/Firmware/LUFA/Build/lufa_cppcheck.mk b/Firmware/LUFA/Build/lufa_cppcheck.mk index 0b9b611..801a4c1 100644 --- a/Firmware/LUFA/Build/lufa_cppcheck.mk +++ b/Firmware/LUFA/Build/lufa_cppcheck.mk @@ -1,107 +1,10 @@ # # LUFA Library -# Copyright (C) Dean Camera, 2014. +# Copyright (C) Dean Camera, 2015. # # dean [at] fourwalledcubicle [dot] com # www.lufa-lib.org # -LUFA_BUILD_MODULES += CPPCHECK -LUFA_BUILD_TARGETS += cppcheck cppcheck-config -LUFA_BUILD_MANDATORY_VARS += SRC -LUFA_BUILD_OPTIONAL_VARS += CPPCHECK_INCLUDES CPPCHECK_EXCLUDES CPPCHECK_MSG_TEMPLATE CPPCHECK_ENABLE \ - CPPCHECK_SUPPRESS CPPCHECK_FAIL_ON_WARNING CPPCHECK_QUIET CPPCHECK_FLAGS -LUFA_BUILD_PROVIDED_VARS += -LUFA_BUILD_PROVIDED_MACROS += - -# ----------------------------------------------------------------------------- -# LUFA CPPCheck Buildsystem Makefile Module. -# ----------------------------------------------------------------------------- -# DESCRIPTION: -# Provides a set of targets to scan a project with the free "cppcheck" static -# analysis tool, to check for code errors at runtime -# (see http://cppcheck.sourceforge.net). -# ----------------------------------------------------------------------------- -# TARGETS: -# -# cppcheck - Scan the project with CPPCheck -# cppcheck-config - Use CPPCheck to look for missing include files -# -# MANDATORY PARAMETERS: -# -# SRC - List of source files to statically analyze -# -# OPTIONAL PARAMETERS: -# -# CPPCHECK_INCLUDES - Extra include paths to search for missing -# header files -# CPPCHECK_EXCLUDES - Source file paths to exclude checking (can be -# a path fragment if desired) -# CPPCHECK_MSG_TEMPLATE - Template for cppcheck error and warning output -# CPPCHECK_ENABLE - General cppcheck category checks to enable -# CPPCHECK_SUPPRESS - Specific cppcheck warnings to disable by ID -# CPPCHECK_FAIL_ON_WARNING - Set to Y to fail the build on cppcheck -# warnings, N to continue even if warnings occur -# CPPCHECK_QUIET - Enable cppcheck verbose or quiet output mode -# CPPCHECK_FLAGS - Additional flags to pass to cppcheck -# -# PROVIDED VARIABLES: -# -# (None) -# -# PROVIDED MACROS: -# -# (None) -# -# ----------------------------------------------------------------------------- - -SHELL = /bin/sh - -ERROR_IF_UNSET ?= $(if $(filter undefined, $(origin $(strip $(1)))), $(error Makefile $(strip $(1)) value not set)) -ERROR_IF_EMPTY ?= $(if $(strip $($(strip $(1)))), , $(error Makefile $(strip $(1)) option cannot be blank)) -ERROR_IF_NONBOOL ?= $(if $(filter Y N, $($(strip $(1)))), , $(error Makefile $(strip $(1)) option must be Y or N)) - -# Default values of optionally user-supplied variables -CPPCHECK_INCLUDES ?= -CPPCHECK_EXCLUDES ?= -CPPCHECK_MSG_TEMPLATE ?= {file}:{line}: {severity} ({id}): {message} -CPPCHECK_ENABLE ?= all -CPPCHECK_SUPPRESS ?= variableScope missingInclude -CPPCHECK_FAIL_ON_WARNING ?= Y -CPPCHECK_QUIET ?= Y -CPPCHECK_FLAGS ?= - -# Sanity check user supplied values -$(foreach MANDATORY_VAR, $(LUFA_BUILD_MANDATORY_VARS), $(call ERROR_IF_UNSET, $(MANDATORY_VAR))) -$(call ERROR_IF_EMPTY, SRC) -$(call ERROR_IF_EMPTY, CPPCHECK_MSG_TEMPLATE) -$(call ERROR_IF_EMPTY, CPPCHECK_ENABLE) -$(call ERROR_IF_NONBOOL, CPPCHECK_FAIL_ON_WARNING) -$(call ERROR_IF_NONBOOL, CPPCHECK_QUIET) - -# Build a default argument list for cppcheck -BASE_CPPCHECK_FLAGS := --template="$(CPPCHECK_MSG_TEMPLATE)" $(CPPCHECK_INCLUDES:%=-I%) $(CPPCHECK_EXCLUDES:%=-i%) --inline-suppr --force --std=c99 - -# Sanity check parameters and construct additional command line arguments to cppcheck -ifeq ($(CPPCHECK_FAIL_ON_WARNING), Y) - BASE_CPPCHECK_FLAGS += --error-exitcode=1 -endif -ifeq ($(CPPCHECK_QUIET), Y) - BASE_CPPCHECK_FLAGS += --quiet -endif - -# Output Messages -MSG_CPPCHECK_CMD := ' [CPPCHECK]:' - -# Checks the CPPCheck configuration as used in the user project, to determine if any paths are missing or invalid -cppcheck-config: $(MAKEFILE_LIST) - @echo $(MSG_CPPCHECK_CMD) Checking cppcheck configuration check on source files - cppcheck $(BASE_CPPCHECK_FLAGS) --check-config $(CPPCHECK_FLAGS) $(SRC) - -# Runs a static analysis using CPPCheck to determine if there are any issues -cppcheck: $(MAKEFILE_LIST) - @echo $(MSG_CPPCHECK_CMD) Performing static analysis on source files - cppcheck $(BASE_CPPCHECK_FLAGS) --enable=$(CPPCHECK_ENABLE) $(CPPCHECK_SUPPRESS:%=--suppress=%) $(CPPCHECK_FLAGS) $(SRC) - -# Phony build targets for this module -.PHONY: cppcheck-config cppcheck +DMBS_PATH := $(LUFA_PATH)/Build/DMBS/DMBS +include $(DMBS_PATH)/cppcheck.mk diff --git a/Firmware/LUFA/Build/lufa_dfu.mk b/Firmware/LUFA/Build/lufa_dfu.mk index 956adc8..2100ae8 100644 --- a/Firmware/LUFA/Build/lufa_dfu.mk +++ b/Firmware/LUFA/Build/lufa_dfu.mk @@ -1,95 +1,10 @@ # # LUFA Library -# Copyright (C) Dean Camera, 2014. +# Copyright (C) Dean Camera, 2015. # # dean [at] fourwalledcubicle [dot] com # www.lufa-lib.org # -LUFA_BUILD_MODULES += DFU -LUFA_BUILD_TARGETS += flip flip-ee dfu dfu-ee -LUFA_BUILD_MANDATORY_VARS += MCU TARGET -LUFA_BUILD_OPTIONAL_VARS += -LUFA_BUILD_PROVIDED_VARS += -LUFA_BUILD_PROVIDED_MACROS += - -# ----------------------------------------------------------------------------- -# LUFA DFU Bootloader Buildsystem Makefile Module. -# ----------------------------------------------------------------------------- -# DESCRIPTION: -# Provides a set of targets to re-program a device currently running a DFU -# class bootloader with a project's FLASH and EEPROM files. -# ----------------------------------------------------------------------------- -# TARGETS: -# -# flip - Program FLASH into target via Atmel FLIP -# flip-ee - Program EEPROM into target via Atmel FLIP -# dfu - Program FLASH into target via dfu-programmer -# dfu-ee - Program EEPROM into target via dfu-programmer -# -# MANDATORY PARAMETERS: -# -# MCU - Microcontroller device model name -# TARGET - Application name -# -# OPTIONAL PARAMETERS: -# -# (None) -# -# PROVIDED VARIABLES: -# -# (None) -# -# PROVIDED MACROS: -# -# (None) -# -# ----------------------------------------------------------------------------- - -SHELL = /bin/sh - -ERROR_IF_UNSET ?= $(if $(filter undefined, $(origin $(strip $(1)))), $(error Makefile $(strip $(1)) value not set)) -ERROR_IF_EMPTY ?= $(if $(strip $($(strip $(1)))), , $(error Makefile $(strip $(1)) option cannot be blank)) -ERROR_IF_NONBOOL ?= $(if $(filter Y N, $($(strip $(1)))), , $(error Makefile $(strip $(1)) option must be Y or N)) - -# Sanity-check values of mandatory user-supplied variables -$(foreach MANDATORY_VAR, $(LUFA_BUILD_MANDATORY_VARS), $(call ERROR_IF_UNSET, $(MANDATORY_VAR))) -$(call ERROR_IF_EMPTY, MCU) -$(call ERROR_IF_EMPTY, TARGET) - -# Output Messages -MSG_COPY_CMD := ' [CP] :' -MSG_REMOVE_CMD := ' [RM] :' -MSG_DFU_CMD := ' [DFU] :' - -# Programs in the target FLASH memory using BATCHISP, the command line tool used by FLIP -flip: $(TARGET).hex $(MAKEFILE_LIST) - @echo $(MSG_DFU_CMD) Programming FLASH with batchisp using \"$<\" - batchisp -hardware usb -device $(MCU) -operation erase f loadbuffer $< program - batchisp -hardware usb -device $(MCU) -operation start reset 0 - -# Programs in the target EEPROM memory using BATCHISP, the command line tool used by FLIP -flip-ee: $(TARGET).eep $(MAKEFILE_LIST) - @echo $(MSG_COPY_CMD) Copying EEP file to temporary file \"$<.hex\" - cp $< $<.hex - @echo $(MSG_DFU_CMD) Programming EEPROM with batchisp using \"$<.hex\" - batchisp -hardware usb -device $(MCU) -operation memory EEPROM loadbuffer $<.hex program - batchisp -hardware usb -device $(MCU) -operation start reset 0 - @echo $(MSG_REMOVE_CMD) Removing temporary file \"$<.hex\" - rm $<.hex - -# Programs in the target FLASH memory using DFU-PROGRAMMER -dfu: $(TARGET).hex $(MAKEFILE_LIST) - @echo $(MSG_DFU_CMD) Programming FLASH with dfu-programmer using \"$<\" - dfu-programmer $(MCU) erase - dfu-programmer $(MCU) flash $< - dfu-programmer $(MCU) reset - -# Programs in the target EEPROM memory using DFU-PROGRAMMER -dfu-ee: $(TARGET).eep $(MAKEFILE_LIST) - @echo $(MSG_DFU_CMD) Programming EEPROM with dfu-programmer using \"$<\" - dfu-programmer $(MCU) eeprom-flash $< - dfu-programmer $(MCU) reset - -# Phony build targets for this module -.PHONY: flip flip-ee dfu dfu-ee +DMBS_PATH := $(LUFA_PATH)/Build/DMBS/DMBS +include $(DMBS_PATH)/dfu.mk diff --git a/Firmware/LUFA/Build/lufa_doxygen.mk b/Firmware/LUFA/Build/lufa_doxygen.mk index babf287..64afd4a 100644 --- a/Firmware/LUFA/Build/lufa_doxygen.mk +++ b/Firmware/LUFA/Build/lufa_doxygen.mk @@ -1,100 +1,10 @@ # # LUFA Library -# Copyright (C) Dean Camera, 2014. +# Copyright (C) Dean Camera, 2015. # # dean [at] fourwalledcubicle [dot] com # www.lufa-lib.org # -LUFA_BUILD_MODULES += DOXYGEN -LUFA_BUILD_TARGETS += doxygen doxygen_upgrade doxygen_create -LUFA_BUILD_MANDATORY_VARS += LUFA_PATH -LUFA_BUILD_OPTIONAL_VARS += DOXYGEN_CONF DOXYGEN_FAIL_ON_WARNING DOXYGEN_OVERRIDE_PARAMS -LUFA_BUILD_PROVIDED_VARS += -LUFA_BUILD_PROVIDED_MACROS += - -# ----------------------------------------------------------------------------- -# LUFA Doxygen Buildsystem Makefile Module. -# ----------------------------------------------------------------------------- -# DESCRIPTION: -# Provides a set of targets to automatically build Doxygen documentation for -# a project (see www.doxygen.org). -# ----------------------------------------------------------------------------- -# TARGETS: -# -# doxygen - Build Doxygen Documentation -# doxygen_create - Create a new Doxygen configuration file using -# the latest template -# doxygen_upgrade - Upgrade an existing Doxygen configuration file -# to the latest template -# -# MANDATORY PARAMETERS: -# -# LUFA_PATH - Path to the LUFA library core -# -# OPTIONAL PARAMETERS: -# -# DOXYGEN_CONF - Doxygen configuration filename -# DOXYGEN_FAIL_ON_WARNING - Set to Y to fail the build on Doxygen warnings, -# N to continue even if warnings occur -# DOXYGEN_OVERRIDE_PARAMS - Parameters to override in the doxygen -# configuration file -# PROVIDED VARIABLES: -# -# (None) -# -# PROVIDED MACROS: -# -# (None) -# -# ----------------------------------------------------------------------------- - -SHELL = /bin/sh - -ERROR_IF_UNSET ?= $(if $(filter undefined, $(origin $(strip $(1)))), $(error Makefile $(strip $(1)) value not set)) -ERROR_IF_EMPTY ?= $(if $(strip $($(strip $(1)))), , $(error Makefile $(strip $(1)) option cannot be blank)) -ERROR_IF_NONBOOL ?= $(if $(filter Y N, $($(strip $(1)))), , $(error Makefile $(strip $(1)) option must be Y or N)) - -# Default values of optionally user-supplied variables -DOXYGEN_CONF ?= doxyfile -DOXYGEN_FAIL_ON_WARNING ?= Y -DOXYGEN_OVERRIDE_PARAMS ?= QUIET=YES HTML_EXTRA_STYLESHEET=$(patsubst %/,%,$(LUFA_PATH))/DoxygenPages/Style/Style.css - -# Sanity check user supplied values -$(foreach MANDATORY_VAR, $(LUFA_BUILD_MANDATORY_VARS), $(call ERROR_IF_UNSET, $(MANDATORY_VAR))) -$(call ERROR_IF_EMPTY, DOXYGEN_CONF) -$(call ERROR_IF_EMPTY, LUFA_PATH) -$(call ERROR_IF_NONBOOL, DOXYGEN_FAIL_ON_WARNING) - -# Output Messages -MSG_DOXYGEN_CMD := ' [DOXYGEN] :' - -# Determine Doxygen invocation command -BASE_DOXYGEN_CMD := ( cat $(DOXYGEN_CONF) $(DOXYGEN_OVERRIDE_PARAMS:%=; echo "%") ) | doxygen - -ifeq ($(DOXYGEN_FAIL_ON_WARNING), Y) - DOXYGEN_CMD := if ( $(BASE_DOXYGEN_CMD) 2>&1 | grep -v "warning: ignoring unsupported tag" ;); then exit 1; fi; -else - DOXYGEN_CMD := $(BASE_DOXYGEN_CMD) -endif - -# Error if the specified Doxygen configuration file does not exist -$(DOXYGEN_CONF): - $(error Doxygen configuration file $@ does not exist) - -# Builds the project documentation using the specified configuration file and the DOXYGEN tool -doxygen: $(DOXYGEN_CONF) $(MAKEFILE_LIST) - @echo $(MSG_DOXYGEN_CMD) Configuration file \"$(DOXYGEN_CONF)\" with parameters \"$(DOXYGEN_OVERRIDE_PARAMS)\" - $(DOXYGEN_CMD) - -# Upgrades an existing Doxygen configuration file to the latest Doxygen template, preserving settings -doxygen_upgrade: $(DOXYGEN_CONF) $(MAKEFILE_LIST) - @echo $(MSG_DOXYGEN_CMD) Upgrading configuration file \"$(DOXYGEN_CONF)\" with latest template - doxygen -u $(DOXYGEN_CONF) > /dev/null - -# Creates a new Doxygen configuration file with the set file name -doxygen_create: $(MAKEFILE_LIST) - @echo $(MSG_DOXYGEN_CMD) Creating new configuration file \"$(DOXYGEN_CONF)\" with latest template - doxygen -g $(DOXYGEN_CONF) > /dev/null - -# Phony build targets for this module -.PHONY: doxygen doxygen_upgrade doxygen_create +DMBS_PATH := $(LUFA_PATH)/Build/DMBS/DMBS +include $(DMBS_PATH)/doxygen.mk diff --git a/Firmware/LUFA/Build/lufa_hid.mk b/Firmware/LUFA/Build/lufa_hid.mk index e79b7bf..86ca145 100644 --- a/Firmware/LUFA/Build/lufa_hid.mk +++ b/Firmware/LUFA/Build/lufa_hid.mk @@ -1,96 +1,10 @@ # # LUFA Library -# Copyright (C) Dean Camera, 2014. +# Copyright (C) Dean Camera, 2015. # # dean [at] fourwalledcubicle [dot] com # www.lufa-lib.org # -LUFA_BUILD_MODULES += HID -LUFA_BUILD_TARGETS += hid hid-ee teensy teensy-ee -LUFA_BUILD_MANDATORY_VARS += MCU TARGET -LUFA_BUILD_OPTIONAL_VARS += -LUFA_BUILD_PROVIDED_VARS += -LUFA_BUILD_PROVIDED_MACROS += - -# ----------------------------------------------------------------------------- -# LUFA HID Bootloader Buildsystem Makefile Module. -# ----------------------------------------------------------------------------- -# DESCRIPTION: -# Provides a set of targets to re-program a device currently running a HID -# class bootloader with a project's FLASH files. -# ----------------------------------------------------------------------------- -# TARGETS: -# -# hid - Program FLASH into target via -# hid_bootloader_cli -# hid-ee - Program EEPROM into target via a temporary -# AVR application and hid_bootloader_cli -# teensy - Program FLASH into target via -# teensy_loader_cli -# teensy-ee - Program EEPROM into target via a temporary -# AVR application and teensy_loader_cli -# -# MANDATORY PARAMETERS: -# -# MCU - Microcontroller device model name -# TARGET - Application name -# -# OPTIONAL PARAMETERS: -# -# (None) -# -# PROVIDED VARIABLES: -# -# (None) -# -# PROVIDED MACROS: -# -# (None) -# -# ----------------------------------------------------------------------------- - -SHELL = /bin/sh - -LUFA_MODULE_PATH := $(patsubst %/,%,$(dir $(lastword $(MAKEFILE_LIST)))) - -ERROR_IF_UNSET ?= $(if $(filter undefined, $(origin $(strip $(1)))), $(error Makefile $(strip $(1)) value not set)) -ERROR_IF_EMPTY ?= $(if $(strip $($(strip $(1)))), , $(error Makefile $(strip $(1)) option cannot be blank)) -ERROR_IF_NONBOOL ?= $(if $(filter Y N, $($(strip $(1)))), , $(error Makefile $(strip $(1)) option must be Y or N)) - -# Sanity-check values of mandatory user-supplied variables -$(foreach MANDATORY_VAR, $(LUFA_BUILD_MANDATORY_VARS), $(call ERROR_IF_UNSET, $(MANDATORY_VAR))) -$(call ERROR_IF_EMPTY, MCU) -$(call ERROR_IF_EMPTY, TARGET) - -# Output Messages -MSG_HID_BOOTLOADER_CMD := ' [HID] :' -MSG_OBJCPY_CMD := ' [OBJCPY] :' -MSG_MAKE_CMD := ' [MAKE] :' - -# Programs in the target FLASH memory using the HID_BOOTLOADER_CLI tool -hid: $(TARGET).hex $(MAKEFILE_LIST) - @echo $(MSG_HID_BOOTLOADER_CMD) Programming FLASH with hid_bootloader_cli using \"$<\" - hid_bootloader_cli -mmcu=$(MCU) -v $< - -# Programs in the target EEPROM memory using the HID_BOOTLOADER_CLI tool (note: clears target FLASH memory) -hid-ee: $(TARGET).eep $(MAKEFILE_LIST) - @echo $(MSG_OBJCPY_CMD) Converting \"$<\" to a binary file \"InputEEData.bin\" - avr-objcopy -I ihex -O binary $< $(LUFA_MODULE_PATH)/HID_EEPROM_Loader/InputEEData.bin - @echo $(MSG_MAKE_CMD) Making EEPROM loader application for \"$<\" - $(MAKE) -C $(LUFA_MODULE_PATH)/HID_EEPROM_Loader/ MCU=$(MCU) clean hid - -# Programs in the target FLASH memory using the TEENSY_BOOTLOADER_CLI tool -teensy: $(TARGET).hex $(MAKEFILE_LIST) - @echo $(MSG_HID_BOOTLOADER_CMD) Programming FLASH with teensy_loader_cli using \"$<\" - teensy_loader_cli -mmcu=$(MCU) -v $< - -# Programs in the target EEPROM memory using the TEENSY_BOOTLOADER_CLI tool (note: clears target FLASH memory) -teensy-ee: $(TARGET).hex $(MAKEFILE_LIST) - @echo $(MSG_OBJCPY_CMD) Converting \"$<\" to a binary file \"InputEEData.bin\" - avr-objcopy -I ihex -O binary $< $(LUFA_MODULE_PATH)/HID_EEPROM_Loader/InputEEData.bin - @echo $(MSG_MAKE_CMD) Making EEPROM loader application for \"$<\" - $(MAKE) -s -C $(LUFA_MODULE_PATH)/HID_EEPROM_Loader/ MCU=$(MCU) clean teensy - -# Phony build targets for this module -.PHONY: hid hid-ee teensy teensy-ee +DMBS_PATH := $(LUFA_PATH)/Build/DMBS/DMBS +include $(DMBS_PATH)/hid.mk diff --git a/Firmware/LUFA/Build/lufa_sources.mk b/Firmware/LUFA/Build/lufa_sources.mk index cc3492e..48291c7 100644 --- a/Firmware/LUFA/Build/lufa_sources.mk +++ b/Firmware/LUFA/Build/lufa_sources.mk @@ -1,144 +1,10 @@ # # LUFA Library -# Copyright (C) Dean Camera, 2014. +# Copyright (C) Dean Camera, 2015. # # dean [at] fourwalledcubicle [dot] com # www.lufa-lib.org # -LUFA_BUILD_MODULES += SOURCES -LUFA_BUILD_TARGETS += -LUFA_BUILD_MANDATORY_VARS += LUFA_PATH ARCH -LUFA_BUILD_OPTIONAL_VARS += -LUFA_BUILD_PROVIDED_VARS += LUFA_SRC_USB_DEVICE LUFA_SRC_USB_HOST \ - LUFA_SRC_USB LUFA_SRC_USBCLASS_DEVICE \ - LUFA_SRC_USBCLASS_HOST LUFA_SRC_USBCLASS \ - LUFA_SRC_TEMPERATURE LUFA_SRC_SERIAL \ - LUFA_SRC_TWI LUFA_SRC_PLATFORM -LUFA_BUILD_PROVIDED_MACROS += - -# ----------------------------------------------------------------------------- -# LUFA Sources Buildsystem Makefile Module. -# ----------------------------------------------------------------------------- -# DESCRIPTION: -# Provides a set of makefile variables for the various LUFA module sources. -# Once included, the sources required to use a given LUFA module will become -# available using the makefile variable names listed in the LUFA project -# documentation. -# ----------------------------------------------------------------------------- -# TARGETS: -# -# (None) -# -# MANDATORY PARAMETERS: -# -# LUFA_PATH - Path to the LUFA library core -# ARCH - Device architecture name -# -# OPTIONAL PARAMETERS: -# -# (None) -# -# PROVIDED VARIABLES: -# -# LUFA_SRC_USB_DEVICE - List of LUFA USB driver source files required -# for USB Device mode only -# LUFA_SRC_USB_HOST - List of LUFA USB driver source files required -# for USB Host mode only -# LUFA_SRC_USB - List of LUFA USB driver source files for all -# USB modes -# LUFA_SRC_USBCLASS_DEVICE - List of LUFA USB Class driver source files for -# USB Device mode only -# LUFA_SRC_USBCLASS_HOST - List of LUFA USB Class driver source files for -# USB Host mode only -# LUFA_SRC_USBCLASS - List of LUFA USB Class driver source files for -# all USB modes -# LUFA_SRC_TEMPERATURE - List of LUFA temperature sensor driver source -# files -# LUFA_SRC_SERIAL - List of LUFA Serial U(S)ART driver source files -# LUFA_SRC_TWI - List of LUFA TWI driver source files -# LUFA_SRC_PLATFORM - List of LUFA architecture specific platform -# management source files -# -# PROVIDED MACROS: -# -# (None) -# -# ----------------------------------------------------------------------------- - -SHELL = /bin/sh - -ERROR_IF_UNSET ?= $(if $(filter undefined, $(origin $(strip $(1)))), $(error Makefile $(strip $(1)) value not set)) -ERROR_IF_EMPTY ?= $(if $(strip $($(strip $(1)))), , $(error Makefile $(strip $(1)) option cannot be blank)) -ERROR_IF_NONBOOL ?= $(if $(filter Y N, $($(strip $(1)))), , $(error Makefile $(strip $(1)) option must be Y or N)) - -# Sanity check user supplied values -$(foreach MANDATORY_VAR, $(LUFA_BUILD_MANDATORY_VARS), $(call ERROR_IF_UNSET, $(MANDATORY_VAR))) -$(call ERROR_IF_EMPTY, LUFA_PATH) -$(call ERROR_IF_EMPTY, ARCH) - -# Allow LUFA_ROOT_PATH to be overridden elsewhere to support legacy LUFA makefiles -LUFA_ROOT_PATH ?= $(patsubst %/,%,$(LUFA_PATH)) - -# Construct LUFA module source variables -LUFA_SRC_USB_COMMON := $(LUFA_ROOT_PATH)/Drivers/USB/Core/$(ARCH)/USBController_$(ARCH).c \ - $(LUFA_ROOT_PATH)/Drivers/USB/Core/$(ARCH)/USBInterrupt_$(ARCH).c \ - $(LUFA_ROOT_PATH)/Drivers/USB/Core/ConfigDescriptors.c \ - $(LUFA_ROOT_PATH)/Drivers/USB/Core/Events.c \ - $(LUFA_ROOT_PATH)/Drivers/USB/Core/USBTask.c \ - $(LUFA_ROOT_PATH)/Drivers/USB/Class/Common/HIDParser.c \ - -LUFA_SRC_USB_HOST := $(LUFA_ROOT_PATH)/Drivers/USB/Core/$(ARCH)/Host_$(ARCH).c \ - $(LUFA_ROOT_PATH)/Drivers/USB/Core/$(ARCH)/Pipe_$(ARCH).c \ - $(LUFA_ROOT_PATH)/Drivers/USB/Core/$(ARCH)/PipeStream_$(ARCH).c \ - $(LUFA_ROOT_PATH)/Drivers/USB/Core/HostStandardReq.c \ - $(LUFA_SRC_USB_COMMON) - -LUFA_SRC_USB_DEVICE := $(LUFA_ROOT_PATH)/Drivers/USB/Core/$(ARCH)/Device_$(ARCH).c \ - $(LUFA_ROOT_PATH)/Drivers/USB/Core/$(ARCH)/Endpoint_$(ARCH).c \ - $(LUFA_ROOT_PATH)/Drivers/USB/Core/$(ARCH)/EndpointStream_$(ARCH).c \ - $(LUFA_ROOT_PATH)/Drivers/USB/Core/DeviceStandardReq.c \ - $(LUFA_SRC_USB_COMMON) - -LUFA_SRC_USBCLASS_DEVICE := $(LUFA_ROOT_PATH)/Drivers/USB/Class/Device/AudioClassDevice.c \ - $(LUFA_ROOT_PATH)/Drivers/USB/Class/Device/CDCClassDevice.c \ - $(LUFA_ROOT_PATH)/Drivers/USB/Class/Device/HIDClassDevice.c \ - $(LUFA_ROOT_PATH)/Drivers/USB/Class/Device/MassStorageClassDevice.c \ - $(LUFA_ROOT_PATH)/Drivers/USB/Class/Device/MIDIClassDevice.c \ - $(LUFA_ROOT_PATH)/Drivers/USB/Class/Device/PrinterClassDevice.c \ - $(LUFA_ROOT_PATH)/Drivers/USB/Class/Device/RNDISClassDevice.c \ - -LUFA_SRC_USBCLASS_HOST := $(LUFA_ROOT_PATH)/Drivers/USB/Class/Host/AndroidAccessoryClassHost.c \ - $(LUFA_ROOT_PATH)/Drivers/USB/Class/Host/AudioClassHost.c \ - $(LUFA_ROOT_PATH)/Drivers/USB/Class/Host/CDCClassHost.c \ - $(LUFA_ROOT_PATH)/Drivers/USB/Class/Host/HIDClassHost.c \ - $(LUFA_ROOT_PATH)/Drivers/USB/Class/Host/MassStorageClassHost.c \ - $(LUFA_ROOT_PATH)/Drivers/USB/Class/Host/MIDIClassHost.c \ - $(LUFA_ROOT_PATH)/Drivers/USB/Class/Host/PrinterClassHost.c \ - $(LUFA_ROOT_PATH)/Drivers/USB/Class/Host/RNDISClassHost.c \ - $(LUFA_ROOT_PATH)/Drivers/USB/Class/Host/StillImageClassHost.c - -LUFA_SRC_USB := $(sort $(LUFA_SRC_USB_COMMON) $(LUFA_SRC_USB_HOST) $(LUFA_SRC_USB_DEVICE)) - -LUFA_SRC_USBCLASS := $(LUFA_SRC_USBCLASS_DEVICE) $(LUFA_SRC_USBCLASS_HOST) - -LUFA_SRC_TEMPERATURE := $(LUFA_ROOT_PATH)/Drivers/Board/Temperature.c - -LUFA_SRC_SERIAL := $(LUFA_ROOT_PATH)/Drivers/Peripheral/$(ARCH)/Serial_$(ARCH).c - -LUFA_SRC_TWI := $(LUFA_ROOT_PATH)/Drivers/Peripheral/$(ARCH)/TWI_$(ARCH).c - -ifeq ($(ARCH), UC3) - LUFA_SRC_PLATFORM := $(LUFA_ROOT_PATH)/Platform/UC3/Exception.S \ - $(LUFA_ROOT_PATH)/Platform/UC3/InterruptManagement.c -else - LUFA_SRC_PLATFORM := -endif - -# Build a list of all available module sources -LUFA_SRC_ALL_FILES := $(LUFA_SRC_USB) \ - $(LUFA_SRC_USBCLASS) \ - $(LUFA_SRC_TEMPERATURE) \ - $(LUFA_SRC_SERIAL) \ - $(LUFA_SRC_TWI) \ - $(LUFA_SRC_PLATFORM) +DMBS_LUFA_PATH ?= $(LUFA_PATH)/Build/LUFA +include $(DMBS_LUFA_PATH)/lufa-sources.mk diff --git a/Firmware/LUFA/CodeTemplates/DeviceTemplate/Descriptors.c b/Firmware/LUFA/CodeTemplates/DeviceTemplate/Descriptors.c index 71cebe8..0b44c0d 100644 --- a/Firmware/LUFA/CodeTemplates/DeviceTemplate/Descriptors.c +++ b/Firmware/LUFA/CodeTemplates/DeviceTemplate/Descriptors.c @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted @@ -127,7 +127,7 @@ const USB_Descriptor_String_t ProductString = * USB host. */ uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue, - const uint8_t wIndex, + const uint16_t wIndex, const void** const DescriptorAddress #if defined(HAS_MULTIPLE_DESCRIPTOR_ADDRESS_SPACES) , uint8_t* const DescriptorMemorySpace diff --git a/Firmware/LUFA/CodeTemplates/DeviceTemplate/Descriptors.h b/Firmware/LUFA/CodeTemplates/DeviceTemplate/Descriptors.h index 6d8145d..2bf6a6a 100644 --- a/Firmware/LUFA/CodeTemplates/DeviceTemplate/Descriptors.h +++ b/Firmware/LUFA/CodeTemplates/DeviceTemplate/Descriptors.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/CodeTemplates/DeviceTemplate/DeviceApplication.c b/Firmware/LUFA/CodeTemplates/DeviceTemplate/DeviceApplication.c index ddaa9d0..2bc44b4 100644 --- a/Firmware/LUFA/CodeTemplates/DeviceTemplate/DeviceApplication.c +++ b/Firmware/LUFA/CodeTemplates/DeviceTemplate/DeviceApplication.c @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/CodeTemplates/DeviceTemplate/DeviceApplication.h b/Firmware/LUFA/CodeTemplates/DeviceTemplate/DeviceApplication.h index 325176c..b342909 100644 --- a/Firmware/LUFA/CodeTemplates/DeviceTemplate/DeviceApplication.h +++ b/Firmware/LUFA/CodeTemplates/DeviceTemplate/DeviceApplication.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/CodeTemplates/DeviceTemplate/asf.xml b/Firmware/LUFA/CodeTemplates/DeviceTemplate/asf.xml index e952714..fd65db2 100644 --- a/Firmware/LUFA/CodeTemplates/DeviceTemplate/asf.xml +++ b/Firmware/LUFA/CodeTemplates/DeviceTemplate/asf.xml @@ -1,55 +1,55 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - Template for a LUFA USB device mode application. - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + Template for a LUFA USB device mode application. + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Firmware/LUFA/CodeTemplates/DriverStubs/Board.h b/Firmware/LUFA/CodeTemplates/DriverStubs/Board.h index 5a1e583..9dce2f5 100644 --- a/Firmware/LUFA/CodeTemplates/DriverStubs/Board.h +++ b/Firmware/LUFA/CodeTemplates/DriverStubs/Board.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/CodeTemplates/DriverStubs/Buttons.h b/Firmware/LUFA/CodeTemplates/DriverStubs/Buttons.h index b3c2f2b..fd74652 100644 --- a/Firmware/LUFA/CodeTemplates/DriverStubs/Buttons.h +++ b/Firmware/LUFA/CodeTemplates/DriverStubs/Buttons.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/CodeTemplates/DriverStubs/Dataflash.h b/Firmware/LUFA/CodeTemplates/DriverStubs/Dataflash.h index 83acb2f..f405a80 100644 --- a/Firmware/LUFA/CodeTemplates/DriverStubs/Dataflash.h +++ b/Firmware/LUFA/CodeTemplates/DriverStubs/Dataflash.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/CodeTemplates/DriverStubs/Joystick.h b/Firmware/LUFA/CodeTemplates/DriverStubs/Joystick.h index 07542ab..bf17c43 100644 --- a/Firmware/LUFA/CodeTemplates/DriverStubs/Joystick.h +++ b/Firmware/LUFA/CodeTemplates/DriverStubs/Joystick.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/CodeTemplates/DriverStubs/LEDs.h b/Firmware/LUFA/CodeTemplates/DriverStubs/LEDs.h index 4373972..d7d2f50 100644 --- a/Firmware/LUFA/CodeTemplates/DriverStubs/LEDs.h +++ b/Firmware/LUFA/CodeTemplates/DriverStubs/LEDs.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/CodeTemplates/HostTemplate/HostApplication.c b/Firmware/LUFA/CodeTemplates/HostTemplate/HostApplication.c index 1ac0378..e0774b3 100644 --- a/Firmware/LUFA/CodeTemplates/HostTemplate/HostApplication.c +++ b/Firmware/LUFA/CodeTemplates/HostTemplate/HostApplication.c @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted @@ -122,7 +122,7 @@ void EVENT_USB_Host_DeviceEnumerationFailed(const uint8_t ErrorCode, * option is set, this is still required even in an application that uses host mode only. */ uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue, - const uint8_t wIndex, + const uint16_t wIndex, const void** const DescriptorAddress #if defined(HAS_MULTIPLE_DESCRIPTOR_ADDRESS_SPACES) , uint8_t* const DescriptorMemorySpace diff --git a/Firmware/LUFA/CodeTemplates/HostTemplate/HostApplication.h b/Firmware/LUFA/CodeTemplates/HostTemplate/HostApplication.h index 16dbb53..31eea28 100644 --- a/Firmware/LUFA/CodeTemplates/HostTemplate/HostApplication.h +++ b/Firmware/LUFA/CodeTemplates/HostTemplate/HostApplication.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/CodeTemplates/HostTemplate/asf.xml b/Firmware/LUFA/CodeTemplates/HostTemplate/asf.xml index c3860c0..c1996ec 100644 --- a/Firmware/LUFA/CodeTemplates/HostTemplate/asf.xml +++ b/Firmware/LUFA/CodeTemplates/HostTemplate/asf.xml @@ -1,41 +1,41 @@ - - - - - - - - - - - - - - - - Template for a LUFA USB host mode application. - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + Template for a LUFA USB host mode application. + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Firmware/LUFA/CodeTemplates/LUFAConfig.h b/Firmware/LUFA/CodeTemplates/LUFAConfig.h index ab7fc75..bf6ee37 100644 --- a/Firmware/LUFA/CodeTemplates/LUFAConfig.h +++ b/Firmware/LUFA/CodeTemplates/LUFAConfig.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/CodeTemplates/makefile_template b/Firmware/LUFA/CodeTemplates/makefile_template index efb6aa7..945d6fd 100644 --- a/Firmware/LUFA/CodeTemplates/makefile_template +++ b/Firmware/LUFA/CodeTemplates/makefile_template @@ -1,6 +1,6 @@ # # LUFA Library -# Copyright (C) Dean Camera, 2014. +# Copyright (C) Dean Camera, 2017. # # dean [at] fourwalledcubicle [dot] com # www.lufa-lib.org @@ -26,13 +26,18 @@ LD_FLAGS = # Default target all: -# Include LUFA build script makefiles -include $(LUFA_PATH)/Build/lufa_core.mk -include $(LUFA_PATH)/Build/lufa_sources.mk -include $(LUFA_PATH)/Build/lufa_build.mk -include $(LUFA_PATH)/Build/lufa_cppcheck.mk -include $(LUFA_PATH)/Build/lufa_doxygen.mk -include $(LUFA_PATH)/Build/lufa_dfu.mk -include $(LUFA_PATH)/Build/lufa_hid.mk -include $(LUFA_PATH)/Build/lufa_avrdude.mk -include $(LUFA_PATH)/Build/lufa_atprogram.mk +# Include LUFA-specific DMBS extension modules +DMBS_LUFA_PATH ?= $(LUFA_PATH)/Build/LUFA +include $(DMBS_LUFA_PATH)/lufa-sources.mk +include $(DMBS_LUFA_PATH)/lufa-gcc.mk + +# Include common DMBS build system modules +DMBS_PATH ?= $(LUFA_PATH)/Build/DMBS/DMBS +include $(DMBS_PATH)/core.mk +include $(DMBS_PATH)/cppcheck.mk +include $(DMBS_PATH)/doxygen.mk +include $(DMBS_PATH)/dfu.mk +include $(DMBS_PATH)/gcc.mk +include $(DMBS_PATH)/hid.mk +include $(DMBS_PATH)/avrdude.mk +include $(DMBS_PATH)/atprogram.mk diff --git a/Firmware/LUFA/Common/ArchitectureSpecific.h b/Firmware/LUFA/Common/ArchitectureSpecific.h index 292e27b..28f2900 100644 --- a/Firmware/LUFA/Common/ArchitectureSpecific.h +++ b/Firmware/LUFA/Common/ArchitectureSpecific.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Common/Architectures.h b/Firmware/LUFA/Common/Architectures.h index 265b412..5873674 100644 --- a/Firmware/LUFA/Common/Architectures.h +++ b/Firmware/LUFA/Common/Architectures.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Common/Attributes.h b/Firmware/LUFA/Common/Attributes.h index dc5c6be..c8e4104 100644 --- a/Firmware/LUFA/Common/Attributes.h +++ b/Firmware/LUFA/Common/Attributes.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Common/BoardTypes.h b/Firmware/LUFA/Common/BoardTypes.h index 06ff4dd..a8bb191 100644 --- a/Firmware/LUFA/Common/BoardTypes.h +++ b/Firmware/LUFA/Common/BoardTypes.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted @@ -240,6 +240,12 @@ /** Selects the Arduino Micro specific board drivers, including the driver for the board LEDs. */ #define BOARD_MICRO 58 + /** Selects the Pololu A-Star Micro specific board drivers, including the driver for the board LEDs. */ + #define BOARD_POLOLUMICRO 59 + + /** Selects the Atmel Xplained-MINI specific board drivers, including the driver for the board LEDs. */ + #define BOARD_XPLAINED_MINI 60 + #if !defined(__DOXYGEN__) #define BOARD_ BOARD_NONE diff --git a/Firmware/LUFA/Common/Common.h b/Firmware/LUFA/Common/Common.h index 3e12e4f..6864eb6 100644 --- a/Firmware/LUFA/Common/Common.h +++ b/Firmware/LUFA/Common/Common.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Common/CompilerSpecific.h b/Firmware/LUFA/Common/CompilerSpecific.h index 9979fff..41e5305 100644 --- a/Firmware/LUFA/Common/CompilerSpecific.h +++ b/Firmware/LUFA/Common/CompilerSpecific.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Common/Endianness.h b/Firmware/LUFA/Common/Endianness.h index 2eb3ad0..8be9e0d 100644 --- a/Firmware/LUFA/Common/Endianness.h +++ b/Firmware/LUFA/Common/Endianness.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted @@ -397,7 +397,7 @@ * * \return Input data with the individual bytes reversed. */ - static inline uint16_t SwapEndian_16(const uint16_t Word) ATTR_WARN_UNUSED_RESULT ATTR_CONST; + static inline uint16_t SwapEndian_16(const uint16_t Word) ATTR_WARN_UNUSED_RESULT ATTR_CONST ATTR_ALWAYS_INLINE; static inline uint16_t SwapEndian_16(const uint16_t Word) { if (GCC_IS_COMPILE_CONST(Word)) @@ -428,7 +428,7 @@ * * \return Input data with the individual bytes reversed. */ - static inline uint32_t SwapEndian_32(const uint32_t DWord) ATTR_WARN_UNUSED_RESULT ATTR_CONST; + static inline uint32_t SwapEndian_32(const uint32_t DWord) ATTR_WARN_UNUSED_RESULT ATTR_CONST ATTR_ALWAYS_INLINE; static inline uint32_t SwapEndian_32(const uint32_t DWord) { if (GCC_IS_COMPILE_CONST(DWord)) diff --git a/Firmware/LUFA/DoxygenPages/BuildSystem.txt b/Firmware/LUFA/DoxygenPages/BuildSystem.txt index 0ae1dd6..ef57fcf 100644 --- a/Firmware/LUFA/DoxygenPages/BuildSystem.txt +++ b/Firmware/LUFA/DoxygenPages/BuildSystem.txt @@ -1,975 +1,281 @@ -/** \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. - */ - -/** \page Page_BuildSystem The LUFA Build System - * - * \section Sec_BuildSystem_Overview Overview of the LUFA Build System - * The LUFA build system is an attempt at making a set of re-usable, modular build make files which - * can be referenced in a LUFA powered project, to minimize the amount of code required in an - * application makefile. The system is written in GNU Make, and each module is independent of - * one-another. - * - * For details on the prerequisites needed for Linux and Windows machines to be able to use the LUFA - * build system, see \ref Sec_CompilingApps_Prerequisites. - * - * To use a LUFA build system module, simply add an include to your project makefile. All user projects - * should at a minimum include \ref Page_BuildModule_CORE for base functionality: - * \code - * include $(LUFA_PATH)/Build/lufa_core.mk - * \endcode - * - * Once included in your project makefile, the associated build module targets will be added to your - * project's build makefile targets automatically. To call a build target, run make {TARGET_NAME} - * from the command line, substituting in the appropriate target name. - * - * \see \ref Sec_ConfiguringApps_AppMakefileParams for a copy of the sample LUFA project makefile. - * - * Each build module may have one or more mandatory parameters (GNU Make variables) which must - * be supplied in the project makefile for the module to work, and one or more optional parameters which - * may be defined and which will assume a sensible default if not. - * - * \section SSec_BuildSystem_Modules Available Modules - * - * The following modules are included in this LUFA release: - * - * \li \subpage Page_BuildModule_ATPROGRAM - Device Programming - * \li \subpage Page_BuildModule_AVRDUDE - Device Programming - * \li \subpage Page_BuildModule_BUILD - Compiling/Assembling/Linking - * \li \subpage Page_BuildModule_CORE - Core Build System Functions - * \li \subpage Page_BuildModule_CPPCHECK - Static Code Analysis - * \li \subpage Page_BuildModule_DFU - Device Programming - * \li \subpage Page_BuildModule_DOXYGEN - Automated Source Code Documentation - * \li \subpage Page_BuildModule_HID - Device Programming - * \li \subpage Page_BuildModule_SOURCES - LUFA Module Source Code Variables - * - * If you have problems building using the LUFA build system, see \subpage Page_BuildTroubleshooting for resolution steps. - */ - - /** \page Page_BuildModule_BUILD The BUILD build module - * - * The BUILD LUFA build system module, providing targets for the compilation, - * assembling and linking of an application from source code into binary files - * suitable for programming into a target device, using the GCC compiler. - * - * To use this module in your application makefile, add the following code: - * \code - * include $(LUFA_PATH)/Build/lufa_build.mk - * \endcode - * - * \section SSec_BuildModule_BUILD_Requirements Requirements - * This module requires the the architecture appropriate binaries of the GCC compiler are available in your - * system's PATH variable. The GCC compiler and associated toolchain is distributed in Atmel AVR Studio - * 5.x and Atmel Studio 6.x installation directories, as well as in many third party distribution packages. - * - * \section SSec_BuildModule_BUILD_Targets Targets - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - *
sizeDisplay size of the compiled application FLASH and SRAM segments.
symbol-sizesDisplay a size-sorted list of symbols from the compiled application, in decimal bytes.
libBuild and archive all source files into a library A binary file.
allBuild and link the application into ELF debug and HEX binary files.
elfBuild and link the application into an ELF debug file.
binBuild and link the application and produce a BIN binary file.
hexBuild and link the application and produce HEX and EEP binary files.
lssBuild and link the application and produce a LSS source code/assembly code mixed listing file.
cleanRemove all intermediary files and binary output files.
mostlycleanRemove all intermediary files but preserve any binary output files.
<filename>.sCreate an assembly listing of a given input C/C++ source file.
- * - * \section SSec_BuildModule_BUILD_MandatoryParams Mandatory Parameters - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - *
TARGETName of the application output file prefix (e.g. TestApplication).
ARCHArchitecture of the target processor (see \ref Page_DeviceSupport).
MCUName of the Atmel processor model (e.g. at90usb1287).
SRCList of relative or absolute paths to the application C (.c), C++ (.cpp) and Assembly (.S) source files.
F_USBSpeed in Hz of the input clock frequency to the target's USB controller.
LUFA_PATHPath to the LUFA library core, either relative or absolute (e.g. ../LUFA-000000/LUFA/).
- * - * \section SSec_BuildModule_BUILD_OptionalParams Optional Parameters - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - *
BOARDLUFA board hardware drivers to use (see \ref Page_DeviceSupport).
OPTIMIZATIONOptimization level to use when compiling source files (see GCC manual).
C_STANDARDVersion of the C standard to apply when compiling C++ source files (see GCC manual).
CPP_STANDARDVersion of the C++ standard to apply when compiling C++ source files (see GCC manual).
DEBUG_FORMATFormat of the debug information to embed in the generated object files (see GCC manual).
DEBUG_LEVELLevel of the debugging information to embed in the generated object files (see GCC manual).
F_CPUSpeed of the processor CPU clock, in Hz.
C_FLAGSFlags to pass to the C compiler only, after the automatically generated flags.
CPP_FLAGSFlags to pass to the C++ compiler only, after the automatically generated flags.
ASM_FLAGSFlags to pass to the assembler only, after the automatically generated flags.
CC_FLAGSCommon flags to pass to the C/C++ compiler and assembler, after the automatically generated flags.
COMPILER_PATHDirectory where the C/C++ toolchain is located, if not available in the system PATH.
LD_FLAGSFlags to pass to the linker, after the automatically generated flags.
LINKER_RELAXATIONSEnables or disables linker relaxations when linking the application binary. This can reduce the total size - * of the application by replacing full \c CALL instructions with smaller \c RCALL instructions where possible. - * \note On some unpatched versions of binutils, this can cause link failures in some circumstances. If you - * receive a link error relocation truncated to fit: R_AVR_13_PCREL, disable this setting.
OBJDIRDirectory to place the generated object and dependency files. If set to "." the same folder as the source file will be used. - * \note When this option is enabled, all source filenames must be unique.
OBJECT_FILESList of additional object files that should be linked into the resulting binary.
- * - * \section SSec_BuildModule_BUILD_ProvidedVariables Module Provided Variables - * - * - * - * - * - *
None
- * - * \section SSec_BuildModule_BUILD_ProvidedMacros Module Provided Macros - * - * - * - * - * - *
None
- */ - -/** \page Page_BuildModule_CORE The CORE build module - * - * The core LUFA build system module, providing common build system help and information targets. - * - * To use this module in your application makefile, add the following code: - * \code - * include $(LUFA_PATH)/Build/lufa_core.mk - * \endcode - * - * \section SSec_BuildModule_CORE_Requirements Requirements - * This module has no requirements outside a standard *nix shell like environment; the sh - * shell, GNU make and *nix CoreUtils (echo, printf, etc.). - * - * \section SSec_BuildModule_CORE_Targets Targets - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - *
helpDisplay build system help and configuration information.
list_targetsList all available build targets from the build system.
list_modulesList all available build modules from the build system.
list_mandatoryList all mandatory parameters required by the included modules.
list_optionalList all optional parameters required by the included modules.
list_providedList all variables provided by the included modules.
list_macrosList all macros provided by the included modules.
- * - * \section SSec_BuildModule_CORE_MandatoryParams Mandatory Parameters - * - * - * - * - * - *
None
- * - * \section SSec_BuildModule_CORE_OptionalParams Optional Parameters - * - * - * - * - * - *
None
- * - * \section SSec_BuildModule_CORE_ProvidedVariables Module Provided Variables - * - * - * - * - * - *
None
- * - * \section SSec_BuildModule_CORE_ProvidedMacros Module Provided Macros - * - * - * - * - * - *
None
- */ - -/** \page Page_BuildModule_ATPROGRAM The ATPROGRAM build module - * - * The ATPROGRAM programming utility LUFA build system module, providing targets to reprogram an - * Atmel processor FLASH and EEPROM memories with a project's compiled binary output files. - * - * To use this module in your application makefile, add the following code: - * \code - * include $(LUFA_PATH)/Build/lufa_atprogram.mk - * \endcode - * - * \section SSec_BuildModule_ATPROGRAM_Requirements Requirements - * This module requires the atprogram.exe utility to be available in your system's PATH - * variable. The atprogram.exe utility is distributed in Atmel AVR Studio 5.x and Atmel Studio 6.x - * inside the application install folder's "\atbackend" subdirectory. - * - * \section SSec_BuildModule_ATPROGRAM_Targets Targets - * - * - * - * - * - * - * - * - * - * - *
atprogramProgram the device FLASH memory with the application's executable data.
atprogram-eeProgram the device EEPROM memory with the application's EEPROM data.
- * - * \section SSec_BuildModule_ATPROGRAM_MandatoryParams Mandatory Parameters - * - * - * - * - * - * - * - * - * - * - *
MCUName of the Atmel processor model (e.g. at90usb1287).
TARGETName of the application output file prefix (e.g. TestApplication).
- * - * \section SSec_BuildModule_ATPROGRAM_OptionalParams Optional Parameters - * - * - * - * - * - * - * - * - * - * - * - * - * - * - *
ATPROGRAM_PROGRAMMERName of the Atmel programmer or debugger tool to communicate with (e.g. jtagice3).
ATPROGRAM_INTERFACEName of the programming interface to use when programming the target (e.g. spi).
ATPROGRAM_PORTName of the communication port to use when when programming with a serially connected tool (e.g. COM2).
- * - * \section SSec_BuildModule_ATPROGRAM_ProvidedVariables Module Provided Variables - * - * - * - * - * - *
None
- * - * \section SSec_BuildModule_ATPROGRAM_ProvidedMacros Module Provided Macros - * - * - * - * - * - *
None
- */ - -/** \page Page_BuildModule_AVRDUDE The AVRDUDE build module - * - * The AVRDUDE programming utility LUFA build system module, providing targets to reprogram an - * Atmel processor FLASH and EEPROM memories with a project's compiled binary output files. - * - * To use this module in your application makefile, add the following code: - * \code - * include $(LUFA_PATH)/Build/lufa_avrdude.mk - * \endcode - * - * \section SSec_BuildModule_AVRDUDE_Requirements Requirements - * This module requires the avrdude utility to be available in your system's PATH - * variable. The avrdude utility is distributed in the old WinAVR project releases for - * Windows (http://winavr.sourceforge.net) or can be installed on *nix systems via the project's - * source code (https://savannah.nongnu.org/projects/avrdude) or through the package manager. - * - * \section SSec_BuildModule_AVRDUDE_Targets Targets - * - * - * - * - * - * - * - * - * - * - *
avrdudeProgram the device FLASH memory with the application's executable data.
avrdude-eeProgram the device EEPROM memory with the application's EEPROM data.
- * - * \section SSec_BuildModule_AVRDUDE_MandatoryParams Mandatory Parameters - * - * - * - * - * - * - * - * - * - * - *
MCUName of the Atmel processor model (e.g. at90usb1287).
TARGETName of the application output file prefix (e.g. TestApplication).
- * - * \section SSec_BuildModule_AVRDUDE_OptionalParams Optional Parameters - * - * - * - * - * - * - * - * - * - * - * - * - * - * - *
AVRDUDE_PROGRAMMERName of the programmer or debugger tool to communicate with (e.g. jtagicemkii).
AVRDUDE_PORTName of the communication port to use when when programming with the connected tool (e.g. COM2, /dev/ttyUSB0 or usb).
AVRDUDE_FLAGSAdditional flags to pass to avrdude when programming, applied after the automatically generated flags.
- * - * \section SSec_BuildModule_AVRDUDE_ProvidedVariables Module Provided Variables - * - * - * - * - * - *
None
- * - * \section SSec_BuildModule_AVRDUDE_ProvidedMacros Module Provided Macros - * - * - * - * - * - *
None
- */ - - /** \page Page_BuildModule_CPPCHECK The CPPCHECK build module - * - * The CPPCHECK programming utility LUFA build system module, providing targets to statically - * analyze C and C++ source code for errors and performance/style issues. - * - * To use this module in your application makefile, add the following code: - * \code - * include $(LUFA_PATH)/Build/lufa_cppcheck.mk - * \endcode - * - * \section SSec_BuildModule_CPPCHECK_Requirements Requirements - * This module requires the cppcheck utility to be available in your system's PATH - * variable. The cppcheck utility is distributed through the project's home page - * (http://cppcheck.sourceforge.net) for Windows, and can be installed on *nix systems via - * the project's source code or through the package manager. - * - * \section SSec_BuildModule_CPPCHECK_Targets Targets - * - * - * - * - * - * - * - * - * - * - *
cppcheckStatically analyze the project source code for issues.
cppcheck-configCheck the cppcheck configuration - scan source code and warn about missing header files and other issues.
- * - * \section SSec_BuildModule_CPPCHECK_MandatoryParams Mandatory Parameters - * - * - * - * - * - * - *
SRCList of source files to statically analyze.
- * - * \section SSec_BuildModule_CPPCHECK_OptionalParams Optional Parameters - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - *
CPPCHECK_INCLUDESPath of extra directories to check when attemting to resolve C/C++ header file includes.
CPPCHECK_EXCLUDESPaths or path fragments to exclude when analyzing.
CPPCHECK_MSG_TEMPLATEOutput message template to use when printing errors, warnings and information (see cppcheck documentation).
CPPCHECK_ENABLEAnalysis rule categories to enable (see cppcheck documentation).
CPPCHECK_SUPPRESSSpecific analysis rules to suppress (see cppcheck documentation).
CPPCHECK_FAIL_ON_WARNINGSet to Y to fail the analysis job with an error exit code if warnings are found, N to continue without failing.
CPPCHECK_QUIETSet to Y to suppress all output except warnings and errors, N to show verbose output information.
CPPCHECK_FLAGSExtra flags to pass to cppcheck, after the automatically generated flags.
- * - * \section SSec_BuildModule_CPPCHECK_ProvidedVariables Module Provided Variables - * - * - * - * - * - *
None
- * - * \section SSec_BuildModule_CPPCHECK_ProvidedMacros Module Provided Macros - * - * - * - * - * - *
None
- */ - - /** \page Page_BuildModule_DFU The DFU build module - * - * The DFU programming utility LUFA build system module, providing targets to reprogram an - * Atmel processor FLASH and EEPROM memories with a project's compiled binary output files. - * This module requires a DFU class bootloader to be running in the target, compatible with - * the DFU bootloader protocol as published by Atmel. - * - * To use this module in your application makefile, add the following code: - * \code - * include $(LUFA_PATH)/Build/lufa_dfu.mk - * \endcode - * - * \section SSec_BuildModule_DFU_Requirements Requirements - * This module requires either the batchisp utility from Atmel's FLIP utility, or the open - * source dfu-programmer utility (http://dfu-programmer.sourceforge.net/) to be - * available in your system's PATH variable. On *nix systems the dfu-programmer utility - * can be installed via the project's source code or through the package manager. - * - * \section SSec_BuildModule_DFU_Targets Targets - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - *
dfuProgram the device FLASH memory with the application's executable data using dfu-programmer.
dfu-eeProgram the device EEPROM memory with the application's EEPROM data using dfu-programmer.
flipProgram the device FLASH memory with the application's executable data using batchisp.
flip-eeProgram the device EEPROM memory with the application's EEPROM data using batchisp.
- * - * \section SSec_BuildModule_DFU_MandatoryParams Mandatory Parameters - * - * - * - * - * - * - * - * - * - * - *
MCUName of the Atmel processor model (e.g. at90usb1287).
TARGETName of the application output file prefix (e.g. TestApplication).
- * - * \section SSec_BuildModule_DFU_OptionalParams Optional Parameters - * - * - * - * - * - *
None
- * - * \section SSec_BuildModule_DFU_ProvidedVariables Module Provided Variables - * - * - * - * - * - *
None
- * - * \section SSec_BuildModule_DFU_ProvidedMacros Module Provided Macros - * - * - * - * - * - *
None
- */ - - /** \page Page_BuildModule_DOXYGEN The DOXYGEN build module - * - * The DOXYGEN code documentation utility LUFA build system module, providing targets to generate - * project HTML and other format documentation from a set of source files that include special - * Doxygen comments. - * - * To use this module in your application makefile, add the following code: - * \code - * include $(LUFA_PATH)/Build/lufa_doxygen.mk - * \endcode - * - * \section SSec_BuildModule_DOXYGEN_Requirements Requirements - * This module requires the doxygen utility from the Doxygen website - * (http://www.doxygen.org/) to be available in your system's PATH variable. On *nix - * systems the doxygen utility can be installed via the project's source code or through - * the package manager. - * - * \section SSec_BuildModule_DOXYGEN_Targets Targets - * - * - * - * - * - * - * - * - * - * - * - * - * - * - *
doxygenGenerate project documentation.
doxygen_createCreate a new Doxygen configuration file using the latest template.
doxygen_upgradeUpgrade an existing Doxygen configuration file to the latest template
- * - * \section SSec_BuildModule_DOXYGEN_MandatoryParams Mandatory Parameters - * - * - * - * - * - * - *
LUFA_PATHPath to the LUFA library core, either relative or absolute (e.g. ../LUFA-000000/LUFA/).
- * - * \section SSec_BuildModule_DOXYGEN_OptionalParams Optional Parameters - * - * - * - * - * - * - * - * - * - * - * - * - * - * - *
DOXYGEN_CONFName and path of the base Doxygen configuration file for the project.
DOXYGEN_FAIL_ON_WARNINGSet to Y to fail the generation with an error exit code if warnings are found other than unsupported configuration parameters, N to continue without failing.
DOXYGEN_OVERRIDE_PARAMSExtra Doxygen configuration parameters to apply, overriding the corresponding config entry in the project's configuration file (e.g. QUIET=YES).
- * - * \section SSec_BuildModule_DOXYGEN_ProvidedVariables Module Provided Variables - * - * - * - * - * - *
None
- * - * \section SSec_BuildModule_DOXYGEN_ProvidedMacros Module Provided Macros - * - * - * - * - * - *
None
- */ - - /** \page Page_BuildModule_HID The HID build module - * - * The HID programming utility LUFA build system module, providing targets to reprogram an - * Atmel processor's FLASH memory with a project's compiled binary output file. This module - * requires a HID class bootloader to be running in the target, using a protocol compatible - * with the PJRC "HalfKay" protocol (http://www.pjrc.com/teensy/halfkay_protocol.html). - * - * To use this module in your application makefile, add the following code: - * \code - * include $(LUFA_PATH)/Build/lufa_hid.mk - * \endcode - * - * \section SSec_BuildModule_HID_Requirements Requirements - * This module requires either the hid_bootloader_cli utility from the included LUFA HID - * class bootloader API subdirectory, or the teensy_loader_cli utility from PJRC - * (http://www.pjrc.com/teensy/loader_cli.html) to be available in your system's PATH - * variable. - * - * \section SSec_BuildModule_HID_Targets Targets - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - *
hidProgram the device FLASH memory with the application's executable data using hid_bootloader_cli.
hid-eeProgram the device EEPROM memory with the application's EEPROM data using hid_bootloader_cli and - * a temporary AVR application programmed into the target's FLASH. - * \note This will erase the currently loaded application in the target.
teensyProgram the device FLASH memory with the application's executable data using teensy_loader_cli.
teensy-eeProgram the device EEPROM memory with the application's EEPROM data using teensy_loader_cli and - * a temporary AVR application programmed into the target's FLASH. - * \note This will erase the currently loaded application in the target.
- * - * \section SSec_BuildModule_HID_MandatoryParams Mandatory Parameters - * - * - * - * - * - * - * - * - * - * - *
MCUName of the Atmel processor model (e.g. at90usb1287).
TARGETName of the application output file prefix (e.g. TestApplication).
- * - * \section SSec_BuildModule_HID_OptionalParams Optional Parameters - * - * - * - * - * - *
None
- * - * \section SSec_BuildModule_HID_ProvidedVariables Module Provided Variables - * - * - * - * - * - *
None
- * - * \section SSec_BuildModule_HID_ProvidedMacros Module Provided Macros - * - * - * - * - * - *
None
- */ - - /** \page Page_BuildModule_SOURCES The SOURCES build module - * - * The SOURCES LUFA build system module, providing variables listing the various LUFA source files - * required to be build by a project for a given LUFA module. This module gives a way to reference - * LUFA source files symbolically, so that changes to the library structure do not break the library - * makefile. - * - * To use this module in your application makefile, add the following code: - * \code - * include $(LUFA_PATH)/Build/lufa_sources.mk - * \endcode - * - * \section SSec_BuildModule_SOURCES_Requirements Requirements - * None. - * - * \section SSec_BuildModule_SOURCES_Targets Targets - * - * - * - * - * - *
None
- * - * \section SSec_BuildModule_SOURCES_MandatoryParams Mandatory Parameters - * - * - * - * - * - * - * - * - * - * - *
LUFA_PATHPath to the LUFA library core, either relative or absolute (e.g. ../LUFA-000000/LUFA/).
ARCHArchitecture of the target processor (see \ref Page_DeviceSupport).
- * - * \section SSec_BuildModule_SOURCES_OptionalParams Optional Parameters - * - * - * - * - * - *
None
- * - * \section SSec_BuildModule_SOURCES_ProvidedVariables Module Provided Variables - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - *
LUFA_SRC_USBList of LUFA USB driver source files.
LUFA_SRC_USBCLASSList of LUFA USB Class driver source files.
LUFA_SRC_TEMPERATUREList of LUFA temperature sensor driver source files.
LUFA_SRC_SERIALList of LUFA Serial U(S)ART driver source files.
LUFA_SRC_TWIList of LUFA TWI driver source files.
LUFA_SRC_PLATFORMList of LUFA architecture specific platform management source files.
- * - * \section SSec_BuildModule_SOURCES_ProvidedMacros Module Provided Macros - * - * - * - * - * - *
None
- */ - -/** \page Page_BuildTroubleshooting Troubleshooting Information - * - * LUFA uses a lot of advanced features of the AVR-GCC compiler, linker, and surrounding binaries. This can sometimes lead to problems compiling applications if one of these - * features is buggy in the version of the tools used in a build environment. Missing utilities and incorrectly set makefile configuration options can also result in different - * errors being produced when compilation or other operations are attempted. The table below lists a set of commonly encountered errors and their resolutions. - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - *
ProblemResolution
Error "relocation truncated to fit: R_AVR_13_PCREL against symbol {X}" shown when compiling.Try compiling with the setting LINKER_RELAXATIONS=N in your LUFA Build System 2.0 makefile, or remove the line -Wl,--relax - * from other makefiles. Alternatively, make sure you have the latest version of the Atmel Toolchain installed for your system.
Error "error: ld terminated with signal 11 [Segmentation fault]" shown when compiling.Try compiling with the setting DEBUG_LEVEL=2 in your LUFA Build System 2.0 makefile, or make sure you are using binutils version 2.22 or later.
Error "EMERGENCY ABORT: INFINITE RECURSION DETECTED" shown when compiling.Make sure you are using an up to date version of GNU Make when compiling. This error is a safety system added to the mid-level makefiles, to prevent an issue with - * GNU make or other variants of Make causing an infinitely recursive build.
Error "Unsupported architecture "{X}"" shown when compiling.Ensure your makefile's ARCH setting is set to one of the architecture names (case-sensitive) supported by the version of LUFA you are compiling against.
Error "Makefile {X} value not set" shown when compiling.The specified Makefile value was not configured in your project's makefile or on the command line, and the nominated setting is required by one or more LUFA - * build system modules. Define the value in your project makefile and try again.
Error "Makefile {X} option cannot be blank" shown when compiling.The specified Makefile value was configured in your project's makefile or on the command line, but was set to an empty value. For the nominated configuration - * option, an empty value is not allowed. Define the nominated setting to a correct non-blank value and try again.
Error "Makefile {X} option must be Y or N" shown when compiling.The specified Makefile value was configured in your project's makefile or on the command line, but was set to a value other than a Y (for "Yes") or "N" (for "No"). - * This configuration option is required to be one of the aforementioned boolean values, and other values are invalid. Set this option to either Y or N and try again.
Error "Unknown input source file formats: {X}" shown when compiling.The nominated source files, specified in your project's makefile in the SRC configuration option, has an extension that the LUFA build system does not - * recognise. The file extensions are case sensitive, and must be one of the supported formats (*.c, *.cpp or *.S).
Error "Cannot build with OBJDIR parameter set - one or more object file name is not unique" shown when compiling.When a project is built with a non-empty OBJDIR object directory name set, all input source files must have unique names, excluding extension and path. - * This means that input files that are named identically and differ only by their path or extension are invalid when this mode is used.
Error "Source file does not exist: {X}" shown when compiling.The nominated input source file, specified in the user project's SRC parameter, could not be found. Ensure the source file exists and the absolute or - * relative path given in the user project makefile is correct and try again.
Error "Doxygen configuration file {X} does not exist" shown when upgrading a Doxygen configuration file.The nominated Doxygen configuration file, specified in the user project's DOXYGEN_CONF parameter, could not be found. Ensure the configuration file exists - * and the absolute or relative path given in the user project makefile is correct and try again, or run the appropriate makefile target to generate a new configuration - * file.
Error "avr-gcc: error: unrecognized option '{X}'" shown when compiling.An unrecognised option was supplied to the compiler, usually in the C_FLAGS, CPP_FLAGS, ASM_FLAGS or CC_FLAGS configuration - * options. The nominated compiler switch may be invalid, or unsupported by the version of AVR-GCC on the host system. Remove the unrecognised flag if invalid, or - * upgrade to the latest AVR-GCC. If the option is a valid linker option, use the prefix "-Wl," to ensure it is passed to the linker correctly.
Error "makefile:{X}: {Y}.mk: No such file or directory" shown when make is invoked.The path to the nominated makefile module was incorrect. This usually indicates that the makefile LUFA_PATH option is not set to a valid relative or - * absolute path to the LUFA library core.
Error "fatal error: LUFAConfig.h: No such file or directory" shown when compiling.The USE_LUFA_CONFIG_HEADER compile time option was set in the user project makefile, but the user supplied LUFAConfig.h header could not be - * found. Ensure that the directory that contains this configuration file is correctly passed to the compiler via the -I switch in the makefile CC_FLAGS - * parameter.
Error "ld.exe: section .apitable_trampolines loaded at {X} overlaps section .text" shown when compiling a bootloader.The bootloader is compiling too large for the given FLASH_SIZE_KB and BOOT_SECTION_SIZE_KB parameters set in the bootloader makefile. This - * usually indicates that these values are incorrect for the specified device the bootloader is targeting. If these values are correct, a newer version of the - * compiler may need to be used to ensure that the bootloader is built within the section size constraints of the target device.
Error "unknown MCU '{X}' specified" shown when compiling.The specified microcontroller device model name set in the user application's makefile as the MCU parameter is incorrect, or unsupported by the - * version of the compiler being used. Make sure the model name is correct, or upgrade to the latest Atmel Toolchain to obtain newer device support.
Error "undefined reference to `{X}'" shown when compiling.This is usually caused by a missing source file in the user application's SRC configuration parameter. If the indicated symbol is one from the LUFA - * library, you may be missing a LUFA source makefile module (see \ref Page_BuildModule_SOURCES).
- * - * For troubleshooting other errors you encounter, please see \ref Sec_ProjectHelp. - */ +/** \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. + */ + +/** \page Page_BuildSystem The LUFA Build System + * + * \section Sec_BuildSystem_Overview Overview of the LUFA Build System + * The LUFA build system was originally an attempt at making a set of + * re-usable, modular build make files which could be referenced in a LUFA + * powered project, to minimize the amount of code required in an + * application makefile. + * + * As it turned out to be fairly generic in nature, it was split out into its + * own separate project, called DMBS (Dean's Makefile Build System) + * which is released into the public domain. LUFA-specific portions of the + * LUFA build system extend DMBS, and provide a universal build system for all + * LUFA projects. + * + * The latest DMBS project information and documentation can be found at: + * https://github.com/abcminiuser/dmbs + * + * DMBS is written in GNU Make, and each module is independent of one-another. + * + * LUFA now uses DMBS for its build system, with some LUFA specific extension + * modules. + * + * If you have problems building using LUFA, see \subpage Page_BuildTroubleshooting for resolution steps. + * + * \li \subpage Page_BuildModule_LUFA_SOURCES - The LUFA SOURCES extension module for DMBS + * \li \subpage Page_BuildModule_LUFA_GCC - The LUFA GCC extension module for DMBS + */ + +/** \page Page_BuildModule_LUFA_SOURCES LUFA SOURCES extension module for DMBS + * + * The LUFA SOURCES extension more for DMBS provides LUFA specific variables + * listing the various LUFA source files required to be build by a project for + * a given LUFA module. This module gives a way to reference LUFA source files + * symbolically, so that changes to the library structure do not break the + * library makefile. + * + * To use this module in your application makefile, add the following code: + * \code + * include $(LUFA_PATH)/Build/LUFA/lufa-sources.mk + * \endcode + * + * \section SSec_BuildModule_LUFA_SOURCES_Requirements Requirements + * None. + * + * \section SSec_BuildModule_LUFA_SOURCES_Targets Targets + * + * + * + * + * + *
None
+ * + * \section SSec_BuildModule_LUFA_SOURCES_MandatoryParams Mandatory Parameters + * + * + * + * + * + * + * + * + * + * + *
LUFA_PATHPath to the LUFA library core, either relative or absolute (e.g. ../LUFA-000000/LUFA/).
ARCHArchitecture of the target processor (see \ref Page_DeviceSupport).
+ * + * \section SSec_BuildModule_LUFA_SOURCES_OptionalParams Optional Parameters + * + * + * + * + * + *
None
+ * + * \section SSec_BuildModule_LUFA_SOURCES_ProvidedVariables Module Provided Variables + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
LUFA_SRC_USBList of LUFA USB driver source files.
LUFA_SRC_USBCLASSList of LUFA USB Class driver source files.
LUFA_SRC_TEMPERATUREList of LUFA temperature sensor driver source files.
LUFA_SRC_SERIALList of LUFA Serial U(S)ART driver source files.
LUFA_SRC_TWIList of LUFA TWI driver source files.
LUFA_SRC_PLATFORMList of LUFA architecture specific platform management source files.
+ * + * \section SSec_BuildModule_LUFA_SOURCES_ProvidedMacros Module Provided Macros + * + * + * + * + * + *
None
+ */ + +/** \page Page_BuildModule_LUFA_GCC LUFA GCC extension module for DMBS + * + * The LUFA GCC extension module for the standard DMBS GCC module extends the + * latter to support the compilation of LUFA powered projects. It should be + * imported into your LUFA powered project makefiles to ensure that the correct + * build settings are used for the project's configuration. + * + * To use this module in your application makefile, add the following code: + * \code + * include $(LUFA_PATH)/Build/LUFA/lufa-gcc.mk + * \endcode + * + * \section SSec_BuildModule_LUFA_GCC_Requirements Requirements + * This module should be included in your makefile *after* the DMBS GCC module. + * + * \section SSec_BuildModule_LUFA_GCC_Targets Targets + * + * + * + * + * + *
None
+ * + * \section SSec_BuildModule_LUFA_GCC_MandatoryParams Mandatory Parameters + * + * + * + * + * + * + *
LUFA_PATHPath to the LUFA library core, either relative or absolute (e.g. ../LUFA-000000/LUFA/).
+ * + * \section SSec_BuildModule_LUFA_GCC_OptionalParams Optional Parameters + * + * + * + * + * + * + *
BOARDLUFA board hardware drivers to use (see \ref Page_DeviceSupport).
+ * + * \section SSec_BuildModule_LUFA_GCC_ProvidedVariables Module Provided Variables + * + * + * + * + * + *
None
+ * + * \section SSec_BuildModule_LUFA_GCC_ProvidedMacros Module Provided Macros + * + * + * + * + * + *
None
+ */ + +/** \page Page_BuildTroubleshooting Troubleshooting Information + * + * LUFA uses a lot of advanced features of the AVR-GCC compiler, linker, and + * surrounding binaries. This can sometimes lead to problems compiling + * applications if one of these features is buggy in the version of the tools + * used in a build environment. Missing utilities and incorrectly set makefile + * configuration options can also result in different errors being produced + * when compilation or other operations are attempted. The table below lists a + * set of commonly encountered errors and their resolutions. + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
ProblemResolution
Error "relocation truncated to fit: R_AVR_13_PCREL against symbol {X}" shown when compiling.Try compiling with the setting LINKER_RELAXATIONS=N in your LUFA Build System 2.0 makefile, or remove the line -Wl,--relax + * from other makefiles. Alternatively, make sure you have the latest version of the Atmel Toolchain installed for your system.
Error "error: ld terminated with signal 11 [Segmentation fault]" shown when compiling.Try compiling with the setting DEBUG_LEVEL=2 in your LUFA Build System 2.0 makefile, or make sure you are using binutils version 2.22 or later.
Error "EMERGENCY ABORT: INFINITE RECURSION DETECTED" shown when compiling.Make sure you are using an up to date version of GNU Make when compiling. This error is a safety system added to the mid-level makefiles, to prevent an issue with + * GNU make or other variants of Make causing an infinitely recursive build.
Error "Unsupported architecture "{X}"" shown when compiling.Ensure your makefile's ARCH setting is set to one of the architecture names (case-sensitive) supported by the version of LUFA you are compiling against.
Error "Makefile {X} value not set" shown when compiling.The specified Makefile value was not configured in your project's makefile or on the command line, and the nominated setting is required by one or more LUFA + * build system modules. Define the value in your project makefile and try again.
Error "Makefile {X} option cannot be blank" shown when compiling.The specified Makefile value was configured in your project's makefile or on the command line, but was set to an empty value. For the nominated configuration + * option, an empty value is not allowed. Define the nominated setting to a correct non-blank value and try again.
Error "Makefile {X} option must be Y or N" shown when compiling.The specified Makefile value was configured in your project's makefile or on the command line, but was set to a value other than a Y (for "Yes") or "N" (for "No"). + * This configuration option is required to be one of the aforementioned boolean values, and other values are invalid. Set this option to either Y or N and try again.
Error "Unknown input source file formats: {X}" shown when compiling.The nominated source files, specified in your project's makefile in the SRC configuration option, has an extension that the LUFA build system does not + * recognise. The file extensions are case sensitive, and must be one of the supported formats (*.c, *.cpp or *.S).
Error "Cannot build with OBJDIR parameter set - one or more object file name is not unique" shown when compiling.When a project is built with a non-empty OBJDIR object directory name set, all input source files must have unique names, excluding extension and path. + * This means that input files that are named identically and differ only by their path or extension are invalid when this mode is used.
Error "Source file does not exist: {X}" shown when compiling.The nominated input source file, specified in the user project's SRC parameter, could not be found. Ensure the source file exists and the absolute or + * relative path given in the user project makefile is correct and try again.
Error "Doxygen configuration file {X} does not exist" shown when upgrading a Doxygen configuration file.The nominated Doxygen configuration file, specified in the user project's DOXYGEN_CONF parameter, could not be found. Ensure the configuration file exists + * and the absolute or relative path given in the user project makefile is correct and try again, or run the appropriate makefile target to generate a new configuration + * file.
Error "avr-gcc: error: unrecognized option '{X}'" shown when compiling.An unrecognised option was supplied to the compiler, usually in the C_FLAGS, CPP_FLAGS, ASM_FLAGS or CC_FLAGS configuration + * options. The nominated compiler switch may be invalid, or unsupported by the version of AVR-GCC on the host system. Remove the unrecognised flag if invalid, or + * upgrade to the latest AVR-GCC. If the option is a valid linker option, use the prefix "-Wl," to ensure it is passed to the linker correctly.
Error "makefile:{X}: {Y}.mk: No such file or directory" shown when make is invoked.The path to the nominated makefile module was incorrect. This usually indicates that the makefile LUFA_PATH option is not set to a valid relative or + * absolute path to the LUFA library core.
Error "fatal error: LUFAConfig.h: No such file or directory" shown when compiling.The USE_LUFA_CONFIG_HEADER compile time option was set in the user project makefile, but the user supplied LUFAConfig.h header could not be + * found. Ensure that the directory that contains this configuration file is correctly passed to the compiler via the -I switch in the makefile CC_FLAGS + * parameter.
Error "ld.exe: section .apitable_trampolines loaded at {X} overlaps section .text" shown when compiling a bootloader.The bootloader is compiling too large for the given FLASH_SIZE_KB and BOOT_SECTION_SIZE_KB parameters set in the bootloader makefile. This + * usually indicates that these values are incorrect for the specified device the bootloader is targeting. If these values are correct, a newer version of the + * compiler may need to be used to ensure that the bootloader is built within the section size constraints of the target device.
Error "unknown MCU '{X}' specified" shown when compiling.The specified microcontroller device model name set in the user application's makefile as the MCU parameter is incorrect, or unsupported by the + * version of the compiler being used. Make sure the model name is correct, or upgrade to the latest Atmel Toolchain to obtain newer device support.
Error "undefined reference to `{X}'" shown when compiling.This is usually caused by a missing source file in the user application's SRC configuration parameter. If the indicated symbol is one from the LUFA + * library, you may be missing a LUFA source makefile module (see \ref Page_BuildModule_LUFA_SOURCES).
+ * + * For troubleshooting other errors you encounter, please see \ref Sec_ProjectHelp. + */ diff --git a/Firmware/LUFA/DoxygenPages/ChangeLog.txt b/Firmware/LUFA/DoxygenPages/ChangeLog.txt index 482c886..aedfd3c 100644 --- a/Firmware/LUFA/DoxygenPages/ChangeLog.txt +++ b/Firmware/LUFA/DoxygenPages/ChangeLog.txt @@ -5,6 +5,62 @@ */ /** \page Page_ChangeLog Project Changelog + * + * \section Sec_ChangeLog170418 Version 170418 + * New: + * - Core: + * - Added support for the Pololu A-Star Micro board (thanks to Joh Schneider) + * - Added new \c LUFA_VERSION_RELEASE_TYPE macro to the library version header, to determine release type (thanks to NicoHood) + * + * Fixed: + * - Core: + * - The CALLBACK_USB_GetDescriptor() callback function into the user application erroneously had a uint8_t type for the wIndex + * parameter, instead of uint16_t (thanks to Matlo) + * - Fixed broken USE_RAM_DESCRIPTORS compile time option when the FIXED_NUM_CONFIGURATIONS compile time option is not enabled + * in a user application (thanks to Matlo) + * - Fixed missing \c va_end() calls in the HID bootloader CLI app which could cause portability issues + * - Fixed void pointer arithmetic in the \c Serial_SendData() functions for AVR8 and XMEGA architectures + * - Fixed void pointer arithmetic in the low level and class driver RNDIS demo protocol decoders + * - Fixed low level RNDIS demo incorrectly setting the RNDIS state when a null packet filter was requested + * - Fixed missing entries in several project's Atmel Studio integration files, such as driver INF files + * - Fixed invalid endpoint indexes causing memory corruption in device Clear/Set Feature standard requests (thanks to Peter Popovec) + * - Fixed incorrect serialization in USB_SetHIDReportItemInfo() function (thanks to e-chip) + * + * Changed: + * - Added signed alternative libUSB driver for the AVRISP-MKII clone project, to support Atmel Studio 7 (thanks to Atmel) + * - Removed no longer required LIBUSB_DRIVER_COMPAT and RESET_TOGGLES_LIBUSB_COMPAT configuration options from the AVRISP-MKII + * clone project, as the new libUSB driver works for AVRDUDE and Atmel Studio 7 under Windows + * - Replaced the LUFA build system with its (compatible) successor, DMBS (Dean's Makefile Build System) + * - Removed obsolete library TAR export and associated documentation + * - Fixed incorrect HID_DESCRIPTOR_KEYBOARD() macro definition (thanks to Eric Tang) + * + * \section Sec_ChangeLog151115 Version 151115 + * New: + * - Added support for the Atmel Xplained-MINI series of development kits + * - Added new PROGMEM variant send functions to the CDC class device driver (thanks to Stefan Hellermann) + * - Added new PROGMEM variant send functions to the CDC class host driver + * - Added additional Arduino Uno board definitions for the main processor reset (thanks to NicoHood) + * - Added modified DocBook transforms to generate Atmel Studio 6/7 internal help documentation (thanks to Morten Engelhardt Olsen) + * + * Changed: + * - Core: + * - The TWI peripheral driver's TWI_WritePacket() and TWI_ReadPacket() functions now takes a 16-bit Length rather than an 8-bit + * length, for longer transfers + * - Library Applications: + * - The CDC, DFU, Mass Storage and Printer class bootloaders will no longer run the user application if the application reset + * vector is blank (thanks to Alex Kazik) + * - The CDC, DFU and Printer class bootloaders are now compatible with the original Atmel XPLAIN and Arduino Leonardo boards + * - The CDC, DFU, Mass Storage and Printer class bootloaders are not compatible with devices with the BOOTRST fuse set and will + * exit automatically unless an external reset was the last reset cause (thanks to Alex Kazik) + * - Added missing force-inline attribute to the endianness utility functions (thanks to Stefan Hellermann) + * - Updated the DFU build system module to use updated EEPROM programming command arguments for dfu-programmer 0.6.2 or newer + * + * Fixed: + * - Fixed broken XMEGA serial stream driver due to missing USART base pointer parameter (thanks to William Patterson) + * - Fixed incorrect signature reported in the CDC/DFU bootloaders for the AT90USB82 (thanks to NicoHood) + * - Fixed broken RNDIS demos on Linux machines whose DHCP hosts require a Lease Time option (thanks to Stefan Hellermann) + * - Fixed broken LEDs_Disable() implementation for the Arduino Uno board (thanks to NicoHood) + * - Fixed missing bounds checks and off-by-one in the DFU bootloader signature bytes (thanks to Reuti) * * \section Sec_ChangeLog140928 Version 140928 * New: diff --git a/Firmware/LUFA/DoxygenPages/CompileTimeTokens.txt b/Firmware/LUFA/DoxygenPages/CompileTimeTokens.txt index ab075cf..92adf0d 100644 --- a/Firmware/LUFA/DoxygenPages/CompileTimeTokens.txt +++ b/Firmware/LUFA/DoxygenPages/CompileTimeTokens.txt @@ -113,8 +113,8 @@ * On the smaller USB AVRs, the USB controller lacks VBUS events to determine the physical connection state of the USB bus to a host. In lieu of * VBUS events, the library attempts to determine the connection state via the bus suspension and wake up events instead. This however may be * slightly inaccurate due to the possibility of the host suspending the bus while the device is still connected. If accurate connection status is - * required, the VBUS line of the USB connector should be routed to an AVR pin to detect its level, so that the USB_DeviceState global - * can be accurately set and the \ref EVENT_USB_Device_Connect() and \ref EVENT_USB_Device_Disconnect() events manually raised by the RAISE_EVENT macro. + * required, the VBUS line of the USB connector should be routed to an AVR pin to detect its level, so that the \ref USB_DeviceState global + * can be accurately set and the \ref EVENT_USB_Device_Connect() and \ref EVENT_USB_Device_Disconnect() events manually raised by the user application. * When defined, this token disables the library's auto-detection of the connection state by the aforementioned suspension and wake up events. * * \li NO_SOF_EVENTS - (\ref Group_Events) - All Architectures \n diff --git a/Firmware/LUFA/DoxygenPages/DevelopingWithLUFA.txt b/Firmware/LUFA/DoxygenPages/DevelopingWithLUFA.txt index 9a02f95..31b58fa 100644 --- a/Firmware/LUFA/DoxygenPages/DevelopingWithLUFA.txt +++ b/Firmware/LUFA/DoxygenPages/DevelopingWithLUFA.txt @@ -17,7 +17,6 @@ * \li \subpage Page_VIDPID - Allocated USB VID and PID Values * \li \subpage Page_OSDrivers - Operating System Driver Information * \li \subpage Page_BuildLibrary - Building as a Linkable Library - * \li \subpage Page_ExportingLibrary - Exporting LUFA for IDE Use * \li \subpage Page_WritingBoardDrivers - How to Write Custom Board Drivers * \li \subpage Page_SoftwareBootloaderStart - How to jump to the bootloader in software */ diff --git a/Firmware/LUFA/DoxygenPages/DeviceSupport.txt b/Firmware/LUFA/DoxygenPages/DeviceSupport.txt index 2a4b9c3..cff2cda 100644 --- a/Firmware/LUFA/DoxygenPages/DeviceSupport.txt +++ b/Firmware/LUFA/DoxygenPages/DeviceSupport.txt @@ -92,6 +92,7 @@ * - STK525 * - STK526 * - XPLAIN (Original green board, not the newer blue XPLAINED family boards) + * - Xplained-MINI * * \section Sec_AVR8Support_ThirdParty Supported Third Party Boards * Currently supported third-party boards (see \ref Group_BoardTypes for makefile \c BOARD constant names): @@ -117,6 +118,7 @@ * - Olimex AVR-ISP-MK2 * - Paranoid Studio's US2AX (V1, V2 and V3 hardware revisions) * - PJRC Teensy (1.x and 2.x versions) + * - Pololu A-Star Micro * - Rikus' U2S * - Sparkfun U2 Breakout Board * - Stange ISP Programmer Board diff --git a/Firmware/LUFA/DoxygenPages/Donating.txt b/Firmware/LUFA/DoxygenPages/Donating.txt index 4a4b6aa..68228ac 100644 --- a/Firmware/LUFA/DoxygenPages/Donating.txt +++ b/Firmware/LUFA/DoxygenPages/Donating.txt @@ -9,10 +9,9 @@ * * \image html Images/Author.jpg "Dean Camera, LUFA Developer" * - * I am a 24 year old Atmel Applications Engineer, living in Trondheim, Norway and working on LUFA in my spare time. - * The development and support of this library requires much effort from myself, as I am the sole developer, maintainer - * and supporter. Please consider donating a small amount to support this and my future Open Source projects - All - * donations are greatly appreciated. + * I am a software developer working on LUFA in my spare time. The development and support of this library requires + * much effort from myself, as I am the sole developer, maintainer and supporter. Please consider donating a small + * amount to support this and my future Open Source projects - All donations are greatly appreciated. * * Note that commercial entities can remove the attribution portion of the LUFA license by a one-time fee - see * \ref Page_LicenseInfo for more details (Note: Please do NOT pay this in advance through the donation link below - diff --git a/Firmware/LUFA/DoxygenPages/KnownIssues.txt b/Firmware/LUFA/DoxygenPages/KnownIssues.txt index 7018fec..183036c 100644 --- a/Firmware/LUFA/DoxygenPages/KnownIssues.txt +++ b/Firmware/LUFA/DoxygenPages/KnownIssues.txt @@ -9,6 +9,70 @@ * issues in the library. Most of these issues should be corrected in the future release - see * \ref Page_FutureChanges for a list of planned changes in future releases. * + * \section Sec_KnownIssues170418 Version 170418 + * - AVR8 Architecture + * - No known issues. + * - UC3 Architecture + * \warning The UC3 device support is currently experimental (incomplete and/or non-functional), and is included for preview purposes only. \n + * + * - No demos, bootloaders or projects have been ported for the UC3 devices in the current release, + * although the architecture is supported in the LUFA core library. + * - DMA transfers to and from the USB controller are not yet implemented for this release. + * - The UC3C, UC3D and UC3L sub-families of UC3 are not currently supported by the library due to their + * altered USB controller design. + * - The various \c *_CreateStream() functions for creating standard \c compatible virtual file + * streams are not available on the UC3 architecture, due to a lack of suitable library support. + * - XMEGA Architecture + * \warning The XMEGA device support is currently experimental (incomplete and/or non-functional), and is included for preview purposes only. + * + * - Endpoints of more than 64 bytes are not currently supported in this release. + * - Isochronous endpoints are not currently supported in this release. As a result, the audio class + * cannot be used on XMEGA devices. + * - Multiple-bank endpoints are not currently supported in this release. + * - Early silicon revisions of the ATXMEGA128A1U are incompatible with LUFA, due to their various errata + * relating to the USB controller. + * - Architecture Independent + * - The LUFA library is not watchdog aware, and thus timeouts are possible if short periods are used + * and a lengthy USB operation is initiated. + * - No LUFA provided driver INF files for Windows are signed, and thus may fail to install on systems where driver signing is enforced (e.g. Windows 8/10). + * - Build System + * - No known issues. + * - Atmel Studio Integration + * - Not all devices are listed in the "Supported Parts" screen when selecting a device. To select an alternative device, change the "Show Device" drop-down to "All Parts". + * - When switching boards after changing the device selection, a second conflicting \c BOARD symbol definition can be created that prevents successful compilation. To fix, open the project properties window (Project->Project {name} Properties... menu item), click the "Toolchain" tab, click "Symbols" under the "AVR/GNU C Compiler" section and remove the incorrect definition. + * + * \section Sec_KnownIssues151115 Version 151115 + * - AVR8 Architecture + * - No known issues. + * - UC3 Architecture + * \warning The UC3 device support is currently experimental (incomplete and/or non-functional), and is included for preview purposes only. \n + * + * - No demos, bootloaders or projects have been ported for the UC3 devices in the current release, + * although the architecture is supported in the LUFA core library. + * - DMA transfers to and from the USB controller are not yet implemented for this release. + * - The UC3C, UC3D and UC3L sub-families of UC3 are not currently supported by the library due to their + * altered USB controller design. + * - The various \c *_CreateStream() functions for creating standard \c compatible virtual file + * streams are not available on the UC3 architecture, due to a lack of suitable library support. + * - XMEGA Architecture + * \warning The XMEGA device support is currently experimental (incomplete and/or non-functional), and is included for preview purposes only. + * + * - Endpoints of more than 64 bytes are not currently supported in this release. + * - Isochronous endpoints are not currently supported in this release. As a result, the audio class + * cannot be used on XMEGA devices. + * - Multiple-bank endpoints are not currently supported in this release. + * - Early silicon revisions of the ATXMEGA128A1U are incompatible with LUFA, due to their various errata + * relating to the USB controller. + * - Architecture Independent + * - The LUFA library is not watchdog aware, and thus timeouts are possible if short periods are used + * and a lengthy USB operation is initiated. + * - No LUFA provided driver INF files for Windows are signed, and thus may fail to install on systems where driver signing is enforced (e.g. Windows 8). + * - Build System + * - No known issues. + * - Atmel Studio Integration + * - Not all devices are listed in the "Supported Parts" screen when selecting a device. To select an alternative device, change the "Show Device" drop-down to "All Parts". + * - When switching boards after changing the device selection, a second conflicting \c BOARD symbol definition can be created that prevents successful compilation. To fix, open the project properties window (Project->Project {name} Properties... menu item), click the "Toolchain" tab, click "Symbols" under the "AVR/GNU C Compiler" section and remove the incorrect definition. + * * \section Sec_KnownIssues140928 Version 140928 * - AVR8 Architecture * - No known issues. diff --git a/Firmware/LUFA/DoxygenPages/LUFAPoweredProjects.txt b/Firmware/LUFA/DoxygenPages/LUFAPoweredProjects.txt index b1816d0..fa94add 100644 --- a/Firmware/LUFA/DoxygenPages/LUFAPoweredProjects.txt +++ b/Firmware/LUFA/DoxygenPages/LUFAPoweredProjects.txt @@ -76,6 +76,7 @@ * \li Gumbi, a Python library and USB GPIO controller: https://code.google.com/p/gumbi/ * \li Hardware Volume Control: https://github.com/davidk/hw-volume-control * \li Hiduino, a USB-MIDI replacement firmware for the Arduino Uno: http://code.google.com/p/hiduino/ + * \li HoodLoader2, an Arduino Uno enhanced USB AVR coprocessor firmware: https://github.com/NicoHood/HoodLoader2 * \li IBM capacitive keybord replacement controller: http://downloads.cornall.co/ibm-capsense-usb-web/ibm-capsense-usb.html * \li Ikea RGB LED USB modification: http://slashhome.se/p/projects/id/ikea_dioder_usb/#project * \li IR electricity meter monitor: http://sourceforge.net/projects/irmetermon/ @@ -168,6 +169,7 @@ * \li BitFury, a Bitcoin ASIC miner: https://github.com/aauer1/LUFA-BitFury/tree/master/Projects/BitfuryBTC * \li Ceberus, a MadCatz Xbox 360 arcade stick modifier: http://www.phreakmods.com/products/cerberus * \li CFFA3000, a CompactFlash interface for the Apple II: http://www.dreher.net/CFforAppleII + * \li ChameleonMini, a RFID monitoring tool: https://github.com/emsec/ChameleonMini/wiki * \li Digital Survey Instruments Magnetometer and Pointer: http://www.digitalsurveyinstruments.com/ * \li FinchRobot, a robot designed for educational use: http://www.finchrobot.com/ * \li Flysight, a GPS logger for wingsuit pilots: http://flysight.ca/ diff --git a/Firmware/LUFA/DoxygenPages/MigrationInformation.txt b/Firmware/LUFA/DoxygenPages/MigrationInformation.txt index bc47d14..7efb312 100644 --- a/Firmware/LUFA/DoxygenPages/MigrationInformation.txt +++ b/Firmware/LUFA/DoxygenPages/MigrationInformation.txt @@ -10,6 +10,15 @@ * to the next version released. It does not indicate all new additions to the library in each version change, only * areas relevant to making older projects compatible with the API changes of each new release. * + * \section Sec_Migration170418 Version 170418 + * Device Mode + * - The \c CALLBACK_USB_GetDescriptor() callback function into the user application's \c wIndex parameter is now \c uint16_t, not \c uint8_t. + * + * \section Sec_Migration151115 Migrating from 140928 to 151115 + * Non-USB Library Components + * - The ATPROGRAM LUFA build system module now defaults to the Atmel ICE debugger tool, instead of the Atmel JTAG ICE3. + * - The \c Serial_CreateStream() and \c Serial_CreateBlockingStream() functions now require a USART base pointer for XMEGA devices as the first parameter. + * * \section Sec_Migration140928 Migrating from 140302 to 140928 * Device Mode * - The device mode RNDIS class driver now requires a user-supplied buffer and buffer length to operate, rather diff --git a/Firmware/LUFA/DoxygenPages/ProgrammingApps.txt b/Firmware/LUFA/DoxygenPages/ProgrammingApps.txt index 4759ac8..653b4ad 100644 --- a/Firmware/LUFA/DoxygenPages/ProgrammingApps.txt +++ b/Firmware/LUFA/DoxygenPages/ProgrammingApps.txt @@ -24,7 +24,4 @@ * If you wish to use the DFU bootloader to program in your application, refer to your DFU programmer's documentation. * Atmel provides a free utility called FLIP which is USB AVR compatible, and an open source (Linux compatible) * alternative exists called "dfu-programmer". - * - * \see \ref Page_BuildModule_DFU for information on the LUFA build system DFU module, for automatic DFU bootloader - * programming makefile targets. */ diff --git a/Firmware/LUFA/DoxygenPages/SoftwareBootloaderJump.txt b/Firmware/LUFA/DoxygenPages/SoftwareBootloaderJump.txt index 0b69612..f8c2523 100644 --- a/Firmware/LUFA/DoxygenPages/SoftwareBootloaderJump.txt +++ b/Firmware/LUFA/DoxygenPages/SoftwareBootloaderJump.txt @@ -31,7 +31,7 @@ * * uint32_t Boot_Key ATTR_NO_INIT; * - * #define MAGIC_BOOT_KEY 0xDC42ACCA + * #define MAGIC_BOOT_KEY 0xBADCAFE5 * #define BOOTLOADER_START_ADDRESS ((FLASH_SIZE_BYTES - BOOTLOADER_SEC_SIZE_BYTES) >> 1) * * void Bootloader_Jump_Check(void) ATTR_INIT_SECTION(3); diff --git a/Firmware/LUFA/Drivers/Board/AVR8/ADAFRUITU4/Board.h b/Firmware/LUFA/Drivers/Board/AVR8/ADAFRUITU4/Board.h index 48016e0..a640ddc 100644 --- a/Firmware/LUFA/Drivers/Board/AVR8/ADAFRUITU4/Board.h +++ b/Firmware/LUFA/Drivers/Board/AVR8/ADAFRUITU4/Board.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/AVR8/ADAFRUITU4/LEDs.h b/Firmware/LUFA/Drivers/Board/AVR8/ADAFRUITU4/LEDs.h index 9f31220..be7180c 100644 --- a/Firmware/LUFA/Drivers/Board/AVR8/ADAFRUITU4/LEDs.h +++ b/Firmware/LUFA/Drivers/Board/AVR8/ADAFRUITU4/LEDs.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/AVR8/ATAVRUSBRF01/Board.h b/Firmware/LUFA/Drivers/Board/AVR8/ATAVRUSBRF01/Board.h index 07000ec..11e6e0e 100644 --- a/Firmware/LUFA/Drivers/Board/AVR8/ATAVRUSBRF01/Board.h +++ b/Firmware/LUFA/Drivers/Board/AVR8/ATAVRUSBRF01/Board.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/AVR8/ATAVRUSBRF01/Buttons.h b/Firmware/LUFA/Drivers/Board/AVR8/ATAVRUSBRF01/Buttons.h index 8b815db..7d5a48b 100644 --- a/Firmware/LUFA/Drivers/Board/AVR8/ATAVRUSBRF01/Buttons.h +++ b/Firmware/LUFA/Drivers/Board/AVR8/ATAVRUSBRF01/Buttons.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/AVR8/ATAVRUSBRF01/LEDs.h b/Firmware/LUFA/Drivers/Board/AVR8/ATAVRUSBRF01/LEDs.h index 76e89fd..cd7bff7 100644 --- a/Firmware/LUFA/Drivers/Board/AVR8/ATAVRUSBRF01/LEDs.h +++ b/Firmware/LUFA/Drivers/Board/AVR8/ATAVRUSBRF01/LEDs.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/AVR8/BENITO/Board.h b/Firmware/LUFA/Drivers/Board/AVR8/BENITO/Board.h index 5584e1e..9f5b291 100644 --- a/Firmware/LUFA/Drivers/Board/AVR8/BENITO/Board.h +++ b/Firmware/LUFA/Drivers/Board/AVR8/BENITO/Board.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/AVR8/BENITO/Buttons.h b/Firmware/LUFA/Drivers/Board/AVR8/BENITO/Buttons.h index 96d14a3..5e9128e 100644 --- a/Firmware/LUFA/Drivers/Board/AVR8/BENITO/Buttons.h +++ b/Firmware/LUFA/Drivers/Board/AVR8/BENITO/Buttons.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/AVR8/BENITO/LEDs.h b/Firmware/LUFA/Drivers/Board/AVR8/BENITO/LEDs.h index 49df441..f968d7c 100644 --- a/Firmware/LUFA/Drivers/Board/AVR8/BENITO/LEDs.h +++ b/Firmware/LUFA/Drivers/Board/AVR8/BENITO/LEDs.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/AVR8/BIGMULTIO/Board.h b/Firmware/LUFA/Drivers/Board/AVR8/BIGMULTIO/Board.h index 9d4e301..02ebe09 100644 --- a/Firmware/LUFA/Drivers/Board/AVR8/BIGMULTIO/Board.h +++ b/Firmware/LUFA/Drivers/Board/AVR8/BIGMULTIO/Board.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/AVR8/BIGMULTIO/LEDs.h b/Firmware/LUFA/Drivers/Board/AVR8/BIGMULTIO/LEDs.h index 93d5bec..93048f5 100644 --- a/Firmware/LUFA/Drivers/Board/AVR8/BIGMULTIO/LEDs.h +++ b/Firmware/LUFA/Drivers/Board/AVR8/BIGMULTIO/LEDs.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/AVR8/BLACKCAT/Board.h b/Firmware/LUFA/Drivers/Board/AVR8/BLACKCAT/Board.h index 6eec7bf..a9aef6e 100644 --- a/Firmware/LUFA/Drivers/Board/AVR8/BLACKCAT/Board.h +++ b/Firmware/LUFA/Drivers/Board/AVR8/BLACKCAT/Board.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/AVR8/BLACKCAT/LEDs.h b/Firmware/LUFA/Drivers/Board/AVR8/BLACKCAT/LEDs.h index 4a72039..5a7c4f2 100644 --- a/Firmware/LUFA/Drivers/Board/AVR8/BLACKCAT/LEDs.h +++ b/Firmware/LUFA/Drivers/Board/AVR8/BLACKCAT/LEDs.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/AVR8/BUI/Board.h b/Firmware/LUFA/Drivers/Board/AVR8/BUI/Board.h index 067e870..87102b6 100644 --- a/Firmware/LUFA/Drivers/Board/AVR8/BUI/Board.h +++ b/Firmware/LUFA/Drivers/Board/AVR8/BUI/Board.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/AVR8/BUI/LEDs.h b/Firmware/LUFA/Drivers/Board/AVR8/BUI/LEDs.h index e06edb5..d982bcd 100644 --- a/Firmware/LUFA/Drivers/Board/AVR8/BUI/LEDs.h +++ b/Firmware/LUFA/Drivers/Board/AVR8/BUI/LEDs.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/AVR8/BUMBLEB/Board.h b/Firmware/LUFA/Drivers/Board/AVR8/BUMBLEB/Board.h index 906f0b5..5af60ab 100644 --- a/Firmware/LUFA/Drivers/Board/AVR8/BUMBLEB/Board.h +++ b/Firmware/LUFA/Drivers/Board/AVR8/BUMBLEB/Board.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/AVR8/BUMBLEB/Buttons.h b/Firmware/LUFA/Drivers/Board/AVR8/BUMBLEB/Buttons.h index 0495425..812cf79 100644 --- a/Firmware/LUFA/Drivers/Board/AVR8/BUMBLEB/Buttons.h +++ b/Firmware/LUFA/Drivers/Board/AVR8/BUMBLEB/Buttons.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/AVR8/BUMBLEB/Joystick.h b/Firmware/LUFA/Drivers/Board/AVR8/BUMBLEB/Joystick.h index 82d085e..259c674 100644 --- a/Firmware/LUFA/Drivers/Board/AVR8/BUMBLEB/Joystick.h +++ b/Firmware/LUFA/Drivers/Board/AVR8/BUMBLEB/Joystick.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/AVR8/BUMBLEB/LEDs.h b/Firmware/LUFA/Drivers/Board/AVR8/BUMBLEB/LEDs.h index 5cd7b48..bb070db 100644 --- a/Firmware/LUFA/Drivers/Board/AVR8/BUMBLEB/LEDs.h +++ b/Firmware/LUFA/Drivers/Board/AVR8/BUMBLEB/LEDs.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/AVR8/CULV3/Board.h b/Firmware/LUFA/Drivers/Board/AVR8/CULV3/Board.h index 777902d..88679d1 100644 --- a/Firmware/LUFA/Drivers/Board/AVR8/CULV3/Board.h +++ b/Firmware/LUFA/Drivers/Board/AVR8/CULV3/Board.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/AVR8/CULV3/Buttons.h b/Firmware/LUFA/Drivers/Board/AVR8/CULV3/Buttons.h index 6a26a99..21b6e1c 100644 --- a/Firmware/LUFA/Drivers/Board/AVR8/CULV3/Buttons.h +++ b/Firmware/LUFA/Drivers/Board/AVR8/CULV3/Buttons.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/AVR8/CULV3/LEDs.h b/Firmware/LUFA/Drivers/Board/AVR8/CULV3/LEDs.h index 3d2b8fd..da3ebf8 100644 --- a/Firmware/LUFA/Drivers/Board/AVR8/CULV3/LEDs.h +++ b/Firmware/LUFA/Drivers/Board/AVR8/CULV3/LEDs.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/AVR8/DUCE/Board.h b/Firmware/LUFA/Drivers/Board/AVR8/DUCE/Board.h index 44cf691..8521ec9 100644 --- a/Firmware/LUFA/Drivers/Board/AVR8/DUCE/Board.h +++ b/Firmware/LUFA/Drivers/Board/AVR8/DUCE/Board.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/AVR8/DUCE/LEDs.h b/Firmware/LUFA/Drivers/Board/AVR8/DUCE/LEDs.h index 83caded..ad866b9 100644 --- a/Firmware/LUFA/Drivers/Board/AVR8/DUCE/LEDs.h +++ b/Firmware/LUFA/Drivers/Board/AVR8/DUCE/LEDs.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/AVR8/EVK527/Board.h b/Firmware/LUFA/Drivers/Board/AVR8/EVK527/Board.h index c77c18b..01b6b93 100644 --- a/Firmware/LUFA/Drivers/Board/AVR8/EVK527/Board.h +++ b/Firmware/LUFA/Drivers/Board/AVR8/EVK527/Board.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/AVR8/EVK527/Buttons.h b/Firmware/LUFA/Drivers/Board/AVR8/EVK527/Buttons.h index 239880c..3094fbe 100644 --- a/Firmware/LUFA/Drivers/Board/AVR8/EVK527/Buttons.h +++ b/Firmware/LUFA/Drivers/Board/AVR8/EVK527/Buttons.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/AVR8/EVK527/Dataflash.h b/Firmware/LUFA/Drivers/Board/AVR8/EVK527/Dataflash.h index 38b2b58..2ec973e 100644 --- a/Firmware/LUFA/Drivers/Board/AVR8/EVK527/Dataflash.h +++ b/Firmware/LUFA/Drivers/Board/AVR8/EVK527/Dataflash.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/AVR8/EVK527/Joystick.h b/Firmware/LUFA/Drivers/Board/AVR8/EVK527/Joystick.h index 492c706..909fa02 100644 --- a/Firmware/LUFA/Drivers/Board/AVR8/EVK527/Joystick.h +++ b/Firmware/LUFA/Drivers/Board/AVR8/EVK527/Joystick.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/AVR8/EVK527/LEDs.h b/Firmware/LUFA/Drivers/Board/AVR8/EVK527/LEDs.h index 84e689a..a10b822 100644 --- a/Firmware/LUFA/Drivers/Board/AVR8/EVK527/LEDs.h +++ b/Firmware/LUFA/Drivers/Board/AVR8/EVK527/LEDs.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/AVR8/JMDBU2/Board.h b/Firmware/LUFA/Drivers/Board/AVR8/JMDBU2/Board.h index 0f1aca0..0e46a57 100644 --- a/Firmware/LUFA/Drivers/Board/AVR8/JMDBU2/Board.h +++ b/Firmware/LUFA/Drivers/Board/AVR8/JMDBU2/Board.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/AVR8/JMDBU2/Buttons.h b/Firmware/LUFA/Drivers/Board/AVR8/JMDBU2/Buttons.h index 8050099..8da45e4 100644 --- a/Firmware/LUFA/Drivers/Board/AVR8/JMDBU2/Buttons.h +++ b/Firmware/LUFA/Drivers/Board/AVR8/JMDBU2/Buttons.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/AVR8/JMDBU2/LEDs.h b/Firmware/LUFA/Drivers/Board/AVR8/JMDBU2/LEDs.h index 562103e..bd2c191 100644 --- a/Firmware/LUFA/Drivers/Board/AVR8/JMDBU2/LEDs.h +++ b/Firmware/LUFA/Drivers/Board/AVR8/JMDBU2/LEDs.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/AVR8/LEONARDO/Board.h b/Firmware/LUFA/Drivers/Board/AVR8/LEONARDO/Board.h index 95ef437..400bb11 100644 --- a/Firmware/LUFA/Drivers/Board/AVR8/LEONARDO/Board.h +++ b/Firmware/LUFA/Drivers/Board/AVR8/LEONARDO/Board.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/AVR8/LEONARDO/LEDs.h b/Firmware/LUFA/Drivers/Board/AVR8/LEONARDO/LEDs.h index ea7d41c..6f26cc1 100644 --- a/Firmware/LUFA/Drivers/Board/AVR8/LEONARDO/LEDs.h +++ b/Firmware/LUFA/Drivers/Board/AVR8/LEONARDO/LEDs.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/AVR8/MAXIMUS/Board.h b/Firmware/LUFA/Drivers/Board/AVR8/MAXIMUS/Board.h index 929e60a..7de7501 100644 --- a/Firmware/LUFA/Drivers/Board/AVR8/MAXIMUS/Board.h +++ b/Firmware/LUFA/Drivers/Board/AVR8/MAXIMUS/Board.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/AVR8/MAXIMUS/LEDs.h b/Firmware/LUFA/Drivers/Board/AVR8/MAXIMUS/LEDs.h index 695949a..aba85ab 100644 --- a/Firmware/LUFA/Drivers/Board/AVR8/MAXIMUS/LEDs.h +++ b/Firmware/LUFA/Drivers/Board/AVR8/MAXIMUS/LEDs.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/AVR8/MICRO/Board.h b/Firmware/LUFA/Drivers/Board/AVR8/MICRO/Board.h index 622bfc8..279dc3a 100644 --- a/Firmware/LUFA/Drivers/Board/AVR8/MICRO/Board.h +++ b/Firmware/LUFA/Drivers/Board/AVR8/MICRO/Board.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/AVR8/MICRO/LEDs.h b/Firmware/LUFA/Drivers/Board/AVR8/MICRO/LEDs.h index c3e471d..445e1a3 100644 --- a/Firmware/LUFA/Drivers/Board/AVR8/MICRO/LEDs.h +++ b/Firmware/LUFA/Drivers/Board/AVR8/MICRO/LEDs.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/AVR8/MICROPENDOUS/Board.h b/Firmware/LUFA/Drivers/Board/AVR8/MICROPENDOUS/Board.h index b84bf79..1ae3d6f 100644 --- a/Firmware/LUFA/Drivers/Board/AVR8/MICROPENDOUS/Board.h +++ b/Firmware/LUFA/Drivers/Board/AVR8/MICROPENDOUS/Board.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/AVR8/MICROPENDOUS/Buttons.h b/Firmware/LUFA/Drivers/Board/AVR8/MICROPENDOUS/Buttons.h index 8adff2d..c40ac1f 100644 --- a/Firmware/LUFA/Drivers/Board/AVR8/MICROPENDOUS/Buttons.h +++ b/Firmware/LUFA/Drivers/Board/AVR8/MICROPENDOUS/Buttons.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/AVR8/MICROPENDOUS/LEDs.h b/Firmware/LUFA/Drivers/Board/AVR8/MICROPENDOUS/LEDs.h index 253ad31..2ab89eb 100644 --- a/Firmware/LUFA/Drivers/Board/AVR8/MICROPENDOUS/LEDs.h +++ b/Firmware/LUFA/Drivers/Board/AVR8/MICROPENDOUS/LEDs.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/AVR8/MICROSIN162/Board.h b/Firmware/LUFA/Drivers/Board/AVR8/MICROSIN162/Board.h index 3ffb028..1e503c3 100644 --- a/Firmware/LUFA/Drivers/Board/AVR8/MICROSIN162/Board.h +++ b/Firmware/LUFA/Drivers/Board/AVR8/MICROSIN162/Board.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/AVR8/MICROSIN162/Buttons.h b/Firmware/LUFA/Drivers/Board/AVR8/MICROSIN162/Buttons.h index 68344fe..1c90fab 100644 --- a/Firmware/LUFA/Drivers/Board/AVR8/MICROSIN162/Buttons.h +++ b/Firmware/LUFA/Drivers/Board/AVR8/MICROSIN162/Buttons.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/AVR8/MICROSIN162/LEDs.h b/Firmware/LUFA/Drivers/Board/AVR8/MICROSIN162/LEDs.h index 51d1b3e..690ce7d 100644 --- a/Firmware/LUFA/Drivers/Board/AVR8/MICROSIN162/LEDs.h +++ b/Firmware/LUFA/Drivers/Board/AVR8/MICROSIN162/LEDs.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/AVR8/MINIMUS/Board.h b/Firmware/LUFA/Drivers/Board/AVR8/MINIMUS/Board.h index 80b8b3c..53bc2da 100644 --- a/Firmware/LUFA/Drivers/Board/AVR8/MINIMUS/Board.h +++ b/Firmware/LUFA/Drivers/Board/AVR8/MINIMUS/Board.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/AVR8/MINIMUS/Buttons.h b/Firmware/LUFA/Drivers/Board/AVR8/MINIMUS/Buttons.h index ec94445..f83924c 100644 --- a/Firmware/LUFA/Drivers/Board/AVR8/MINIMUS/Buttons.h +++ b/Firmware/LUFA/Drivers/Board/AVR8/MINIMUS/Buttons.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/AVR8/MINIMUS/LEDs.h b/Firmware/LUFA/Drivers/Board/AVR8/MINIMUS/LEDs.h index adc3468..5569323 100644 --- a/Firmware/LUFA/Drivers/Board/AVR8/MINIMUS/LEDs.h +++ b/Firmware/LUFA/Drivers/Board/AVR8/MINIMUS/LEDs.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/AVR8/MULTIO/Board.h b/Firmware/LUFA/Drivers/Board/AVR8/MULTIO/Board.h index 84f3d87..d701dc3 100644 --- a/Firmware/LUFA/Drivers/Board/AVR8/MULTIO/Board.h +++ b/Firmware/LUFA/Drivers/Board/AVR8/MULTIO/Board.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/AVR8/MULTIO/LEDs.h b/Firmware/LUFA/Drivers/Board/AVR8/MULTIO/LEDs.h index ca6d440..9d3bf6a 100644 --- a/Firmware/LUFA/Drivers/Board/AVR8/MULTIO/LEDs.h +++ b/Firmware/LUFA/Drivers/Board/AVR8/MULTIO/LEDs.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/AVR8/OLIMEX162/Board.h b/Firmware/LUFA/Drivers/Board/AVR8/OLIMEX162/Board.h index b9bcf77..64c6577 100644 --- a/Firmware/LUFA/Drivers/Board/AVR8/OLIMEX162/Board.h +++ b/Firmware/LUFA/Drivers/Board/AVR8/OLIMEX162/Board.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/AVR8/OLIMEX162/Buttons.h b/Firmware/LUFA/Drivers/Board/AVR8/OLIMEX162/Buttons.h index 3714c5e..f8ed871 100644 --- a/Firmware/LUFA/Drivers/Board/AVR8/OLIMEX162/Buttons.h +++ b/Firmware/LUFA/Drivers/Board/AVR8/OLIMEX162/Buttons.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/AVR8/OLIMEX162/LEDs.h b/Firmware/LUFA/Drivers/Board/AVR8/OLIMEX162/LEDs.h index 5ecc1f5..52d82ef 100644 --- a/Firmware/LUFA/Drivers/Board/AVR8/OLIMEX162/LEDs.h +++ b/Firmware/LUFA/Drivers/Board/AVR8/OLIMEX162/LEDs.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/AVR8/OLIMEX32U4/Board.h b/Firmware/LUFA/Drivers/Board/AVR8/OLIMEX32U4/Board.h index 657b15c..f063b9f 100644 --- a/Firmware/LUFA/Drivers/Board/AVR8/OLIMEX32U4/Board.h +++ b/Firmware/LUFA/Drivers/Board/AVR8/OLIMEX32U4/Board.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/AVR8/OLIMEX32U4/Buttons.h b/Firmware/LUFA/Drivers/Board/AVR8/OLIMEX32U4/Buttons.h index 8e33fd9..fecc637 100644 --- a/Firmware/LUFA/Drivers/Board/AVR8/OLIMEX32U4/Buttons.h +++ b/Firmware/LUFA/Drivers/Board/AVR8/OLIMEX32U4/Buttons.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/AVR8/OLIMEX32U4/LEDs.h b/Firmware/LUFA/Drivers/Board/AVR8/OLIMEX32U4/LEDs.h index 259859c..51eeace 100644 --- a/Firmware/LUFA/Drivers/Board/AVR8/OLIMEX32U4/LEDs.h +++ b/Firmware/LUFA/Drivers/Board/AVR8/OLIMEX32U4/LEDs.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/AVR8/OLIMEXISPMK2/Board.h b/Firmware/LUFA/Drivers/Board/AVR8/OLIMEXISPMK2/Board.h index d318a82..52129fb 100644 --- a/Firmware/LUFA/Drivers/Board/AVR8/OLIMEXISPMK2/Board.h +++ b/Firmware/LUFA/Drivers/Board/AVR8/OLIMEXISPMK2/Board.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/AVR8/OLIMEXISPMK2/Buttons.h b/Firmware/LUFA/Drivers/Board/AVR8/OLIMEXISPMK2/Buttons.h index aff10b1..3240dda 100644 --- a/Firmware/LUFA/Drivers/Board/AVR8/OLIMEXISPMK2/Buttons.h +++ b/Firmware/LUFA/Drivers/Board/AVR8/OLIMEXISPMK2/Buttons.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/AVR8/OLIMEXISPMK2/LEDs.h b/Firmware/LUFA/Drivers/Board/AVR8/OLIMEXISPMK2/LEDs.h index 033fca0..6bf924d 100644 --- a/Firmware/LUFA/Drivers/Board/AVR8/OLIMEXISPMK2/LEDs.h +++ b/Firmware/LUFA/Drivers/Board/AVR8/OLIMEXISPMK2/LEDs.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/AVR8/OLIMEXT32U4/Board.h b/Firmware/LUFA/Drivers/Board/AVR8/OLIMEXT32U4/Board.h index 690fee1..9b0b28c 100644 --- a/Firmware/LUFA/Drivers/Board/AVR8/OLIMEXT32U4/Board.h +++ b/Firmware/LUFA/Drivers/Board/AVR8/OLIMEXT32U4/Board.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/AVR8/OLIMEXT32U4/Buttons.h b/Firmware/LUFA/Drivers/Board/AVR8/OLIMEXT32U4/Buttons.h index 634eda9..5db1c59 100644 --- a/Firmware/LUFA/Drivers/Board/AVR8/OLIMEXT32U4/Buttons.h +++ b/Firmware/LUFA/Drivers/Board/AVR8/OLIMEXT32U4/Buttons.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/AVR8/OLIMEXT32U4/LEDs.h b/Firmware/LUFA/Drivers/Board/AVR8/OLIMEXT32U4/LEDs.h index 2bbaf68..96cf3ed 100644 --- a/Firmware/LUFA/Drivers/Board/AVR8/OLIMEXT32U4/LEDs.h +++ b/Firmware/LUFA/Drivers/Board/AVR8/OLIMEXT32U4/LEDs.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/AVR8/POLOLUMICRO/Board.h b/Firmware/LUFA/Drivers/Board/AVR8/POLOLUMICRO/Board.h new file mode 100644 index 0000000..bf68e39 --- /dev/null +++ b/Firmware/LUFA/Drivers/Board/AVR8/POLOLUMICRO/Board.h @@ -0,0 +1,79 @@ +/* + LUFA Library + Copyright (C) Dean Camera, 2017. + + dean [at] fourwalledcubicle [dot] com + www.lufa-lib.org +*/ + +/* + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) + + Permission to use, copy, modify, distribute, and sell this + software and its documentation for any purpose is hereby granted + without fee, provided that the above copyright notice appear in + all copies and that both that the copyright notice and this + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the + software without specific, written prior permission. + + The author disclaims all warranties with regard to this + software, including all implied warranties of merchantability + and fitness. In no event shall the author be liable for any + special, indirect or consequential damages or any damages + whatsoever resulting from loss of use, data or profits, whether + in an action of contract, negligence or other tortious action, + arising out of or in connection with the use or performance of + this software. +*/ + +/** \file + * \brief Board specific information header for the "Pololu A-Star Micro" board. + * \copydetails Group_BoardInfo_POLOLUMICRO + * + * \note This file should not be included directly. It is automatically included as needed by the Board driver + * dispatch header located in LUFA/Drivers/Board/Board.h. + */ + +/** \ingroup Group_BoardInfo + * \defgroup Group_BoardInfo_POLOLUMICRO POLOLUMICRO + * \brief Board specific information header for the "Pololu A-Star Micro" board. + * + * Board specific information header: + * https://www.pololu.com/docs/0J61 -> https://www.pololu.com/docs/0J61/3.1 + * + * @{ + */ + +#ifndef __BOARD_POLOLUMICRO_H__ +#define __BOARD_POLOLUMICRO_H__ + + /* Includes: */ + #include "../../../../Common/Common.h" + #include "../../LEDs.h" + + /* Enable C linkage for C++ Compilers: */ + #if defined(__cplusplus) + extern "C" { + #endif + + /* Preprocessor Checks: */ + #if !defined(__INCLUDE_FROM_BOARD_H) + #error Do not include this file directly. Include LUFA/Drivers/Board/Board.h instead. + #endif + + /* Public Interface - May be used in end-application: */ + /* Macros: */ + /** Indicates the board has hardware LEDs mounted. */ + #define BOARD_HAS_LEDS + + /* Disable C linkage for C++ Compilers: */ + #if defined(__cplusplus) + } + #endif + +#endif + +/** @} */ + diff --git a/Firmware/LUFA/Drivers/Board/AVR8/POLOLUMICRO/LEDs.h b/Firmware/LUFA/Drivers/Board/AVR8/POLOLUMICRO/LEDs.h new file mode 100644 index 0000000..454a9e2 --- /dev/null +++ b/Firmware/LUFA/Drivers/Board/AVR8/POLOLUMICRO/LEDs.h @@ -0,0 +1,154 @@ +/* + LUFA Library + Copyright (C) Dean Camera, 2017. + + dean [at] fourwalledcubicle [dot] com + www.lufa-lib.org +*/ + +/* + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) + + Permission to use, copy, modify, distribute, and sell this + software and its documentation for any purpose is hereby granted + without fee, provided that the above copyright notice appear in + all copies and that both that the copyright notice and this + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the + software without specific, written prior permission. + + The author disclaims all warranties with regard to this + software, including all implied warranties of merchantability + and fitness. In no event shall the author be liable for any + special, indirect or consequential damages or any damages + whatsoever resulting from loss of use, data or profits, whether + in an action of contract, negligence or other tortious action, + arising out of or in connection with the use or performance of + this software. +*/ + +/** \file + * \brief Board specific LED driver header for the Pololu A-Star Micro board. + * \copydetails Group_LEDs_MICRO + * + * \note This file should not be included directly. It is automatically included as needed by the LEDs driver + * dispatch header located in LUFA/Drivers/Board/LEDs.h. + */ + +/** \ingroup Group_LEDs + * \defgroup Group_LEDs_MICRO MICRO + * \brief Board specific LED driver header for the Pololu A-Star Micro board. + * + * Board specific LED driver header for the Pololu A-Star Micro board https://www.pololu.com/docs/0J61/3.1 + * + * + * + * + * + *
NameColorInfoActive LevelPort Pin
LEDS_LED1YellowGeneral IndicatorHighPORTC.7
LEDS_LED2GreenBootloader, USB-activityLowPORTD.5
+ * + * @{ + */ + +#ifndef __LEDS_MICRO_H__ +#define __LEDS_MICRO_H__ + + /* Includes: */ + #include "../../../../Common/Common.h" + + /* Enable C linkage for C++ Compilers: */ + #if defined(__cplusplus) + extern "C" { + #endif + + /* Preprocessor Checks: */ + #if !defined(__INCLUDE_FROM_LEDS_H) + #error Do not include this file directly. Include LUFA/Drivers/Board/LEDS.h instead. + #endif + + /* Private Interface - For use in library only: */ + #if !defined(__DOXYGEN__) + /* Macros: */ + #define LEDS_PORTC_LEDS (LEDS_LED1) + #define LEDS_PORTD_LEDS (LEDS_LED2) + #endif + + /* Public Interface - May be used in end-application: */ + /* Macros: */ + /** LED mask for the first LED on the board. */ + #define LEDS_LED1 (1 << 7) + + /** LED mask for the second LED on the board. */ + #define LEDS_LED2 (1 << 5) + + /** LED mask for all the LEDs on the board. */ + #define LEDS_ALL_LEDS (LEDS_LED1 | LEDS_LED2) + + /** LED mask for none of the board LEDs. */ + #define LEDS_NO_LEDS 0 + + /* Inline Functions: */ + #if !defined(__DOXYGEN__) + static inline void LEDs_Init(void) + { + DDRD |= LEDS_PORTD_LEDS; + PORTD &= ~LEDS_PORTD_LEDS; + DDRC |= LEDS_PORTC_LEDS; + PORTC &= ~LEDS_PORTC_LEDS; + } + + static inline void LEDs_Disable(void) + { + DDRD &= ~LEDS_PORTD_LEDS; + PORTD &= ~LEDS_PORTD_LEDS; + DDRC &= ~LEDS_PORTC_LEDS; + PORTC &= ~LEDS_PORTC_LEDS; + } + + static inline void LEDs_TurnOnLEDs(const uint8_t LEDMask) + { + PORTD |= (LEDMask & LEDS_PORTD_LEDS); + PORTC |= (LEDMask & LEDS_PORTC_LEDS); + } + + static inline void LEDs_TurnOffLEDs(const uint8_t LEDMask) + { + PORTD &= ~(LEDMask & LEDS_PORTD_LEDS); + PORTC &= ~(LEDMask & LEDS_PORTC_LEDS); + } + + static inline void LEDs_SetAllLEDs(const uint8_t LEDMask) + { + PORTD = ((PORTD & ~LEDS_PORTD_LEDS) | (LEDMask & LEDS_PORTD_LEDS)); + PORTC = ((PORTC & ~LEDS_PORTC_LEDS) | (LEDMask & LEDS_PORTC_LEDS)); + } + + static inline void LEDs_ChangeLEDs(const uint8_t LEDMask, + const uint8_t ActiveMask) + { + PORTD = ((PORTD & ~(LEDMask & LEDS_PORTD_LEDS)) | (ActiveMask & LEDS_PORTD_LEDS)); + PORTC = ((PORTC & ~(LEDMask & LEDS_PORTC_LEDS)) | (ActiveMask & LEDS_PORTC_LEDS)); + } + + static inline void LEDs_ToggleLEDs(const uint8_t LEDMask) + { + PORTD ^= (LEDMask & LEDS_PORTD_LEDS); + PORTC ^= (LEDMask & LEDS_PORTC_LEDS); + } + + static inline uint8_t LEDs_GetLEDs(void) ATTR_WARN_UNUSED_RESULT; + static inline uint8_t LEDs_GetLEDs(void) + { + return ((PORTD & LEDS_PORTD_LEDS) | (PORTC & LEDS_PORTC_LEDS)); + } + #endif + + /* Disable C linkage for C++ Compilers: */ + #if defined(__cplusplus) + } + #endif + +#endif + +/** @} */ diff --git a/Firmware/LUFA/Drivers/Board/AVR8/RZUSBSTICK/Board.h b/Firmware/LUFA/Drivers/Board/AVR8/RZUSBSTICK/Board.h index 6fc3666..83219b9 100644 --- a/Firmware/LUFA/Drivers/Board/AVR8/RZUSBSTICK/Board.h +++ b/Firmware/LUFA/Drivers/Board/AVR8/RZUSBSTICK/Board.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/AVR8/RZUSBSTICK/LEDs.h b/Firmware/LUFA/Drivers/Board/AVR8/RZUSBSTICK/LEDs.h index 6ebcdfc..25bdae1 100644 --- a/Firmware/LUFA/Drivers/Board/AVR8/RZUSBSTICK/LEDs.h +++ b/Firmware/LUFA/Drivers/Board/AVR8/RZUSBSTICK/LEDs.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/AVR8/SPARKFUN8U2/Board.h b/Firmware/LUFA/Drivers/Board/AVR8/SPARKFUN8U2/Board.h index 49cc2e5..7803ecd 100644 --- a/Firmware/LUFA/Drivers/Board/AVR8/SPARKFUN8U2/Board.h +++ b/Firmware/LUFA/Drivers/Board/AVR8/SPARKFUN8U2/Board.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/AVR8/SPARKFUN8U2/LEDs.h b/Firmware/LUFA/Drivers/Board/AVR8/SPARKFUN8U2/LEDs.h index b8eb4ab..70ca608 100644 --- a/Firmware/LUFA/Drivers/Board/AVR8/SPARKFUN8U2/LEDs.h +++ b/Firmware/LUFA/Drivers/Board/AVR8/SPARKFUN8U2/LEDs.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/AVR8/STANGE_ISP/Board.h b/Firmware/LUFA/Drivers/Board/AVR8/STANGE_ISP/Board.h index 36594fc..45472f1 100644 --- a/Firmware/LUFA/Drivers/Board/AVR8/STANGE_ISP/Board.h +++ b/Firmware/LUFA/Drivers/Board/AVR8/STANGE_ISP/Board.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/AVR8/STANGE_ISP/Buttons.h b/Firmware/LUFA/Drivers/Board/AVR8/STANGE_ISP/Buttons.h index d4576b6..2607622 100644 --- a/Firmware/LUFA/Drivers/Board/AVR8/STANGE_ISP/Buttons.h +++ b/Firmware/LUFA/Drivers/Board/AVR8/STANGE_ISP/Buttons.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/AVR8/STANGE_ISP/LEDs.h b/Firmware/LUFA/Drivers/Board/AVR8/STANGE_ISP/LEDs.h index 9f10683..97a7e37 100644 --- a/Firmware/LUFA/Drivers/Board/AVR8/STANGE_ISP/LEDs.h +++ b/Firmware/LUFA/Drivers/Board/AVR8/STANGE_ISP/LEDs.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/AVR8/STK525/Board.h b/Firmware/LUFA/Drivers/Board/AVR8/STK525/Board.h index bda925b..a6831a7 100644 --- a/Firmware/LUFA/Drivers/Board/AVR8/STK525/Board.h +++ b/Firmware/LUFA/Drivers/Board/AVR8/STK525/Board.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/AVR8/STK525/Buttons.h b/Firmware/LUFA/Drivers/Board/AVR8/STK525/Buttons.h index 532a46f..5770d07 100644 --- a/Firmware/LUFA/Drivers/Board/AVR8/STK525/Buttons.h +++ b/Firmware/LUFA/Drivers/Board/AVR8/STK525/Buttons.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/AVR8/STK525/Dataflash.h b/Firmware/LUFA/Drivers/Board/AVR8/STK525/Dataflash.h index 825a7a5..b0b2855 100644 --- a/Firmware/LUFA/Drivers/Board/AVR8/STK525/Dataflash.h +++ b/Firmware/LUFA/Drivers/Board/AVR8/STK525/Dataflash.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/AVR8/STK525/Joystick.h b/Firmware/LUFA/Drivers/Board/AVR8/STK525/Joystick.h index 6b9b4f4..0224a72 100644 --- a/Firmware/LUFA/Drivers/Board/AVR8/STK525/Joystick.h +++ b/Firmware/LUFA/Drivers/Board/AVR8/STK525/Joystick.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/AVR8/STK525/LEDs.h b/Firmware/LUFA/Drivers/Board/AVR8/STK525/LEDs.h index 53948b4..e413816 100644 --- a/Firmware/LUFA/Drivers/Board/AVR8/STK525/LEDs.h +++ b/Firmware/LUFA/Drivers/Board/AVR8/STK525/LEDs.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/AVR8/STK526/Board.h b/Firmware/LUFA/Drivers/Board/AVR8/STK526/Board.h index 6be146f..1c4ee85 100644 --- a/Firmware/LUFA/Drivers/Board/AVR8/STK526/Board.h +++ b/Firmware/LUFA/Drivers/Board/AVR8/STK526/Board.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/AVR8/STK526/Buttons.h b/Firmware/LUFA/Drivers/Board/AVR8/STK526/Buttons.h index bc598d3..168adaa 100644 --- a/Firmware/LUFA/Drivers/Board/AVR8/STK526/Buttons.h +++ b/Firmware/LUFA/Drivers/Board/AVR8/STK526/Buttons.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/AVR8/STK526/Dataflash.h b/Firmware/LUFA/Drivers/Board/AVR8/STK526/Dataflash.h index d2a59b1..82b311b 100644 --- a/Firmware/LUFA/Drivers/Board/AVR8/STK526/Dataflash.h +++ b/Firmware/LUFA/Drivers/Board/AVR8/STK526/Dataflash.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/AVR8/STK526/Joystick.h b/Firmware/LUFA/Drivers/Board/AVR8/STK526/Joystick.h index 7decabc..c7d816c 100644 --- a/Firmware/LUFA/Drivers/Board/AVR8/STK526/Joystick.h +++ b/Firmware/LUFA/Drivers/Board/AVR8/STK526/Joystick.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/AVR8/STK526/LEDs.h b/Firmware/LUFA/Drivers/Board/AVR8/STK526/LEDs.h index 71525e9..fc561e7 100644 --- a/Firmware/LUFA/Drivers/Board/AVR8/STK526/LEDs.h +++ b/Firmware/LUFA/Drivers/Board/AVR8/STK526/LEDs.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/AVR8/TEENSY/Board.h b/Firmware/LUFA/Drivers/Board/AVR8/TEENSY/Board.h index 52e4d61..15237b6 100644 --- a/Firmware/LUFA/Drivers/Board/AVR8/TEENSY/Board.h +++ b/Firmware/LUFA/Drivers/Board/AVR8/TEENSY/Board.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/AVR8/TEENSY/LEDs.h b/Firmware/LUFA/Drivers/Board/AVR8/TEENSY/LEDs.h index 9f87224..ed7fbf0 100644 --- a/Firmware/LUFA/Drivers/Board/AVR8/TEENSY/LEDs.h +++ b/Firmware/LUFA/Drivers/Board/AVR8/TEENSY/LEDs.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/AVR8/TUL/Board.h b/Firmware/LUFA/Drivers/Board/AVR8/TUL/Board.h index 7759c37..066e6c3 100644 --- a/Firmware/LUFA/Drivers/Board/AVR8/TUL/Board.h +++ b/Firmware/LUFA/Drivers/Board/AVR8/TUL/Board.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/AVR8/TUL/Buttons.h b/Firmware/LUFA/Drivers/Board/AVR8/TUL/Buttons.h index bbcca26..af6b2ae 100644 --- a/Firmware/LUFA/Drivers/Board/AVR8/TUL/Buttons.h +++ b/Firmware/LUFA/Drivers/Board/AVR8/TUL/Buttons.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/AVR8/TUL/LEDs.h b/Firmware/LUFA/Drivers/Board/AVR8/TUL/LEDs.h index 8a14b8a..9417b67 100644 --- a/Firmware/LUFA/Drivers/Board/AVR8/TUL/LEDs.h +++ b/Firmware/LUFA/Drivers/Board/AVR8/TUL/LEDs.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/AVR8/U2S/Board.h b/Firmware/LUFA/Drivers/Board/AVR8/U2S/Board.h index 128580a..6ea2380 100644 --- a/Firmware/LUFA/Drivers/Board/AVR8/U2S/Board.h +++ b/Firmware/LUFA/Drivers/Board/AVR8/U2S/Board.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/AVR8/U2S/Buttons.h b/Firmware/LUFA/Drivers/Board/AVR8/U2S/Buttons.h index 30f0a9f..ea5c1af 100644 --- a/Firmware/LUFA/Drivers/Board/AVR8/U2S/Buttons.h +++ b/Firmware/LUFA/Drivers/Board/AVR8/U2S/Buttons.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/AVR8/U2S/LEDs.h b/Firmware/LUFA/Drivers/Board/AVR8/U2S/LEDs.h index d7cf7cf..942fdc0 100644 --- a/Firmware/LUFA/Drivers/Board/AVR8/U2S/LEDs.h +++ b/Firmware/LUFA/Drivers/Board/AVR8/U2S/LEDs.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/AVR8/UDIP/Board.h b/Firmware/LUFA/Drivers/Board/AVR8/UDIP/Board.h index 3a40005..c8b6e77 100644 --- a/Firmware/LUFA/Drivers/Board/AVR8/UDIP/Board.h +++ b/Firmware/LUFA/Drivers/Board/AVR8/UDIP/Board.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/AVR8/UDIP/Buttons.h b/Firmware/LUFA/Drivers/Board/AVR8/UDIP/Buttons.h index dab29a6..f579b29 100644 --- a/Firmware/LUFA/Drivers/Board/AVR8/UDIP/Buttons.h +++ b/Firmware/LUFA/Drivers/Board/AVR8/UDIP/Buttons.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/AVR8/UDIP/LEDs.h b/Firmware/LUFA/Drivers/Board/AVR8/UDIP/LEDs.h index fbcc8ff..1bf8398 100644 --- a/Firmware/LUFA/Drivers/Board/AVR8/UDIP/LEDs.h +++ b/Firmware/LUFA/Drivers/Board/AVR8/UDIP/LEDs.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/AVR8/UNO/Board.h b/Firmware/LUFA/Drivers/Board/AVR8/UNO/Board.h index b23f8d0..9277a38 100644 --- a/Firmware/LUFA/Drivers/Board/AVR8/UNO/Board.h +++ b/Firmware/LUFA/Drivers/Board/AVR8/UNO/Board.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted @@ -67,6 +67,12 @@ /** Indicates the board has hardware LEDs mounted. */ #define BOARD_HAS_LEDS + /** Pin that can reset the main MCU. */ + #define AVR_RESET_LINE_PORT PORTD + #define AVR_RESET_LINE_DDR DDRD + #define AVR_RESET_LINE_PIN PIND + #define AVR_RESET_LINE_MASK (1 << PD7) + /* Disable C linkage for C++ Compilers: */ #if defined(__cplusplus) } diff --git a/Firmware/LUFA/Drivers/Board/AVR8/UNO/LEDs.h b/Firmware/LUFA/Drivers/Board/AVR8/UNO/LEDs.h index 006c3a5..17526f3 100644 --- a/Firmware/LUFA/Drivers/Board/AVR8/UNO/LEDs.h +++ b/Firmware/LUFA/Drivers/Board/AVR8/UNO/LEDs.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted @@ -44,8 +44,8 @@ * * * - * - * + * + * *
NameColorInfoActive LevelPort Pin
LEDS_LED1YellowRXLowPORTD.4
LEDS_LED2YellowTXLowPORTD.5
LEDS_LED1YellowRXLowPORTD.5
LEDS_LED2YellowTXLowPORTD.4
* * @{ @@ -70,10 +70,10 @@ /* Public Interface - May be used in end-application: */ /* Macros: */ /** LED mask for the first LED on the board. */ - #define LEDS_LED1 (1 << 4) + #define LEDS_LED1 (1 << 5) /** LED mask for the second LED on the board. */ - #define LEDS_LED2 (1 << 5) + #define LEDS_LED2 (1 << 4) /** LED mask for all the LEDs on the board. */ #define LEDS_ALL_LEDS (LEDS_LED1 | LEDS_LED2) @@ -81,6 +81,12 @@ /** LED mask for none of the board LEDs. */ #define LEDS_NO_LEDS 0 + /** LED mask for the library LED driver, to indicate TX activity. */ + #define LEDMASK_TX LEDS_LED1 + + /** LED mask for the library LED driver, to indicate RX activity. */ + #define LEDMASK_RX LEDS_LED2 + /* Inline Functions: */ #if !defined(__DOXYGEN__) static inline void LEDs_Init(void) @@ -92,7 +98,7 @@ static inline void LEDs_Disable(void) { DDRD &= ~LEDS_ALL_LEDS; - PORTD &= ~LEDS_ALL_LEDS; + PORTD |= LEDS_ALL_LEDS; } static inline void LEDs_TurnOnLEDs(const uint8_t LEDMask) diff --git a/Firmware/LUFA/Drivers/Board/AVR8/USB2AX/Board.h b/Firmware/LUFA/Drivers/Board/AVR8/USB2AX/Board.h index 05a4dea..c6fcd43 100644 --- a/Firmware/LUFA/Drivers/Board/AVR8/USB2AX/Board.h +++ b/Firmware/LUFA/Drivers/Board/AVR8/USB2AX/Board.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/AVR8/USB2AX/Buttons.h b/Firmware/LUFA/Drivers/Board/AVR8/USB2AX/Buttons.h index 170a9af..df6ef64 100644 --- a/Firmware/LUFA/Drivers/Board/AVR8/USB2AX/Buttons.h +++ b/Firmware/LUFA/Drivers/Board/AVR8/USB2AX/Buttons.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/AVR8/USB2AX/LEDs.h b/Firmware/LUFA/Drivers/Board/AVR8/USB2AX/LEDs.h index 03550fc..b4ed1ca 100644 --- a/Firmware/LUFA/Drivers/Board/AVR8/USB2AX/LEDs.h +++ b/Firmware/LUFA/Drivers/Board/AVR8/USB2AX/LEDs.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/AVR8/USBFOO/Board.h b/Firmware/LUFA/Drivers/Board/AVR8/USBFOO/Board.h index 15c41ab..fa01b5b 100644 --- a/Firmware/LUFA/Drivers/Board/AVR8/USBFOO/Board.h +++ b/Firmware/LUFA/Drivers/Board/AVR8/USBFOO/Board.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/AVR8/USBFOO/Buttons.h b/Firmware/LUFA/Drivers/Board/AVR8/USBFOO/Buttons.h index e901437..9c2476c 100644 --- a/Firmware/LUFA/Drivers/Board/AVR8/USBFOO/Buttons.h +++ b/Firmware/LUFA/Drivers/Board/AVR8/USBFOO/Buttons.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/AVR8/USBFOO/LEDs.h b/Firmware/LUFA/Drivers/Board/AVR8/USBFOO/LEDs.h index e396630..9c5b8bc 100644 --- a/Firmware/LUFA/Drivers/Board/AVR8/USBFOO/LEDs.h +++ b/Firmware/LUFA/Drivers/Board/AVR8/USBFOO/LEDs.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/AVR8/USBKEY/Board.h b/Firmware/LUFA/Drivers/Board/AVR8/USBKEY/Board.h index 3663056..920681d 100644 --- a/Firmware/LUFA/Drivers/Board/AVR8/USBKEY/Board.h +++ b/Firmware/LUFA/Drivers/Board/AVR8/USBKEY/Board.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/AVR8/USBKEY/Buttons.h b/Firmware/LUFA/Drivers/Board/AVR8/USBKEY/Buttons.h index 3ec7b3a..068fd0b 100644 --- a/Firmware/LUFA/Drivers/Board/AVR8/USBKEY/Buttons.h +++ b/Firmware/LUFA/Drivers/Board/AVR8/USBKEY/Buttons.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/AVR8/USBKEY/Dataflash.h b/Firmware/LUFA/Drivers/Board/AVR8/USBKEY/Dataflash.h index 85a8dda..77be220 100644 --- a/Firmware/LUFA/Drivers/Board/AVR8/USBKEY/Dataflash.h +++ b/Firmware/LUFA/Drivers/Board/AVR8/USBKEY/Dataflash.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/AVR8/USBKEY/Joystick.h b/Firmware/LUFA/Drivers/Board/AVR8/USBKEY/Joystick.h index 45d5a66..7410364 100644 --- a/Firmware/LUFA/Drivers/Board/AVR8/USBKEY/Joystick.h +++ b/Firmware/LUFA/Drivers/Board/AVR8/USBKEY/Joystick.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/AVR8/USBKEY/LEDs.h b/Firmware/LUFA/Drivers/Board/AVR8/USBKEY/LEDs.h index dc02da5..18ff756 100644 --- a/Firmware/LUFA/Drivers/Board/AVR8/USBKEY/LEDs.h +++ b/Firmware/LUFA/Drivers/Board/AVR8/USBKEY/LEDs.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/AVR8/USBTINYMKII/Board.h b/Firmware/LUFA/Drivers/Board/AVR8/USBTINYMKII/Board.h index 492aced..5501bf6 100644 --- a/Firmware/LUFA/Drivers/Board/AVR8/USBTINYMKII/Board.h +++ b/Firmware/LUFA/Drivers/Board/AVR8/USBTINYMKII/Board.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/AVR8/USBTINYMKII/Buttons.h b/Firmware/LUFA/Drivers/Board/AVR8/USBTINYMKII/Buttons.h index 682239c..e87f611 100644 --- a/Firmware/LUFA/Drivers/Board/AVR8/USBTINYMKII/Buttons.h +++ b/Firmware/LUFA/Drivers/Board/AVR8/USBTINYMKII/Buttons.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/AVR8/USBTINYMKII/LEDs.h b/Firmware/LUFA/Drivers/Board/AVR8/USBTINYMKII/LEDs.h index a2decbc..288f550 100644 --- a/Firmware/LUFA/Drivers/Board/AVR8/USBTINYMKII/LEDs.h +++ b/Firmware/LUFA/Drivers/Board/AVR8/USBTINYMKII/LEDs.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/AVR8/XPLAIN/Board.h b/Firmware/LUFA/Drivers/Board/AVR8/XPLAIN/Board.h index 57ad4c9..713e065 100644 --- a/Firmware/LUFA/Drivers/Board/AVR8/XPLAIN/Board.h +++ b/Firmware/LUFA/Drivers/Board/AVR8/XPLAIN/Board.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/AVR8/XPLAIN/Dataflash.h b/Firmware/LUFA/Drivers/Board/AVR8/XPLAIN/Dataflash.h index a8078f6..ed6a48c 100644 --- a/Firmware/LUFA/Drivers/Board/AVR8/XPLAIN/Dataflash.h +++ b/Firmware/LUFA/Drivers/Board/AVR8/XPLAIN/Dataflash.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/AVR8/XPLAIN/LEDs.h b/Firmware/LUFA/Drivers/Board/AVR8/XPLAIN/LEDs.h index 338b1b4..9da3fad 100644 --- a/Firmware/LUFA/Drivers/Board/AVR8/XPLAIN/LEDs.h +++ b/Firmware/LUFA/Drivers/Board/AVR8/XPLAIN/LEDs.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/AVR8/XPLAINED_MINI/Board.h b/Firmware/LUFA/Drivers/Board/AVR8/XPLAINED_MINI/Board.h new file mode 100644 index 0000000..2253e33 --- /dev/null +++ b/Firmware/LUFA/Drivers/Board/AVR8/XPLAINED_MINI/Board.h @@ -0,0 +1,78 @@ +/* + LUFA Library + Copyright (C) Dean Camera, 2017. + + dean [at] fourwalledcubicle [dot] com + www.lufa-lib.org +*/ + +/* + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) + + Permission to use, copy, modify, distribute, and sell this + software and its documentation for any purpose is hereby granted + without fee, provided that the above copyright notice appear in + all copies and that both that the copyright notice and this + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the + software without specific, written prior permission. + + The author disclaims all warranties with regard to this + software, including all implied warranties of merchantability + and fitness. In no event shall the author be liable for any + special, indirect or consequential damages or any damages + whatsoever resulting from loss of use, data or profits, whether + in an action of contract, negligence or other tortious action, + arising out of or in connection with the use or performance of + this software. +*/ + +/** \file + * \brief Board specific information header for the Atmel Xplained-MINI series kits. + * \copydetails Group_BoardInfo_XPLAINED_MINI + * + * \note This file should not be included directly. It is automatically included as needed by the Board driver + * dispatch header located in LUFA/Drivers/Board/Board.h. + */ + +/** \ingroup Group_BoardInfo + * \defgroup Group_BoardInfo_XPLAINED_MINI XPLAINED_MINI + * \brief Board specific information header for the Atmel Xplained-MINI series kits. + * + * Board specific information header for the Atmel Xplained-MINI series kits. + * + * @{ + */ + +#ifndef __BOARD_XPLAINED_MINI_H__ +#define __BOARD_XPLAINED_MINI_H__ + + /* Includes: */ + #include "../../../../Common/Common.h" + #include "../../LEDs.h" + + /* Enable C linkage for C++ Compilers: */ + #if defined(__cplusplus) + extern "C" { + #endif + + /* Preprocessor Checks: */ + #if !defined(__INCLUDE_FROM_BOARD_H) + #error Do not include this file directly. Include LUFA/Drivers/Board/Board.h instead. + #endif + + /* Public Interface - May be used in end-application: */ + /* Macros: */ + /** Indicates the board has hardware LEDs mounted. */ + #define BOARD_HAS_LEDS + + /* Disable C linkage for C++ Compilers: */ + #if defined(__cplusplus) + } + #endif + +#endif + +/** @} */ + diff --git a/Firmware/LUFA/Drivers/Board/AVR8/XPLAINED_MINI/LEDs.h b/Firmware/LUFA/Drivers/Board/AVR8/XPLAINED_MINI/LEDs.h new file mode 100644 index 0000000..5c8f196 --- /dev/null +++ b/Firmware/LUFA/Drivers/Board/AVR8/XPLAINED_MINI/LEDs.h @@ -0,0 +1,135 @@ +/* + LUFA Library + Copyright (C) Dean Camera, 2017. + + dean [at] fourwalledcubicle [dot] com + www.lufa-lib.org +*/ + +/* + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) + + Permission to use, copy, modify, distribute, and sell this + software and its documentation for any purpose is hereby granted + without fee, provided that the above copyright notice appear in + all copies and that both that the copyright notice and this + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the + software without specific, written prior permission. + + The author disclaims all warranties with regard to this + software, including all implied warranties of merchantability + and fitness. In no event shall the author be liable for any + special, indirect or consequential damages or any damages + whatsoever resulting from loss of use, data or profits, whether + in an action of contract, negligence or other tortious action, + arising out of or in connection with the use or performance of + this software. +*/ + +/** \file + * \brief Board specific LED driver header for the Atmel Xplained-MINI series kits.. + * \copydetails Group_LEDs_XPLAINED_MINI + * + * \note This file should not be included directly. It is automatically included as needed by the LEDs driver + * dispatch header located in LUFA/Drivers/Board/LEDs.h. + */ + +/** \ingroup Group_LEDs + * \defgroup Group_LEDs_XPLAINED_MINI XPLAINED_MINI + * \brief Board specific LED driver header for the Atmel Xplained-MINI series kits. + * + * Board specific LED driver header for the Atmel Xplained-MINI series kits. + * + * + * + * + *
NameColorInfoActive LevelPort Pin
LEDS_LED1GreenGeneral IndicatorLowPORTC.6
+ * + * @{ + */ + +#ifndef __LEDS_XPLAINED_MINI_H__ +#define __LEDS_XPLAINED_MINI_H__ + + /* Includes: */ + #include "../../../../Common/Common.h" + + /* Enable C linkage for C++ Compilers: */ + #if defined(__cplusplus) + extern "C" { + #endif + + /* Preprocessor Checks: */ + #if !defined(__INCLUDE_FROM_LEDS_H) + #error Do not include this file directly. Include LUFA/Drivers/Board/LEDS.h instead. + #endif + + /* Public Interface - May be used in end-application: */ + /* Macros: */ + /** LED mask for the first LED on the board. */ + #define LEDS_LED1 (1 << 6) + + /** LED mask for all the LEDs on the board. */ + #define LEDS_ALL_LEDS LEDS_LED1 + + /** LED mask for none of the board LEDs. */ + #define LEDS_NO_LEDS 0 + + /* Inline Functions: */ + #if !defined(__DOXYGEN__) + static inline void LEDs_Init(void) + { + DDRC |= LEDS_ALL_LEDS; + PORTC |= LEDS_ALL_LEDS; + } + + static inline void LEDs_Disable(void) + { + DDRC &= ~LEDS_ALL_LEDS; + PORTC &= ~LEDS_ALL_LEDS; + } + + static inline void LEDs_TurnOnLEDs(const uint8_t LEDMask) + { + PORTC &= ~LEDMask; + } + + static inline void LEDs_TurnOffLEDs(const uint8_t LEDMask) + { + PORTC |= LEDMask; + } + + static inline void LEDs_SetAllLEDs(const uint8_t LEDMask) + { + PORTC = ((PORTC | LEDS_ALL_LEDS) & ~LEDMask); + } + + static inline void LEDs_ChangeLEDs(const uint8_t LEDMask, + const uint8_t ActiveMask) + { + PORTC = ((PORTC | LEDMask) & ~ActiveMask); + } + + static inline void LEDs_ToggleLEDs(const uint8_t LEDMask) + { + PINC = LEDMask; + } + + static inline uint8_t LEDs_GetLEDs(void) ATTR_WARN_UNUSED_RESULT; + static inline uint8_t LEDs_GetLEDs(void) + { + return (~PORTC & LEDS_ALL_LEDS); + } + #endif + + /* Disable C linkage for C++ Compilers: */ + #if defined(__cplusplus) + } + #endif + +#endif + +/** @} */ + diff --git a/Firmware/LUFA/Drivers/Board/AVR8/YUN/Board.h b/Firmware/LUFA/Drivers/Board/AVR8/YUN/Board.h index 1d99302..035f66a 100644 --- a/Firmware/LUFA/Drivers/Board/AVR8/YUN/Board.h +++ b/Firmware/LUFA/Drivers/Board/AVR8/YUN/Board.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/AVR8/YUN/LEDs.h b/Firmware/LUFA/Drivers/Board/AVR8/YUN/LEDs.h index bcdd47f..d06acd7 100644 --- a/Firmware/LUFA/Drivers/Board/AVR8/YUN/LEDs.h +++ b/Firmware/LUFA/Drivers/Board/AVR8/YUN/LEDs.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/Board.h b/Firmware/LUFA/Drivers/Board/Board.h index 27f4953..55ed29a 100644 --- a/Firmware/LUFA/Drivers/Board/Board.h +++ b/Firmware/LUFA/Drivers/Board/Board.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted @@ -157,6 +157,10 @@ #include "AVR8/YUN/Board.h" #elif (BOARD == BOARD_MICRO) #include "AVR8/MICRO/Board.h" + #elif (BOARD == BOARD_POLOLUMICRO) + #include "AVR8/POLOLUMICRO/Board.h" + #elif (BOARD == BOARD_XPLAINED_MINI) + #include "AVR8/XPLAINED_MINI/Board.h" #else #include "Board/Board.h" #endif diff --git a/Firmware/LUFA/Drivers/Board/Buttons.h b/Firmware/LUFA/Drivers/Board/Buttons.h index dc22cc1..00ebe8c 100644 --- a/Firmware/LUFA/Drivers/Board/Buttons.h +++ b/Firmware/LUFA/Drivers/Board/Buttons.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted @@ -93,8 +93,9 @@ #if (BOARD == BOARD_NONE) #define BUTTONS_BUTTON1 0 - static inline void Buttons_Init(void) {}; - static inline uint_reg_t Buttons_GetStatus(void) { return 0; }; + static inline void Buttons_Init(void) {} + static inline void Buttons_Disable(void) {} + static inline uint_reg_t Buttons_GetStatus(void) { return 0; } #elif (BOARD == BOARD_USBKEY) #include "AVR8/USBKEY/Buttons.h" #elif (BOARD == BOARD_STK525) diff --git a/Firmware/LUFA/Drivers/Board/Dataflash.h b/Firmware/LUFA/Drivers/Board/Dataflash.h index 9b4bf56..b634dcc 100644 --- a/Firmware/LUFA/Drivers/Board/Dataflash.h +++ b/Firmware/LUFA/Drivers/Board/Dataflash.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/Joystick.h b/Firmware/LUFA/Drivers/Board/Joystick.h index 4ecf61f..0d0fe89 100644 --- a/Firmware/LUFA/Drivers/Board/Joystick.h +++ b/Firmware/LUFA/Drivers/Board/Joystick.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted @@ -105,8 +105,9 @@ #define JOY_LEFT 0 #define JOY_RIGHT 0 #define JOY_PRESS 0 - static inline void Joystick_Init(void) {}; - static inline uint_reg_t Joystick_GetStatus(void) { return 0; }; + static inline void Joystick_Init(void) {} + static inline void Joystick_Disable(void) {} + static inline uint_reg_t Joystick_GetStatus(void) { return 0; } #elif (BOARD == BOARD_USBKEY) #include "AVR8/USBKEY/Joystick.h" #elif (BOARD == BOARD_STK525) diff --git a/Firmware/LUFA/Drivers/Board/LEDs.h b/Firmware/LUFA/Drivers/Board/LEDs.h index 392714a..ba0b1bb 100644 --- a/Firmware/LUFA/Drivers/Board/LEDs.h +++ b/Firmware/LUFA/Drivers/Board/LEDs.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted @@ -108,13 +108,13 @@ #include "../../Common/Common.h" #if (BOARD == BOARD_NONE) - static inline void LEDs_Init(void) {}; - static inline void LEDs_Disable(void) {}; - static inline void LEDs_TurnOnLEDs(const uint_reg_t LEDMask) {}; - static inline void LEDs_TurnOffLEDs(const uint_reg_t LEDMask) {}; - static inline void LEDs_SetAllLEDs(const uint_reg_t LEDMask) {}; - static inline void LEDs_ChangeLEDs(const uint_reg_t LEDMask, const uint_reg_t ActiveMask) {}; - static inline void LEDs_ToggleLEDs(const uint_reg_t LEDMask) {}; + static inline void LEDs_Init(void) {} + static inline void LEDs_Disable(void) {} + static inline void LEDs_TurnOnLEDs(const uint_reg_t LEDMask) {} + static inline void LEDs_TurnOffLEDs(const uint_reg_t LEDMask) {} + static inline void LEDs_SetAllLEDs(const uint_reg_t LEDMask) {} + static inline void LEDs_ChangeLEDs(const uint_reg_t LEDMask, const uint_reg_t ActiveMask) {} + static inline void LEDs_ToggleLEDs(const uint_reg_t LEDMask) {} static inline uint_reg_t LEDs_GetLEDs(void) { return 0; } #elif (BOARD == BOARD_USBKEY) #include "AVR8/USBKEY/LEDs.h" @@ -207,6 +207,10 @@ #include "AVR8/YUN/LEDs.h" #elif (BOARD == BOARD_MICRO) #include "AVR8/MICRO/LEDs.h" + #elif (BOARD == BOARD_POLOLUMICRO) + #include "AVR8/POLOLUMICRO/LEDs.h" + #elif (BOARD == BOARD_XPLAINED_MINI) + #include "AVR8/XPLAINED_MINI/LEDs.h" #else #include "Board/LEDs.h" #endif diff --git a/Firmware/LUFA/Drivers/Board/Temperature.c b/Firmware/LUFA/Drivers/Board/Temperature.c index 8b09f10..2fb1976 100644 --- a/Firmware/LUFA/Drivers/Board/Temperature.c +++ b/Firmware/LUFA/Drivers/Board/Temperature.c @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/Temperature.h b/Firmware/LUFA/Drivers/Board/Temperature.h index d20c6f7..f381cc9 100644 --- a/Firmware/LUFA/Drivers/Board/Temperature.h +++ b/Firmware/LUFA/Drivers/Board/Temperature.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/UC3/EVK1100/Board.h b/Firmware/LUFA/Drivers/Board/UC3/EVK1100/Board.h index 0c34a3f..bd68cf5 100644 --- a/Firmware/LUFA/Drivers/Board/UC3/EVK1100/Board.h +++ b/Firmware/LUFA/Drivers/Board/UC3/EVK1100/Board.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/UC3/EVK1100/Buttons.h b/Firmware/LUFA/Drivers/Board/UC3/EVK1100/Buttons.h index fa45200..a2bd15d 100644 --- a/Firmware/LUFA/Drivers/Board/UC3/EVK1100/Buttons.h +++ b/Firmware/LUFA/Drivers/Board/UC3/EVK1100/Buttons.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/UC3/EVK1100/Joystick.h b/Firmware/LUFA/Drivers/Board/UC3/EVK1100/Joystick.h index 72dd769..7117bc5 100644 --- a/Firmware/LUFA/Drivers/Board/UC3/EVK1100/Joystick.h +++ b/Firmware/LUFA/Drivers/Board/UC3/EVK1100/Joystick.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/UC3/EVK1100/LEDs.h b/Firmware/LUFA/Drivers/Board/UC3/EVK1100/LEDs.h index f66eddb..ca6a37f 100644 --- a/Firmware/LUFA/Drivers/Board/UC3/EVK1100/LEDs.h +++ b/Firmware/LUFA/Drivers/Board/UC3/EVK1100/LEDs.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/UC3/EVK1101/Board.h b/Firmware/LUFA/Drivers/Board/UC3/EVK1101/Board.h index 5d5f95a..46d79f0 100644 --- a/Firmware/LUFA/Drivers/Board/UC3/EVK1101/Board.h +++ b/Firmware/LUFA/Drivers/Board/UC3/EVK1101/Board.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/UC3/EVK1101/Buttons.h b/Firmware/LUFA/Drivers/Board/UC3/EVK1101/Buttons.h index 3de4b33..41bf42c 100644 --- a/Firmware/LUFA/Drivers/Board/UC3/EVK1101/Buttons.h +++ b/Firmware/LUFA/Drivers/Board/UC3/EVK1101/Buttons.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/UC3/EVK1101/Joystick.h b/Firmware/LUFA/Drivers/Board/UC3/EVK1101/Joystick.h index f7a9a75..1351213 100644 --- a/Firmware/LUFA/Drivers/Board/UC3/EVK1101/Joystick.h +++ b/Firmware/LUFA/Drivers/Board/UC3/EVK1101/Joystick.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/UC3/EVK1101/LEDs.h b/Firmware/LUFA/Drivers/Board/UC3/EVK1101/LEDs.h index dad7771..71d45d2 100644 --- a/Firmware/LUFA/Drivers/Board/UC3/EVK1101/LEDs.h +++ b/Firmware/LUFA/Drivers/Board/UC3/EVK1101/LEDs.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/UC3/EVK1104/Board.h b/Firmware/LUFA/Drivers/Board/UC3/EVK1104/Board.h index aa7adbf..0c8b762 100644 --- a/Firmware/LUFA/Drivers/Board/UC3/EVK1104/Board.h +++ b/Firmware/LUFA/Drivers/Board/UC3/EVK1104/Board.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/UC3/EVK1104/Buttons.h b/Firmware/LUFA/Drivers/Board/UC3/EVK1104/Buttons.h index dfcfb66..d12fda5 100644 --- a/Firmware/LUFA/Drivers/Board/UC3/EVK1104/Buttons.h +++ b/Firmware/LUFA/Drivers/Board/UC3/EVK1104/Buttons.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/UC3/EVK1104/LEDs.h b/Firmware/LUFA/Drivers/Board/UC3/EVK1104/LEDs.h index 2258a26..793ea86 100644 --- a/Firmware/LUFA/Drivers/Board/UC3/EVK1104/LEDs.h +++ b/Firmware/LUFA/Drivers/Board/UC3/EVK1104/LEDs.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/UC3/UC3A3_XPLAINED/Board.h b/Firmware/LUFA/Drivers/Board/UC3/UC3A3_XPLAINED/Board.h index ec4d9c7..94abc3e 100644 --- a/Firmware/LUFA/Drivers/Board/UC3/UC3A3_XPLAINED/Board.h +++ b/Firmware/LUFA/Drivers/Board/UC3/UC3A3_XPLAINED/Board.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/UC3/UC3A3_XPLAINED/Buttons.h b/Firmware/LUFA/Drivers/Board/UC3/UC3A3_XPLAINED/Buttons.h index 8accb6f..879373e 100644 --- a/Firmware/LUFA/Drivers/Board/UC3/UC3A3_XPLAINED/Buttons.h +++ b/Firmware/LUFA/Drivers/Board/UC3/UC3A3_XPLAINED/Buttons.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/UC3/UC3A3_XPLAINED/LEDs.h b/Firmware/LUFA/Drivers/Board/UC3/UC3A3_XPLAINED/LEDs.h index 66b7834..cbd2bde 100644 --- a/Firmware/LUFA/Drivers/Board/UC3/UC3A3_XPLAINED/LEDs.h +++ b/Firmware/LUFA/Drivers/Board/UC3/UC3A3_XPLAINED/LEDs.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/XMEGA/A3BU_XPLAINED/Board.h b/Firmware/LUFA/Drivers/Board/XMEGA/A3BU_XPLAINED/Board.h index 824c3db..2bc2377 100644 --- a/Firmware/LUFA/Drivers/Board/XMEGA/A3BU_XPLAINED/Board.h +++ b/Firmware/LUFA/Drivers/Board/XMEGA/A3BU_XPLAINED/Board.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/XMEGA/A3BU_XPLAINED/Buttons.h b/Firmware/LUFA/Drivers/Board/XMEGA/A3BU_XPLAINED/Buttons.h index d5119eb..901869d 100644 --- a/Firmware/LUFA/Drivers/Board/XMEGA/A3BU_XPLAINED/Buttons.h +++ b/Firmware/LUFA/Drivers/Board/XMEGA/A3BU_XPLAINED/Buttons.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/XMEGA/A3BU_XPLAINED/Dataflash.h b/Firmware/LUFA/Drivers/Board/XMEGA/A3BU_XPLAINED/Dataflash.h index 2d09839..b484738 100644 --- a/Firmware/LUFA/Drivers/Board/XMEGA/A3BU_XPLAINED/Dataflash.h +++ b/Firmware/LUFA/Drivers/Board/XMEGA/A3BU_XPLAINED/Dataflash.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/XMEGA/A3BU_XPLAINED/LEDs.h b/Firmware/LUFA/Drivers/Board/XMEGA/A3BU_XPLAINED/LEDs.h index 16abfbc..a0c5b3a 100644 --- a/Firmware/LUFA/Drivers/Board/XMEGA/A3BU_XPLAINED/LEDs.h +++ b/Firmware/LUFA/Drivers/Board/XMEGA/A3BU_XPLAINED/LEDs.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/XMEGA/B1_XPLAINED/Board.h b/Firmware/LUFA/Drivers/Board/XMEGA/B1_XPLAINED/Board.h index d807d18..b133b9a 100644 --- a/Firmware/LUFA/Drivers/Board/XMEGA/B1_XPLAINED/Board.h +++ b/Firmware/LUFA/Drivers/Board/XMEGA/B1_XPLAINED/Board.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/XMEGA/B1_XPLAINED/Buttons.h b/Firmware/LUFA/Drivers/Board/XMEGA/B1_XPLAINED/Buttons.h index 9c458b4..01c7c08 100644 --- a/Firmware/LUFA/Drivers/Board/XMEGA/B1_XPLAINED/Buttons.h +++ b/Firmware/LUFA/Drivers/Board/XMEGA/B1_XPLAINED/Buttons.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/XMEGA/B1_XPLAINED/Dataflash.h b/Firmware/LUFA/Drivers/Board/XMEGA/B1_XPLAINED/Dataflash.h index f02ca4a..7140266 100644 --- a/Firmware/LUFA/Drivers/Board/XMEGA/B1_XPLAINED/Dataflash.h +++ b/Firmware/LUFA/Drivers/Board/XMEGA/B1_XPLAINED/Dataflash.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/XMEGA/B1_XPLAINED/LEDs.h b/Firmware/LUFA/Drivers/Board/XMEGA/B1_XPLAINED/LEDs.h index 7bd31ad..078532a 100644 --- a/Firmware/LUFA/Drivers/Board/XMEGA/B1_XPLAINED/LEDs.h +++ b/Firmware/LUFA/Drivers/Board/XMEGA/B1_XPLAINED/LEDs.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/XMEGA/C3_XPLAINED/Board.h b/Firmware/LUFA/Drivers/Board/XMEGA/C3_XPLAINED/Board.h index d90cc3a..e48bd58 100644 --- a/Firmware/LUFA/Drivers/Board/XMEGA/C3_XPLAINED/Board.h +++ b/Firmware/LUFA/Drivers/Board/XMEGA/C3_XPLAINED/Board.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/XMEGA/C3_XPLAINED/Buttons.h b/Firmware/LUFA/Drivers/Board/XMEGA/C3_XPLAINED/Buttons.h index db62b1d..1a8c1fc 100644 --- a/Firmware/LUFA/Drivers/Board/XMEGA/C3_XPLAINED/Buttons.h +++ b/Firmware/LUFA/Drivers/Board/XMEGA/C3_XPLAINED/Buttons.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Board/XMEGA/C3_XPLAINED/LEDs.h b/Firmware/LUFA/Drivers/Board/XMEGA/C3_XPLAINED/LEDs.h index 737624b..f701c88 100644 --- a/Firmware/LUFA/Drivers/Board/XMEGA/C3_XPLAINED/LEDs.h +++ b/Firmware/LUFA/Drivers/Board/XMEGA/C3_XPLAINED/LEDs.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Misc/AT45DB321C.h b/Firmware/LUFA/Drivers/Misc/AT45DB321C.h index 2506928..e354ca4 100644 --- a/Firmware/LUFA/Drivers/Misc/AT45DB321C.h +++ b/Firmware/LUFA/Drivers/Misc/AT45DB321C.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Misc/AT45DB642D.h b/Firmware/LUFA/Drivers/Misc/AT45DB642D.h index ebbad71..76a7a5c 100644 --- a/Firmware/LUFA/Drivers/Misc/AT45DB642D.h +++ b/Firmware/LUFA/Drivers/Misc/AT45DB642D.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Misc/RingBuffer.h b/Firmware/LUFA/Drivers/Misc/RingBuffer.h index 68fdb8e..0e76a07 100644 --- a/Firmware/LUFA/Drivers/Misc/RingBuffer.h +++ b/Firmware/LUFA/Drivers/Misc/RingBuffer.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Misc/TerminalCodes.h b/Firmware/LUFA/Drivers/Misc/TerminalCodes.h index d43fe01..b12a247 100644 --- a/Firmware/LUFA/Drivers/Misc/TerminalCodes.h +++ b/Firmware/LUFA/Drivers/Misc/TerminalCodes.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Peripheral/ADC.h b/Firmware/LUFA/Drivers/Peripheral/ADC.h index 295c6e1..a0182b3 100644 --- a/Firmware/LUFA/Drivers/Peripheral/ADC.h +++ b/Firmware/LUFA/Drivers/Peripheral/ADC.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Peripheral/AVR8/ADC_AVR8.h b/Firmware/LUFA/Drivers/Peripheral/AVR8/ADC_AVR8.h index 03b6ed0..a2b7ede 100644 --- a/Firmware/LUFA/Drivers/Peripheral/AVR8/ADC_AVR8.h +++ b/Firmware/LUFA/Drivers/Peripheral/AVR8/ADC_AVR8.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Peripheral/AVR8/SPI_AVR8.h b/Firmware/LUFA/Drivers/Peripheral/AVR8/SPI_AVR8.h index 1b8f53e..7244f4a 100644 --- a/Firmware/LUFA/Drivers/Peripheral/AVR8/SPI_AVR8.h +++ b/Firmware/LUFA/Drivers/Peripheral/AVR8/SPI_AVR8.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Peripheral/AVR8/SerialSPI_AVR8.h b/Firmware/LUFA/Drivers/Peripheral/AVR8/SerialSPI_AVR8.h index 8d58369..052780e 100644 --- a/Firmware/LUFA/Drivers/Peripheral/AVR8/SerialSPI_AVR8.h +++ b/Firmware/LUFA/Drivers/Peripheral/AVR8/SerialSPI_AVR8.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Peripheral/AVR8/Serial_AVR8.c b/Firmware/LUFA/Drivers/Peripheral/AVR8/Serial_AVR8.c index 8785a4b..779a80c 100644 --- a/Firmware/LUFA/Drivers/Peripheral/AVR8/Serial_AVR8.c +++ b/Firmware/LUFA/Drivers/Peripheral/AVR8/Serial_AVR8.c @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted @@ -88,8 +88,10 @@ void Serial_SendString(const char* StringPtr) void Serial_SendData(const void* Buffer, uint16_t Length) { + uint8_t* CurrByte = (uint8_t*)Buffer; + while (Length--) - Serial_SendByte(*((uint8_t*)Buffer++)); + Serial_SendByte(*(CurrByte++)); } void Serial_CreateStream(FILE* Stream) diff --git a/Firmware/LUFA/Drivers/Peripheral/AVR8/Serial_AVR8.h b/Firmware/LUFA/Drivers/Peripheral/AVR8/Serial_AVR8.h index e8860a5..b3e7ee3 100644 --- a/Firmware/LUFA/Drivers/Peripheral/AVR8/Serial_AVR8.h +++ b/Firmware/LUFA/Drivers/Peripheral/AVR8/Serial_AVR8.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted @@ -168,7 +168,8 @@ /** Initializes the USART, ready for serial data transmission and reception. This initializes the interface to * standard 8-bit, no parity, 1 stop bit settings suitable for most applications. * - * \param[in] BaudRate Serial baud rate, in bits per second. + * \param[in] BaudRate Serial baud rate, in bits per second. This should be the target baud rate regardless of the + * \c DoubleSpeed parameter's value. * \param[in] DoubleSpeed Enables double speed mode when set, halving the sample time to double the baud rate. */ static inline void Serial_Init(const uint32_t BaudRate, diff --git a/Firmware/LUFA/Drivers/Peripheral/AVR8/TWI_AVR8.c b/Firmware/LUFA/Drivers/Peripheral/AVR8/TWI_AVR8.c index 2a6c160..eb08687 100644 --- a/Firmware/LUFA/Drivers/Peripheral/AVR8/TWI_AVR8.c +++ b/Firmware/LUFA/Drivers/Peripheral/AVR8/TWI_AVR8.c @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted @@ -135,7 +135,7 @@ uint8_t TWI_ReadPacket(const uint8_t SlaveAddress, const uint8_t* InternalAddress, uint8_t InternalAddressLen, uint8_t* Buffer, - uint8_t Length) + uint16_t Length) { uint8_t ErrorCode; @@ -175,7 +175,7 @@ uint8_t TWI_WritePacket(const uint8_t SlaveAddress, const uint8_t* InternalAddress, uint8_t InternalAddressLen, const uint8_t* Buffer, - uint8_t Length) + uint16_t Length) { uint8_t ErrorCode; diff --git a/Firmware/LUFA/Drivers/Peripheral/AVR8/TWI_AVR8.h b/Firmware/LUFA/Drivers/Peripheral/AVR8/TWI_AVR8.h index 584b584..a8b845a 100644 --- a/Firmware/LUFA/Drivers/Peripheral/AVR8/TWI_AVR8.h +++ b/Firmware/LUFA/Drivers/Peripheral/AVR8/TWI_AVR8.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted @@ -273,7 +273,7 @@ const uint8_t* InternalAddress, uint8_t InternalAddressLen, uint8_t* Buffer, - uint8_t Length) ATTR_NON_NULL_PTR_ARG(3); + uint16_t Length) ATTR_NON_NULL_PTR_ARG(3); /** High level function to perform a complete packet transfer over the TWI bus from the specified * device. @@ -292,7 +292,7 @@ const uint8_t* InternalAddress, uint8_t InternalAddressLen, const uint8_t* Buffer, - uint8_t Length) ATTR_NON_NULL_PTR_ARG(3); + uint16_t Length) ATTR_NON_NULL_PTR_ARG(3); /* Disable C linkage for C++ Compilers: */ #if defined(__cplusplus) diff --git a/Firmware/LUFA/Drivers/Peripheral/SPI.h b/Firmware/LUFA/Drivers/Peripheral/SPI.h index 54c4642..f0cd177 100644 --- a/Firmware/LUFA/Drivers/Peripheral/SPI.h +++ b/Firmware/LUFA/Drivers/Peripheral/SPI.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Peripheral/Serial.h b/Firmware/LUFA/Drivers/Peripheral/Serial.h index 46ee61b..0c537bc 100644 --- a/Firmware/LUFA/Drivers/Peripheral/Serial.h +++ b/Firmware/LUFA/Drivers/Peripheral/Serial.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Peripheral/SerialSPI.h b/Firmware/LUFA/Drivers/Peripheral/SerialSPI.h index 9a42ba5..dbab9db 100644 --- a/Firmware/LUFA/Drivers/Peripheral/SerialSPI.h +++ b/Firmware/LUFA/Drivers/Peripheral/SerialSPI.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Peripheral/TWI.h b/Firmware/LUFA/Drivers/Peripheral/TWI.h index 5290e66..24483d8 100644 --- a/Firmware/LUFA/Drivers/Peripheral/TWI.h +++ b/Firmware/LUFA/Drivers/Peripheral/TWI.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Peripheral/XMEGA/SPI_XMEGA.h b/Firmware/LUFA/Drivers/Peripheral/XMEGA/SPI_XMEGA.h index c623048..7797df1 100644 --- a/Firmware/LUFA/Drivers/Peripheral/XMEGA/SPI_XMEGA.h +++ b/Firmware/LUFA/Drivers/Peripheral/XMEGA/SPI_XMEGA.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Peripheral/XMEGA/SerialSPI_XMEGA.h b/Firmware/LUFA/Drivers/Peripheral/XMEGA/SerialSPI_XMEGA.h index a981ce6..ca32350 100644 --- a/Firmware/LUFA/Drivers/Peripheral/XMEGA/SerialSPI_XMEGA.h +++ b/Firmware/LUFA/Drivers/Peripheral/XMEGA/SerialSPI_XMEGA.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/Peripheral/XMEGA/Serial_XMEGA.c b/Firmware/LUFA/Drivers/Peripheral/XMEGA/Serial_XMEGA.c index 4e29357..9ecda47 100644 --- a/Firmware/LUFA/Drivers/Peripheral/XMEGA/Serial_XMEGA.c +++ b/Firmware/LUFA/Drivers/Peripheral/XMEGA/Serial_XMEGA.c @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted @@ -91,23 +91,26 @@ void Serial_SendData(USART_t* const USART, const void* Buffer, uint16_t Length) { + uint8_t* CurrByte = (uint8_t*)Buffer; + while (Length--) - Serial_SendByte(USART, *((uint8_t*)Buffer++)); + Serial_SendByte(USART, *(CurrByte++)); } -void Serial_CreateStream(FILE* Stream) +void Serial_CreateStream(USART_t* USART, FILE* Stream) { if (!(Stream)) { Stream = &USARTSerialStream; stdin = Stream; stdout = Stream; - } + } - *Stream = (FILE)FDEV_SETUP_STREAM(Serial_putchar, Serial_getchar, _FDEV_SETUP_RW); + *Stream = (FILE)FDEV_SETUP_STREAM(Serial_putchar, Serial_getchar, _FDEV_SETUP_RW); + fdev_set_udata(Stream, USART); } -void Serial_CreateBlockingStream(FILE* Stream) +void Serial_CreateBlockingStream(USART_t* USART, FILE* Stream) { if (!(Stream)) { @@ -116,7 +119,8 @@ void Serial_CreateBlockingStream(FILE* Stream) stdout = Stream; } - *Stream = (FILE)FDEV_SETUP_STREAM(Serial_putchar, Serial_getchar_Blocking, _FDEV_SETUP_RW); + *Stream = (FILE)FDEV_SETUP_STREAM(Serial_putchar, Serial_getchar_Blocking, _FDEV_SETUP_RW); + fdev_set_udata(Stream, USART); } #endif diff --git a/Firmware/LUFA/Drivers/Peripheral/XMEGA/Serial_XMEGA.h b/Firmware/LUFA/Drivers/Peripheral/XMEGA/Serial_XMEGA.h index ad34c85..36f507d 100644 --- a/Firmware/LUFA/Drivers/Peripheral/XMEGA/Serial_XMEGA.h +++ b/Firmware/LUFA/Drivers/Peripheral/XMEGA/Serial_XMEGA.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted @@ -151,29 +151,32 @@ * be used when the read data is processed byte-per-bye (via \c getc()) or when the user application will implement its own * line buffering. * + * \param[in,out] USART Pointer to the base of the USART peripheral within the device. * \param[in,out] Stream Pointer to a FILE structure where the created stream should be placed, if \c NULL, \c stdout * and \c stdin will be configured to use the USART. * * \pre The USART must first be configured via a call to \ref Serial_Init() before the stream is used. */ - void Serial_CreateStream(FILE* Stream); + void Serial_CreateStream(USART_t* USART, FILE* Stream); - /** Identical to \ref Serial_CreateStream(), except that reads are blocking until the calling stream function terminates + /** Identical to \ref Serial_CreateStream(), except that reads are blocking until the calling stream function terminates * the transfer. * + * \param[in,out] USART Pointer to the base of the USART peripheral within the device. * \param[in,out] Stream Pointer to a FILE structure where the created stream should be placed, if \c NULL, \c stdout * and \c stdin will be configured to use the USART. * * \pre The USART must first be configured via a call to \ref Serial_Init() before the stream is used. */ - void Serial_CreateBlockingStream(FILE* Stream); + void Serial_CreateBlockingStream(USART_t* USART, FILE* Stream); /* Inline Functions: */ /** Initializes the USART, ready for serial data transmission and reception. This initializes the interface to * standard 8-bit, no parity, 1 stop bit settings suitable for most applications. * * \param[in,out] USART Pointer to the base of the USART peripheral within the device. - * \param[in] BaudRate Serial baud rate, in bits per second. + * \param[in] BaudRate Serial baud rate, in bits per second. This should be the target baud rate regardless of + * the \c DoubleSpeed parameter's value. * \param[in] DoubleSpeed Enables double speed mode when set, halving the sample time to double the baud rate. */ static inline void Serial_Init(USART_t* const USART, diff --git a/Firmware/LUFA/Drivers/Peripheral/XMEGA/TWI_XMEGA.c b/Firmware/LUFA/Drivers/Peripheral/XMEGA/TWI_XMEGA.c index 6f8ab1d..92cc643 100644 --- a/Firmware/LUFA/Drivers/Peripheral/XMEGA/TWI_XMEGA.c +++ b/Firmware/LUFA/Drivers/Peripheral/XMEGA/TWI_XMEGA.c @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted @@ -110,7 +110,7 @@ uint8_t TWI_ReadPacket(TWI_t* const TWI, const uint8_t* InternalAddress, uint8_t InternalAddressLen, uint8_t* Buffer, - uint8_t Length) + uint16_t Length) { uint8_t ErrorCode; @@ -151,7 +151,7 @@ uint8_t TWI_WritePacket(TWI_t* const TWI, const uint8_t* InternalAddress, uint8_t InternalAddressLen, const uint8_t* Buffer, - uint8_t Length) + uint16_t Length) { uint8_t ErrorCode; diff --git a/Firmware/LUFA/Drivers/Peripheral/XMEGA/TWI_XMEGA.h b/Firmware/LUFA/Drivers/Peripheral/XMEGA/TWI_XMEGA.h index 72437e5..94ada73 100644 --- a/Firmware/LUFA/Drivers/Peripheral/XMEGA/TWI_XMEGA.h +++ b/Firmware/LUFA/Drivers/Peripheral/XMEGA/TWI_XMEGA.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted @@ -268,7 +268,7 @@ const uint8_t* InternalAddress, uint8_t InternalAddressLen, uint8_t* Buffer, - uint8_t Length) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(4); + uint16_t Length) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(4); /** High level function to perform a complete packet transfer over the TWI bus from the specified * device. @@ -289,7 +289,7 @@ const uint8_t* InternalAddress, uint8_t InternalAddressLen, const uint8_t* Buffer, - uint8_t Length) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(4); + uint16_t Length) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(4); /* Disable C linkage for C++ Compilers: */ #if defined(__cplusplus) diff --git a/Firmware/LUFA/Drivers/USB/Class/AndroidAccessoryClass.h b/Firmware/LUFA/Drivers/USB/Class/AndroidAccessoryClass.h index 24978ca..f1c0109 100644 --- a/Firmware/LUFA/Drivers/USB/Class/AndroidAccessoryClass.h +++ b/Firmware/LUFA/Drivers/USB/Class/AndroidAccessoryClass.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/Class/AudioClass.h b/Firmware/LUFA/Drivers/USB/Class/AudioClass.h index 0e3ca8d..d6ced05 100644 --- a/Firmware/LUFA/Drivers/USB/Class/AudioClass.h +++ b/Firmware/LUFA/Drivers/USB/Class/AudioClass.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/Class/CDCClass.h b/Firmware/LUFA/Drivers/USB/Class/CDCClass.h index 3bad74b..30b3ee2 100644 --- a/Firmware/LUFA/Drivers/USB/Class/CDCClass.h +++ b/Firmware/LUFA/Drivers/USB/Class/CDCClass.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/Class/Common/AndroidAccessoryClassCommon.h b/Firmware/LUFA/Drivers/USB/Class/Common/AndroidAccessoryClassCommon.h index c3153da..fdf8671 100644 --- a/Firmware/LUFA/Drivers/USB/Class/Common/AndroidAccessoryClassCommon.h +++ b/Firmware/LUFA/Drivers/USB/Class/Common/AndroidAccessoryClassCommon.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/Class/Common/AudioClassCommon.h b/Firmware/LUFA/Drivers/USB/Class/Common/AudioClassCommon.h index 2db5eee..46ecd08 100644 --- a/Firmware/LUFA/Drivers/USB/Class/Common/AudioClassCommon.h +++ b/Firmware/LUFA/Drivers/USB/Class/Common/AudioClassCommon.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/Class/Common/CDCClassCommon.h b/Firmware/LUFA/Drivers/USB/Class/Common/CDCClassCommon.h index 94e6c68..1ad49ec 100644 --- a/Firmware/LUFA/Drivers/USB/Class/Common/CDCClassCommon.h +++ b/Firmware/LUFA/Drivers/USB/Class/Common/CDCClassCommon.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/Class/Common/HIDClassCommon.h b/Firmware/LUFA/Drivers/USB/Class/Common/HIDClassCommon.h index 9d701fb..6e700a9 100644 --- a/Firmware/LUFA/Drivers/USB/Class/Common/HIDClassCommon.h +++ b/Firmware/LUFA/Drivers/USB/Class/Common/HIDClassCommon.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted @@ -445,7 +445,7 @@ HID_RI_REPORT_SIZE(8, 0x03), \ HID_RI_OUTPUT(8, HID_IOF_CONSTANT), \ HID_RI_LOGICAL_MINIMUM(8, 0x00), \ - HID_RI_LOGICAL_MAXIMUM(8, 0xFF), \ + HID_RI_LOGICAL_MAXIMUM(16, 0xFF), \ HID_RI_USAGE_PAGE(8, 0x07), \ HID_RI_USAGE_MINIMUM(8, 0x00), \ HID_RI_USAGE_MAXIMUM(8, 0xFF), \ @@ -679,4 +679,3 @@ #endif /** @} */ - diff --git a/Firmware/LUFA/Drivers/USB/Class/Common/HIDParser.c b/Firmware/LUFA/Drivers/USB/Class/Common/HIDParser.c index d93508f..62f10c4 100644 --- a/Firmware/LUFA/Drivers/USB/Class/Common/HIDParser.c +++ b/Firmware/LUFA/Drivers/USB/Class/Common/HIDParser.c @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted @@ -364,8 +364,8 @@ void USB_SetHIDReportItemInfo(uint8_t* ReportData, while (DataBitsRem--) { - if (ReportItem->Value & (1 << (CurrentBit % 8))) - ReportData[CurrentBit / 8] |= BitMask; + if (ReportItem->Value & BitMask) + ReportData[CurrentBit / 8] |= (1 << (CurrentBit % 8)); CurrentBit++; BitMask <<= 1; diff --git a/Firmware/LUFA/Drivers/USB/Class/Common/HIDParser.h b/Firmware/LUFA/Drivers/USB/Class/Common/HIDParser.h index 1f84ef4..023316d 100644 --- a/Firmware/LUFA/Drivers/USB/Class/Common/HIDParser.h +++ b/Firmware/LUFA/Drivers/USB/Class/Common/HIDParser.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/Class/Common/HIDReportData.h b/Firmware/LUFA/Drivers/USB/Class/Common/HIDReportData.h index df4302c..fe1c4df 100644 --- a/Firmware/LUFA/Drivers/USB/Class/Common/HIDReportData.h +++ b/Firmware/LUFA/Drivers/USB/Class/Common/HIDReportData.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/Class/Common/MIDIClassCommon.h b/Firmware/LUFA/Drivers/USB/Class/Common/MIDIClassCommon.h index b6f6034..b6414bc 100644 --- a/Firmware/LUFA/Drivers/USB/Class/Common/MIDIClassCommon.h +++ b/Firmware/LUFA/Drivers/USB/Class/Common/MIDIClassCommon.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/Class/Common/MassStorageClassCommon.h b/Firmware/LUFA/Drivers/USB/Class/Common/MassStorageClassCommon.h index 8a12f31..d2ea37a 100644 --- a/Firmware/LUFA/Drivers/USB/Class/Common/MassStorageClassCommon.h +++ b/Firmware/LUFA/Drivers/USB/Class/Common/MassStorageClassCommon.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/Class/Common/PrinterClassCommon.h b/Firmware/LUFA/Drivers/USB/Class/Common/PrinterClassCommon.h index 1edd1dd..2db830e 100644 --- a/Firmware/LUFA/Drivers/USB/Class/Common/PrinterClassCommon.h +++ b/Firmware/LUFA/Drivers/USB/Class/Common/PrinterClassCommon.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/Class/Common/RNDISClassCommon.h b/Firmware/LUFA/Drivers/USB/Class/Common/RNDISClassCommon.h index 640745e..ade1af0 100644 --- a/Firmware/LUFA/Drivers/USB/Class/Common/RNDISClassCommon.h +++ b/Firmware/LUFA/Drivers/USB/Class/Common/RNDISClassCommon.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/Class/Common/StillImageClassCommon.h b/Firmware/LUFA/Drivers/USB/Class/Common/StillImageClassCommon.h index 09a9eab..7608b18 100644 --- a/Firmware/LUFA/Drivers/USB/Class/Common/StillImageClassCommon.h +++ b/Firmware/LUFA/Drivers/USB/Class/Common/StillImageClassCommon.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/Class/Device/AudioClassDevice.c b/Firmware/LUFA/Drivers/USB/Class/Device/AudioClassDevice.c index f862ba7..08cbeb7 100644 --- a/Firmware/LUFA/Drivers/USB/Class/Device/AudioClassDevice.c +++ b/Firmware/LUFA/Drivers/USB/Class/Device/AudioClassDevice.c @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/Class/Device/AudioClassDevice.h b/Firmware/LUFA/Drivers/USB/Class/Device/AudioClassDevice.h index 6cdf4db..ca63511 100644 --- a/Firmware/LUFA/Drivers/USB/Class/Device/AudioClassDevice.h +++ b/Firmware/LUFA/Drivers/USB/Class/Device/AudioClassDevice.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/Class/Device/CDCClassDevice.c b/Firmware/LUFA/Drivers/USB/Class/Device/CDCClassDevice.c index f4e74cf..867548c 100644 --- a/Firmware/LUFA/Drivers/USB/Class/Device/CDCClassDevice.c +++ b/Firmware/LUFA/Drivers/USB/Class/Device/CDCClassDevice.c @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted @@ -155,6 +155,16 @@ uint8_t CDC_Device_SendString(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo return Endpoint_Write_Stream_LE(String, strlen(String), NULL); } +uint8_t CDC_Device_SendString_P(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo, + const char* const String) +{ + if ((USB_DeviceState != DEVICE_STATE_Configured) || !(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS)) + return ENDPOINT_RWSTREAM_DeviceDisconnected; + + Endpoint_SelectEndpoint(CDCInterfaceInfo->Config.DataINEndpoint.Address); + return Endpoint_Write_PStream_LE(String, strlen_P(String), NULL); +} + uint8_t CDC_Device_SendData(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo, const void* const Buffer, const uint16_t Length) @@ -166,6 +176,17 @@ uint8_t CDC_Device_SendData(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo, return Endpoint_Write_Stream_LE(Buffer, Length, NULL); } +uint8_t CDC_Device_SendData_P(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo, + const void* const Buffer, + const uint16_t Length) +{ + if ((USB_DeviceState != DEVICE_STATE_Configured) || !(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS)) + return ENDPOINT_RWSTREAM_DeviceDisconnected; + + Endpoint_SelectEndpoint(CDCInterfaceInfo->Config.DataINEndpoint.Address); + return Endpoint_Write_PStream_LE(Buffer, Length, NULL); +} + uint8_t CDC_Device_SendByte(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo, const uint8_t Data) { diff --git a/Firmware/LUFA/Drivers/USB/Class/Device/CDCClassDevice.h b/Firmware/LUFA/Drivers/USB/Class/Device/CDCClassDevice.h index 05c0fdd..9d5c4e5 100644 --- a/Firmware/LUFA/Drivers/USB/Class/Device/CDCClassDevice.h +++ b/Firmware/LUFA/Drivers/USB/Class/Device/CDCClassDevice.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted @@ -200,6 +200,24 @@ const void* const Buffer, const uint16_t Length) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2); + /** Sends a given data buffer from PROGMEM space to the attached USB host, if connected. If a host is not connected when the + * function is called, the string is discarded. Bytes will be queued for transmission to the host until either the endpoint + * bank becomes full, or the \ref CDC_Device_Flush() function is called to flush the pending data to the host. This allows + * for multiple bytes to be packed into a single endpoint packet, increasing data throughput. + * + * \pre This function must only be called when the Device state machine is in the \ref DEVICE_STATE_Configured state or + * the call will fail. + * + * \param[in,out] CDCInterfaceInfo Pointer to a structure containing a CDC Class configuration and state. + * \param[in] Buffer Pointer to a buffer containing the data to send to the device. + * \param[in] Length Length of the data to send to the host. + * + * \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum. + */ + uint8_t CDC_Device_SendData_P(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo, + const void* const Buffer, + const uint16_t Length) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2); + /** Sends a given null terminated string to the attached USB host, if connected. If a host is not connected when * the function is called, the string is discarded. Bytes will be queued for transmission to the host until either * the endpoint bank becomes full, or the \ref CDC_Device_Flush() function is called to flush the pending data to @@ -216,6 +234,22 @@ uint8_t CDC_Device_SendString(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo, const char* const String) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2); + /** Sends a given null terminated string from PROGMEM space to the attached USB host, if connected. If a host is not connected + * when the function is called, the string is discarded. Bytes will be queued for transmission to the host until either + * the endpoint bank becomes full, or the \ref CDC_Device_Flush() function is called to flush the pending data to + * the host. This allows for multiple bytes to be packed into a single endpoint packet, increasing data throughput. + * + * \pre This function must only be called when the Device state machine is in the \ref DEVICE_STATE_Configured state or + * the call will fail. + * + * \param[in,out] CDCInterfaceInfo Pointer to a structure containing a CDC Class configuration and state. + * \param[in] String Pointer to the null terminated string to send to the host. + * + * \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum. + */ + uint8_t CDC_Device_SendString_P(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo, + const char* const String) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2); + /** Sends a given byte to the attached USB host, if connected. If a host is not connected when the function is called, the * byte is discarded. Bytes will be queued for transmission to the host until either the endpoint bank becomes full, or the * \ref CDC_Device_Flush() function is called to flush the pending data to the host. This allows for multiple bytes to be diff --git a/Firmware/LUFA/Drivers/USB/Class/Device/HIDClassDevice.c b/Firmware/LUFA/Drivers/USB/Class/Device/HIDClassDevice.c index 03a745c..a8a6e8b 100644 --- a/Firmware/LUFA/Drivers/USB/Class/Device/HIDClassDevice.c +++ b/Firmware/LUFA/Drivers/USB/Class/Device/HIDClassDevice.c @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/Class/Device/HIDClassDevice.h b/Firmware/LUFA/Drivers/USB/Class/Device/HIDClassDevice.h index f373cf0..ae628c8 100644 --- a/Firmware/LUFA/Drivers/USB/Class/Device/HIDClassDevice.h +++ b/Firmware/LUFA/Drivers/USB/Class/Device/HIDClassDevice.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/Class/Device/MIDIClassDevice.c b/Firmware/LUFA/Drivers/USB/Class/Device/MIDIClassDevice.c index b002525..a35c408 100644 --- a/Firmware/LUFA/Drivers/USB/Class/Device/MIDIClassDevice.c +++ b/Firmware/LUFA/Drivers/USB/Class/Device/MIDIClassDevice.c @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/Class/Device/MIDIClassDevice.h b/Firmware/LUFA/Drivers/USB/Class/Device/MIDIClassDevice.h index 70eb442..ee2efd7 100644 --- a/Firmware/LUFA/Drivers/USB/Class/Device/MIDIClassDevice.h +++ b/Firmware/LUFA/Drivers/USB/Class/Device/MIDIClassDevice.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/Class/Device/MassStorageClassDevice.c b/Firmware/LUFA/Drivers/USB/Class/Device/MassStorageClassDevice.c index d090796..1ea30f7 100644 --- a/Firmware/LUFA/Drivers/USB/Class/Device/MassStorageClassDevice.c +++ b/Firmware/LUFA/Drivers/USB/Class/Device/MassStorageClassDevice.c @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/Class/Device/MassStorageClassDevice.h b/Firmware/LUFA/Drivers/USB/Class/Device/MassStorageClassDevice.h index 5132213..12b54f8 100644 --- a/Firmware/LUFA/Drivers/USB/Class/Device/MassStorageClassDevice.h +++ b/Firmware/LUFA/Drivers/USB/Class/Device/MassStorageClassDevice.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/Class/Device/PrinterClassDevice.c b/Firmware/LUFA/Drivers/USB/Class/Device/PrinterClassDevice.c index fd3454b..7209c45 100644 --- a/Firmware/LUFA/Drivers/USB/Class/Device/PrinterClassDevice.c +++ b/Firmware/LUFA/Drivers/USB/Class/Device/PrinterClassDevice.c @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/Class/Device/PrinterClassDevice.h b/Firmware/LUFA/Drivers/USB/Class/Device/PrinterClassDevice.h index d9d9644..802c591 100644 --- a/Firmware/LUFA/Drivers/USB/Class/Device/PrinterClassDevice.h +++ b/Firmware/LUFA/Drivers/USB/Class/Device/PrinterClassDevice.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/Class/Device/RNDISClassDevice.c b/Firmware/LUFA/Drivers/USB/Class/Device/RNDISClassDevice.c index 6ee73c5..45293b1 100644 --- a/Firmware/LUFA/Drivers/USB/Class/Device/RNDISClassDevice.c +++ b/Firmware/LUFA/Drivers/USB/Class/Device/RNDISClassDevice.c @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/Class/Device/RNDISClassDevice.h b/Firmware/LUFA/Drivers/USB/Class/Device/RNDISClassDevice.h index 2821d7d..761bc27 100644 --- a/Firmware/LUFA/Drivers/USB/Class/Device/RNDISClassDevice.h +++ b/Firmware/LUFA/Drivers/USB/Class/Device/RNDISClassDevice.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/Class/HIDClass.h b/Firmware/LUFA/Drivers/USB/Class/HIDClass.h index d2eea75..158eb25 100644 --- a/Firmware/LUFA/Drivers/USB/Class/HIDClass.h +++ b/Firmware/LUFA/Drivers/USB/Class/HIDClass.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/Class/Host/AndroidAccessoryClassHost.c b/Firmware/LUFA/Drivers/USB/Class/Host/AndroidAccessoryClassHost.c index ac8d5dc..ea89033 100644 --- a/Firmware/LUFA/Drivers/USB/Class/Host/AndroidAccessoryClassHost.c +++ b/Firmware/LUFA/Drivers/USB/Class/Host/AndroidAccessoryClassHost.c @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/Class/Host/AndroidAccessoryClassHost.h b/Firmware/LUFA/Drivers/USB/Class/Host/AndroidAccessoryClassHost.h index 0476f2e..f4f04e4 100644 --- a/Firmware/LUFA/Drivers/USB/Class/Host/AndroidAccessoryClassHost.h +++ b/Firmware/LUFA/Drivers/USB/Class/Host/AndroidAccessoryClassHost.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/Class/Host/AudioClassHost.c b/Firmware/LUFA/Drivers/USB/Class/Host/AudioClassHost.c index 3b5bceb..9f1a6dc 100644 --- a/Firmware/LUFA/Drivers/USB/Class/Host/AudioClassHost.c +++ b/Firmware/LUFA/Drivers/USB/Class/Host/AudioClassHost.c @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/Class/Host/AudioClassHost.h b/Firmware/LUFA/Drivers/USB/Class/Host/AudioClassHost.h index b00bb5f..f1f4207 100644 --- a/Firmware/LUFA/Drivers/USB/Class/Host/AudioClassHost.h +++ b/Firmware/LUFA/Drivers/USB/Class/Host/AudioClassHost.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/Class/Host/CDCClassHost.c b/Firmware/LUFA/Drivers/USB/Class/Host/CDCClassHost.c index b32a237..af9ed96 100644 --- a/Firmware/LUFA/Drivers/USB/Class/Host/CDCClassHost.c +++ b/Firmware/LUFA/Drivers/USB/Class/Host/CDCClassHost.c @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted @@ -294,6 +294,24 @@ uint8_t CDC_Host_SendData(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo, return ErrorCode; } +uint8_t CDC_Host_SendData_P(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo, + const void* const Buffer, + const uint16_t Length) +{ + if ((USB_HostState != HOST_STATE_Configured) || !(CDCInterfaceInfo->State.IsActive)) + return PIPE_READYWAIT_DeviceDisconnected; + + uint8_t ErrorCode; + + Pipe_SelectPipe(CDCInterfaceInfo->Config.DataOUTPipe.Address); + + Pipe_Unfreeze(); + ErrorCode = Pipe_Write_PStream_LE(Buffer, Length, NULL); + Pipe_Freeze(); + + return ErrorCode; +} + uint8_t CDC_Host_SendString(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo, const char* const String) { @@ -311,6 +329,23 @@ uint8_t CDC_Host_SendString(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo, return ErrorCode; } +uint8_t CDC_Host_SendString_P(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo, + const char* const String) +{ + if ((USB_HostState != HOST_STATE_Configured) || !(CDCInterfaceInfo->State.IsActive)) + return PIPE_READYWAIT_DeviceDisconnected; + + uint8_t ErrorCode; + + Pipe_SelectPipe(CDCInterfaceInfo->Config.DataOUTPipe.Address); + + Pipe_Unfreeze(); + ErrorCode = Pipe_Write_PStream_LE(String, strlen_P(String), NULL); + Pipe_Freeze(); + + return ErrorCode; +} + uint8_t CDC_Host_SendByte(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo, const uint8_t Data) { diff --git a/Firmware/LUFA/Drivers/USB/Class/Host/CDCClassHost.h b/Firmware/LUFA/Drivers/USB/Class/Host/CDCClassHost.h index aeee23e..86ce6de 100644 --- a/Firmware/LUFA/Drivers/USB/Class/Host/CDCClassHost.h +++ b/Firmware/LUFA/Drivers/USB/Class/Host/CDCClassHost.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted @@ -201,6 +201,24 @@ const void* const Buffer, const uint16_t Length) ATTR_NON_NULL_PTR_ARG(1); + /** Sends a given data buffer from PROGMEM space to the attached USB device, if connected. If a device is not connected when the + * function is called, the string is discarded. Bytes will be queued for transmission to the host until either the pipe + * bank becomes full, or the \ref CDC_Host_Flush() function is called to flush the pending data to the device. This allows + * for multiple bytes to be packed into a single pipe packet, increasing data throughput. + * + * \pre This function must only be called when the Host state machine is in the \ref HOST_STATE_Configured state or + * the call will fail. + * + * \param[in,out] CDCInterfaceInfo Pointer to a structure containing a CDC Class host configuration and state. + * \param[in] Buffer Pointer to a buffer containing the data to send to the device. + * \param[in] Length Length of the data to send to the host. + * + * \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum. + */ + uint8_t CDC_Host_SendData_P(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo, + const void* const Buffer, + const uint16_t Length) ATTR_NON_NULL_PTR_ARG(1); + /** Sends a given null-terminated string to the attached USB device, if connected. If a device is not connected when the * function is called, the string is discarded. Bytes will be queued for transmission to the device until either the pipe * bank becomes full, or the \ref CDC_Host_Flush() function is called to flush the pending data to the device. This allows @@ -217,6 +235,22 @@ uint8_t CDC_Host_SendString(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo, const char* const String) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2); + /** Sends a given null terminated string from PROGMEM space to the attached USB device, if connected. If a device is not connected + * when the function is called, the string is discarded. Bytes will be queued for transmission to the device until either + * the pipe bank becomes full, or the \ref CDC_Host_Flush() function is called to flush the pending data to + * the device. This allows for multiple bytes to be packed into a single pipe packet, increasing data throughput. + * + * \pre This function must only be called when the Host state machine is in the \ref HOST_STATE_Configured state or + * the call will fail. + * + * \param[in,out] CDCInterfaceInfo Pointer to a structure containing a CDC Class host configuration and state. + * \param[in] String Pointer to the null terminated string to send to the host. + * + * \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum. + */ + uint8_t CDC_Host_SendString_P(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo, + const char* const String) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2); + /** Sends a given byte to the attached USB device, if connected. If a device is not connected when the function is called, the * byte is discarded. Bytes will be queued for transmission to the device until either the pipe bank becomes full, or the * \ref CDC_Host_Flush() function is called to flush the pending data to the host. This allows for multiple bytes to be diff --git a/Firmware/LUFA/Drivers/USB/Class/Host/HIDClassHost.c b/Firmware/LUFA/Drivers/USB/Class/Host/HIDClassHost.c index b43435d..32591ff 100644 --- a/Firmware/LUFA/Drivers/USB/Class/Host/HIDClassHost.c +++ b/Firmware/LUFA/Drivers/USB/Class/Host/HIDClassHost.c @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/Class/Host/HIDClassHost.h b/Firmware/LUFA/Drivers/USB/Class/Host/HIDClassHost.h index 703b698..73b5abb 100644 --- a/Firmware/LUFA/Drivers/USB/Class/Host/HIDClassHost.h +++ b/Firmware/LUFA/Drivers/USB/Class/Host/HIDClassHost.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/Class/Host/MIDIClassHost.c b/Firmware/LUFA/Drivers/USB/Class/Host/MIDIClassHost.c index 8b898cb..635148f 100644 --- a/Firmware/LUFA/Drivers/USB/Class/Host/MIDIClassHost.c +++ b/Firmware/LUFA/Drivers/USB/Class/Host/MIDIClassHost.c @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/Class/Host/MIDIClassHost.h b/Firmware/LUFA/Drivers/USB/Class/Host/MIDIClassHost.h index 7624f8e..9cae21a 100644 --- a/Firmware/LUFA/Drivers/USB/Class/Host/MIDIClassHost.h +++ b/Firmware/LUFA/Drivers/USB/Class/Host/MIDIClassHost.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/Class/Host/MassStorageClassHost.c b/Firmware/LUFA/Drivers/USB/Class/Host/MassStorageClassHost.c index ac448a5..f7c5a6a 100644 --- a/Firmware/LUFA/Drivers/USB/Class/Host/MassStorageClassHost.c +++ b/Firmware/LUFA/Drivers/USB/Class/Host/MassStorageClassHost.c @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/Class/Host/MassStorageClassHost.h b/Firmware/LUFA/Drivers/USB/Class/Host/MassStorageClassHost.h index 6e55807..348050f 100644 --- a/Firmware/LUFA/Drivers/USB/Class/Host/MassStorageClassHost.h +++ b/Firmware/LUFA/Drivers/USB/Class/Host/MassStorageClassHost.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/Class/Host/PrinterClassHost.c b/Firmware/LUFA/Drivers/USB/Class/Host/PrinterClassHost.c index fd32e1c..8a04d0a 100644 --- a/Firmware/LUFA/Drivers/USB/Class/Host/PrinterClassHost.c +++ b/Firmware/LUFA/Drivers/USB/Class/Host/PrinterClassHost.c @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/Class/Host/PrinterClassHost.h b/Firmware/LUFA/Drivers/USB/Class/Host/PrinterClassHost.h index 8089aa5..511dab4 100644 --- a/Firmware/LUFA/Drivers/USB/Class/Host/PrinterClassHost.h +++ b/Firmware/LUFA/Drivers/USB/Class/Host/PrinterClassHost.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/Class/Host/RNDISClassHost.c b/Firmware/LUFA/Drivers/USB/Class/Host/RNDISClassHost.c index 3ed51c8..6fb09fd 100644 --- a/Firmware/LUFA/Drivers/USB/Class/Host/RNDISClassHost.c +++ b/Firmware/LUFA/Drivers/USB/Class/Host/RNDISClassHost.c @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/Class/Host/RNDISClassHost.h b/Firmware/LUFA/Drivers/USB/Class/Host/RNDISClassHost.h index 79334b4..bddbc24 100644 --- a/Firmware/LUFA/Drivers/USB/Class/Host/RNDISClassHost.h +++ b/Firmware/LUFA/Drivers/USB/Class/Host/RNDISClassHost.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/Class/Host/StillImageClassHost.c b/Firmware/LUFA/Drivers/USB/Class/Host/StillImageClassHost.c index 24a6308..ef33d9b 100644 --- a/Firmware/LUFA/Drivers/USB/Class/Host/StillImageClassHost.c +++ b/Firmware/LUFA/Drivers/USB/Class/Host/StillImageClassHost.c @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/Class/Host/StillImageClassHost.h b/Firmware/LUFA/Drivers/USB/Class/Host/StillImageClassHost.h index f9f41ad..ababdb0 100644 --- a/Firmware/LUFA/Drivers/USB/Class/Host/StillImageClassHost.h +++ b/Firmware/LUFA/Drivers/USB/Class/Host/StillImageClassHost.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/Class/MIDIClass.h b/Firmware/LUFA/Drivers/USB/Class/MIDIClass.h index 7e6ba1c..a35ae13 100644 --- a/Firmware/LUFA/Drivers/USB/Class/MIDIClass.h +++ b/Firmware/LUFA/Drivers/USB/Class/MIDIClass.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/Class/MassStorageClass.h b/Firmware/LUFA/Drivers/USB/Class/MassStorageClass.h index 79a0521..fa41fbf 100644 --- a/Firmware/LUFA/Drivers/USB/Class/MassStorageClass.h +++ b/Firmware/LUFA/Drivers/USB/Class/MassStorageClass.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/Class/PrinterClass.h b/Firmware/LUFA/Drivers/USB/Class/PrinterClass.h index 91121b5..78ad520 100644 --- a/Firmware/LUFA/Drivers/USB/Class/PrinterClass.h +++ b/Firmware/LUFA/Drivers/USB/Class/PrinterClass.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/Class/RNDISClass.h b/Firmware/LUFA/Drivers/USB/Class/RNDISClass.h index 1555f0d..07b4f56 100644 --- a/Firmware/LUFA/Drivers/USB/Class/RNDISClass.h +++ b/Firmware/LUFA/Drivers/USB/Class/RNDISClass.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/Class/StillImageClass.h b/Firmware/LUFA/Drivers/USB/Class/StillImageClass.h index f2ec37b..7cb8b4f 100644 --- a/Firmware/LUFA/Drivers/USB/Class/StillImageClass.h +++ b/Firmware/LUFA/Drivers/USB/Class/StillImageClass.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/Core/AVR8/Device_AVR8.c b/Firmware/LUFA/Drivers/USB/Core/AVR8/Device_AVR8.c index d23e7b8..f972b0b 100644 --- a/Firmware/LUFA/Drivers/USB/Core/AVR8/Device_AVR8.c +++ b/Firmware/LUFA/Drivers/USB/Core/AVR8/Device_AVR8.c @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/Core/AVR8/Device_AVR8.h b/Firmware/LUFA/Drivers/USB/Core/AVR8/Device_AVR8.h index 5efffe7..69f9be5 100644 --- a/Firmware/LUFA/Drivers/USB/Core/AVR8/Device_AVR8.h +++ b/Firmware/LUFA/Drivers/USB/Core/AVR8/Device_AVR8.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.c b/Firmware/LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.c index 5782824..8ffae15 100644 --- a/Firmware/LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.c +++ b/Firmware/LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.c @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.h b/Firmware/LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.h index 2032789..80e78df 100644 --- a/Firmware/LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.h +++ b/Firmware/LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.c b/Firmware/LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.c index f5d2034..92cf836 100644 --- a/Firmware/LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.c +++ b/Firmware/LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.c @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.h b/Firmware/LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.h index 1632d93..6d83752 100644 --- a/Firmware/LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.h +++ b/Firmware/LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/Core/AVR8/Host_AVR8.c b/Firmware/LUFA/Drivers/USB/Core/AVR8/Host_AVR8.c index 4e38c75..cbb7735 100644 --- a/Firmware/LUFA/Drivers/USB/Core/AVR8/Host_AVR8.c +++ b/Firmware/LUFA/Drivers/USB/Core/AVR8/Host_AVR8.c @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/Core/AVR8/Host_AVR8.h b/Firmware/LUFA/Drivers/USB/Core/AVR8/Host_AVR8.h index f0ffa5a..7a48e31 100644 --- a/Firmware/LUFA/Drivers/USB/Core/AVR8/Host_AVR8.h +++ b/Firmware/LUFA/Drivers/USB/Core/AVR8/Host_AVR8.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/Core/AVR8/OTG_AVR8.h b/Firmware/LUFA/Drivers/USB/Core/AVR8/OTG_AVR8.h index c2e8496..74c70cc 100644 --- a/Firmware/LUFA/Drivers/USB/Core/AVR8/OTG_AVR8.h +++ b/Firmware/LUFA/Drivers/USB/Core/AVR8/OTG_AVR8.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/Core/AVR8/PipeStream_AVR8.c b/Firmware/LUFA/Drivers/USB/Core/AVR8/PipeStream_AVR8.c index 47169b3..7b17d45 100644 --- a/Firmware/LUFA/Drivers/USB/Core/AVR8/PipeStream_AVR8.c +++ b/Firmware/LUFA/Drivers/USB/Core/AVR8/PipeStream_AVR8.c @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/Core/AVR8/PipeStream_AVR8.h b/Firmware/LUFA/Drivers/USB/Core/AVR8/PipeStream_AVR8.h index 264dab5..ca63bdf 100644 --- a/Firmware/LUFA/Drivers/USB/Core/AVR8/PipeStream_AVR8.h +++ b/Firmware/LUFA/Drivers/USB/Core/AVR8/PipeStream_AVR8.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/Core/AVR8/Pipe_AVR8.c b/Firmware/LUFA/Drivers/USB/Core/AVR8/Pipe_AVR8.c index fc99ae4..20239d0 100644 --- a/Firmware/LUFA/Drivers/USB/Core/AVR8/Pipe_AVR8.c +++ b/Firmware/LUFA/Drivers/USB/Core/AVR8/Pipe_AVR8.c @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/Core/AVR8/Pipe_AVR8.h b/Firmware/LUFA/Drivers/USB/Core/AVR8/Pipe_AVR8.h index bac324f..3521efb 100644 --- a/Firmware/LUFA/Drivers/USB/Core/AVR8/Pipe_AVR8.h +++ b/Firmware/LUFA/Drivers/USB/Core/AVR8/Pipe_AVR8.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/Core/AVR8/Template/Template_Endpoint_Control_R.c b/Firmware/LUFA/Drivers/USB/Core/AVR8/Template/Template_Endpoint_Control_R.c index 59c620a..f6c4beb 100644 --- a/Firmware/LUFA/Drivers/USB/Core/AVR8/Template/Template_Endpoint_Control_R.c +++ b/Firmware/LUFA/Drivers/USB/Core/AVR8/Template/Template_Endpoint_Control_R.c @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/Core/AVR8/Template/Template_Endpoint_Control_W.c b/Firmware/LUFA/Drivers/USB/Core/AVR8/Template/Template_Endpoint_Control_W.c index 9888700..922b58e 100644 --- a/Firmware/LUFA/Drivers/USB/Core/AVR8/Template/Template_Endpoint_Control_W.c +++ b/Firmware/LUFA/Drivers/USB/Core/AVR8/Template/Template_Endpoint_Control_W.c @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/Core/AVR8/Template/Template_Endpoint_RW.c b/Firmware/LUFA/Drivers/USB/Core/AVR8/Template/Template_Endpoint_RW.c index d51afdf..e55e592 100644 --- a/Firmware/LUFA/Drivers/USB/Core/AVR8/Template/Template_Endpoint_RW.c +++ b/Firmware/LUFA/Drivers/USB/Core/AVR8/Template/Template_Endpoint_RW.c @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/Core/AVR8/Template/Template_Pipe_RW.c b/Firmware/LUFA/Drivers/USB/Core/AVR8/Template/Template_Pipe_RW.c index 2685c9b..bb2a57f 100644 --- a/Firmware/LUFA/Drivers/USB/Core/AVR8/Template/Template_Pipe_RW.c +++ b/Firmware/LUFA/Drivers/USB/Core/AVR8/Template/Template_Pipe_RW.c @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.c b/Firmware/LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.c index 71c5f91..92532ab 100644 --- a/Firmware/LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.c +++ b/Firmware/LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.c @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.h b/Firmware/LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.h index de34f42..1b6e2ef 100644 --- a/Firmware/LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.h +++ b/Firmware/LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.c b/Firmware/LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.c index 7efaea6..fac4fb4 100644 --- a/Firmware/LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.c +++ b/Firmware/LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.c @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.h b/Firmware/LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.h index e6f5ff9..1eeb019 100644 --- a/Firmware/LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.h +++ b/Firmware/LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/Core/ConfigDescriptors.c b/Firmware/LUFA/Drivers/USB/Core/ConfigDescriptors.c index da6812a..d540bcf 100644 --- a/Firmware/LUFA/Drivers/USB/Core/ConfigDescriptors.c +++ b/Firmware/LUFA/Drivers/USB/Core/ConfigDescriptors.c @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/Core/ConfigDescriptors.h b/Firmware/LUFA/Drivers/USB/Core/ConfigDescriptors.h index b4a9788..5355ecf 100644 --- a/Firmware/LUFA/Drivers/USB/Core/ConfigDescriptors.h +++ b/Firmware/LUFA/Drivers/USB/Core/ConfigDescriptors.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/Core/Device.h b/Firmware/LUFA/Drivers/USB/Core/Device.h index 10d739f..81b0e17 100644 --- a/Firmware/LUFA/Drivers/USB/Core/Device.h +++ b/Firmware/LUFA/Drivers/USB/Core/Device.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted @@ -131,7 +131,7 @@ * \return Size in bytes of the descriptor if it exists, zero or \ref NO_DESCRIPTOR otherwise. */ uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue, - const uint8_t wIndex, + const uint16_t wIndex, const void** const DescriptorAddress #if (defined(ARCH_HAS_MULTI_ADDRESS_SPACE) || defined(__DOXYGEN__)) && \ !(defined(USE_FLASH_DESCRIPTORS) || defined(USE_EEPROM_DESCRIPTORS) || defined(USE_RAM_DESCRIPTORS)) diff --git a/Firmware/LUFA/Drivers/USB/Core/DeviceStandardReq.c b/Firmware/LUFA/Drivers/USB/Core/DeviceStandardReq.c index adf615a..feb092d 100644 --- a/Firmware/LUFA/Drivers/USB/Core/DeviceStandardReq.c +++ b/Firmware/LUFA/Drivers/USB/Core/DeviceStandardReq.c @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted @@ -152,8 +152,8 @@ static void USB_Device_SetConfiguration(void) #define MemoryAddressSpace MEMSPACE_FLASH #elif defined(USE_EEPROM_DESCRIPTORS) #define MemoryAddressSpace MEMSPACE_EEPROM - #elif defined(USE_SRAM_DESCRIPTORS) - #define MemoryAddressSpace MEMSPACE_SRAM + #elif defined(USE_RAM_DESCRIPTORS) + #define MemoryAddressSpace MEMSPACE_RAM #else uint8_t MemoryAddressSpace; #endif @@ -292,6 +292,7 @@ static void USB_Device_GetStatus(void) switch (USB_ControlRequest.bmRequestType) { case (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE): + { #if !defined(NO_DEVICE_SELF_POWER) if (USB_Device_CurrentlySelfPowered) CurrentStatus |= FEATURE_SELFPOWERED_ENABLED; @@ -302,9 +303,16 @@ static void USB_Device_GetStatus(void) CurrentStatus |= FEATURE_REMOTE_WAKEUP_ENABLED; #endif break; + } case (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_ENDPOINT): + { #if !defined(CONTROL_ONLY_DEVICE) - Endpoint_SelectEndpoint((uint8_t)USB_ControlRequest.wIndex & ENDPOINT_EPNUM_MASK); + uint8_t EndpointIndex = ((uint8_t)USB_ControlRequest.wIndex & ENDPOINT_EPNUM_MASK); + + if (EndpointIndex >= ENDPOINT_TOTAL_ENDPOINTS) + return; + + Endpoint_SelectEndpoint(EndpointIndex); CurrentStatus = Endpoint_IsStalled(); @@ -312,6 +320,7 @@ static void USB_Device_GetStatus(void) #endif break; + } default: return; } @@ -330,20 +339,23 @@ static void USB_Device_ClearSetFeature(void) { #if !defined(NO_DEVICE_REMOTE_WAKEUP) case REQREC_DEVICE: + { if ((uint8_t)USB_ControlRequest.wValue == FEATURE_SEL_DeviceRemoteWakeup) USB_Device_RemoteWakeupEnabled = (USB_ControlRequest.bRequest == REQ_SetFeature); else return; break; + } #endif #if !defined(CONTROL_ONLY_DEVICE) case REQREC_ENDPOINT: + { if ((uint8_t)USB_ControlRequest.wValue == FEATURE_SEL_EndpointHalt) { uint8_t EndpointIndex = ((uint8_t)USB_ControlRequest.wIndex & ENDPOINT_EPNUM_MASK); - if (EndpointIndex == ENDPOINT_CONTROLEP) + if (EndpointIndex == ENDPOINT_CONTROLEP || EndpointIndex >= ENDPOINT_TOTAL_ENDPOINTS) return; Endpoint_SelectEndpoint(EndpointIndex); @@ -364,6 +376,7 @@ static void USB_Device_ClearSetFeature(void) } break; + } #endif default: return; diff --git a/Firmware/LUFA/Drivers/USB/Core/DeviceStandardReq.h b/Firmware/LUFA/Drivers/USB/Core/DeviceStandardReq.h index 396e205..14badcd 100644 --- a/Firmware/LUFA/Drivers/USB/Core/DeviceStandardReq.h +++ b/Firmware/LUFA/Drivers/USB/Core/DeviceStandardReq.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/Core/Endpoint.h b/Firmware/LUFA/Drivers/USB/Core/Endpoint.h index bf41376..b577f63 100644 --- a/Firmware/LUFA/Drivers/USB/Core/Endpoint.h +++ b/Firmware/LUFA/Drivers/USB/Core/Endpoint.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/Core/EndpointStream.h b/Firmware/LUFA/Drivers/USB/Core/EndpointStream.h index 5675c32..156d155 100644 --- a/Firmware/LUFA/Drivers/USB/Core/EndpointStream.h +++ b/Firmware/LUFA/Drivers/USB/Core/EndpointStream.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/Core/Events.c b/Firmware/LUFA/Drivers/USB/Core/Events.c index a63b002..1865579 100644 --- a/Firmware/LUFA/Drivers/USB/Core/Events.c +++ b/Firmware/LUFA/Drivers/USB/Core/Events.c @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/Core/Events.h b/Firmware/LUFA/Drivers/USB/Core/Events.h index 9c85112..57fd0d9 100644 --- a/Firmware/LUFA/Drivers/USB/Core/Events.h +++ b/Firmware/LUFA/Drivers/USB/Core/Events.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/Core/Host.h b/Firmware/LUFA/Drivers/USB/Core/Host.h index 6146cc5..50410b2 100644 --- a/Firmware/LUFA/Drivers/USB/Core/Host.h +++ b/Firmware/LUFA/Drivers/USB/Core/Host.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/Core/HostStandardReq.c b/Firmware/LUFA/Drivers/USB/Core/HostStandardReq.c index 4a21ce7..42a934d 100644 --- a/Firmware/LUFA/Drivers/USB/Core/HostStandardReq.c +++ b/Firmware/LUFA/Drivers/USB/Core/HostStandardReq.c @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/Core/HostStandardReq.h b/Firmware/LUFA/Drivers/USB/Core/HostStandardReq.h index bd67bcb..6654269 100644 --- a/Firmware/LUFA/Drivers/USB/Core/HostStandardReq.h +++ b/Firmware/LUFA/Drivers/USB/Core/HostStandardReq.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/Core/OTG.h b/Firmware/LUFA/Drivers/USB/Core/OTG.h index 58d47ba..6293e4c 100644 --- a/Firmware/LUFA/Drivers/USB/Core/OTG.h +++ b/Firmware/LUFA/Drivers/USB/Core/OTG.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/Core/Pipe.h b/Firmware/LUFA/Drivers/USB/Core/Pipe.h index ca3fdbe..0697078 100644 --- a/Firmware/LUFA/Drivers/USB/Core/Pipe.h +++ b/Firmware/LUFA/Drivers/USB/Core/Pipe.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/Core/PipeStream.h b/Firmware/LUFA/Drivers/USB/Core/PipeStream.h index 2399696..8785302 100644 --- a/Firmware/LUFA/Drivers/USB/Core/PipeStream.h +++ b/Firmware/LUFA/Drivers/USB/Core/PipeStream.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/Core/StdDescriptors.h b/Firmware/LUFA/Drivers/USB/Core/StdDescriptors.h index e0a1a37..381c02c 100644 --- a/Firmware/LUFA/Drivers/USB/Core/StdDescriptors.h +++ b/Firmware/LUFA/Drivers/USB/Core/StdDescriptors.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/Core/StdRequestType.h b/Firmware/LUFA/Drivers/USB/Core/StdRequestType.h index b2506cd..7297806 100644 --- a/Firmware/LUFA/Drivers/USB/Core/StdRequestType.h +++ b/Firmware/LUFA/Drivers/USB/Core/StdRequestType.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/Core/UC3/Device_UC3.c b/Firmware/LUFA/Drivers/USB/Core/UC3/Device_UC3.c index 6f6de3f..3aa1433 100644 --- a/Firmware/LUFA/Drivers/USB/Core/UC3/Device_UC3.c +++ b/Firmware/LUFA/Drivers/USB/Core/UC3/Device_UC3.c @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/Core/UC3/Device_UC3.h b/Firmware/LUFA/Drivers/USB/Core/UC3/Device_UC3.h index 5579ea0..fd6dbde 100644 --- a/Firmware/LUFA/Drivers/USB/Core/UC3/Device_UC3.h +++ b/Firmware/LUFA/Drivers/USB/Core/UC3/Device_UC3.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/Core/UC3/EndpointStream_UC3.c b/Firmware/LUFA/Drivers/USB/Core/UC3/EndpointStream_UC3.c index 6e98629..04f6e97 100644 --- a/Firmware/LUFA/Drivers/USB/Core/UC3/EndpointStream_UC3.c +++ b/Firmware/LUFA/Drivers/USB/Core/UC3/EndpointStream_UC3.c @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/Core/UC3/EndpointStream_UC3.h b/Firmware/LUFA/Drivers/USB/Core/UC3/EndpointStream_UC3.h index 831c714..8b1c10e 100644 --- a/Firmware/LUFA/Drivers/USB/Core/UC3/EndpointStream_UC3.h +++ b/Firmware/LUFA/Drivers/USB/Core/UC3/EndpointStream_UC3.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/Core/UC3/Endpoint_UC3.c b/Firmware/LUFA/Drivers/USB/Core/UC3/Endpoint_UC3.c index 5dce488..7e24672 100644 --- a/Firmware/LUFA/Drivers/USB/Core/UC3/Endpoint_UC3.c +++ b/Firmware/LUFA/Drivers/USB/Core/UC3/Endpoint_UC3.c @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/Core/UC3/Endpoint_UC3.h b/Firmware/LUFA/Drivers/USB/Core/UC3/Endpoint_UC3.h index cf35d2b..32d6a9b 100644 --- a/Firmware/LUFA/Drivers/USB/Core/UC3/Endpoint_UC3.h +++ b/Firmware/LUFA/Drivers/USB/Core/UC3/Endpoint_UC3.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/Core/UC3/Host_UC3.c b/Firmware/LUFA/Drivers/USB/Core/UC3/Host_UC3.c index 7780752..2c182ab 100644 --- a/Firmware/LUFA/Drivers/USB/Core/UC3/Host_UC3.c +++ b/Firmware/LUFA/Drivers/USB/Core/UC3/Host_UC3.c @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/Core/UC3/Host_UC3.h b/Firmware/LUFA/Drivers/USB/Core/UC3/Host_UC3.h index eb803b0..5338f72 100644 --- a/Firmware/LUFA/Drivers/USB/Core/UC3/Host_UC3.h +++ b/Firmware/LUFA/Drivers/USB/Core/UC3/Host_UC3.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/Core/UC3/PipeStream_UC3.c b/Firmware/LUFA/Drivers/USB/Core/UC3/PipeStream_UC3.c index 7dfe448..27426ad 100644 --- a/Firmware/LUFA/Drivers/USB/Core/UC3/PipeStream_UC3.c +++ b/Firmware/LUFA/Drivers/USB/Core/UC3/PipeStream_UC3.c @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/Core/UC3/PipeStream_UC3.h b/Firmware/LUFA/Drivers/USB/Core/UC3/PipeStream_UC3.h index 4dd79c9..cc34442 100644 --- a/Firmware/LUFA/Drivers/USB/Core/UC3/PipeStream_UC3.h +++ b/Firmware/LUFA/Drivers/USB/Core/UC3/PipeStream_UC3.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/Core/UC3/Pipe_UC3.c b/Firmware/LUFA/Drivers/USB/Core/UC3/Pipe_UC3.c index a24c7b1..73cf360 100644 --- a/Firmware/LUFA/Drivers/USB/Core/UC3/Pipe_UC3.c +++ b/Firmware/LUFA/Drivers/USB/Core/UC3/Pipe_UC3.c @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/Core/UC3/Pipe_UC3.h b/Firmware/LUFA/Drivers/USB/Core/UC3/Pipe_UC3.h index 1a0ada8..12e0dcd 100644 --- a/Firmware/LUFA/Drivers/USB/Core/UC3/Pipe_UC3.h +++ b/Firmware/LUFA/Drivers/USB/Core/UC3/Pipe_UC3.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/Core/UC3/Template/Template_Endpoint_Control_R.c b/Firmware/LUFA/Drivers/USB/Core/UC3/Template/Template_Endpoint_Control_R.c index 59c620a..f6c4beb 100644 --- a/Firmware/LUFA/Drivers/USB/Core/UC3/Template/Template_Endpoint_Control_R.c +++ b/Firmware/LUFA/Drivers/USB/Core/UC3/Template/Template_Endpoint_Control_R.c @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/Core/UC3/Template/Template_Endpoint_Control_W.c b/Firmware/LUFA/Drivers/USB/Core/UC3/Template/Template_Endpoint_Control_W.c index 9888700..922b58e 100644 --- a/Firmware/LUFA/Drivers/USB/Core/UC3/Template/Template_Endpoint_Control_W.c +++ b/Firmware/LUFA/Drivers/USB/Core/UC3/Template/Template_Endpoint_Control_W.c @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/Core/UC3/Template/Template_Endpoint_RW.c b/Firmware/LUFA/Drivers/USB/Core/UC3/Template/Template_Endpoint_RW.c index d51afdf..e55e592 100644 --- a/Firmware/LUFA/Drivers/USB/Core/UC3/Template/Template_Endpoint_RW.c +++ b/Firmware/LUFA/Drivers/USB/Core/UC3/Template/Template_Endpoint_RW.c @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/Core/UC3/Template/Template_Pipe_RW.c b/Firmware/LUFA/Drivers/USB/Core/UC3/Template/Template_Pipe_RW.c index 2685c9b..bb2a57f 100644 --- a/Firmware/LUFA/Drivers/USB/Core/UC3/Template/Template_Pipe_RW.c +++ b/Firmware/LUFA/Drivers/USB/Core/UC3/Template/Template_Pipe_RW.c @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/Core/UC3/USBController_UC3.c b/Firmware/LUFA/Drivers/USB/Core/UC3/USBController_UC3.c index fda0ddc..2b1e9ac 100644 --- a/Firmware/LUFA/Drivers/USB/Core/UC3/USBController_UC3.c +++ b/Firmware/LUFA/Drivers/USB/Core/UC3/USBController_UC3.c @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/Core/UC3/USBController_UC3.h b/Firmware/LUFA/Drivers/USB/Core/UC3/USBController_UC3.h index 2e82458..32c2f6e 100644 --- a/Firmware/LUFA/Drivers/USB/Core/UC3/USBController_UC3.h +++ b/Firmware/LUFA/Drivers/USB/Core/UC3/USBController_UC3.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/Core/UC3/USBInterrupt_UC3.c b/Firmware/LUFA/Drivers/USB/Core/UC3/USBInterrupt_UC3.c index 83ada8c..3b3958a 100644 --- a/Firmware/LUFA/Drivers/USB/Core/UC3/USBInterrupt_UC3.c +++ b/Firmware/LUFA/Drivers/USB/Core/UC3/USBInterrupt_UC3.c @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/Core/UC3/USBInterrupt_UC3.h b/Firmware/LUFA/Drivers/USB/Core/UC3/USBInterrupt_UC3.h index ddd5389..e2f67bf 100644 --- a/Firmware/LUFA/Drivers/USB/Core/UC3/USBInterrupt_UC3.h +++ b/Firmware/LUFA/Drivers/USB/Core/UC3/USBInterrupt_UC3.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/Core/USBController.h b/Firmware/LUFA/Drivers/USB/Core/USBController.h index c1d74c3..5980a37 100644 --- a/Firmware/LUFA/Drivers/USB/Core/USBController.h +++ b/Firmware/LUFA/Drivers/USB/Core/USBController.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/Core/USBInterrupt.h b/Firmware/LUFA/Drivers/USB/Core/USBInterrupt.h index 3dcfd5f..b00ef7b 100644 --- a/Firmware/LUFA/Drivers/USB/Core/USBInterrupt.h +++ b/Firmware/LUFA/Drivers/USB/Core/USBInterrupt.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/Core/USBMode.h b/Firmware/LUFA/Drivers/USB/Core/USBMode.h index 09cf307..2044f89 100644 --- a/Firmware/LUFA/Drivers/USB/Core/USBMode.h +++ b/Firmware/LUFA/Drivers/USB/Core/USBMode.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/Core/USBTask.c b/Firmware/LUFA/Drivers/USB/Core/USBTask.c index 30a3cd6..329ff4a 100644 --- a/Firmware/LUFA/Drivers/USB/Core/USBTask.c +++ b/Firmware/LUFA/Drivers/USB/Core/USBTask.c @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/Core/USBTask.h b/Firmware/LUFA/Drivers/USB/Core/USBTask.h index 7205ea1..77cee65 100644 --- a/Firmware/LUFA/Drivers/USB/Core/USBTask.h +++ b/Firmware/LUFA/Drivers/USB/Core/USBTask.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/Core/XMEGA/Device_XMEGA.c b/Firmware/LUFA/Drivers/USB/Core/XMEGA/Device_XMEGA.c index 10c3279..470e128 100644 --- a/Firmware/LUFA/Drivers/USB/Core/XMEGA/Device_XMEGA.c +++ b/Firmware/LUFA/Drivers/USB/Core/XMEGA/Device_XMEGA.c @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/Core/XMEGA/Device_XMEGA.h b/Firmware/LUFA/Drivers/USB/Core/XMEGA/Device_XMEGA.h index b203e10..759ff35 100644 --- a/Firmware/LUFA/Drivers/USB/Core/XMEGA/Device_XMEGA.h +++ b/Firmware/LUFA/Drivers/USB/Core/XMEGA/Device_XMEGA.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/Core/XMEGA/EndpointStream_XMEGA.c b/Firmware/LUFA/Drivers/USB/Core/XMEGA/EndpointStream_XMEGA.c index 421d717..6413281 100644 --- a/Firmware/LUFA/Drivers/USB/Core/XMEGA/EndpointStream_XMEGA.c +++ b/Firmware/LUFA/Drivers/USB/Core/XMEGA/EndpointStream_XMEGA.c @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/Core/XMEGA/EndpointStream_XMEGA.h b/Firmware/LUFA/Drivers/USB/Core/XMEGA/EndpointStream_XMEGA.h index cba6537..3c094da 100644 --- a/Firmware/LUFA/Drivers/USB/Core/XMEGA/EndpointStream_XMEGA.h +++ b/Firmware/LUFA/Drivers/USB/Core/XMEGA/EndpointStream_XMEGA.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/Core/XMEGA/Endpoint_XMEGA.c b/Firmware/LUFA/Drivers/USB/Core/XMEGA/Endpoint_XMEGA.c index 8155ecf..470f57e 100644 --- a/Firmware/LUFA/Drivers/USB/Core/XMEGA/Endpoint_XMEGA.c +++ b/Firmware/LUFA/Drivers/USB/Core/XMEGA/Endpoint_XMEGA.c @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/Core/XMEGA/Endpoint_XMEGA.h b/Firmware/LUFA/Drivers/USB/Core/XMEGA/Endpoint_XMEGA.h index 42c476b..db7d840 100644 --- a/Firmware/LUFA/Drivers/USB/Core/XMEGA/Endpoint_XMEGA.h +++ b/Firmware/LUFA/Drivers/USB/Core/XMEGA/Endpoint_XMEGA.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/Core/XMEGA/Host_XMEGA.c b/Firmware/LUFA/Drivers/USB/Core/XMEGA/Host_XMEGA.c index c467733..b8b8c46 100644 --- a/Firmware/LUFA/Drivers/USB/Core/XMEGA/Host_XMEGA.c +++ b/Firmware/LUFA/Drivers/USB/Core/XMEGA/Host_XMEGA.c @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/Core/XMEGA/PipeStream_XMEGA.c b/Firmware/LUFA/Drivers/USB/Core/XMEGA/PipeStream_XMEGA.c index c467733..b8b8c46 100644 --- a/Firmware/LUFA/Drivers/USB/Core/XMEGA/PipeStream_XMEGA.c +++ b/Firmware/LUFA/Drivers/USB/Core/XMEGA/PipeStream_XMEGA.c @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/Core/XMEGA/Pipe_XMEGA.c b/Firmware/LUFA/Drivers/USB/Core/XMEGA/Pipe_XMEGA.c index 69f369e..bb92b1d 100644 --- a/Firmware/LUFA/Drivers/USB/Core/XMEGA/Pipe_XMEGA.c +++ b/Firmware/LUFA/Drivers/USB/Core/XMEGA/Pipe_XMEGA.c @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/Core/XMEGA/Template/Template_Endpoint_Control_R.c b/Firmware/LUFA/Drivers/USB/Core/XMEGA/Template/Template_Endpoint_Control_R.c index 0bd3843..c923f31 100644 --- a/Firmware/LUFA/Drivers/USB/Core/XMEGA/Template/Template_Endpoint_Control_R.c +++ b/Firmware/LUFA/Drivers/USB/Core/XMEGA/Template/Template_Endpoint_Control_R.c @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/Core/XMEGA/Template/Template_Endpoint_Control_W.c b/Firmware/LUFA/Drivers/USB/Core/XMEGA/Template/Template_Endpoint_Control_W.c index 703f253..b32de81 100644 --- a/Firmware/LUFA/Drivers/USB/Core/XMEGA/Template/Template_Endpoint_Control_W.c +++ b/Firmware/LUFA/Drivers/USB/Core/XMEGA/Template/Template_Endpoint_Control_W.c @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/Core/XMEGA/Template/Template_Endpoint_RW.c b/Firmware/LUFA/Drivers/USB/Core/XMEGA/Template/Template_Endpoint_RW.c index d51afdf..e55e592 100644 --- a/Firmware/LUFA/Drivers/USB/Core/XMEGA/Template/Template_Endpoint_RW.c +++ b/Firmware/LUFA/Drivers/USB/Core/XMEGA/Template/Template_Endpoint_RW.c @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/Core/XMEGA/USBController_XMEGA.c b/Firmware/LUFA/Drivers/USB/Core/XMEGA/USBController_XMEGA.c index 9958980..4eea57a 100644 --- a/Firmware/LUFA/Drivers/USB/Core/XMEGA/USBController_XMEGA.c +++ b/Firmware/LUFA/Drivers/USB/Core/XMEGA/USBController_XMEGA.c @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/Core/XMEGA/USBController_XMEGA.h b/Firmware/LUFA/Drivers/USB/Core/XMEGA/USBController_XMEGA.h index 15d4eec..6bab03a 100644 --- a/Firmware/LUFA/Drivers/USB/Core/XMEGA/USBController_XMEGA.h +++ b/Firmware/LUFA/Drivers/USB/Core/XMEGA/USBController_XMEGA.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/Core/XMEGA/USBInterrupt_XMEGA.c b/Firmware/LUFA/Drivers/USB/Core/XMEGA/USBInterrupt_XMEGA.c index f03f3f2..a82dde0 100644 --- a/Firmware/LUFA/Drivers/USB/Core/XMEGA/USBInterrupt_XMEGA.c +++ b/Firmware/LUFA/Drivers/USB/Core/XMEGA/USBInterrupt_XMEGA.c @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/Core/XMEGA/USBInterrupt_XMEGA.h b/Firmware/LUFA/Drivers/USB/Core/XMEGA/USBInterrupt_XMEGA.h index e224e22..54ee7f1 100644 --- a/Firmware/LUFA/Drivers/USB/Core/XMEGA/USBInterrupt_XMEGA.h +++ b/Firmware/LUFA/Drivers/USB/Core/XMEGA/USBInterrupt_XMEGA.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Drivers/USB/USB.h b/Firmware/LUFA/Drivers/USB/USB.h index a8df26f..87c098c 100644 --- a/Firmware/LUFA/Drivers/USB/USB.h +++ b/Firmware/LUFA/Drivers/USB/USB.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/License.txt b/Firmware/LUFA/License.txt index 8d4ad75..f89d606 100644 --- a/Firmware/LUFA/License.txt +++ b/Firmware/LUFA/License.txt @@ -1,5 +1,5 @@ LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org diff --git a/Firmware/LUFA/Platform/Platform.h b/Firmware/LUFA/Platform/Platform.h index a9eedeb..9997d79 100644 --- a/Firmware/LUFA/Platform/Platform.h +++ b/Firmware/LUFA/Platform/Platform.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Platform/UC3/ClockManagement.h b/Firmware/LUFA/Platform/UC3/ClockManagement.h index fb06262..5f286d5 100644 --- a/Firmware/LUFA/Platform/UC3/ClockManagement.h +++ b/Firmware/LUFA/Platform/UC3/ClockManagement.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Platform/UC3/Exception.S b/Firmware/LUFA/Platform/UC3/Exception.S index 3a5f240..59f16f1 100644 --- a/Firmware/LUFA/Platform/UC3/Exception.S +++ b/Firmware/LUFA/Platform/UC3/Exception.S @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Platform/UC3/InterruptManagement.c b/Firmware/LUFA/Platform/UC3/InterruptManagement.c index 80d193f..b99be24 100644 --- a/Firmware/LUFA/Platform/UC3/InterruptManagement.c +++ b/Firmware/LUFA/Platform/UC3/InterruptManagement.c @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Platform/UC3/InterruptManagement.h b/Firmware/LUFA/Platform/UC3/InterruptManagement.h index 90198cd..b051930 100644 --- a/Firmware/LUFA/Platform/UC3/InterruptManagement.h +++ b/Firmware/LUFA/Platform/UC3/InterruptManagement.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/Platform/XMEGA/ClockManagement.h b/Firmware/LUFA/Platform/XMEGA/ClockManagement.h index 9edaa72..eb941d9 100644 --- a/Firmware/LUFA/Platform/XMEGA/ClockManagement.h +++ b/Firmware/LUFA/Platform/XMEGA/ClockManagement.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted diff --git a/Firmware/LUFA/StudioIntegration/Docbook/mshelp/README.txt b/Firmware/LUFA/StudioIntegration/Docbook/mshelp/README.txt new file mode 100644 index 0000000..4f251cc --- /dev/null +++ b/Firmware/LUFA/StudioIntegration/Docbook/mshelp/README.txt @@ -0,0 +1,13 @@ +This is a modified/updated version of the Microsoft HV1 Docbook transform, written by Morten Engelhardt Olsen, + +Originally posted at http://sourceforge.net/p/docbook/feature-requests/461/, this has been further updated by Morten to make it compatible with more recent DocBook versions. + + --------------------------- +/ This documentation system \ +\ is udderly ridiculous! / + --------------------------- + \ ^__^ + \ (oo)\_______ + (__)\ )\/\ + ||----w | + || || diff --git a/Firmware/LUFA/StudioIntegration/Docbook/mshelp/docbook.xsl b/Firmware/LUFA/StudioIntegration/Docbook/mshelp/docbook.xsl new file mode 100644 index 0000000..03b81fe --- /dev/null +++ b/Firmware/LUFA/StudioIntegration/Docbook/mshelp/docbook.xsl @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Firmware/LUFA/StudioIntegration/Docbook/mshelp/hv1-common.xsl b/Firmware/LUFA/StudioIntegration/Docbook/mshelp/hv1-common.xsl new file mode 100644 index 0000000..b6f2610 --- /dev/null +++ b/Firmware/LUFA/StudioIntegration/Docbook/mshelp/hv1-common.xsl @@ -0,0 +1,664 @@ + + + + + + + + + + + + + + + + + + + + + + en-US + + + + + + + + + + + + + + + + + en-US + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + + + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+ + + + + +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + bk + + + + + + + + + + + + ar + + + + + + + + + + + + pr + + + + + + + + + + + + ch + + + + + + + + + + + + ap + + + + + + + + + + + + + + + + pt + + + + + + + + + + + + + + + + rn + + + + + + + + + + + + + + + re + + + + + + + + + + + + + + + + co + + + + + + + + s + + + + + + + + + + + + + + + + bi + + + + + + + + + + + + + + + + go + + + + + + + + + + + + + + + + ix + + + + + si + + + + + chunk-filename-error- + + + + + + + + + + + + + + + + + + + + + + + + + $product.name needs to be set to generate ms.help style links + + + + + $product.version needs to be set to generate ms.help style links + + + + + $product.locale needs to be set to generate ms.help style links + + + + ms.help?method=page&id= + + &product= + + &productVersion= + + &locale= + + + + # + + + + + + ms-xhelp:///?Id= + + + + + + + + + + + + + + preserve + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + : + + , + + + + + + + , + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/Firmware/LUFA/StudioIntegration/Docbook/placeholder.txt b/Firmware/LUFA/StudioIntegration/Docbook/placeholder.txt index dd69b7e..c017acf 100644 --- a/Firmware/LUFA/StudioIntegration/Docbook/placeholder.txt +++ b/Firmware/LUFA/StudioIntegration/Docbook/placeholder.txt @@ -1 +1 @@ -Copy the Docbook XSLT docbook-xsl-1.78.1 release contents into this directory (i.e. with the root Docbook files in the current folder). The Docbook releases can be found at http://sourceforge.net/projects/docbook/files/docbook-xsl/ . +Copy the Docbook XSLT docbook-xsl-1.78.1 release contents into this directory (i.e. with the root Docbook files in the current folder). The Docbook releases can be found at http://sourceforge.net/projects/docbook/files/docbook-xsl/ . diff --git a/Firmware/LUFA/StudioIntegration/HV1/helpcontentsetup.msha b/Firmware/LUFA/StudioIntegration/HV1/helpcontentsetup.msha index cb1c4b9..bd1d7ee 100644 --- a/Firmware/LUFA/StudioIntegration/HV1/helpcontentsetup.msha +++ b/Firmware/LUFA/StudioIntegration/HV1/helpcontentsetup.msha @@ -1,6 +1,6 @@ - + + @@ -25,19 +25,23 @@ - + + + + + + + + + - lufa_help_ - - .mshc + - lufa_help_ - - .mshc + diff --git a/Firmware/LUFA/StudioIntegration/HV1/lufa_hv1_transform.xslt b/Firmware/LUFA/StudioIntegration/HV1/lufa_hv1_transform.xslt index 8aa4a94..e7e2301 100644 --- a/Firmware/LUFA/StudioIntegration/HV1/lufa_hv1_transform.xslt +++ b/Firmware/LUFA/StudioIntegration/HV1/lufa_hv1_transform.xslt @@ -1,45 +1,45 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Firmware/LUFA/StudioIntegration/HV1/lufa_studio_help_styling.css b/Firmware/LUFA/StudioIntegration/HV1/lufa_studio_help_styling.css index 0b6ccbd..a4a025c 100644 --- a/Firmware/LUFA/StudioIntegration/HV1/lufa_studio_help_styling.css +++ b/Firmware/LUFA/StudioIntegration/HV1/lufa_studio_help_styling.css @@ -1,53 +1,53 @@ -/* - LUFA Library - Copyright (C) Dean Camera, 2013. - - dean [at] fourwalledcubicle [dot] com - www.lufa-lib.org -*/ - -.programlisting { - display: block; - margin-left: 15px; - padding: 10px; - background-color: #f4f4f4; - border: 1px solid #aaaaaa; - font-family: "Consolas", "Courier New", sans-serif; - } - - code { - background-color: #f4f4f4; - font-family: "Consolas", "Courier New", sans-serif; - } - -.note, .warning, .tip { - display: block; - margin-left: 15px; - padding-left: 10px; - padding-bottom: 5px; - background-color: #f4f4f4; - border: 1px solid #aaaaaa; -} - -table { - border: 1px solid #aaaaaa; - border-collapse: collapse; - margin-left: 15px; - font-size: 10pt; -} - -table thead { - background-color: #f4f4f4; -} - -table thead th { - padding: 5px; -} - -table tbody td { - padding: 5px; -} - -ul { - padding-left: 20px; -} +/* + LUFA Library + Copyright (C) Dean Camera, 2017. + + dean [at] fourwalledcubicle [dot] com + www.lufa-lib.org +*/ + +.programlisting { + display: block; + margin-left: 15px; + padding: 10px; + background-color: #f4f4f4; + border: 1px solid #aaaaaa; + font-family: "Consolas", "Courier New", sans-serif; + } + + code { + background-color: #f4f4f4; + font-family: "Consolas", "Courier New", sans-serif; + } + +.note, .warning, .tip { + display: block; + margin-left: 15px; + padding-left: 10px; + padding-bottom: 5px; + background-color: #f4f4f4; + border: 1px solid #aaaaaa; +} + +table { + border: 1px solid #aaaaaa; + border-collapse: collapse; + margin-left: 15px; + font-size: 10pt; +} + +table thead { + background-color: #f4f4f4; +} + +table thead th { + padding: 5px; +} + +table tbody td { + padding: 5px; +} + +ul { + padding-left: 20px; +} diff --git a/Firmware/LUFA/StudioIntegration/VSIX/LUFA.dll b/Firmware/LUFA/StudioIntegration/VSIX/LUFA.dll new file mode 100644 index 0000000000000000000000000000000000000000..369c78178b1080c0e0df9adb4c6c0e8c03f68f79 GIT binary patch literal 785920 zcmd?S2UwFy*FQW7Nq|rjs)~XI4OOZls{+zhkZM;9Bw#cUOajUx3U*XftZP@)73>Xr zFKb(S*R`*G?Y-guH}{n1TNe3Q=tCxYe9&Fh16BGpFORhDm)D8mDZvDnl*JbV`$EWvR4Isd6WE zPL`7*%PFi=qEn_yCigTm6E@M2jteKGBgcTapNr_M@9hR@NFr3-oPU> zQSZ>E#$Pa|%Tp~^s!)-U4tSS5xYq+g>EVdvQ|7J zl?$FCp2QUovulo4e0y~>4#~DF5u0;s1iUc1sZRpRX(&7a;fKK zK&bA6SrJzPVGFel(3Mc&6#VMT7yI$ukx}^p-SnD4(`!V>lPR%wA_kQ02)2X#`sh;S z&l0r)&1lf1f820LfIzqeGNH3TT!)}9o&itN0<|SAX_H!*fbTG^D8^Gg7b7gBZCyvP zg5aLC1<4w7NV5g#kLTK*n@^vrKr~hT0w8HkiGUOEHWysbKkkq=Ko%II;=d8((Q<Uz@?I=2wqBUWF1z3#e6+#hc!f775 z20|37pr%4sA6*9eBy{b}W;{5qIxLol(ACO|OGaTF7^$d61-5`*rkDVMz(?d}Emk+abE``HMvb zogiSUgzBT17*!lnuIk8~kM&2xo*@yKA1g4jgr4=5Z0A@NiRs4+eR)5T^J z^;t<0QoOufj zS1`Z~!HOryr_`(jB7wW1NMPq_@8&MzsfVGKv7{TVhLr`Q;N}4ApWk5x8Vp1DtEMNd z#24}HRK1WA@g*WKqw3A1MLbmslTg>?qwhXQYcSseD?^c?pa7NqFJbo zP<_vcWZOChOZpA{s)Mu7Rc>h9eYs)PqMfuJ%#}%(7(_#+4_~^hYiDP1H*HSuJip z6@;NmiK^7DQF+km7r4TEP*JH5qNysA7N>IasaRE6$f&OZZL5NSF~zkC%!JhitW9qU z-eEjNuyrAzY*Ld<3~C!Pi%w6h0XN?oy|^~QBr%CVt{s!$O0p>ztA;>@cpeSZ%hB|t z2~`6+!>R!Q8Z|&6EoUmZ)*S-3!*gxGEo7dZC5_O(`Y{?Z1u6|C$oL&BTjq}|(E|5l z?_~#C@G|tldYK$lEr6=PIWVwF-~#%ZT%c700c_PT(N%T4LIn(E;;GE2fEoXe1w&&$ z`1e6fzgSu9cqDnq=g_S1nsHN&6Iuwb5$;J4*QxZcw1OwHCR{_V23!dWpujw?Kx0bN zv?E(}eUn-Y=+?4;*f$`?n0XG>Em*2r^CJmHdv|YJbtg2|TPQ45t+L_H1 zS8Zp8nju@m&RFW~jKEL=XC`d51EaB3w==J1U7#vJ0r)p$6HE}t(5_!XJ(9Dnn)ZPT zOgClD_PS>s^$L)wtFzID)t-@|l?bBjf^)VP)GVtbP*s;Pp;Vc3T^-4Kx~GGBs0F%| z3;_|H!SvD%#8y4V@;@+7WyvFO2LuWt;+{m5!D@}Ion$DGITRrjxVI3fe35ncWS>m< zXsdn(^3_VIDnyN@0u{WiK%hb_AaJ!;yNYU7!A#Ts&Z9r9H|S~+n*4Z;z$pI2?!qo2 zs0svqy&W)YH5wE(!$8c`NHQD`)d&Ei#=zoF6090YvuZV%5!ibgsz)K=##c|r!;o?1 zs!^!G&2IqGD$uH#RE(&qdB>}Z`OwEF%!PSZ2S&$>pP6Om7Y#2SK>v*S|wy7>}(GJFXB2!IWWNeIFF;R8zpJnX!AQ zF=LJx&Kb92q?(En_h!cGIBVUA7`&KMWlP;AlVR%ER&m@oc0xCCHCfd(O4Uxt5;amy zN0ud2yE(<B&= zyIENDNk$SZWjAJxcSHXODMdf&{71(-U}h(%ignDOijhrC&s2*!*T6cC=Ima$IWkuoMaA?uD5K}y+J@9)NrdeN&4Lnm)TjV=Aw4ZXxdW)Ef*AGee+z~CAM$J zVa`j~GqhYkPcKhjFJEt17izhbfNQJ>X$B}xDkMuShFS>8ZPTF^0^(-wVQNm!aZYmtXI%tN5P>LkJ2fyI?ZW7&RCjp!5c&8FoW;NKg}^G zYs_db{TTd4u7_y@5@Q}LYC!C)g2CrNv4?3RvcbH!xtMqxTr?4o!IrenN{$Bb9+$#D zj8>b7$zqf?AjyWS0lzR%BPg~Mkg<@Pfb_JWqYg2j4f)uaUIjnL__U@7HN|9`;YC1e z0j1xE?_nw?OOY0nAx0GT!RW-KGlMyfUd)LMBWg-Grt8J7L?n7@-jw`dxnA6q3^Ae5 z-`vg0lME0~w`xGtLMq#Bkgb5YV$=e%+J<5-GID-RydaZK91l|;V#MR4PNwiGq!DaE zdAN^$Tac|*`Nl2C8H;>6Q;@$c*~6i7b^~QG@exvfj$x+E$!|7PlFlM3^NHZloTOM% zc*B}PW26P7DKqv7)~nIV#)4vgLGJ=`mzm}In0L&DHJ!o5n8CUv*qTDV6@`aQkBS4y zTFgaT;%A^iFMo?E<(Gg0a@FRtnK|)cdOV6A8<6^_<4GK?rb8Nb*3+$;lHS&Cfd80L z=)k8iS4g1&#|^T2iP>*TBF$*c1CXRAd1FD-F-+SrCT>DQSe0e;RA; zhO?J~epHQ`uDTqJ$)brHJ|jWJA2uVJc#sanprIvkhvA7PzQ|E3ZN-#|KZymOd#xk* zB9g(p>uUmEj{Kd2-v?|# zK3hpa&C4wPE1j+e{gBQ!PywoqwV;q;JP36XO!EO3@C(1zOtTt^(uLx&Oq~f|@sxrA zS!g*KFwABKN{4U<@mr8k({#RoEC%NS0iQdE-??yz*?hn)#uQdr&gbj#?>LKqdBeba zfC6&Hj6ws8rGWJ~D^R+ap|HT5(%EJ}VM7}V$C@z^_!gv?vxaX=)SL}pDYr7;f;#0U z6k6GA;m0{)63BFtXto1(9iOrGEuuVAs)#V1j7IDcMCRc>$ zj^_3=x#=WOxR=kZMUzkJG@?C}+6zTT`F!Hc75KVzs(mCBf3E% zrR0{uQN9Uj!Q`fsoo2U@t0@UnlFQa)xHcstm>lK$0pFAiYDTFPk!uz&_~zuME;oaG z;9HU>y4*eFpu!TiW(em4->8FKa{oymR`+j)FoNETsPx-q%IlA z=9pQjr{iBh(dDM{#mMc^<(6305jc>GOpcug2hz@k z^2y5Dfy6Pn{UjKc-GQ8Caz*4FvXwG$hngJx||nQLe^hF$%#0YBv zBBZWN?k4A`RWNdf*r!om3ZRbx#G1)XH&XJJastR;U9O24&DGSU0P?r4tc2T45J0wj zQ!3L*Ycn_GYSwH;TKh0%Mor9ouo0i|nrx5;y2WqXf=aJL{Ly~JH_^_bk`ezbfAm~KYlM&noH0e6zk z2lAY|A5-$4+sK;7ap8!KjX4jvSytv8jzON4HOJV1C#uU48O$?v;?&Wl8}plS8Zu+A z1L(=A!|8x%*~Nf*sydv9=+TAK$)+u+xr+#Dwy+69`lwknCxp{MoQ(Q=U|AnLOTsx!o&!>z(>NgphWvhX2;S?DhUxqV^x>Ckda%3!7aWM@YJg`1g<&Ka)SWwVe-@_02aGB1PMU-1i2#))ic19+iNIm&#qst-~u8uH}Xptg`Hfd4FrY zjZkSH=7I$wB{M3eL(2ZVV zz|KQL4jPyvs&30OCthSUpdUHOGa}NCUvBq%q(e2D5;{EM_nphy?h}!~<|U z@d4aTS_1ATtpN{_5WtH}tG}35H_*xxyL1`+oE6CgtVhNJHYU>m-N*?*UvdfX7Y2rs z>qvKC@QDnj2Lsa>*q?zK@&(PTNfC5$HP$$McMnL>6LDacXuGJ?zo z55-J+HyMX?C}$BUq;a;9dq!!TeZZt~D1JES43QWQ=S(3{fL9P_59iz_^8g=_+kh|0 zpTfpmrX~XyG4M76oeU^Gn1Ov5SjfNy3|wf?m<%)8!$2oqW75?y*pT)cY`Bd~G3>*n z`{>d~$tGYLlidsy8qsvLQK2EFA3?4We@+V4#}UpaPBU&0H;J3Zoz30M-O0Vey~h2_ z<-=wRVXIBx`OIOTE%0v6lD@AZ-FR&T1pBoRz@8T2faUxSfE8BpfXjJZ0E5gZEamoK z(kTL#4i~#LO4kvPi#?PfU}Mna;EdcDX=n7t#g5Djuq}Gzl3@4&E(yh4n~_`+gx%m+ zF0YXK6ZVfjoek*j4et8upU|K#{15w*U5~Ufz*{E#8R-#tS{a;X2;qeD>z|bYOWP2A zWaH?I{#h9uV5-#a<0vA5Z~J9;#D>8C&Fqb7+uq-`bugGr51_u``So`=2ZMpkVN~sY z`+tXXFj&LjYLAWC8r15;%3zX?D^`M=MA$RKn$r<4LfQ!Sk){tJZ4SB98L-5M&Vd+| ztROvWd~EQs#f;hEV~<+lq#sV*DsUr^e%^Ea;bA}~Mvj#Qbb&5j&US8wpKP*s?3q6 zr0DC%$YlyC$<(B&)JjDv!JMXama9|g9O|o73rgb|DbJFt6={S{VTdL#D-GObWwBz6 zmJz8;rkh>z?R1kA)MRIs&OXUNPs!ObsTOJ4EPRlHCR4RpPyj8CqZ74KHN`~cDA?NV zR7y4x)g?dHmpN)}c<>=GNYDEVHYU{KyNtLZgi%_dFBfLAv^9HKa zGLj&Nnx@G~bd6?-a&@i(xK2v>53t}b5(nT|KDuftSU=hN3`+IM6sTE_K10V##~6x> z!z8hC)8^ou$!2rS#}bU2$|)uByKrTBBbPB$^6FrJ<{XAru9bLoy*JORLC~C*@_!br@)? zRLL@@!+=>@PNk{Cbk@*GPt@k=h{Z}X<Lt1(oCbetNdGE2*tG6unnJ4dO_K_L}Ls4k6qjHL8=b{v{^ zQjMHZU=^OR(p*IbhEKv}3Rul{YSlny_OM!jWZ7p{PEIz)o2`@s3ls5m1mBiHt8x`G zc}R{{#jI&9UInFMF;Qt{W1`f|il?hI|tjv%Z4RNbrFCFW#f#x)w9VpkW$%5$`8sZ!5?rlT|~Bd1nVwo9t$ z)vdmfVRZop4-cuRRXIeXk!PkVp=R2eG<24QDr|N8uXWY1b(vCi|LUS7sT%Xo=rQb1 zjRJiex;$WlsX|q^(k=D`d4@uRfl|XzU8rw~wUn;N$oW}um|T;lRxn1Tx-C1+48a7s zQaXr9X{yWhv@t2NoHXtC1)-|!JhdXDZ;hhRj){!!DWq97u)1ljUZB;q;-pyRA!@ZW zuNtTCm{O8v)hNI)6dCYBp-{>UmAXcW&T26&w2D-PQlYI;N>>_`jR|&i9s_PZt26b7 zBvP(r6N&l+<0qNr83DhQsQ49DC<|eZR7sO`35UaM$kpK)8BDF}T#Ec_K?-B2`)BCw zfo?^6CiPXzr7}1)ff)7JF1B*~coqc^vl2p2c zz9=+PhT(jJ?3@_gHAb4HNSAAB79oWAK}iVWqg+T4TrxwZDgul=PO9z8Aass~$wP+J z_kcJSo|-|y{Ss<>+hMr<3CylC6<&)mQ=v))Qn1b8gQV0>by55(Rm)OXbVqpKER9^3 zgC)jX>oTxZeO2l%@>Il}dR%B1rg%6|9RyU{?d(DO;XZ z8xy0zcYx?}i&bgm8eQuSS*n3q(Hc$8R}7tr7%4O^E2AS;sIFdw3VtspESkDSLPJlm zgj5v#1fs31{lFT9i5dRxDHIWGCpc9C~bYX#B6l`3HmB2LB#TaxEf>4->@}tW@ z*oir*@C0m`-g?N>bz2(PDjLsJhwg}TVE}9I*Vy1g%6J4Qoi>`TL&_7CUYeZ6!y-XL z`csW3y1;~v1gfh_!*nz81cRvFGS$+;&WV(58m?Dw-e{Enbp{ z0+#J06~gy_Rd!F^4wWQoQBx-rz0Hk*8_xNPg;g5BOg0Uiau8#w39N{kK}Eqf%hfg1 zN{`UR@;XnZhWxT<#SAzDedM9DeuVO^Q#n2ACj$DaAo_X;cE7_x65ruyw>0{YYSR#N zQVCPvnkrSd%h768S!__QCJ8Epb226X)T2^lX!euH_WO$e5)HCwBuZf0oM z7pBVeq}G9knuG>>>|7%gnxj@j7pcvHHUnxy(&29jTcNW;K9FWqIaxC57LiWDMvgwI zTw-0~jC*Kw82l`#PE^gM4&WXB658s1iV`&X*=QC;`etcr!saHWwjjC+a z3$H|-hvp||4W3l)8b)Px8Wav6p#X}ClC>ln7!V}_8)i?)79^>#$Am+GdTB@stP9<> zYY1!lLexmsP(3EEoA(+5#N1~gm~^{oQtdm~WunnrG6*M2+eJ=8+3)DI!R{DW+MT25OfD7XzNCA7OTX>@x3^N)G|_s;HL> zYuh}3pwAF6quF2MMK&lTI9vg{%mAv#O?`OyAnM%|=mJkI=^|BV!2~_I02fk(R8TYQ zSIO6KMR%OW#5ejh&ZQJ;RTlLnSb9==Qp3hDHDc&$9F-fLSy~%v^fg`W*Y&0PGbF-T zuxi7^h>}ItkaG%)rsQ=Sr@RD}3L~Q@ON8$F!88Ef&(f%kx}_RH9Enho3(k}+ z8o*&f5C^K6B&8dR@6tqL7JPl!sX&`7#tiGSk+sgU=sK(3|L6>rB1>17`o0?KNtg{0 z2}O*imBZQNz>3iLRF~9`h@vSc`u!5tDYHk+Vh!^yg|qTU0Q?o<%yd-$+*uIf|M8X-nj4JMP#^vm4+Kya=bzE z1yc?g;W5_yg-4LdZ9Fcv;^Lp_~6qLpHy5+{m-M(_xj^;(GjPEcQv6S)au4d zB14(+D8Y#nYN$}+#EhLj(~!^7Nr>i^$fwn49SB@LIL2LNkLun%fQ`gRv`jBqpyosp zk(Q!wDs36z)TrGNoTQ?Jmgb>m_;+(c3U7BqaT@8*5T%t8kspL79Y!Xw?nqN2bZRni zrH(SoPB=6NI9f{E>6vVZbP_X-R1H)ROgf%)lBG{hyz8~6S&EZjc;pjsHimZBtgWn7&3MbkdJorL5X_)es5UK}wZV6TJLCO!< zbd*t?H~vYPR4deK!Kf8&)dCc0JB~Dz1d^U4j*&+OBic;x8UaqIdTLM>gLE2Gu3<(` z60uyzA+aF8`*ueNmqsOEx&9n!_&W|E$s^ zv^nb21wxm%3LL~DMdw_v>Z}x;NOPu~)@2P0)d~;jg@$kpaMy`LqG=r!#z*B?z2uxA zU8+fJ4@%H&jvQ-LsEMJ*MFDIho!lGYRoBlb<$%(EP0d7&KB$Sq9r?l{y+FTbiwaI} zC-j4-_ORwkc7mEHfawc{t0{eJL#dKvpi_3~zyU!)DMhMIq}PuolAZE2w4n>d3H0?7 z`t5Lk#AOZYg|DmEqTZab=AW)*YU2m~Sn^Fr6W4zH+essFSG4Ol|F= z7NIX{(3O*m4|N|@I26*}sMM*W$-tAELAHPTtUaijx{`@jROHlxQ9-bx&0(}o$=Eb@ zROz5WO*^Fv?JK$$&6qU3`J=O>VP=Uni?utX#*#|7+Cct%kgS&&$e2GWd#bY3KvvVB zUWR%`DhS#Swg1$M(%Gb{t!3EGMp^}iXJ;b#&tgWY_x5y}t7)+1Kc60I z9z8&VdPBT|Vax$L^;Blm-6)w-R$cTC?ML#cxxQEz1h-MATD@z#njfz#YV`4Dh2e#c zf^~GMz))qSRJBM^SINc-tijCGsU788=kGIqv}*sIy54dASN+)N$LERp$bxcH%Rrh_ z7q5jZ17SRyV{Yj`Pe?Kcd{gJB#GIxAL*tzc!U_8C>QjT91M1mKdoAJg`fuCI(30xA z-r`j+>E=2KHis5c1EVCIkpC{GOn?k(It-X`K4M`)T=cSX0_Welz3O?F5#s&xnsmj| zHA+JvD#c&X8(I|3t!_d^gZJF1#9A@dq_7sRI*?`+#R(U!tRs?5QMZ$NCwpmf$Z8JG4VugATto-D;o9i3SSP zl2bLMc9d1jZvz&6#LySwpcC|?CE|m)jrQq_=eJX#4?ql)F@F6zt#+5+&N({_y`-yy z$?8Qw6^uG0Is|H#m5ee{%Cu`7TLH%|km}aos_u`J^n0DEX)!2mDq!jYXdl#_unPZu zpi*-wey2ql`mz03BY&htZE;DlrXJDtK$l<5aGXkG07g!uKE^<|O4NlqdYS+G7Myhv z)cTUhWXST{gA%>&{->>c4LVlT($m8LJ?}1rSae1Y)%KOtNkX2DXA_XBUeTnPet+u8 z?5e5p%4W*heXQOLkq$q0#jLGR!`$gtG2Ii_K9*q@Kyzj$>CTRX{6D2dn(6h_6Z>s8 z81=+)5M4Yp@WuTc%pH3AVLck)>h~P%@e^_T5xoweMT2R)5oC0c)%PFQr9mJK$*Cv8 zOMX15WQg;R=!T($&OCMYlv|SA{ObwHFFJEU^`GumXkb`-pW2)mU$yV9?YTYS5$PN% z@#`Jc>mw0V^!q4ckpf9k>U8gd-gTz|`u#RBYyl(VjZ*ppsw$tJ81xcI$wZMp5 z!7TgWA1w`VEMIkmF$J#O0b> zisOx)h>f@?oFmRO!ZVsH&g4=;4)%2{Ib5cs0b7B2L~|S9XHbNwZEDHEx1x0wz_dB8 zqML&$Fexrdrd&Jlort(d%3|a^LykBP^?>CX89Cq!pyuZF9nc74WGd1^BOc+{8}S69 z!f6byh{D2RhM_tvp^@yPgng768FEosRJf3jA0{ZAhJKBVaQPhw20aZ#%@|TM4GcN> zl8u46xr2j&K->#57Wblpbubqh8jIt=ySccqLex>5Bu++$$TA~xU}U%wMNE%{JMe8Z zb3?+T_025_UsSYKTv%joE-I=N6>XuM8X18pap4|u;QZZm{2I3slFya~+8lW3-kqebp(M?Jb4?0<_kRC8SJ*JxQ8q@fg zvSNkn>U@wX@@5zl6}?9n=&{I~VQ3g1yqk-=2@Uyl2;yGiWC0lOWzGdzE{24`IB*5# z=$dL}eP)ouL_AEa90cl{*EfJVnp5sk43R_fMw@=^*}0D2jbfuUK`BE;=Y)Yq-n#-i zuWS+PU$}t&4iK-9;HxnB@dz#e@(GC{-h@YwA~~eTb28Nd8WAGUk^Hel+`PK z-EP^XHNW)UXZB{qU%3%j=>PA(H;MY+vZGNxa6akyq~b&0(oo||kLBrG8)}egxIuCB z-Hty}^jt`WTsm+*s6|b83z+bz|E+U=Of06HLjj#{o&l0Pn&a}A{$_v;A2lS4JmNu3XBW{q9}Yi z(rPPF8i!9$n%Mzt9~ds^EivGTqF~lwBRH@;_SBGzC3N+R3TKK6=VDQEL>-NgN8e&E zx}c0efIhK=*P;m*D-*mh@D8jtD&Ao-57uAtCn5Ee+^WN#fdeQA@LNo%id-AzX39)npFpQBf1p3cvVJ zeFKKQ^VK*s#M{feWgvZht$TloTL)bf+P-)>th<1VpXB2Z9=+>^GaF0`en1c3MWt6D z1~OloNMpY=fuF?T5WYOi1HW5COgY5R8^3#le~1e>q^@Udc+%Gw*6zBCTy5~%I4!`t zx%Jng8kc#+w2jl(5+~FR*AXO`rX!!4v^6}M6Do68G zP7w;ZQbteY@ZGaeFCQQI(Z}yV?)~?wzqWX&9Ny)zt!bWL4J=SB%)ZS6{1YaA7nL-Qq$yK9sz!7sbEEx<`LlQ?eCE$mHDOz_@uV-Yk{9AbK{Vv`5|Eup?={l{5-sT zTebA?_6EbPBK*QVyu3oZLR)!zdwKaq;N?vihcx=h4W1g`_z-@*?xiuM%J0-sk*b!e z^PaUHL@iX|Jq-RQRQ~PG0hc5t7f!5JiCS0n*zbYW_!ft|)4$fF-xzau(yu0Oog%wC z>8=U3$zm_%yF10@q~cBqZYm_<>nB-lQoVfB{nJ~fdwa|Ly`;WUKJ%3ks{2V?^B7z% zQ7|{>u&^}5hC@v0R|_<_xP|K^IqV9dCLkPotdu*k_pY7jHEj9=d$1+_B8C;fM)swMG17evdJQvWpn7T&FV{p4N&tr~yd8T&;XeV>VPEw!ff zOP};FE+mZp_uICY_z8?hvrjdMSlG}@v;X!9iz9<7)63lsuA>usOwfX#Dk+rh-^nz9d~$u3@;-jCWMf+6HPuz5rY_z zxQ_VNBK^bfx%k19`w>?^B=B%^b#?b@?$tb?6@ED`ju4rpYYg#|5uX8mB+ie>8a5AZ z;v3N{FsbD)!G1n*ett4Pp8-TB^9}3j8Ij>1t@tG&D=<+bLrdZ+Lrb*rah3V`4QcM2 z=i@S@m9LD%$f7F1XrKy8f$?_^YYIpmUl=zJ*^%%X&Z`A5m z#T)8Pxm4kOQolxx`&qJ?&F7YKLKCa^-4nNu0kig0mQYjdd;eB zl^eE?o_VNr{_&C(e@?bY)w?fm`{P38!AF%Z{;aIJyy5fbz3V6J+qE23_Ux=e zm176jUOm6{@{7{TRh3njO5R>vQ}v?s%Z*J{FIHDoRUSHgXz!7;f1cfQ?Ch0u=gu8H z|M>EYKQC8Z-t+YHp3k2z-FR~O@7I^Bsve#H{N>)^&yP-jd3mg=>hhgCcWys;bL;)5 z&rd&pdHHu$RTWhKxyPffSSLiA5S#er|KEQk@vWgVL}HvB)eRw_`9AvL98{HK8I!u& z@UGfKd})24RE;lF(ioNr&2xP{{XG#>y;3hEq|w{xu#ludy&w0o(DqE8dE)Zbl@YtA zMf41{>T{t@WEZEEm!=oqn$Hh(`s~}LWS+s3UxPzE^7;J$M0$} z-%(9XX_VWT8}cAI_tV~4Un zXXbyt|L*svbz3w&;}beY{JV9hka54h8WpK>8XkDhru_+CSp!k;5ygkYid+ty>0i|9 zVV9K8dwvfZI`WUpB~y*Xub01W=`i%4n4n$Hu4kOe9w9s9KK|g0=7TTP8yXf}w<7AW zafan@F2~Lch?&$-cxUTb%kT#=s)CW51BZN?@n}!cyjhc+8eMyS{po_dM{~Ng`25^r zO!WoLf?7NZH$R<8$XV_hrVe`u)D^^c@q1~xCzawPaUelpZ z1Dp>|{Ngs&YhwNDyW6i>x$bS<*S@9`2epoAI`)sbvrZX=tu-rs9{j2Nf@YdiS-|_{ zuSZFKAAfJiqMV4vGbQupk8t_o@cMF^sw{fWpm*jMH=ladQ{31SUy%Hj7BnEDBl4oyV<>xRnuj%XCC84;K8``JT-gOVmE^mYyUXcm9=l=oz>h&P&< z?H}K>PCY(u@*&GLf^piNQ_WvlDNU36mn~j@-_y!xL(8_@;wYC-&wO1IBQn}YA3X2T zW25%u+9h+#CL9|zSa%HtJAtKM2vns5B)!Baz*sTrapQJ0%1 zG34I^8TIAmaP73z`>RCyBnAOcKAll@TX5lkIb1qZCcLqZpD9GU28RB zLau#M{4FUs1KKVA0Gx?WlNBcEOt2X?)B-f8HE z+ncVvIyJk2opa!H&yt~ij3+<6)_vo9RoAUUM~n$Pb>@_&Z1lk!(>*MGpVaC5;L-In z7cOkd%}m=dxm3Gm$;7UW6dlqQO}1&Zd-ULUE~9$C%}Bj^!gS@%*S}k|Fm*byc*y;c z3#;A^u${7HPGH!X)5f#*7fVdrbhWPc;Kt>m>3fQoetgnx+s2(kp1fD$)r`i zwrvbwoRD*>!C&EpyI!>}lc}4H9CdEYt(L-=VcUXE`oF4r+pFa7s5-}Q@4Vo?qTb`a zPXo@M>b>dH!mUSb6FB=<8hGS4ebe!kRm|&gs~`V8<;}i%^X6TAxvkB-sm*qmwb?w{ zw8`MmPGc5b-_i3!lgP5H*qgGMUL7N2j_o~l>eRkw5Bv4I)+^L<+Vq`&R9Y2yY&-Zw z(74UVuuYZApU=DgIO~C9+Pq)iywD!9u~Up+_3_e+F}G5~{~VJMQ}*fEzF!(tZK{9h zpXOFJfn&bmNpy?Ee!uFNc6GPP>ps!#i8 zcy(G?Wq+di_#L4ZLvswpCM{>=?3{gk|3jm&bJBUYEWdIV`MWVEdsC^|m; zdg;QsDMQC-uJo<%{BnKQv+V){%@d;x-A-m6nS5>ERkzNqd&GMOcJ&@T=2rfpoz7RA z^m2U@*4@u)!L3HW7>ReMkFbdTxbt<_h{xAITFn3Scjl(6Z{9lYNDo$&jUBynH5i6WcrwJC-_N zEvG)onEJxsvPs>t)`8npJ0AZ&yX~7j0@?Y}J*( zlWx(ci?sK;e0jKVbc6jjuAG?CYHqY3x<7aDO^=>Y4f$&%nu-rkyl2h-!}X8BVWqE% z3p_?Olk8jZ{)}YuZ|(d#ElCn>x?p*LpRj%464lB&mEB+Sx^RM*KmwqS5HKWt$7P31gPHe;5+HE+t~kPzQq>rv~%J zixNU6blKW|{2^6F_x!DCMThs;CW(zKogIU?{Aq8BF9v*aRVD182erfz!<1v35S|;=6>|RpR1pnubDYG|ry?nH& zt=2Iha@QQ+u;}8H9-Jd%doAl3+Sa<~c=@OJG3NC*WS`E<5mZ#n5j)*=P0GDo_~zY* z@W*FO8y#zCI7*T%k;lE6OUgeg9Oe`*>vH^zQ~i14U(PAD@w_+bM#`2E=NH(|xH>e< zIW}Y7da`7*w85vxFWvjCUm!htccod6&Y1@$ijC`DPEK7PyTWJkvB!Zf#wo@N7w(ul zq}85ghC=_SLm3TskL=Xt+Qi@n?S~8sb9VT>&?bIYT->EP#%^U*i%Ps#tn(G;hGq7< z?Ko|2>7ip~=DlBSH+Kmbb9GJ2DSh@$>)F2We$EL^(#8odGTVptpQ0RG(CyNl$d++} z@Wt8ZIc=xyeyuDVa%Eas?2#Fc^7@JEd-lKmXkMi69~X8FEV$HaXh?haM_vDrTOc3PqJ4)eV~C$(aGT5hHjK^?b=!A6 zvC?$cdy-+F(5c?~%Gl(P()&&){AVnhHQdf9e!pvYly}k{*VU_sJSz)wUVFY?%9j=^ zvxfVHoy#fb4fhzkrCthXY4ZK@$qQ#%a^|Sc{7$0U ztf-3hT6|nwf6A`kJSGHo*isUwm`KiWhV{M!Ahu%ftMa|_GYD-VuX z9FsY*U>sj9r!0MTMMp&ab2 zs(d>HFF2ljX3Xj>V`Yga-VN{9KE$Sd|HdBy+2Id?*N$&n>dW)aEhu3hp9a*msynEW()Sp24thlg7mhn;mCHMG^IanexhwmDse zo!uS|+y2Bm{bqk*&af^%zo}kb9;+Rl@%(U^!NR(gz1!^T7Zz{cVeyQv2fMs{w`)-D zh9bYgk0cd6Q`)au6?@=_$%}dw&m)3-SBz;ir1!@IjyvBQrp5bOZnTvz2vh8tKYdok zy08XI`;CYTuR9_(sbcR~$>{B40tcjOU!5FtWNK@5<7MmA$G6-&-f&Kr=-;;WEbdTe zi>PwJ#y8uScfVEgd|T%~>hFjOvdK+^7mLzA#m_s$t>~E?R&VuP6O$fgf#&aLc5g9%%-FXPt9IUfcr9v!cbj-h zd`sbzZQJwPG)}nWQo1+!b?DaHuLg_w!~NrpgA$KkDjT!N=G3*Q70w><+AAwQE|}ai z*!}&OQ)R>LdJR7Rw)uyK_DxI{&bEB#-`spfgJkDEmo&+hb6%L|ErhyqxHy)ZCF;P;rz2f!cv~82y zK5SxF{=}uPDAl30g>h*@Nm0d#r^_0p-dQ(tq(8z3SAJpn`{#E@*~k*tc0F^uNkT#U zdu6AitsVAHP5l(V!bEgXYr5<8>S=G=cUgAx+&xWlo5-cYm3*`=@U+*}|sF8$6zP%eUd_u#(jWjV0$pJ2hUi{NaoFrN4Wh7`A76d6Sb4 z{;R#k<05ZAAJq6n{E`U{#qHh8S7es7^lx$Cb}4`Pr$y_MO5Ng%w?6#+(6Bpge2W@K z91n9&Hw_>5SFyTEVv^MPc;4qr&mxZvs490^+h<7Toif`Gd;4pV8&Jn1!0tfWvE^N^ zd|1?VQhMd>Uy>ipJTonL^2{B{{1G1UE}!C`_xk1W=XlG-J%T>Qz8-lb{7#2hH)ZjW z3yudqC-0Sw8Juu`+tpvpHc4joiAkzEG->~7M?S|vve|c`Xmdza;E?Ct45OZjo+b^I zv@8x(++67@`KMU;ZqcCouOk}AH*&r8vO#uK(X7d>hg$Q_y8ZR(NXLEcTdwcZ`1+>` zVb_UgqQm5GI@?%xv%K>*a_!sTkBbtZ%D00ib5qA0JUJ@oVvB~e+xN*XYwcn^Hb?AT z-(`F9Qo}c4F)tzy41DwE&6B~c*X_Tz`Sx*9Jc}JU) zOYauNnYQhFGA^w9z3sjJXlB;Vf2M}t`_Mmm&H9y{&R;IXdYZhus=TjO?jD;B31`oI z8QE>``$fu|pW-(H@u%0vMRS7s_1o>3Gwo%hT<~#G-LzxJ=Jx9LZc*P>);&LLh^ag= z+qSEVDsRB@sAg4vKAqiu>1@s=<;Hc+u6L@+i>}Rk;{GZA#UM^btJUYPRTOQre#uJ_ zPwq6Q{e|IMHb!)wy;51+{`SPJfgOfUo&IRMETLhJhJUzO?2<>)(|6Wg#?OQ$xeiV8 zn>;P3{o$MAhArGxV!m~k+;G~U*&9!|_Sh6Z%DtOe+3-mVTW+7ve;fJgRM2Rvc&mE_ zTOW!CkA2#)Vt&N*A!EZ9)E%84KkiuPH(|~n7u_8fv@9dK$+?Y=b)KKKeA6tdsLro( z3wVxa-FJ2y)n7Q#Y|4Y9+EDjCN4z$j$ZUBuE&STy58jPex+N5hov{5w#a|Xz1AN>- ztefSu(~dU#PVTEXZEAk1yJG4I$MDAsY=g4~#|K=LHu4?urO%BAtrxdkF}&Ni_jUw`aVm$sW#KDDZRP!n~G-{rm!CQcqRqMz6EqJ=lN z+f1Ur0I=&iVWYLF$XLU0wX*=|1b1I> z>rD+Rju_TG<-JA4#4lC5U;6*i;7*j_w%4pf^?Hq04CyKC(%*lTdwI~qKbyI(-M-a-U7z<;__-UW zlKA6}aLen!T!L9aT%(kom)Bv z4EBt$+-2_O;{Im5dC?4?#D?`Q#E10hkhJyQYvt$ou1`Mnu3DTk?n|pSWm@TRLbmeOy4>-4{dsQ_*_}XFqZP%o{+^iH(&Xc!)4x2qUzPB2(Yvge zt@oRaRi%u34+{BZ32j!}6<_+WDBDWnxoG#vw6Zaw?K@Szbom9HPU6QOKJn<($!&tF z^505=###<~Z*`~D;;P1fxEy#tXWpnb@l!suYx6fugIG|6#}EdaAyof?U%pgZiC5I={(?ZDY~`$G!v){mYuZUv#(L z(5a8BB**5f>W>^b=~cb3cBO4Pm1Rs?@~GTtjkBxqvq=B&)cALcW(n_4bZzi=)YQw4 z=l*^ZDd#<%*!?b^qh3Z{+WUCo5z|dUN5ok}r#h=IIxZ2m-Zgba(fCFU7bW%!ENvWr zYvK|0P;2grB?p?{xw^u7-|azlq@AXIvAMV9@x*qP&pIgHE4Eu5u5&(&-+MsTo5-8q zevdxK_w4iJ&c$9X>UZ6Le?MURcrf#BtY&?XaKbMrbQqH|cI-&r^ee5F{BAcr%z4MH z)}ueiFDsnf&uvP_tM0Q-yCgSR)7bUB&ApwU<0nRzwWyNx3XZ-rL;TjnZJAZ};(_gB z5T49>HCA)Y@!Z9e4vlAbPkoI#H{LI4J#L+bmNt7yE;`y|z#Q0CUUHNRqheYF9=`s! zw!M{quZg$iVOe3$cax9Jz962s|5=sf?e=R)n^&lZxDC!d?l{f(pNZY?e2Sk5vv%pW zt;N8hy`5uQCM60-Wfylpvvt#w{=b$d#JJe+bzb(mVtSiSuREC}FLU9Cb`854d$8^; z#oKvpKIeb<%~gDLfRFbd4W-8niub!{A8a~Qe@ddd?USfgoN2aVY4@Z@!5yy8YqRa+ zhbP^xsO>sD=}=gHWn$Cwe}y#p{N`+3qoK3AhVuXHX1m$mD6F*2 zUH9_%jn@y1V zU7LTg(~_yXN=BXjT%57T#in#mn-0Hfn|iDJnRQK0AMs(*c3WSe;r(3Vi|19-`8%k zB=F-tFj>8+gnt$(Qv8wIJN|P}s-5-7^xO!pr{d$jjY#;Re^?s|nlBQ#np~|Lx z;|;|rwq+BFD<+NHO^O5V-YnYx)>33WyrcDjLv1_VjhND^(P_geNegBrc#ViSJNd5N zTmRMNDcx0r%1+GO+FmgH`H1Zk%MHtS{gysvb|-a(R(?)$DgWKt^k&T6`6;IhHqRKe^-YjXr`D(9CdRI`D&szq48C_Y!aL?} z*K}#;vQ{%agstI?1NIqN8_$hcG+uk(H1^?P2Vt0_t4EW)jUP_$F}=mpD;GMxdDZad zgIDeRm-I23Qr_cy&+7&E*KAyR#+0goL)kO=AMfJcuG%KtH)Ts$UE2M^?$$Twn|6Be z>)jd69?4SEgbdQs-^wyDzD-V!^MjA3v&$#EnAKpKyT^!*XIH)G&}QD>78-|y1y#>7 zHg>ECdc`mOlv;l4{gvK_!p`;j)n%T~wY?MTHWMxRuwrA!ye}yy3_l$UC=@qcHYXi) z5NLQLKD2lo{oDSdP4;YPs4P2j)b6~y`>v_?G!L9dTbH+8?va@O)V}Kfu=kchaYbFf zCkYM#f(H-oE}`)dT+>Lf;0_^3^>b(XOy&TN(qA9gcQVwZt25X%a)jI$6z}tG0zTsb(`WPw>ZBdN8R+HFR52YX zbd}76bA_5@3Sm=BA2S^qAF-=@M*RwvavAgOC9`;RO*^D4Sm()q>7>LFt&LWa<+&Dl zRg!8ED627evIMR5NgGf2yZX&l#u4ljy*|aJViIO0pcZIluzW|qFV=lc%a}P8aAhN>^W+j0#TM6&+cNNjY~meRTn{bFpD|v} zwu_!gOhiOg=8y8!QaQmItD?lw-U+0VbT*&+*FJ&LG;0DsBjjYJ=;`#M8z2;$12;+9 zbF|-?hrSIZm6OVylDjtBo~v$Vo0Kw^Pk4%0Ckb%~&2i8%F`)@9N|-pvuttk5@}*(^ zXqJ(_NJVFJ$?Ms_Z8q|n8gFi#h%hz945%%Ek~zgn%BW6+mRMvSJ5+Pf*HkAUeFH3S@AHd!USli>7A% zJ?=TY^n5vcxT063CCsnQ6|^PMB8y5&rf6lOG&D8GOKEDf>1^q-t3Bg7FQ<4kZe(%Q zzQ_I|bq)iVj({hK1uoyipBq<4N3?UAxjff<`E&~G+~chI4v2Ce2VmjEffd1O!)e7& zL1K9X7Lg)9F*>%>*-A=|(3bG2>!piterYM>uhS%=8#J~je8d2f8qW`f6m_veLh0YM z+q@CsPgTSO=a+^K!)PCk-O>ViE7I^f&#+ex)Px{ z3}t15K>3Wbh7e0&ziu9Ov%l&OG={L-0n5;~pO>B6Z8pF%7ni&S8{nsfBP;gsNj6Gb zrQqGgioR=g``GDcU&AYcv^ia>flY|7p)HeA&&l$TgB=M!xz*>VQBu;&eTaOJ zLnL%b&2kWZ6hh0w0JmKe#aZTVn1|}K!uCB*ZKhvcZ{}^k+gI{@)$&k*Msoj_@LKly z`_dAq6{Vkw-v|oNao!$$Km@1i%Ekt}@;geH>#E`>UcYuOhu`=;3))?7=0BDAGg6wE zUl^=mFnWrl<9ICRzovRr;x;a9564+RuCKju1kjnP>2Tu=j6jf=eA=*Pef zK#a2NyD_BZw+W8>V{@>W@8tC$8bx?pc2P<1Iq#ymuKxK3p*j2zLLkS12`1P`-YkGL z7KTpv#nab+7*YM*^46-*v)NPR`NpS3bqpE)H*qT)OC2hX!2xl20(#me*sJ1aA?B!g zl07oqx#n_51pBc=iz+^*rl~ z%cQ_hsJndn&hsbSuB4*hSJosj&cEwJa|>VB$U+4kLNVNv4~T6| zId=LlNo+sgNFk@I{y%=ce$@oGoqmJg_CG#I6RZuEKCbb;y^*@lP%Z7t$(fSNgZlu! zzX*%J?sN;K;mUOi#mX8VZ`FP?rLtzi^diPOKzdYxGh?4b-u_s-HS@- z`tHX|@Sppn83S42UYoO%H6op9v>Y|hWG4SCCH(vyUR=0tN>_bv zR@|oeQ^1of+Y;&j?OBV-zvSTNCF202A2UHkh1KB>Q9P@tUkmR-`*Z)ex5e%ksmVr3 z(GzLRHw>harfvTj^4EL;>XZy67D?&5sGD_PW~O%G(pu)=@dnd;Jd+yd63k)S`dRZo z6XpMBhe`4OQwOvo#tQFp$a!+hB;nIUQpot4>?9!xMy@}LFf7$cfI#3M7}s=dde0Z2 z8yu8@2dq?)s*p7Dr!J5F|AX`p;Y+~2{_-D4Pl=@YE&PK2MM#eh;otjlJZ%5I;20qX z9MgjbB{U6I`%FFA`!J&tsr^Vp~XZhgaRNUFW{KNTp9JRGM{%@#HNlEEHM4z*! z!FQnjS9LRY3kwSqJ5L7(2L#>-Ufu`ihc}`W5Ts!gd82tdP9~vQ-mfL_IkaKFa!h`6%mY!uGg0n zrYZ>2RDro_!mO=J6iY_!M(cxF>Ld9A0`$YfO(XNZ*5-K!40{dxb9Mh>TK1z|is0?b z<~wU=TTIbdPV*QpmtSahhlQCO6@Gom`}k64H zVxy)4B8Ceqr{nAQqv~#}{!8DbE-pqaKGhCQH;h9IkB9#Y;MG1o_0~pAwfgs#miCr5 zjyIMLH#WjTL!TSMVTFZjf$M#>1JJ0w>yqom#nk@Z`sLozh5m-ch34h`sNv(n<^BBS z%St$^_p}(XH_`aC7kP7#38xw!)jnH3))+M_n^KvXKev3Jx5Dko)&b93%qA(?VbLs>EEP10P@2F~eV;>tD zo%u)5sgJlg??n3T?W32=wJ%5d>{`(?INCLraXt2BSmN57^ZGnT0?TOAs{Oajy!~1#v_sf*3udx3s zIWy`0)vXW;7T<#qaD2D@%SFg$mSPf!a+r>^{s8{GtUrH^af{{Uz3nC2+l| z%02$R1gbH{IQD(jY1VnxVMJj6DM0-GJ=^Zq`2#K5Fs0aiJJ|W98}`6HK?UAGLo7~G z=VrW%Ar1RA@Ebbmyy|c%xW9T;7isvsF7Ek~w(vq=5+|DOzOkR_vC(;l+4(Zwd2tNB zdzcXYDYhCd2Ig$H?|A9FgBZeg8-h9w*b7Zm-WTiyU$yBe)sPQ(eXAkA=)7#7kneRe zf%Qyu`5Mu_+fMg-2@t;;hdo8Vv`%C%Fw7%iO6pc^wB0aHfUlObJYKpL{}lq=-}+5$ z`o@zn#WBK^6Qz{i)%z^m^v5|n@%Tq09N0mx_(;^MYBBU8w7VA*Gub;Tt`1l~UYtVa z%|r(I4gFne5si*98vDg!tN$C&NMec7_pcXhKMQcn3Pvf%b;0SpzrV`zzOT&1K|Nfp z)EF&J(c@#69T2n;+J{%d(-oE15>M0x!0^Erwo^IXwIuCYuuq$B*9hOoD zj4*W|BiV%L`$QS4?DE>|mPCt^NmtCIDwa`=zUObBUyYJ{vu$@N(H3rqfv);L%pH#X zb*+7x42Hh3{-5*&=xZ{{K~;HzgH*ca9V9eiM{=*_&w=8#BeyZ!r!iaUX{ zNnd?XOoqz9G7}+KZU!i-Dg*gE=vP)1IpUl=a4n;Mk<|UEW&UmA)Ux#ot*qDCil9Q4 zUPe-R*#j*S8L1z!l~O`%lq;cdLoU9$oi37Gceis);BcqtS=A79-CM<@Oh>ZmZh}E` z`}d$~+_FLZ;TLaa1#4jxn!HY6E?bBlq;=he5&xMg>yDA?XkNe)Q6e|h2vD@gSdmX% z_Igz7>4%01cY>GOUz}CXy)FtL!Nzo`7UeM~_}BC$E7%lfTl|bMc6ezj=Y28HyQulh zy$Kmw$fJ%ieU&{vC4>qiZ?Eh$U^xMuw|bHAt9Kz0T}_r-F6ugaPP7|3kFK1{ycXcW z;M0`@k5|;vWUq_ecH~CCr&=TuvW>&9xf6123vTGyofNHq=Cv1@_c(jbTJpV}Spom~ zLjEOTtR;LbdK$wzVgKp#MEfiB^ZACu<4Q{*(VFhl;CFTa@cse#FDKP=Xx5$5IT*$W z+x=8OzJyi;{VLk+^tnAcRgePvMCkoEft%Q$fNwT0<1apA(oO+|uGCWv)|V5VFe_N` z$~#ni(&(n0&+cZ%fHKeRT$<&oR~DcfEM4MOD^wvIqu+ihA9Cw)19F&+h>r}sl{Arf zet^#&ke%m|eoFFN&dfBUdRY;P%!8D60KFIvLn|+a01+}m3%i1&cQpzA)h-eK!p!xQ&e!F#VCwG6y-yUKn(7IbjfPN;hZ4 zg$!yr3*itCo-tCzAq7wan%#bXa6?tK(@vw!Y@o?NUH2@wLSO;>iI`XJyNKen!zM*L zcl&6xpqxENHkVzD1{#))@|Yd-5ECLz}P{rO=mqE7kMy|PYZ*h#z5{By5o#o*`1 zlVJy|Fvzcyz;#l)3#16F0P<1TW`%>(lGFDb=vR<){tVzTxK*__Dd#4Ks9GUctv1PZ zkuF`>=Vt6f!};;5o8|uS@h#0gEhl(;?DFRJJ-?8JW#vZc8t*a!%|wQ4>5O;B)#3=q z{w}T3Bgu;^ywa(XP&)zohJVNL_pMm-vnW-!akr1lqZfortKmD6>d8r}`r}5Z%zkV# zEDd`42oZ66-teWp?IO9LJ0%y==d$lH=IkwoxAZ!RHUxat=nJQ~pMYmQ`lZk^vKd{- zWAtT1hXX2U48FK4iqL6iu^K)~RcY|Y$kPZZ@rRd*9|3e2e|{6$?p7HPdY4J;bX!@% zDus;U><)uzV<69t+vLWrRBBvX8uHl_vSe3#@j<$PM@6G%lhMuVKfFopPOqP zq{5V&WW%Sv5v|H*bvz#mpi;*LWQLW>CmH$|XQTFV_wP^3KE*8ULpd=Vwp9<(sdEdw zCU6tZ(gwN=$oE4{Q#^2E@nwAmr|lYjYrWQKp2zUx-Y-{VS9)35>!rl#j!itX8-qNd z_O|CW%iS1++m>%zHSrXIO@OzEc94+~VHhO(DU#|wmde8!O8l||zQgH^QTtLxp{@&2 zuN1NPL_yMB6;=W*s(IzXM?{8y7A=5QoX>n&c4ow9CmlaEpJyAw*Rk_X8xJKeTUSMp zeS)?gP;~l@*cXG)!+6WwP~vngdi!0*GWn9?gMQJiDb+7#HhYu?Vr@}4uFAjemG2p+ zBA+4L>ZHITnnI}g1Ccr8@nLC(;*6G=@5{99Yc7Jz%o46)U1VGcl$NnPFs}6?;+1W2 z0>tQ3!Wk{gc!topdYy*fKs~^%;|h|s?y{e8E|i}HYSChc=dZ`706~vPu5M8NdF{7LP zec5tEKRq(|q`F5(w8%znvP* z4x2USi%5CfI+u}ReQE^V1eJpnGMQnv5%Uo;tg;g4 z5phrj6wMhAMSVct1WS$x+1s_Ju#Q?c_@FeBM_`n_(3O6!B4t1(QB6h&Vtn_L_4B~A zl9XwZQFS+0Ff|4G@TG@SvU3tzV*b3{pV=XS{ZU25&epoRKm=^I<<)sM?i@Y5uxn(nA zLtYy&vFfML5M!0a@Emv3IIFm&K$#YOER*KegQCrewN6tk@2yS)QhBEn3T@JAzkj11 z?QXwavQ!oG!hGKxd+$4!gi79)fKQsOcit2Yb|iFMgf5vj+b<<0OajVkz^adaX(QF z`Rw~IXuZ*-4XpQLLr%f7zwdiSe%9M35!p9G3-rFXq#^}ZkV0CjgV+ke zYAi9cVh23_RlJlc=vxM;g{aa%*^*ptif*K zCjfGw+Q=IOh5_aNus<7r|E2gte>+{JttwxPdp8ikv-&R~F5G74xqQ*M^xrKu0&S2t z9Q?<>@z=ikcif6Edwl6liJeM6xg@)62YO;dH|qn+qgeydzoWBG2pFGOpIdwi%Y$qH zpeQRq^)GvZ;uRYUM7S0KNsY#`WU@Y@Tp+_=tB^%YiZ5y6eiMCF*>{6=lsMS%l+&7M zf1vzkU2rI??T>vW<^}jIE6Z}I5#Yz1Q=u=+`X%wV)#DSV?*j4RgFaS{L2nNkD)%q1 z+v3kaN8I9FUjzoSK>% zY5oE4iORM?cnEHeGFCihkAe}KFI1PIIH3E=bEm$ru=)48QCe=F#Pk7Zp1T>+9gV{z2^ZDCbEr(D?exC1$it`JS1D>325l6BEnG0w)JzSc-m& z{afhyvSHw6)JylMZJNduCA{K1Ip_#8FaIoz3hwWGQ#SzD^%5Cvxz=VwiBFEMvwWX{ z&h;(NUW*S+Ny6dHXtaL2A4o?VpZ`48`{^`&N+Ye~GFprbPzLtH^=k}09Vkzje@ z%z3qZHd_+nsJ1WQ{Bf|dRgYF|Y<+p{v+Kj{NkD)xC*zo7Oph4kIS)Toc=&(Z6y zGQq+oTo*WU_T{=N(u%ljsB#0j{1nPzBA>k;P{khu28YCau*e7;Ok}w-^cfqdL?P?T ztWlx??%yVJj?L$3u)W-aa~*&5zPp)Ob&A1!cUazz_bCf5Y)>Vt$V-oWeq;Vcx6LEqY_sVHT6rkUUFBos3?UNX*Bj12giaJ zil{pm=FF4|9Yji=z}ZA&_Q-;p0RF}%TDMbMlwCvphIv%P#f*+u#D6pqQ*P<%j@BNV-_4j6Qwu=}N-p=bR;*@zNRMIfci5(`n z_aqt`V^}%Rs%<@}mYP=JxPA^+(8~X z)FsQi8e?QR(7dpUdQnA{rBUy?xG^&hxC84d&E z&mL;GlVrb}n4J8OfyFNj;(*UUZY{JV#HtFt3@vdFm8J0R-vyh8rlmzGR7j)MzrLr< zdt7}(Ol6RY;SZ9R3DN>`8xAGy5M~mJUd7J7PH1f8R~Qz{Ve|`0WEm%+AI+XEyNpFN zXaAs1%HKZ5g502%AD$KF7{$aU2{6awqzNb@N@Nz{z}L56)%-=Qko3veP5St=Vt$Yj zYYbb6tJy;sQMS5bzR!>9K7qpM))n4DmGUy|30*-_M)opoc8FN69fa3X8R)o`9W;H& zFuH|ietTA1m|1Lv1vLJ2oc~70@xB| zzO8XA4oET&0?5n&Lz%KgiwHxfZ zz0*&PZxHRUTfR3(WSX!qjAVY5D8~Nw$||$wb814x_xKO~jg6T}7#iaQE@{swa%snIEs z3<8)nzk^LBzkXU@uVZu||7EDFt=)88o77kNTqTO$d||*ul^|)|2ZYcIvSg7GWfLk` zfhslw{a5!yn%+iAUQ`D)cDbh$GYlhPp!etc3Q%z7$!v!ecdh8LB&vRU?6AzdKNn|x ziW$AHzBEW?VKHoDp zk`s+^R)4+(vPJpt)8Lj0*0M8)TiL06&{6pg670M0YiJaAAGUmP5RcfzUop5;ZDjvF z93vAUVeZxU^ zhpl=Md;l(Yjkl)+GwkWPZz6y!>-&ot(R60!#zbbHG~vu28o7nc?iKN$iqE<;U3>`j z>0gmS@P)RASDcYkxY_Rx3qh!zKtPjgl` z4p<;AN3*x>!n|U-^dJ`mlBcHT9!+At=E4xy zmu2SM0K>#R_o&vuu$p0#o!izsbEeO7qMV64PPCqwmAsrZ3f&c=XLfBMpSJ}j#CN7m z7X&&?m47Ag-@Q=``?&p?ltl-fD5z$t(~QH+)-hOH<=y_%mhXD<3)0yq&ijWKMe)Zm z#)^-zq1^`*3Me9KlJ>^O{%M4+lIY&ww(P%o4We>-MC1?jNW9PAY5cJMH%1UA$3bB! z)34wS8|?XU>tFtV?NLGQyQTV@Y^2V|b&22a9vmJ3Ijwc@o__*}Q9yoQ1VdwqJNUiGV{_G~SmLrb9C zi4#sOxoX7g?@>8#`gJUyvYN+%Gxh~(>N?-;)mU5ydtK_nQ#cu&-(1^-2QL`bSCJEp zxYc}?(T3zn>g=R4j-`1&F%v2LN%U(3RPi*YkjMC%te6X}`uzxhstyuIq^zd;6p**@ zjK9)xRXZUv7MxlBg1SU#G$_&XTJGmOW^oxf20xd(RuV6*AUn-b4`GVG>vCcp20}|w zBBZ@Zqtzj7Ywvb4LwUTE6$^lL(Pve|^HcbD-ioE*qxGMjPXN1YZxLdJE2V}OHVi@y z+Q!<&z2C!fK#catk9*Zk?TzMG8)!(JXc zX)xAuSJ_Vrn--x(#%a728Un<}&-BEtC%=LXFwEW4YH{BQh8n-cpQrRz*;tKdhiC>PYKTgA*=#477GR79-GzKO0S@++_UO8f?H4gY zW_w`N^@39CwCm`5%C2SP>pON){n(29c!<`Frzg$(&bwbgdshsl41PT$XZ=p;Gv_uW z&DP4VdE`@Nd@-z?mU0Dkd5#m-96Kg(k&Z(Tk**jJOKchdv>Z-NnXdvuHRIKB3ap4= zp5Wnr4t$M%)_gk^7)B$xN&K|H8DcnGru5XUN-Uf(mSm(Y zHjTY;$LI;%I!<0xvvh>erq+usF~{mrBzn!m{g7e}I&Nd7xWV^@juq9(VV@Gw3dP|= zAe2r%@9|QsP|F*iG^^a21(}BlMCbI{f!jr9GD%c6IZgK!4nLp&kmtCBcK6pI|32y@ zyC`jyC`x~sys&F_Fz^khKT@m`p$g_?dl2C_^d$tbp99!+0LONIdHh;Arg0ty>S#MI zKU+S>)&BP^iiA1pDg|UU`yzC11PL`A8zA~$rQRRp zyq~iyF%4-RGdQqqnOzKHm6*NazENorzUd9uf-GkmV0`uVX?8`R{MVt>N zzfWfO;+=@qq2-iK8&6S*d237mNsswF8(tBsF`~ZTb|Mo(z`(1w|Lz+J3DQfIjl7fe z?gNJcBLaN_yX*-1JhEOmp%(M#k(|Z5)Ypo5#Px5LSo5;cb!|~7N(e;f*>E+;{NP09qjOMa}9#*#3CV}<&vak=z%fD z*BF69(B&k15kwbMrRdHWSh8)Z87 zKiM!)J%DRR`E7B~9=+8<_+&+qBn&A9<_OpPRS!cVqQO z3Rf&wqoo0yc84gnW9TsFs50laUoHv7f4?CdtrTJK#y4Kr%xV%?3aHMl@?If9X*uRf z2g8a|!jXj_AEyG(L3heb;fkXXQkIz`+qPDa2D*2wX0Jj>KCerX(Y}jX4F0)9R>S@7 zGlrTwrhq+YmyX0T^Jkn|GaGAeCz@Y|u+Nlm>#LgJ;Uxy7!JA;cvvQY7*jSU};ITpD z)zI{`X*4^F={uwc zP3Su{-12O>#=bezO6bGl;m0x3gc){DZDNA}HJ0W^SEs`~$G%A6b>}$~wgvK~0Yl3)Tj1-jL%K+_*m#*g5WV*S9eI?+dDQ^UqYUtj0qx!!7JWY*BnXth z@O=t6wr| z%e_l04U|MJu-Fw!C45DoTM;D8SDq4N&dU;;dfp%ICm{PWDnUsq=)$`~SFXx{7Vlno zlDI?8G7zX-@3%d99VlZFwYITc-wM32%u6RxFTKN!X;Xf>-itN_?%-mm9M=82Ac9Da?4(( z^vYpO@0y`I9cv!J_ooVkgRDxh%=Qe(%u2MY5YCzk5Gj_QINbX?tf!~klF!fPAp=TG z^ImGch(;={7k|<*DpLivQzkWGgo?3uf3Dav#DkA?dvW4!v#?a0itnqtM6E_`33T^d z-`izGVpP59;q~vQ(8?b7@V2%-V~o%eT+iYj<5 zn+PCnYaiA|Wz1&Edb`@TQ}W?-6||u5cDnn?pH{Z0_LgHGDrTCfyOAsB7CFWDHewm~ z`UW0J3r9}WvU5E1tsKe{F=#}%1(?1uaT23^R4$+Oxt1jHU>n>}fXpKZ`RJ$LXEbpu~-}`&BpdW(SLEHS@H*TKYwp@|OI3G~?>g?Jw1fz&gLs zD5tjjpX!~3XTZQ!LZZ*9y-`mx!b)4CktLXKQUDkHzq6f zC^zYIu(hF+V+l;?;dgpHk*@ni+k>4~dh~$HBF_-f$CgXIm(l3nvXohMOxmQY)yH!K z-*FPrdY3wYNg&BvMXU*m!JPo&Q#BA7|D#1{JHPgL&bz265C`2gb)VIpRB$-46^Ims zrmbkC^d_$%=8$}_X}7;%f&R@aB&HQE=IP@7Id{ zO8xSF^F`7`wdDTE2SLcvW2EhkE2T$l%79iQJX)fys|&=}=zIqJG6sIkjBabLrD^ym zYJ1=%MCEa;75mhoc<#H)uPQgLyZ&M@zi$8aYMPhIhdQq9w)uDp&$*-exm{JEZBtng zVm`#u2ykV=%b~4p1U)V5O>72cb)Y;y+lxOqrazmvKH!}6H1nnw2uus?$1ae2U1B{# zw%Q!n03*M;YDa$0PHwJ3^E}MfM;G@Z(qm9&w#fZO&s%IA_s10rmGr8uCA@lHqr zF4lTEl??VZha#Q_R{2MEA4a#`)7l#}pF>d3MA|Q7gMt)`0w0;8Z}*}*_RtHwb_o}4 zp#+zU`>oataTFTo&qZabIZbbZKV2{G9iR{0FEV9>FW@w@a&=-Kn~IK zZFExvL)l7Jmu4(sRErX_?EA-Gu&6x7H@x;oWMQ=*+V)Rm4gcI%ws*6K2sr+V#0sp` zhp7~6Ee72?G}bP(LY==PHJ%4Rs|+#+s8zDszRA;BgFHoE-G8+9+H_6#L}eVCIp3%~ zUnLW}G6g>o!{+QPr{j?nN3(^N$x|3sMuUjK22t(y=0UPL;u*E%B`z< z{G$NQS&d_qMNV&o0c`I~rvXs3Y}k(S6 zI>-WG*uGcJx=(lSliX$rO(tGn((%~UuX}&yI-W6xRIH*8W*kEv`(UL_@x^-9mYc>o zkkk&l9qdlf%bn>-EZ(ou3Er$}yrF8dPQK;iFFy-##1;Zlc^uXjYB@Ln>L-Fq#E|KQ z$!r{g)Km;{M)6`DqY|{FS&b&^Yv7-o!L8@C&N4Gv_=(A|6SR%J`X}^9n2kWvS z)kFP~#rz-(X;T!fzFYJgIMCLu6o;*GrQ3z(9j*7&spmJz#6;_%Vb;Zu{(JuKa1UAI4|pZXViiQHWcmS)I6 z-z6Rn{etm?uklCBse(d4F)t@_W-voy!jnj_DCK-Aw?uojZlg+iB3Yxw&#lCaADNi? zcbX+~UyX7C?&X7(i>R9bRWCDC%s4MC=?O9J+>8dolv)^}c8~)`B*NPM&09bjt#=$^ z{yY^CB{jKd2dn0=Wc<^72H)(G7){l9w~tpG^c%*V1Rx3&hz4v@(&QcD3!1Y>nr0a& zR9SYcC+@PNT!yoXhq61RgV}<1+phxxAlc`jvLmbRZer%juLs%j$llhL1MzAWjEzrc zeDxD76U7!66_ld+Wims&q5JCiF}ur?yM#Dq)Pi zJ&;nn$iJoydh4)(tvPaWQk)oH*k{WAFfU&yOT#*YDrzF&bSg{lZC@(T^qw=t?Fv zjUTOP0EFcEzmaezqV8_&lTO*wE0OItnN%{b_V-RtBox!b+#wgGcKQAE^+#V!CNmor z+CF6zLgpqg@2C*5<_0yjjDd%a;iK=H>F%Y9zS^%lDk`sc$aQSY;dA7Jl){(AhVg%+ zqD5{NO%w~FI&PGb0(k4N(={{3Sb8V#y55OLxCAL_o?Ul( z7p0r?kR6P=cr*=O#p3fYwhf173x(m`fW7ATIR^VXOz3#V;c17sEJ z9y^eXa9YO0Is_-ook|{4?eT#OJ^y}Rd)3@=zdA2fcVCM+nPE|M-ejbGO$8v{MZD7b zO0sikwcH2WpArD`F>5?pCc5$Q$pEK7_2QbKvF|O&6lUotE98KTkNyU#%XmKvwj9nv z*en5K<1dOQT&Y?>^BqkG`JmUCv$Qctdlhv}WXLY=*N^FB_U>y~!T@`$yF*cL-*UrO zDLAU)L_bU(G;{B=e|RH(peXptjA4h(S?O82s%r*l3aQ3_+cEJG>yT=FJd8%VphIm2 zU)-jKPHB=wK8^Q{cg=40M6af6m=wAt>5B-9h3jEXV}asX;f zjiB@c*1_>;^Ft{DgL9Eza*Gyu7_o0Tt*@vAcKJ@!J}lhLio9vDnT@55rqEfg1vNpf zA`Qk%fD!sHbv81+ynC|0KavOf=tzu)R-y0Dj0xMTr_r8++!f%k8=c4cFT!-Yi&Ozw zf*v`UPfdJdpS7mn)4nbh(Pbg|*~c``Q*5$J->@$~jC_lt#A_-KJvf{B5^`ZSc<4G`U1^f5e z65!>lL#f>e`ge)+zYS{-1yNN*Q(w@Upg+I&%@+t*8d1Ei1GID5kAE%5j2@6vWnD^1N5T{d!2(sX1@MA7h_K=r|>N)GR z0)+vP7{lrFrt|`!1V?4cM8?(~D@)KyD&=xDHMK z+$bzDr)|8tOG&0AK6$`CGMBrt9VN5W5uWRmr@iE(h6fea-Gx(pk>ZEPgS^My6 z$r>RmeH0IaDk$%>K_5XFOYC_R|c7VQ&BqcXJ9wUb*sB<5HF`0&5oFmJ1N5ixTZ zf?BUeo2x68c{RF{cVvp6Nb1j#xD#hJ%l1ucMiR6= zxVU?_j3_ke2Tj*mf1&gpyNms>QzPOtUcTYE8iuI_%NQtv}9Is!a1PKvdt@&Os(=wRjfQ ztKPlGt`6g5?;zjBOmiV6*G-zanWU{YvszYkttk(`UAtpAkZY3j7J4To+Z!#Gw^*eQ zwHVG5?Vw`!Y`bjYZY_H?E5?9J{qqqYxAogENPHCEA3U~~W-iO+6uFwPUm=U>jhbsX z`uRz2gX(Dy(7Q-fIQkC_!-csZOSN7T+bTM}pIRJmP%K+Cb7O1{N`P|c_x0c8e3?Y? ze{3BZ#Jw1JNWOoTSWDFX-m4X6k_HN+;x%~4oUv3Dcd&fm`?E&X1cH*i{r!C42JZB^ zHyZ#wkO$SW|N8X4k@p7GyW*OVz&*rv;!QR?4#6~~Ey$@@Zh>>_;@IG}Aj8X*qvMq0 z1^s7*MpJc6OO`+NB$4?W=agJqz=2li#l5DGxUx5q^29;~cnO~>D5G7c!|u96cfcCr zZjZU^gPoRII_~5gIbp)4>*z;aiM`vYBLmUXTY46%1N5CWvY+{W!-q%8u1mMp3L{Nn zt(-AbT+Ovr=9{vG4>gp`NC1*~w5Om@69VIch+&%vVNBGkm2_^~jWY5MKRZa~ASKx3 z@c-iJs{^8XzIde@=?3YN?xhrvmTnf1?p{I!q(M?Tm+tPAF6m||2|*eprImO0`+M*G z!yn7Nb7#(+Iek8JaeiPrz_a3B0@SXM$EtA=8SUAU87}PA9b@ye?JFr~@mtSrrRa4Z zHJttXt=FaWFXghLa=55!8NEoTRIEgMibLXNa7UT6uj?drYE)}(0=j+0_gR^43)`bU zE+wVbIAGK_Q9VzkOYk%krwO#9dvkOKXiL39hx7UE8>)mi#Z}AVdCJw0;_s2+h&D7e zLH2pZ>mRy@10XnL>d7OseknY-g?t5{`!|PF#V|h3=PCPoQWU$-ZZr1ewiQ2pWK1YK zRmT5pO0O!;dbj!H)Mu8ljQ<@3Mb(@dI}Ko;;zTBy-TTqD@AmKKpvAx%Ri&lFlkifY zh8Vf~b!aHVj_jMUGU9nv#0`NwR(*wUx7WT`ra)==z+bL4=;gT34c7Mhsg|2FUERll zxYsTp*XGtpHe1@7?pkJ38!LR;M_uGLDwA;2&NwXmP)8$=?=~?`JWd-oiE}%4X;iZjB|ic z*W*l_$wt|+Ah=MRTn()5HDO4)aEj9fQUiRqTiHBtQoa7?Zq7nkS)Sw!=$#BR9B;B{ zECJ~B>WldEzv;ir89k4+F2|B77Jf#EK@BLWU3PxsoKE>#t(ob)|6*)|H0( z-AnGjq?OsXw^S2y?4Y!{*3@7gwb{!Q`e$6#Df%{xe{W?qR`~Za-Sf(@_q^}T$he(E zz{O7kjC}nk%Zn@?$>hyxEQ}pByB8)GW^FUvtw2T#`S}gYEv#yie6w)F?a#6Evdn

})OJfDKa&nP9bSjLIfabDS>gWp?_Ohbin-?{rMFSL#eM?Q z_Q;fkJ3qh&htydfC5!svx_;C>vB5yL9jA|3xYsFYDh1a`^?})A0-J3swQ{rhY8V{# zwUS*33s%hKi^!5zaCm@8;|ru5B5PKY9X5;H45Ns9cHs+KmT#Oqtl(84v((MXpk6K} zIgTuLzqDjYp8^sUp+fs3#z179-@Z#Q&g>@t`0#95L}`JALDofu15FO4I|V+(vm{H^ zme~&U0;n{_&eshIj+%z4=A59-8+87xs5AvdM|a%B3aFT)9SvwHegc=@j;1)7s{6@j z&+p0KA)Qq(aE!@cBSp51yhXd^QDx*91|b1$bzB_kM62NFV$B)~&qm-JfWgpDr;C;`KomLT3<5mAymykI2Xli$_{dZP+|ZWpl39=e*pcR&*cwNR zNP)b~8~7`@l4hLUxIteb_F3~Zd8{NaZ$-b|5;;xHrNuIkwAToHP=zQZS8tiQ*ziEf z@8c$M*gL1~9>=R&UNH5cGEaeJkQUNgg@`<*#TgeX}E* z&SChP@p*^0UUr3kfXWV%c?I);^6z0t8Aq75#II#_PLmt3E7yLr|E^k3>GP@sqf!pU zbq$PfS~rQnP2I-pqzZrXt=$1(FmG`~(@w>ZgzxW9OF0r^q@>5bEt3)NP0#xD8+NaO z+gpS&vl?*w(uq`xPJ*g=x|H_t>hgwD#?Cg{u4=NQBf4W6s?rf0aixSO=nm|&2p>=y z4I^kv^L}MuOPjaOT(f&bc&`cPTRhBkKI=?ia}W`Y#6LS?6{Zpp z38%dF1%}k@w&R>Aaw=lfl62oQ!cK{p{;52)#WWSRF!J@gshT5D4|4cOB?+cn+goUM zvBpS#w-X@!2cvHphynD8A`^m>qixd}T3ZMFq-Q7%*ga3P3@px9D4uCD{vt{`&_v$U z%J8VoSDJF2pit4wgTdpg!owx#XT0x-e@k&we2&g2RitnTB2ntO)AO!45=G`j{ABke zX=9{jisP^;GLD{+P~V9oGgm4Z`=y8?ma_*nj;oVmjmj&{XO~6bZqeEr?Z==@ikt=EJg8u7M7ad%_&VX2!}$UwE`a1_|ep0~hO7S)q1 z2ef$hHwyZ&8?Ql0q?}z0)o0yd-)>^-34(-vm0M?NE%lP4sUB=m0hNr{K+Fr+_VzAM z(YlC&NrU}W;VGrTb2nTWVDA(yIA_}Dct}1xS}#BEW6J_(#CnUUT%t>^yb3HJviDLOL#sq$mI36hA%E{W*Ll~7XKQ_AmyBvw-qAlTk@2htAI?F=I1 zM2*;vCFH99OwS@Sk41Wuv9GsIwolcvgjV?5rV;!&Z1$C0ZrdDAf-M?3{z#{|iEg%T zN$8>|@_lo&&5NmyHFCO|WgFJLZ5?4}^ApWRmiRR&>d~q&KPp=8ZlfS3V6|Ew<5}*E z*`eKX?8s3R(NhH=a|QoyYZmr{O*lwU0o=19y#{s14IY=f(R%B!J<}|KtU7b+8RdPQRHNIBZV;4RCERJw{j9cE+zkak{olvEOnR;pdnHv&FoosRgui<_ySva-igwA=}yF+90pSpWmTQ9d!>+A&dX#wjQ8C zize+p=W3Y)=kX)*_aHI}zRZ^pzY+GCQofM%h?T%&WTjwhP05t-ikmWU=zv5`D>I7V zoV#w%O|1Mm#^1|Qwq2V)o5j_FVuZXO0Y>lGQpeW@x84o?_CMS~&qs z-iV)V=sEf|gqo~f)I#`A-lAci{FpB8b)bIQ-;X>sac( zKxdYq{Ub4*d`aCldF1t%slklB-eH7IOL55x%5BJzG9L%JcGtJ;yLO zfiPveF*ti1v+9QTt*d0V`e^5lgOlm4UOI*e<8t8KXBs}BhXe8}i9Q}X9OXmF26LR4 zYbDkub{Nsvj1bE;%o->cLSw?TA{cQj7RCkAyaD8ct&XJbr&*DlV^1$3;gfWM+8gWE zfZ{wqkOuAnk|Qsmr}9STD)?6LVzO;`PP;?6?PhYXR;IVN z;P38>O5tsB#0l>&1_v~@x*V|i0YiUm<;J>Bd8Upp9oww5)cY}ZkpE=H`**{j$rQ|J z?hTuITm+=(o1Ypckhjly+k?$%k>p1-aQ*jh7!bffGOawF33X#1`;pm$d;BIF#AdP)ShrKp9_w55(Q1{aT9mY~KIlD~wNQ*kT z*tOca{m(IQ>a0}olQThx)5fOA$f?SAkcG9E_5@K|#6`1B>%}u@_YsQVcq58@P+v{> z|1}`Svx+gVgF=>!MgHu8Na^co*!Ck-%JH`-GUaSSW~neP52ywC z_a~0hdZ($98X4EmJ=e?Z1SdB_fJ3YesFOeRzMwvv{fDCRQ?k zK|3zwK|X&V|Em~UpB>%uMI}0cTrqVVexYWzOX5t${b`2?aut(d9JW8)V`IhfsSyG^ z3W}v}kn1t|QuKtkDFa>Y>fO?!%*+orqgCuTEt8J9p}G<;t@4w1sP37GP<1#<1?#M? z#vfP0tNaPCxhi?EFRgu%GsWVRvwr%nkgL4Q+UUcX0w)RCM7hE3LExU6yh$mkAt4(X zST}Fiv)G11{b^$B5Hzn3wD;8+yzJd8$#9K9_K@bI5cWG=#rzrD+ftQ2qR9(=h3TaH z9^y{o6yy~7n>B-eZ|>|ZGum!#ip;ypJ%5G#UVT(x&vF7_a0Ll|3_o`N<}%*S!;BlZ9qii&VjUpxLmvh>K7R&n9F9LcqLv^>$15E|mfA{DdAGJz?o_vsb7-z9xUDs9jo#K#+#z-!8-NgPCK>i}j zKK6q`a7|d&kny{H)1A5jd-j6!OcM#)EBZYNG!C>;QVy-zF;{HpUKxJ1Jw%;AAW8M^ z8Jg1q%5N1)@lPd8of#7pmnmVc8r#b;LOkW_F$2*(SSL>b-ck`iJ0rx>O zCN*ecWFxa=HwgFWdss^}vh2S=<1wTg;{sbxdtabnbaVgH-Gg4uIYDXE-wRZ?u$9?Ppf<=Y@?R%5=1 zNqHqjP_fm^t>&0ylJ=iS?q4mzu5K9F|p9TcbaTkwIBuU~ORg<;Q$u(W_k?N2E= zOLY3Y$h-EF)7--+pDd|T)k@7s1t@%_dCrF(-^1t>#Kz}SuHTn_Ot$dq%cfgnzE=>~ znd7G}88$w;w0Kxxels(Rz2NS#bWO`bg(zV!)~*q0y>ytmMpqst0k$SkUQ(uhO1+mDwnWTHH$6BP2dFO)CAjHi7W z^+!ro1X=Uk?Q71DvUiQ&kN}~$(}R({vMTHqq>Hp>h2z^o#)=&W=`e$akd*O8m;w~H zWn~L(jtx3v>*$0i8YqeIS$o=hyxl5UJ2-FH2%UR0_4(%P?$ppuk8_sW`IZX7at+ zG%R@6BO(SuVby>Eh}_uF6Wo-p=5yAFjwf1HiT2r;;?`j#x|nua;#CQWhN8(*3$}Qc zTNN?<6T73)SS5jPXcB-6-6B>}(KZw4FR)5wI9lZ6kky4N6}a@vz`{J5@0(eiT0-Vi zu`^IxAQS;);5!8sVuft*vcBO;4Td#9Bft7u-{rB?`V($8=oqQ@O19mo%4f4^ZTaMwrfxnf!SSUXgMEnl*OLY=|2}h!rlFfdE2G z_G@EaFxBrrxB4zXw-z|Ce`_ajs#nD3htXlwinOy!XYQghVHj2-)a$uu$B+I zX~<*$a2WvG4k%SfR?Ca9ez3u3!iwh=UCAMXXHn#g#j>k_GueN3FNmK|W9bCQK-8U2 z%X)GB&#`}NQwGP^Oy8-wxgn@ko)-o-`b?8cjR7O`wzBEvQQ=xQZLm2@M!Wz!K~@ou z(FZ-zANWXOy<7j(%ETMQijH8+t++oSy@*|S`601tlMP+mDV`vWiC)?4R)=;k_49xs zEqOJ>u=&SEQ|qvU@hoZ`gL)H4RIj7+TXg_+@PyLBeb1u-vf1{V3SpUQvsF;T*;sJ# z-4st)6N%KeWtgJD=G#x7y8Wb&6Vu`6c>h_vh*4zsBkt*eYUHD@hN=DejMTSP!n0HPfinGxpvK2Qm>u+?#fzR50;C zLW%UYbn{iym?6z@Ir4`IHC?{=X$^nx`OOT@}lzlb?9V!4b=KQ#Hs^fAvYaZ#j( z*>XtVe$Ob17-UCFS$Kzfd`Wtb{hy-bsodAdmMUjG?PgX;$@2Cah7mK7{6R*1bt5 zyKAU6a&cM*d^Q-t-u17im1V8fy*&ORwFJ&rx~2wg^YeSn=zI}?n<7SANaO6|eW;e6=wUwp00rZ26{=*bo(nGDDtogN>}A}-hQmys~m z;NPiPTl4>m7T8;sK!1M2Xbw(Ql$biLD%#N94kh(<>@@WvU(#{ISD~g40V29p0AX@OpU)2HVBek&e%jF;XPgd|#!HCa+ zQH9L%CKH-nfVy-;K-zE~bvBbAGW7-R1F_+o-@5Rh)G6A!fI+MK3pkQq4s*(XhdX~+ z?YIamv2Jk`gsu;(lCkkVE(x5xo5y&|or2DPFr>g+km9RGc&1>H(WV_YNYx95+&~ee zy0I{XhUk#!wsd5497AjTbc~lL;OZ+Qwb<%-8sr6UKAlPl=lx^*GTfj>#`M-kF|R)7 zEt8G0l2Pgxj<9K8-Jo>v1CB$GWz+BWIX;)_DLPxirpcgs0BOwoT2b|Y6xb=m`%eM6 zOfTw^SQNxU);}HNo&1JRKUf0%8U{Wd3pqL;bPPYn10n*Y%Q9EUO$2INVl28zBBcaR z_eK#f!Un-c{&6cLb?VFBxDa&98jpLGgDM!^$0ONXv+IA}zKD{#=g2LMb!h%8ffH_o zX8&Mxy{D(=G;t94CIP#ZF55sQ$z@tA3IzAsaQnpmA>thKr_!!u>KNPnoPfa@KmFhb zAi-}+4A_ZDi40k-vXGqa9i38-@l0I~B{Y(|LM?)O_pFejP>{9Xc7VVUfNJ>j3|U16 z$CrJS=2_k&;)L7(y;Plo=7`v7;s`0j^wzJdWdaKT7`9c^>}7n8eN0U4*w=*}xIsZB zyySCXMra>>le|iSCSL?h85kXUrQ8bOQjeF_$m9VKE0zy~qUr$C;|*-=f8kYW`?lzb zjtuA2zBNi;2T$lceIC!p*U^nGw45}*Z<&)d{&t&s0pBu2|KP&e3i_vF3-lYKy8AZn zJHRz_JeWKa+9q1#wY9~*iqPIQ+SqK!UL6z*857QT_pbaK4C~$4U(mE8Y+?wcF>Ijf z{*lj1S5iRzmNfRbdJ*{D0~&%0{4Pl+(y6~hXN&I`rJdahW6o2@O*>ZdM%%{|fcxc~ z>O>p~7{!{rTDJMuQ9|&hpO6^{SRZfENw{zu(h_^(SIMHJW zB)cMQy6qDL%l#KuKpD-dxD2m;FF8=^fcQ+=TVGm@3vfWR zbg|wze%4j&=B2X5fEv4}XHZcw>npQWVH<+_4Hxb;Odn%oV7gd`k5KU`v#byr&y(tE zUur~Fk<@xtC0l9$6Y^Z51ohG_{WJA2<5NyXC88y#Hp}N2r*zx|0do^HQC1um2++61 z86Wo|mg(7slCc7F+~5`n7x%{D#SiEjPWc!MU}mA*OaxLP*(u?29Nhk^NTDMVG0u}= z*lV3kuxsxeTJ*L7(iGrhPhSCwda7)Ht?RNSI6amZFw%S-)bl3IIzoJivz|ELn5v8- z9Ct-}!6AQ~(rfYF2AF&Y0VXgO5M}AJaj2K?0#^UdEs)`p`;TjIz*-VB@{j|h>AI)0 zb$Cxn4`pQa>e2HD8LA-kp+d60a4Q zul5XnbVW_Mzqi*lsMyglEohQ!yWqO?0NOj6O>MB8`0U8@MtMvHw)%-*_Hi zCDH=1edRGOV0{iR9`VM>{aSPZpLj+Otqv+0ktZ?Z4b1Pid-5kx62&mr4xjCeI3vp{2`LVL4V*Z0wi@F-Hh#kWqgC5VQZ`wLD8x5 zGl(G)*oCum8t8^KJI#Uzs5AhE!1H?&f6AKSwQBm$O8mpUk`Z$?^Vy<@L&TN4R9pE{ zNi6dDzNXwlba1KewsLrhx?i0? znb3+Bwp-;*jc7B3H&~}G@#ljl2FBqbJy687o9Xb)vJ27LI-tYBSJ~MxcQ@DRLnsl* z-`Xj{d>zR}`tIUjsIfsRTV_VOS5lvL^1reQcsTX-pIJ%$0sW!5!_SUyE?>>BmZ;wD zkh)r4rb*1*#5|PVbRr2koLdSa1){oLR5=FD#k=9Qtb!e|JkD3J9Q;-vp*SWHz4~&{ z&1c-ma3(v^R;u!P%Yl+Os)7WGF!3pJ2apdMraefc>>Ad@)~>HBgzm7p06$egKyi%< z?BWyxY=tg;&Z^hpZ0$_2*NRD|pug`U$?QO8m0^_W|;1oBR5cDY$b78x#%y zYF@dHCp0aSB24sY>H}RBxIbn*eZ{IqdrCw8vgYDOLB3}wxkIzW>1@ZxP}?E_PFxK) zgP=3tmI+%^2V+IDttIMWLr!>AZ(aR!=jji&_?tkN+LhM&A0aQrq5?*|*VgUwxWrFu3~SU}A&hDbg&B>*(oF8eCbR%FW%>jrpDtH_2i z%>Yy?jKmb$Xye_QE;CcD=4KcU$Z>!dv6k^!SE;gPc!sh=#A0dz06W7$o!I-|v^*Knx`u%b#;yHnea8C4h7lot5lOk#Y%YpKHhuYhpKd9byldtvVKIMlPXzP6`;tz z&g`Oz2OECHZw|e&nm`}KjwmFa&k`o$A#D-<0Vi26X7MKUwXyhr?j4(S&!^E!f`c@% zR1=x|n22b6znt8g^VgIga$k@zabgm=>`R5S*blJ?QbqwXDokMqy4_Qr1(Xs2TIK5& zn)nm*q%PCj1`+$&_*5h$q}){0x?;riZM3gu!uLu}+6B6P!|nP1$%JLJ2}W^n(k&>K zTMAH*LGppSnsy`zvUiy)15X%DTsXaI6DK?TMO%o7t42ToAOMN_|83Lq7Uaq3@IRWE z-dmN)@?^w-1-imodgSOkcxt4^$rS_woK*kcIo;V;f@}2u2+@Dsea1=mXik%_jHK{p zGI0j^zhJ`SfrKw~{zJ>=OKkCzFK0E(}(8TR6)4{`KZX)S>Ky)!&I$sf`+ z{ZrT1!3hDg_#K`aM1i#%F?R!1ouiO2(cKb){- ziMqaiZkWIMaimPBkTqWmtc`ud$c{p}f$Gua=#Iz+@SJR$%5~VfKl}4zUXTsAC8*_w zw~ur-OZ+uyhPL!FdkwlsgQnPWwf`=7+a!!4I6Yf)!u6THHYl(d+hNsx*~O+1pA*&Rvd%^2zJ?0Bfgjw zU=?7lAbK^4DdUJ#iAy{5gIk5RRk$0c+DX+nFg2{Tk!K2Ct)MQ)4~_^te^Vz^e3#19 zTHPiP^kc*0H0wdKl#>kldQzyg{bmyIBW7%q1mXq2es+lMU9+D6tK`Ns;n_?7b8g`d zv|y6W5UK(wfm5!|=@oz&04&cuNHbMw2qml;gmeZO{wmA8C5kM=Q!m>-5&;4V4{Bbo zvje$WQ=|p`9S9zrwdm4si!s!Rq9d%JTATY#sG6(*uH>)QMR>k$+qI_^&G_iSv09}r z?yaBni^vKLi&=aA#({k2fY$DYn$&rUJVt%m{7Ewxz@aomY42KekzPaLO#ZhOptV%{ zat$dR%cizb8<=-XVA$M2HDKC5{4t9*ZEXb>s#5nxkbMtNUFXc1GuWeicf}Bp?iBhg zdGmhKJnfV4Y%(@%Z{ZA(wfeE0)1ywRq_Ma$c0c|Tsg7pGM{sE`q$gVIZ?OaY-S!O( z=eilLW+H81lV6;oxLExKf?5TH!X+_q`N=8hdM2q1IhXg>&14qoEw?L7xI}8%GDrU3 z5sBZcCO)nf{Imc!9tuRR+L!z|&4oQU(Bz0}x4E*cmb} z80;oeOn_)w&en!M%jc5`eE;W&`tD+-fRbaY?F|?C(W&C2RNLey? zJ$!-Ged$1A2`()$Qe7TD%n)^69&}550+ap(kVTolz0$`MV^5bxbk|5;+%`?nvW?ERhU8z%cuPL0jp(@!VaS*s9(bpT)7{R4Kp z%g-V7B4uO11I4n#m1>~!ZxQO2U#|h2P(vr?{rB zjFpQy$%G=_F5Ojmx5D1KxH$eNJ$v`?e!0c@!Jn#@2E0`1bD?l9j|)d9059`37l$ih z(ldr^LX7{oF0Twc)AqW;yVa|&V*$=_v@gY1q@s`U015p~9j-xc5}izArvbACf7x5^ zKZBJJ_qK=uzJat3o7zn%Zn#piU|JM{oN9xtfqXStWm=|wx42Pa&KH;{*)Q%!-IrgC zhElaDInmv~miIgg8s@@^xUd*&{E?`~$_t$G{%AL$N8D0v0A3K%yn(o5J#jU{w?$%3 zq*$h!i%90O=+6k5MIFtiSP0@tM_y*a9W+nF9diYA*^5g_pj@!y%T^Kqw69kK z{4a^GE|CXD?he3&$-Ocw1-F1;V2kUL0o4Kk_v`1bAvr^k(|}jmPv(eier?o)lzBUNWJ-aCkUk*uuW;k!ms?LYc|1>kq#^Io*o_y7#h!9_m%~wYkCQ~@^ zu1|lbvNNMW#7t!B5O`ueXDTIiwX0o$CB-NutHHOsJaC4bu#i?WrEraQMbU>VZ0+!a zn%a?sgk&PvtM@A-!!ry$MRP+ z@YAVJ3*(IF6I?OH-?6*oITpyytjHzS7?ADf9Saq@#bv)xL`thT$qCJ%r@V`mbWKsA z-wn(krN5LiOn-g48LD);VYJLv?qZ|0%fax={9chq^E;nMn7ww@W%#(#3d9_VaAV)K z;`;q66-eaCL)A+fY)m4_f0QV6)lwQNO=7T%lQ>$LYaSe!#~Ts&uo4To_V7VuUu#LR zN`hiICh4WdC{*Zlx#*aDgN}CQ;eE)h2C(hyk8B)nO2dLfGO}^K2!0>7AKq(p@83v& z{uL%a{&822;Z;v~z$n>HO6rG?*LOFCA%`~HSdjy$b;nTcfsgp1!eOr6IzH76@!`y6 zWvWT~NJ$(K#e)7>I|1{f&zB25bH*tBKA^Of-LrcHOB@=?BhRm!Ywg%+UA?OD2{={z zUi0botdV(kf+HrTHmnv&iuQ70Ecrh^ky5| z&;10phQBY*9?rqW@t;m_Kg=_^*c&v$aqM;4>PJwe&~{W;*8En0wyKr#-H$08a{|n6 zSeb)l4t^=$$A8-$Xqpe9MW%j5nh|uExC3g_N)S$V2R(bfNa8(9eoA{HyuMcX3JuCl z@EwMOu8+57AKt)$HP2gT$2XHYRepc&+ju?dl=cgyB|i7Fgs9*C z&DkkekLk~$T&t45z6TOre_0DY7Ioz`og;o@yEMgPJs@D<$iA8rWuo&5s&;oT+_ir3 zfoZWU_n49*z3wKq31p<=E;{30(^VL7erW;JTv&iV&n7#4&BbTSj)^q>w{#705m|lH znj3)gl_Y5G!r}IYml+g7NSi-6HJ~XC9W}2^bUTPC z9|cetr{5EBW=}yaQRu;S{{G_&hI=%Zvpko@!yAo7FuY0FSI?F$0gF`O9OuYU4}?e)~i0}1Fh3>^u8jK+@~oL7(!s(;wWc)rK1?as9Ve( zcQ?70L50$w57?qpE)8j;YGt_b0CKsLabBcMw_X~JC$JL0Q4779ahhNDtRZ_ zHAwCcRcp)L>>=$Ee5aTda^#N_&dU8p4#~7xUdKj{>#W#>M1Uw)dS7H1G)?=pw05`9 zP9ZzOS>kFWI?f%+pmv5!`$jEW{6cm{{RtOUKMq(sP-hrFFH{;r@=W;!LblQ=*U`L?VoHh$~EIDuv|QMT6A%;5;eZlkoyHzv_f z_S)m!7t79sPh+euU@VnV3+L4R6q%Es;tzhuv5 zg0h)LjhhC;QELSvRP!bk`u07}m7ic>2s_v9lDlct; zG*v|r8-1ul9E5hVY%&4z^CI-!h$g0yI=6rTeWgoIV}?-+qXE%0-%cu&*%cH~47*IjUV4BbBH{*Dznxovx#me zYCb~*3_V7n=!C9rM$s}-5T$HQCfW)M37jl@oB@*UF5=U#K7mFA$*@KY3E|mw7r9S` zQ0b|kGb*OYkIDf`_?)>iB!l*S>Htlm$Cl75@o*@bup4tbU(z5;BzG3H^>2(Gz4=4@ zpudGx<2wq4uTwsBkd{a}e>aCjt*v}Ek0dQttWlAVqu#3Addx5RUekAS=wz6rYFlqD zsodd>E?^rm1Dy?(8Lcfe2S1e?_^*12Gv1THtgH$c-|*XE$q`ufu@!M}CE5-K1xtPm zqNZapv4|B6^C8Hzr=1N%FF?y3^-Ox_p2!?Uk20+16B_fDtKu@DLGPW=8dd7h^%V?; z0_wc$kK`{X^)IK7d>A8hq0r&?RA8-mH()>@fsrDgG|V%~meApWcgs9_E#NU~P@HIW zz;T}}0Mf~{Z8$I*;Cnwdm_W)MZJ_BA{au+hODSwChj;nTU$t;DCeuN zlX`;6R0@@(@}DU&ETu}uKiLRHKK7eZ$xeU7iXnxy$J4Wrk>s-0(aKdu=N!dMLQ(qX zNQZyX>rTDM7mF4!QOthFBt@)r)bdW;-~z%eDA3K=B)BHB1#7Lh20& ziBf4hsFt3J3Ft?v*d~%(<90$ArM3kGP`ZdF#X34~CQ>0NxI6=Z%2&jUzS6emNvygk zly?6^pCm(y_-c6sD@kU5{3(VLQNvJl@e4=Qm{LI;=K5@MaI!+SJ(JzUsx$_p36wpv zXsWY_FI7&JZ%B*5WyBUq*2PVKlH#0u0soDzqqJlO(q{ggu^AWdy4C`|m z=P-4Ol@QZT0g9r6U#hYC2Z>lbgm<$G1V59BNY=hA^%hN7r8JDqdwMWCFn)6XsF?qC z9}<&D&06tx?>zyIuwF(QnOi?;g|vFNI&tu2SOs1(w{}>bUp_nXE|v}*>xZ&3BJQU- zJk~WlESLE3Y8jp+q0)lwf^Y$z-7IwO7<0t_;r2mk93qz{Da*x7Y4G8F;*uG(^kEZ`~fZ{FS=K%P@}$X<&7 zaPby+uo8Kq=uWcq2Dq811bF9j%kbGc9FY7y^1jk{H{6Lb01JBP-OPK@i)VOtqre;! zz=!_WqPqs%R5Xe=4xor=>i|ol5lFgp09;ex#c&|`TJ9k`#6GLP(sjCciZF3SMUX;(Ag zGZ&ciHBGi}A1#0@cYyD*0WG^Z@Q4s#Tz}aO4L~TLhEE^iS+#YFt_&E@l)3B2o{<#) z|41_jR(6_NBmzQ_QBjemNQ5wOrHk}y_LBbJ56^H?1-5{kL7p|hls#{x9fVvI@R)8@BGk~xWK+55Gpsn^L z_`iKsK+=MfNC(kLl{exAr}}>n+BSje3jQM!>O_$iFjptw6P7dX4{kLc|9$qwWYK)j zDradNd=9|?Ay*6mLTWsZ1AYXjI=^D-e}k6OojO-|Bvsi6FGn&EU-Jo z6lah;pydHRt@l7#6tF530MZ~p`ak}`u?M)Qo@Au4*%36e0H;5&FN&L?UjO^ADKk&% zlL~9me`C_65-xQEcai~&nz;kzf?vHxh;W4g)c808i(_XF-T`12Y~5*f0cySjVkE-( zv={8a-D{B(?la)RGMF}igcnf6%_T|4Bm1ZF!`}o+3FM16Yd|GZRJnHf9M70z15{eM zp z@;k+__eWIIrO1ys3Nl{>6F=PZwR`4|^PfXg!e3SPRjz&EuXES}y(a!{$ntVC`}Mke z(WFLcK2O4e(~Gk?!hWPS;}N;4#50cBE2^-PJ+Z&v@yXOnMKhOPI*0O-A1Vr#wYin~$q1Kx7# ztpT@7&JSjE6G;t~$)u0p`-lr|GACkp`HT7S6eaL=A(A|Ab_Zpr27Y#mKoR&f^@+ss zOF(FUd{8UG*`bMY|89P~8zmonAKm0ZA+R{Sj3S_M$5t!DY;8VFWgG?E z7iDi!-iOv=mg;*MCU*^1DzVh2R|G}XzGHN*_L#Nx_y$8 z@#ROH_{b7>!|b0Ur0?K3is)GNv{;5-;b}8bp$qlSHTG$ajA2<-O6( zmK8hnJCyi)p#8>mLT{tw$qvR}{;wnNJ^X;|s9nZ5DP}tCqf`XEZ}O)fWr zOry1%Jk_ojN=LuACdZ*V;G?&OL5@OVnUS6>jnmN2R!pL*`bIu@D!>iEKlE5g#z0gq z7{3MM2w0A0glDmZH4KV5`*TnGr*S{5Kjn8|g-r?wts<2$)l5TXWk$~80Eq@~il zvA}Q0(!`CSq&%W!6 z7}jBh*%{tg4wz*gqwX#z)7CTP#=+*yW8f_64R*dE^*v+aX(F zZyUd4;3PimBQ>#H6OapGtUNxyrx!ijnv&Q!g^E>U;D6_cC7q*f=Qy`C*C^3)p7(X&rmJqAX&h}N9_gE_)Wj94J)uJ!y!^cZ3s*_?&_utVR z?Hex9z41XMp3=-xX(IFO3fB6zI$Vi4a_Z##-$Ms+I zhlA|#zbqHY?$x6?qm$~v>2alBS33sF|6#w{uM|3`+85tAtN$bRh_ca`WAuPHfl2yH zASy_&@anPD%>Xa@N62XfQaf$pN6?(rPfdw~KcBH~Xk&k;ecYWjev+OB*8jEWKz>^@ z5Bl(T^XjOVKmKjwFbUK7bz>1iwql8*l`P%!Jhi4VPEFrve>m?FaB%v&9Y$V#y~^vH1YD z2~a(^62t%D?JMKrXtq8Hgy0Z@OR(S&G`Izq;E+Io-~jv$Lt`n%NDX?K6#<6k79X z6jPGwjBN4sX--L(W^d0B5vb*|4n`EgpBOsOkkVcsKM0!wyo~=Hm#Uk~K@}UK>WCb5Npi1(n{~=WjiRy++^DRJi^kS+*9kG>kO)g2C@BOMUtiO~qXio$xHNM7?(;4p7%Hq>EgsI9VFfYN!TFeq z;syZfn9R?$XTZK>@;PqRNoX~2Z*{wC9PNqGel6+(MNLuKK9x?q4qFJ`3OrYzmVmD4QR#ip#2_6Wj-ySoKQ9Y;X#-%YMUP2+iRf>* zJV$m_rmwh2nkY!hE*+jh>|oR*IQ>RPxqU+#zjo^)A4b5;gF|XjU%<25ed=}?mMFYi zQwqpk&=+RazJgX@HG^}~C9QN&-jT_euzx*3`PEk~B{IaELDGLgPLq(u78gJA0ws3C zi?WyIIwRM3?EvQO0(n{bEa#oyM|L`tX^(a=Bk#JbXI?=?R$-WzK9FV-cN}b5U$Vv^ z#64#yG;G@@ihBCe@F)F3kg_$9N|@x$e&LJR!Fl1OxosH_52{Q^EGMTJ%;Er}@M4Ox zXf3q<^{^=ZOuTBX)ccVb%t$RctE8Yv1Poh_pWl`4gU=M8>HRgwrs|?YH#0bg%s*yCL-IUymyrcFifRzS~#%aU4kFC z#Q#BoNkZ0jpk-fD`CG-!`;42ukzwALw1SDA1Z{JZ94*YqZ2Wg0N=K{-4tC?JBxO>t z>Rx|RDYZF9sBNVotfmxPBBy29E}032C|o|u_{#Dq!s50g!jr>6eR8319NyXVX*sQn znav->iYI#s>nzh3QF?qKWC*oUM`%OI+aeZ43UvXht4yd{$pSeyLiFkXN*yWwk=YA| zk6WPys(6Wb(nYc|NivGnxt}K}fE+BzyH>~y!Yj&z7e*isF9rq@Q@+tcKs=wJH*#6r z&bc{wd|4q_{p|2pnl=k<&lV{m_+bHggevLcDH~M|$BDIN0_C>yCgJ;)?BmN1^b{UR z!oMbUnXqgu3} zTh;iQ2VaqY9;lnZhJrJ67@4r69Qal#t(SQ^Vv+ueT_uSk7g4;WZ+2o>&dpRfv=|vr zxMJ87-Ytjryip>0t5eqAt<`6RS)mT&_Cry(R64iCGNpHXXW!533Q#-@GM8-5zI_tV z!8aib{-W!VN}nj}(cwDcW6EQ}=t%dzqsWpRCk$QbbXt++d$i&_3*X&v;+&b7m8hZ< zC+KS~^H8gvmi2zjjS|Z{WSo|M*CJlInsm`)ZCuh~N^<sVZL^A^;5Wr>M7T7=HYspXR$eU}bZL8Fw+x1K(N>=`q6zd#f&~iex zSim%7sd^n-lnobd`tZC5E-8b6TefW(ExMK5|f?98`Y7do3pU| zWe?sqCP55e7;EfPqpdlXRAkYcHK%pGkx@-6fWgPu>{^-x#uKnbpV3CdW__lL0z&lOI`h9@Gg4fc^%k7SQ+E{Xzpuan5 zKQg)V*-qix0fEA&{A~ApOy67@8<{1yJjsdVG>lJR4B3={fwq2K4vB%Mn|kW&ErpD4 zn3Rj}ce(Zu(4(U9R7$f(T6)^Lqp62S;QOQ)PRw68!(|Z6 zC}bx2vCh)G=xK@&VgV#PhBMt%gid*=rtxx7uhByfwc16^1Bn8~5&(v``Whn>> zKc)Zbgi3t945io8_a@YhR~%;+mpkZWK>26=k&K_8k67p zMty=ceoC!bqrj?hMd5_#B? zY9v{hXvV_sZ47?x_ZI}u5t-mVwd*5O5L5VNL+V$(fDuh9XMyRQ8El_675Z%)-xd3f z=44$7&8Krw4lwGr3=aP<`L03&oNAHm!YLXqC6_eiz&EMo72X5%8fGd{^tJm8&(=~L z50o$~p5>(Ic%hU88u=D=v$n{IwmmL>#)s;vs>i1C^j&$RUc*+qKSGj{b7N%il5o!qbipiyC+2t%us!#aitS_dl4ON?mNmXra8*%qdWs&s4o z@AkiXtS$uQ=gFhA4DSme3V0u$ISmB$$;c+$45|fNiv@Z}N62rwka`m(zo552=OcMr zJoR2jp=d`Qo3iS=sQGKEYutMBE3|B;cM}XrrLS@x9&e(QTCO-G>6*O4+suis z0L!_NDb`tTQKV#J1S(EEUf8YBRP!n69(Z$_f?}rfF8?c!B>H{`nVbuGGcaqoDwzxG z^ryvWt#+AeY0TBj^6YPH&vv@MX@3POFQnw3KO;5JjFl-#8xa%U<>R^#Eb1^u#SxPo<{XP;H)@UIi+oIIm_noGM zWG>@IUT~lcSY)gp<)CSak%USAPQiCMzL0fIhB)0LTDi`V&Qn(#3yYjkD*-urRw=EZ z2_p#=r6OD|QHLkB>;*yOM9@Gf!+;|1Qw1q4JlNij0TWQE#4y5H$&h%i1WT&$`;|J* z7e`j1)WEuo`18`ZL>dLFZ#7h{Qo}P0Mme4tb7UlnYXQqc6MTEs*{5G?y-s$VFyv{S ze|=j^<|245&?fdhrC=@+JxS?n-C-YiR#`HJjdUeD-9eWI`?-l8UZ@VWVIAdkAw5e& zxQ2y3*-1(Vv*JE0Uj2fn@XBlAbli_l!F-0p*@HXivlQjutUtVvqalB59g`%;&B3(0qZaX`ioHY5i7)ed&t?=$^v*4aSdX`cr z^wNcpz>X)P!fQ-&>ZOj7^XBY@)Zd=1pl8dPHp~$sHg$GEETZlTUmseYbV*SF1R6;?bXw#epx)U6XVDsto1}Sv7u5sY~9LK$w{q8 zfknX@vqNiBHoaH*5J&N8C}Q7}ZG)QE7QhecBrK(UY+o2lc~xakuFW+$Z(FAc(iN*R z2fx!j!J#!UW7rHnuDG!H;W1$;`9V==nJsx;h^utKS3 zI!&%$JdrqJsYw!vYe>j|-L6D@L|^;fDYfLBoHlp0Oc^`2JVencwf>B!{M!?bbiymd zdN59Ssc&M+QV?>cS-N?BXN=6u=jOAJLah)wZO#+P=fT)&p`;q$lahiSYb%A=%uyI?YLCPxep6zh=N6ci*=VNBV5w26 zB13<}iQ0pGHefD9?=bluBUvw4iq;me&oE3@GDgqwtb?6}PwYIEr$8zph7Fl18JshK zY?f_LoL5KJ%7OKM+t7*lkeF{mC=yM7BJD+*y-puN3VZvIzF_84&Oi%tcMMe-TRP&3 z$1bdioZF-pNm|#L%27(93fetUypsN}g=Zbj5(;J*IT(2`axwZPWA@Bjw0U5RyTAJ)CC$Gt z9b@}mEhw2ugo8^t%}nv}h)qxs3q##r+l0lh5I!}26#`QHZ(ll!cZ9z5%E@iZSQr-L zV~bfn440x2vs$X|kTQLGOKQ0c$ddbzrukY;I=+NcUuk<;IU$oZ=_FZ5gIAm7V4G2O zJ0}tSS9oAJd4Oom6hrE!KBfjU(;-bpx?&RjPqKLm%WtDf!7=Eo+17oLRwh#lPf-~l zbyI~k>v}z@I*xJ^KbmLmov1(YG3L|CDZ97NXV2?#ACta_AB~_*H1pdhuaWE$&YNqV z%{n!X)eaVs9Vf3I=rfBMJe;ZS=p#1#tSk%dW@#Zh=_@Zsj9ynfs>#;TSwReGKmWav z7aX4G^m8ox(M7>Lk#Yy`5Nx6r*Il%s<9Yrt5^4*sY2jhdcT*4 zH@msOKO<=MrFq~DmX`2FODlMry*<3c$r1k3%?myl7!2?6^?_&E8o~d@Be1-lx^jQ8 z+spItFYbo$bT`E38o_q(k=APX;#e>IxBJ1?I(%>K7re{M172li@duBHZ1wucX;rohjR z_W$7Xyo})+BW>`5?REIk?k0S(r{PaH8*>xz<2?X;G&~C4;p+M){vs#qy;ekeejk71 z^LM&-s9!-2jAfBcHQdzzvI9ATm8>?cVjr{5D1@3PK6JL zg#W?+3=O*L@bUZ;$KUZ+huQv*_*^e@IB0(tKA-jlJ{}qK2j3SNe&6Be{lDRR(tZC& ze1XqL1pkQq_>u*micR=~ABv5A=nnLS!yo?5|4>%o|A_w{@Ckmjx$y@-pZetweljf$ z))V57h#&SRZ?-0W!dF{M;hTN+fAar7^RFe^5&kPH2f9^S0l(<(CH!4~=5lf#1|kCy z@ZWeKe7Cn6{%{X{vf5gnH&T@kA1R1~U!NWS;jb_8uQL0)-u?dFs;-3(Cxrfv9u7X- zg|Ad4UH+&4ua=VZ!HV2J;Y^nN#q)pq|NcK;5c?4zV(K`I8x*Qb2Bm`4fE4<@Ql#!K(lYQR%Po4r|I15FWS zcX)V+$eg8cmPt=!suCLV`d8G=;zP}1@S2zB*^CoKN;N;6%1RwrJ`;PH@;5a#fx%z| z{myrtnka1ARw>?L%WaxobS67F~83Zxngu$TMOED6YHom** z&5(|&i@M;=gqQug5#LCGfk^Ly9{u>{w!6EFs8@f{{{?B%>k7>r=^uax{l|JNTdc(LWMzIr93>8EDDjO~Z!jarXR@X(#{-cY#iIWAAx{0-&3x}$#HjNuE2OkGF7uTgzKBCdZ zD9T7`dl(*fpaneF@w|qwcKS9PeyGdz20d*-YW(>~SwIk%@sap5Ji(8KW`5Z~s)MiEPwj6h!fo4VkgoaJ&my2sq&C_h$VlGWXSK(_m! zNR`}5LHsxH2OX5qi(gAWJpawe_lbSwEWA*eA0_ImE0K*QdGg0SMH4FPjn8lSCUpo; z|H+;(6YPoaRs7UZAJ@_}bE?$Y>HKc>+fn`<5?5INexy78;pXk2$;PVZlIyglt>=7s zt@R=H@!jlVv>Ua>6>Mr_yRd)O2LkcvgHZYU1ykHz{V*N3n$5s=KoNmD*7Zbkje5_5~T zZm6H2`l|2Kn}y5|x{8qQb6xmT6s5->$Fbek$!>N~3=JW^m^UMXouMjzLngAzn@5~R z!A)KF^GS7hP0v4>&#iQY-1>)7SGQ1uvOv@n|FB;`zmA3aLk#kYv9k_0QT9y&?AS7) zW%J2go;MYv57h0)!?nQcfh9jcY=<>Al zV0Rt;94D`{2T$atU5_QN6Hx5u4Flc5nx4cdp!I}F?D~jN-BSZb7TLSo7u$($@+=Sw zPdc3d;v*#H@<2FvkvH(pg**%FAG^l8Ik)2hMw^u`Ws-C8~AXfQysvJHK7{BO_N&!{9av zL7cn*BYz>k^E}uZ$w5O(_4ReNasxjm57+t#8VtYMhwJ8b_utKbd&#(OORRNAhLHbr zHw?_t9VpR4`rO`6j8XLNd-F!ynWk*IL~WOv~Lv{;`X~J*U-Jn!Pe}gnP1-cI}3YB`Q#YarD+M1J0d9k z>p+hP-E1L^`T{SYOIpmfzv6brH{@zdDEcQzGcI(x+FjY`cTg1Y`sL2*5??0W&~?+{z^AIPZFI`a)!b)GDM zz&&D2<;7blZ=_Z+Q%*EYnPArU{?U0yKeG~SPtd1uYU z1ZYR7wPu&+VsQ12hMznyQskL#y#D&08kiWOBhm5^fO++gU=8DzkrVygnWFwG$W&EE zvB=$>!D1b zeO-bazUsVDt@0u{LCOLbcxyK;g=VW8&Yk1RX1?1Spx^*&M$U{K*j<}YM<8o_yO z&+!z0@x<{E9SvPvUN!j-VouiIKX4zW?D3AlcvYdfgAOY^4)O6?26?Qd`X^UxgZY)b zqY`J324&a_m@mcTqN9*q``JUYYqI~6JOiAjp^y8|tM>cYQ~7n^cJRhM2Gva{u=BR@ zefM$GR#w*y>pI^`ypt}eZdH69&|Am!b;jU=dOP4PiOKk0VAySxglG_(Awwu7$!B-2 zx1-8^%w3@Y+lnSOsE zNcFHLdz1W=ii=Y92@5!F5RPPU$#39`|Ah3!Y#0^P{NxC9CUY3ocG?|evmPa6IQ2!n zHg2WKbUf(SezG2&`noG=^=@`k2Z2rn9EFNPi`KVU2#*@R$H(A1BglT%WU}4Z87|wd zM%)e}{|YkM;1|6{cNq4RALvE@qd3L9h}3urdMmfN`a>~?ylgfak2dfgP4&$@k2Cb` zYJBX?L^#8`Zp`txI9@ut$K&`3=!XeT-T0X^%taZQixQ4I6xhL?8sLeK>De!$7vGegPl_1zT|B=j zdGui24rn-9w1b8GDDv;Z+1CobEb8?5>D@4J#JiAkJsh=5)CdW`+JG=zRcgZV;Fp#R zj(GS))v4+)E8?9X%gnt;NWQu|YfR3&;_s&*#ugO()p^k^XyczQApXnnk>P-ioku4| zPWErVLrrc!SEQ;mZD(R}4rEODV&Fm7A8xev(;3R9;zJ$?@t2ubn=TaI4=85MLN8s5754Gi-yQ?JXNC(KX$@Rb_0)TpNfsc zdEf3!@S_y_>PNHMvNF|1QxeaP<-&!;T<1zP_bTJJY1=VLW(28?hp^(|gc})fjOzQX z>~0Pq$WQvpSoT;;hZ9g?=F%wtr`TQ zSMN5NR+PF`erk^kUb89aVIRxs!p~}QHVSENQ=90`YyZg0UoVP6b(u=H_z`?-cq{IW zzp#2SOYT?Bw)k*%&!5!Le7nXvHt$Oexye`k(gl??a0K>x>~T99J%ZI&aHYF+V)Z;XUmXkYAb`h_k>6mj4!XY&&ssD;aHbjO;s zDty0^w2cC2cB(8vqfm5>sjT(kJbb))ClmH#z{%@V5s&xm@FcjTLTd+Qqh(a!>zWI+ z8kbUt4M<{MbB4rb2V*_UZ0YqL^hVdNEHEQpcdf^a{Hj3R^T17a2OTzA=OGbTqx1I4P>1&+m z&3io$ci@Z-5uaAh7xz!IIePCbwz&%F^nSmyydNwuVT^wOdhFkDUHuNyd%1$n-gCt| z23;j_Or?%e$*K`%K9gv{F6XzsMhR9BHfnySC;P?yrMSzkUP|o8KN4b-cL3CGG}l!_ zvSvb7M1i)yf3h8jzgCxGUEP_uF?hZ&Cj=3tvhQyM?4RkXH;%<`%QxBfk#kVVP4Dz= z%e^ici!ymoVS$u5)MGh+Ys@xE_}P;>2!AeMONau$YuXG(XEzi$#MT_7(Y#jcu=j)S zZ_pNu^_JoDPJrG*Xe3L_k`V*?Xlk(2+Siqk8HICMFed(?@QXpQ`!CSDfqE3GXev@rI|HVJ=y#i!2rgh879%NCTFs)s*z}spNiKm@cZId_YnY?|M zhrF>&Q%KawZVq&6(J$!g)PTx;*7Y(lbutIAcsJ3riW)fm$v{2LIW=J7VP zw8qD1R>B{fL~v_p&h&BdD{7hDYo`LeBdGijk9L@Q)}T*F`HwLli0`?i95>EK|4X5> z2WM5p(gKyEx2P->;%Au^&9`1YmM{^hgb-hrmL>I195aWGCzS<1`u93J2b_FODgF0G z5$i86gGP?l2{;8bjY>i1S4eQ)&z)TYncmE&833^dg0Y8>XM77kPJP1%QX^6G74$ny8iH9XRq1!QQ5Eo&#pF!s}lQO9ZcQB$q( z8^;3g@Q02EP~XOnRXnUZ^f&xIKe7BF?ln7Xc|ZI8BK|08azavUi^r^YP=rpyEBadj ziN8tK$a3>1{Fyo;(M|+vXcYQ*^N_5z{YRq_CUj`H)puCU+30lz`&839O!{^Wlurtc zO7Q$v4z_hoVm3Slu+0p%4Drx?s@M0;`aig1-=}r`OCyXyQEsOgsC_J-D)ev@-5M6K z>HBOlFYV=N*v1F#x}d+wDE(}g+Yt~)W#|2p@p$Yk{y)-xkdbj6VTM5z=L?PBN>vQe zwZjzG0Ovohe^jj)BL4b8t^tATiQl~*$1yFEmsC7|G_){o%1`8;@q=`*+~4V;{2+R> zM9_Sv5`KCFD>WF};KlAGHFDT_n8BL7ibwpnpJQKd^O}Vv{-G8Vy_~*{7&*#Q5UgZAbeu~Td+9m7Buejt=|U~}-!;Kjb%nXFB z$*f)K-0$!l>uK!3)9AsckuveDkGh-}1EaPc93DOwcy!&|%OaAgZ8?Os@UQ_w7*oK^ zV!urzF$IW8P+%*;V5aNqt={g>y) z43ij=F!pu$DGKNuBB~T0`yzOwtGTGcd*>I<&02DK?Qt#1`H&VTwAO|x1X-%zwkz4p ztX(U`Ce=9(`k;M5O^$LWO(ft_=tKE%{Km|Dw<4}FbY~kkquRg1b9S;{>~RF`?kV5S zj=aGrtv=ijJd)uK4G$J;Ycv6!p7gqH<42uGL|ni@k*Wqzbu_>Fm)qf&(h_052fsK- z79S(3g*;srf7M`B&dT)se5fs>4Wa}F@Oxp}s}Az3Lg0^If1Zd4pialTpbKX2>O!fv zx1kyS;0Z9ElRq?9XS-n0Fh-d*666b7xjDu2KNzH2&-I5=XW!z% zW8n|mB|dqZ&gw>Feb)NeBxzY3>B>SS&;pHg8d?_MLZ$vryh}-n&{>V_^#LM3$uP=w zs;dseP)6rE?K$~vmjDLdQ1Pzpg3soJyP6+sJ;97{E~eYlpRKMo(2+^sJ8s)cFlS(o z82w@~7>VD0dFR5Y{$nhgk-JX#{dZtaeuMj@9mLyBP>@iIUEuRZ7*noMq>;ouso!n4 zljuEkuvTf=q#`1uo^GV=d^VQF{k|$RR`>Sw{nFjK(1c^2-%c8zB1t;%cSW~8UT>JC z@Kn2|OXoc|#3B&(3*XnutJudj`$5|1K|K*6A|L9MLGO0D#4&K%8nD?mam#I67*s-x zt0SZ&+eQT+M_U)_emF~mAKecoNr}hLgM6^wb!@tNm>i&b9A?j+tLb!Nu;r#*>(=A^ zQYQC@On3df*u`651o%$>@P^odmIg)As2`*qK8&7s#J4|T8nf$v@b~f5mZ`ob5{7YW zkz8)O0Vi^*@?vE>ag-%H@3*a>o2j`FESW}%A)9E}nI(>&m#R?tr{IIuCLb#Kwk|aV!aLS*HxLu}3 z#z9w_>`CA!r_CK54>gz`49_AdcjQLOT#p>T3IrF+g1NWL*tj1q7U_hYg$?!U3H*I7 ztR)uqf4Z;2o0(2zS}v-qb0g9`;Cbq&vuY*=xxLQey}be-Vr=Xn)TAtodbqZ& z&le4D{8sgziSndv57b$|yTH?YL)j}xXxme{_#uXu^K#9#$*h1{GbjJjWB_M})~>r_ z1bW%SxoHAFQ=m^DZRxUc2@P6CmE%j&hXvde5+n*AV4(^1lB(dYiGWO}inThHepnL- zi-_Ry_#6z@C<`A%=GJa;rEQP7`_!t{IFFiL#DZXt;gAh~0Hx>UwEUn!H~4w6kGp{C z%{7YPZrq^5!enkg>{``!z4-|muFGh=>mxYmXv5`&RlN9Jg8w^Ka(Bhl|}zq2ffmul>m9u4}9=>jeMVEsv1V@-3iMuD$6alkQmRDPYy&eB>1Oj`j})^Wd^sz@G=LRwh)GKt8!$y0b}^X>nRD3CReZCH+Ah-cO=qMm4As3 zDX=S7?~Z5i#J3Q_2T9@{O9Vjuq3D_!uQ>c4j?Rk(40jDG9m+(X$6i>^7PnO1;S*`^ zu39~}%QF8rWPFj=w76TJDQzQWw^hr z5;2F2i5j?0o47Eolp@7OrL$d%*`> zOgEwv)}>&-d>O*&J7J#(3W;NiK@f;-WEad4o=Mz81zOK)zs$T!VgUr7_qAR> zvYW$@otjz-2@4DBoOXZiT4IzFp*28;xm)Et6-)RTq-0mIS%E2RO-lHSe+w~$Z14pF z<>BATNfOAp4xy8;35?k3yYICt#-bK>S{U05`~38N4ZvMuGJ|vN&7*rmg%9!uQlYhs zpD)L6gkZrTBnjzSbsew2aRlDa9r%q&_YSJsyMo%|g~4fCQ4FJJUn%$q(R5!1RkDQhtV!iBIZnFI(C`Weqo=Q~jKAhub!t6;4#*25G{auT~^^cSD z`o(mkvo>D(A{P9w&Rh4Gg|c0m^(0=t@V-N6UGmi7dpQu(M`B`Put27L!O)}^+^iQt z&CO=q^Yw+4n4{fwHOj27hON?rzkTQzZeraE2DNS6_S#dv!j#Zky&uE_z(wy3eKrH# zw>BU0de$N%Z&uhQ`;9onFhJt+F`MgzRQ`KJtMD@d4?t6wlo$G2&btpRf^Ty_mul^g zegM{fYY`926RX8oX>C291PQOib~?Xl2CO9ZSi+B|aB4$kd{i@d`cJ_5soo9@Q}HIf z`Ptu#MaTj6{g(&4qMPC&?=j3!QSaxhXSq#!9&Z58deE>D`v#fwoSI0L(g3+1-p+v~ z@e#XL&JUS8DY#vK)$fC*y{b`b%n`aaF*a=vP=@Z0d6cHc=d5pm9>MQct@gz5NQ@fM z%LP1pn(RmJB_q&1A;Ha3C1-x9H){B!*>3)m(w(nKHoLqq9N~l>(tzqBN@>Z^wr_()pf;^;e*g-#!{B`Lw!HgxtiAsvl6;qvc@o*`c?lliv`IV) z-g3us4_l>&ZFHysprbll6HEeMH%GD@?pWS9oTCB(-=aCBIru{EpmcJ-16@sP^n8g8 z6!yP*sQyWvYZNZ9zGUxo7x9l3{xt4yPK!m228;4P>qgfI=qwHaGlHXlg{9g zco#EIc&}%YD=DDf9L@D|4_aLBja7$ZSiE`pSqUIRw|U+2+Q{K!0_KghYu?)z%wsHb zSy@?Y%8%?kl>@8df^vFtR7n)e213%F$ShP!R=*mk?s7q)YCd;PDz=)weeD9bBXqYP z+zNGah}a~&^Y@+5H!}P2rR!1?5V*S(p|aHMrs3J~a?8(EUBSmG15zbgvR0i6rXT6W zs~jYv-d8)?LXHiV&L%pNwu$L1fgwh&DecpK1=<=&*Sx@w1Hw}Q` z_^cTD&KnMaEkF9+16a6fH;D%O&f3TY7BRa+9MlYQdOgJ=@Q`a)!4hU_L1{VY(UVg? z3R-PJS%Z;3qkO2^4IDi4>+SKK1-G>NS~6`^Q!@kbDKA!~$1IK~U9$&wLJe_$t6?}L6Wfxa?LI=MgGJ5FTga~I+k0ODdqdxH+pLAC z4A_7iyR{J%s+?7s3&ttK<*Ytu01)|ruEt&Fuz~}YRGt4u*irf=#GPP&JMUn&#H36j zIsu_Xn*D_DtWP%y@-(@F+McQme%J~pA6VkHEjLvFwPW3R(&T(YG$(;i?~h7CRE4&Y zEzM^fyNF+%%=okn5n`zBRyQD;Q-3SwEzM8-8@*eA(R~ZSiOXuWoUq85q-3#7JM~f* zUUVA!&-a$O!S$2=FYA8gcky%|fLV!|D^~Xb=wuVFaboaao#8KbsS;u=m2^`5q3@m7 zf+I8q$Q}56?6uo2fb%YMP<21VOqezEQ#CafV!e}1veJ(o(V=;YDVX2jyD`=_w$oGNBrXU&lP&Zq90ER zObv@FPO`okJ$x|lC4ITK*@|Zn=Pmx8N2>F{ZS|AZay-k&@$5|*k>`-XD9+Ve`p#RO zYDa#GCIj{sF0iu19M?dcNi>8uwmH1V%GUN0kG0FJs=3)o_2tx1#jh!Lmhc{)DN%1%G=fw5#p$3ooo=)oH>>Xj!5}rcVzyuj=nmw3ud5Y1g_WP)!W6vbqIxZL^l8J0co&7wr*^SwJ&3)}{GZnhoOsuq3v~5P0P}i}O9`e3m%}C4p?vSe()uX2CgU;#I0;_}`YR#ZXBh#Z*tnr0 zlbbCs0=0l@6|XuLYY7EfAtM_{Di$SRk^<-1Qyqv}BJljsdr?QxhKm)*mmsTKw~1wV z)7FA~K8Rq3d&1M3Q zIG-MR5F76*|DybK2KkC8PH@P(s$YEH8%W}1r{<4hXPo-Pm{;G#k4k#8rz^ICO7O15 zU&tHojc0{hwHwB0Z#burMmw!SyY0^x*s5O(>wE5KZd!@RFSL}kpQdkv#P5KoE1&`u zo{XNxahs`?7OXDMOVn)Vf#D%VUUMwk9V}VG3)wk76`7SEq3H7}k92Z2>h@^wx6&mB zD>v?SBvO|F3YDtXRj;JVdSXFO7kL_*-eoqf2F;zO!Za+t5fFd%-h-}+ql#_3FO#cL zZP0wPCb(Nh-b-dtU1U@zPPlvDPAV^TdwPyYa;?=g9f>Npg!}1gXU*r8#uiW{-aG2g zC7%{^PBfJoT-b_Aty4QQr-2d*@57zo*V3E0y=gD??}&8@93$ZJft{F&WA&+g6w;p0kr3S5W1Mqd319M zy+=iZ#OvMeb@`J`w*R1n`#9k<8S2JEc`O0PI=<_8FDH{H#p261v>)CwbV@zLuskcW zY-95Sf5>-$kCCZdw2`OR<8~64uI3-S2uG{h^2Lg4o9&dgM;Kfns}P$Cqg%q_;f)`j zV3HyGYwTBi0>hxoCH7*U@4s4(kQf{J5G|i9O6B#+37WruD8VTw=x89k>q-PNvgcs6 zu@M?Q39;quC5@rQW5WaHxG&F7>mt`%PP)nIF^~=j#^|eX;iaFe<6?q)`(sK8xNJ^M z$0T4r%DD|s>q)W$-(yWCoE&@+g1d|fp1LT1X?+@M#as7_u5LchK1SbkcJc~RmMl_3 zMc~AFBR|MUsM?B@X?IY9*A!%OD4EHD4r$zVInrET3-~>u&ir-JGZO0H8A#6gLR@(9amL8S? z31>N8yRO29W0AApy<6>Pzvn{@B;rU&E5q(LPThGKSXNtf>r5yyaes+`d~|p<76Eeg zLP|uh7Mj&0!nou7+-%tq1}cEnoo>wc#gV`&LPYPXFmBw+Ha9>4Y|wslG3wztKC0Wa zNo2eFgFK7BGh*C^s&}CQ&jffEe$OlaL|$^VrPkE{*t`kT>ZQ5B!}5j*zeyhOyYOb( zpn*b6l>sSPFz}N+dWxy6fQlitxpLmbWPL*mK16z*gU&C*-ptH-14U6>{jB&rzPh}R z1x6W|_sTkn;6zw9cTf^OLq^!UYY#iE7u+tCI3PHyz0!Y3Nc>5aK%n7wy7R;b+=HPD zo)|`GDTv}@Tt#%Z;>4L(Td1aqfO%6*Pw?gc#ebOSXTQP-Uq<2t($1m{HDKHBs{p*j zaUs23()AxJ7g!6ZWHyQZ5a0ObgR=&nBx`Um_wwxCa7f%nzW3+PJ)+!T7vHK?I(IF@wz>DkfG z?gbE(Rj6s_mO0lhKZ*BUIQFb|H2FGw@&5j{*EU73`a!)P z>OksyuF4FMHGi`FNfaP{G0W7gc3SVHS+OBXvwL_X*$C@=gXw?S!8`XtnYdh+vBz?n zUN_E8&$(Q-gY8J=h54fY%#{=*_dKg*`ok7FAt=kp@5!v?Sf3Avt^mStla+}dndu=A za~|-o2^Al8w>oBwCdge{eme}X$rpG`nxhy^aL2r${A+9=hI||c!@rt;pm!rpvSeK6 zhV3@3+z<%zyuZ)gxbbF4v2rCquoa^dmtqZ;zSTF|S`*Byncw?8tJCZ$^IWiM3wQ#W zt;O1p7z98V^hsG5*YO@f#Lx8UO|Pq_jCDoGq&IbsIo;wZ4V6NLJt1uy0D}albGe@1 z#y^D3@09wj=|2-D1Oq;qyeQIKzD##QTa68VYhs{YDIVOgsj%!xVAsJhWw^K&7wZ?n zO&GQk*W2c{3mQ+nM9HOK?rOHN!=wLk|7HuqAbLzq9_Dz=ZGH~(?}AGEPZnG*{T|H= zi+cE6+FiVIo@c{3_}0drte8|V8!?{gE*@h^MF2@1b(~~UaY>P_LVOk3NkSnGXd+r8 zks*!SHyKoTT*yOiO(|8@xJ^1&RP606c>Cm(!qMG8MD6}Q{2AUO9nVC>ScV)~od>)P zuYK_MAcD97VYKY=uLc~7g^sP3tMav4?#7TPpBa-8wmkP0hR8~A>Ca{NsDy% zMkC!IHM(Pr8f*;y^Yi`R_wW8axR2v{um?M?+1hTyg_;(NkM-|xPCmM@^X$A}dR90I#Q!_)=?$VPS#)eiqXXK9wkMi5_T|~I zRVR0KEV2Q{Z&uCtti-YBi|h>T4dPIGrg17|&qiu5SyC%W(ZFcmY6=mE;q7IsuI;(O zG*y+3{eX)*{J?)x?Z_|{`4FYGUHuzTTwp+}tFpw0S0KV*N7-k0VUGNp?+! zknlWl+jVnyZ#lL~82y?!y8Sux-RtBlBk|bJwR%P*r8-(ee>WTV-G)X@Xb5M{n!a>O zZAsLA9!#p`q4JP@_wJGD>6l>@=jjWElW7nW9`ra?$i?P3{nZfzu+Zo4TORPclHCAe zy%pN5JI)}B9yyGTlxN_#<1&=@%0_jm=-s5W=5<1$`(Z-{?Dl(qaC5$+veap=f4A<~ z4bSNp;Hodcn;#H6j&BfWiBVVRg3i!dcizn>k6oZLXzBg+@U->cgnTfYo2SoG+Qv0Q z*ku$I4w<%lM8NL@kQYhb6P7gC+NC)GP78Rgin(I&b#pz5edR(n{oL<{JVlSBB|aJX1FWE@Esl@rZo^q zffHJgA@0t>l!!wTiPh+^!tto(KH2JmmGrf$6M{ev@EzdanspQ!i&YHtyiy$>{T_OA zzO&YR<67g?<;P`GPc*>$k;Q>uU2^>zppXX=r9N0qTl1Io6xvW5Ha@_GdN*GStnDoM zsRT^FE;l)Q*FHY~_`J$LHv%iy#;mCMNwsnxJ8>7>1o&+&1(8=+kuQg}8;Jl+0f+tw z1wGnM9QyXUy}^S^<)`D5{mi^mljU|F z>Pk=4V>!23-#QxMLgU5zr|nNaQT6kW|3m(n#kGr7#S}Y5-n_|gYg+<}UpMQ%vDbG^ zSZZ*kP3n*eh*_`kI9~kipi0!!v1dy0TvJ$8K_(^cRjBmCHcwdpx5udL3Ea4__-6qO zcIi4C+rHh$@$!b6w`p2qRTO_2e6NoB8|{~jZrI9cXlRzx1};{c98DwlD(U<6)+_Nu zDqLcU19OFUn_srA*D+|^UGuaruQOh04uZ&@g>ECtpZ%-D=hF(-KKI8^J6w3KcZX(( zIOfnk+{KalF6mvH*WPO-huqa039~wvV0cX zpnn;Q@G)0eHr%FqM=Ytu#sXl^?}-dqazg8?sSLw9$Z z;8%v#ts0*bCx<+L?JIs9`i@W6U|fqw$dEKSTVr?LGh)?Pa4|1oL<`T^bF2#>mJ0H9 zov4qeYm~a8Uq0UqUJ2%HK=FqSy}Vwsqf&U-(?}A2X2OK86vyS9qVz-(Eh?@)S>hZt zAoB(49F5(qQ>%wH@{Jhxx+jQttwb#|Y;I0>cl+5dIQLp)R6l>VJn#N*r`?{M?}8}P z#5Dj~eo@y%s=ah11oh6@h?DE_swETxf=KLG9d(CB^ZAY$HEk<$%1J(9fS*y>WRkCV zb8~aw@h{(DoM$sljop-9SHKG_zW{gr?0iEZfoDMy(AiZi08xdQoRsfXbLqvc+Ex#(2`|zXLdCuvApfBkQty&_`+C@a3&^$Ib~-MFXg{YV z#Ix+}pgOq6r&6(@$8>liI@dW@k&oqLo|WwKoUQJfMA4!>yT#5B)<%oKiZ&blz@qsL zA3toz?Y;HgH+hYgw8F*yM0EJr4tI2vamhl<5^HGYbQx2kQ5A~@(>TEu)bcma^cCMf z!%pM*(T`w)@$%rpIX4Qk!7$$I?M>f9a%hDKlKS4*1IXPvJ}7mFg?w>Y{zuEmrwFJ9 zO|=(w=T)=F5>%8R=-@G0N3S(9+(PlR*jLZ2F<@EgOc!7V-i_PhWq{7m(P#=Gpf^+SI16n?N zo8UCMRvulI{SH=HgDIK^lM4B7p$sQ$q{B%?H{Phvok0)*P(NBJ0=5c*nPwbZ4DKQ$L_S(1Y+=B zIG$4Qv2j_TrMTF9KbaMsHDb)tm>}n%67N#n>$qEh993E3=`RIYf1auAKV>_;FJl*d z_P)8!-sKK8mt_I~y|XVU2wv683PK3|sPw{CKg|K%q+EMShGN4&G|*K2Kv$^y>(&zp zt;AQz3hleUXNJplE{}LRHtc4Qq9M4%4lA__v8{ChS%C2c+Aak2#&@7`D;T#MFbo)7 ztzsHloo~2JBdRo5otcTD%mLA`=K6%eIFCE*qkR)Fl-*XG>lC!bNH;*l*LXo)@S48>~J6)E&*11Jb#$fBM0#zSq`@ObvPyw;R z7!7J$lV^UwhOFg1SMzm`sAIrPyr%MZNWSrpEQB3pXj6*c-lPe)BSu1e@HvhG03~Vev0SOg`pO{G_xNal6Oj&1Mi^f3Mzi;KqiOkia!)*GL#GBzNHl%= zY$tE01W7cy86S^P2RX4?HzljjW5@&!fwdJ$!g`)*1wlmB{>Hk!E^t+fsy z2|I6+o5c2QpC4-Z^w%j5hp;v8ni`{oQL+p0<~)c8(eseMM2F31g;kOR>ATzZZrhMT zKimz_Xvhhx?OH@#pqScn_ivN>EGplDl+pKo7kiL+e3Mx z8r;3;`B+{XHO<=rWi}Iq0T10$gGOy)Jkm2Dc44Qo6S?xCWBz{E*HR%JB z>O3)qnn#-{W!mzw_)m_lesxe1B5_~!tLkUBG+O%)Ne{}qwb#5R3L)GNI@F2bK##A4 z?P8kDxEE6yA&p9Rm{(isOIiYN2{-ZLP;IRb?p(e3na27_q#*wWNSNP_(;3rM2@wT% zOZBqPFilwt{nqD|VqkZ`y2BwkeJq

H{sBWZ&3QBtFS{I^yYdNc$t}ExqvJY@{)) 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

I~ytuJz$ycT;A2axkszY_YxdJJ z+Ta7b*v-SwivjGrq%c>)Ck%qakJZEhhXv0x4WC%>s1649FtTm+?N>nOB(PCFotL-n zqoS{-LJ-7c+SJX0#@D_)eM0e!J#aVQcfd@x$u^A9e&_0TwcYBHgBE*E|0y10d1#=7 z8HF7F=$}+X#l5_P^uw89X)(d?+v6y#QFs~fbXz)TZo`{mIPy^~r^Sj__>OXVJ15$|orN_*|HOX;ZmZ}lxx)sJpy)EUa%6WsghgwP;Z^$~?{2(pco;bK4h}HEHqRVSG;%d-C^vUxO zyFK3v-C$F6W#ddQ)Xw%EU58Ueg%16w@9oIUmnvj53`9@9N9BUjd6iplF_vr(chHim z8-?+1S~@zcTw5FCa)qI@-O%S!j2r39C(F(b4j!>ft_1~+ThIF$#jZ=;`L4`YVl=)= z9~zIjk*tIa(Xw{Y>@ODdqq-Nvn(#Dx`#Xs?#+}z27%Pem%V^w0P1IyB7G^jpleV_v&t5zVzC<*c%IY|yaA z*lf1s^H@a}d;-gs(iG!M3D##i_-k#Mcl11Z{`t$oPtkvJS$kb(4KIL(o2e=O8){R_ z&{L6MUsod+-7HpKY6HQE{u9@T>`}ekgEq$ON8oC6jL)$H;@{8nt;Zv!@_+JD1mdta z@aPxAb7Cq5P-K~o%FG}b;F+pambR?2pNY0J4rn2w@6Y1| zP%>6hT$rc}{cFh}&rlL|J(rRtRBxVVbnN_k=!+)EhyJL37rY5;(c-a54;ALLab{Zk zf#7jk;hMF0`LFaTIYwn*u~w*pdX^N~!be`O;}!PJ_v018oX=Q}@J*`8j@gLR#MSI$ z@sQ6nAB*^o3#fk8n$y}jgG54e z`={l+Vgyydzg7b*roJ0?EdIEe{H{gCO?b^ zR?MkCx=jAF>DH4e!<2x3wa}utm!s%7lCda4fO;Uka5q_%QL?b1vcR;7^Y_0n5`=hH zb8;Q~B3xsIbxH-^R2O6<6l8n?X@mZ@Z@-dm^^^1~zC2=z_wnCc68e5{V^l4^PMC{D zVjeVQV%Hb71q z;gd(1Y8z$-{6=y$R+Z8U?8AQ^DK^zpivOc(QrNdOF56*=^c6dl~Yx`0fW( zYmKKxX2kb`UaJVerH#Z2gL;QeJ=Jv#B}{ur&~9Qc6#d0ZYt|te{4^`)T%_I+qG7aM z&I2p@=%$n!Z*Br6#TCXPMK?vzDb!uzOU%vv736F8*}2bkfoX_)*(D>v_s`WHSINb4+y_V`8XRZ}b> z;C~qW7D4SQU93x>;h9Q2XgH`uv~+XM*~< zk22s$F=ERGP1*P$LyQxm2XTrq$@YIioN++}lDO>Do?-w5&`06k@B7Dd$Z9I(xON6g5GQG#VzqY0c zBG*~+WMQjbxh@+z9;}NKGEPz$hi`UBW8>p?7NQQ+KS+1zgr8zmI? zPpY}c2N$I_O@n_}vP`TII$?G#M8EO(a8!r|Jz4$bSGQ`|Y&a>9(d(ZwSHl6xbxz=; z50VpAV}EsB>u*aO+vZ8L93_IXE-+(=+L^K)yW0FAHht2hmlye|i*0%`{11(Y#rVCi zvML>zHR1VY_a+j-=YB*hA`7l;oJFPALH$q{-dd;zZdKQ9yq3a=S^MgT0}}Zq-K9*Z zYo=N43VLZ0uSS_+A%Tt^Jx=|!&ztw69&{JvmCV@aNY4)BBe?t?mL6+23AnA~EE9yL zE1b`|=uk&m7z(c%c}RE#$=$c?T?B+*vZ&khiQ>iDeWv$Nj}6I>U9h7EFOJ(?sGE(7 z1<1cyJL1;AE+Nx(L4NUWQ*hy#O4^sS9U9iJ?HBLgQgazkUYTFxxx>%#;2*#0TfXpj zZU+BflEaI#XAnO0yH4b08$UhtU$2`}>QaRv(zx?>X+7t&;^Dcpq_*Q}!26IH!StOuXvdORrnK3EE-tC0v+{)Uxg4Dj5*1ej_3%M5r{-nk>0 z=|153FV77K?$vO6FTq5g)KNO+BqJ*qrn4KP<<7=0=y65v6r)_+41vj7dX(XV!{X46E)XmJ8rn8$^#pcy!F8GiP9{m2t>yU8aF z`u=DR-RC{=4ngG*1>9gnSZ_Ehzaz9FPBr&)>ueD<(LNfLP=asMf93pC>v8n4V}C3~ zp}%6Q4e^$D?zSJU)t}mwHKnwFasd5v1HXMQiijhrGhbxc<*}PJdfnA~C$&+fe@Z_2x9$Z-^sgm+=qFKy1;vOdelu`B?5@J_p~vqt^@SA! z3s*Ni*1o1vCgJ&16AeD@H5%^IjAIUZBj{l3`KglQE}SYf zhFZVPdbN!K{Ws4SH|CfSn>y+u;spl6OamDn>>QTrO#1}}Ams5Hw2jA}n^{E6H>NBU z5+pA+M+z|omNep(=K{L`24u~YwBdP!)_J#d=Ns46WeO&39=Sh<8<0FTqXkpSi#f+P z?jt_lTEukdsB8>1;xxG0G>m#N(JnWP4vDEQaroZnayBS@fuifF3CWJRb1BsdFx@># zw0AOdi&RE4jF&)v=a1U2fEL?a60>B6{frD?`}JBU-od)f_RY&LQlxv60hmP|M8eMV zjHuEm`KISpNFMd7QFvnwn8v+A{nu3*%nBBf23*wTkl&ji`z)h};!+noY!uxl2!c)= zOxM+;c@IgLTl?8>iLxtxV$G|`8d<8dP+*g2YP#+YmUD5aj&rVw5ZE1C3tSG z(L_wvkcV`Ccc1|it1B(VT~0@S?kK>4r#2b+0-bPo{{wo+_`tD=H2Sq$iXJbb-FOFg zrL;<0Sy<;Ki45*+TCTc?xtgm41rF)fMFy%*^IegrsSHid1I(zB)y$A4m7b*2_b7`L zt=?W0-i=|hc1VKZLcFIv%Kd)QUk`fKXz+~<=f8iZtHEof!v0Zi^6m1*kyeYY zcG})_&(#o5Q_K8dtrGPDz(t9eo}1vNM}Z%FGgpy5Eq zoQFxR6x{zN%`1kzBOD%Ogbj1-v=SQJ#f)qu`0!>)V^MKYWpup47fPg4 ztju0!oJ+`Ky~AOt)P~o&>!k9N;uIZ1oKPIg7SirzB@;7KcLDIwS|=3i&&3Q<;Z1lg zpDGVh*FwD8?a#qDi0e&w5@jPl5SWTIb>o+p;TWuy-UkvF|EA!V2{m5S5_n@}&%C$a zl1Q(lVNipuv+%N0TPk&D$K;>Z+79H;+Y?>!GKE<8lB|qk{vqyG1^W#?T}hiNIg!y%+s@g4yIVdp z)FXaDUCqDHa0rqMjQd)a{ec}cTZ<;Xiv}&5{R6hDYV9hW^=`v{3ULgHw+#q)AJ@Lm zEZb7~(vG;)rTCs5&ZP$=)O!;k$o9fG&q2z=A8!OrsVN@ywkbewXrFP{wUel((>VU) z8pYWZMs62xnVj+w-ZjH0jf?4huu)T9M8*|w#I8`0{yXU_wWD)dCv;7|1o{u@k=7e( zbhz(FIN7p1m4E`xM+)X*z$PKYadMR82Pu0O9d4(M#`t*Y+NcX!di!<(`i&1ux(U0K zHnrZXI23lJlnBptv4CGiMD!O$^#8#?xc7jixC*}@p3kPIe~>0i*x=TuC>4y;?Ln?K zc7Iv?|1c0g{ucvbo_BG0`%ud+t6OJl<{UJ?t6PhzUUGT-qOee2JRiuL?ha@VCI4a7 z%5oU-zU5KxT2)Ng;%^$mmEwXz3mn;A8;5YTPrhI+7#Kre6g&JneU42acztQG`oB$I z|CX1b!%KcSgq%cul#lah)h~Y+PM*((_+8caCk*$aL>pz}8u?HA0d8w=HgT7aQ09Qo z_g*3c4)(gQ%QbTj6vgb`5myTo>>zUYXl@B4`K$AuvW_HpwP@OTml&y=;d>62n7|eH z6$D!VR~)g1U&SqNf;Y#P$441_|Y)mLrB z!egPU@(K-#C4$Sq;^#<$dr`w|cB|9g6qej=vL24@B;q#FA1TyP5WAZaqt6W=A~tk_ zUn&4b6|A(H0&I->pIOjl5l*{rr-_b#%>YKJ?Crsv^Su%NNn{qBHmYt^GvUdicex6p z`yt59X%dduX6pqcvO&2T%QN6hy*u6CYM+;M_W1+y09717M-ot}K0t2XLLX*Rw^p}qvpT1K2e_;!hyFpad6VQ9 ziYxtIN@h|=8}SZV={LJ|v_7uO$MJIs7q5eOpbp3{tX$i0PRcB0`V@q^qFxcjDY*4+ zO67hRNwMCWr8|*(T0SdRy>TTeemb&4Fuyv<)J^(HafbFFl&+jFn!T@ z;Fu2#55W0}ElsQ7s2Gx?{mH8FHUQ+ifuRTnFl zX>--JLPp_~%R;d9+%nUJZWrlpW3`wHYFHbHX6jGbrqwJNSIw0ldyTPz?8+?p=l+TM zMJ|bd7yL09Qz3-rl$=TNE>qVdF9|dbDOVl0qD+%eT3z{kep@Mu)EavaWj+G^9|f3@N7sQ_@? zQaQqKa;5EMoi2~k(n5_=;G*$I%c`ho7evOhp9TO&9jz-0&1v2k8O*LYq?N#N8# zSrJ@cAzKQMM_)W!b4NUv8(!Ys{Ky|E?@rfy%C|?XJ(j~yXG7clWa-*-v$E0t^lp|H zzHqs}E%n=cafV9tG%Q@7&mMEJn1JI`8A1Qcg*?vn1fyp2-d+W4kr}H$T|5%?R^omv zG)+X(WX*+LPwTU(CmE4$RhSQ$zH|LS97E&mVMu=#iyv%3pn21<%fD?IPGpXE<~}EW zUvEmST5aXi%4KG>YCz3xT7m?BVxdSrjbc}Wn!=(%fr$hR*tFFOX5NlW3rtWD65l5% zNO$Nh@%KFB#5lsPEe>YIEk0UdH=zapyfB-9E*gHd-s)u7p;7<>yqWjMLZ`Ppze&*5 zP@HdIOPFx|eS8@^BYYOfB5QQ07t8y;M-$=twJzyDB9wPz$3_b3t}|bz z;bM+p0EITYr4ZNP#F(8fzZ~tF9aOSC3WF75p!GG0Mi+4 zHutoa0e+*8F|P&Jg1!=Mj&`RPw};|QEo9$~43VwWn#~A*M3NMfB0R~iwmS3?`=?Nd zQS`Cmx^*9>IX7#SZJgpy${(6qh7cZ8r_C^bFDx!(jL|gYz5Jru%@U5E4yUuIyi3&*_r2{zmV} z%EUXiMobCos8xQ?9ZJ$|rSIVR!%c8B9qiOFWuiYhPu#5kQagE=aiz{^1XOGmw|rzt zyD(_?HOHHc{9!mJsQ^L^-e-??p|CQ@mZB!t=I|^@<~$R^8)lb(o)3{*1ZR&FnKo6? zLe^Tb5>^A*^IPsHY@Lqf-NB)6oka{w>8RyfW>pvt7wagrVxrcTx+w4vyl?DHO8j3A zXt6|;5q)Jer}I6GGL@Svcn)>#Xga~b01+U3J=FD@@pXOZ!&Bzg-f>(dkP@#DAAPr? zCF7Ua@%5lCufCu~Uq^j;HaM}k$atBg$%e#7Jllav9}T=})GfO6lc|%Z^6%zW5OJ-uncBSv2(0AJ|-&EO??gf)9?VmpmDe>5JP@$y}aa|3jW6H593Vl&ACBs=q;HH_j)jTbT(bo*D~bdLi3tDE@uA#9C7Ky_}w96T@f9!J+}QDGrSWh`A2#h| z>?G^(Z*Q9rE+WH2&>_Mk^pYy1mBjMqlW4@#j>t+tk%Q%!ALTg)TFfa4IP2c`hZUC% z1+ApZt{7}>$~;$97h$Iq{Ryk{wRxk;7;kR#RmGTkfOtKxl=*nSBgs3X{GPqlS23HU zeXKCqopm>Igz=?1K)NOHgyVBt+qKouICti}ur>x;Md9D} zw#mv3mCttoeA2<$flzy_uwNZ^wQlk%BOJ19yi{J^oi|=JHsHf-Sn+3Q z##gPjnLV6q36%12B$=V(*!*0UtXQ*!q7)_S*i~2df*{%J-5F2BQC;@n>##_VC> ztJ9k=g`8420|qu$x5%KF9TFaSZ}_{9a02DCr%|cFM4>HwK!Qyk(*hs5&CQ_&tX7Ab zJ96)wo92V#{-qR#fR?N6Uc}rQUa*Y{Qk4@aTiMC?& zTRkgid=bh4di`rHVrH z3?l3dX6#HZB`y(Sdlh_6wX2KtTzD3gC}q0^&w>ZP>T)@ehNSC2pFRGy*DR(grnuAPITNhgyO*8ahT(c}N2k`2Y@`K~vPo^=P3a1)F{Xx3!l+HG~{3Cuz;2E#9Ovh)RzjmGc z+MvsSI5J4qVBl4rk`dv;+_phmKDG{i0W7ylPM`TdTzy4UTn!T?1cC$)5ZoFIuEAXb zfdEM$xCVE33&FK+W@Bv3I^lEo1N z&_T>W@Bv9Prr8e>(j+CS$H2P(Nu_H`bzI`(cVH!m@`f(KE(E12MT6su;!?nAc8U;x z17FUU2VA1+1U0(O+%WTSB1;KUM>=D+kIH(#hl=!rhKf2-7Qy!iF}yi)TRYMK1W&en z)~{I@*N)n)I<_j)n}fc*SuzQCN(V~DBY7+r%l0osF!6iV!Y|NYKfqpxEO^a)Z#z;? z9`bH*ONeC6bxFCIUF`-H+f|v$4I18+fqYS%_eQ&soBg0Rb(x82DMLhPHq#9`Ju5M{4vKJ)Q~hv5rl!`R{tsW)aXC6y;$v=@#>@X^kElK?erYX;XS&Is9+dAY zJZ)Wp5QD?vM+k8K7o45_r3A|se>#=@A^$eEiB12g1F2nIj>20ie?rpN{osno%gEp} z8ay3lj{P~tBitlwhpj)`GH>_s@F01r!!0V0pfxZO(0=ic=z9*G`H$Vxu$tl<2z&Q0%$SiY=}_sHbS4X?QZ>3j2+twA2ZXP-ljMh~ z9{f?4NBFMKDDmB>%(|Fq0$cqoa3E`7rW%|7qK*7q^J%&u7X@FzA^7S<~&D zm7`;aRx3YVZ=q2|#)l>{Jb@vsCN0j1%NN8UY{c$FXPO{g^&}JPKoEBrtce=)Y#t}i zOOpX5db4wM`PiF2%YuiK=ew@IBWvPujN!m5K)+RrT9j3@;JamK;4OT#^QapGhz((> zQo>eD9_@L2n?O%{j&EUS>R7bRB)_ori=fVT_aoi@Wdk}mn@kB9rWr9WXtc`fiX9^i zWhK~FT4=74K4QM4r@5u@{}Kpg3X(-@;LD54u1a|BHpk9v$wZ&eqn!-{{d;R6w)^X= z&^|P5RE$J#%8ZWb#MqH3g7}HxTp#8HLeoApzu9G{*4;qsw1Us|kVh9Ldjq zEn|+xQvSh5PdYe+U6aTKQ?;h&6^Y-u$N)*QF9|5iaNh|<$Y2?_XG+9-N9SF%0ar(f z0&w<;fssy7*bRU!H>+9{vWU4imVP*{2y^g7KKI?Jo{h#4$(E?NDzw zi4Az`E(P5ZjIhIP@Yjydl1RfR;%=or0+Yk>O<15QPF$q^_)U}{jepG$6N;3jn;HnM zg@rCgD_1pZJX!wTDtI0r#a>gfI^oGS=l&2&R(L2QF#nTyZQ@vEP>sN-42t?ztMQP| zFD;`GAV75>-_-iNH2_c1NO+2BjBWk!<3l^Um#F;3!$&WQL*n&@P8%&TtbMNU;#ft- zO=XdHB`hg8z)uvpo9QuyIr~2Ll@KsY3gPyGFVmZV(zT(91b+Zm->?KOgbz{wwY`T2y5 zf39o5lqmNt5K8cRqe&IphA;%}>DJi1=sjK(3VBEMbk`y4afvIQ1o8Um&z^vegKR>s zJ+VHzweRc*bm20xxaC@P*jWJZ&fqQye!#$uAky!=24x@Q8R#|i^PtEIWgWq6$}WkJ zNQQFM7rg#o{ke6m_^s~eQqs~{XqQd+q`bOJvjPqAA@q?+gft3{;}741_g$-b8a47$6Y$Vgm(z^;I#Y0STp*?WKJ5DI#+bC_+i@4?xp_mYZm+RIMd$rWr zkvXcS_T913ahb2tWqM4L=(Zu43(d$hRpC33pur55MlRi z9PtNq(A}j9-Xa(SzW_7brC(IyA}B{~3d&`lZPEF2KlqC$y}p_o{wc9sZV(D)c&X;su6JRqZwrL0p z{&mqux7}E2OFzbkOtc$hoVT^dogE)(PQ-06Udf1O$?l>U*BQ2~kTU8YQxHx)S|j#9J{C&o@w0+SpsSE!%2zGTQZ^V=-P znDg6p?Tss+jG9b!i{PVQjI+wOD!z}`M{)cD%>JV&?`tOCDQ3Jy*XDLcKDyb0s+;&V z$otRfgqz{AeA>NmKXO}btun!6Tfd)o>%fPoVQr75rU2XOioo22YCZI)v=DtH=#0bG z6^rA$Tj&xO7S?vn>lJ4UfyUj;{ybyP29;WoZZVS4GIC7DD3#%YD#wEfF}c@DT}L3= z_yc5PY%7PguRilXlhjS4SA*Ps{-1r`z8D&_Q1u~b6gO!R=u-I)e=Sd#%*PV0UQT7M zA|p8}bKW8U_Yj`y-kIocKLoDG?dZ|%6W6k)%*mZwMA%#lam&i^B?qVW+rsVvUabiW z^_DCxE#7*RujTqtU(g&OtVi-IGOoB$Khvtu#3G3YxoF~>9n-fLx?yfO zmRGAqlRjxU6SpUd1~cSiUVXGAX5bs!Mlc(AwH_d8 zMxY~!7a$G@{ElanMjIfHiLTl|tofzjN6F#b&EDZS*C!p?6;pO zTGs~(;dQQSJh-%j_*B0SHzZdViG z4<;3b+{v~pzgWga*0CoNZQb02e7rNj`n48uY@|nZ&2CHmSCJJB&u?`67g^Zc`&G;N zs(To8EX#)e?yCCuWP=#YF{BisWsz2>1153NQ|%>Q3)ZmTR>~C?BpGV5=&A{Z`9V zV825;7AbLR+AJh|8pkepzCpX5H{AXJf_U(AY!Wv|^@SpK6te8TpvS*vGcxnc& z(=%e2ZIa2T$(WifWq!H0c}dAptmNO<6OlJ1dev#HU7@F>NM?fr^XM)r>wivo6si1Z zt$yk(Su7sb@wu-E>`Gb2GE%I|42G2IC8>oYWD_*@G~YIB{S$*Q-v(0KH^ zAy?UcaOs6mP>#=qx9^8v^R6imDB?VdfkFp>Mb{1!GfyjcAt#sS6D((PUO18an}4f3 zsgN9fdq-f1h+W4(IwPetL@uIgMeaO3|t7FxZmIrsV zvU|o_CYS}KVN2Fg_OB^ss1`{u9_7|YOcs7tV2aVWxSWVGXKf2|NE7bK#gm(S-j3zq zUty1pFr}}`$DyW^?+U~+Qd2QeYu{SySf(RHO z_~o*xa28NSh|DU}xPI-C_vpv1cS}R~G(a^C*8fWFMj5ygv@|@v3mJnmATcuEWi9qRAfkqTGu)KVBHj##{yWB*Ym(N&20-K!+QUXL45LL-mX4fJtbz*no?|}=po3B@G{3XF8~Rz-bb=F zd{V;DRh$u!Y|u8%m*w2Srd>OW4OA|zR3g&_51ZA=9+xi|9)lRPI6MQCb~UtH?F$;N z0{=1iGFwrps{}or0?Y;RVAW8mCpuA`8cAqL5?fthmn*8gIMSF=d^)e)XD6 z?WwfzeP4@zGB>kpm>yFx!(8<=yTOux^W((6pZ?SyE*j4%#9k(0au$i>>pU*X;!@&W z<|0r2g_8DqL=D#>Ig#@i8~YmWzw2@7C7Ndg+fQO$h5AWEE@oRSyVosKb zCihu?3_urBUz_bxQ+LFDxsq~BXnj4`K1*>Z6Ap@GG1n8bNgst&h;WLSO>+)wpQ&(v zSA4g`QqmXdGt7ud^UcppD4Fl>t5G{Yx6d;6oCpMdkI1kEmrvSg`WIN4V`DBltB6C` zwQ73QM>;$8f8ssDs=r8imdc}$NPAB)g#Cq2k|r{_t0^Q=EcH>fZgwsAP&{KaB*60& zf1g3@OMX*bTF_1`Q(TBhJg!{>^xHB8E^ulw+Kn!`$#=fIAgnQp`lsM~EO}4{sV1k$ z>FSEa>~A~jGB$0`t>gK_?%MC+zP0MFVhhgcPR%GJRwK5Z1sEvM z{T-*-W5GD&{l3f&AWQQ1%qIMxx$SBU3<%E7-;z*9UJL{kyygMBi!C|9C}9Pp!Of0<3rh!Z!q=H6qaCTBn>t#>#$Q% zI&o#O{=1Y->z_J}MkQG_rUg6Yl(uqAO^RF2$@p=hzol5wt)!)Rez4P_v(*-9a@Wm^ zojmI8Ion*Da@4^hcx;v)WG)n}2w)x4 zR5EHmza6lA1Juy(U7PM6>C5l#enpdh=1KCV^AAU6S9bb!)Z)BrRD@m_x`L{?d&(GFTPzk+G+M*iE$sx~~iHt0emZ3q3RU(>MD-(BaFJ29Cos_Ow~o zQ|2H7BmdpNrstjLX76>H5{@$`wqWGwKRZ;D|U!^niy|>0D!7uk_h} zuhul#80J@)Tm7fO*@y0%)1+CcuqkI9<)Omqgd&AYo*y;d^3gi3o7pm)2q!r3C^4)j z5VO!}vY8iG{{1ozv52v~$O!qt%-chMdDjKjz#UKP`9;&?f6FKZgRhxg2;pzZJH;_N zk&T%yAyd4Jo6xx2c+(R2PQWL%0QFKJD93)|*>V2(+_61NMAT@Fy(yu4JC^dUt_X*F zVCznF*NYq%xQ#6i9N^gyR8Cx7uZr>T>zWC;fETq~ojg|}Wx^9e_wnVbviD_|);K{_ z7@pz_X?3S50j@my5Z$162`ZgI<`Iy3(L`3~xU>31v5YWw+l>zz4g( z1aK~cmOv{$TBswLw=yF;;_ zTVNqVyuA=Mow!D#_M1hRYKoo-lJsyZPgz?Dxwe`SQ(TQ(KkS4OKYQ$0sQgM6p@%qZ zP_fW5V?xuo$X1v1ERIOax*;r9as%QX0X2^Pm(GTQO)zk7i7%ffFB}S_5k5?-P^k-| zl-6-&DjQW`F(#W37-9E;IkUCGTr$S7wCU$Lu72Wj{UN9$H}DNY!LbI&h|t)TN`JXB zWB$paegrnDG`saX)o$HX^|u9^XS3OsvQH~@KA?m?)Xb9h^mhB%WF1%mtRhn*A=&LJ zLXT-aSHV&X;MgB}k<%D;7g}+L@o2lf&rfaxw;fe}>W$DcjZiR_A~cR3$1xGvir>r* z_(!LCk|=Lk0#~nN@;s0gV6XQ>X+1}2Yp4I|OJFBH3F_wA?|rJ!qFa$BFH%N1T-f5` z;>8-iGHH)z6^UBd3#A8XPjiU<6HBK5V$@^)K<*aXkBll}()u};WSu;2BD1Z-Rv*9k z`e-+v1H=c4IN0D@Ehx}Wp33M$hky8>aBo@w{e8|iJ4mfp@~SF_r?ZEiKL6VxgYuuY zNdPh1F)QzoFnF5Pc0jWh%N&`y+C2?Ww?7?o%>|Xj`7wqm>LG9v`ydk4*jnDHo`3kQnLve>sQy;MJmkZ5Gdq ziGgpig}>u6eR9=VBTq<(%@AOm?tnoT0o_w2mbx3C@V~eb9*rM=t7~8)W3>f3DYiiK$pO zeruA}zF98zR~I|8Y`%u3WFW!^Y27d2;K00q3aFl;t5C*Y@Q3 zjgHr)4og0*s)8*iNly0x*ry)>`ial)`VNp?uz?uaM-WYo)_TFjsDi^y8Fv_>^if(3 z9Z_6QjC_2L2CI(IeK$=RC#{O6vPqMyHw#We+Yc`nEB?BA8(VoT>E5h@^QUMqTLsu= z-F1E$N_AgM(G0~VvjUf^xEd8^rFn(9b`-l64CfA&6Bj#Z>V=rz%?@GRU*LAt3H!%D zvZpjE)bTHO5PIu}e-s_Re+2?#Wxm`=>Cq<(mbX6VsNg2GYG{$|w;u4%bj%=!-xMZD zi)#CcE-H2zROuTebt``D=2(u9^P7}jU!syR zes=c7qwd^-8~xD;3F#hHKroicl&Iw-g*_b$5%-PcO@URzPs*M4Aq`UQ19i}Q6;aWH zM0b#6)kSOG70o^iDO;R({ICE+A;&SD$C|jER^VzwV$hV*PZM!)z zp}->&RGO=us;wMp%J2c-{FkP)mF7w`VM+@md+ApRDdXS28p#4%M(vkgkgcnG-xVB> zG{3i(>uwUS#z9?hSrMv@OHpiWaVlZ}JG2+^QM4T%-~syEm?`ja#C4twwKL(=GqlOy zW1#4yvIMx0-aTWxof`>l+B%J|h~roiJor0iNl@bZ@|bp0?QJvN zagyoniTytQ@6B1;xC@CGHRT{oG~$emk!iZ?}0)anNbwuCpI#iaYi zZl!Wm1anlwRo0JSUqWvO1iZ2jQ6D8av>IrOa-0tgV89MaXm&Z?+ zPb;aOyZFjq0d6vDU44sDV%b(6N!Z_E8kKg!=?qFeR2l$j>`oi%(F*2C)8ltIxuVG9 zD!}fs{hHSg${8vSA1&_O&X1A*b%RB|M|pQS#fo_H;tDO38eXk$WiC zATwI`)_yov{KQt&(URZ!(U&dRF}C6Ar2G>zVSCXHvvwLky6E8-c3R)yf|J3DjORY2 zf1?pMj$0xRKbdzapOy|_0*pC} zYE;wSYTsUL_>PQB(a(*Db=CYg$gy#cO1Q}-QFCTwZVw_kjPK6rCf4{Iefyr;DnxwS zvR1@F>m^;+7xf?&4qfaG$L-54OUGUyyzh83CV;93J#rtIU9^34j{wAYeLy)e*1zKiH$5eER zF40?U1+2yOm>0JS%!^exR+Rt$a?%lQcX83vkHzp?+^@HLBAWW_GIAo>p$|b+;RE$Y zr%{l5&!~wBZ=E@*IIN{k=D7paeW7=>yg+tIn7fS(V9VwwLVdPi!<|1AIy0#{`X(}! zyG*G<>RF2<3JHLc@oy=O2xM%{U(uL+cVm;s8mU>!L`g^TBf40Agj;LwD>6+wVZ;Q= zcMgfwOL3A|Nx>3aOpPLIZW$=6HUWhTg8?kY*+DPFKJhKLUJ6HD7TcjLGGM?7O453; zRq?JWJc#EQbBH6X$^69H0N#@2|9lTNf`ohnavqmE>5dQHWv8UHNc1#)hF|89@PhJM zrjsMGRa=k6aQO~RtL-P%Idn`FQBz8M;ub!*;?soAmW?d|B>KAh0BR$w^Yiwnf6zFf z3FU%JV#~uig<}zcVQAcJ^kXuoAcbX{hC&ZBB)Pp4gXf)XSjFvA4%XSaeL=btUYZ6r zK)uC2xjFVS(xn(xQu>Bl1;m;s{~(uFqwO17MKkbn_#-G|6Vdz(+4fgQZHHDEmL1C zn-CrVMR0NJfKPPiu1KIp>W;-&kNhk?^wb7X9hlV6Tn_(v>Gl>46f8t&A0iH;SXoSL z-*P`>i<)A08v7F5HE~U!W#G7$oLKV>^!m-WprS@Hze{hN{k5v!PH5M6YvY58PY%C% z1tbKXZwSw(XdbAk9@|yo`Nv0SM@=I}5Io#OTOw2DF>r1Lu>E12Tb^l*J*b_cX2Mh* zOE9JA<(NxbH+Xkv&1v54vYs5@((_@RP0LbM$Bo<(=K~Z3kMP|qd;)u~rv|@O7w3j8 znCrWz={=5Cdar&03*W7qoO|q%o$z?~K!9PYqsN7}u)zzD>Tg=WMs{&!3cCOJtv|>r zKADqN;bcD?^9HJjRVh&+qgWCfpYcAE-V!^!4kv?+@-IEP(D>o`H0#`(GEF8DBOlir zycP|0Y(#mM;({$xV91S~>vL}DL)P8L)e6(h6sJEEpvk`^7765}5 zx1>3lH_QMca!#{&B;!mGh@V~Dn@SOHQ3pHR7Cf(CGQG^4E}7zaPGYD;$c0}k6W>Zw zW4FW%zA+_?7(G{TZx9@s#714C!C;)`$#~}AU$IHigSD}jMBI$8xtcu@S>f=wUi3wQ?Et-h_(1e!N002(}OdjFWT+9<}uK+Gs-kg zD_MVKH_{YnGjrGG>(<0kty#^tUAKd;Tl~QRHD7c@G#b0TMo_f0XxgQ;?^+~c4Sa#V zyU}ith$leIQOad^@^<$w)SY8+btXh|VAa9in^CDPV>ZAWIKo5C9^-<`fe=7NO8Tyh zSza-yt$v;2d__ZwzDI|s>8^r~ewmJ? zTmQQUw&Bth3uIhQ`QWu1{poDi3F|{1tV;3u=(C=><7L+kBu0cMa-3dQR1utcsuntq z3GuUY+dliMA_KIbzFh{OhhLNa%bH6U1kp%f!>?<*_eq56v5f=qv5j&T(SHkf{Yf+n zG6Jpj-h93kV4sk>7ol8vh2}-I$FH!vJeZ zlqO!wbgiULgJo8h+c-(G!L&VF+@?Y+gVqrE!ja}3$n zQW>7l6ARMT{ELHE4SX6OQCzDzK=^m}J|r@cEnwNLxs3cq@NR+1bMP)15UIRpay@Tc z!}KEh{)6?#wb!2a*0giGc3tuk4acHlnjaY}wsvU&FSIbM&4r)GR(eJie0u)U-EkKq zULCmJHkF)`v8i*zB*s+47jVPRf~A_gNd_zV)qg}XCr5d+SiGJ|e94!`mW7EJMwji1 zgn1^BOr4~Ah-zbvIJlKR1jjJCLwpor3rg-7EPW&GIkYvzEK&}%b`16>$0;)N*=%m2h9;`UeS~sWgy)gO|@6c_rwg9Yr8lRO_2Y$fPYf&3qlrZ38 zEz?jxn!)7SnQOg)BRiT0Da4$Lv`Lef%A@A{3EU|8PGO`nX5P(U*AF}je;9a#6VghFCRZv@mJ~J6kc{CD|J{zU88?hG1bfTGvJ2SP<*X^s9p;0V^v?deLQ1&^e5_UA|Zz7NYj z+P8fF5yt=J4ZfVocM8<@&nhbm-8j;t5YCR3zUV^ZD9$)B%ui-IX_ouVOc2s(zw;-Y zAk*Hy*Aph)lGcMQDV7xS!f>VbOf+J9b0iA>3*xx>0NGh%@un^^@?g9 z4v`6U8%^8h=lBNMMB%b;2E@ujc%{3biIp zWiFO82{_^d0!5%WiFAsL2Tm?7ynvnQ?T&Vc9Mqsh4aoI;8K}0|R7766p_vAF3a-{% z1fiCpX`iMqF{e|of4Kg~2&4x3&BemAS#MQO8SH99ey z<1dPNI}}PU$u(+?7dZ%kGryMtm21cI7nX<6DFRCo}HWMvW?v9*n{+KF6eW+l# zvR{;vxzlX#wkeVDMyOI{{&&6wjeu;!dbYg;$|Td7;yh4r)chY@6unHtT_vx03A4Op zSr9Cm6R}Kq_^9;Aoa|8m$b4J+hRd$746npeW#&d z*zC+d?U$9Pg8jmBx?khXSb~R@+F5*MNw(E`jX6h|wnOHpZ*`O#Q}i4= z&5=qc3~MH?j)Xr!XXL582L9|&#|IE1Ik>NNPmaf9y$6cjwM(g!QjSY-w4hpvUbwNa^ zs;df=HD4@>kWTot+ZHeJl-*UG`$JY1As`WS^ z{F{2tPp~r|)`F+GeYJrP#M)-vC7XgI&FfKd|8~V>{?sE!^xQK=k}`o0TWzp zGK;D6a0e>XZ_sqPdR;4XMa6PECB#;ok#I==e{<`uaiGn$0k=i5!}q)jf|b`4KtN)M zD?LcC7}8vSf#YvhO`Y0+GO}Z;xp&1UC`<%va31?0`*$WyVy_Iqx2XHYQ?5Um%vPk? z7`@@^j-kb^P^gD=YMg13m%65{h2*6O*5<@a_2}vcia5Rw}3*Ax2hQPJL1Nt>By9 z+j`+?QwxkZ7Z}HW!Ftr7Z|V2CKS$|Al1e;ie~0ta33r!jwHmHF+{QZ`=9S@h(Tz*1 z_%rHD1llIFgtTmypjZVM*6=3dc?L#ullP|&DChQ;%=Z{ ztz`!wwnjno2gTg6jFsEy@$cgrbhHGNKl%dXalVIyaVJ8kn8U!ueOv}tNo5jZE9cS{ zU8S9bTlxyIT7m4k_%HyxoTYKa)S&(03DzzSSJd$_>3KN*>B=hzl~>2pEU#^~in>8$guMV!pY@br#s&wY15-THGV_6M-E_raDEfQ$V&3i`tK3+&~?b?$( zUwGPVt+9}#($U4P)v*wxOLg4#5CgXJxC<#xVw0b3hHQNofw!R8^|7-c?ws_cn}RM zx)vcC=BLDQICpYZ=@^WDEnG4482;|q6Z2Uq6QUR9WhScY7J7J5P z5VO{7Yd$OWV(g#`$o8j<@_d`S$?{dNWkh&4PUvaZS*Y#S#VMaC88mz#xPr{q_}0xR zEb+Nu5w5BH5nSqUE34P*Mq0#* zVl>+mt9*C#R(*hM*S>CnVfP~Jtt~7Vwfb<&0zvh&V&#FUF{Sy1P;gsOMu!H+f0gk+ z!W`-P!}J@?!H-VT7@+}kWM}>Hw4+^2cFo%8bVc8oBl6TvyR&c>LG5t1f&J84ZkXu? z5ADG13eD~2B-25{Bc#*V1ozTnXaQ1e#@DW6XTNB7CzR^DPtCJ4xF={*K?v);#ll+X zuh6mC)-u<9;und%fG?38T%?sMzaFbgEWHGh}aL)qJ&FPB7kS~fd8QeI?dY}6(x+Pj#uHqk?Z?Rdy6p_ixn-%+7uq&eF zK`o+%_WN84R_sL&A!}#0!><~H)DL+p#T+uZS!nIP4AZ{IXMvRIQ(dS|!Fnr9Xx7Oz zC3cyGy9$6dS#Xd{OMxKIG*eNkhM8G;vGsQur(&%}R|OuQYxmPSd;g-<%RY{!VK2ys zvZw&F5aI!PFB;CY=f>Stjo?qoN3CADw$FjB0}i*?ZiM1zxN z)qM~HV7WNgF^C4?(kd}(QU03y_?hBzqN1fdl|-{7e=+7?3A=tgoO7j_45IVYMw;h( ztZ{TMJDS*k5Fioo(c$;qbBC~0>&*_5NM+!D@Wy=tJE(L2@PQT^>Zo-w(6{YHo}5`(gDU!XjS>&83aHG9S{VKvt+80uVNvw`YY>}TUjZYfmw?zWXvDr^n$EgO)p>IB zVd;F?IM-c(ml60$KmcT?ylk^})5M6h;g>ez7mR_AzrPeTM2@bFlOin62CUHsh0$ydCjNRa8ul|5+Z+hL)UqBrI158AoCO{B{Qj|TQ@T{+H?7_Qrx}T3CzO)2qu#L%7jyk|VNTZfp<9E=H!I$mX zx^M9lp|sq(JkV*n2=B_F8L9ar@gz2*{<>`QI^%Lo3=!S48Q8$Ux9$6W&f6i6Py@tn zwhs0)_{gkZWV+k3hNPZWoCP1ocT+Agu4>&8X>}U0ggsnO)De|y8y_=c9cRbu|LprA zC+K#q)F``Q$^TTi^R9dn_tJJgU#CG!So_oatfDw<#!;T@bp`&4v`vw>$sO|gasEA1 z^w@tH$-ORa8QVsf8p5Z!Vx2|)O3&vRcRv$FhE`5hrR)bf2mrTFXEQX&d$Uq*rz}OP z1U~Xmp0USxP`2MEP`=_hZy^QQcH!;5>;=(7ZSTHpS|LxUcIEhQ^E2i$0vhPr;- zHEK4FXE*TQCOcw&m>labJF$0t5%bolwGsPYXDVXkC>4TaDSXs|LfB=|le*J7;@DIZ zjA3a~Z3>5%(~w!e=d?YJ_s^3md-UaBwAqG1?dSgGGKon^g0d8*6-4JkWiJL70{hZEOn zN|xwtJON2R!_%DX5gFKaSrl;kN!a&V3v6>p%JSg>=?g$4mg|s))mx6ARhXz7&wGjo zZbh;aCWaHToiK z|LJ+hlPG+pbLE$}^*a`>hVbcYd?>PcO#OS3OlA9zjFJ(Wx&-3$%m zPKmW`aH>SdgeIOW$wc=7%XMB^r|&Pt<41Jf@{Rol${WUBBClo?UikfaW$kapq{MEh z2I+NyT6cdj?iYGxy$M~% zd^xZ{O^#oE-7zB3E8{)mnReGq%QkX=3J)#Mhwa)R+(?UKJcM%}!tU=MJyIYbXV2?* zGDtR4f;dJ$WmR`{^B?L1;BJy%Hj7+cIwy$-BhNt9=FEkLDmXIY*|VMgzq838^r6LQL%t zQP5QZ)v!e4v-by=e@gqi(B#Eq6`yndo%v&`37|Qy3zO%?wZ~=ChR414OIT>2$8(T( zJHm5)`+%#UD9*%sHlpJyVvpDHz7Y^(c&`?Nz52GD+gPQg*yNZ`&m;q-s+uU%AEeg= zWfdy(-OQt^J~epst&7vKJ;&*=@}?3rEWsjLJPWluFuT&MnbN=QCt6BbpO&VR{UPqm z{j1qA&$hwdEoFFMk^y}=2Jo-o?LBSH8&`kgbCttBkdKIh`5XLmuqEjoK=)?%XKkPdgC?X4{ejnaiLZ%k1J zJD(o(3w*1}zJ|hESrYaCHJ&QO1Lpiv(lQ0~)*n#udT@KXws_sNzIA(y4RSC7`uE#7 zlmA>YD~76Yd@>cFBF_e&0#E9YTKG8g(`@^MCJfb#n_R^O>5-HfjP3?X&Moogl|O$b zg&WeSaf4C|&Lwh9ZW>LBL(R4BgEse~n+J(iP=BCtr5c!#mOBrp1l|PM_nK?6j^vm; zlu?^)&OCYQxIcf;ai97y!cJBFSs(eQqrlI|37sKwtl7N02j=Z>sKb~n=+sQ58pw~1 z-OtBDy!qT}loQjrnOoAs`O>fA5^owsSma0)Ff51bc%a-!)isH$w6`7udG{Iawg5W? zE(q@H{(``Pnssrtb7g!>S?()Ud=bffc`OmdU>TX(SY0y_8US%arkcuHT&2K}{(DV* z6A@-%bJwHN2RY=gwayPB8lID%gKE}6r)WH<^%U|PwG*pXzkN?K_?J&Z87kCI8e2?$ zYe)rYP3u;DN({YGF-Rb|!nDO7Vrd89v$w>M*i z&QF;iN@td?{VCn=LBJ^B%Lj5UCU1B=+mKC~~EMScL@Upn&%ewlWuLu_jV-Il!{Ddd4-@ z`+Z-T6y?8Lx5}v=g)i^t*YSZP!dMqLPg0i-mjVJC&r`zlwa?uF7xaI+Wu>Re8y|$n zp~PO%NArKhODSqSp{h_*6a((VHd9qk!c4GNlAGf4hT(tOgarlJ;1WF#Ytn{@t>8+c z2Q=TpN|+IfUMJ;|hC*aSi%G`r!_)>2>U8BC%Ig&iXi&1rD!f98o z^Od`1HU|^Ril9xD9LjEz#R=r5vDpKNcg;va+a3%r)m!;Gb|UQ9;#*$N2>!UxLyIy5 z$2JwAEvE+dXzA#z9YYohB0=mt?0~*`Co!$rTMlHIA+49q<-G5p3ND@74C5RrU&x_>exUhY8Upk5-gG3tCJ_q9Ow0WK`+q?FGQ!abC z>^=SPUW;rQ*$Kps$;-%7JmaX-@Y%W9wqyIh^FZ`xwm6~vw5ll9Ov<)H4Zk^VMJu^z zfLR?NBWZDJkhn@Q{T61`(jkRcBV0PVC8*K{ak)J~ z)e{=|QU#ysP-=^Y;V0BVPSDbs^3EoO-c%C3L&Y7=6c*<3OwsFFEZB^Oh}Q0C$lan# zCxw86{Mm0khv$To7-7n4`bdrCE7P*mrK*>@(-kh(tsj^&VLZsxc~Iq_y(PaUykPfk z_ogZGs61Q4R{Ql)hT;8oe3B`pOD#~FC|oM0 zfB!l(aXq|%-@dAPJN!GN=S<64fKh`w(k+&y_yta*`K4#fw6W$)IH;FGOUhCgGsZfO zO@((dnrPqs0KN1i4}FJBIvSu_sA}H7j@?$U)2~^SLUWrM7maV?qf;sAQ)~90VveSh zu}J|5ctg1=JUo;z2_DY8l|#3ai9G|30}kxzH@{?^#*jP%D+yu~%5PlN>5#>T-j3PV zXBbUJ1RxNbfhX;^<8AHk|LQ$%Wj8SDUH-}#bt_+~)bukP+&cpB4$Je7UI`9W3g0aJ zAb%(CJW1L(%+ZE_q>+fKTjls9bb(<@<6x^m)rKl5?zHK9^8Vx5<@GJ@#=h63w>+`K z7J9QuRXbI>oZvHAPkV}-pe}`evcC@KF-%&h$6+UMdu`4T(+5t#YajfY4pc5&l?ocSFMncvyD zXKep+m<#Bi>#l=V+t-cP!%0~qCq^p+BiB9-D|tkfptbGylq%=rGZZ)=c2KhS#%(X+ z+Js2u$mWIE>1J2ej^nEPc^!*^m#l{vQ{rhi?N2h2tZLc>NV0ZApF(8v!f2vj3gJJ? zf3_|rJ;RXY(+wp4Ws(g31#5#B>(ySo(y`(bWQ+j(Epgin@!K!ndOg|rba&y~BQG~t z!qwX!bn48aZP(fs)vNR=#IQ!}EncT2&!=%(HJfejF6Y2*dLnUIIz?plpg`YJ?(IMR zoF1I;NF|z{#{d^qfF;}Z-&X;(6@oG zz$RlHv+Gfr^M(QzGn?akOC9&mkZ}?JE>>|`h^>sH0H(FXVIBA5Nb(S$?2_qhgb!E3 zI8ZkoG30OD0acNX@X}zeKk-Xx;;(RB#lnEsAx@y5qYueOTKv^}^lzXNm%e}Yr1h>v zY#2NVNlr6%_nUfPyH!hoi_&tPd1sdUnd(XRDf~q7Wq+BQPF5EK$tXEF?a?O3cK0C& zi*;z>t;&*#PGe==uHr+YIM4btAvaCb)j0PCAT50~OhFl2-?%U#3B6gOP1Y`-aZ7@s z6q+7p`EM^j;S{y#w5kdounHRt1IeoM+~CcrM3@cv8TL;LBZ=nAp(f%%S?s0~g3#HI zbbjPh%70##3$TQuC(jeX75TE1mTwF@8&sAJvyxbBf0?Q8v>LxPGqs-MMCguk2@OC` zTG#lfS*QQgH?1Z?6~=ZimkkQ+O6VL6Q|Jk%EV}v=|FHw(;VYfif$b&;F;!wOpTmoE z`xD)J|HcohU2n3dY3WhlORbO{F^*0)mL5spQ0Td@*FpXdVQ>8w1=M!`iXfo0NJ)cA zhoE$)0us_45)woAkkZ{C5`%O%LxXe-FfBG0@R##a|agQ=BEhrqHtH0o|VZM8V?Kk=eTWgJ)kW) zoEAwW#??{ej>}5YU{s3f){Qf?{b)V6NB9vW+5J415FPJ;jjh(pW9{&_=1xTAm$*^U z9tARmt}!7L(M5#y(wjc-eA0W~*k;0fR$~Y&Z1vt3O7u!m_{#^PO^iVTQ|LIM)vdn! zuyx@~i{G%qJ&-DFebS#E}DC(Y*86I`^kp`x*$sFzJfepj#ER*a0=Yy#~E{Y46NnPc4YQ zbQr-eV8R27NBXT?`XP}Hp3oeDx_wXkcri0fSb0DS6wI|_Fkr+3l* z@pJ?L-j?iI&VA+I&xD>tC8fn$+)Bn{2_i7RXK?Djj1+x*yj+_=? zCDj?W5wGVDU4_CBeUT}0k~DV#rvg&a%gH{`K3AXvX{5<-y%!|~(DCuG%w}F7Ie*J= z2Jm!%*zH?6!PJYv_mQ!+>o|;2FmZFJcMB8qRbhrokEl|~OLqj7+zCb@t;`UsI?(<{MqU1=z%7!BB!K!!`wavoSe!hg+E0=K%&_F3xwjQxYcvv1{31G zPXUAU(_eKab%XYZt!tR6nD~&vvkT|U!mJkaC5q|&^-Doi%p*K70Z`YND!g(2s1+q) zUm81}HBr}o)UgJ35LUMAG!K0AGHs$IqDd@Tv$?QddhM6{#V@32VWkNM{gZ$oIbIcj7F|I3WHRjr;ARaV>LNy#E8p zu^zd46&Y7{r$41`y$yTXV;09pc&PeT6Cc;ZhS-+!Aq-oFcoI-4RY>KqdmF>_Pv4b| z>Q&awq*8^WTV}^N8J<86hk^2AgMOQJ&K#M9c20wP86{WPUn%j(G|OLHP zXxLw3Ld}rs8MAW14=Kgdfznvr3V{}rZr+mLr5GJE+?1&b5051!<|3Tdw@mFnGJP$- z3hMfqp*riVW2uc%!B4wiYQ@^}cvvC9APoqt2|norzFyGB7e0qhw z-ZEG7vp4^Wh3R@IVgcj26WxgZ?zpYR)QQ&T9lqrBS^LJrwNE=nO#^cP(&fp+(Gzo_ z)1eKdkK2V%5br|S(3z_^J&`C$IJ*{8N2jP@=lp zKFMJda{+hphD$Ea{-y<^TXsc}`4mf;J7Sv1ea&s|I(~4reMuGlUhz*wnN_v_i8wk% z{cqASV>~0=E-9E<^Hm=XklF7{Z;Y|8$C8QBtom!i3h*)vamtxAbTlBelj3wh?+_{_kOfgWXD)z!5hB!_)h}(iqi9Ox z`B3>VsjPYmqk!rh|07?+j_;F4OP)1V24H=;YH0O+i4!b%gJjof`1L_|dUhiz>WXWn zen!>Mkz;|-z+9?rTr159HX-I;05ED2$;O(HaCT>^+M|~foMwiiZ`B16%6&US_krmH z_hPe#@zgH@4W2XNMDQK z#3iDAbU)cBC^f!|VvD;!cYhtI9TG6TLEKWAHV0+UacCIUf`EdY4H0atq zk8y8$9{-jf(!{hmlt+QYD(qyOo(RIde@8Q4;{I{BI#~^tdJFyib@c&m>OVc2z0GYg zVW#Kq3Os)}PPeA?UeB2ddjBv$ z>^wBKMo2dbl_s|lC*0i-{M+Bhv&5I&Twiu(s3H}}&e$jP*868F{%1|vFE=SpBuVh< zK@^M1<~ioQc)vD1VaVsgG*g}CGSze7r)vC=BvpeKR&F|HYFG`hI14 z^*G!--gW6`{O+~||BRXGP#f;-yOds4J%S7xUPxu<{JLhVrz2OMW0Bz1C!(L!?XW`5 z!voXbaeCorYw6eji(t%)R2U8I2y3gp1w=w$XkY5lg2OuE zDOo|l7&*UNw&qQiU`><9{sIj1O48CM*Cp8h>TmmDc;LhDFJE-XBv|X0jWH54-t!1& zR2x`kfh!xDsM8Iq7s0KAsY@;sd=@+R107XHZF2QWCQUXBQ0c~M7Y-jG%Ss(Ur~sZR z)^~8#MAzP3-Z;3yb0?(Fb6mHk82}ur{AFslmAcg3_u#&plj)UC8)0>7(QiH% zwnV-;as`$(#G;kgJ>OD>PT}BUdqz@F-4a_AB7*n`hrUtq`zMHBmC1nOKF)PVzpXeY z(z6|LHEgnM8Xq59Iv8u=tBEd=S*%%pKvwXe5y#fCteV{2nqmb*?mFGtAH*uY zoJ&mp%=WFJE-E@aK6CvU<29K(#o75ZM2)6@XkfpuVL#T!s3X49H?D7MD`-Ep0wwG{ z82H`-r}8npMG-$4Xw-R6e3$=SAZJ1c8ZoXpU;A~b#R*%UTX#KEQk(1#F2gJ@6SD7@;zf<72 zOyeI0Vab3`+}PED&fsIbeFf!v1kfqg0>AO4cfH?!K$-Nt@0*DutzQj*W!?zWt= zFl_Q`b!QZxDo_4BaEW1zxvMEhxcuUfnQ3Cf$TsQH+B0e8Vz|`!tO>bD;3Z+%H2spJ zqU*~5^nFmDgX_-=-NRWO{JrDPQZF3YdBCK{M4{q6NlX?CN1accqC4I+PN&e*If$<} z1Z+T_{QF{6R9K5O6UUNx2 zr$N$a3wfRW4)oP@pYRDSQIdnueSwmzm||H=fq&+2L``mKc=g8T=ae18?;-H-;l3YS zZ8^MND<#&~wSLa3oX{)Mx5E4}C%*)GY+G1rY~eY4NwQhGX7k4D8jB&m!&a^7t&=v7 zH;->H{o#SLMTn$su1|zG{yLI7cYcHr!%#9?!+9({Knb;?P&E zPa5Vw%=$+pO26+g%7!RVnNX~o3uT0P$G23|TyKbR`S^MpQMg#Nt4sVrJTZ}Q*?Qpi zT227c*cy>6JCHB@EKq0tI7!8XkEpN`~byYwP)fjRG2|6eEIv z&hrw3HdPV?`TC?%JrpF~GUqyQ)N)S;Z{LZWE2qq5I-1sp2=P`shCRgRcn%uC8?CAc zIN2gqv@G9DL^VRp#yw-zT&GltlM%`pOVh!Oh`4xku@{!H;_HJ*hEujm8s$#LUu7M% z+2wGG>ic;A3wU!B@lK^SO>LBtT%!KPI$$u_JKb?6{!5dFP>;#|o660+T;l>^_E=v< z-4}n&1bcbmePk@t6Py9+w7S`UY!A)f(YI>XNO&x^-D;Rva;)${ltH8siid+f#idW4 zJf44+lh*2qpsO!S3K0lcTbZY%*6<#^Ma_B1W@a0yr87}dW#f`WC4Icp)MEwECHU&B z>_Q_cmR@Nj3D3&tlhE-+SKm_K2_H|O#6cMq%GJM?eC!+tt=X+sDr%;m8vrWyI=ycz zY8u&!ieouBXlCQjsrGtW2{y!@UVMCbeBD(=M{|3aCL}XivyJVNkChnJ^`o2g_hk4A zxbLR3@9fN7wNT7S4YL<1FG%0J6)$v7n-I|ly^q@B^T{=$4Gn2ArJ;*|ziH)bWa^j$ zX^<&Zjt{A1XU12RM+m-dszoq;uo5YGC_9htL%kx1{H$=Q!|O9-Od}S-XTjH^QjM8_ zX%rZ=rn(-0##25MGdJtiD*tvE#J&o0-eNdT*kuWIBY~q(jIkGYa(c zCvNCFN?oQQVl#>ESNI>4aIqUs$y>+DIZqk6`;(yUMXPHj&+io&+VI~i{$1|p2Y?(Z>Z6Di7~fJ z0ww6yw)$(h`JuTi0l7rbZ4B>sgl|$fPOfQBd1)A8&lx4}b6>qGVqGBx0q6-N?yAGB z#om^@q3W#2vDP+jVHB+4IbB!k;x5V9aF(R0cSd)n>?Z=Nb19CGc|VoA3-N^TuDgiS z>MpQc{n@9F80vFDVwMSw{^2pfzU_x@dFz`H+AjN0PRz8M@`w?2m2 zaQ1H2j}hTFhdlfrH{O4&3lC1RmISmov`Jx^t^=NjD>gtP!U)7>M) zlbIbKAJVT_GNkyX09I-Ed$v&pU9x_eN5GW@o`DJ&c6sWA+6r-I?Wl_=&!v8|#ZFIFAZ&`7!5tFS4^(yp$%uCy0P&2ShDYh8g zS|Q--aLpXMai69_?fEZ`+6A3$hALl3-Cft)mus)0!X-b*E$q=w36FGIZzblqP3?ls z&s-swAFJN+nL3S^Rh5@#EXnjIRbBALw{)#&1S}61Da)Djxn?C-!D=naOm8d?2eZ0t zfLFA{P)q?83CwhRzVcs(g-c4A4dt}t7$$Q@v2v{~Z+K+K1_ z{h`B|bD0(c^r{@GG+CpFXd7XzuBFt-eH{G`R4q>MJ7Y!7ZIX8$veKHu^oJ+f-y z%rzBL^XeBjS=^Er>)eUM7n1r3*+l?_u0nx&V)R5_E%g3>E|UKftcR6#7HZ@SUF5=aw_^^p!dL_C8Z1kW1Td zaiX;aKn=~UbGL2&v|JjQfXj{kpOXt?<;w1=D=&iL@5cO<6b7OqQDQ&0cN#r$(fRNh zeX97(UvmviNwOXguB=8pP(wdAaMup*ExodIk5g%!4R)8l)yUnD5=?sVdru!}Qo!x6 z_W`m-qG97CE{geseP$YAw3j1K z;tk#o!>vHlf?u=z3U1}Fc@8(L-WKGlRUnko*$9_r4`S;b3_zRoKHKK)s0cwrd&lYM z?YT<*I)+|_xKtcq7?pP(?GHK%EJXQOn1~|9c|oJz*Y2hI;ZG_>jyVR**)fTlj}^}> zxO&IQU92)Hv?@K06ThsU<&BHAEa()*q*s5)uLa{8D&NaJv*^=&{Iz`)IgI>8*=!hb z1&=Qi&Pwgt_xtjsye9HDecf7S+b8L4N#ZE(dgk7Q*xQ6(IQitmzvMiIro%g?W&RBl zi7(9RmeZ1iGw~lJ>;(rZ;-g%s>vK8PjOhymaTuJ+EP13XD zBeSb%e7(!1a)rF(Q8%bvH0vrs)_5~?@?PB7$?pzm%(MAmBz|}zMfGRoHPl6t=HJCt zi%B{&H%}nHT?q|V*Eq|w8?F(jqQ~ZhzE5)VYZ%6z_OhdGvGN+)V$>Q|Q7L+Ewbe?!$$p=2gz1 z2Bq-!&A{M%gNfXcaS>ZSbHTygTD7|Rknjvg)Xh`#26PA|3K%f)LU~-y10}!HFM8G- zW>KPi?#)3Zak1zBVZ}%+R{l*N4#gi1Q@fyZjMkmW+`gzZ`!;`6HT|!EkPhHNt z_I)>YU6#Lne~K%%=55ku88$wl%tz*V z&qcnX5U{QN5;%8(WmA;X6+GlRpr3^JtnXzJ5S+-IRlSj`h>dOOjgz^9i2u7;_DxGI z%3R;t44xz=jguVmcF%2G-@cHgDxD5YmSuREO#w28`tMpB`uNW6wPMZ>$Ln)_ic>q| z9hD6U18Xu{ODR|BGg&MK$|kY>DdS_^yYG)5Ja+Y@x3fRsYi*O28MDDL;f~EHVee{Gx;$D5u7>7kq%Qc);>V0o20H*&bAhM3kn)Wgdi<{*D-w)TW zG}(X-vwnev5i1iH`o`NaGY9%Ey*f#ak$yk*(*rw@Pb1xzF@}ZcLkK~)nqsO4HaY>t z8cl3BU(z80>^@nojZ5hgvu`z+LK5AGm*O4sLd_K;CskvV!n?S|%Lo`R58xnV=8OGN zXC?;H-A=+k$dC@a!~zo>x{D)-&uik&_A?)n)rxK*^3#3!j@Z@f?QvA3q}3@<=H|L# z_SYK0^yPfaao%G!y&=nDJ?YUL5v7U}hgeNUMWPij?o=1Fz8yG9J?TVl%UV$8-Z7I( zQq%ls?Q>(|xD2`$%60j3kDJhU<`P(gNhthDZRN&47F&KtS6TfXq4&cHUxyzQYQ>l> zcK~wFurrEDIX=;C(8poTaJ7LIeeaHV)OJk3}-E+^-bEO{zc-PrCPjFO=r|Z8I zP910qT0YSR4z6YSU;m{Q5Sgl#>B?gL@4cS5J`_o6z%6XuCcl^oa2i$*Ym9)pdc<{9 z;_F7nj;ZL!5vxfznfT5#^BSeFIhN@hvRRNyPmXm{HRZIF@3cQ*5D}d zg591$JO_9jYi+u`>&SEy^a^;t!5(B794$K1IWj-~nqk7?gyu9jNP9qLtCn9kdwMR- zJG`#P1A$=zjtJ)Si`uo$rEPVQbTbY-gmk-Z60anMd%b8IS0jaH^};q!92SP;hCu8U;w~yRj~=3^kaeqrws?=h)@_H}$- zhIb-%klG~~z{{%R#2L}yCoe>T|D^C(g`E~kVjHt2<+~6%Etq)2f#S4)_xo<#$Hf(^gY&h?u3n>yc~U~dgU67t-vdFW{ci5c zE!GXpWqDX7zb?RBAb21)uJLm6F-gxLfl6|Fb@*lPZ27cymq?-kQC)1GzjvUynpgOnKytp8isxz`@qG+FGmCmQTsUZlhX&t%pa zKWre_u{tQyHMXFTv}sD?2g=jwZ}6gx3oT^Pe6jMWt@By@Ozu{Ob;WBF!0BD^#qx#D zYn2$*QtoVbs9p$`oe~b^(m&!HDU&{YfrbIsjY-kge<|N7Z%(W!rgSXNNx-k&?@N6f z1_Y1x&DBHi|N5QfApV>`BRpU)J+NqZ#PK|;rLMV;{#ZOz`N!nQ4i@dK_9;NuCP^%5 zV)OWA&-+l5AfopTRF?K-aoXJy2j?SfS$>uYhn-u56$fyq7}0X=CR=}4$3@I{ifIqv z##wF|{+wEGsyq8qAl+q!qDR{IX}QMoAjjcccL@?*NFm^HtPudechV_)VLiQSi>8`H|WUH>NYp`>#>3 z2#E5-{n6))$|oapHUNF#s7|v2z{dkr)%clOX*_aR(a`sujowL0{Zlzpq_u*!^9}3J zew?W$mZ%9Bg18u5L!8)nJqdKetm)qW)90<$Dc0LD=H0UYT(Z|_-dmqLYp73>TQuNg zKj8(BXs)E|=B8^~B?C7z1DDGd-%SI`XURKzYh$ABm;dEM!jj6j!9flb06I%2%IlWE z#UpNt+}gQ7ov0{ZJl3uDK;aQbsE)(s2dIDu9YNlI=^SXkLJP6J$dGhrkBVnfTAogY zAlHyBLTUO{6bB-jgeuuTtS8i*?42PZZ;HS=q}@4WB<_6#^%uud4<9E=PP2D(lChhg z#u^C-x$A?287meH1m3?VBdme+GR?T@01hZ@L5)=u#psOKOggu?W!OXg@MP-8*JNpA zIl1`P?li!n8+XJ0AcPE6GIS)-=vqbpIOEPjhPY&%K~+kcGs&sEOJzPH)3!*tSqr4F zQeTd9VLtM4?T6!g*#ulnD+o7LQv)cso+I!=#xOAcll4iSm8-TDT~ecGh2wpUi02@T z1F-*WU#r>Sr>zq|X%1Bw53pP1 zdZb*B2tf1sWd7kLH@wD;h-}^7%}T4jqNy*#p#x{;hyo__Av`l*zvU4hC{ z*xPe_cR90526GDMBM98?lPD!8<3kY5$H%MgwT6%;4G}g7xt&mxkn9SLr;y-o|9RdV6}U zAy`8nK*wTYU4v*(7r#c0GISn|Dub!Xt-6h_8r)FGp&OzH?DaisZn)Y zpzf2E4A=m&s|wT=)(?cl06v9#_*hR{7Zd4oi=yF}tV>ij8D7C01HCl|50D zOa-YUHZ9r1SLH$eN5t+y?qh|*PhD7420Mn#eF_IJiJ{(FBGSLV$g!o*jiz{hUrEeZ4!~v~Ef%R|P+H zwIAa?F`6)>Ok5<&|IFy|k4JQtQ$pmJ^Wo`r!SQ9#a0(0N(}sqI7iQHWe5tbfQTjc(=ivoDPtWIT9)xUcLXUKhm5YYqY;b{TETiwk;t{T+xWJqS+l+2lGTFhCXwS zplV_|)hejXX>`HrlzNP8xi%6#GW#T?L%`qG0^nVNAOba2SmSBAjqsQnGAL4zC&)mk zJW&dS;40&Ij5@8P)u7L*o~`^WnOObwmBM*69q4v>XK_Fc*yg|KwPu%+vZYkEPL9d) zPtdMCJr(`@Tca@Aq$djQH5j_RMK|f2kS81Wb8!CEz`K=mvEzj9lF*2*-_EDO?j(aw zn7Vgch?Lbc&qRqmnTP^XV;4V@|U$xC!%ub|ogGPf+1D(!Z z%TZ1v|N66zqic=a=7flg-mR@jHIXA@!DXOH^$`8D?F}n$_}20oBogxE*z4ZMUySQm z%!M$}Qxb~Oa$cy`=SXmBH2%ibel;webZN|V+-xaJGP*SGb9>1!(@zWQQH@V@Y-XoRHYP{HY z?{-k|p?kHPNuHUCQFG^ZkZG-7e`*Hvsu&PNSBB(|dj+(In`ot}uMLl!FSw}_3eE}( zu~QA40I>*48X-lRW9#39ytdd;oEOjKqi2=VsNyAucy+rn{a9%1GN@iR_gu_ex^?>n z=iD@Q7^6{w;LC%7^rMUeDhYg+lG_hIr0I5(-nJ&imhtu_n106_FdLB4tFKZ>iY6=8 zdoiSAMbG^v-S0TIE3D=TBIJ$|9Q>Vrgu93-z#GXQH~xI&^>eAb$9ucZyZ)vvfO`eiV1^5_qTnT18S)Ek)!KuTo)Tf84 z{{R|m$y;Y$eg$+bj0vWbF`IL#vYMybZo+U$aln7P#83xjI>=unBIqA}AEGuN(ed3ts}N1NgZ#I}`nYhi z=n!eAFZX|EvzpMDKD|H4V54)NflmTD>|xSx#otH%`Kdmu$^0@Af?+kFvFs}BCOENF&G}*tWBndWQ8XK$E}~*>2oMK0)JGyoK(J2_trPt$c(Z@Ry-mPthI@7MUC_k`!xTbKvX|9Oc)JQlE1a zy`~nZ1I|7iCzp3VWXD}DyO~<3iK1){?{x$ExEEXI6yj;XyRh%X2*sYGEJxnJzxhcw>k|Kqguqbj?|M<$JtbHNRs?K8CNL92bE?|8X(~lJLn=ID)n@wYmuizYg zcRXxPos(0qgMG?lp*0K-omQ);)=X}lTC-8qQZa|T1D+}e%=Sn21qBSFhJs!mcac?_C$btmKrg<-Bj&J`3cw!qA%U7ALm0Q+-7|$D48rQfd`&7jUW8vs)*Hdd^84M-F7!bbU)~(2W|_9a(y(17^I|E zsTu?-`3q||Y@XLvl@l5suI>Y_G9G$IuL2-C^F)iuOQi_=6rC~NYlhP@2?zrb+{k zr~)4WCwHxqbYjr0o*Bh@dA=(!TL7J^(XH5hGLYrKgfKuTgTzbhJbdWPyF;%(Vd=W1 ziKwb>bfN;_icHg?YoD7hsRp;x{lv9;Wnd+0GZU2Kb%~8azb%88U-pgZGjB;UCXjX1 z-BxG}0X1Nz2+EI||FUAWH`dlY-sK>AC|h&-_F^UTI_qx+xLbC$y~d|+%Ic`5>z%?w zg8tJ-llHp(PKL|>r2|bLojt`>Mu~T8>Thfg;Uzo2l1{kVJiW5`d!&`Tw z#l0W7MO~$|%03(DZ*Y-Zk-J*FH&>)#k4jy%JWj6o4uMK;Xe-{eEFEMB3@0uq&R?hNku$DA|?4j z?yuJYqIb=hJ?j8%lT+x_0(7YB=*8^7)XGvtdB}S6j9;rReX(uHUUqVcka)auX#>xQr*J&S(dmimvt+niWkHhyIfk#y5(Yf2ZZRm&h0~)PW&*%O8UrM6q9hEyn z?5TJ)2(LvzcQ$3$(qINN);6QxOo&M%GSE&5Drai;jEd zg|U?F>zCI=KmE~52#VhMxW6e!XP8gVAeTJtZCMnq=*rFhZVDFmz>>qo*fCIJw|~Lj zG0)k-{b1ltapxTxO;UX1_TQZ=l7Qt6lJWs$bfsAt&vnr%*)lvNoX^8D4J4&jkYE> z6l|A;;tB*Go-@L>T*LulYhkDR{wBDy?d-0`>Ttrc!z{jlZd8-~;l%#qKsqZbd#N$c zlTJ$qrZiwpL{nQPjyn7!4zKFw#x#`+U@)zHiTQ*{+?_2vY?`XLUT#n>`?M?^VK7&_ zkV{5xJ79(Xow5I-DRGsCuBNI>9$Esz`dWB28tlr|x~rr4rpua$ZrQ1QC_YsGMy1TM zNoO{YaiU3SuDa#U)es1CJIGkQQAHgR`Ta3Lftz7BJU(UmYl-YR&HOx_V@e^i!5tAP z7e12fMVzyVCLP^eSS&(lX7;61#FetoNkE-zI0usbv>zVpEdf7*9(8n5*llUrUWGa5 zivdXn_OW_LKc*qB6g-MdzJAh-HXjiU;pYraSQQq&KumhJ322@Hj~n)QuK9y>GC2%G zYPA1#hH_p-9q=g40c^hw>dYzv{!Tc-?*ku6sJkyf4!Z{?hVzuozvr`yD%|$4_Vg-a zS+`|H5wk?E_q@tnLc0>GbZ7%Ib11>}5{v0y)4f_}Wn9eoMf9o>4zYI_= z=u+ZEf5yuA{zr6=B?miEp{?-G1 zrGB=D5fe$8(5&C&u$!P}2f&`=c|{5eOs5jr_0!ugQ4@y|2NkB>@`tnaZA*LqH|-|~ z8dP5Mu~+J3OSaMSVVYZi<$H#) z(2{KL+UXbg!|*EW>PhXlfIw7ng#=a7`H|a`hRxu~2B!5lLgqK(e5RgywukS(K%5c_A7VEpC-8A{d70ky5(9~3+6CN_`%C{|C%Vxlo z4el}mU8{cH*0Z(N1UoI1in~7s*w0&L3&gNTGXJUP3&P|3MV*Yhk#BWPiHf8Wwu?4s zD}PRwsFKXGI85we#DGtd|90Fp;IO!8f)dgrg`hrW7XWc9MJLlPi&{in#v8P~?HvqQ zMVo&leo@5@uZ_gbZ{4)Mr@3MQh2hV)fQE!kmc8{)IudYB%?6V+clr4o@$4!(Vqr@g zB&d?^n`~N=&phK3FsUMQHx$w0ux!HOd2ru6k9Z>_`&EtDEKD!BXI)XrlJ+U>9t+c) zqxQk+jyNRXudrHkkAq^N0v`wGm>Clt?ZJB{lbYCD%A6d1Z)-V5`F8bq!*T%N322=|MSD&`Of5d@_)R{W6Wr{J7$y zHQ8vr_xz$|@A{{@58qqwf_^oL1}&5>s{2n*6Rp|dbl+tN+#Et-lmG6)dZF!;**fLn zw>bf%v#WurYknNraQU~&_>pu|YqWdTpi?akcKuyaNK^6H5rw=bW9NmE@f!^+@d1g+@8Rtd3w5aG!^Vx3h^n85 zx=WRFqaGyQMM-EP2EON@4k)g`yO4H%NXgEWwdh}%h>)%@k2g}h* zi4NVz=Ez&VD)UEM1Xbz+KiTBB|kXZbX8*w1x z;}%9QHCP&#m_T)aySxeq{f~5O5XgIIuz{~!=I{i-2*r={#*g4myLRKJ=DhEIC0R=H z-~@!-{*$12QyhC^@+cL!x_X!OIQIal=~`Yrzs-OlI}zjQ+C26P6>Yht7pk=X(tV$- zJ(cNxZbqyWn)~@9;mfVQRpMd=-BpX<#5%Dmv=R=csC_j{8ry$!$3NPE_8#Do^E? z&>z`wWEj(Gew}VVUs)q;A5-xSTv;Um zF~RpS-A)3o6^Hjdx&S0I4rkK_6a0RXU`2(F+3_~s-)BGTAjahfb>xZQVL0iRF3^jo zRF8j0GDhj2y)oFn(;k9RcmD^(V|8I3=yxnGK_`1NW%6i$FtgJ6zpq!fjhxPm3vY*4 z2CZ-l)Vi3(N*@h|P{3vnCk0NgP`)@9v}TdEcxsEhHJ2lyQ2a@4I+iMJ`P0QF(7t4~ zF?^T;Tj1=>UbhCVj?U`^nojLC*)e>8#p0`2!+vc2DJw=$KKWxtfe}9J^=sQuoz7>U zgR}l5$+jJJi2^vfa?@C5{8e6xre}e@Kfz2JD$>Rfre(a z6f8d`4CpXRI9UEh%AC>$g_yCFL|WE{2H!7Z`rrRHGsPzGC78T!Si8FY4Q~N8r!-^y z2c`5gL`dikxTWa)g$w_Zve~L-Cnl`6u>C6!hvoo<`AAu5ezi{$45LX`L!~eQ=7Go{ z(=Zp{_glzTT@e4>T@+Z>_$g)X;2G3ETpYnx0{h*UCgnRJ;npO+15>M$fZdr_JpCf4 zZ+t!vU_2iT#?^cWIiWJzqzttXv3VAbGppMd9pgBpD5>~djh|_ic-z2d9vj7{Gy36h ztjh3kxO(OCVa-3w*!xKMa#hWLHsD@1(5wcvh;!I|-?s)!F?ryth$@|;c=0=scKo3Q z7vVuGv}CPB!Q$}5$2sUqP_@waEUFLQB^aN9xIzbS7iuVS)x@Aaa!AS$6Ph=fNshv` zye;Xg4q7zRpLf{bDbWr<>ko|L-(G&al>!6RvzS~adS7zDH%BqD+HdF`c1*jW4sgMP z#!C`vmGRK7Idf4QDt2zuiXf>1p7T$V>!kQJoWneyb&%YUH6Ma&KE-#H`5N%BF3wF6 z54|@JkySZpG*Q=$26g)bPo?{H1h_@q;pVdPbgUFQU6R@*0MJR&T!U709IyTptm;9A z>?KI}X97uO#+=GlD^$F&MgQf~`adM7u?~9d0X#YcqMCz;MCZ=&ZU)X`nCUWrdkCBz z=|%rPQMVVxk|x3@94^Z@X9;*58CC~AYCdiE&B6!ONiSdAt#u8ZYkIvD z3qKV!vFdI^WL+Y-Y9#*_qW-I&tTBJx5j#su0M~{J-jCKSc{KZd^sD)aIEl&NZa{G8 z8kRXpDHOzVCvinSQ_!?TJI9ZfK2us!wq4iJ%#xT6#M&yi>4aeZ`+t~v3%01jwryKM z0i{K{K|n=9P#T5~K~TDp?(P~=y1P^99=e8-?#`i`VaQ=%7(Z#hb@;jGya@trKE7g?ii2#(ytaHX=y)60(#G>PS>Fo;?!2DU?2LcvQH8F zEP?1a9$}sx%k{mX{S|9rvcEp8n>Uml(G}{(#^;CcR@d9cC;XMz*YrDmqh@mZ`89TH zl5=m8ckbT{2Yn;vE7Qeoi4nbdakYWD&V2RHFxe6czB0e05MmtNsjr}n z(ZB^26udnZJoS_&jrakS%n((zcNt9FViguG!jaE$-L1FBikm=$3}eT|W3#s|G8Y%C z)*Sp`w{}j>2$NU5^Dl9i6P4!r0BkMvStdsA3_J|NsmU7LA0JjunjS{{>dXQALvD|! z9;LMydD+fR8!Z6NiW{z10x;~No&orL&uK@ zeCVAwtbrGG;rIENLyNJv{VlC;N?K2D`Eu@kPjU+6F>KfBT69&j2v-_;cVfE$T#LC% z?%`%Id*`RJ!d485JZ3@?1u zLX4($y64FdN9x;Su02Eq*ulNQ>D#C#DWnZ@NXx8`)jup8^$&Fjm->_(gHbW=jy78* zg~Hpp5}a9hYI6nIIODGw;`_lU)hWFDNE(VHXZPQ-P*52Gl;pgu4{w49nIBOJAre~m za9PR(C9qD^qujhhppfH1^*zsr?=oJ$syl&Lm3rkz`p|@9(7EE2nY?x7<5ltEuspCo zqqVvi^ICsup4|GNsVqG~WsQ6X{iM`fG*RU^XuMaU?e)M*=p-*w?y30g-I_lEk{k=7 z*!SwZ6}r`mF?cF^Q;(@3+V0`E@lEiO66Wdo*y9Mh_0$gC4=7w~VV~9TfC~kTEFs$o zye^$QOA}MqBkfmxs`YNCSzDD@0wP2_{#Y><-h<5-mCGA7EvMdOrf1*+mZ(wvF)<37 zo*r$~J{x9&#+Ml0&||;KOg{03TMP0xRJ2(pe!b52_3rPGYfqvaje*q1LrS+_18j|E zV-zdxo}fzoj%5rCj2?U7|KJ(WbBkla5U;;BQt_qT%0p%>1JHcv&2s*xaNQMxq&CdI zf(+hkjPnv*E(KeWS%c1S6C@oc-ji&g)6bHEAHws??LGcB38BqU7xkOZh6czz+~c5E z`qjzko;|<%fAn+Wdhh+yrQ_-TLF(8?();Y4--#+bN4u=liGhEKn|iEqzvAcjrE%oV zip0(Efz_2((VTgUYAy~t&Xh&hbH;4b3QeQY7;hAUirn-TRPei1G(kN3Eo~iP3{~nx zr!Z#k;Z3%*y3)%bI0S^p2mphQb=Qz2xxcC@w zZ?q$hwNe{_?7r#q364|6mj}Vj`*b3B#C`sFtwGx1HcqmX@1m?<^Am@N8N|hB7nFxh zhS+GHo9|whSDsQ&^G)N; zLoc_b15M~vzTH|YV$Ss$$u#B-U(f1w4@wVDiO3zBK8My(7f4{T?>ldggIu#dOi32} z;WVdXlDUrFc^z}w6JU=cUP_Ii{>7y9S?{f(l2)yNIjiI}(*3au{`3K}MbH9lM(|cG zleCc_ho3gRUzce%Eqe=!t$=} zz3Oj;f6=MjWV?-p*f4*}RucB8gra)9D_sZnEA8R*tn)0hdmmX+o6uI6DTu9krS8;7 z6^roEUob#@4uc*Jf~cqR0>S%FH|>~jB|Zhjr1hc4>#oq7Q+yBRs;1nVbdL-O!V!=o zC-L}aO$Y$?>g@Zwe&_$)=NTQ|#0>2D#HoxH-6`hQO%7f&0O*LhWvTcoqSH)mDhIyv zm1m}@8*hB)B-8*|um*RB)rNLH6vNMW0cIfg$Dr$lo8`X~z*fEc`p3!dX&a7)6JO!y zJ9(}Dn{}b9D~Ume8yI2Dmw~w6OKl;MHa;$WZXyW(=ol)zK57S7#?e>ef0bX!13pi4 z&T}3hs(8(m)3SOFl4|uhCWd~UE{1$9ht}gBS15&8$ylbHEq(Pq?>2{0M zH92XEkB;nQRFZ3TgYue9sl*jD%KEg?y-5QhVGzsEP?ie)cwaWBG03HjCQjz7x)7o& zDGYk_Mfb&A!~P|6)Q422O5Efj$!sjE`3oMwuja@_*kZy%Pk>9D@LYBP23Y{7JtxC2 zldzDfXTk&F$ncGR$7=ecelFkvP2URU{vY<7@oa$L)yRP z%hWYjscc7~fz5LVM>-WcM?ILV&OjiY6Lt`PE!Loc%2v7!gdI^ja-#7t@c8yT(4&m% zAM5P9fyF4)#)v^vuOJPc<$RW_TUvl=9Hy29OBX-Zpx&qqEA5_{S?}EOOD)$WOO>q) zs#qczOIPo9Sg7~?@9943O-QN(;`+#)zVDI=sH=FC9S@oQK&WonK`%aJ6w*1V z4t~bwQn+6HO%Ken6!MpXo99PPom#Y(jzHZy+y@1NKKR`ynZhA#;Ga5n#H*;|CyYW?3mb8(kT`%FcZ&CJZ^f|0WacP#3DglTv!PNONS&F+Kc9_Q zt-PUUYzB2}3#jBJ2yEqIJnVW-`jZ+BNa}Y~GUC>Dt^%_0Ok$|`A(u@u_l`ByyiFkH zj@w+~EPUvoNe*0#<3f}Cpy?r){c+Hb-h(nRb>Q5s@AeTJ>vBEQgDQ1f)iiv7Y5l3A zIqTDDY07$J889fP)-C>8_}*`{A69!gE;x~Mou#pSS>+KV{AdobNbTHcfX|wD_ObK1 zyYfl}4um{)&@AYgkzUI21H=ITiOM6~V~DgD4dvR5B;V=xr{-Le>5Y{|(@-?(3DVT3 z4}}xNNoFDiKbOQUn$4x5^^F3GR=wHTn!0@sP{( z31<^J#-{B5@-RI3z2xxs-?P5vkQ2kvHtctio+X^7k&NmlJFKKy7V(BOX49XW|DB~p z1DqUYX_jhN%=*n$JB==F5v{Uz*ga$Z&*beH2kMp!M^1=CY&Jzp74-G_4-1Si;nB-G znp)SRdJaWvjw{*o z>NM1>T6(tdztvCj=Ua$vqtWLT+}ZZ5WSQoRzY~4Oy(n=3L7D@dKhn&KZT6)oEnUJ+ zl%heLwL8+B3P)GX)BdRz)8H<B&{=(Z85oBRN`LIw_pqlhu;7%rUW*VF6rkHpG>FiQBO`Qz+zlg~NX_H5Jpeu9eO$$eT{S9K2BnmzR+g;G;DNCXbboyf z=Q4MF&OL7D~HTfLe;+P!>0n*stAcW7Fb+=LfrjBDT;hQ;}F#8;KnkVif z^-@)og5#+sFqW2BKb7|7XxC%tBSITlx!$=9JO${QDtTU{yFDziLQmM_ZD;O)I$y|8 zexJIxyZ=Z3$@d4AIHZ5`pL0Afl1N+BaXTc;aKc=@pL>LQxBJZ)%G-S@pu<~o&^%hH zrgkAK-D7W&-!@bDPqY;q0pV$S#YC~n=8V0$9mHfLg$NrPd)@~89hG}~aVIq) zYmy|XE5r9zqW?yKH#A^FhlELua&w)PJAbDX7P2%BEk?H-)%xigZMLe#MKg3^At?=f z=gc8Ac0MiObuH?{TZ95RAG|Rp52AfD$d3^x>T-10oM4vkv_?zHacts$(&{Ygu$r%g z*1LqZ#*=}G{HMkYn&qDhVk5b&$aaONmqjj7yW3#f{v`Dr+WBUk^={Y zX|;jE$RpZ;3kat3vBz-LVCm!6zlnD{YPoVMWINUpU;~#4IzseRe%W(pHEdYvG z+n24O>R!T*jtK5^MGPg{i6EC#-9`_gtk7(n^Y+!}6QN#PG6t`7RE$u>erA7q8z}=M zw(qVBRVz|#wLE*21!0Z0x%WgX$T5z^t^+$A?aan}v#}J;uJ=<2Unc~0MkL0|TPg9# zUn2Szj~jFd2n*T96Z|GdRdp3P$(zJ{h2P@vipJ?n)wdxxiurWv+J|LBom6trcn)ku z;_1kyzJ~x73oi6oXJyoi4|IR$C4SL)U*P-_0X6k!Nn%lw?Kl>Kz?6uq7Pj@o+Or)7 zyNO@iwzAVeSQFbkItPOGaTS?F!iweo6Y+cV4&jH(Qh$bc@slSrm5`d;h@TKsL`5|* zKsPQwYZ@i`**lyZ*iCbHk3V;425EP`p;cyyvbcUqj=*gapZZ;Bdy zZF~@(X2{OX*Y)PMNLGRFoMCA6huF8~*3HmON*syPnA*d30o@PrFKa?5B+l<5IV8 zmcsKv{9i*~9|{W#4dIPoFn~ZT74s^E7@yJLDNspBNPR>kPsDiOQT)%pXH;-P4_q^= z?;Gs$TN!e6gs*lDatIOcFfxDg8A^5{bD)M@#j!J`bHLv=-8@z6WP@yfq}K?3hX`!Q zfWx0|%B@t%tb+OILznU8L&lAeN3T)A`L`E!xqHvnMSa!2DM8 z6&jCUZGW9C%kj*hr5c?IK(>_@6pj4xu;35;kvu^$;8C|fHmH2|-^x1(JH)K{H0T?DFLi zkB_0SI(dF*TA~cfN5`~KJtpTac1S{ieSOva`pkSATLyJa-*3jOU3YE(e|>k?-PeQ`s#Iz;+q%oDk4h- z!2P$yPmrRh@3eY&z4<9p#`^#p2C7AZt$&+ofhF!^YN$kTNl&J0V+TO#+coHof8j~GZo@#x^qik-=%U|a;K4~i6*7xK)a7_ymzItwlMe`L6-7+?X=7LHw zeu21GfBKqCpKO?{F0G!+EcTV)d{`nmDHa8C7JDgSX9GF;k`Pw^JvK#Z>t-pycV@nX zm@QY|D%%U}s_m;j$dNM0|8$VrVur|6=5wOnJ71AI!_`!Q~J zBz5H!g*@>FAb^_sy6+{qlbYkI!_WnK{vEqBOadJ854{{t2%@xWDOqNJ;!Ue_5TESp zBekXMv;>PE=6Egq&cFaNs6ncMRf$PDvHXcU03ilSxXW`v4X!c3ykP!BG^wuZIl}qh z(`}1Fk)vPEnrQ%#96Cs2G1^2gp%Toq@ABe8h{h=k=e#w3e8s%8;(&TMn2*pAznn&M zDlX=pYq&5;!x*$yq}GJ=^C+By158+#O-IyNBv&)NLe2lO#yc>*f&~L7G=~U=`Hosm z^h~|mW~u^ALV4y5q@vy>Ms))s$ku+Ymy8p*G#*GgidC~0n1?%E@y1oZPn!NtX)&=p zy_d#j6|;N>Ur{ao#>bYM{BjUa(=mSHkXPDrO3i|Z&>P<8jOOcNkz4n-hefmr=~tFw7Dw;rzaItUp>T1vHf%diL9BVbAR3>a!&&}L;w}1@yAXke5*sRvhB^W|Bfae?@@Y=_VPZM) z7td!X27W7~RT?pK7)O`o=$wd-YnS(5%vKOPF%2IrqF$6TcF#*Nyk9pSgcELAA{GSUNBaYszxliN# zlH^Vhu@1-X!)kbcTroTr(Y`O`;C!gASsQ;?Z<8H%I!x@j^00wd9zL4oeoD^s)v>P% zk-ona@}1IVJ>GDIzg^IWv6ER*l_E@?>W2pA1U5MeoBu_G**8WyomtX3?bbcjzc`9F zLfg-fo0Mhi!Lo?-R0EnfwI}O{jHWv^<3_7&-EqiOr~5Jze9xrg^^izhbYop+gTL-s zZ8}?gab)YG7-!!vICTZZk9%jfS&G@0QZDGA`k*3NEh1`v_j~JVt2XIX3HI&uL>A)t z9R+69dB~ZYLuc?q$iuYRFPwrhmn?X0LKPzWa1u)j#hk3&=zStaX-QMtUr;b6d!ifv zSgadOpQ)q7C7&2h)p8MiP^?L7U^W;Y8J>*kVF-)@U;w1) zLGq)6GX13LwkCYaOg*xp@sv3GRhPa0s7{{a_ZPP-mu4ZpgcigrdhTOXOzT@EHtaSY z5Bjg2$1OExYpn=2&hBMcOAe*7RzDv~OfCH+J{Q-`QSeV$UDP-2R=l$w%Q{UeDa{c7 z{*{eX*@dR4@N)r2P?rzS&3LRawK7C&%|?c>4b>+)!iYJ|Fvg@$63+J2 zf!rciwi+RG9kV>2>-c=_hLlw1EhfOl)n@%!PUt}7mh^55uzRZ08I6GD>g(?AVTa;r zaq%Q?T!#6P97W^BWU*(cm^@gH>fItqW>v8j&q5AJm@%}X>|yeUal;%fA0R&;XZp8D z`P^+s_#MkH(GW;D9%HCtp}^<@gx)V%iZ*XTFy6!GE_MBPbA$4rt297C z0!~p8mpo`RwELU+)khJZIxBlGubx(vTZT{nxliW0(9qo1LXh(gq*AW>94{Zn@_Iz&eDJh66cfANCLDZM-Jm&0ox)=%Fxo|A2#xH8k` zwDobG$f@N}YprI<(&}nks=nNTIh64;Nn}a#l$REak<2eCthexdJyW1$)iuLZnW#mF z7O%w5d-9lPRzS4=C`eT#;h{}9p?>}0_U;Gz4lUt@&VSvdC12}%#Z|x>e^=wD?G((^ z<|y%|=TmdQVShQmJB@N&aafB1-!gPobTz2T)W@4*Yt$h28hsV%j}x3nryKyZa)qC| zBhk6!A)>!#1Ia&-`I;wTU`}s>e5U1oeV;DPU$9_T`!=)QxT{KX8B~e^N{j!5^QS(E ze7*g_{_&9X1p0`IZhWWGV9Er_^?bOrHL9@O&-HF((`lToV`%V(pVaDr{XlBWGPa(d zt^MwE+#{|;c@DU)aPJaK2r?KX4(OxX-+=So{6}4#>Vr)1gQO;<{^IVCP+#T&^y;v) zW~ZwUa=%eu^~2-q?`YVnacsxPb$S%4=T_Wc3!P?um*eh>o3syI(l)yLA?zD4XdH zf3?Eze~;>GXKQ&?x}kSpQB`KWA$%^ z2~E|3RzY7dja4Pu9Ok9uZC6tiKA_@4x_hg(7YY(TXbTIPB=>yFtd~+(#6NT|$rJK$ zS4}b5&U;e7=SGk0|6vhn)y>O8piuzgAqsL0~LyNnN z*S#$EhnoPkSlF$1*5vwIjI+yf!3|HrEyJ$dSklmo_EA2MBA?h5$`~JZ-msA=${Q2D z#dJ{S@S}|%@QfASx>5~lf*{3^U5(xnfI`9lM>kv3r!5W0nAD3ey5>gn{; zzK|rrWw(2GE3CoW%2~9^7v%ECnXATR=OWv+hfdWl_zg?Xxyjo>6=}ET>=5Xsh=vrq3Ig;9`N+4 zmX;?MP7dCLgoMOqD}lK0%LVX$Z}O7Yg}J9N_dL{0xFR7fEu%jC@WT)TBbgba7Qcc6 z4dMgXu7i3uQQxWFmo9j%H9xd|IT_|6;qX3p>A*&8_apxBUwj+QjzNg)wa!Tc7;(wN zmsERP{n$7s)d@V(nrN(zXZ&W+bRLiH1}CS4KEch^jfQLAtiSbF8$1fHfZR2&OGDKN zXIUA@vKHA|{(!Oug@I!{cRNI0@qjzNGFm;|J>z@<2~MdxvXfUYz>%W$J1LdgudF#) zHBPW|@2uaaJEm>7CYPhXl#GeOqRD8#trjs&-Za$Fey{mgh>ffNnbyE?gbK$n$HZ`4 zee!G1mV&QRS(;N_nSaIKrUJ)N?d=CicN=JAvlm`pZ=EEsuAjRkj1ULL$V#kt)5ehk zJHjr~?T_gqx1KaWGzWaszV9#}ezrUbN*7v2Nb?@v%yEdPQKv>iNQbkkt*P2o5TUR` zQYZCz1*B93-uLKZ;pC#pT&F5|THKb#<+y-njmL2xz(iCghj%ZM)@y}YoRsc`8Z&%9CK3~*%$#0vwL-! zwso*KnG_zaV^7<6#s+c2e+~uwCPWEbsoEyn45y(g`%B%UFL^SStyD@Iz8T=KC}-}- zYkl`*EPO50YR>a|`^B-vy3KsuSfHu)$hxEeGM3Y#lpK=Y{LU5rHpn%YDSw(6*ct7%A(}I*zwgukeKF!Ig3m&BSx-$8%b& zyYk<18@<>~qdNns)oD^6x5{nSv~;8{1k@`v7y>IhDKVl1n1;r?2vNce?O}@rRbCPP z^QCcj_<~0>{K<1Qoko5Z*mp{FMoX$>ql2Vczv*rdK>@O5v`63E)hnO8KAg(ih_08r zT#2#9*En~Q)mQZH2>$a+kqAL@MJ7B`YUn;gD=|jiI~N__iV9$Z{Z$QhdOD5{iSnlw zjr9^9oib-trK81C_fNT-&%|8cyVu?!VOYquLxUsEBbC;&?~Y#bYTgYm*ROBHaMiKi ze=D)phH1JDmZk4H$-hle(LZ#UM`vY4yn40!bNv)KE{sZ1L*Loo0g>k88jsKX)1%rU z#@|l=a(>m(g->eVOZ!r0<@nv1Q=o_v{aE;x2MzY23BBklpnY4#?K1wR+u3~o|@FWlr z^uR-Uey-QTU%rma3PVr%vLoKbi7|E3N_AX7%reZaDB?mJbslITGh|gt&l;JR3M$rW zaA;LCjZ?cY*ZkTsZUvQM@b+bpDbO;q+?iAMnod>;;z`suRXLooVPNaw;7t@5GgB!S z&lxTF>>m2%lKYQdSV;)+t2b=2drtiPIAL4fzEi1`=VEyAbSVQ8t^X5Lc(Ci@J~O>? z^jL0=*C!&}Ir0vDzPY`<-RQU8NuXXWwL??*^>y+0G-&kRT&WISi&&Gs(r~})ip03} zKm@vI&KQrp4`VAPy;PM@IY!c^>%wE?8nVl7#m{2c?Nq=5U+Bz#Oi^)>QLt%c6V(RQ zSU=PDzKt{}Y0Zd^T6kK)oY+Ix{I1O19vLw!m;<%#o%nKHMn+p@1wb_fEl)NH=j1wK z69>{K>2GASyuXDvx)|2Y$f48f04O#i2TsYS5<%>IUh=kdU4Gu6O67!h<@rCMAO5C~5!(o9)JFrZKY2HW zp@^$Hr>D__=JTMcEEshJ&qH7Qe2iByxCZ7N(`ZY3Gnmi%3Ct(4_wY_*$HDo3^Y*4< z(HVUolGJI?ZaB4JhrL04HF3omOcYBE+refyH*68SQ~d@=>_KKFzPo?Vinm3D-!~vk z5=ZG7qU8{eC^HG}T9|b&E+eL-p>B9Jm#s#@thb>0^3RClFViB6@1DWA33fVYE(C`H zUU;yd2)!S^x{vv|3lEPrK4|*2t(kZ_iP;Y|Y_&JSzx)deMcvvk_})<$W}UPMMjx%X(bQoI*lI@ABszw57n8%gI1cBbk-k4 z+E7*0JfC?iGZ!ivZ#u8RE0on<>1kJ-E+wP;Qd05}aUp!0?JOGYYFa1%sen?x^ z=qN3>Myln)nFagnfASR`@D_M00I?3gv`6`l*l1RZn5h>|+H`-kLI3fPt*};C`jJ8f zS931UU6h^D%yABbDz9W&tiW^Kis59e@lL18GTmsvDw`kFetP}wtF~G>uht>MxtbrA z2<(kHm5WZ(v4w8~XgD0>Lo4@)7s~-_S<6-a!%9r2#fD@&Pyrw@;Qz2g=X-y*?SJDq z{P#QAVChhG@`NU1W^Jk09Nu@urOtT9O^5EDt~khC#aN275=Hy0c+dU`9E|U_RsYBt}Km&>!rhPeJpepFrAXrP}g0cPP2f+ln6v-65o% zKL`|O@yp#?(PO7`j|otl9;w?eR`sYJbdJHL2f_#9bnJ&6xI%auGWI|^8azdH_|S&q z)~$zrM_pfU+}yDfSDz`puxm`JW0|M#*@|)FXM#CZm|(qVrx(CG8f?`~j53Pu*4&VZTi>fD7capCF0YXf|C zUe$W{3PXge-q8Lk_y6#HaT_e5DjZ z4B~LeV0A6Gti4%A%Lxrkyh^%-rXx>7IDQ@W>CX8gl}wv5XRk#fK(;=|8}Rf|sWKe~ zRWqhs9|C`*f}1OE#)%-8oj;HOL%BrrrCEej0sY==Kr5(;8r@*YnMs6S3Owvad-w( zMqEcS2S=R~@dh`oWR!rW;Z^=@`IO!7j{X3Kvg}KS;(s>d`Y!(>ZOXAu0)j#%vcY~c z?kB62=F715-KLWYP-6+(=xHa69+_+Jor@YH1zQzzmkFB6P0Z#_SYMYea?i7acpp;@ z8uvwDOYmU>&*%;q5iJPB@kANPCZ%8jg|k&C!(@kkrk<@qV_ee2_ORj`8Agdbq!M#H zn1yDu8fUnXb}y$3|09z>--ghOKT(6LHS4oc^xb32Uh@-%eaiLExeY!^L>hHsPST z*d$sVBsUg$mwDFtSYT1V{AHgdrb%`3TRu&zU&=FJLV2~%~c^O^#QF+tv#eBPi zj_eP^Pjglmz$BZk z7b=nmc$cecQ`Wq9@???hgoyQe`x9MbnGo}ni0&j5Jl&vfT>y63*fYNfneyfN>XkY+ zn%znh6Dho~IN;tnso!}yBmC#?g(PwScj)Y>Db4o)$-A80JYieE1_-YW{@;{Z_h-JA zxeH@|N^QHOmgjTUvX0lySQsorjnnFHKku%b#ZlonG6k!@2rST~cU$zXT-kU#|MnIy zGmn@=(LjCH>ZyIHC7EZ*Jtg`^@7D}E>5_tFxf*Dsk{rj%?Nj87(h9{CsZl+0)00pp zM1S~k)={Od+KFUs@tP_Jl0%>^s-*iK1 zeTb2d;XGGT$PgsyieS4)Z6sM#l75d$dca2TPqxa=8iAAn+2*QXdgxo@KW)I4R`e?S zi!Kiq`>fDyneIgt;VgeKK3e#4=o1SM9%*KVnNeK8S~uBE7P5S%y} z>4YBLSovcM35K&FM=2l5ZIK9bXd~b;*mr-;&m!0Rkyi6jcPT~I-iOgg`x+28vG@;s zMhkTZpfucuSpB-C)pA>mAj4NM@u9M#FW1tk7Nx>YN3hO_{B%1lHWsdw(sDp8%{z)0 z!~5S}e-E#SsNbhhpHN!1Kt1<%xbkXyT1Ky&Uf{az=Wr}lozp%UMcJuUE2VWY$_1uy z1cJD93zJ#fmC!aV!^$Ao-RoLRTVG!t8NT!*D1ZojUaTEVbdyvJn33)d~@p6hxdI#(>!neW0{1?b+GJA>Rh1&7%y1Z#Wacb z+PSBvA75CshyPi1uc$n5^5d{k(1eC@Qg%THtdkR#J>cP?^x zz-CTAYyNRQ=gUePs?cp6vcIwxTIROWyfB zU2uhDa;2qTo8jN-dWDaf%r7e#c8rnmYBjiI%U6uXYJ6 zv=4a{qgh)cHWdY;W$B*m$=^0P1%~_m-Lvy4ulj}WUe0#Aj(k0B{~m@vWS%bMy`QpnskcL>hn|@}%4{PMzlv3ek;|z7^X;e7>=nO#Hu$hcr{?`vYtUB^zVAKk z#1HjAyR3(gufxqtCo*JHA7)+taoV8K)R)}*RE4AF@!T40V{Wf&>!a{#p;WV&-`r?# zp5_E3m)volz_J4K+v$b(EVM62JXLYk?_}BWRFpnQWd;+I${s=)9Ila*9FnJK@pJ!> z>}(kc?3#AD)pJr?lst7%JLH{#&!`<@)*QMw@kpBq0V%a|mwzLjNw8c}$u+UR?UR8P zuOmj(^;-L+)x6ri5WvkB4nh-tYZ=SBE|Spm7b+dgHMRER7LVPT zxw?0`(X{?+6!z(WrnisSOeM|9GpdhM*M#D&8#M_d*aZ1H)}~RQ6!y7-`Z#3{nXn1b z?QP#rS06Cu-?5_qvL*A0V|snrIqcic;nm!W+S-gIH6)e_ntSzOj_1Xq=uvfe?& zlr0IalB<-KiisQ<+D}OT*T{BYWF39ZTL$Pi8dT*`)1U69wcGD`>#k%N5skwKe{nP* zLkFw`Q)L;6z5~Kl1`FOGWX$D>{28hV%@6-({lH`8*_LOg<5j<)THmEJ|8w9V0f#lc zmLkT)z%dalw5wO?Wu#LCuZSH~!n&gF(kgS+`)~4qUBh*0IkXCsSzP}m>LCkc*)=Zc z9faDV)Hg;JAx{PeXJeaPfU#=`HV`ZOnnfnNZ_ZMaUENxDuGUS{QmSpS?}1w9pH4v{ zznQP_qtgqx`=IyDS9`wJRn*)<-yi^VsP~x29t6JPhhI?V)-?6cU<$R4dXO8ofKweu z>mL6n_Bs|yZ@$wJr!Wwn`JW-ly`W^2mN2j{n!XD}X<#Sh2-^fsa4AN8xQV2UnQB@{ z7c*yXWkPSZjCNxiMHp^h$Q5aKeC&C)nJCt;Y(zpVu@$Ju_E5!7x%@vw-zbAu`cH@eQfBn#}fJb(*XOftLU<1o8j| z&Zu)x6TGU_F(BC*f3W^b>WFRnlQN8rl>{w4l8Rx{&86d@rrLsMmJZ0UajP&lzSzDB zgtZsEd59#K#?sC$zZ;|hn-2oF{~)mN`#El_vX(#-gZ4fysh zw~163Ih68LkikxTULWBlzV=OPxmfTA-L&#hk*%)f6EZb&as<8)tE#R^SBC7pb4F*7 zUU~mmaZ3L+?h}?E_l!?#&ddQy@Yv8a^pw5{H<>V7wHg?2r^WvFL9JR7{88JaEhvlv zRq{!=iKh}oiW<*^mI1t)<`fO=iT)O-IlcUw_{-`s>yB^$%dD5i;=(>e?6uiiA@O?x zu@qFKrrT@`+fgwv|0X}4U8j)GZueefMetgz@QsOo zH79&0?KPX)UfqwRaPZqOq<^$C*oB}_O)vV8Y(U7mFnAJE0-#EBA@NobaYHQl1kvtr z`u7_;IouW9DXZ*wE8@peQ8eg<4pin)&kBx;{`%6D`g6ThqufhLW$i%{DUUba`yNNL ztY(m+g}ywz{&I*nxe7k0!>XaWJ`EFd6ZPUK`?OP-emz2Bb|3{;`Av}OWs(d&e&(@O z!VP{!V2>pa(DaW)z~Oh}Ml&6;m9sd7klI zU75$nV&1L;>W|t8?REQg)63(CaLdfeUf4G7&&fOy@XpcePrB)shrVv>w!>LPD0>gw ztQ&JQvBCEy)-2rhp)(u*tE6fC|0`+a*Z!}P#^qJ5>`l2{4XZ3=`5dm|dmUEldC z#Jn{r-DE8n;E9NgZ9hIxei*4b-HWYQxU2IUL|8*xM*u6hZBr1!K0u5DubwgO@LT86x zgA`m`$FA||s#8|DgyfV20h(63^LcYl$Cb*9Cc9hGnIqX|&P%Qg-=}z&_|MaqDxaB6 znuO8*#_`$!RS{gB9agiGhi^EV@O@OwypxPa|M{cnPD$F!+>x){uAgVg#H#T7U!LD8 zhx^OcmAa|jcD{A>kqqcQr{(J(iOF}Pqtw*gQwF(bB04!GKlf~7e7JM5Y}L!Z#l?KJYBwubZ=5Q;uLVE7xyNtY zX#XBz58sFphUWrN*>HRVRMA*jw#sj@@{j&v8G*94Mf}$L*`59Rml3%Qx!#+94a0rP zxeR|tm5@Lw6cx-dQpguhMFVpzR$8&#q+G3W;Y%ZayRL9Ztl#K7;ErK2({Iydd6@+EVu|sECuF5LvjV)mjk{s zCB4IuXTlOZ&r!4Mn4$ou1Zjb}j|d`)V#SgfgYAQ5U;6{1t2aRVoki)NcIMFTwNM)u zZIo7D)|^ms2r%Te@4O|qGrJZaN5J#c3dpt#J;7N`LUHeC=TSUcDaZAS0x-D}`MBgw z+Ep?v2zwNiW9F8_3P!4-p~Xkaij^p*GHCz(T{bs=T~`4&a9CP9b*r?2BJHf_v{x$I z5Upzq&^r=0>(r0XMr~8Wx%s~-jg2pBRa?>=6x=b``)J*^_=cffpAvuB&>^g zi!hS>PN^4O<0fBTu*>NEYQ(BHBE0DR`*VEk;QozA71@K6a3lAf^x}?r5ac$5TSk^C z+i8?griy6~>zx!nl#k3xdg&kSKMDXpG2!Ro2DpNt;pMzS!&gT4mkcq|TS+iwRbxCw z(dlGw@{DC^IYzMP>f3L(Q4;S2bo-nLF9L)9{yh3J-eKB*VX~cstKl8(*7$tFc)9lT zlh?+N4cOwj|`pqNi}^1wSHZ z7tZ3DXy1wr5!$sd7jTPyX1CMHlsa?PRH=!!X|v;{z-6S1cToBKS~TVt5YfAk!G-~; zw(62ly2tK3YiQu}%wPpenaE^^@Xs0R+fhcK(feF5Ue;dBQ*wH5IqXPhyrUwFadIx0 zdXi)+<29y4rtRx(T9j&~(D5dqrRRo3?%n5r!G zlYZ6E5cVV4Tfx*!dRM|G%b6VA-DO`PglcAU`je+ob5=t1$ukNm9Q9$_=KFb_^R7p4 z42^YPUJ7iC@DjMZ-Wx+EDFVv`pGK)aS#%GXlDeT|VIo7DF}n;nI??a1=-=3VW&{IY z0lKEPQ{HFvx`y2yJAR`$u-E8}SxW{C3=IN<(aon0%88~RCNDfvmZFq$WcFk}@s0dd z`{=Aw)tBZ?V(tsumb}78xE|h|1B0+0H$HpjP)v?$u_c7q$T?@Os@Qdm7FM?ZV0qQ!hWsL>>UQA01sQso8=^66xY~e&|Q@Yn!WX^}< zhd(G0hA722foKGTgsm2@(qDYS7dK8?x1tSJ|2+61$vcbV7BAxl8yAK21%3$uO?~lr z&Hi+z(Yc?$-tqN#$&T7F|CugG!h#*~(*+9cN=p}=l8kEG`sPV1OS44(-gR|cx5ksl z)!D}6}@aFukSP%)x>tHjdpiF6s>Uak_ejWZ`+d94Zy_`3@ z-WZ6mj!sqRQT*evh*i;H{*GBOJ8Wvp&*b=(0$gVsCOO}fp}F4@`UR*D091vExtxO}OdLMjpj zJX}vG{*wnN&4>R8aFQ!1#S5v_du+{(hR;ndU4pQK3 z$T*PE7xF`cLR25DpNPl(hF$!VhVuI{PVPXl^S4+#;bE~`lgI&wKNs)DdCUq$xHKs` zj3@sO0G&W$zY>^?=D?+B%9$v_t3-Z_(Ud(F%~``mgbflQ?HBRG5mYvO8NUQ>fBAoD zxJy&eY0!&Y(}OCa)5Pm==y6i&zYbfTv&&`lGn(_GS3{$G(K= zQ!hbVq+ZG{EP_wG6&IaH#=F{N_S_%iDc-|cR!@sY`lG{Ip+%cn2Cn7w=q2yc< z&Qb*Y&b`_5Kz_}XV+o(-Nl{DvYS!`lb5Sp4+Z4z}t*F~ES6+$LfBy}9;{Lxz{ji}p zo1c$n5%sOUTnQs!Hp*jKBT}}UO6}Ag2i8Y>e@V8)&F6q?xw-5k(sl;EU;`rgHP~DI zJ8VDjI^I9C8x2_}5#gG55#{FN46LeBQC&@F?yHYwBX$g*>*l$!Uu$j%&Hh@1{Kv8T z=r-)w_X{-wj_iLea4@EYwH zK4E>0x}(Xqj`NppXy-MA&!l}WooCZn8?0FOiuU$n=R7Cdk0z-T!TdsG`SY;_mXbR@b<42O8#C8mimJ$$ct%fh-LT}@j`B$&msXXER)XX68N z@-TkV984-)it8_*g)2%fgCqj~`RymL_r-^S6Wek4H=A%+>Wc4@IVdmN>ITw9w*3Mx zmE4CHy<*mg;McIVrvkRP7$tbEld19^wr%k2YR`4}`!QqkME87u`$l^1sQME219&&N zGxj_XIQ?Jp&>`+l(llwsdc64AsVJ?;FwKghD2g%waav$0uniwJc-Tm?4Jmt`NMgf? z{=LRaqT57_+=?_JtECCqA_5CU;P^%09Xncu(y{|M)6j@;mWZFcks|OW;7scToNk+h z@Sw|4KWHXSXHP(ruSi6D9-?h|XyGUtcg>bo7)P~ie%Pw_wMt`;*VynDBl1-K#|@#x zaHQW1;YkDA7!jhJGAoUHPMwAED~(EyN+Kj8FoZ}}1Q8LDA`6Xa;kU-kdSNjX_Yk3q zA|u{we3#>7_FVIw_y*s2Gpfgq179>G;)*5V;4LpUPT5GcjaFXcxp(@gZOo>E_ro^8 zSr#<(OX1FG^c3=TiZZWp1lt*L)wa zC@A7mgmkV5nkaYahulAY&Ms^OuUW4vYKfo2V_KsewHA^7AJ4sjO`Cs?x~3cv?NS!m z`8ZwIh`js&0;tCar;o!ISAG(o`0zXwWk)f{FCwY6N$#=Kk-{K+IX*NrhRt{SeXSyD zj3{G1rT+0(3`g-z4U_zHO*hwwvo`bdVGW|bqmsAUmMCuc^q*kOKdr?FK6*V)i&(9f zOi<)=T|4tYDAXk;GsT}Jo-KkeTSR%N#fP(jAOh2-Vd?#Ug%w|a1V!^dfGQF4bpg39 zVvi%Qb}Z3y!EVUUr7GAS)oT4?c@S zjoY#Hzz^_l?a$GacN~%2v!Vy(ITc^re3ALjqF8r&l1#an1hf82I(%jZiZg01w-{l0 zMp%!t3tDidZ9jfrz6rZ3Uc_1KLDt}UL~@$YA_B8no(-m-TAik?Mba4MQiaaNd#CRJ zSA@}>HMZU+iZo)~ki_?mgOr9me>5E3wubgJtfLh0juCfKZUN4o2yw@aEaV0Yq<&=K zU}Y`NL~^7I3gsPCAa{jd*=L8K)M1G>o9hZByhaJ9Ie!QSUv-^`^dV?9&!*gqpmXns zOq_*K&Ts?NC8YZwNNegDyp>GZz;Y&?naC5GD-Mh(x#lKEHR z3%5+c>bW~nWc?0H;{XMR^Vmz+-*q`9)<*P9FqkoFL;p0$Sa|*k6?{-7z z8gKmkHOz=jnYR>U@eOv=dl8l_^KMwz6&B$Uvp&6jR6lJPi;8i`PG?_uk6DBMTx{C= zRFoWYM#bme`5lxz@g*##^`aHHAK$^PwEs#4N@64LoPPf`lz8HHM$=QI$@6{rTc5tP z<8*sPQ4~eFi15u=cze>;)P0{>jaT3NvD;8`8cZZv<0r9!ULYDv12Dhtyt4OzOOF@ldm%@MMM4ST22 zPoIvvHi~umr8cso@uK$(W+!U7#%a!U!0){qzgg1Q6o1?$Jzqr6FcD^>C7R+vBKjns z^yh5q)?Qw=oa`~NWtQlMquY)kani$$=eSlpR|MjeOD3RX;&{0x!de6*yA(_q;)kCG zV+Th#+Ki^=5JHX3W>YdNSlMW%TTbcD_H%kM=f36u1MMTKw1~FsSY&3~LB019djy8vl_y~)5qFD9kv|#Lr!T9*~AHt>M zh9gL+Bm$Q(ojC!f*Ac1gVBjbw1*z$HVF8GHn?II2`(?8HB05D7vjZWwEl2Vv_a`@B z!r+vApNOYsGd0{V;pR#>)d$P*{I~xV6@S=+A(H1v-B}~-@+9Y%j-3D>*TJ(YNE{J~ zvsnb%NB;C~%wDnt{?Q}RlXXo(#a>}pdpB)KexF-Oww>C>1 zr+^aYCjIjK#Dr9vq%S9g6ZMC1;N;t=4jn{vP(7mDWKPm+ru0ksa@GSyd(<;x%`|e> zfm46t>kcv1R`MWEhuM#S@dxF8`kI5tjts_xVY4xL><6UWhD!a(M>adOBrH~M^Sre> zLe_kxAPr9ZPJQ70_F~d1@pIEeBPu0W$%&JHP9xwmC*@|IIf*w%>UL3EBli9DKXL5U z4Hz6bC83y{7%0dy!BiI)b};1+Dllb7k!a$UN0-MFE*XcRLyN?{Bh)zqLTZ*VOgnd} zZ_FEtiHkl7Tzv=XA^{Wx0?2Brk?L5Dt>5`qEV=zYoQY(^AIL?1Yc2lppZ|oyrYb2< z5$D;(NZfH#WENsEV@75*j&SKr0@=AdA7W!j&HY|IM=RCH*_SoW02mRT2 z62tcT^SZa!yu9+ucX7u}OWm_h5U-Wh^6Z^Fjq2K?@Qt2|ydgtTcc$LFa@wL{oIG(F zjYs#Qa^Ej8W%4Ds=hJ`bdUgm!evAtMN!T#*&{ER^@w{M$CY#Eht+BDjL03q&|cLo--7$gC&k=4Fjh5y!cC z<}*!^Y`-*|Ma;1=NWsGftTgaN%g8Z}G%6{e<;Z;AN?PmQe-t5v@jFd%`l6jQ-kApp zk4<%B#}QG}K<2epF(Ob!$YhInp+KX1Hm;4Zr_Z)r`9F7=mk{Jyn+P_B+=^UrBaLM_ z;|6aWdCTThb#7S2XxuU(Y=p8bX}k?=V(n>X8nkkWSH-uv&QEwzv}KDL8(uU7LkkP! zilmz^=v@36;mGpgJr^Mv3HVb8&-&1xtH94j+^P3srM2VcZLs(Uyj^!L^Bd;LKYRL$(^KDijw8bL}qd8 zdTBVbW2c4pUi?uua{YHi>RN!a0-EY1eo2SaH`buAWGjE@U|hZUk1+nyV(cq@56#UI zhq%uYVOLa8C?edCw!8pp{cV_V^&G7F+QXQz@Iwd{7K-vM5J4~HC#hiBn+^KpoVBAx z^2t%~T#1)U2bfSZE#KS|b5jtOYR1puWlMT}fhZ#W)2Pj=z`mMa;lSzNp*B*Etb7sk z*&@)T5Od_2;OFYNp8(IfrvUGzBkWiroB<+YQxq-ln^X!`4sq)k&YovFSY}z`hn-xk z7pB81D}uVvDO8?3#4n;r*}Ah3q+B`EAvY@sKRd-F999R(MoPSO+K!kKTaTG8{v#&+ zynlSIYjCicrP53gW^jH@z(Kd zoC@cm^cR~^@$2VNU-33hAAAeZ6Z%fUb@QJ&=dU?-kC^KA zkvqrMoJwQgY4AI8-p5Z-#e}=~l5ibkLJ$`e=nh%pCr9#Pc3&6q8_3T?ejo>hK|k`u zE+{_Cr`N;M3jj8VItm#4;f-a7VX&3H!o(6 z(wofCuj7$oAurDvHE(KaH2I-mqcK9NMMMOr{nD|Nc}pY&e-67SoN(t~ITu%4aRpAC ztj5{eT7<*A&e3vlFJX-yJ67zPja$En+tz3kf;lbt@Kv+%$Dde=X~km@lpE)3X+&#; z)5lxo4~gH1cPRpAhJu9U)KjL{l$r^fzs!<}%01xJe~KWcFP9^hk_U5_B^+*|$BpcQ z!GPQw@g#LFBtkxmqx+KPk>f_=W6PIIz4PNhd4-uWK4jELGtGYZ)X7-!`M<{XEAA4} zUVw&x$Vq-rT;k(qZayiK7IB}K8$?TMM1q!dOZijCGi_l`m6nY7C2a1Qkj?ulb-c|l zbtIeOydL!}m8huw1NK$@4pmL>iI6{oR(}{R2phlIk{60NYL`}uc=x_C9_|FsBH@O9 z#2JlbE#dRQI^-USd+rxtpnHmO`DG`R*|^cyjEJuZCr=+oi2ECet_(;yQZO-pEs|eT ze^}h&&)G{t{+Z4$-U;WKFk#C-N4&G%IuEC*7iPu@gW+^&&OVU9BuuBeGEm-c$seCV zap;rs%ohQF>cAeHJ+KRTEg=b+jvd5@pXeiRNJiNe7}$l)&itke1V;8!%{0Yc-+lc;ZK!oz{TsHjjyPNxZv6CHqD4Zan_`AK^?@ zDN0I8Fl)|@m^Nb}rj*PVb0wxsor#GP2D?7mQSq)QN`FPgyQ1`O(u((rsspI2tB*}< zWkZM!DBD1?(B3wZoCXsGSSt$h3ouE=2Cfm;k{6~wi;Z4!MX4dSk}>n2)3BFcXKk=KF#Zf~z8!(? zT+d>oU((qo>YHMNBa)OwoGstVkvi8;j)W1&_al37jx^l4`J0?ei*TeQIFD0d=|}`g z3rEb2q>xaUex_S4nbBnlilLeN!A=BPiJ_3CXrid*h%V!da%y&46uIJW=-@&TAcao8 zO$ZFb{J3~dBwdlH_>($NSU6Z*OTHvriW`1Pj^&agahQ?gSXfdXtyv=KM3{)+9yNRj zK77prOc*-?N8Ue#`nog54Ta&T5u?mVdvG&6QM_Vzf3wM;p_-8ca6KVOS+gw7PHeS;oKKVtXz^Zl7e+QUF4UYC*q#dvn4rF zrcRpJsX`0RR>+n(3F~4+;%XHUHTCi=duekm;hbcak$K#7Ob5B+Q+3@3Schsfg@o$}*iv^y~OCzpUHt zKU1GrC{73lhDrOjY$;0-@(tnBs6Krd_2H9{M-I7M&&|0El6DH^s0jId5w30WEc2WD zSveAxlmlmOv@so$3d&_xomOyazdV;M6lN6doF2{y3DYgdVsBO*nAt25v&_QOL8+hl z*-@N4xEr9Bunae#oND<``(Jn zu3Cg+BGONtK82x!g2-uYlDyXe`+kd>L+_a{SBxu}gJ|AJ$qhdxDdj2866+3UdSqpb zk+S5*o_rPXUBeD2rY8~m&LQ^Lc^8UnG2ZvN)0yIkV{5!vJL}*2o!?D-4XAEBk(h3&cVVDEyna2S76-O;qpE!z=&aa zC>orLV8BUhA_GUf7vtJhD%=%iAfe)2QTjJ&#e3P|J!S(lj`B8%Na2p}{FXBxVji;* zl-O9ZqcLn$Q@9n2c&C5TB7&67C^JGQEo2JJurx+<0zqjy0}Y{O94IfxnfgXE1v*Pa z5I6FYfW@EqG@^%%FKGl)@rXd-q~}Iy@3uv`nVg8Nur&5UVKmg&Bbd+cF^dQi_kK2X zHe{Oti1{;wVYYw;npN6B8^kS}>go#%%=JiJ5V#I(u z5-Pu~ZOp%x|y{rS)AP=^G*O=ZRmggEkFMBS0nfB3w+vlku3u zI>@Q9=cO1dD@loM_!?0pY2q%{+&HdiZ~=xDam}vWKe@)>oRLo_EXEm)P)s@T(2n=b zHtIR*&NaatL1)?+NBc+|>xBq<5g!!prU5JBI~r-iB@@Qr>JMIty!;@J9y^9`s7V^U zqeU?^V_0DjpICl9K6>3kInITzxj}TIh!rU_j*4mK9g?e*Omp-#I*7{ zzroCo2FG6fOLAyT2a8;14$X9A6TZ}A`4??r2NNBNz1XpnNgPO{Tds=IURLyEBY zqaVex+dqW~mtBTBscTIPCtsu^l@!y*uuZ+?O*1F*pA#-e_$kKteRd|C{ROO%*@0F> ze2t=E8-ZXW&PI=7&!J!8{nNV<$vuU})*ATy5fQP>H*?JJCq#ZnkSotKcNxgb7x67lqamr=Qf4_h zBG2U+;O2y!F~jumdEtA3_m|HG?XpA&J9`%}PUewD0y0k|t=aLy=hLm*B822=MxMAm zvHxA1DfP&9Oi zyx&+Bav!9wgtPNeFmV=&7F-96nTla!CZOTyA>_$3kUQ~mwB_W>^T2qc$d_loc-nNi zuh}RZ?sQxg`dbjK+>gV*ehsH2{qkDC*_JF!xZ;Co%o>bF)1e_HAbB!%Tf{rxp(dsB zY_UVD)yGnhNKB$xMm&zk)I%40%wPLF5tb?A=nT5Ce#~>kXHlS?H*D+9y0LLt_q=Z7 zv)2jJL2MX_@p+-WHTGIEH}=;WOLxV4cNsY1T~U;QhKhGZ>EEOk?}v_+n$4Q{!15d5 zYz&<}d)A0Heiz&}sMyG&VPnXwe-*eMGe0jM6E3;Ltm%}CBK(8W-~_^Q-YQ~fWoynpnF*m0+1eyU7f5~d+7PzVXqgkvx!9ya=U+y+1D>O}1D^G)K6h9hwi zX%IJ_JtK{J5m~vCc4>T@(NzhTQ}4~FzXU*mCe1i=Y>fCf%__HTMM=TNJe!fc7DJBh z6nxtA689kDhGWLB36Iyrw`oMSh#25^v89aiI8ELW?mj;~w;)Fhr?3Yl?M33&Z`PJe z91;k{BRc?$;$+bLpIj8*&T$MAaeI0=>dv*WV$5i%BgB~pr{PR^Ojr;2B4-`oedo*!V(S908{s5EEjybXI?WPZ7=sJ*vg^ebpByuXO@|gPO+4eZN!}!wP*fK zX-eD_S#I1WPzo%$AKZ+O0-l{IEJJp7Q4F`B39bG*G-SVzL)E_%;r?qh`%c0a5Ru$m zE68FJ`tLn(ZZP$?BL1a#(naSdp%IR zoAv(87r)ZL>Go1y-0+ckG)Da9$h(4{jr3(n9CRP9M@{*A2p=hhKiX*gv}JLGUjDiH zVW>Hhxoo+Q43Dw$6M5{6X_4^Q;o;0m5SLk!-Yj_zB^;)~`DIvbBHjlfzku%?d7h-M zH2VuNX8w)9@W~QJK+-MAIs7h8RvyLhnIA-!KOdo}^Zp4A9}Q9W2#lP7oV)@Qj3~nI ze*AsZz4u$>O8FJ!@CyWO2nUB??Bxqk4|&eA<$WP_ieDpOnpyS?%iMFb1cNh}B+ceI zX1!pBC9^KE`X_jw1!C&Al!vwB^I@O)bXY%$&nNAjcR>6zYoAr(jnf)p{aR@64d1%s zul1iPUcbZ}zlwK7Q4|Li?~2mDN&6&Hr1OF02qupyXt>ss0{zUHGiEfN4ZTDGL^}!@ zvvaxous2Hsy-6C{M&@Ptk;BcPq)mSKSS9wpSBA!>W+UXeyE8?SG;`glwe1Z=Z==hK zGJ9;@am1hL$tgEs|Y<2ym`3@=J}0qk7R|-=eSy=R76Tj zh>{P9mf^NY7`D+$7>8uk`4!sJ8IQfrTbq-cBjL0l6b>1CJKdacLIZ;^Q-uWzb_3JT z@)u)A*{xw1UO~)reiwe&uwh2T(w^>|5pQP)^?+aQo5YbH44}E80pX^4^X-10h^t9s zN8k&eTaABw{3}>|^&I4hSQ=L7$H<}r49?3jLWTKfJl5EFz31LE653mFPHf#_`fU9q z&YJx;Bb;eZH>}4@KjAsA(>;HAEs&RI{*ckw`@?!p{}k;!r+X(3-aBgqia)nr5QfK{ z!g;^BGkbGOlM#!}Ep<40azEbM`%@e^u^p|!Q)tOPgXY$=2;@uJq(1R`@Wj?zn%*Wc zNLzbEy9)fW05={C8&R7bkTTD1MATo4GtqMFdH+pR9RCB3pFV`vtVXF;+y$R?N*Vwn z-1&(-Q$~FLq?}o9rrbrK@)@xA)`7?NTKVI6Fv8Cy>-DKBKvT z95X`S5|(_5K(}=?8Sb2cIO5B*=P*2Pm@Ic|EIj5t=Ci?Pk>~cApz3ovNp5M&qT zBbwuM4p2B**kE>kt$=VEieh6L^Hw044btQ~*XI*y9wOUZcicxLD`uLlG`6$2>zs(_ zoPb}1tTbNb8uLt1-I6VNG3PDtBL~4|A4Z4}m=bM4Q6vm;ZaM@w1zno9<{mg{b40am zblP99fa44RiVJ=c4N~q5p(Wfb`G}$*kc)|9#-QZVOXV6z<0W+YCH!<6M?IZ}t<%Wn zy&ybhx$+*{85TUZ4P-8*sIRX#9X&i}2La>c{bgwM&*{(&&0&lfHQILlw>jUDEe$F;FAta)V^~|}S?PA`>YxC};*NMa0C8pbJ?+u5)JZJbe9Ahu#MlosX zx0D%|Veon|M?}9|mOT?2I5od*CEhLPG;V~|!L#;co zjyh?T;KVQwtV1yvpF9VwV{(^Gy)i%`3bF&yXEV)E%EPy9R27@t9g(U!&c4dcwlq{$PI zmoLw3z8_8UK5H8@4dXuY88ie&B3E2BoH&ZNUjGReEW8$j=PyI6e~1zKoN>gumG6^x zL-+(xa}af}zks^(KcFB|Cv~kw!joE%KO8556EXkxzd&u)NQC@@ow~;NiKLrT=G*u( zA(2M&yl{7VKKD|KjkS4exOLu(t>YG+Gfmb$D(`#qPELXMIpQ(j2iA^Z(4N1vv&LSt z#^QZ0t$m`q#BjXf6Z>oNhC_JW`Q^UR7p)Bn>q_h$a7xLzRHr{dmyXNP;FD2j4! zxqS9~_eeh#rzriMwBmi!8$U23?`-t2fy2g*g@T46jn^pJcs*aljS*sUOjA@?gpVw} z(KH4lBGLlEe4IR8>#TJa@xv*}rs2g#sQhO}t)($#!?z7<+ZeUtosF+nqlntYdt->7 z3}bUu{Kz$i%TJtfs;+S_E%K0vgBEGf=M5c<{NaO<70fjv-U-Pz4kb*9j(*tim;ZyG zma{mAj`*_TosE4?!R4qv8_yAmgTf()Mua=#F-qJ`Az{Zrt6yT3cOm2UOTc+yA4ZB0 zm?mXYB;}PY<;GEKZr;WCEX<=xpGj|f*!`2C#$L2c26-(Q=_g+{rLrjX3qf%KZeuHdL-gKn9J|8OTNV$J5{*0oSiwWUlj1R(};00E*q~G#_xsh zZJnY&d!7Dlon}}zAG9NMC$5c1Hv2y0iYS$|wleQhuPEO6Svk7rk^>6%uv{}s6r>JB zCC+TtT!v$k=-vy~P1aF!58Dt9i4d1?ILjauZj?F^!p_}W@w@l_2P3Bi5gf`iN%^p& zN5rGqq%AiaP3#om26rN4(dKldI5}fpc^~Q4d49T!t@bwk?J!)a=kfpq0)Eq(z>WR# z%;tnGh=kivkTV#yRSjr4m4~JC@4?t1mx-@j$qUzIO9(7?b0qai^2hx1X{P+o;YO{gM#O?*y$ zF>BY^xnaVTjLN+*)t{Xa^urEb$j_g7f1hig!?{b#8D{Vy=Iu^Ra;4ajM8 zX5eJy<>GiWh@-(tSajFtP@6Ln^{u(FX^VWm%zhwJ4_UujCGUK$DBjs)<~+udC%025 z@fjiZIUptssjt?~KHsUZ;aPt?r{TGM#=K$LWBY8;jeXv%e`{~uTR()y>9GDSUiUoa zbsM*RM|tf?e-Q7AqA2|V74M4Dze(G=XM>v4V$J8X#HBOsnvF0{Gj{Cq@&d;2nBTr` zY^;x63*-mT&>#(XX@o^YG?pGZfJ5&emS(hsBf_jz8d5oVdD0N&8dr|aO9PslcgeNb zsFJ`Dayx~d@Rug8ktTjAqG`tl8jV?t&Bi%}fV2a1TeA>s5#e>J5oZn@L(9o}pjHHJ zgfhozFtSLTPrb<@!({u8@rsE`1T^eG$f9U#5y8sMx8&S5G+9I(InI@`%NY~|3M6k_ z&ns>?D%NOnf7 zosmpmmh*K3&i3FR4NlMJz6&;egmK$nd+dd2u>!&h2Ag);Gk%`)*t#?2AaT&GogUA4 z%^xjsLt#U*a=3Y&oQq-I=14n5z74+}=Mi)4+?y(Jmv~Mc&k+&EY2@sra5@NlXpS}^ z+#E$kX*CY)u10G(54pZVYC#dYS!igI`j;J$(B#g_?cwh9PDPdSlW4eR+t(_2qbN-Z z)8RGAklH5olEw+g$p_7t_e$lP)TtV3Z*qa1T42r+e^ zos_&EEKfHprlY72@YZcU3p|g#KP3IE|HQrzd2S8e5nki7NkjjKhB=1H&dl4*7^B2X||y$)GQ6+Ht@T}W|wO5V}z1m8(jRQVI#}i zz+)VYn{97vZyIJ%5y~Rm{Sp^N0YwtW`En^Sr0tt6Dmpjf!DS1SbH6m~^CYf(ImqEyVg%8)kZ5E_7*Oc2 z*ju7Zs~n2ZGT#~JuY}4Nb0lB<+?+SBTmx@LqvbczSWG#&t#^(fQn-hk8jR>EivTTOJeE4RgQ6-rPSCXL*APFnrWV zvyZ{3F{6z@=je1xl%uU8L_#6C#*GjuG^DX_Myy-l7kAFIf2R%-ig@m~KoQT*0b3V| z$+v50XX_r*<`oszp2xK3xy=jVHTtJm=Q@7YX9|4U+3>uApLRT#3ntw(oJ~O4V$;HW z@i-X_k9D7Qg7ty*lz#ky9CIHjJe$vk@!mTJPNE3Zo|_=rA^}t%JB`XCC*%@^a*LQ&GdgajbF*%6 z4+QbTnHIKOOgTwa1nb7-s8tB(O56<8%bANZXPa~`2kG6 z`dXaLAA!1@LNsONNk~$kbLux5c_VRd)o0D-6w`aJDOBsC;k$;vxa!DS?o2&OT%ZE zX-ei+Q4~c{6s13scDMNhNA|`wp1h4CHh%0mjcowg4elu78yXs=vF=A>V+avxtmR4L zmY>?jyNhv z@n`%|6pLT8>o@-yHzKm7K_8VyaC2QFTARWMh=^kPB?D$e)kGkeozn&G_AIKCGQfxy zX=0l7;+z&95W&R}WM4oUthsH7WJkn4DnU`qajmK}MA;!AqKmuK^V4w@t1JiZu$?1` z6>rj*Z^jro&X@Ay?$}W&SCeCL%VhIA#>}6sTdY@Xa9hJ=8^jwo4c#+u zG}f;@Ctf@2hhcNs2RorC-i=@5%E6>XOf)L@)D4T*c|W}F=*FJs@cytsO}%ElXBa$| zUy}wYqo~|Jsdr{~brD@{+08gwy&uP_4x%+HWM*(sDc07U#o5{hNoNl70s(PPsmTrn z-ha-JiAsDFsZtgal-W~(qr;|5S&mM=ow72gvHUX~){QMo-nZ;*-Y2QMd>$e#CXKw3 z&7~%s${%e-K*VcKTOO*9o*7% zC5xyj6~VHNR9c{YjDnk*6SLnmRx{EuPml{X@*XoBf{XqNjbwa%0$?;)#>smr`q zl3vb)Vx6QtZD{9AnKwr<+V8Cck8Pdsp0iGv@LfB5-7B~W-PmguZ&-B8UmKS7Pdkcu zKEpOX8z-;XFl=1*++y8$jTf(-H;vwS_`F+pG`icoq9}@k?l!L|{hJ;=iMA2vZ3OY* zW}}Q#h}lruUs@(2zTQ0ek!Z7NtkRv+h@uc+lT;d35ohF<{%LrX~!Qy3g{H`z3cXY($<9L-L29 ztvL&aODj?F-Z6w~TjZYRqqSM;om7)xZoZplDQ}6B)ztp6rM=CMO&5)cL#|slJg2eO z!%}7~BA_V_*)iqM=0<(uuBjElY$>zcK{#D?TGDd};rcKF5OE&$iOlqy(Ri~KU!Ebk zV@}?jyBlYi9?m?-k_2=4fK4CM;nWYhbIL3#=?OJ8p`o$P7}M`(I#2lAa5n%y8nS{o z8!W<^!DDdQ^`F3p{`k|#oj42CC_q!7(0q@bYxT{y~nFT*m9+H)?_^;2BcUs;sOu2R$Fk-BTbztnMAre@#gdYN$s&HoK&#?PH z)}r>Etr!-n#K`PMWQXg_Gs@WrQGWrBhO=;H&{&N5;EgEx$eqZUybx!Cm!K}IP>R!8 z9wB$nq{G<In7egNNd8uD<~vn{^qQYMW4fvKpeO z(Ii=DY;J_VKpN#tzx*>Z0wheoh;|7HBGaU~E=_ihOi2ojkP#><_+5G<*hRE(WS63t zO?QemeoAUkK>?;tF2-e3CnHbF(=U0;l5|t#_}Oq3x127|QB5{vZP_^GYy+D=Hhde0ZG_t? zxWxW?-FV?S-B_W*b56yl__w0n>xXVTgh~JG1QB=Ej+n9&6HAM0q&69uMPX_yApM!J zSrDvQ5=^#;R=IoTUbOhaI9h!GM~@$p%Thlj0Qza6_>pq)XZg_@$wEVIGn(omC=^j2 z%;j>EsOeDR3=e+U!F;|h;(oSK;>%*)F>x}ycCqH<*}1Qd8>bA+^P3Zpd%@?5;#kCU za}@cx1@asO(O4Tr)!`FBGwYYnY*xq3_e>0uUy;CaAYrr?pk(}93=RzEnbC*$BS~Rb0K?%P01fqxsBfr8xGe&o!Tvat4jSrB`1IjJ!m`;Ef8w&viLm=YR0`D0}(4h?KpF zLG?#blpT`W*@6%|v9kC%xg3P$`L4~$hySua!X=AuN6YA$XbOx+OU?*1MI~+GhN~l5 zxfVxK!F$5@g;P#UuTw^>lV((|@g zpDQYgJCVzAAX~&lvxtQ#LXmm|L~xCe)cwh|3o$~pPm#oQ+f{S%$wf;LJyR!nj38gi zgCc^$!x&e{%84mYGms|PxBCgOEMny;0>U&t-O+4Lp|+dkm0VhkE9YE}@nc3HM+Au( ziI;{w-O@je=`4|RHo_Sz%PO(F2(?vbFg!0dj+ik~Ir7Jj*4g{YYi8uxHD>CwJvI&) zhEpGC2>sf!h>Doyh#mzz|G*R#6``P@z?>87$LrTN+UbUZo$KfAA0=M1aWVXKB)e|I zZin$YaXapvd|P+4Gt;Wgz47GJ+zg5tc{(W8#63kDg>{aII6nf&i3ZTtl!egQHXPV} z1V<0mAg4871oU7DPVT##JkId2qngCV!8F*852nM!EAalr(kBm;nbMz~E5{PI&yS!# zU*Zg->irt|!`_6PNKn#|BXJKxxGqbCeUZc+6!FVt5|VB^o4`e4bB`o^vA5+I>r4>2 z&G_wo=16=f6vnC3bvSdj-rR39ZG=X|s{NEBV=yyH7=xrcB6TP%X$S`fp(d*URmeyF z^sBJ=(|?1Bi*7tHklh9l}9EO$tRG5v)2nZj1*YZ(#_H{!D}m0Y`T(ko$`O(Pix zI{=D?NXDY5e((3#`SJ#!=_roB@_p=m))f=C*n360z0Tic{;gj-g3h{T>znnLEG)+1b!Yz`5ZWc0uFze7ilQir zqA2}|PDbAMx@XB@Lx_zoZ^Oto%4jIcBWAj!v^&LceQYG$jFTshv+Zp}7e~5Vxm&lK z)6OU1IgM0lMAFg&o3Jq}{))o1Bk$peG~wkU-O!%#n_Z;EaJ@S}_ryj%y|Ky3sjp_F z&bXH}iyb%Z=2UvFt>v`x)^IDrjZJ74!;!7P-~ghzS<>hSa`QyMo2l>&quGqyF+YgkmRBGkqLKoBWI-OvYU@!W*SU6>pB&={v2vvGEi%QVk7I@TQWhgy zvydmkiT2#wjb+5q>0C}VCmgMo{Bb0`EgHetQ6n(pvZ)w7as+Z&{t`w@MC6OOH~C@~ zX(Z=SrkOJwq@hePVYDKH6yqMU$U0!}Det#Ew+(CF^Nx*oj;M=pl(O`3WLdmXXV_U8 zS=rJ^m&mC>IEC4auu||b9!4R*yi>M*B@+j1?A!P$R5_BKC`x&a#}oo|Pk~RtPPbO9 z(h&Pg=!a!vlHynyOb3da7F)0}|I8nMJtuP2$(N~pwCDdMY=$i9bJCS#Zh#aE+Oi`! zc49w{9WO^~7I(8}jm|b@$*J`%EsoIf=WuuTh}i(LxhaAZ)m+;x^(K$A2v~E(ISbsB zu`BwR9+Os<56g|^XRa7~CYhtS6u{=o5^{6Qr}0F<`&x2vvhuW9ci+-1iRA|JBI^BF zLquKu>pBhSE4d}!f^vFqL6OL|#`_i$chbyyCjVG=L_(90of!`ie#wEGV+Qij zEYDPfFNmR+T!wL%eE>BL&5{=>Gd^?tOr1Oz+|@lhCy3@q#LNU>IL?hRPl}w2m=@vA z(1(aLIOxc`qV#Wi^d#Cwnzyk=Y=f++sR==O;Q2jlX_=Y^CnIbX!C7;n8hdxY zBf?u6xxrjBmD{W<7bw7pZKQb{Y7EyjrOmIL%O#p*82u!MBavPwY&X#lKVjD@;cz-M zr!I3!vR~3+{BaYl<|zCk;M*EPI8$@Vd|Nv^AcDpHwzXNe9StMM4d$AgG5Aaq=8YVK zD~1=b8I7O)_E-4#mtR7IB$WBCtv-o73R)=(lSdH+CT}8ejleUBqSzE8!h@oXB9kvo ziYSi6Gi{u?ATCfexDc~v&A{|&Q$-x*Nm@kYgd2@`=QrG0o>B3~9neiVQtZmhmqLi^ z=@}i%kj7%mjHWZZ4R;C%8aDiC=Ll=g6L6{+f`~DWM4Rtz3%2o37&hY| z4Bv`(Z@ero3UvO_v43o6I6a` zNwXfl;bb#fLlRf3(~)8G70jo-*RAs0m<SNS5E(TYC)$Dt2Zy4mEfo<-5V<0GnZ|TWA0HG4bdV;!CbXb{bV8L* z5D*ZhN++R6m99joDfCW451ki2zkBby?~V7y`2F4(=O0K;&e{9yWY0O*T65(SHl!P` zkuQC4?GZ`ivaB_71qe|paWGA8UR3`wkYMejPaF8@^kzSLI<_Z5eqk}Tr8ar!$%kn% zod~KnN!cu2l_aE1+=^*mb(iqPz~hI+WEz{V3P%$cZd{SRAwaBC{W|{+UzD(u&`H6l z@xq?F(-W^0Nyw<@YYAlkNO_&r=P3MiMI(zoYP;8XKfjwS3TIw~(qpa~b63^tzg(PF-keY4vi`)rCs@PinjeBh0Uo1E*3; zGZaoJ;@ITbz~m{Rp}co&5)47?TQ(>-Du`5?`8ZF-P7!P zT4SxR5Qx%RLu+I1f53uI(^4OZln+8yxYGxU_U+V1+@Pt$Y(Nm&=nN((`~D# zB8sWZb}Wh#9b!8Kk5LesncPnAOaeiwwa*0#WaWoVSlIx}8L)*% z9k!4|XrH}9WU5RaX-$wS)Dvs#`4T#wh5X)b$JzA(ul!bg91Y0|-FBp=PI?jK33%LU7A_Yc`q<3t?Qz+a;U#L7 zfyT)UxDWkljdD!$DY@egO)@@7@hkYgf}^Cuh(olcGTweyZ7f8Y&gR=a3>$8FqM3eU zFz-mm&dmIEZ(`%kd3dLMBp!1Tw4G^{F$Su3+mJf0=?NTSC8-{ds?%1tIqbWE`YAR% z{PBb`vwIvJMKA<{IZ$6#DkHr%xjurfLj%2)up)k66i-rs63`8_`&D2kCtHtu0L zl%hrj>FK27o6o(oVRq_2G>U$4-thQ@hL{C7x!<#oF?#zd{~_pyy2SMlmR)2TDA)O) zo-+^hR`ae|{tjE{J+cSgFZuk8?MF4}VG>!1^L_T{w~ncgxSq0hpAbxxRdud!X>jHw z)Oek*9boPVA5qnCfBdl6DW>Z2L{4@tUZCK0qS-)oX7nAK*g1sgd-`OFIsBAEnof64 zCPF*_lte~CagUbv_97RT%dyi+!lDan6B=&VXgd2QytpI|-kbY4-qn<+P&EuO4gE2~8e@63W@N+JLuk)f zUE(7HVUxQC9zh`u_1{YbvfQ(h=j+OCBK1m`m|ez`4pz1-Z=Bi~-F&aKE;lj=do;Qc z*J@Z+Z@YfO;bT>y*eIJ+E-M@PQXHMzm2u%~C(jS={637d-3wjco()uvP4Z?ely??m zIaA~6SUlR!MDvmx%sIO1D`1%6d`%|F0Ohc9S^-nP;;8mv&Tz>j;om2bAC*Jc)<|@_ zR*tmAkEZnVeK!`DSg|G3r%_A9hg#z7-eo*;$-tUoOX8N*JG3rJcLxj018W^Prgcgz z@zL++d**{l;GU)~EH3h(5XY4?zXNuwv+3pd5KBXhm|HTtW<9%N2&}sSHS0O@L|&qAP+YT@n@IW$IUp{CVR&GJL1l zlqwX0DR7+fQMQpns+P~L$Q#=07NQWwl3*0*nKcV2SqbuRd;CHB>PY-}F$zMw%c({S zgf5FxX{d36UtpXEkcu?8ax0c9+Ir_NQ$~(-g9CDXmB$1Ghqag zo~-%;2Sj&zIwg*48<%t4$)E>+fpAB%dCvcMO|Wmdmmg)ks|`ObV^xrD^i$Fxo@zAc zteS~2$q@IyMsfB~`MRld4HK;=mt%%y2lczp;eA6rgM5wr-h)5#5uc^)c;~`;1n61P z63O_*?T^1nJqthwYHd_<&&f-dZ8q61e~Je9JpkB)-mQx5_mnE|Di^DE-PM)V$zO7T zt9MqpD*L-s`*jt6?{K!5rx%Le$}0U@!HPD;ZgJAxyCodY^D@uO))Ogqk>lU-jY7L| zh!Fg^&qhAdPfajgI-1uJ;T^6N$TU8!{x%Qr)F&kAvw5j5cp@{`dnRX9lKOnIg0vJT zf4l=cdn<{H^jtw{J;=RfJ)v_^)*#HS(U?t59PwH`^#`YldWhGZ`#Wi86&Fa=dhzuEL8ug*8 z4qxH=iNLu$e4f9e!jyH`KSC-^3GBTz2R2`;?hHU!r34juF}5 zIg=h~Z>AJ}Z{%bo;5)}48AiaXjZ0*wVs}|~v7KxYJQdKL)h;zkD?p^om@_ugLhb1O zCi>IB*xioh3B`e8ogu0yZxsd85vSgO`P68l&5b4*v&Vpq*H%rVdHc>Nz8Sb;7=75%%XqIlwyJhP%B9Y5yn*0yBXT0fpuo3X2)A!;$dx#6 zq&>~?!zgbmMF;A&;Zi9S11lYll}k1;>v4{frxOqMjg8$Dr>78|4^rKYnZ2i5Z+|SD zrXC;`*4#;#(^E`P?0L`#p6^)yl#|@Eo~jKCIX;oF=m0DFmQ2_^uh(38kY~;>xme(U z&<1okT%2-j9G{t1#24@ry*pqqTNs^l zOk8Y-S+YSwIk!T{r@y1#g9UCe>Cb)6Um-yxzGg`<;!w$TzQE3UomRL2b|MpcHk{H6 zS_MLPzG(eMlv}b)k6PhRnj%m?X!y!ULGA;$lI}!~N;3v(=tMq_XL_EIkcklOEFcx$2=_scSsY-S#&AoIc#`tm9 zAhX+PdWBFw9|zWzvH1OI^MEw~U5@WWvVBwf@CHRRA~58WUUkk;Wp&ga$C9_iW0K28 z6+DufV*V-4tx=p!KV;Tt2L>P?gF>!z-KC8-xt*{%2MKLBA2i8P1he?o?K@IBbS5aC zhBQ?6%)KX=hjOCAf2nodRd8YxF*d`6^@q#!(EEQB^7&1A71@YHGMrNj5R&n4yoV} zYMRg$Y8_2{9Y8&vX!usLNo9uBJkFo9>ADQkk1uE^X9p43<)bPF#-CS9wr>pFvFla3 zXM7*o`4$gE@}%30aiZQPr4KRE0Y%nR0e&ehryoe@%I56({_OnJzn34M- z)K+vUNiBAZY~Z^dDujPBcqgq~>h@`x&Tgh=ra(;R0N_Ypac8m3cjUGjGuffNFkHz= zXtQ;stY_KC90wI3$aDSeuTecl9{)I3wDNV)96DUnuxaCZyg8``nnzb&v#eXMR$CD{ zz0d2O>K(;OTj+_2FgcKd2kXCI2VNKCFpb`EPM>)Z(@Je^qG-)qakLb55>`3OKnt(- z-KxkXQWGK+%O_#swn1z|m;jOaEi>&8ZL;rl@D_K2xS^a_KIX%i8uiRnXN5B$r;_2`0~TQ7kL^zy*-W(q4iewD3TiqPd`7QfABKh zrX!p@L)w+4CxO#F?M_yF8oinvu9oKN&Lvt#}_j^zZ=^#Ae4?V`NG|Ni1}sqE!B1;v0MK`aXB*Qi1G^yRbx zhY?`Ho}nk9rr_@t&3>-{FF%KkaBo@{>i;YOFN1k{+;vdrsUTsbI;YdciG);XEz56f z!wJnAD3yQTb9uqkSoRoT?z>O?!ITd5d(YwP5x$qh`Fo6x{31k$E^k6zgK&waiERjc zJ@BbPKzi0n-ICGe{|xRE*O!HkENi7mD{PmJQ}8j$UMb-Z_#KA5wb$?_>Z(L_{22U8P*xu>Z_b5vSPZyG=+U27YTj zJvK_ebSB-J9pxJG@bAr|ooK0^1qeo6AZ5A;qfE|fZkB%_C3Tl2-cP$7-vq*Z>(9OQ zMps=$i*R{Hfq}97avzbUN=wLfeS7I73+5aKb&>(mPX4elIfqh-5bNP#B6>zI&1*k==Khb@sR(7 zd2f{ZnoYs)2A@7umC&BGfjEdW1}~x5)E>Dwu@T4HWWPHYytyvlMEzji7wWW9?m-y! zF%g2J{a{F_+I9%_^sK@sSMv~)o!6bO1ex5+tcL98i-6Wz)DC|K0u0`j^Alx|w(V77 z4R8n&PU>88t3tB9kkid4F3L}%=HumTa6bh}+W^qWkSS%hX*6ee+RL+hIRzjAA)(GB zZViv6LFVwzS@1pdfb{GU`)>6??0^|%q#e!5bA2^~R6UaewX)ncBInl9nh&Yy*_knn zR?90$TOwc}yS_f5M<_<3%J@Vd(9T&2BF=w0QMalDhD(Nq9Q!K!#XO{``^2ym|4Z0q z$}%bh>`Y9Zw-2k2DFA7pxs#p%Zs8Ecw$y%B`Y{IFlDXic0IOaWhZJ6g+|~_E;Vr$I z1Xcr}`mT|y6UNp5#h1%@x$js!TMSzwTDM%O`U>|CDGnItX;nc1?WSaGp8;BH5eEvw z(FK~~L|-=gu6rrfptcck4LWZS-rM1PPeTznPSGu;m@JjD4o*GcE5B-s*zjK+;bqHQjc;TcDVK zw_$yjQ4G;&66q_@acQ3RGgCSkavH*TV8{O;-dMyRy-Qt`gkL#*ZrvDK|C)v)z6q$i z`fBD#m%Y33WD?fJWAMPQ_p}RmUYm^#J(X&w%q_)#FT#aNR}oa}gV;WoD_K1+j%jZV z)RK<*v%ElTwHI;?0{zGOQedsJ?W`7rZ+%B?CRc#rh*gXV@fyncZCz1x$8&VybV~FK z3jE?kU0NuJUEU|q3l%&EIk=4-7`I)tr)}4i*J{C?HY$%h$$ZaLO|)o9cMafBSgKS* zz7e8uZ&0xbjMVX14))V4>)lDMsW_O)1|mX|6{(Hq#^D#8w-oHa_wP%M_s(%YW5O7x zznO0aT|k;R^SmnOp7I>{Uq5$fm_-r2z^aMf8U_e^&!zV4oHe8smLbia-d<$eDmAU_ z1_YgnB5R-sw&9K+NV6cH{-<%A$^%~(g^G1Qr@%gkD1J&TgrF)^W z^md?~+5HSr8^9(ppZ_wz!QR|oqZ0+0xTk$(N}#iN8EAEGF4OJHz1phxx#O&h;@R)BMlZK$XM`mBScM9_Ur(beRU%$|Cv-7A zzULY3wwnK>qhcV#zLZqs7Z91UnFPh8iL!0PBI(Z#_KjvrhZ~zF;R(fb9qega9>23B z-y^AeM9Z~h9ZHITucwvH8xEXsp4vf*vzR@1)8vFG(WYB@Q@cc`y2u-!x_o4FilZI#XEMoY9)?vor_z)fxP09wD=C1ed{wV`bTnb&YJV8Ry4 zL*%!yDm$daY#$KNOQnYRwwP^PW6Q%a^zgcV;EX|;P7ZI|Mm@yO0;#Kq+c{9q@Ug#H z!aRw2w=Bam5d1iUQPEa>QNrnWaDMR6^7=aXEzrG1V*knSv4*X}OyG=fce~6K6 zn5CDjtBKX&h+UmXv-tu~-#LiimT(FeiWwCO+M$cxUMmjiikek1%Z8?Ga>g9jNHIx# zB71jg@L9nyI$Etg=BvGJN7c1?-o%vm0^F3IyE){aUEiqtn$uC|e4c06NA*e;1aD!= z8u!U?)Y_n)8O}kSyFij(^IvZbr}#eTSJ-d=;KmfYg$20zb&Gc{|7fE-2h27=7ga2l zwAextvg>8pKiQWiSFbbS_7fDWGbeRK1KLgvAi;*`@UvGrZLg0OU{Z)Z0itMcKC~uZ z_C&r5r=RAoTaCjP`^i>wY!U&QB;PV(1LS<)x#tiNuvEC$1&>`GiOW;ZOLoeT%M*ga zolGL8We?9ic62voJD?f7e7Tuja#TnTD~(aWeQ%Fhy)iEhi(Be1DniV{Wx#LO%}-w7 zqQ&$jcg~JS>SuQ*QvE4QhV?rVz-e#Rg5*CLycw%%NLb*z@H@Sy1K6q@_C>UBI2fAK z+r8cCq)NEMH0V1L5UCwYYK=XmvHtlp)6uQ0CnMU(x}#{^YH%f*DRnt=g!I7!jU=IK z%D3Y`inGz*wG4MEB*D83oj?!vH`BpO21XOjui@b(lB)cbUYL9~wcZoi_9x8eg9=-W zZYA?Yc}J>&NOq=Jz)4b+qrVLHq>O$`Gs@Lv8Kn`fBf%QO%kx4Rma1&`@h5ODcl|b9 z@sD(+qpAlYMqF;91=QSX(D)C7EW_+rO}^LibC+dv`Bw4|mTm3T=e(K6CKokxU1na^ zYoNb+7d!BGu{SUAHDy?+@3+qT`>@@?gfcc7pbEF0H*|9jw7GIK?g^E#Nnkxz+&zBx zu-kd+ZUk=DCplK0{V+Fj``FgCpKsB&nGxYZ`U~@`O(nEta;qy@Fv91wV{s*20I_dw?iz0 zS=;11t__K}+Is|_{tUV?O!@Hzy4P&2^~8}1@<;lk*iV%IuJ<-$2xXA1e~f;m9pOP| zi=8R~+8a;?dtny`DGP|v2DfdUkYxwC0nejUacmPQuE)<_AgOvY=lRj#gW&$R1vDi? z-i$L{Jul|m+K|^LTb87o2i>~IluAZw#96Y{agDeM<#i?qfr7jrW{_kHHth(kk=%fd zqu!gV2Ju=R%gV@NDlkb~erD17H8v5rU5{Q!$IBZaEJTK0bdn{6j%L= zpB(Cob|fgTho8wb3Le$&@z@$Ln9l9BZN(2@fes2hU9i{wC&?wEY@K_l+&Febo?sqx zkv{X&zk&d8;?gH}q;m9+6JhgK>It%OHA)_7EczbA%tGEN0Iukd6I>&@MhF$W_;Y z$lBj*j5AcbUkU49eA_+yu{oFq>gL!<12&J8Igq*=vf^Rp*GCp7;?iBD!n*a2yqtdv z2<&Rf>u|yiB+Q;GHHSowO1&u<&%*rgoIl}v7%4X&U$5CnxHrr?_wr|o)}E;0LpCBL zO@uD3oXCjNzpYw%Ncf3<{ehwsBu@v=AP`ogsvP}VZ-N=U@jlsR7w#m3dVgfDQ$je~ z%Z=&POy?Ra$-Gb=Tg1BPKu3vvUUy8BgXhpf+B-hv^<6s}93Dx(sQ8yJ<$b4}UtBk` z@wOBp(yBX9WXGbpm^ba+iH~00ySSCRJA`L2Pvbj=69Ffv-3BT4dOys*EVb_tIsShokU zl)Jig3JpLmLCJlbrr@kgPz}0b3}2=mMj-QWRZK*gIY+RK%^1c28{7C^=(Lk%BF~fX zReHAAcN;MelXN{dyBTxv`oxYvK+us0f8V3Tf<3AhIaiBIhNoqTClE{^J+rnB6sN>Ra*s@E3hDAUt#;aPI3!|p=5+iwuhHUg zt=#@k3B#i?Qx0ssv~c-L-p!sEZ)ZkS#J%O?^lvCUz?Kf2)@e$|$8t9TG!2#uFQQHQ zRijLi5`BsofzeFfVM@(Q%Accu$*wV%PD})b5#n59>yT{w+KvaZcTazC*hX?f zX5TA)kfn=hthlYVs{5}7L0BTA0?5VVtxR5cV+n=+MLiop$>SCuOJ@(Xw!UsQcitCd zA9x+Sd+tc=k$CA?CGfW;C##0 zi#Pga^sF9ue?e2VRa}meVdQ_KQMGk-cUhd&{r`}=06@sPO~K_krF22+scB%GEf(!T z+j@I1cmntIuat5|?b^%-dxSje)Mb0i@SdDx7eS9D3yApH|kvqagSiNag zd!^{X?aFp=fq}Jc|LhDCo;{r zOqsTb7B_(r5X7uft z2N}@JB0xXMy(_H7Q&Su zSlJ~zC=jn%?2}ar*+eLDMpH5HKw2lf&%w;1)&OX;;pshgbFB~1*I<-KLtROj6F;U( zBCYuM>gH>f(*m0Lv{Bp)ZmzhhSW_hu-dqBeoiFJu_R~OEq!F~Ntzk}d$8ZDij+yrr zTM8~?@T8+KJ*{Ob0Z`XC7+4yHeT|8n>EtO)%w3eUHwJ&iNtbD#n7y2t3{SilS09Xtej2 zm)!E_mhU;7s&cHsye*?E^G|3rTsVTL0u^*!#IeC+(j0UeaEZ5`X~;-@m>r>wLkW+P z=1SqW=c$zO+A*S?^th0&{wz z?GBgZi3>!k`k&n^{JQvS^`wf@QwU{06A$OC>_A<3R{%6=yQW6Wqorw4MdL)y;KVYb zN0&dZ5_YVuCwt(HMH0fGOsOBLh5i-|B7m1H-r>H=P%JL{>SPFZG=ZJd&WPmQ^p zcKT(t+rn_oPNJAC)WTw7y)gaa9G8#~C0!4sTiboJyA8f0e~$a=J}*P6_pzyH=te~X zXI8>@|Eq-EB>Ji!XZiQ)DfJr^hq+e*Vtq!6VE0=(Pr6{giu?&-#`{(!aUtZf{!_UR zeDG)4PmC~`eJgtYD<@T!VpqoDG`-CVu~in~8w}&TNg}Lxo1xE|_MhOJ-fAE;yMU#% z_UWeIb=>w%F%}TGK{Cd&9>&1*!2tq`AX_bO_vWqG&ft}{yQpCu_}cq1)z3yc;mc!9 ziu_!`@_WiT%pjjJW0#PiTQ8?FuK=lm<^;`~pYhhe%?=D2JiasoQ~d?CsDuA7ljEfY zn_7S6>S4|1r=A3sGvO<|#-3$410o%o54nU*mh`%HCI(A)_dXp=%jpHoGXK$M?J2Nf z`-V_sM2D3WgQ-R`S4*Rvp5%>dAf<}n2SDSwrX?P86T$xOULNk)t@rw1Vop;r*7rx` z3VpFwA@~&m#gnf@piPvmte0Tu`*gi_jbeQdb|2D_JrD6=UdLScJk%GkzH}@;@P?th z{p^t1tq5f#_%!*~lNuQ;&Spm)H?{Bf>F%aNsgTchuG13`pjbG;2j>;cc|aN@$$*CX zutuLK*RbSS`nCl6-EF5`7aTlA3M<|z$nL0LKyjtAeBWqczzs7`Dib5`F3ZMT2i(jT z0pB@qi{{$+LTv+!nh{|I+G1|4_i7h!HxC<5{h6!pEwM5wcG~n9O76dG#H88N9A7yD z$xdr_2-fEh_zvDPHb}kNuYG~q$6L9okcpljv!A}Pl-r4sskhG?VZVv)5;W z1cgA>zi}UPJio7gm?QPyf@J>!=KY%FA8%2v;3?mfYKGFWHW;FR$Y;03*tVn~fg=Xi zE`W=l*mJwtV9wZ;1AJ4hM!ZdlBNkUGVsfLYT-d)O4ddP@)ns@{c5=z@J!hEPd-S4pMF_r>(vHd}Wrp8*M!k($UDPFE2^V>8sy7@gfsyWm{U zYiT>|i-Xm_v`&Y$22Toaw^dVk+wYGZd&+=EruIcxd4e?+NJopLwqJ4A!&6++u9p0o zj>kS@|0n)Lz{g%|ECKceILJ=Y2x7F?|GpINUMvdpzV))z5UZ!gIFH&iSKVWytpyJC z1BW%Pi*r62WLwNRAQ`~=$dr1|%VZB1O_<#`f0d4sBXa(_S=R!(ssKJb$jGZEN_d!|{pw>nhWh|M?X{0Y3p-#j@yS6F^qe#3iX1ZP@Fn_5UYa6qEc= zTbpuiZOvn2LOk`uhfK_qdvg{q2xQ%OAwjUu7;aQAWfg*OuUgk3s^_G%3bLY!DUg|| zn5%C53yC0<<;F38dQO-lp zMSTO*4vG3=f`)hPRZ?e62dCcY)iwdscgKby5f@TlNr2|c%<~#2zu5egcpr7cyu|-S z(#LP>>!no-4IVsrFhg*wTQa)jE<_(NSmmsjgtWa2@71<>D@4f5jzO&FWEJ2sA-nWs z6?M4(EB^549sOr{AJL%Jk=gH>_!$IcWoPQ#oyS9NSI7y_^S=6Dn6JfYeLYB)P1CCV&qeyeWWBr*9k@Fo^SLc9 z9Vuxgh{ZH=;2B^gna`@P0x?bW+OT;Uk(N~D#R9_g{l`jB3bjN%;X_xRFF)H*VD0FV zld;>#5ZE2g}$o8>BUq|WgT>pPGkG5vmCUSz-asZ1?QuRw!)_) zW^h8Y3iC&1t=2qlXREj1hZ__+UgmpB+fGp>fKU2Oi7Qmw6`0FXw|~B#8l;Q9Ni!ktRb=F@wv{&r+}P=h#U2QV9F&bfHdJj6&0)=13vC1Ktr_%~Jl zvd*h*C*-qcdiUpz3}i`fw)d~DqZLh$4$k9;| zTr%{n;Gs6Ry$(yb2}1O{xzNRJT;7nzezYXnLi4*lLAHI1XbnOVLlY%uFKg}G-r@V$ zMWlFwizM~+-p!hq&wHD^&sYSvHd-t$_IjPRPqu&O+Te|a+v7m<)dy8`rvYN_m{hJ_U<-+#(An$z1Q%mny99i!6MxKhZkR1m2x4lzj=l zQj*a2zGlCrX42s(0ykHb%wx=!-P+1ol+qU3fH}RzVE7U9PZOYsoLB;9(c;{Tnq%_m z-N#kH_})55|D=6?q6FHHz{wrhaG2DRCBToQkTzrAVo@rwId`5VX0&$GGQEIOyP0QSajQ-!eK?Wp5!02oKCK^+P2u1 zIy%8<7JK33qd!dlsO${+!IAFWT80V8sy1*nv`9(+Ur2AL`gi|qVq%g~WYu1>d@qWW zxc+q+tC|!-+7S=v%2=Yx036^OmtwXXmuy2qzou7qAQR37b|Ml~T!#cU&@Izc`JyJ_ z8iVpcV1JW|0@URb+B32Q=UGx4E1um)KaX~3i@250QZtJpAiS}7s`Y=|fGI z1@pO(Id%9#@h-0FQ}9$!|K+MAT2a8U<(790j>Lb5x_=-7251CqN(p^o-Ck%ou!(2x zD|+I)(clt9DLVM={MIQOAm+Mh*aUdl!(uOy$xq=DtMcF&^7p*w#fP9q36EGiLCaTy zSe@A;JNk_SP+M5xj$PKTRhq+U zkDmZav7G?Rvd-uKP3slT8 z&64|$ADmr(iRnRQ<9iAN4VrN284^dgkh`mGK1vF&3Fo0hVLcbuv;$nHf<-%4_kl01 zd_#1yN7o7IBq#D{T7|<0{vuxFRm)o(6`T%@fzu8|{T;lZ#Pd0X%=quNu zn9aDk^i76YMZpm^hyL1iUR#kbTe=hmv=_iOjxKv{MKw5llKGBPvFqMLB#?GoAX=FmQakYjril*g_-}rQ5q?@PdDGCC%>I>L@Me@C`+IXW@E) zGP%&E&J}t>d@{%TP1T!yQ{$>5vyrto4g>N>3R@HHc~}2j?E0UthZf`jRe=fY>|LbG z@oMJhJfF*U=LzQdTz-m#US+Q5d~Ag9oxw#UXa1carr3%m3U2@?dwpB6n!vUC^sI3X z@a+~{t$w9Z>J6q0*0CXIvU=Cp%zL0J*?mv7nU(xT%DRazgBgQIgO$|G0QE9U3*zSr z*)FLshzL+irk9;o{6qw%oYNDt9;E2e%d{~Sa9iK4ydy_pGpca{uhnW@E^?{E*INu7B}`s4(YQw?V!l*E)3uA7se8@6?_zx^&-xO#%UcIHuPwb zxZk|14>i*vT^>8tE`DDmj8Z8Rz74@g3f(=a@;1<>~EjH77 z7zUfi-)OVZRCD#~p&7QspSfjA0*n26xosY}4Z-MFJ65(qKF{gLe%P*}s^Yl^H*MP3 z2(dS4N@S)0B9jZF=>#-*eZSUQW>pBBDy-7RFOl!__&)^hevdvW-kuT4Y&8D z9mDA;Yx79yf!NhT1W(SjEI;8N3x%m3%bqDXSA!ql++B1>Q4$Qlm+cyN-;(XOfWYWD z>XBy(i~&kdQz?lc?U;koz^x-GnpwJr^7d1IgvZgIL58v~6R$3Rdt%362@zhtTWBk1 zvMyK&yD6hGZDxv_)U_xX5Hf$=9s`tYK5Np<*gej_2TSFPafL0(b0Rd}SCurA2ddLY zU*UvI+s9rB<_kBk@kdiZIJ-Ols2Q7>qt8ogfz-0jv$osbuR!j1od8g+D<%Cv3Ame5 zF0Ftj?{8QN!#+&NZjKIy%eDXj@W8~$o>Xjtk-VGBAq>v6Q z{z~Vd{KI8&S zJk~aA0BU!(o^azHm9f8IjU9J6NV73)s6E2o{fGaoTg#{Y7w>`7bZ)DGDc%2PI2nIJ(}vQ5bY`1hAnz< zFRl7}yl86Bl`+W>lEZjb2yE1&6>F{U^!tG~0FE)6OPf2VA3# z34UcIn-Cc% zp=>hwwR-3!5_tVK23UjxX%JJCw7IL2!2SsJs}U1eKJW*6P@tWmhS!7`2Pb|cA29%Y zJYl#9#gq6Q`@{w5a0&sqWZ7w-hcVU@?JiSo9&SJ=Z6JXeS&D|yc85m{8UPr%5t8nv!K(u?_sxr%V= z>|t`7fR4}Gwbfh&hLh8fSmn>th_n%jk*BaIoSV7!CqCc1@s>@NGD9h~Zu$qzFVvbm zKD#)#*Y^+t>Oz)1E$%HbZGrfUnP^N~EM9*Ac5gL^pos=h(&HE(bXMQrglsQoPI5h! zK$lw>klb-o2{E!;cJ6HH8e4tUxeCM9QIa|^VuvUn8}EM3PI&G7F{ORAJ38-L?E1nA zZ?JiVJ)Nx3;2_^5e;T_1?)N)&mnmkgyBo*1G@kaTm)hEkjzxXMo|&+huEqw=M1jC{ zYHL%+X!dtF*Bl77T9a7cKstUmGjHw>0`t)Pr9cm3+FZ;pO!u!J@@1l^@UJ0PPIpDM zJ$HPF-9LnDs%tw!R>jVn&`_d=o%tUu31kC%ADo6!CT`WtcgK|%^nsozrzJF zbR2aJ!U+Rw2byd z5Y>rIG-x__Oehocd%+=PxMWMXKj;xy;dkrwiCic1rv6bkk<5_!rq!Cn@<%t|{WwDr z$tS0$X8LQ7o2g-X*!Kl{w&)6{9{fQNt8bEg&KvpA7)g5Bmw0OR1@p+VdQL9nx0|h@ zb%e0|_HQhw%>{bgbLV;NIw5|Ee*8ByJQp*@E{fAV7We`(cq6kV*!!hXx9d$+zk*Hf z8+ouy$tqv3E@jE9K*W%FV_vDR{^(sNy&vw8zTr>sXISs?P=v;EmfjcQ)n@-^9 znqvRR1#crWWdSo4<6W;4#~`hMeGZD!v8>*zqXVBWdwwi8n8!BtX7#X|%1!mVZzmb8 z&xdT;t#i0&hVh$Uw}y;a8XH1k-obIuKi8+Njgk{ZOE?^w`w9y7M9)Vqep_94}`xs3f@p^B87d4^<3DnlVufrXgUVCLVE|fB>_eG5ijD#_kxa3>wCq4vo_<3 z5E--e^8snaZyr3*au0nGLTnW%5vaDx^$%}8W~q6Ex=~gxoM4G_9%JLf-ns9lw$WQj zb)WPW(6xd68k~cUsdNKIj<6|#P1i>C`wy3i4qvGRh_eH(rU|!TA!v>^nuOe6@1<}8 z{eP$9dQI3#QeyZb{VG=7t|O;9S2q)f3Uu_-#kl|jfhDI0=05|QI7}qIOlLlgT@=5l z5YJoPypq4}BW$s^jWkT9cz1hxHN^1>o})IXN=QjB>d-S6mtrR z_1K=a$9O-W`@~__Ab3s(UotFuEaoO~Mt$z4GUwql$6tp>DxrIv)`opfV7BK7bGpIb zehO+K;vCWOI|}C<{w_s1}8tP029PbPy0=O~qpK>FHd# zpv%;$LanOlO-Q}biCR_6B6_uOKi@4Q`FvRCC&GR8w}kc5mmL?#7@_PeET$rNK{ z`oz){AtU^@Ip(jYNk(e-Dd5|PGeSje0h@l;!mW|dhxL{-Joum101MPoK-r}lro_Eg zT0zfPNL*?Cm41|-b!(8JvJLGp8nX}Dt}!%tmCwDUwe%U(X7%~|7txmYFK~?|e?_nu zFUbFkb`vWs*mKuy#$MVF)>}pw;Hf^i=GLT0Xr6y*#cb@L2r)KTlZ>+n3V!ld_{ zN7%3OQ)@k0LZjhsuCr;iPvLl8x|;DfVbqcrRw@M>uDczzJiXtb94zoMThW)HxIp$s zyMDL9LYi$$API5xfp^VTyCZ%t=NG|c#ya4O*e<;IpQth+l;ZAlP}=zaOHJ7;ZFKvd zI~{l;=@v7puu?L2OAdUSQdMkzSm@V5qqDM6_;Qd7zDdFItB7%LBkCmZCPjyOt`GOCcTa#?R^ZLk?*vIwGrAvIvdc!y1}6 zE^~8;wBYWOudbT`hzJ=146pYkY4F2WeMOpdEIKvxXVTr7QIr&S~n30-=~D zUbh6;nC7Ydl)zuL0nU)EV@y69^ws>g`=sN1d_%%fbP>-B7Iyfo@C2yc=S`Ugne&Q+ zZTz~{zfrDcz0b^z0mz#RoQL8bYwUwrQk0y>Tbst;e0VBORs@Bc&pCvR4?PE=ay|R` z{95|V59eA)MB#K@<~7Mdt&V<4WXp*fWU)~w3dR4y+FL-y)pXHgWmAN|OK)0E(jiEl?fcJ(2|y-OFq6 zX7RlAql$htaytG39<;{+Es}yhb9Cr$Z7m0%3J?#Z-mc|q-mOoxyS3f&uOB8a(FNQC z=c$0ud*i8iio(ew(_prLf^`sfOFuHvsWAUnK8s*ye#5NLG>4hRy)Co(TfNeO_n9;W zLYeV1fwPCv6$R8<1gcwfx&#wj>i_ilOEw7J`-yG3b}=^}K#u3}8t`-JTZgRAypRB; zL-{I7FL%0=JOJ?JI)npeNM~X4Z*;Pe(~O(&{eQ2)iuZn9h!ky+4c5)u?t$77Oyp;0 zOlugyz&~5{Je;Fcy>J7iZQ!rxGDIxCdbm)c6i$sq_CJ-v%Pg>*nM=j3}9@U zSjuIVXl%}v+o%#SH?XN`seQ}hXSE!<5%Hh{d{MRicRuM@%cwlL;=bmM{u|kTXKB~o z5w`^iZ0i6DIVmi_*eE?E}{DExd5|YJN{v8rl z?c%!6d>Y+*1|EMZha`S>V+g%tfvdbtWB9$zRT5F*W3G`>#k=N${aAE(&)^-mjPwH; zb8q7UT-tMo@L^brNl*H#@mw>-t*_KQ-UWjQ!;X836HMimp&bz9UsEV5Gp`7h_w0}@ z!Xv9Mw)QlZ_Z+SN$rrj|&L@(Yw&TQ$&0T{m78uCwi@HyseX>QY-@zgBOovK>N{(kQ z1PQBK=>)BN^G>^XUf-OzAJXa0LY%b3Cpf~MEzLHAc=!yeu~R|!UX6Dv3l#7AL}#~1 zdgCUANznwUz_CxfFudx*9-{g|bLLbHJl^R~l7bBlxaT_xy*WsJml;@+{SwXPiCJnu z8Ex@qXo-3okQ0b#U}BIB5-(5m8HTxBq}>Uuvr0d05n7Sd%|$IpkN&nU4--Ar5{ThG zLtb(e3SY+%Y&Mm6@m(jM2 zR8F`(NuvWsMgWp?F_T6UY}e_AytY`%F-J8rk|S0povyc9v4=>s19R$WhjKKK;r{g@ z>$#}o2^wwfk)zJ$;RYap7$mHe?V@_fG?-@G)7B#eadS&EpM+ zX=Tqy9tFB_LTw~ach3XSR1h~nyMm@M|C?;vxzZKv9LIHvty5HH&8N`})c5Wbmo7Q229bUa)X!+7*_U&omkvrm@4#<~^^I zlhlAi9EP%u16J<|RF)nhq3I#>KBP0GnEshDrVo{LN2c>c$ zRj*d|kYu~s1OdQR9-+l0nCC4UEuDJczjOF`Yf57F^laJ9-;m(Jb+GN=IE`)gyl}Qb zQDx)n+n-i|VK5a3Q%0@=cvMzUWNdrovaY4s*!eDw zU4_~PB&(t{lUIlZlsw<4V_gx+=+W@EgvuP_$0y0DWJc%So`*E5UYt8jG=Ez>A9Q<_ zZnWQ=#%>qv%dZ(S_H_Zq_~bpcEe8`=@iJe+KcUP7`?H?uSh8S-wdb=sIAVql&>YzG{3IIyY{(+@H|lyC1TH97Z54vC+Xm3N|I3>{_l5B5P1(Tx|g6TBMDB%3a~D6Qe9 ztUUd0GlVNM^ag{`0p)g0bBFt4Vk2CQAsu<02TPgNPPUV#Gjnh8lp@unk%;`K9Tb=4ET=?W;RtxfovDJqrC0^LlZ?G50^gKD!c zH|Z43sI%|BR}XjdXAjC`M#nLxKLRLZgCp=20tC(3-j?2H%I@Go2O6JYXM2HnPp89g z8e}G{W-Z}XHaayUrPg7$7$9teuo+CLwuD@OwrA>vYOA3sW8^3#Yh$eX`ComLrk`-j zZo_wVt^}fAhDubh;Gw7nNDLca3M2JG+(V*cOQegM`$N-R*uEVsnvB z^bN+qD@qaNVpwkkq;8PpQ=@Uvp@Rmj=iQ~mGu`ruS#~@Q#HmegZigcWYYJ{%1n`VR z)7N0woR}YLkxUTpA}4^-1=oyRGE$>`C_TC|;yQ53S>iW!VyAo2)9GnAHJTt-?1k~* zv(eorJ`My-0pfKtLg#~9*%^m8M#cDMC$o7?hl8VjHVB!_FeJbsWpMcpEUV}7(GI)E zap_Q$a#>jyg-C>X@bvR46*@c$`%FxhrKC*)npDYtrFS3O!*-pNL+JyQBB?Ku`GLd@ zASK?2Dl4f4!oY0`#ZC+rK9o0v1eOm+zNiT&kz%9+Y6*#x5?_q{^>z5f`57l{Y zuH9;izuG*Wmq{@n2YTjG{RQ&$*TQ4VY!`8~0R)62rR)>sER1I(iu)OF-6YL8FkOiD za_?IlRChM``5I;PQ%cerZGwql$}tq83jzD@DY=g>6m>;3cwbM-XI*V)sZL8kx#ATm zpkLxErR@|p2qd+!2=h(PJ<2WbeGHP?Fmt%D6|xVyx-~XvW=KTx_r%3ET$~lXQOvaO zzE>tavkYB-Yo~5FvAvT0Za%=i8btu0ZoJqJmCQ`!{{iL|Cl3!L=3YnR^*CZ&(?BYO z8@wcjIOwUv*09?}!Fp8a#jkQxRQR4Qm|7}@PxfKeYIb2+?iYe>x;!2TAG(L3!Xs^A zZgrGev*mjUQqQ{A^H4A{wEkG<4Bqe=FwIY6tFuF_tjKeg8RV{-xwkfU@dQ{FXz@LsbQIuPa^|O+ zW31vi@K2L*Aiuoi7V<|h*PsB;M!A7MBDJ=y>1LK% zqMODA^3*m5w0I7l475EkWFq3MiYvg%dB(@_;w%}xImt_%G$+hk`dTnt_|u9%lAR`d zY+@3pG0ul2^XZ9fk+n7SUQWj|PycUb5SmtPq!p;d9zdNDo|oF|aj|pQ}2_v0@iG5AYN*=goPfYja!8 z=VM!`R6cas%O9rcn{+?Dx1Z-<2|hdSbi!ERwWksA4>)bw0K5#eS1HBTVzV>Z(Evx% zM%lVENLp7r93x1GP`^!xkTf+R^fY1HKxIuu$M=>|N7)e{J#1B^?eWc3>kX^DkpSwm z85SxjKkUjor;mEIQz*G5*brPGlj2wxa4bL83sJVIw3;ZvenBi;9EzJELQd~!6m0R9 zFTrEh4pMnbsA17-f4~mu%UXRC?scGa-FQ|zgtt;Ngd<-NRH>lUD9G>+GT+*b^J8(T zVWav~9D*ok%4WLi1gbA%9H>p4Ht{Kl@Y#Omotn?EJ+>cN>K2d~&x~C`ohVPpo2fYu zk7qhq+*?YEtwv_2n*nX7)C<(h2?Khz5=0q-xLE39dJA$jz}c~uHqOWy;2=dD2Glxp ze$(Z^B^@RQntR?xmF2WWk+=5<%_E?(^`2c(UJ`3K9hm^a0zK*l&Nw-Vb#szj*9G0i zl$68^*A`V+s+<6`A01y8Lr>)>AEa>2@`dr?@H5yLj(QHHh4uN-U z@*;SpXESQK=0FiI53O-#guq#2_NUmo*7by=?agSfZEa5H<+;-;?nY~gNxBb9M1@IO z25F;i_3P^mf%+t$HWmN)*?!M}Cf@Natv!Xm9A)yszsY@#%R;IUNXrA3$3Tu+v|&x- zVRX`r=kCp`uDwbJRl^orT=_FEvmZG^GqD+CIt@*xG$8Hx`KGL#@EqMW{PxrO}1T2bG0-mw+*pX-8Ab?aTXmWRIW?0 z{y*?>g1!r1ODi*z=-q)eerf84BVbV*%vW3BiTDV@qLD;qW)jUv?EFOp8^2Os#mW*v zVwke@Yd;`+UNVOPQVgKno_P9x`+eX&z0dl7+Ha?BfO)_1k9y$HZ+HO=U?+f`>g zFrHL@oKsS?U4y-BO61S2AO`O;zl#wA(#CUV@nWh(P#XIm%E&hdm{<+)>W(x7* ze4_tXZ@!~^+Ngo%T|jq*2vYH-{1<7>Q=NV`VR<^6rn{NbPAU{kI-ygB2(=LXWhK8< zDt9YtCgxjFK8cM@`#4&3_w))Wpq%$mSTl;W?M?vWM&JbeTr*Uoj-AKzk08)XLq1z7 zW=T{x^bp66k;6uT}?%j(oAP z2reHn9}UIbG_dQDdE+Dye!d+tq3QK#pDDcLM=I1dR&#{fs2+nw=!SRMzMLxW zKT@q@O+knndC&iqGfJ!u%3-2d))p74j=227d0Te=`^y_GAE`~AV2bU!K1N8eqvJzj zN&P2gqyMq#h49zYpRT*NF7^nnX+hJ;@QzhgzbHt)W0(WIV&<-p{>YOZ6*i_(*cD7J zV7P;K8$6rWPG_s{n|L(0^!?4jmx_G_3oIM&4*OIA;Y-G&4-Y&fRsiE84|$zNtd!SO z`9qaQ_s&!qzgLr2YFz6ZV$Jir&lk5qS=Uwm&CK){7L9BDxBo? z=hz#kf+euGMCl2jqYxlgGIQd}i>>(i^g_c$tHb?|{?j1e zcU^e*;l|Az+{YAxQUY|NG7Kf*WP6rw#@WT^R&AYHcR;A~-58Ou zOq((J4t8y`c|OQw@a{Lay9hO-9aFk>*D6h z{enh`XEjMbd3~&{nk1_UfS*o@A>OHczF;iQ>+|>%4ofoBu3J^lVLv+AJZNtA7{!ZN zpKG0KkNGO|6U6@F{bPUKJ1J!4K~mc^{LdbbvmKZJWVMbLd`)$$Miju6$Nb&%TaM+{ zZIv9c65>O8kVl&QA#kON*s+t~oYwm|g=5SblOH;w-IFSkkX;+!pLxxUnl2~0HnsMP zrF7=PGxgo&UczeDTH=!6?SL-G&-=C;q`HgBZP23nIA`)#ewQDBzU$P#aeQ<;j3}wt z=`UB-Q;tv&aUYwls}90|-~7HW&eVE(5p&v9x7<@KVAmeo;r=DcvDh1L#K8hALZ+DJ(6;ZQB{6BWXaJ`4WT@4V1Vi>{{j_&@G z3rgj_-{tJA=W~C$&pi_*z(K}s^`4LA&s4i7Hps1EC=_1dK4m|XPdW5Sp;LBpea(m0 zR3O^8;PfGm>^MCm#`HYgk8<3v>7yBP_m}wI0?*l)f!t-t6r3q%CZ7>$=X1+aQL>Jb zm|Vkh`}vxbWg|4BcFlNZv?pGq@wNL0pM#}Pd*1MTdrkR-jfy_T&H@o6!OJ8R+LR5c zVS+=?#l20V#;Q1oGVk3V>iDtRB_xbA43r(M_%{!$sa)+_?hxhj>A@(F?oP2$j@0>R zr16}^u+l+4(lhIkKvvM5o#VAfX0(aPXCGB%$Nn@R>rClXorU`7+g5xeJMfKz(;j~60kU#8;?VRAbuF=nQZVfb8Q zW6gI_RGw(O26!%xw7E<6VeDe3avm`{cDbDO7VYRgQ-h9>6=oH zE>YbpuJqVP%+r4x(nNhI_2#|Zb!imrJ}#<*CL;${ax$W2Z>D`t=&dm>sh~DZ4KvZR zYj&3BNwMgTneQ7qhK}ct8?4<^UWfMpQ!+>CkazunPz>_+2n6wty}j4 zo#HBRsxSFm%RqG`e|I@8bcze1eg`oRlgrq+szWZO@BMDuYIs=0Nyhld7hX?9(oEO7 zeizc$A4ICEe#WLG1U3iga7t0~dKF_oKU`-ycnbu5A2r`hd_o3fJVTTo503%oN#g$t zn~2C=k6q%A1l=97c_NR`zJp_a6v}HUQG|(KR+V0txC!~jKSwL?&W9@F0!0UVqeS3^>KRnfIk&}h?iD4uEo<;lJ zTDW}%OW&ah>uGlw*LD$Z-5lqyqbo;7H)|fRn2?h%-&+9OqWQOnZ_M+dQ|PHyyqIiA zTt88lCZ$whPRM9Z3q%m{P&|;e4)G88AOfcX-Br8w z23-Rv_a_R}k7cYq+M*UPj*pC538@mZikyIn-gk{NQS7pjkYqEl)1XSX{mL;z^V_js z6zhV0S)sa8Pe^SdwfGA|`khySEbAJkA{`5%`cev;y2Gh#otH(BK-^!nSfl>HZYOfY z+C%`KL8C7QRY_ZT$okWC>vA)OQdv2>)&7E1`}t}68HItTdH^kg(UEKndK%9(eD$RO z2V_saLd6HC!DiF>#qWyTWpc1mrb3j!joysQa{=*E>Y5ezM#9^}$Tdxx?~%mhlDT1p zLvC;`;6^t{1|4pSqTEvuFKgXhlyS&zHVYg1858&f+^_|GkC+OrR& zE1g3t+7Z6K`{0vn{X3_Jtrngp2+8#y^@6)p-J~VmA-$jl%z{27hn$OJ+M_{t1W{vT zKoFXtQj(|Q3*oZfV*NH%_>&Jkmehkl)qj|5%n_|*`84wCJhw8YD?l$ZcmYw~s(I#h zj-|`2iMk`2g?RZXYOH{rFV(fMEYc5092CvGKPf9(xP3UfNhSl`#=C`>zw#X$)=6vm z;3s;+HL6PP>_0)Q?F)^YBTpdv%F5qmL8Jb)nUv{H#${rd{eGCis+tGGm&nsHBrsd_ zO<0slUu4r${Sf8KQUS}^-d8sO{o~yQ<%td&@FuN6@7X#-+pckCZz6hvjh%J3q>5D9 z6e98S9ohO$t=Ud%D{w5u;M3)E4Ef8~qK;NCqvm)JOY^X&;#YFDBII}Vx-OB`p1a4N z0J(a}1)p8Vg3YKebcG=}r`a3fk=^sk95>BltO;}x@20u|FMc=kRK;xn_oT^>esmD2 zeQeYAiEBzQ15eJ6A0u2Dm5z^)u~Ahp5~pW0M1O-TIJeOY(QJ~XKQv!WE|^mrDec2? zc=!URjM>?WN;w}jTdmsN8$e<1?N*mx1_%zi!F1RFqhzNg3y+xtBy=dR)Eh%v`m0Qh zS)ZkGj*lY3Qh~OPrDiKn_jrZhnU_tY=0ocu8e8qeztOs*=IylliuRXBst@yRwh)?n zXAIQyGb-{Zr#_$K**+}WwO+4RgIzrsvKCzgTjfy%&{8ia&h1DJ7DG+k?T?y?;YT0s zmH2ZQw%Bb2Ynz(dX%^(|h8nLfZ$Is(P}Lu3YIqQOg5TNN?O+4GDLqVPR#<~Jt}-g` z`|h&V$}ZB9y~EjsegE7s+7_uSpB>=Dc8W2_{B#YE%n(S&FJ36dwOSkNex7kU*|rZF z)R1#J!f_69O7_Y8;1t@2v5*^Y19u-S+B(I`ONhZcn@@W+C?QIErn zT{O5;`^83EMSUfTiv+KX4AsaZ=d;P6@l1+QJnU|Y&gPZLtNgwih$ZCd zrKwv5HWOZOnAiu^bfG2&fm>+?0v~mB56hz$+oTw-dwbHjQ3g8Ykzj1APy@O>$%;S}9u+BULwMY82H-2!j&6P@k>%fy+U^TJ(*Tl@H_4O-*CLjiEuR?3GtLX~8P zu|a8NSoVh(3YE8#Qro$YZI9<%g679F!Q->9PL!=#ZAf_wr1nqJj`a7A22Kn76SNN9 zx0$niU2au}uLQ|x_8$4yy+@+obhKL8G~b7s*JeSS!wW1GgwGJFraiyR>YgTqwA1-L zFAv7W#f8`P5N~jBaM+Ft)1jO`e4O~fN2E83(7ao~7YPX|4hTHbJIZW*3tnD}x+Ph& zo()iM4Q1o7&0UI4b#eyIL=nV9Ro6|V>F?a!Hpy1Dv=l%g$zH80FJQd*Qi(ngs^?Zf zZ=_Es|EL*6)Gr{rrUpkrL4nu(j0&>3fsqg0E`+-wjJ;1O8OfRhei#`V68rRNn_+Hj zt=|)q+*Wchq1=^2bpt~LkyOguNB8s?-u+s1y}#|nnZ1MPu_PhAnx1H4JY7(v2SiHw2*8DaoiB(f)T=wBaDr( zov_@d<+PQ0WjCw5mpUUsJAx;iit4VRn!@;_+8i$DGS0_o0q{$&^4fBy;XEXMrR^!@wF_`CnQppZ#J zkpWBdc`^uA--=fz_frA?7l)aXmkWM}WwcWH*+jPe=N?6m9Si48kt{hclan z)jc0tF22B_$ARFaw`|otR17TR$h$xMFC#z;6x|N4+p_6C(i0T1ll0Qn(%s}IdlW2ACdCjW+x`|HIN)`qM3g?uNY6VfJ&)P@2!fwu0`%HJ=(kP=Xe9B5u#AHFs;aZ9 zG#16MC7_`>?=?CKLI?Q@2(wU+#C$RgB`WvrjT%x=f{;BNM+G4$`}IX_#$e zGxhv*U~%HD5-{}Ue&KH}2FrQwrCk5v6M%R}m`X7W01n$EUlQVUc0@C}9r(5k=+B`6 zffD8H@?Q974ZMFWG)GVxH}@`y7Ewo4vm>&skX0ZLOJR>=%r9B)LF=H>hvQlIc}nI? z<)x(akfxo^IQqm=IMC0va^}wHlxx?jWZs|7_%Fui5-2EXVQ51l9D~)f((I5brU?>& z{=!FPfv*y1*Gkm+;4ZdgF??HZq4)7j1)nA}`A2*ODM{e1W3yuo;S9Z!yPtbuj}14m z^U#Gbb->x5sISs+=vUcA>vI8UEAp)ciAtP|;L}3*8mje*b3v2$F@w!W*KLII5Q|bv za$W1H!W5Wm70^v{E1&T!5B^Yaxx6>~b&L`$$KR;Q>>Upac{sO>{)jotwvh#S+fs^9 zYhq4MF>AjIFbOaZZ}|!c7Xs5dX_>+^*x~v+QB5*G)u$1L+b;-SFQRwPCxK2zzSh7O z0E=MEd-o`oUFKoUP39JgDoo{YT!b0kI!p33XM-Qi87;Z#13KZ*}qDq6!a@Qj7Y9!K`6LJr>#_ug4x?{@BsDB>F z3#5S5QHzzr4y1)Oe3`5DNcuXZN&t+5X#$_q11y`9ExME7dQt!hR>0}noW(ZV8JlxX+Xbwt>;FcpIwu2*y zFYe}Cv22UC!hd3{Z&%?trL-3$yvC$zh&@!cml~c23~0iL6{v~O2lI~ zwg=qEvL6I~C3*g`Xc_C0p9V(q#2rdDTzC+?7*hYrcc3r)UR+{Yr(8+P0&12{<3$kMdR7NN9?g3iYwQ^;}rCQN0i z+96;y^29v>Dgn&WfobxjTN?Q=JVa&Xcd$N8g`h&7yIYr?G2qzEC?L9g>o&IZW_aoJ zbceYsVr=KU)vf8!V`>_d3Xl@ldS|zmHc<-K>1(SX}=`|2Fs+f1J8Fq+U2`?Ce6~&jWb^ZFB&)f`#?Cmx!$J9(AAI1i>s#j z{%E*m8Hx5Nu7@>PTE(oVf41t8mV9E&YwMTh1JKLcMaPgjcnGxU9Qu-7eq-q-{vCKX937(3T{t}e@~ zSyKP-z_7g>nH3s-6WN48@A_VaiU1*13kiJm5M> zFg&XI=xBFuRoy~r8op_NpWci3j(q7&I>@>i9Mij#)TnFwSWTLLC~Vth57TpT`#{&x zsITTmXfeyb^U>ai<)q$qZtIN%0%8sjRd}6oLb|9-6NIidLR;PcbBBu%D%1<^e)E-Y z?&ldo-YA$eFK^IMD^U#H)3jz)&Q^Y`wnn;-HddRj^2~eHzV7@&nrZbD>=l-|m)erP z)Yf5ne#&0RRzq*UQ@3)}b~mneRas-1?drF(-j-9Jnuf?hQN>26vj(G_yAH#beUE+D zhW#y%;_?OapSA4u+byk&S(rqbV}hbq7si$HQy2b-cWh+@zHRe$Od!nF= z%|5k09Z$E!+^pTZ+*V#jExd+$DHEOj0)I~4Nx8wjoP67aH2$R|60H%x9R1=co1tG$ zJ~{>gUXD<*(I==c$M*vm%dcKeX!$z-e_kZ)%GDZm*Oe1ef2x2@30!!z+rxx4I5e64hrL7pq_bw_y>Xlj_-n{HZU$^jNB}39C z!cE@lvg!&=-8(9Y2i6;MVuVx@5z?M~BSlxWuXa4*u64dCJa3PU4KSHK9Cw$^lHCqV zA1=;S8y;`{1)Z}X%^sj=hHl6HQJZX{;89fxI1+woDlDYM2F2T(5@L@NdxM}yG84q! zhRf5dOLLQ~?f^&IC~s$>7VWHNx&y5qZB0j42);8FV2dRe z>zk&LPx|S?iW9a_Q0NknKB4o}EU5>)BD_jZIX?@nQ*2$@m7PE;D7h@|*V6F0?A#v+ zEkpQx59jNiy>G|IkEK;I)?l-BC`)n_-i$KZrkC`1-A6giRbZ9kU{43$XIK;VhH6LHM(oAFn47Z&Bk`_Jo>#F;FA0Kn$*A93vVpTBX{7nA3ivj1b&Z7$F zS#Vi|o_FZ{8>z--P2mA9+AU?-mgNvozeQgga9_RH!n)4C|Gk=g7zB9-WSr5 z->^N-eg|i?5aS5HRfh`yL8E6=bW*#kP^qz|tJL6oolSb9$n05lr4#()r=CbNsk3_O zkHLt>1#bE?j}Zaimi$qsDo=Ez5YXh&`2Nti#b_hS$SCW{b74gt;NAV5R~#!ZjQ}%a zbo|y0qYbIYa(4D5bED>3RcRxWmK&LNBk3sB?RkYSI_i9@61GZl-AEPo0fHjO2CJMGrOOr zF+ciKl<3bi8_yyLJ0|`0a2bA|Gkx09KEHqc^GrhFG3QDF)kbR`=d0p?ZSltaG4D!% z?K7=b^w_v-6ZkU+!TY|qIy1ro6Gr_z9i+O)jqBox9u%kn@p(Kr%A9{>K3yDm8)3SY`Ll8ca_;`QzY(-|RB zseF@z!8=oI3r|q-Ar^WW2b!Mkqr0;3luP&uDHIf$z{|BJdK#=zi7Sar0$Rr+yXTd! zgm9MsE>OZ57>nV}Uh7Ix%zC-H#{zp?*NO8?y0Jhwb5wENr#mP2hC->iF$twKG_gk1%f{5DP!PYbm&Y0J zf0mu7u}!(Dh`uDcu)K4Gy1U0+mvfRMFi9TTEvYTQw3;*E#k3|Te8!TeB7-rQCUfmTHaLu-`d0gq%C?BXi|o=3-`JWxa6BhJtz>_`f64{rimC8_Q8zN)Hyh-hy5_}#D24pBWPA~Zy$HBUc8b3>wG(LaOT zvkkqVaOlnZ$i#?wF509KQ}|7@foO2zFk{BOnw@IXTlZ2)W48u$KQ-H)ByJd4c(NL%)*2*V zBTAIJin`}}SUCFR;xXL>dfY+&n!RJVQ2EFAQuK#Db2NRPa8F0vhjCP}1%V>PyINuB zV})i058}!hRn-+PCX`64Ivw(EC^g|)&YI1HBk8xG{I}=k7R-!P&%cB&Ip2AF6Hs_B z2J_>rya*99@c!OAp-)|Sc&U&iO~CY&CTK>g@Tq~Rpk5cqvR~sGu{Vdr6nRk3I*9uu z*UsW>t6jqR+w{fO`R`be5`X>wFczSRAkQo%{EP7hD;%BxIsC82LKkE#biL}cD>Q-p z5#Ika7VQ6w1zS^RGEQbzX6}bb;}s~V=jfM_;HGy7gmJ@`T4`Uo_SF9NOO(zgTU5>h zi7UM64Fm3Cpyb!4KV{)v1JzqVN<`BRv+ME7;nKSxgV1W}>+6Rs!MdLu2Mv!)!-u23 z)9E#bP6t8IsJyFwe|~M`Z7>*L_+B-+R2lqR^!&lYpACuv{Qnkr_5a}a%ubpn0f*^7O#(w{ zadSD#Sa!C}DpW7sx0X8TfjLo?$k4wuTeY9laV)ws)bCiROs)H6i;GXwOxpGeJDE7)sBhQPUf$b9U2fMfF{au*A?+b=yB5JcCMD27$?46&Bys7=8yXV zjsQ3DsZsdNE@mn={@xcmQfGc4Dk`X&-wa7{P8c~_#m^zl;qP!RZHi2)Ez@}(#CAa{Cx}%eZO;ZpByTd8m!2TmX zb(B06I;}yIrZZ;sCuCQGu_Ab**jfC_goOGuYBWRqrt17P3wBQ&WcJqH(~wl5Dq^{B z9J?lqo15L;$Ox&F0P@rU{Aj5v9*}%$yFtFaI6Xq>mNoMpMxV*}S3Z#Ja)&>xURVp( zuUDDMV#t&HfawIs(bKK@Ni%RNcm@DIZQ)>OLb%a(WXK-f`IT7W^s}E~@rmAFamK;^ z2!3y5M+EGafytYtNe}Om$AIS`Gc^kFZrmxuJAU=gn1myXlfHuuk?ieFOVbj0YR;}L zix$|R6O<|zL=3g;f-#Nc=3ARD3i}fL6xPL!DUzR(muSQXt(DBV>tI2X7wpMXG z?2-h)7;eUeDm?{_QimrlX{Pt8F^{=JbET!Rt!}RC2BdpMmd`UQ`{~owlLdL788VDW zT(SFhYjj-Yc#D(h_U}_+$to4hYZ6+?B(&d}N%?ThmTn$<(h*1lUuZrdE8`OtecuQv z_KxH<$u%*xEAgxusW}%)EWYwG$C^m};Fz;y_S@RoUK9{U1o zpoR|QI{Fpk%tS6Tka3oa&Rwja9#zn=LU>LRV>4ljn*-?-(Biv#GN=80+<)p&U0z*$ zVR7Db_mJ2jVwhZBDRS`Ev#R*G;Sm`18&r|G~t} zl}IL!5(+YiICHm5a&Z#Xel}895sd(Iit~$Rx21Kz_`VA^bmPcMKw>5ykBsJ=cXCi>aTY~GQ_*<1Upg}GlmTDf1MEFM!*Z!QXWn>-H7NBOe^ zM&%u?&EY;NIv&0@Uq@$MAIyGgzvV8)J)S(SMHTPd*s%QV{4pU()EhE&dUMlw!afUQ zd=)SAnz#){0_K^%ae6XRIcOD^PuvwGN;K+{b6TO04ZP=6rW9V6^h%d|z%O4Mt zM_?XXk{30)D=Du`4$G^47Ra_p9el0gA_m9SZ}KsNLnn&K2u_+2w`^o;hw0?o!_o|$E7B5LBE^>BqvAzi!2&QYe7`M$xfQN`ahNj=Rz}6R z41EMwU~QW(btAEKQf;*Pa(7ocE19}%6~XlKlmCYg!IX^q28LC^mCfmTvT$*dnUZ)b z?8Pwr{HovFFNTTLjX8{=E!2P9q>G~YH;t2DI>Y{KYgf=_X)b3{-}DcVI)=Lco}N^E z>b&>kbzC4Lt_yvi?gD)_suYZh%P^UFYOt7qjFm^ql`_GiqMov}mB$*j_p-^YkvC9vRiw}OSUED}%Ym0f#Vmz@Jk!9hCkr=T@ zcRhX?jub6F0RJ(`k=D3QuhKpD7VR~$)8(dKo;YJ*2Oe!$b=Aoj<4{Ed!{HKgF8#PE{bywrgzZ^71Epss=Rg0`vVFQ1AVRmHF68s7Sg znwnnzNG+4!;()bCc(a^KKPuW&LfmJBLJfaBK9DDt*7#HRh{CBC;eGL&PLB?wUX|fU z9ZbTx$MKIIQn^TMhdu8n1wivIe$U%2p4YY@f#%y-MGVkHKYX=C{-FM8sVQn&@_o>@ z$e>$uQWQWET562_;u?1HRS~;ObV|OVXD@S1 zN6y{%7>1I@`>HnOEan=AK#7vqlkJMgZ|eZr`}YgfA4_ce2RRLml;-9KW8;nCVfpt4 zt8qDfpd)ob8Jq-u;7);;^EsU{nfj*JhzOuKZ`dWIpza=V8OQS*)`ZX}j1A*Fx1l2I zkfovUk=I28GF%QwOz`7Ern>TZoZ|QgaLH?I?w00ngfc)3>i2KNJTxc6u;B<}CO;D; zOguGwLT3!2^$3`LRN`{P(&d4*#vHz!v1TBwnHw`xb zeI$i3tLX7}>5u1!qHYQF9z{AqK<>a)BXf%djS9dt+@3L>g8pS7Dh8_NF%aS~Y${e|& zDiY=FB0f5-^}qxK-f__)qXZ@Pb(h`UzqDe^9ACX3}|5&!e3(~r}OQTDk1Oxo;Q{LSo`A6E`AI zE~4K7qZ&@VHPmI1(XV;0(dW}0Grw=@=VZ}ySYA%|N8KN&t*Yi#GzZD;3_z|>MU53s zSc&d^**V43X5k?q8{_U{vN+)N>x236o*3J^^T>)}oL6=iPI>#a>35eS8PCnM=IU@Y z%#H%Z9H%WG8Us9^P3&SmQJeo5i>J5urMU0Lgi3t^ILb zl(~P{1}QRdFSfzSleSRAFLae&rtmiJjE$t@|CIBNSF6OUj&8Tg_>e7x7TMW!N(Mg9 zEABt^^V7dSG)nXST_xbc;jj@#@yqt{Hnh-+CFG_$dLP+3Drq+l`0H2)!MY&8#ywt5 zi1!BW9?xcpew(PcAYXNsZ{qEb>YXwGoZ+~{=CuM(b;LYdb=isbLfwa^F&0d9P}9d^ z`tM~xVR*CS`5*cNsRyb(-)io4=if~Gyq{)s`3mp4&Q>(Yv(o4?l;unE$zhZrYf0ws zj8&JmHIyliP zoJqzYur{{D*Wh@lFoXNogMo3^$VF65Nna5@=iww?j&{IUr$VrlVCoy9-x-$D+GD3MuJlA^FJOMboAS( z@LoMDs{w+I7qv-;2G7y zSQTm=%@a^XRds+(#b!nvoTQf*5Os{x`)+RBAVi-R7toLM z=4RB|pF?{#ndE(Cu^R{$?32qk&@qCoy%@VDUISCn&B00OY9IFv_rQT}J{>f&Q}#+u zjvk*?XIRZ0O}*6J;P4Y)>o_e@64rEu^>GUC+{t81Mo~<~^-yUsy=1QV_RI#Yl0F;C%*yn# z$gOozx;0%Pm`2qQ?2)-6ivv_F|M5dXM&|z_>nnrWjJj@Hw0K+GDGtTmX`#47f)sam zcPmibwYVp^6nA%bcX#*P^!?uZ&7HZK$*)W@dCu&8&N^$Yz4v==u09neJZOOFd@5%h zjmykjo1TUhiinO@0{}R zUMX`5O_ADA73b12Tj5Ww@FOcX5wsS_(~nBc;yKyAC0|j3hUSG{UyV>4U}XepcDzTZ0KqHKpj=fiu2gq;|=?SL+)F6^ibgx3G8J(REpM6~5T$r!QP0 zFnyi8L?G#;?Pn#{nAVtY-MUf74~r-ew;_5Hmnt%nWbkGic}=qjT~KIlfXVMZ8@uVC z0*fdbNnp!jQZ$qL?zjw{`QSiFoY4ER!~HB`H4Lfy_Qz4&aER?>e>;iV<+m^K+R<+h zf>6t7mh>B$V;baz7H*}&fZD>+_b815`J+Oe$d9IE>x~3bxF}I3NhE*seyJt z&@-F7udk1@w#72tQVsQ|t$sseYHES#_6~;&Rxr=<(qfV7 z{j9MB-{L}#szGNtM*%NQo?;sp*P1z+8(XcVH+;_S>qfWT_um)`go^puAvHK3WMi|K zE$|$&C!aPhMxyYQEz?9Db}-O%h`Xr75p{oH(TB^V!iN%^Z-Z#i^Bv5_i(MrQ-PlWLF12wvthf--3h%P zpzOhJGOjl~`Nctbi2W~BNu>}rkTBlN(L5wZ(2&xOY(Tc)Hj{$1HD+o zaK%si(fn*yhKZd%_ftPB8#!QUP>0QI#yN+HSl~8%W#~&5_}ZqH%nMZ&`4*fJI$|jv~jSp_6w~{k%_oU^)|&a{Omv| zm|yP$s|~=f4ynsjQjinp6!)YhTB6yDO(kz~-X`t(PFE}rkzfWJef5vTJ=xkT!;-{y z6*V=NQ5bZpi3CIplfw@j;P z)Nn$X$>!8Zj04WGOXn*O-d5=h%(X3*R_1SA;v;9Q;q9xj4CXo|QuAseBWsK>u(1gL3Mas#tFC#Jby7!`aQ=Uy}U|IRf%iG-Jg$`QDRB|YYO&?;mnj;-L zi>?Ow&rwseT5sqK?aUo!W0pn8$;!&f2^wC9*pFOJv7E2?A1?JA#MRApJ!IFWnUg2V z+e#ucX1pH*lAIfzrp*S@U>G$wBkm%KvR~mH!#qr$qXC3W~+MtS*l-^60v{h z{u8Z}g=nd!ld-FeoV_7p=3J&3_Pk_{G7Vz2!xf)I+Em7=fyLm7VP}fSJ~|O=-bu_dY6DGI1CwOilA`0?*J$o5%%6>n>G(q)bbb~kBDezF9kk{K1J=9rK~{5 zAHXgR%4?GvXZh04!zEYUQtkU`=Hu@l;QM;r1se2El1ZG71FCdYwLO?L!MWrWXDt;t zN-3Qh0Qth5MbUMi>u!t_OH z$k>Kn#<%dph5nmS9?XN7VT~E^e9*7`6z^-$SeJqBWK+}AA;G~Nh#UmkKwxi1Cp8t7 zaSniL@#JYI-+ZhkAuegeDq-z)dj0k0`bfdIbvr@?Yn%&G0H6N2n_S`hfZrtfwnAfY z;I<#!1T?bWTM@&?wl{tjyrn%rmXg4sN6xAZgA!KCGp)3ke5=t~fb02z(4K!N*5MF6 zZi&JG6JyLIVQg@B|72N09L#oVbgr3jYxLEc$0TO;S|@A7-VSAOa1ft_1i`ch1Oio8 z$MFY_u1_iv=dySA(t%7{zVfatFV2pxuCB6|WJskm3=P|m_<3Z-TT)o7EUAyAHl5U_ zFTMX9C{_~fBI0BxU2|}Xgx=Y^jfxXL^HWuEO@L>f%FCpoxwh0IU??|Fg#j}yhjP!z z_@|4pt9gW>-Q~i|nv5YWGsNIT0Fs@TH!6G5_0_cS>Ej}N>o#1BI2he=^u&mjr2q-3 z7zZ_SF!%OLU?55r1I}MqY^4Q6FP0@%FqA-HMQ{w5IxY&8{pp=9ardE)f;FPqRcBz4 zF$8b)w$k|>=fuVY3l%23m+vN^XqpxRHI9s z@bn+?v{wbcpN}|8mFGD`(|^hc9IzzL@eAxck-SD3vc#io?OW47=Yd}9Mj|3|L$tSdb{(D2Si3iL5YHZWosRsOejgOuMeG<{s)R6q*60FY(3A?o*gL(Q@8Nv6L#pU zu74}>(2G9xEFzX)=hM?%J)QTLFB=CqA{vVqglV@>9mgc<%zWPc(uSx7K)Sql$-;3N z6T_;f>_=E>B|k{IR0NwagHiUKDdMgs@mYNc(9O*;>UUT{;Od3f?oZ#(7F%4+PMNN+ za(oj3w|94GX=&sif3K`)L0O`$ErT;ut_n5qhwW`VnD=R9wUln++_$xqg+{LWp+prq zn=FkQhm75Bb4Ci)72aADQDQ{Q1K&9@Wc|qvA9XT$Ur!-S%0ZC@tB^vZf13h@#I*iDg5jJzDqy25oajlpB63& z>CKJ!i_=p8i2Q6`s`Eoqp47gWSBR>}Gl0W3(Te)(E0MD2UeVn?A6(*=e+OC~CL2mH z_29Qe4;0bunl$8V$D^jI?cGoE_P4(l$>W^|Ne)K=V{H>GRG`JbftW;*xv|vO)A3+_ zlGuJq-d;iZadVvaZ5Nh!{of9p3jLN`` zVRMu>`;o-aFY&A+d^x`cOY;zwv8NI#jx*0kF!a*6A7w2or7DG@2L6cl>AT6k3-La` z!x0{Y^LnAl&UHJ_Gm3bFA4yu9LpD{rH%~bc-|_mQZB;`4O1s5zuP0mzo5k-V^PfP8 zhrg{go!$iI%#{}HlL33e7Zg6|31_5#cH*8JRJ=b#dJC82|DAW2dIvh9omlLx_!B^a zzdPomOGiul4gy(PT7uFDudlBw04{|%a8l_G9(>ic=bhj2CdWFJd-y`r3|0m{CYxGSOsML2mP8@u(#h=rI$i*LET|EvmKp?*IQ@n?#sYT z2~1gH)QMoX>&;E9DDI9GyNWc4G`|Y>zSTZAgo>Klo;yLV zyl>od_EQc2#2;{jah|vdRSeh@$9Pqe4EXd7yk;pbF3!fz?l13OlbW6`z{4|;(Ybdk zJ!@ns=B4FkKv0bWmb$Bxvc0{ODgn&mgp8gnHiA1=-91*JSV+h( ziJ~G2-iBlY^@g^l+7@Y4l2Wrmo{0jiqXbT+%%o|afMe07pUojZBtpb!j5%*NbG)s? zYOcde&QHEdg>Ri`TbYwWVS<)ismx~&pX8z(FH(qso;d>_l1dsjDe4Hq!P1>v{hpoy&Oc~Oa}iC8<4@@}J13QtkOtjhF)21u;Nd9vB~$uJQw|P(AHW$M zv&d87ZtFnni3{Ec?+}#Wg%s>y~Xf0;qgKAaqWqe#S&zbq9rpTI;)z`0E!wr$qC+cLtRkWbQ zGT4>Ss;bVqqkyKd&77!UaA8}lkCPZ@6QYHbd;5D=11#jk#KgZH#qSgn=s*5G5%C=Z zMZ?g1$N&Ox@e_B5WAQ&nMvMlH0YpUNT#Zz<bdip(eCOv=jzcTZa5QFbDqT;uGe&->>dv%a3d@A56AFvB0WM7i$6YLP)DWh zvn-pBMS47oSO7F+6~zvAP|?GwCj2OrF5F(Mid+cLVfP~CwxlRmdN`g>job7)T#DxH>U zWQ&Bp^qDVQ{>#<}%DVW;iv=X|T5$sX;BPq!SkKL-wGn?!6p-gDisFjpHar;P($O2xDpES>Vi{htTEu^z(R%|%8k#F=xv zU@eSGkq3tLi)gUK^EBMrMnNxTQ28k$EHYYwpl?hTbHExlPh1?w*w~n3sVhWUAIjN@ zEmT-pYi;p6#&FtuTW09{q_ zYfe;W%Rjs^vtva}?9I>5FDNLeudk1*rsgDrlJN%jCFox&Y!YB%v>+-cGFExdGCz|v zm@-NF;(Y^Wllrl=Ts9Ser=+h|nwV9+s=a!_%<$S_S>CB%;JJOPwp$8)?*eW@-ZS_& z=dcJ|*hpdfJz@wya4F#@tlT`Qh04#cx{`(JbIf3ISWWefUltX7#Y=; z)|M6)?%^|WA~FE|Qs15eRz`TG37hRE*z0@R!mMmQhdf1{RWlsGf^!ksStk?|G7?j@ zC!h203n!}t(SmqSl&!)nCRCWOd^oK-(LL(ECz1`hd$rcy2z=AMQ z+l^6d(o;JNLq$7n8w0O(U(cyl7y=A>Nj>~5KU~iNKPe86h)y%$`sJ?RF;SGHaZ^*B zaH~>V&(*~K@LR1_egwA!5#(xEa}Ja@j=6g2RT5~yYD5soGWVq>%M@f#wM2a1t$eEr z#{gu8zW+;c3sgNui{vPRq6PdOt@J=!EHpp{oYpT|*28HSw(w4IhgzT^X~}`pL;r~1 zi+7)uXQSC(+;5rUfANvW&*D1V?`Qd}^tgU0wfMY)|2yevdp?W%t+5-1H;nOCu>H6M z!l>K&)*^8%06Icxt>4@yh48p>H8=$H5=6%GUM-Ic+bq7#tUe7#7d_TF z7Fe`=yB+b56n=XMS4B5&>E7ymqX2)e@{oWuoGe}6I}Ppp|1t1W;uaSsi5~qrAK5JQ zxKlUDc5aMX8UH&B=0GxeeU$XkMm)**`1EJ{37EztI3g<^{Py9Eb6705Un$Adb!DzX z4BCSsrXWqs!#rs)T4bpSLtnTv4seGCOk6yNHp7BjZqleH!c z9Bnn=QsaCbRIu8bg|9hbRDKRnb}g3r7?RQdnr zWoMhYrD&@BeI4e<(U?9FDIYppo%oie5X=Z%ww_F=ipr)S^|t%QO18dxH)PCDG?Bk# zmrCp_C9x0&x#&f&A%H1duGhHx`B+ZaBVw#E!1ZMasRJGY1t>*nY%5B-MOM^R~ZbMgl zmZG}75&z^}m80@uo8p@@0z#$ZHbD#Czq=Cjsc>LqW}l%!$8ydAb#LurfBGGvhNPwj zWy9V%DvR}F1es+nHyj4|-tuG&CW1qV|D<%+(Xnx0F$=*G(tr{!C-D3!hTbUdtnS<;B{5P~eC=00xbf%q*4!=kil+%} zL{3<66}w>K&#Mt62lngYMh96PTqC zF7tbZzux^?K7OGoH4}Nbx!raPx7qzHyHsM#O`)}>=S=vq_s5t`tJTLzVfIfnt){!@ z{XMW21Qat|-nWN)mW9Tgyg2u7@5JE7h+|x!9i4+nwC^98X%h1lDm3fwzdJ}J-7QA? zW;T?#IL^lbebaVpa|8eSEH<21SEfWXT1r_~1Rks@vCu5u8m4TyI4Z4PFp?(S1|+uKgglYxtfasR~3 z%J9bnECUH*{zmuTT)sV{64?r9wW>*#HC1#amKk~&x?%)2@8YSj|8`GLkPqe^Y~^<4 z#!cBU+(dy={e#&m$GAp}6gUB;x$vUdpF;>c`?tcJKJ3m>x&^Zbl>1%vk^N{90&(TENIPXw{k~Ru|uUr--p*U(cB0XCeJtGgc5eMonM52E}G6 zv?54{t4kvHb?^akHISY=KYq4#Wo zvuJ2&o0o3#8kxlyJjI_@W_7_e#)IfS`{hvyC5Us7bzjJH7R2kKd)Ds@J!nS7Z5x+n zg%ELoVeZCG_os-+I7bwV;HR&3S9!*s-owY%q(mCGlP29O@9Ce7JDli2BbqnK%nA*h zPEqKJu7-wh8^kG^>$oTk{&&TkL6dsZ!XO5 z1%G8_erRibC^~K8gd^9dRxs}7CSAMemW|zOb;YB4y?l+32=U5S(d0mXWjIR+p^_~E zTWK{Nc%ULk7*1HSPhVSDO4z||Va@GM<(9ozJnmM(_?BwlU4BoVYs8gkdH0_%%117K z_c0(S>0N&~B6TVSu<^0?Bp&9U&EeYSTi#@$Ti?>!HYxPX?I`*EgS_I@PnJ64JH>XK zjqlAR>+#gxPX0}BFg~C3-ZWKKg-V5C6@h5JkES=5*+MX?#>f7O>_5-qK9%Xnlw=#J=4laI{8#>U3_p7Vo4QI=>11*Dvl)TdT~(Vz}H z8q3%BR%n_2B9syMTx%FP&iJ$%S;j@=2Vm4_S|sBT-`xu>dkNmnYv8TXmzmWmOTikx zHlU@|Kax@w1Kpx9=3ou^ybiMB%cE?lS3kx6g*=~!d{qr!qE6t1QuPyeu%M?i?#UPd zzx&qn_Lq%MAaXU$i>!Ok{QY|)iF^sS;H{`fW#=x+!Hc{1Rk`kE!Ef9`FT2?>zQw19 z!u6*O$J5u!fj0Kglgup<95q46^$EQuo+&jrt~c__15UWC?rW8h4at+AT*?qOEbWqmU_sW0GF7MT_XKgZD-6Yh7 zT99S_%zl;xzb(+^=hAsfZ-bOMRdVQPbBan_cgHcfGZf3WY|PcFt74nBTGxeM$BTTm zP|EQN*`SO2^s=1C_VlhwG>aLs?gdI?QsSjZE@<0I;;cwx)@ld1Co(n59MAD?~92^o6DVltgrdZ93%d5swk?5 z>-~3glvl58bf=ZuV+QQuSNPX_HiwH_66I?Ob}F<|52^Su~aYb2BAIi_VpEy;X` zbLtqtrPO}(mYuft$y}Yga&JDyUox3A(@HdWDNv}?;9zVgy(c%xB^`mjKJtrl^C2pA zB8N`uj+f=R$@g&rqTAF_-@oO)9}x9vF}%$LKL&w$HaFqukzTY^TN9lwbdp4xN2m~@MprxU~%f;1~k-7U<5@@3HDF$4*G6j!w>-K9Td}3v)At3Cm zbKj>`VSg#?tletTk77G*Rjk(=0aW_r$4@x#bA3H7Y`f~npXXbyFiUBkJAZJ4$ZvBz zCo=xQAzvE&OALIWwpM!tVQS!vHSwf^IwMM71QO`^f<78MQRn0j34`tIJ`-F;bIcZa znf>*XTCww-DOl&$zOo3EM#U1~vG32#jvw(#0?amLVj^3l?gJQ>M(iX!37hETE}}W> zN0j?O5sN~=oAMVwl|RWSJUa?8+3C>i6mnUwj}8h=UTgK5^gZuulRSUZXz1&KZIMjW z+<3H3((o|^)#vZd6lN#vOJZC00G^9R=QQ5f<)o(weO6noqpbrNK_XiZro%!SbwAOlI1GWjwnzJ{ zlf+ozIG^uV2x(Uv^!D$8Ryf;Ep`lA(P)tq)#T(%CIf9zrh}CwnJV_XSp3drH)C=`#ktUUiAjqIb?W9bvJKF^^LNAYPD$jVSt=~L6qn7OzcYL8A;9P2@~{*?qx6+@_HY5tJW2NvO_FgVjb-T zqh6=cNysUGek%l7trmkkwnMxf=Q}#pH!g4?_v;X^2BTA6+d4)AgZwiMT(n6NOPd^( zKMSM2Qc6v@^Nb-wUXK|fdQF!}kmqs4aN(ziZ9zozQgxWRgKnx}p+~pD5J9>ypU(uL)^>2Eb{ad@J2M0-{+q!e{J=iK)Yu!V?D zf3TcfSM{nRDBUa>e`90L(2L%D^T>|3AZGT-OK1Is4rn$F^l@(-{j58Nd%1ExPBXpf za9GZp`-cruIVnXaO(@h#DzftiSIWJ3`&99 z=rfZaBS`Ritv7X?SL?DqZ%q*FL)krOF7ot*BwGrtgA#s!5%LH-{ACuazzr%AtVU7r)513_E5lq9p05bxOEf4c-%aC` zFC2+5KoSsm?aq!jp}tgjG4*@ohU(9LVu=X}`GtkKlLt^6AsmcC@*Qkqo`f%L~fDk25=-Hunm`ms#)yF50Y|>5|RP z#}%F#7~Fbwj}@a`Vp~v?wt8)a0XqQyj;Uu^Nd^85LuJU~>(AyAehi;E?f(SrC7IKu}cXmt+gC!O~D0=SZ3 zdGIAIaH&1Lx*Q?+$1(k#&~q|CWOQTLiN}k6`omX7ZyHJjaB=xx{=d)Z;!nc>OkpI0 z$ZZh6zc&Y84E?OaCi^#(r)Z{kL@CwCIbB$N)+}!Q8%f%5j72m*2>PdQsPCujm zRMtvO@svs5*F*n|L1dv2PuZ{Zd%sbYY=zo|KZo?%d?o2K(mCvi@v~=XyOsPg1|sFB z6U;@ZT=2zf_15nZ^B0|muLvhqc7jo91Y3*0JA`y^zCQIvx2%2C&27I27oJ0b{}!a)J=a6Ime6JRG_B#5~Ji>SXnVJGL{t;A$pMz5y>hj*qWPf zj=;1qf!HtY*9*NzdEM#&p z6yaP5fGnnx`TA)p9H!SEG6OHQt-lDlGlJI6_PHST+c^Mdi%_rE8alQZPCUgOyWs^@ z=ltleKx@|eGp#nAWvm{$fD*+79(yc0fe< z$9IqDg?sepe66w?h-0)UCw z2|x-S7*621Wic9?dQXF0fkpL_iW+Qw@iBoKsy|WS2g~ydGD7UxVw>W3dh%d(h9k3t zx&$5dMUI8UO92#jKXWZ}?eD+EjL^`ZSVekFsA#Zjfi$V^M)!e)EU?oWC#A5vD73v( z_@#$;08z6c)_O#CO>0(Nu==kxw?~<+-fcY<%hp@Y&S3Ln8uZG-A&NXUhd5%+S!^t< z_~X9#*4s|y5ljLp4(f2JW5)2AAe^t~x@$2>r;7`TiF3IL%u+)KfCzjSH^7o58 zvVV%5rU8k`Y8-!uiM#^=V`9s}L8ptIalX*^zZ&rGmus;`WpdoSJ1OcCkz+nH6I3hio)dQ+))vSZJ^oi>kBuCA(Oktt`*rUZNC9 z&vVOAt@XXWYJ#yMtYsq-c6Q5RH#~A{aSMx#P5V-0&Rz}(g}#eDm)hXu&~(nGYm?{0 zH-QIE8}<7vCY;Q?TmNhfS__}I8WPWkTZc`%h(reDiCYax%QKr%Oz<1b5C;UFShZfU zJVcp!VpifP{$3S@+Y{WpOar&I37z%K%nS?+OiX-)+D>I=x8Kvv7=}8&mzfoQ_m48* zRh}jFeh!WxYvPR(I_ zT~BLcu$tUgr>}_$D#=0{iTaLDBUywU`QKCctp}Db4`_Td_Z2Ra6B?R`DbF6wb&X(6 zJ=dPxM3r~5($Rb-{B*foCh^g$@X_t@?^yA_S0*(R$!(kMj~_Z^dd?D zT~l}<+OG{KM1b^~gjx?X?wmQZd1nnZYLZEle0BGO>vj$Y_&9pX4_&Nngl z1@$0eqF@3RVVc8AZSBMc7@+^m}0o(9MGzw3Do}$m* z)c1mTO8M4aXuJBfa+Vf%`m#J`X;txQMpk~@M60|Vz)w<2AM@i+K^rrrR^g7q#7zeH z0pHxe+Ae`IImIY99h}B8YtY1U3?i6_u`s;V|4dmxlD*94;U1>6$$(fe()T0ye?BVq zJY0RbjB#-YKSyJ=b3Kz!;P-v0b!1E&W4LcLjpgcKtW*SB5TonPpbU%k!sB~}?0O7Z zPmYmI<59}ims9}=n${p~zYAS|+Q_@)xB94i&x(N3z!O+pB2IE_zm54`M8qZxXE7|n z)hD(xX+`=_xg_lyzBb_c9b#phD~!b1 z&dr2UR9stx&~l#(>-VM>m4nwiX{4?s8{6@J6_^jn*;02dsnrTJB`~a-i$Vy}JO|12 z7+%kiPP@#P+$_U_GBs%cAwaVBqY_N&P;Aaq?7=z%={|dqWMvRB<~Q)oL!DMViriRL z^W!4ID*?`z`PFaZ^wp&U`%ht`)n6KCTVZ>B=98)r>SGZ?`AKcR{l!5 zyxd|rC6xH_63%BLNgKrcNHnoQo+`~g&tf;&sd#0iS}J6isWm$hb7oX(NRon%V?afX zx!`E=|4A&d*+H@x@HB$E;dNj1Pcqm)&DTSgtKy4}N1!xyD4$TwkyYAn{4uPhTA$e?+c}@-(=;?q zXUr*FN$k1--~@S-FY*ZsWB0``S-7<6B8%JPb+6}BSN=Q8++&mD~?680!_<%~CTwsjnR$;Q}LM?69ush>WWb%#u+ou|CNjIfYdu znu_RDE;tWwvGQR`Cbq8tS65p6P<#hy6h5Y)N^3VYCu)jo>graX>D-QljQWaRveC$1 zhdNQ?Pn%~m;sSZQlE8vE&PF)q1G*Zk0)<||o{iATAAs`BX-Z+u0LT@W6!m0Z5;*k1 zz3wp@H7s4X`SZ!q(qCP#mq-H(|N7WqF?U- zml@zE@B09)=D6HGo@Z`84GE&J-RnGY;&B^bn9`AFH#gvT?nFP_7}JLd{XrgYe#3OW z+*KIL_`{B(n`+<;i_zw*Dpt+tagc>ggEx4|p~qz~_+FIm*Q5(BX6V*?GT?sM5Oo#< z@BtlBpEH?=qiWa^VvvJcN&YUVPmgUWUEzY4!)O7eVaK2FtrU=`vC4Nm(AKtC%TMyG z(-@!<#>d^VN1@EAZR~lRpxy80Kk^>m_vRhR4rM&(=8eoADSp61AhI{RNZPs~G@vy1 zr!QtZu=hqbarAbZ>r~NPwY)ESD^x%d7&$uIt(tB^kuW#D70R=s4vLJZY>Hy81`j+& z7+BP-KFX|7U|@9RDbH@Znx)#&$F@>n(J#EZ)Yl*qr=bv!{V_(Z5&!54i9tOj4cQCC z>@@QQfW`BG6+X|MA>p{p?-`!-9tRQqUt<6n+@pjr`%$u+H&dCX&;mfYy4)TGFW)to zP=A75ww*c9+?X|9yu3eGfNX&vQF#IjemA5OBBTXZrgs?vxzBbYv$Xx=~PU=j>>y{h_8X>w1IuU(~ zgOcP$m7NDbiDTsGZiD6vRP$pbmyh1yYAT%b%Tpg&uw-Bx@=?;HF`ijX=VoWl3aXP8 zyQxH-TRBt!vNWx}$cVxKoK9O%^Psq&#bdIZqyKMAQRjoZ=QPar3!Q!WzIfxIn6#Q+ z?&S~hu@V2W1~iFU6*~V&6O|1%b_0v452@r^B)_jN%ggDIR$k$$_6VLMb$c5|>^vpj z4ej#H0H`m#B*&UKU)6p$kbum*EP-{hriX=J$7oU1#sBmt!aif?PL!PzYp-rM)CDOA z9iq3mp41t;s8~wGb#AUIUh6i`{}l~z5o5F_?$t-2|9RP63awdFip+nyL+2n@)RgM3 z$2`ga<~DDZu$vU4cXaSLsU4&6v^@vc{ziMY*ptRKZ<^Z}GcS6ekFhjDXb@@ZvTX-H zB#RUTQ=3YtASxG>=i>q1q}2zV_q zH|OOIJU^kA$#$*S_fZb4v5pbKG_n4=OK#1NRYECiw1rt2nofjn`r*IARu({s{zVf= zDJ;-OELb@TmVE7;hqGO2#1xvpLmc?5SvQ>Xj(&}wPtGub;N|X=HIK-w$u~l>pynx1 z;iUC)BTeaR0{*Fk%e+uQ!(826)R_)Ln|m8z67g#SR&7@a0uPP7Ny9eSQ#1#0B1mE%n{q?>g=t4DF*G>@LH2B`TeR3wxrNxiXL4Ts^~ zuFZ)KD=5hG6&Pczdhq5nz+%fYuB*BBrL8TG0$|(^WVV5&C|F8X=*V?SS5c6%{>>iC ziFA-T0!8}a0OA}^mAR%$WHc^^^arRDZ{|tA!bWwuqsJ^Ne&nzj=P^<7lU?dv0zz2m zR~lT7fI%ez%xU60FAcgfcr5^I&iwr9o%vz$*NHagvraFNf&P?ikiv(>eftp|{|=7;O^Ip62qE5>91O0(4U z+jJHJ4|=o!^Oe9sS?0XZYB`WA*2nfX4CAfFZ5KEkWiMhI({Zm`vFdm^wi%h_)!^34 zeLM$w*me~z<;RcA%uy;FPKWbZxVV0Dw!AZ=WP0cv3tsy~`7&#BtGq(NNEtm%==FLX zoqRdiKT0};SWpxFnh915__q`9S%BZrpzP)lGcSKZZFx&UNo`|Ib{l6AK?ZO(K_w7< zn8`VOoRR_BOXPzXul)!2{R47&L9`M&ROyMyswr35vI83Si7#wPz3L8*E(V{gktDiv zPq22Z9ZB5HY#I8+XF-{cC>h0es=%0cGKz{A%$BqlXtE{5Ic(}24%WXk>}WE3j|L}! zYVWQY$ zoIPf*oP&hvynx1OVGi7BczU(2zNnO>nZ@qA)J_97g07nu&76Ir=eS5MHV;WzgtBHH z02+NcVRWXOx*@C!lN#ig$QDl|l;E*NGWKJUI(;wZG2GQ4mbNH{w?QTmOsOg>;(c+= zSTGvCN3TGZ21}J=?T-w%r|+K}v72UB$QYn0(Gg2LUKckPYRZrOPIE82N2rnB18Ekm z@yzEi5>Fm}M%Gu`NJI-G$&+;=H2yI3OVBBr`JN4a29fLLyC{7CV{Aahg<(aXK$-jR zt~7I&W*<7ewF^CkT)rQyUTc9FhP-nGtc(m(c1_U=0!~WbLsdk3tKMsLpSa#c=A3kh zaq>-Ko^=RO>I6AD3kMo+l7M#E)7cnssw$>9`C2iSKZ1;X*vGZ z)3bl6GJttw3D(NtT!Aq^SH3zl%w=`B|{b87y>s?qc ztVJ=_ircT-6S1JEIJgjPjm3o#PTqQW1xpmQN|DH_`EW~=nwdnCcJ+9V8j{%!yL zj8i#3m310BHQcqkg#6YZN^ffvJV;Q(({NIpt!bD!JxA&T9O{Yl5FEE&dHv-}p{!YZ z^_WOnhAEeNtaZV`C+p(V@(uhGlkpTbY_I8EJJCP67)pxeM{v#Vi~WG(jJ#p-EpzrKGz&cz>uWMKe=-qNwp?h8>X-Uqeo~KcGf4-hPRl{rw0T2)W#m4#U zMOKnFC%_KGrSP=b&P59mlVjhv9AZzQmyr=~%v8U;Tw0zqG&DQ4Z1?sau0jzt;e_+R z^2-{&F0hz+sTeO$EkJXoL4mxD_K9)}d=@;vI2L*%iBJ6r@Q6Zzq>Z;V5V4{AsNAYG z;|-Ywt0p|kgcDFa^*4K?c90Z{&qYqAKx^<@t@QF8bp^Ba;v`8&IU0R+N2d58ky1bv z&5F33aZdYd#{hA=7A-9gJrA`pF1~`8K`(Yrpirnr;g=0u)EVJb4m>a`S0HtcU6lAo z$#I{4jFEL1_tG-3X?gN}^XSMoZ{Rq^Yyu0*IX-m#S1=v@0KoeDIhPwW!=la#1C~^! zN%fTlrKOcayg$I%xpa(ppYNM zyVan?U9jLQ(D*s$`Eb5s3v7mY#P_ThC(Id{|G{V8}{&FcoLTWJ_;cK+x;Jb!VS zWQ15r6glxF1Tq3OgFa8Axib8$9<2N*O*kC8RPk|UirDQqkn>M;f!&kM$oB(>*e!_9 zELb7=?YteLk&BXeaE&W;*-N)Q7Atk~kZ}FCg1JQeW}~q10*e};^7q6q!8M}wAUN^G ze-*ECYOxBU^B?Pz2¬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�xH&adz&Urf!4 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 z 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

@FQpl@9Tfr0RC6Zn(AbFL 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 z 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

+1+AOvX74O^4(leRZrpMaz!_iK17Sq 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%0An^0!z)R<_ewpGv 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 - - - - - - - - - - - - + + + + + + + + + + + + + diff --git a/Firmware/LUFA/StudioIntegration/VSIX/asf-manifest.xml b/Firmware/LUFA/StudioIntegration/VSIX/asf-manifest.xml index bd96951..794fd68 100644 --- a/Firmware/LUFA/StudioIntegration/VSIX/asf-manifest.xml +++ b/Firmware/LUFA/StudioIntegration/VSIX/asf-manifest.xml @@ -1,18 +1,18 @@ - - - FourWalledCubicle - LUFA - Dean Camera - - True - - - - 0 - - - content.xml.cache - - - - + + + FourWalledCubicle + LUFA + Dean Camera + + True + + + + 0 + + + content.xml.cache + + + + diff --git a/Firmware/LUFA/StudioIntegration/VSIX/extension.vsixmanifest b/Firmware/LUFA/StudioIntegration/VSIX/extension.vsixmanifest index 8475017..f155618 100644 --- a/Firmware/LUFA/StudioIntegration/VSIX/extension.vsixmanifest +++ b/Firmware/LUFA/StudioIntegration/VSIX/extension.vsixmanifest @@ -1,33 +1,32 @@ - - - - - LUFA Library - Dean Camera - 0 - http://www.lufa-lib.org - LUFA, the Lightweight USB Framework for AVRs. - - License.txt - LUFA_thumb.png - LUFA.png - - - AtmelStudio - AtmelStudio - - - - 1033 - - false - - - - - - LUFA.pkgdef - helpcontentsetup.msha - asf-manifest.xml - - + + + + + LUFA Library + Dean Camera + 0 + http://www.lufa-lib.org + LUFA, the Lightweight USB Framework for AVRs. + + License.txt + LUFA_thumb.png + LUFA.png + + + AtmelStudio + + + + 1033 + + false + + + + + + LUFA.pkgdef + helpcontentsetup.msha + asf-manifest.xml + + diff --git a/Firmware/LUFA/StudioIntegration/VSIX/generate_caches.py b/Firmware/LUFA/StudioIntegration/VSIX/generate_caches.py index eb4b71e..ab787e8 100644 --- a/Firmware/LUFA/StudioIntegration/VSIX/generate_caches.py +++ b/Firmware/LUFA/StudioIntegration/VSIX/generate_caches.py @@ -1,38 +1,38 @@ -""" - LUFA Library - Copyright (C) Dean Camera, 2013. - - dean [at] fourwalledcubicle [dot] com - www.lufa-lib.org -""" - -import sys -sys.path.append("ProjectGenerator") - - -def show_message(message): - print("[Project Generator] %s" % message) - sys.stdout.flush() - - -def main(lufa_root_path): - try: - from asf_avrstudio5_interface import PythonFacade - except ImportError: - print("Fatal Error: The ASF project generator is missing.") - return 1 - - p = PythonFacade(lufa_root_path) - - show_message("Checking database sanity...") - p.check_extension_database_sanity(lufa_root_path) - - show_message("Building cache files...") - p.generate_extension_cache_files(lufa_root_path) - - show_message("Cache files created.") - return 0 - - -if __name__ == "__main__": - sys.exit(main(sys.argv[1])) +""" + LUFA Library + Copyright (C) Dean Camera, 2017. + + dean [at] fourwalledcubicle [dot] com + www.lufa-lib.org +""" + +import sys +sys.path.append("ProjectGenerator") + + +def show_message(message): + print("[Project Generator] %s" % message) + sys.stdout.flush() + + +def main(lufa_root_path): + try: + from asf_avrstudio5_interface import PythonFacade + except ImportError: + print("Fatal Error: The ASF project generator is missing.") + return 1 + + p = PythonFacade(lufa_root_path) + + show_message("Checking database sanity...") + p.check_extension_database_sanity(lufa_root_path) + + show_message("Building cache files...") + p.generate_extension_cache_files(lufa_root_path) + + show_message("Cache files created.") + return 0 + + +if __name__ == "__main__": + sys.exit(main(sys.argv[1])) diff --git a/Firmware/LUFA/StudioIntegration/VSIX/lufa_asfmanifest_transform.xslt b/Firmware/LUFA/StudioIntegration/VSIX/lufa_asfmanifest_transform.xslt index 8fc9841..00f552c 100644 --- a/Firmware/LUFA/StudioIntegration/VSIX/lufa_asfmanifest_transform.xslt +++ b/Firmware/LUFA/StudioIntegration/VSIX/lufa_asfmanifest_transform.xslt @@ -1,6 +1,6 @@ - - - - - - - - Lightweight USB Framework for AVRs (LUFA), a USB software stack/framework. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + Lightweight USB Framework for AVRs (LUFA), a USB software stack/framework. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Firmware/LUFA/StudioIntegration/lufa_common.xml b/Firmware/LUFA/StudioIntegration/lufa_common.xml index c2ef7af..b72f84c 100644 --- a/Firmware/LUFA/StudioIntegration/lufa_common.xml +++ b/Firmware/LUFA/StudioIntegration/lufa_common.xml @@ -1,34 +1,34 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Firmware/LUFA/StudioIntegration/lufa_drivers_board.xml b/Firmware/LUFA/StudioIntegration/lufa_drivers_board.xml index e150aa6..bd0359f 100644 --- a/Firmware/LUFA/StudioIntegration/lufa_drivers_board.xml +++ b/Firmware/LUFA/StudioIntegration/lufa_drivers_board.xml @@ -1,114 +1,114 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Firmware/LUFA/StudioIntegration/lufa_drivers_board_names.xml b/Firmware/LUFA/StudioIntegration/lufa_drivers_board_names.xml index ab7e03e..69a38c5 100644 --- a/Firmware/LUFA/StudioIntegration/lufa_drivers_board_names.xml +++ b/Firmware/LUFA/StudioIntegration/lufa_drivers_board_names.xml @@ -1,853 +1,853 @@ - - - - - - - - - Board hardware (LEDs, Buttons, etc.) drivers for the preconfigured LUFA boards. Note that only the boards - compatible with the currently selected device will be shown. - - To disable all hardware drivers silently, use NONE. To supply customer drivers, use USER (see manual). - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + Board hardware (LEDs, Buttons, etc.) drivers for the preconfigured LUFA boards. Note that only the boards + compatible with the currently selected device will be shown. + + To disable all hardware drivers silently, use NONE. To supply customer drivers, use USER (see manual). + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Firmware/LUFA/StudioIntegration/lufa_drivers_misc.xml b/Firmware/LUFA/StudioIntegration/lufa_drivers_misc.xml index 4311ae8..ee72f33 100644 --- a/Firmware/LUFA/StudioIntegration/lufa_drivers_misc.xml +++ b/Firmware/LUFA/StudioIntegration/lufa_drivers_misc.xml @@ -1,57 +1,57 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Firmware/LUFA/StudioIntegration/lufa_drivers_peripheral.xml b/Firmware/LUFA/StudioIntegration/lufa_drivers_peripheral.xml index 76ea516..b4eb874 100644 --- a/Firmware/LUFA/StudioIntegration/lufa_drivers_peripheral.xml +++ b/Firmware/LUFA/StudioIntegration/lufa_drivers_peripheral.xml @@ -1,198 +1,198 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Firmware/LUFA/StudioIntegration/lufa_drivers_usb.xml b/Firmware/LUFA/StudioIntegration/lufa_drivers_usb.xml index 263c411..f07aad6 100644 --- a/Firmware/LUFA/StudioIntegration/lufa_drivers_usb.xml +++ b/Firmware/LUFA/StudioIntegration/lufa_drivers_usb.xml @@ -1,32 +1,32 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Firmware/LUFA/StudioIntegration/lufa_drivers_usb_class.xml b/Firmware/LUFA/StudioIntegration/lufa_drivers_usb_class.xml index 67ab760..123d606 100644 --- a/Firmware/LUFA/StudioIntegration/lufa_drivers_usb_class.xml +++ b/Firmware/LUFA/StudioIntegration/lufa_drivers_usb_class.xml @@ -1,32 +1,32 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Firmware/LUFA/StudioIntegration/lufa_drivers_usb_class_android.xml b/Firmware/LUFA/StudioIntegration/lufa_drivers_usb_class_android.xml index 3451712..3ec06ed 100644 --- a/Firmware/LUFA/StudioIntegration/lufa_drivers_usb_class_android.xml +++ b/Firmware/LUFA/StudioIntegration/lufa_drivers_usb_class_android.xml @@ -1,6 +1,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Firmware/LUFA/StudioIntegration/lufa_drivers_usb_core_avr8.xml b/Firmware/LUFA/StudioIntegration/lufa_drivers_usb_core_avr8.xml index 4688f05..b2792cb 100644 --- a/Firmware/LUFA/StudioIntegration/lufa_drivers_usb_core_avr8.xml +++ b/Firmware/LUFA/StudioIntegration/lufa_drivers_usb_core_avr8.xml @@ -1,43 +1,43 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Firmware/LUFA/StudioIntegration/lufa_drivers_usb_core_uc3.xml b/Firmware/LUFA/StudioIntegration/lufa_drivers_usb_core_uc3.xml index 2e7185f..d815fca 100644 --- a/Firmware/LUFA/StudioIntegration/lufa_drivers_usb_core_uc3.xml +++ b/Firmware/LUFA/StudioIntegration/lufa_drivers_usb_core_uc3.xml @@ -1,42 +1,42 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Firmware/LUFA/StudioIntegration/lufa_drivers_usb_core_xmega.xml b/Firmware/LUFA/StudioIntegration/lufa_drivers_usb_core_xmega.xml index c79a0f5..364a0f3 100644 --- a/Firmware/LUFA/StudioIntegration/lufa_drivers_usb_core_xmega.xml +++ b/Firmware/LUFA/StudioIntegration/lufa_drivers_usb_core_xmega.xml @@ -1,36 +1,36 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Firmware/LUFA/StudioIntegration/lufa_platform.xml b/Firmware/LUFA/StudioIntegration/lufa_platform.xml index 4ee51f6..e20b718 100644 --- a/Firmware/LUFA/StudioIntegration/lufa_platform.xml +++ b/Firmware/LUFA/StudioIntegration/lufa_platform.xml @@ -1,60 +1,60 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Firmware/LUFA/StudioIntegration/lufa_platform_uc3.xml b/Firmware/LUFA/StudioIntegration/lufa_platform_uc3.xml index 98017b0..8c26d23 100644 --- a/Firmware/LUFA/StudioIntegration/lufa_platform_uc3.xml +++ b/Firmware/LUFA/StudioIntegration/lufa_platform_uc3.xml @@ -1,26 +1,26 @@ - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + diff --git a/Firmware/LUFA/StudioIntegration/lufa_platform_xmega.xml b/Firmware/LUFA/StudioIntegration/lufa_platform_xmega.xml index e613fe5..299c859 100644 --- a/Firmware/LUFA/StudioIntegration/lufa_platform_xmega.xml +++ b/Firmware/LUFA/StudioIntegration/lufa_platform_xmega.xml @@ -1,23 +1,23 @@ - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + diff --git a/Firmware/LUFA/StudioIntegration/lufa_toolchain.xml b/Firmware/LUFA/StudioIntegration/lufa_toolchain.xml index a76b6d0..66b416e 100644 --- a/Firmware/LUFA/StudioIntegration/lufa_toolchain.xml +++ b/Firmware/LUFA/StudioIntegration/lufa_toolchain.xml @@ -1,43 +1,45 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Firmware/LUFA/StudioIntegration/makefile b/Firmware/LUFA/StudioIntegration/makefile index 2649598..53fb470 100644 --- a/Firmware/LUFA/StudioIntegration/makefile +++ b/Firmware/LUFA/StudioIntegration/makefile @@ -1,6 +1,6 @@ # # LUFA Library -# Copyright (C) Dean Camera, 2013. +# Copyright (C) Dean Camera, 2017. # # dean [at] fourwalledcubicle [dot] com # www.lufa-lib.org @@ -10,16 +10,17 @@ # --------------------------------------- LUFA_ROOT := .. -LUFA_VERSION_NUM := $(shell grep LUFA_VERSION_STRING $(LUFA_ROOT)/Version.h | cut -d'"' -f2) +LUFA_VERSION_NUM := $(shell grep -e "\#define *LUFA_VERSION_STRING " $(LUFA_ROOT)/Version.h | cut -d'"' -f2) +LUFA_VERSION_TYPE := $(shell grep -e "\#define *LUFA_VERSION_RELEASE_TYPE " $(LUFA_ROOT)/Version.h) -ifneq ($(LUFA_VERSION_NUM),000000) +ifneq ($(findstring LUFA_VERSION_RELEASE_TYPE_DEVELOPMENT, $(LUFA_VERSION_TYPE)),LUFA_VERSION_RELEASE_TYPE_DEVELOPMENT) EXT_VERSION_NUM := $(shell date +"%y.%m.%d").$(LUFA_VERSION_NUM) EXT_VSIX_NAME := LUFA-RELEASE-$(LUFA_VERSION_NUM).vsix else EXT_VERSION_NUM := 0.$(shell date +"%y%m%d.%H%M%S") EXT_VSIX_NAME := LUFA-TESTING-$(shell date +"%y.%m.%d-%H.%M.%S").vsix - $(warning No LUFA version set - assuming a test version should be created.) + $(warning Development mode set - assuming a test version should be created.) endif DOXYGEN_TAG_FILE_XML := $(LUFA_ROOT)/Documentation/lufa_doc_tags.xml @@ -27,7 +28,7 @@ DOXYGEN_COMBINED_XML := $(LUFA_ROOT)/Documentation/xml/lufa_doc.xml TEMP_MANIFEST_XML := manifest.xml EXTENSION_OUTPUT_XML := $(LUFA_ROOT)/../extension.xml MODULE_OUTPUT_XML := $(LUFA_ROOT)/asf.xml -MSHELP_OUTPUT_XML := $(LUFA_ROOT)/../lufa_help_$(EXT_VERSION_NUM).mshc +MSHELP_OUTPUT_XML := $(LUFA_ROOT)/../lufa_help_$(subst .,_,$(EXT_VERSION_NUM)).mshc XML_FILES := $(filter-out $(TEMP_MANIFEST_FILE), $(shell ls *.xml)) VSIX_ASSETS := $(LUFA_ROOT)/DoxygenPages/Images/LUFA_thumb.png \ $(LUFA_ROOT)/DoxygenPages/Images/LUFA.png \ @@ -36,7 +37,8 @@ VSIX_ASSETS := $(LUFA_ROOT)/DoxygenPages/Images/LUFA_thumb.png \ VSIX/LUFA.dll \ VSIX/LUFA.pkgdef VSIX_GEN_PARAMS := --stringparam extension-version "$(EXT_VERSION_NUM)" \ - --stringparam lufa-version "$(LUFA_VERSION_NUM)" + --stringparam lufa-version "$(LUFA_VERSION_NUM)" \ + --stringparam help-package-filename "$(notdir $(MSHELP_OUTPUT_XML))" MSHELP_GEN_PARAMS := --stringparam generate.toc "book toc" \ --stringparam chunk.quietly "1" \ --stringparam chunk.section.depth "3" \ diff --git a/Firmware/LUFA/Version.h b/Firmware/LUFA/Version.h index 264c941..03cb084 100644 --- a/Firmware/LUFA/Version.h +++ b/Firmware/LUFA/Version.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2014. + Copyright (C) Dean Camera, 2017. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted @@ -42,11 +42,26 @@ /* Public Interface - May be used in end-application: */ /* Macros: */ - /** Indicates the version number of the library, as an integer. */ - #define LUFA_VERSION_INTEGER 0x140928 + /** \name LUFA Release Type Constants */ + //@{ + /** Constant for \ref LUFA_VERSION_RELEASE_TYPE indicating a development release. */ + #define LUFA_VERSION_RELEASE_TYPE_DEVELOPMENT 0 - /** Indicates the version number of the library, as a string. */ - #define LUFA_VERSION_STRING "140928" + /** Constant for \ref LUFA_VERSION_RELEASE_TYPE indicating a beta release. */ + #define LUFA_VERSION_RELEASE_TYPE_BETA 1 + + /** Constant for \ref LUFA_VERSION_RELEASE_TYPE indicating a full official release. */ + #define LUFA_VERSION_RELEASE_TYPE_FULL 2 + //@} + + /** Indicates the version number of the library, as an integer. \note This value is only updates in non-development releases. */ + #define LUFA_VERSION_INTEGER 0x170418 + + /** Indicates the version number of the library, as a string. \note This value is only updates in non-development releases. */ + #define LUFA_VERSION_STRING "170418" + + /** Indicates the release type of the library. */ + #define LUFA_VERSION_RELEASE_TYPE LUFA_VERSION_RELEASE_TYPE_FULL #endif diff --git a/Firmware/LUFA/doxyfile b/Firmware/LUFA/doxyfile index 77e8def..90b8ca2 100644 --- a/Firmware/LUFA/doxyfile +++ b/Firmware/LUFA/doxyfile @@ -1,4 +1,4 @@ -# Doxyfile 1.8.8 +# Doxyfile 1.8.9 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project. @@ -46,10 +46,10 @@ PROJECT_NUMBER = 000000 PROJECT_BRIEF = -# With the PROJECT_LOGO tag one can specify an logo or icon that is included in -# the documentation. The maximum height of the logo should not exceed 55 pixels -# and the maximum width should not exceed 200 pixels. Doxygen will copy the logo -# to the output directory. +# With the PROJECT_LOGO tag one can specify a logo or an icon that is included +# in the documentation. The maximum height of the logo should not exceed 55 +# pixels and the maximum width should not exceed 200 pixels. Doxygen will copy +# the logo to the output directory. PROJECT_LOGO = ./DoxygenPages/Images/LUFA_thumb.png @@ -60,7 +60,7 @@ PROJECT_LOGO = ./DoxygenPages/Images/LUFA_thumb.png OUTPUT_DIRECTORY = ./Documentation/ -# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create 4096 sub- +# 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 @@ -93,14 +93,14 @@ ALLOW_UNICODE_NAMES = NO OUTPUT_LANGUAGE = English -# If the BRIEF_MEMBER_DESC tag is set to YES doxygen will include brief member +# If the BRIEF_MEMBER_DESC tag is set to YES, 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. # The default value is: YES. BRIEF_MEMBER_DESC = YES -# If the REPEAT_BRIEF tag is set to YES doxygen will prepend the brief +# If the REPEAT_BRIEF tag is set to YES, 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 @@ -145,7 +145,7 @@ ALWAYS_DETAILED_SEC = NO INLINE_INHERITED_MEMB = NO -# If the FULL_PATH_NAMES tag is set to YES doxygen will prepend the full path +# If the FULL_PATH_NAMES tag is set to YES, 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 # The default value is: YES. @@ -215,9 +215,9 @@ MULTILINE_CPP_IS_BRIEF = NO 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. +# 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. # The default value is: NO. SEPARATE_MEMBER_PAGES = NO @@ -286,7 +286,7 @@ OPTIMIZE_OUTPUT_VHDL = NO # instance to make doxygen treat .inc files as Fortran files (default is PHP), # and .f files as C (default is Fortran), use: inc=Fortran f=C. # -# Note For files without extension you can use no_extension as a placeholder. +# Note: For files without extension you can use no_extension as a placeholder. # # Note that for custom extensions you also need to set FILE_PATTERNS otherwise # the files are not read by doxygen. @@ -305,8 +305,8 @@ MARKDOWN_SUPPORT = NO # When enabled doxygen tries to link words that correspond to documented # classes, or namespaces to their corresponding documentation. Such a link can -# be prevented in individual cases by by putting a % sign in front of the word -# or globally by setting AUTOLINK_SUPPORT to NO. +# be prevented in individual cases by putting a % sign in front of the word or +# globally by setting AUTOLINK_SUPPORT to NO. # The default value is: YES. AUTOLINK_SUPPORT = YES @@ -346,7 +346,7 @@ SIP_SUPPORT = NO IDL_PROPERTY_SUPPORT = NO # 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 +# 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. # The default value is: NO. @@ -411,7 +411,7 @@ LOOKUP_CACHE_SIZE = 0 # Build related configuration options #--------------------------------------------------------------------------- -# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in +# 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 respectively EXTRACT_STATIC tags are set to YES. @@ -421,35 +421,35 @@ LOOKUP_CACHE_SIZE = 0 EXTRACT_ALL = YES -# If the EXTRACT_PRIVATE tag is set to YES all private members of a class will +# If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will # be included in the documentation. # The default value is: NO. EXTRACT_PRIVATE = YES -# If the EXTRACT_PACKAGE tag is set to YES all members with package or internal +# If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal # scope will be included in the documentation. # The default value is: NO. EXTRACT_PACKAGE = NO -# If the EXTRACT_STATIC tag is set to YES all static members of a file will be +# If the EXTRACT_STATIC tag is set to YES, all static members of a file will be # included in the documentation. # The default value is: NO. 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 +# 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. Does not have any effect # for Java sources. # The default value is: YES. EXTRACT_LOCAL_CLASSES = YES -# This flag is only useful for Objective-C code. When set to YES local methods, +# This flag is only useful for Objective-C code. If 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 only methods in the interface are +# included in the documentation. If set to NO, only methods in the interface are # included. # The default value is: NO. @@ -474,21 +474,21 @@ 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 these classes will be included in the various overviews. This option has -# no effect if EXTRACT_ALL is enabled. +# to NO, these classes will be included in the various overviews. This option +# has no effect if EXTRACT_ALL is enabled. # The default value is: NO. 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 these declarations will be +# (class|struct|union) declarations. If set to NO, these declarations will be # included in the documentation. # The default value is: NO. 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 these +# documentation blocks found inside the body of a function. If set to NO, these # blocks will be appended to the function's detailed documentation block. # The default value is: NO. @@ -502,7 +502,7 @@ HIDE_IN_BODY_DOCS = NO 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 +# 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. @@ -511,12 +511,19 @@ INTERNAL_DOCS = NO CASE_SENSE_NAMES = NO # If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with -# their full class and namespace scopes in the documentation. If set to YES the +# their full class and namespace scopes in the documentation. If set to YES, the # scope will be hidden. # The default value is: NO. HIDE_SCOPE_NAMES = NO +# If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will +# append additional text to a page's title, such as Class Reference. If set to +# YES the compound reference will be hidden. +# The default value is: NO. + +HIDE_COMPOUND_REFERENCE= NO + # If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of # the files that are included by a file in the documentation of that file. # The default value is: YES. @@ -544,14 +551,14 @@ INLINE_INFO = YES # If the SORT_MEMBER_DOCS tag is set to YES 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. +# name. If set to NO, the members will appear in declaration order. # The default value is: YES. SORT_MEMBER_DOCS = YES # If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief # descriptions of file, namespace and class members alphabetically by member -# name. If set to NO the members will appear in declaration order. Note that +# name. If set to NO, the members will appear in declaration order. Note that # this will also influence the order of the classes in the class list. # The default value is: NO. @@ -596,27 +603,25 @@ SORT_BY_SCOPE_NAME = NO STRICT_PROTO_MATCHING = YES -# 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. +# 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. # The default value is: YES. 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. +# 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. # The default value is: YES. GENERATE_TESTLIST = NO -# The GENERATE_BUGLIST tag can be used to enable ( YES) or disable ( NO) the bug +# 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. # The default value is: YES. GENERATE_BUGLIST = NO -# The GENERATE_DEPRECATEDLIST tag can be used to enable ( YES) or disable ( 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. # The default value is: YES. @@ -641,8 +646,8 @@ ENABLED_SECTIONS = MAX_INITIALIZER_LINES = 1 # 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. +# 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. # The default value is: YES. SHOW_USED_FILES = YES @@ -706,7 +711,7 @@ CITE_BIB_FILES = QUIET = YES # The WARNINGS tag can be used to turn on/off the warning messages that are -# generated to standard error ( stderr) by doxygen. If WARNINGS is set to YES +# generated to standard error (stderr) by doxygen. If WARNINGS is set to YES # this implies that the warnings are on. # # Tip: Turn warnings on while writing the documentation. @@ -714,7 +719,7 @@ QUIET = YES WARNINGS = YES -# If the WARN_IF_UNDOCUMENTED tag is set to YES, then doxygen will generate +# If the WARN_IF_UNDOCUMENTED tag 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. # The default value is: YES. @@ -731,8 +736,8 @@ WARN_IF_DOC_ERROR = YES # This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that # are documented, but have no documentation for their parameters or return -# value. If set to NO doxygen will only warn about wrong or incomplete parameter -# documentation, but not about the absence of documentation. +# value. If set to NO, doxygen will only warn about wrong or incomplete +# parameter documentation, but not about the absence of documentation. # The default value is: NO. WARN_NO_PARAMDOC = YES @@ -801,6 +806,7 @@ RECURSIVE = YES EXCLUDE = Documentation/ \ StudioIntegration/ \ + Build/ \ License.txt # The EXCLUDE_SYMLINKS tag can be used to select whether or not files or @@ -885,7 +891,7 @@ INPUT_FILTER = FILTER_PATTERNS = # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using -# INPUT_FILTER ) will also be used to filter the input files that are used for +# INPUT_FILTER) will also be used to filter the input files that are used for # producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES). # The default value is: NO. @@ -945,7 +951,7 @@ REFERENCED_BY_RELATION = NO REFERENCES_RELATION = NO # If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set -# to YES, then the hyperlinks from functions in REFERENCES_RELATION and +# 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 documentation. # The default value is: YES. @@ -992,7 +998,7 @@ USE_HTAGS = NO VERBATIM_HEADERS = NO -# If the CLANG_ASSISTED_PARSING tag is set to YES, then doxygen will use the +# If the CLANG_ASSISTED_PARSING tag is set to YES then doxygen will use the # clang parser (see: http://clang.llvm.org/) for more accurate parsing at the # cost of reduced performance. This can be particularly helpful with template # rich C++ code for which doxygen's built-in parser lacks the necessary type @@ -1041,7 +1047,7 @@ IGNORE_PREFIX = # Configuration options related to the HTML output #--------------------------------------------------------------------------- -# If the GENERATE_HTML tag is set to YES doxygen will generate HTML output +# If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output # The default value is: YES. GENERATE_HTML = YES @@ -1107,10 +1113,10 @@ HTML_STYLESHEET = # cascading style sheets that are included after the standard style sheets # created by doxygen. Using this option one can overrule certain style aspects. # This is preferred over using HTML_STYLESHEET since it does not replace the -# standard style sheet and is therefor more robust against future updates. +# standard style sheet and is therefore more robust against future updates. # Doxygen will copy the style sheet files to the output directory. -# Note: The order of the extra stylesheet files is of importance (e.g. the last -# stylesheet in the list overrules the setting of the previous ones in the +# Note: The order of the extra style sheet files is of importance (e.g. the last +# style sheet in the list overrules the setting of the previous ones in the # list). For an example see the documentation. # This tag requires that the tag GENERATE_HTML is set to YES. @@ -1127,7 +1133,7 @@ HTML_EXTRA_STYLESHEET = ./DoxygenPages/Style/Style.css HTML_EXTRA_FILES = # The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen -# will adjust the colors in the stylesheet and background images according to +# will adjust the colors in the style sheet and background images according to # this color. Hue is specified as an angle on a colorwheel, see # http://en.wikipedia.org/wiki/Hue for more information. For instance the value # 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300 @@ -1255,28 +1261,28 @@ GENERATE_HTMLHELP = NO CHM_FILE = ../LUFA.chm # 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 +# 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. # The file has to be specified with full path. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. HHC_LOCATION = -# 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). +# 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). # The default value is: NO. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. GENERATE_CHI = NO -# The CHM_INDEX_ENCODING is used to encode HtmlHelp index ( hhk), content ( hhc) +# The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc) # and project file content. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. CHM_INDEX_ENCODING = -# 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. Furthermore it +# 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. Furthermore it # enables the Previous and Next buttons. # The default value is: NO. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. @@ -1390,7 +1396,7 @@ DISABLE_INDEX = YES # 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 # (i.e. any modern browser). Windows users are probably better off using the -# HTML help feature. Via custom stylesheets (see HTML_EXTRA_STYLESHEET) one can +# HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can # further fine-tune the look of the index. As an example, the default style # sheet generated by doxygen has an example that shows how to put an image at # the root of the tree instead of the PROJECT_NAME. Since the tree basically has @@ -1418,7 +1424,7 @@ ENUM_VALUES_PER_LINE = 1 TREEVIEW_WIDTH = 300 -# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open links to +# If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to # external symbols imported via tag files in a separate window. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. @@ -1447,7 +1453,7 @@ FORMULA_TRANSPARENT = YES # Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see # http://www.mathjax.org) which uses client side Javascript for the rendering -# instead of using prerendered bitmaps. Use this if you do not have LaTeX +# instead of using pre-rendered bitmaps. Use this if you do not have LaTeX # installed or if you want to formulas look prettier in the HTML output. When # enabled you may also need to install MathJax separately and configure the path # to it using the MATHJAX_RELPATH option. @@ -1533,7 +1539,7 @@ SERVER_BASED_SEARCH = NO # external search engine pointed to by the SEARCHENGINE_URL option to obtain the # search results. # -# Doxygen ships with an example indexer ( doxyindexer) and search engine +# Doxygen ships with an example indexer (doxyindexer) and search engine # (doxysearch.cgi) which are based on the open source search engine library # Xapian (see: http://xapian.org/). # @@ -1546,7 +1552,7 @@ EXTERNAL_SEARCH = NO # The SEARCHENGINE_URL should point to a search engine hosted by a web server # which will return the search results when EXTERNAL_SEARCH is enabled. # -# Doxygen ships with an example indexer ( doxyindexer) and search engine +# Doxygen ships with an example indexer (doxyindexer) and search engine # (doxysearch.cgi) which are based on the open source search engine library # Xapian (see: http://xapian.org/). See the section "External Indexing and # Searching" for details. @@ -1584,7 +1590,7 @@ EXTRA_SEARCH_MAPPINGS = # Configuration options related to the LaTeX output #--------------------------------------------------------------------------- -# If the GENERATE_LATEX tag is set to YES doxygen will generate LaTeX output. +# If the GENERATE_LATEX tag is set to YES, doxygen will generate LaTeX output. # The default value is: YES. GENERATE_LATEX = NO @@ -1615,7 +1621,7 @@ LATEX_CMD_NAME = latex MAKEINDEX_CMD_NAME = makeindex -# If the COMPACT_LATEX tag is set to YES doxygen generates more compact LaTeX +# 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. # The default value is: NO. @@ -1650,9 +1656,9 @@ EXTRA_PACKAGES = # Note: Only use a user-defined header if you know what you are doing! The # following commands have a special meaning inside the header: $title, # $datetime, $date, $doxygenversion, $projectname, $projectnumber, -# $projectbrief, $projectlogo. Doxygen will replace $title with the empy string, -# for the replacement values of the other commands the user is refered to -# HTML_HEADER. +# $projectbrief, $projectlogo. Doxygen will replace $title with the empty +# string, for the replacement values of the other commands the user is referred +# to HTML_HEADER. # This tag requires that the tag GENERATE_LATEX is set to YES. LATEX_HEADER = @@ -1668,6 +1674,17 @@ LATEX_HEADER = LATEX_FOOTER = +# The LATEX_EXTRA_STYLESHEET tag can be used to specify additional user-defined +# LaTeX style sheets that are included after the standard style sheets created +# by doxygen. Using this option one can overrule certain style aspects. Doxygen +# will copy the style sheet files to the output directory. +# Note: The order of the extra style sheet files is of importance (e.g. the last +# style sheet in the list overrules the setting of the previous ones in the +# list). +# This tag requires that the tag GENERATE_LATEX is set to YES. + +LATEX_EXTRA_STYLESHEET = + # The LATEX_EXTRA_FILES tag can be used to specify one or more extra images or # other source files which should be copied to the LATEX_OUTPUT output # directory. Note that the files will be copied as-is; there are no commands or @@ -1686,7 +1703,7 @@ LATEX_EXTRA_FILES = PDF_HYPERLINKS = YES # If the USE_PDFLATEX tag is set to YES, doxygen will use pdflatex to generate -# the PDF file directly from the LaTeX files. Set this option to YES to get a +# the PDF file directly from the LaTeX files. Set this option to YES, to get a # higher quality PDF documentation. # The default value is: YES. # This tag requires that the tag GENERATE_LATEX is set to YES. @@ -1731,7 +1748,7 @@ LATEX_BIB_STYLE = plain # Configuration options related to the RTF output #--------------------------------------------------------------------------- -# If the GENERATE_RTF tag is set to YES doxygen will generate RTF output. The +# 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 too pretty with other RTF # readers/editors. # The default value is: NO. @@ -1746,7 +1763,7 @@ GENERATE_RTF = NO RTF_OUTPUT = rtf -# If the COMPACT_RTF tag is set to YES doxygen generates more compact 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. # The default value is: NO. @@ -1783,11 +1800,21 @@ RTF_STYLESHEET_FILE = RTF_EXTENSIONS_FILE = +# If the RTF_SOURCE_CODE tag is set to YES then doxygen will include source code +# with syntax highlighting in the RTF output. +# +# Note that which sources are shown also depends on other settings such as +# SOURCE_BROWSER. +# The default value is: NO. +# This tag requires that the tag GENERATE_RTF is set to YES. + +RTF_SOURCE_CODE = NO + #--------------------------------------------------------------------------- # Configuration options related to the man page output #--------------------------------------------------------------------------- -# If the GENERATE_MAN tag is set to YES doxygen will generate man pages for +# If the GENERATE_MAN tag is set to YES, doxygen will generate man pages for # classes and files. # The default value is: NO. @@ -1831,7 +1858,7 @@ 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 +# 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. # The default value is: NO. @@ -1845,7 +1872,7 @@ GENERATE_XML = NO XML_OUTPUT = xml -# If the XML_PROGRAMLISTING tag is set to YES doxygen will dump the program +# 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. @@ -1858,7 +1885,7 @@ XML_PROGRAMLISTING = YES # Configuration options related to the DOCBOOK output #--------------------------------------------------------------------------- -# If the GENERATE_DOCBOOK tag is set to YES doxygen will generate Docbook files +# If the GENERATE_DOCBOOK tag is set to YES, doxygen will generate Docbook files # that can be used to generate PDF. # The default value is: NO. @@ -1872,7 +1899,7 @@ GENERATE_DOCBOOK = NO DOCBOOK_OUTPUT = docbook -# If the DOCBOOK_PROGRAMLISTING tag is set to YES doxygen will include the +# If the DOCBOOK_PROGRAMLISTING tag is set to YES, doxygen will include the # program listings (including syntax highlighting and cross-referencing # information) to the DOCBOOK output. Note that enabling this will significantly # increase the size of the DOCBOOK output. @@ -1885,10 +1912,10 @@ DOCBOOK_PROGRAMLISTING = NO # Configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- -# If the GENERATE_AUTOGEN_DEF tag is set to YES doxygen will generate an AutoGen -# Definitions (see http://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. +# If the GENERATE_AUTOGEN_DEF tag is set to YES, doxygen will generate an +# AutoGen Definitions (see http://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. # The default value is: NO. GENERATE_AUTOGEN_DEF = NO @@ -1897,7 +1924,7 @@ 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 +# 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. @@ -1905,7 +1932,7 @@ GENERATE_AUTOGEN_DEF = NO GENERATE_PERLMOD = NO -# If the PERLMOD_LATEX tag is set to YES doxygen will generate the necessary +# 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. # The default value is: NO. @@ -1913,9 +1940,9 @@ GENERATE_PERLMOD = NO PERLMOD_LATEX = NO -# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be nicely +# 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 +# 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. # The default value is: YES. @@ -1935,14 +1962,14 @@ PERLMOD_MAKEVAR_PREFIX = # Configuration options related to the preprocessor #--------------------------------------------------------------------------- -# If the ENABLE_PREPROCESSING tag is set to YES doxygen will evaluate all +# If the ENABLE_PREPROCESSING tag is set to YES, doxygen will evaluate all # C-preprocessor directives found in the sources and include files. # The default value is: YES. 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 only conditional compilation will be +# If the MACRO_EXPANSION tag is set to YES, doxygen will expand all macro names +# in the source code. If set to NO, only conditional compilation will be # performed. Macro expansion can be done in a controlled way by setting # EXPAND_ONLY_PREDEF to YES. # The default value is: NO. @@ -1958,7 +1985,7 @@ MACRO_EXPANSION = YES EXPAND_ONLY_PREDEF = YES -# If the SEARCH_INCLUDES tag is set to YES the includes files in the +# If the SEARCH_INCLUDES tag is set to YES, the include files in the # INCLUDE_PATH will be searched if a #include is found. # The default value is: YES. # This tag requires that the tag ENABLE_PREPROCESSING is set to YES. @@ -2037,20 +2064,21 @@ TAGFILES = GENERATE_TAGFILE = -# If the ALLEXTERNALS tag is set to YES all external class will be listed in the -# class index. If set to NO only the inherited external classes will be listed. +# If the ALLEXTERNALS tag is set to YES, all external class will be listed in +# the class index. If set to NO, only the inherited external classes will be +# listed. # The default value is: NO. 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 +# 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. # The default value is: YES. EXTERNAL_GROUPS = YES -# If the EXTERNAL_PAGES tag is set to YES all external pages will be listed in +# If the EXTERNAL_PAGES tag is set to YES, all external pages will be listed in # the related pages index. If set to NO, only the current project's pages will # be listed. # The default value is: YES. @@ -2067,7 +2095,7 @@ PERL_PATH = /usr/bin/perl # Configuration options related to the dot tool #--------------------------------------------------------------------------- -# If the CLASS_DIAGRAMS tag is set to YES doxygen will generate a class diagram +# If the CLASS_DIAGRAMS tag is set to YES, doxygen will generate a class diagram # (in HTML and LaTeX) for classes with base or super classes. Setting the tag to # NO turns the diagrams off. Note that this option also works with HAVE_DOT # disabled, but it is recommended to install and use dot, since it yields more @@ -2092,7 +2120,7 @@ MSCGEN_PATH = DIA_PATH = -# If set to YES, the inheritance and collaboration graphs will hide inheritance +# 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. # The default value is: YES. @@ -2165,7 +2193,7 @@ COLLABORATION_GRAPH = NO GROUP_GRAPHS = YES -# If the UML_LOOK tag is set to YES doxygen will generate inheritance and +# 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. # The default value is: NO. @@ -2303,10 +2331,14 @@ DIAFILE_DIRS = # PlantUML is not used or called during a preprocessing step. Doxygen will # generate a warning when it encounters a \startuml command in this case and # will not generate output for the diagram. -# This tag requires that the tag HAVE_DOT is set to YES. PLANTUML_JAR_PATH = +# When using plantuml, the specified paths are searched for files specified by +# the !include statement in a plantuml block. + +PLANTUML_INCLUDE_PATH = + # 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 @@ -2343,7 +2375,7 @@ MAX_DOT_GRAPH_DEPTH = 2 DOT_TRANSPARENT = YES -# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output +# Set the DOT_MULTI_TARGETS tag to YES to 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. @@ -2360,7 +2392,7 @@ DOT_MULTI_TARGETS = NO GENERATE_LEGEND = YES -# If the DOT_CLEANUP tag is set to YES doxygen will remove the intermediate dot +# If the DOT_CLEANUP tag is set to YES, doxygen will remove the intermediate dot # files that are used to generate the various graphs. # The default value is: YES. # This tag requires that the tag HAVE_DOT is set to YES. diff --git a/Firmware/LUFA/makefile b/Firmware/LUFA/makefile index 88449a9..7e7a9c3 100644 --- a/Firmware/LUFA/makefile +++ b/Firmware/LUFA/makefile @@ -1,6 +1,6 @@ # # LUFA Library -# Copyright (C) Dean Camera, 2014. +# Copyright (C) Dean Camera, 2017. # # dean [at] fourwalledcubicle [dot] com # www.lufa-lib.org @@ -9,45 +9,32 @@ # Makefile for the LUFA library itself. # --------------------------------------- -LUFA_VERSION_NUM = $(shell grep LUFA_VERSION_STRING $(LUFA_PATH)/Version.h | cut -d'"' -f2) -EXCLUDE_FROM_EXPORT := Documentation DoxygenPages CodeTemplates Build StudioIntegration doxyfile *.tar *.o *.d *.lss *.lst *.hex *.elf *.hex *.eep *.map *.bin +LUFA_VERSION_NUM := $(shell grep LUFA_VERSION_STRING $(LUFA_PATH)/Version.h | cut -d'"' -f2) # Default target - no default action when attempting to build the core directly all: -# Export the library core as a TAR archive for importing into an IDE -export_tar: - @echo Exporting LUFA library to a TAR archive... - @tar -cf LUFA_$(LUFA_VERSION_NUM).tar --directory=. $(EXCLUDE_FROM_EXPORT:%=--exclude=%) * - @tar -cf LUFA_$(LUFA_VERSION_NUM)_Code_Templates.tar CodeTemplates - @echo Export LUFA_$(LUFA_VERSION_NUM).tar complete. - # Display the LUFA version of this library copy version: @echo "LUFA $(LUFA_VERSION_NUM)" -# Check if this is being included from a legacy or non LUFA build system makefile -ifneq ($(LUFA_PATH),) - LUFA_ROOT_PATH = $(patsubst %/,%,$(LUFA_PATH))/LUFA/ - - include $(patsubst %/,%,$(LUFA_PATH))/LUFA/Build/lufa_sources.mk -else - LUFA_BUILD_MODULES += MASTER - LUFA_BUILD_TARGETS += export_tar version +LUFA_PATH := . +ARCH := {AVR8,UC3,XMEGA} +DOXYGEN_OVERRIDE_PARAMS := QUIET=YES PROJECT_NUMBER=$(LUFA_VERSION_NUM) - LUFA_PATH = . - ARCH = {AVR8,UC3,XMEGA} - DOXYGEN_OVERRIDE_PARAMS = QUIET=YES PROJECT_NUMBER=$(LUFA_VERSION_NUM) - - # Remove all object and associated files from the LUFA library core - clean: +# Remove all object and associated files from the LUFA library core +clean: rm -f $(LUFA_SRC_ALL_FILES:%.c=%.o) rm -f $(LUFA_SRC_ALL_FILES:%.c=%.d) rm -f $(LUFA_SRC_ALL_FILES:%.c=%.lst) - include Build/lufa_core.mk - include Build/lufa_sources.mk - include Build/lufa_doxygen.mk -endif +# Include LUFA-specific DMBS extension modules +DMBS_LUFA_PATH ?= $(LUFA_PATH)/Build/LUFA +include $(DMBS_LUFA_PATH)/lufa-sources.mk + +# Include common DMBS build system modules +DMBS_PATH ?= $(LUFA_PATH)/Build/DMBS/DMBS +include $(DMBS_PATH)/core.mk +include $(DMBS_PATH)/doxygen.mk -.PHONY: all export_tar version clean +.PHONY: all version From b078a4356e9bdc3b574323c441915d1894dfe9db Mon Sep 17 00:00:00 2001 From: Fergus Leahy Date: Wed, 5 Sep 2018 20:56:27 +0100 Subject: [PATCH 03/15] Updated Chrome webapp to support Switch Hori Controller - Added relevant vendor/product ids to manifest - Updated code to support V0 (OSU) and V2 (Switch) - Correctly updates configuration based on version, as versions use differing configuration layouts and sizes --- Software/Tataconfig/manifest.json | 1 + Software/Tataconfig/tataconfig.js | 108 +++++++++++++++++++++++++++--- 2 files changed, 101 insertions(+), 8 deletions(-) diff --git a/Software/Tataconfig/manifest.json b/Software/Tataconfig/manifest.json index 3d982d3..c4b0d2b 100644 --- a/Software/Tataconfig/manifest.json +++ b/Software/Tataconfig/manifest.json @@ -15,6 +15,7 @@ "usbDevices": [ { "vendorId": 5840, "productId": 2669, "__comment" : "Configuration" }, + { "vendorId": 3853, "productId": 146, "__comment" : "Configuration Switch Controller" }, { "vendorId": 1003, "productId": 8295, "__comment" : "Firmware update" } ] } diff --git a/Software/Tataconfig/tataconfig.js b/Software/Tataconfig/tataconfig.js index 91aa8c8..9cb708c 100644 --- a/Software/Tataconfig/tataconfig.js +++ b/Software/Tataconfig/tataconfig.js @@ -1,7 +1,8 @@ (function() { var devices = []; var debounceOptions = [["Off", 0], ["Low", 15], ["Medium", 30], ["High", 50]]; - var configBytes = { + var configBytes; + var configBytesV1 = { donL : 0, katL : 1, donR : 2, @@ -11,20 +12,47 @@ version : 6, reset : 7 }; - + var configBytesV2 = { + donL : 0, + katL : 2, + donR : 4, + katR : 6, + leds : 8, + debounce : 9, + version : 10, + reset : 11, + }; + var configKeyV2 = { + donL : 0, + katL : 1, + donR : 2, + katR : 3, + }; + var VERSION_OSU = 1; + var VERSION_SWITCH = 2; + var majorVersion; + var version; var magicResetNumber = 42; - + // USB device filter to get config device (Hori gamepad also appears otherwise) + var tataconConfigFilter = 65500; + // Valid vendor IDs including mon.im's OSU vendor and Hori Vendor IDs + var vendorIds = [0x16D0, 0x0F0D]; var newDevice = function(device) { - if(device.vendorId == 0x16D0) { // Config mode + // Grab device matching our vendor IDs and the config profile + // Perform filter here, as filter doesn't work on listener + if(vendorIds.includes(device.vendorId) && device.collections[0].usagePage == tataconConfigFilter) { console.log("Added new device with ID " + device.deviceId); chrome.hid.connect(device.deviceId, function(connection) { + var dev = {devId: device.deviceId, connId : connection.connectionId}; + console.log(device); devices.push(dev); chrome.hid.receive(connection.connectionId, function(id, data) { var view = new Uint8ClampedArray(data); dev.config = view; console.log("Got config: " + view); dev.newConfig = view.slice(0); + dev.data = data; createConfigUI(dev); }) }); @@ -42,7 +70,18 @@ var title = document.createElement("div"); title.className = "title"; - title.textContent = "Tatacon to USB v" + device.config[configBytes.version]/10; + version = device.config[device.config.length - 2]/10; + // Get truncated version number (OSU/Switch) + majorVersion = (version|0); + // Set config bytes layout based on version (8bit vs 16bit uints) + if (majorVersion == VERSION_OSU) { + title.textContent = "Tatacon to USB (v"; + configBytes = configBytesV1; + } else if (majorVersion == VERSION_SWITCH) { + title.textContent = "Tatacon to Switch (v"; + configBytes = configBytesV2; + } + title.textContent += device.config[device.config.length - 2]/10 + ")"; ui.appendChild(title); var tatacon = document.createElement("div"); @@ -53,16 +92,34 @@ select.className = swtch; device[swtch] = select; tatacon.appendChild(select); - - scancodes.forEach(function(code) { + if (majorVersion == VERSION_OSU) { + scancodes.forEach(function(code) { var option = document.createElement("option"); option.value = code.value; option.textContent = code.name; select.appendChild(option); }); + } else if (majorVersion == VERSION_SWITCH) { + switchcodes.forEach(function(code) { + var option = document.createElement("option"); + option.value = code.value; + option.textContent = code.name; + select.appendChild(option); + }); + } select.onchange = function() { + console.log(device.newConfig); + console.log("Version:" + majorVersion); + if (majorVersion == VERSION_SWITCH) { + // Write new button to buffer as little endian uint16 + var dv = new DataView(device.newConfig.buffer); + dv.setUint16(configBytes[swtch], select.value, true); + console.log(device.newConfig); + } + else if(majorVersion == VERSION_OSU) { device.newConfig[configBytes[swtch]] = select.value; - updateUI(device); + } + updateUI(device); } }); @@ -137,10 +194,19 @@ resetDefaults.textContent = "Defaults"; resetDefaults.onclick = function() { // SWITCH ORDER: CenterLeft, RimLeft, CenterRight, RimRight + if (majorVersion == VERSION_OSU) { device.newConfig[configBytes.donL] = 0x1B; // X device.newConfig[configBytes.katL] = 0x1D; // Z device.newConfig[configBytes.donR] = 0x06; // C device.newConfig[configBytes.katR] = 0x19; // V + } else if (majorVersion == VERSION_SWITCH) { + // Set defaults (little endian uint16) + var dv = new DataView(device.newConfig.buffer); + dv.setUint16(configBytes.donL, 0x10, true); // L + dv.setUint16(configBytes.katL, 0x400, true); // LSTICK + dv.setUint16(configBytes.donR, 0x20, true); // R + dv.setUint16(configBytes.katR, 0x800, true); // RSTICK + } device.newConfig[configBytes.leds] = 1; // LEDs on device.newConfig[configBytes.debounce] = debounceOptions[2][1]; // medium debounce updateUI(device); @@ -177,7 +243,15 @@ var updateUI = function(device) { ["donL", "katL", "donR", "katR"].forEach(function(swtch) { + if (majorVersion == VERSION_OSU) { device[swtch].value = device.newConfig[configBytes[swtch]]; + + } else if (majorVersion == VERSION_SWITCH) { + // Read button info as little endian uint16 + var dv = new DataView(device.newConfig.buffer); + device[swtch].value = dv.getUint16(configBytes[swtch], true); + console.log(device[swtch].value); + } }); device.leds.checked = device.newConfig[configBytes.leds]; @@ -237,12 +311,30 @@ chrome.runtime.lastError.message); return; } + console.log(devices); devices.forEach(newDevice); }) chrome.hid.onDeviceAdded.addListener(newDevice); chrome.hid.onDeviceRemoved.addListener(deviceRemoved); }); +var switchcodes = [ +{name: "Y", value: 0x01}, +{name: "B", value: 0x02}, +{name: "A", value: 0x04}, +{name: "X", value: 0x08}, +{name: "L", value: 0x10}, +{name: "R", value: 0x20}, +{name: "ZL", value: 0x40}, +{name: "ZR", value: 0x80}, +{name: "MINUS", value: 0x100}, +{name: "PLUS", value: 0x200}, +{name: "LCLICK", value: 0x400}, +{name: "RCLICK", value: 0x800}, +{name: "HOME", value: 0x1000}, +{name: "CAPTURE", value: 0x2000} +] + var scancodes = [ {name: "A", value: 0x04}, {name: "B", value: 0x05}, From b7648cec833ede8361f93db26eb056c80d7f81ff Mon Sep 17 00:00:00 2001 From: Fergus Leahy Date: Wed, 5 Sep 2018 21:00:17 +0100 Subject: [PATCH 04/15] Updated readme with Linux udev help --- README.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/README.md b/README.md index af9b967..0ab96af 100644 --- a/README.md +++ b/README.md @@ -36,3 +36,19 @@ Program the HID bootloader and clock fuses via `make init` and an SPI programmer The makefile is by default setup to use the USBAsp. I recommend pogo pins in a breadboard + USB connection for power. From there, program by hitting the hardware reset button, then `make flash`. + + + +## Linux use +In order to use with the chrome configuration app, linux users must edit their udev rules. + +### UDEV rules +Write in /etc/udev/rules.d/50-tatacon.rules: +``` +#Original firmware for PC/OSU +ATTRS{manufacturer}=="mon.im", MODE:="0664", GROUP:="plugdev" + +#Switch/WiiU Hori Pokken Pad +SUBSYSTEM=="usb", ATTR{idVendor}=="0f0d", ATTR{idProduct}=="0092", MODE="0664", GROUP="plugdev" +KERNEL=="hidraw*", ATTRS{idVendor}=="0f0d", ATTRS{idProduct}=="0092", MODE="0664", GROUP="plugdev" +``` \ No newline at end of file From c332e6df39d3790f908a8bb89b2c87b223d4045c Mon Sep 17 00:00:00 2001 From: Fergus Leahy Date: Wed, 5 Sep 2018 21:08:21 +0100 Subject: [PATCH 05/15] Updated readme with Nintendo Switch info --- README.md | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 0ab96af..9347644 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ # TataconUSB -A small dongle to connect your Wii taiko controller to your computer as a USB +A small dongle to connect your Wii taiko controller to your Nintendo Switch or computer as a USB device, instead of using Bluetooth. [Purchase here](https://mon.im/tatacon/) @@ -13,12 +13,17 @@ device, instead of using Bluetooth. - Sweet LEDs (can be turned off) - Responds so fast you can bounce your sticks and get multi hits. Can be turned off with Debounce feature. - Tested working on official, Hori and knockoff controllers -- Windows, Linux, Mac compatible + [cross platform Chrome app for configuration](https://chrome.google.com/webstore/detail/tataconfig/ndeibflmpllogilncdmoajadcopjkchg) +- Nintendo Switch, Windows, Linux, Mac compatible + [cross platform Chrome app for configuration](https://chrome.google.com/webstore/detail/tataconfig/ndeibflmpllogilncdmoajadcopjkchg) - Config app allows future firmware updates to add more features - No drivers required! ## Building firmware: -At console, run `make`. You will need AVR GCC installed. +Open a console. +To build the PC firmware navigate to `firmware/Keyboard`. +To build the Nintendo Switch firmware navigate to `firmware/SwitchPro`. +Run `make`. You will need AVR GCC installed. + +To install hit the reset button, then `make flash`. ## Building software: It's a Chrome web app. Install it like a normal dev app. From 94f5fa51bcbae1957b11331e3a341226bc3615e8 Mon Sep 17 00:00:00 2001 From: Fergus Leahy Date: Wed, 5 Sep 2018 23:07:36 +0100 Subject: [PATCH 06/15] Updated Switch firmware to support the configuration app + debounce - Like Keyboard firmware, supports Joystick and HID configuration - Switch firmware now supports custom button assignment based on the switch pro controller buttons - Added debouncing back to match keyboard firmware - Updated makefile to add usbclass for configuration --- Firmware/SwitchPro/Config.c | 2 +- Firmware/SwitchPro/Config.h | 4 +- Firmware/SwitchPro/Descriptors.c | 105 ++++++++++++++++++++++++--- Firmware/SwitchPro/Descriptors.h | 14 ++++ Firmware/SwitchPro/Joystick.c | 119 ++++++++++++++++++++++++------- Firmware/SwitchPro/Joystick.h | 11 ++- Firmware/SwitchPro/makefile | 2 +- 7 files changed, 214 insertions(+), 43 deletions(-) diff --git a/Firmware/SwitchPro/Config.c b/Firmware/SwitchPro/Config.c index 575413c..5197928 100644 --- a/Firmware/SwitchPro/Config.c +++ b/Firmware/SwitchPro/Config.c @@ -12,7 +12,7 @@ static const tatacon_config_t defaults PROGMEM = { // ---- osu default SWITCH_LCLICK, SWITCH_L, - SWITCH_A, + SWITCH_RCLICK, SWITCH_R }, .ledsOn = true, .debounce = 30 diff --git a/Firmware/SwitchPro/Config.h b/Firmware/SwitchPro/Config.h index 6cb27b2..da3db28 100644 --- a/Firmware/SwitchPro/Config.h +++ b/Firmware/SwitchPro/Config.h @@ -7,9 +7,9 @@ // For ease of code sharing with the OsuPad #define KB_SWITCHES 4 -#define TATACON_CONFIG_BYTES 8 +#define TATACON_CONFIG_BYTES 12 #define MAGIC_RESET_NUMBER 42 -#define FIRMWARE_VERSION 1 +#define FIRMWARE_VERSION 20 typedef struct { // SWITCH ORDER: CenterLeft, RimLeft, CenterRight, RimRight diff --git a/Firmware/SwitchPro/Descriptors.c b/Firmware/SwitchPro/Descriptors.c index c59986a..39824fd 100644 --- a/Firmware/SwitchPro/Descriptors.c +++ b/Firmware/SwitchPro/Descriptors.c @@ -1,5 +1,5 @@ #include "Descriptors.h" - +#include "Config.h" // HID Descriptors. const USB_Descriptor_HIDReport_Datatype_t PROGMEM JoystickReport[] = { HID_RI_USAGE_PAGE(8,1), /* Generic Desktop */ @@ -57,6 +57,32 @@ const USB_Descriptor_HIDReport_Datatype_t PROGMEM JoystickReport[] = { HID_RI_END_COLLECTION(0), }; +/** HID class report descriptor. This is a special descriptor constructed with values from the + * USBIF HID class specification to describe the reports and capabilities of the HID device. This + * descriptor is parsed by the host and its contents used to determine what data (and in what encoding) + * the device will send, and what it may be sent back from the host. Refer to the HID specification for + * more details on HID report descriptors. + */ +const USB_Descriptor_HIDReport_Datatype_t PROGMEM GenericReport[] = +{ + HID_RI_USAGE_PAGE(16, 0xFFDC), /* Vendor Page 0xDC */ + HID_RI_USAGE(8, 0xFB), /* Vendor Usage 0xFB */ + HID_RI_COLLECTION(8, 0x01), /* Vendor Usage 1 */ + HID_RI_USAGE(8, 0x02), /* Vendor Usage 2 */ + HID_RI_LOGICAL_MINIMUM(8, 0x00), + HID_RI_LOGICAL_MAXIMUM(8, 0xFF), + HID_RI_REPORT_SIZE(8, 8), + HID_RI_REPORT_COUNT(8, TATACON_CONFIG_BYTES), + HID_RI_OUTPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE | HID_IOF_NON_VOLATILE), + + HID_RI_USAGE(8, 0x02), /* Vendor Usage 2 */ + HID_RI_LOGICAL_MINIMUM(8, 0x00), + HID_RI_LOGICAL_MAXIMUM(8, 0xFF), + HID_RI_REPORT_SIZE(8, 8), + HID_RI_REPORT_COUNT(8, TATACON_CONFIG_BYTES), + HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE | HID_IOF_NON_VOLATILE), + HID_RI_END_COLLECTION(0), +}; // Device Descriptor Structure const USB_Descriptor_Device_t PROGMEM DeviceDescriptor = { .Header = {.Size = sizeof(USB_Descriptor_Device_t), .Type = DTYPE_Device}, @@ -86,7 +112,7 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor = { .Header = {.Size = sizeof(USB_Descriptor_Configuration_Header_t), .Type = DTYPE_Configuration}, .TotalConfigurationSize = sizeof(USB_Descriptor_Configuration_t), - .TotalInterfaces = 1, + .TotalInterfaces = 2, .ConfigurationNumber = 1, .ConfigurationStrIndex = NO_DESCRIPTOR, @@ -142,6 +168,42 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor = { .EndpointSize = JOYSTICK_EPSIZE, .PollingIntervalMS = 0x05 }, + .HID2_Interface = + { + .Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, + + .InterfaceNumber = INTERFACE_ID_Generic, + .AlternateSetting = 0x00, + + .TotalEndpoints = 1, + + .Class = HID_CSCP_HIDClass, + .SubClass = HID_CSCP_NonBootSubclass, + .Protocol = HID_CSCP_NonBootProtocol, + + .InterfaceStrIndex = STRING_ID_Config + }, + + .HID2_VendorHID = + { + .Header = {.Size = sizeof(USB_HID_Descriptor_HID_t), .Type = HID_DTYPE_HID}, + + .HIDSpec = VERSION_BCD(1,1,1), + .CountryCode = 0x00, + .TotalReportDescriptors = 1, + .HIDReportType = HID_DTYPE_Report, + .HIDReportLength = sizeof(GenericReport) + }, + + .HID2_ReportINEndpoint = + { + .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, + + .EndpointAddress = GENERIC_EPADDR, + .Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), + .EndpointSize = GENERIC_EPSIZE, + .PollingIntervalMS = 255 + }, }; // Language Descriptor Structure @@ -150,7 +212,8 @@ const USB_Descriptor_String_t PROGMEM LanguageString = USB_STRING_DESCRIPTOR_ARR // Manufacturer and Product Descriptor Strings const USB_Descriptor_String_t PROGMEM ManufacturerString = USB_STRING_DESCRIPTOR(L"HORI CO.,LTD."); const USB_Descriptor_String_t PROGMEM ProductString = USB_STRING_DESCRIPTOR(L"POKKEN CONTROLLER"); - +const USB_Descriptor_String_t PROGMEM ConfigString = USB_STRING_DESCRIPTOR(L"Tatacon Config"); +const USB_Descriptor_String_t PROGMEM TataconString = USB_STRING_DESCRIPTOR(L"Tatacon"); // USB Device Callback - Get Descriptor uint16_t CALLBACK_USB_GetDescriptor( const uint16_t wValue, @@ -174,8 +237,7 @@ uint16_t CALLBACK_USB_GetDescriptor( Size = sizeof(USB_Descriptor_Configuration_t); break; case DTYPE_String: - switch (DescriptorNumber) - { + switch (DescriptorNumber) { case STRING_ID_Language: Address = &LanguageString; Size = pgm_read_byte(&LanguageString.Header.Size); @@ -188,16 +250,37 @@ uint16_t CALLBACK_USB_GetDescriptor( Address = &ProductString; Size = pgm_read_byte(&ProductString.Header.Size); break; + case STRING_ID_Config: + Address = &ConfigString; + Size = pgm_read_byte(&ConfigString.Header.Size); + break; + case STRING_ID_Tatacon: + Address = &TataconString; + Size = pgm_read_byte(&TataconString.Header.Size); + break; } - break; case DTYPE_HID: - Address = &ConfigurationDescriptor.HID_JoystickHID; - Size = sizeof(USB_HID_Descriptor_HID_t); - break; + switch (wIndex) { + case INTERFACE_ID_Joystick: + Address = &ConfigurationDescriptor.HID_JoystickHID; + Size = sizeof(USB_HID_Descriptor_HID_t); + break; + case INTERFACE_ID_Generic: + Address = &ConfigurationDescriptor.HID2_VendorHID; + break; + } case DTYPE_Report: - Address = &JoystickReport; - Size = sizeof(JoystickReport); + switch (wIndex) { + case INTERFACE_ID_Joystick: + Address = &JoystickReport; + Size = sizeof(JoystickReport); + break; + case INTERFACE_ID_Generic: + Address = &GenericReport; + Size = sizeof(GenericReport); + break; + } break; } diff --git a/Firmware/SwitchPro/Descriptors.h b/Firmware/SwitchPro/Descriptors.h index dd68463..729515f 100644 --- a/Firmware/SwitchPro/Descriptors.h +++ b/Firmware/SwitchPro/Descriptors.h @@ -17,12 +17,19 @@ typedef struct USB_HID_Descriptor_HID_t HID_JoystickHID; USB_Descriptor_Endpoint_t HID_ReportOUTEndpoint; USB_Descriptor_Endpoint_t HID_ReportINEndpoint; + + // Generic HID Interface + USB_Descriptor_Interface_t HID2_Interface; + USB_HID_Descriptor_HID_t HID2_VendorHID; + USB_Descriptor_Endpoint_t HID2_ReportINEndpoint; } USB_Descriptor_Configuration_t; // Device Interface Descriptor IDs enum InterfaceDescriptors_t { INTERFACE_ID_Joystick = 0, /**< Joystick interface descriptor ID */ + INTERFACE_ID_Generic = 1, /**< Generic interface descriptor ID */ + }; // Device String Descriptor IDs @@ -31,6 +38,8 @@ enum StringDescriptors_t STRING_ID_Language = 0, // Supported Languages string descriptor ID (must be zero) STRING_ID_Manufacturer = 1, // Manufacturer string ID STRING_ID_Product = 2, // Product string ID + STRING_ID_Config = 3, /**< Config string ID */ + STRING_ID_Tatacon = 4, /**< Config string ID */ }; // Macros @@ -45,6 +54,11 @@ enum StringDescriptors_t #define DTYPE_HID 0x21 // Descriptor Header Type - HID Class HID Report Descriptor #define DTYPE_Report 0x22 + +#define GENERIC_EPADDR (ENDPOINT_DIR_IN | 2) + +/** Size in bytes of the Keyboard HID reporting IN endpoint. */ +#define GENERIC_EPSIZE TATACON_CONFIG_BYTES // Function Prototypes uint16_t CALLBACK_USB_GetDescriptor( diff --git a/Firmware/SwitchPro/Joystick.c b/Firmware/SwitchPro/Joystick.c index cb8733f..8e6d305 100644 --- a/Firmware/SwitchPro/Joystick.c +++ b/Firmware/SwitchPro/Joystick.c @@ -6,16 +6,23 @@ #include "usbio.h" #include #endif -static const tatacon_config_t tata= { - .switches = { - // SWITCH ORDER: CenterLeft, RimLeft, CenterRight, RimRight - // ---- osu default - SWITCH_LCLICK, - SWITCH_L, - SWITCH_RCLICK, - SWITCH_R }, - .ledsOn = true, - .debounce = 30 + +static uint8_t PrevGenericHIDReportBuffer[TATACON_CONFIG_BYTES]; + +USB_ClassInfo_HID_Device_t Generic_HID_Interface = +{ + .Config = + { + .InterfaceNumber = INTERFACE_ID_Generic, + .ReportINEndpoint = + { + .Address = GENERIC_EPADDR, + .Size = GENERIC_EPSIZE, + .Banks = 1, + }, + .PrevReportINBuffer = PrevGenericHIDReportBuffer, + .PrevReportINBufferSize = sizeof(PrevGenericHIDReportBuffer), + }, }; // V1 hardware has no LEDs #ifdef V1_BUILD @@ -54,15 +61,18 @@ static uint8_t switchesChanged = 1; static uint8_t nunchuckReady = 0; // Main entry point. int main(void) { + InitConfig(); + // We'll start by performing hardware and peripheral setup. SetupHardware(); // We'll then enable global interrupts for our use. GlobalInterruptEnable(); // Once that's done, we'll enter an infinite loop. - for (;;) - { - // We need to run our task to process and deliver data for our IN and OUT endpoints. - HID_Task(); + for (;;) { + // We need to run our task to process and deliver data for our IN and OUT endpoints. + HID_Device_USBTask(&Generic_HID_Interface); + HID_Task(); + // We also need to run the main USB management task. USB_USBTask(); } @@ -254,11 +264,11 @@ void GetNextReport(USB_JoystickReport_Input_t* const reportData) { for(i = 0; i < TATACON_SWITCHES; i++) { // The I2C data starts at the 6th bit and goes down uint8_t newState = !(data & _BV(TATACON_BUTTONS_START - i)); - if(newState) { + if(newState && !switches[i].debounce) { SET(LED_PORT, KAT_LED_PIN); - reportData->Button |= tata.switches[i]; + reportData->Button |= tataConfig.switches[i]; switches[i].state = newState; - switches[i].debounce = tata.debounce; + switches[i].debounce = tataConfig.debounce; switchesChanged = 1; } } @@ -327,29 +337,84 @@ void EVENT_USB_Device_ConfigurationChanged(void) { // We setup the HID report endpoints. ConfigSuccess &= Endpoint_ConfigureEndpoint(JOYSTICK_OUT_EPADDR, EP_TYPE_INTERRUPT, JOYSTICK_EPSIZE, 1); ConfigSuccess &= Endpoint_ConfigureEndpoint(JOYSTICK_IN_EPADDR, EP_TYPE_INTERRUPT, JOYSTICK_EPSIZE, 1); + HID_Device_ConfigureEndpoints(&Generic_HID_Interface); // We can read ConfigSuccess to indicate a success or failure at this point. if (ConfigSuccess) { CLEAR(LED_PORT, DON_LED_PIN); CLEAR(LED_PORT, KAT_LED_PIN); } + USB_Device_EnableSOFEvents(); + } // Process control requests sent to the device from the USB host. void EVENT_USB_Device_ControlRequest(void) { // We can handle two control requests: a GetReport and a SetReport. + HID_Device_ProcessControlRequest(&Generic_HID_Interface); // Not used here, it looks like we don't receive control request from the Switch. } -// // Event handler for the USB device Start Of Frame event. -// void EVENT_USB_Device_StartOfFrame(void) { -// //HID_Device_MillisecondElapsed(&Keyboard_HID_Interface); -// // HID_Device_MillisecondElapsed(&Generic_HID_Interface); +// Event handler for the USB device Start Of Frame event. +void EVENT_USB_Device_StartOfFrame(void) { + HID_Device_MillisecondElapsed(&Generic_HID_Interface); -// for(int i = 0; i < TATACON_SWITCHES; i++) { -// if(switches[i].debounce) { -// switches[i].debounce--; -// } -// } -// } \ No newline at end of file + for(int i = 0; i < TATACON_SWITCHES; i++) { + if(switches[i].debounce) { + switches[i].debounce--; + } + } +} + +bool CALLBACK_HID_Device_CreateHIDReport(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo, + uint8_t* const ReportID, + const uint8_t ReportType, + void* ReportData, + uint16_t* const ReportSize) +{ + if(ReportType != HID_REPORT_ITEM_In) { + *ReportSize = 0; + return false; + } + if(HIDInterfaceInfo == &Generic_HID_Interface) { + uint8_t* ConfigReport = (uint8_t*)ReportData; + memcpy(ConfigReport, &tataConfig, sizeof(tatacon_config_t)); + *ReportSize = TATACON_CONFIG_BYTES; + //TOGGLE(LED_PORT, DON_LED_PIN); + return true; + } + *ReportSize = 0; + return false; +} + +/** HID class driver callback function for the processing of HID reports from the host. + * + * \param[in] HIDInterfaceInfo Pointer to the HID class interface configuration structure being referenced + * \param[in] ReportID Report ID of the received report from the host + * \param[in] ReportType The type of report that the host has sent, either HID_REPORT_ITEM_Out or HID_REPORT_ITEM_Feature + * \param[in] ReportData Pointer to a buffer where the received report has been stored + * \param[in] ReportSize Size in bytes of the received HID report + */ +void CALLBACK_HID_Device_ProcessHIDReport(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo, + const uint8_t ReportID, + const uint8_t ReportType, + const void* ReportData, + const uint16_t ReportSize) +{ + if(HIDInterfaceInfo == &Generic_HID_Interface && ReportType == HID_REPORT_ITEM_Out) { + uint8_t* ConfigReport = (uint8_t*)ReportData; + // So we can upgrade firmware without having to hit the button + if(ConfigReport[TATACON_CONFIG_BYTES-1] == MAGIC_RESET_NUMBER) { + // With this uncommented, reboot fails. Odd. + //USB_Disable(); + cli(); + + // Back to the bootloader + Boot_Key = MAGIC_BOOT_KEY; + wdt_enable(WDTO_250MS); + while(1); + } + SetConfig(ConfigReport); + } +} \ No newline at end of file diff --git a/Firmware/SwitchPro/Joystick.h b/Firmware/SwitchPro/Joystick.h index 782ba97..2cc6c7f 100644 --- a/Firmware/SwitchPro/Joystick.h +++ b/Firmware/SwitchPro/Joystick.h @@ -134,5 +134,14 @@ void EVENT_USB_Device_ControlRequest(void); // Prepare the next report for the host. void GetNextReport(USB_JoystickReport_Input_t* const ReportData); - +bool CALLBACK_HID_Device_CreateHIDReport(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo, + uint8_t* const ReportID, + const uint8_t ReportType, + void* ReportData, + uint16_t* const ReportSize); +void CALLBACK_HID_Device_ProcessHIDReport(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo, + const uint8_t ReportID, + const uint8_t ReportType, + const void* ReportData, + const uint16_t ReportSize); #endif diff --git a/Firmware/SwitchPro/makefile b/Firmware/SwitchPro/makefile index 2105803..d516dc1 100644 --- a/Firmware/SwitchPro/makefile +++ b/Firmware/SwitchPro/makefile @@ -18,7 +18,7 @@ F_CPU = 8000000 F_USB = $(F_CPU) OPTIMIZATION = s TARGET = Joystick -SRC = $(TARGET).c Descriptors.c i2cmaster.S Config.c usbio.c $(LUFA_SRC_USB) +SRC = $(TARGET).c Descriptors.c i2cmaster.S Config.c usbio.c $(LUFA_SRC_USB) $(LUFA_SRC_USBCLASS) LUFA_PATH = ../LUFA CC_FLAGS = -DUSE_LUFA_CONFIG_HEADER -IConfig/ LD_FLAGS = From b4cb8dbddfee13e6cc408e2345983478fa2f3c97 Mon Sep 17 00:00:00 2001 From: Fergus Leahy Date: Wed, 5 Sep 2018 23:14:41 +0100 Subject: [PATCH 07/15] Updated debouncing to match keyboard firmware --- Firmware/SwitchPro/Joystick.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Firmware/SwitchPro/Joystick.c b/Firmware/SwitchPro/Joystick.c index 8e6d305..ad421ef 100644 --- a/Firmware/SwitchPro/Joystick.c +++ b/Firmware/SwitchPro/Joystick.c @@ -264,7 +264,7 @@ void GetNextReport(USB_JoystickReport_Input_t* const reportData) { for(i = 0; i < TATACON_SWITCHES; i++) { // The I2C data starts at the 6th bit and goes down uint8_t newState = !(data & _BV(TATACON_BUTTONS_START - i)); - if(newState && !switches[i].debounce) { + if(!switches[i].debounce && switches[i].state != newState) { SET(LED_PORT, KAT_LED_PIN); reportData->Button |= tataConfig.switches[i]; switches[i].state = newState; From 03335b6b3734b83654c28db8e4e6d7f8a02fa1bf Mon Sep 17 00:00:00 2001 From: Fergus Leahy Date: Wed, 5 Sep 2018 23:16:47 +0100 Subject: [PATCH 08/15] Updated keyboard firmware to current LUFA version --- Firmware/Keyboard/Descriptors.c | 2 +- Firmware/Keyboard/Descriptors.h | 2 +- Firmware/Keyboard/makefile | 4 ++++ 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/Firmware/Keyboard/Descriptors.c b/Firmware/Keyboard/Descriptors.c index 1d9bd50..b1530f9 100644 --- a/Firmware/Keyboard/Descriptors.c +++ b/Firmware/Keyboard/Descriptors.c @@ -195,7 +195,7 @@ const USB_Descriptor_String_t PROGMEM TataconString = USB_STRING_DESCRIPTOR(L"Ta * USB host. */ uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue, - const uint8_t wIndex, + const uint16_t wIndex, const void** const DescriptorAddress) { const uint8_t DescriptorType = (wValue >> 8); diff --git a/Firmware/Keyboard/Descriptors.h b/Firmware/Keyboard/Descriptors.h index 6d865d0..f3a844b 100644 --- a/Firmware/Keyboard/Descriptors.h +++ b/Firmware/Keyboard/Descriptors.h @@ -98,7 +98,7 @@ /* Function Prototypes: */ uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue, - const uint8_t wIndex, + const uint16_t wIndex, const void** const DescriptorAddress) ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(3); diff --git a/Firmware/Keyboard/makefile b/Firmware/Keyboard/makefile index 682297f..35343b2 100644 --- a/Firmware/Keyboard/makefile +++ b/Firmware/Keyboard/makefile @@ -73,3 +73,7 @@ flashboot: flash: all sleep 1 py -2 DFU/hid_bootloader_loader.py atmega16u2 Keyboard.hex + +flashC: all + sleep 1 + ../../lufa-LUFA-170418/Bootloaders/HID/HostLoaderApp/hid_bootloader_cli -mmcu=atmega16u2 -r Keyboard.hex \ No newline at end of file From 6d383b86e93afb0c59647c286fdb182ec2f752ca Mon Sep 17 00:00:00 2001 From: Fergus Leahy Date: Wed, 5 Sep 2018 23:17:37 +0100 Subject: [PATCH 09/15] Changed configuration app to recognise existing version 0.1 firmware --- Software/Tataconfig/tataconfig.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Software/Tataconfig/tataconfig.js b/Software/Tataconfig/tataconfig.js index 9cb708c..46b0884 100644 --- a/Software/Tataconfig/tataconfig.js +++ b/Software/Tataconfig/tataconfig.js @@ -28,7 +28,7 @@ donR : 2, katR : 3, }; - var VERSION_OSU = 1; + var VERSION_OSU = 0; var VERSION_SWITCH = 2; var majorVersion; var version; From a0f0e2f553839eb5e174c891d16ab6b8c44aa4e4 Mon Sep 17 00:00:00 2001 From: Fergus Leahy Date: Wed, 5 Sep 2018 23:30:25 +0100 Subject: [PATCH 10/15] Added LUFA dfu hid tools needed for updating firmware - Added both C(unix) and Python(windows) versions - Updated makefiles to flash using these tools --- Firmware/DFUHID/.gitignore | 1 + Firmware/DFUHID/Makefile | 40 + Firmware/DFUHID/Makefile.bsd | 21 + Firmware/DFUHID/gpl3.txt | 674 ++++++++++++++ Firmware/DFUHID/hid_bootloader_cli.c | 1013 ++++++++++++++++++++++ Firmware/DFUHID/hid_bootloader_loader.py | 120 +++ Firmware/Keyboard/makefile | 4 +- Firmware/SwitchPro/makefile | 4 +- 8 files changed, 1873 insertions(+), 4 deletions(-) create mode 100644 Firmware/DFUHID/.gitignore create mode 100644 Firmware/DFUHID/Makefile create mode 100644 Firmware/DFUHID/Makefile.bsd create mode 100644 Firmware/DFUHID/gpl3.txt create mode 100644 Firmware/DFUHID/hid_bootloader_cli.c create mode 100644 Firmware/DFUHID/hid_bootloader_loader.py diff --git a/Firmware/DFUHID/.gitignore b/Firmware/DFUHID/.gitignore new file mode 100644 index 0000000..4e73d1e --- /dev/null +++ b/Firmware/DFUHID/.gitignore @@ -0,0 +1 @@ +hid_bootloader_cli diff --git a/Firmware/DFUHID/Makefile b/Firmware/DFUHID/Makefile new file mode 100644 index 0000000..d7d6458 --- /dev/null +++ b/Firmware/DFUHID/Makefile @@ -0,0 +1,40 @@ +OS ?= LINUX +#OS ?= WINDOWS +#OS ?= MACOSX +#OS ?= BSD + +ifeq ($(OS), LINUX) # also works on FreeBSD +CC ?= gcc +CFLAGS ?= -O2 -Wall +hid_bootloader_cli: hid_bootloader_cli.c + $(CC) $(CFLAGS) -s -DUSE_LIBUSB -o hid_bootloader_cli hid_bootloader_cli.c -lusb + + +else ifeq ($(OS), WINDOWS) +CC = i586-mingw32msvc-gcc +CFLAGS ?= -O2 -Wall +LDLIB = -lsetupapi -lhid +hid_bootloader_cli.exe: hid_bootloader_cli.c + $(CC) $(CFLAGS) -s -DUSE_WIN32 -o hid_bootloader_cli.exe hid_bootloader_cli.c $(LDLIB) + + +else ifeq ($(OS), MACOSX) +CC ?= gcc +SDK ?= /Developer/SDKs/MacOSX10.5.sdk +CFLAGS ?= -O2 -Wall +hid_bootloader_cli: hid_bootloader_cli.c + $(CC) $(CFLAGS) -DUSE_APPLE_IOKIT -isysroot $(SDK) -o hid_bootloader_cli hid_bootloader_cli.c -Wl,-syslibroot,$(SDK) -framework IOKit -framework CoreFoundation + + +else ifeq ($(OS), BSD) # works on NetBSD and OpenBSD +CC ?= gcct +CFLAGS ?= -O2 -Wall +hid_bootloader_cli: hid_bootloader_cli.c + $(CC) $(CFLAGS) -s -DUSE_UHID -o hid_bootloader_cli hid_bootloader_cli.c + + +endif + + +clean: + rm -f hid_bootloader_cli hid_bootloader_cli.exe diff --git a/Firmware/DFUHID/Makefile.bsd b/Firmware/DFUHID/Makefile.bsd new file mode 100644 index 0000000..a15a664 --- /dev/null +++ b/Firmware/DFUHID/Makefile.bsd @@ -0,0 +1,21 @@ +OS ?= FreeBSD +#OS ?= NetBSD +#OS ?= OpenBSD + +CFLAGS ?= -O2 -Wall +CC ?= gcc + +.if $(OS) == "FreeBSD" +CFLAGS += -DUSE_LIBUSB +LIBS = -lusb +.elif $(OS) == "NetBSD" || $(OS) == "OpenBSD" +CFLAGS += -DUSE_UHID +LIBS = +.endif + + +hid_bootloader_cli: hid_bootloader_cli.c + $(CC) $(CFLAGS) -s -o hid_bootloader_cli hid_bootloader_cli.c $(LIBS) + +clean: + rm -f hid_bootloader_cli diff --git a/Firmware/DFUHID/gpl3.txt b/Firmware/DFUHID/gpl3.txt new file mode 100644 index 0000000..94a9ed0 --- /dev/null +++ b/Firmware/DFUHID/gpl3.txt @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/Firmware/DFUHID/hid_bootloader_cli.c b/Firmware/DFUHID/hid_bootloader_cli.c new file mode 100644 index 0000000..b54f943 --- /dev/null +++ b/Firmware/DFUHID/hid_bootloader_cli.c @@ -0,0 +1,1013 @@ +/* Modified for the LUFA HID Bootloader by Dean Camera + * http://www.lufa-lib.org + * + * THIS MODIFIED VERSION IS UNSUPPORTED BY PJRC. + */ + +/* Teensy Loader, Command Line Interface + * Program and Reboot Teensy Board with HalfKay Bootloader + * http://www.pjrc.com/teensy/loader_cli.html + * Copyright 2008-2010, PJRC.COM, LLC + * + * + * You may redistribute this program and/or modify it under the terms + * of the GNU General Public License as published by the Free Software + * Foundation, version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see http://www.gnu.org/licenses/ + */ + +/* Want to incorporate this code into a proprietary application?? + * Just email paul@pjrc.com to ask. Usually it's not a problem, + * but you do need to ask to use this code in any way other than + * those permitted by the GNU General Public License, version 3 */ + +/* For non-root permissions on ubuntu or similar udev-based linux + * http://www.pjrc.com/teensy/49-teensy.rules + */ + +#include +#include +#include +#include +#include +#include + +void usage(void) +{ + fprintf(stderr, "Usage: hid_bootloader_cli -mmcu= [-w] [-h] [-n] [-v] \n"); + fprintf(stderr, "\t-w : Wait for device to appear\n"); + fprintf(stderr, "\t-r : Use hard reboot if device not online\n"); + fprintf(stderr, "\t-n : No reboot after programming\n"); + fprintf(stderr, "\t-v : Verbose output\n"); + fprintf(stderr, "\n = atmegaXXuY or at90usbXXXY"); + + fprintf(stderr, "\nFor support and more information, please visit:\n"); + fprintf(stderr, "http://www.lufa-lib.org\n"); + + fprintf(stderr, "\nBased on the TeensyHID command line programmer software:\n"); + fprintf(stderr, "http://www.pjrc.com/teensy/loader_cli.html\n"); + exit(1); +} + +// USB Access Functions +int teensy_open(void); +int teensy_write(void *buf, int len, double timeout); +void teensy_close(void); +int hard_reboot(void); + +// Intel Hex File Functions +int read_intel_hex(const char *filename); +int ihex_bytes_within_range(int begin, int end); +void ihex_get_data(int addr, int len, unsigned char *bytes); + +// Misc stuff +int printf_verbose(const char *format, ...); +void delay(double seconds); +void die(const char *str, ...); +void parse_options(int argc, char **argv); + +// options (from user via command line args) +int wait_for_device_to_appear = 0; +int hard_reboot_device = 0; +int reboot_after_programming = 1; +int verbose = 0; +int code_size = 0, block_size = 0; +const char *filename=NULL; + + +/****************************************************************/ +/* */ +/* Main Program */ +/* */ +/****************************************************************/ + +int main(int argc, char **argv) +{ + unsigned char buf[260]; + int num, addr, r, first_block=1, waited=0; + + // parse command line arguments + parse_options(argc, argv); + if (!filename) { + fprintf(stderr, "Filename must be specified\n\n"); + usage(); + } + if (!code_size) { + fprintf(stderr, "MCU type must be specified\n\n"); + usage(); + } + printf_verbose("Teensy Loader, Command Line, Version 2.0\n"); + + // read the intel hex file + // this is done first so any error is reported before using USB + num = read_intel_hex(filename); + if (num < 0) die("error reading intel hex file \"%s\"", filename); + printf_verbose("Read \"%s\": %d bytes, %.1f%% usage\n", + filename, num, (double)num / (double)code_size * 100.0); + + // open the USB device + while (1) { + if (teensy_open()) break; + if (hard_reboot_device) { + if (!hard_reboot()) die("Unable to find rebootor\n"); + printf_verbose("Hard Reboot performed\n"); + hard_reboot_device = 0; // only hard reboot once + wait_for_device_to_appear = 1; + } + if (!wait_for_device_to_appear) die("Unable to open device\n"); + if (!waited) { + printf_verbose("Waiting for Teensy device...\n"); + printf_verbose(" (hint: press the reset button)\n"); + waited = 1; + } + delay(0.25); + } + printf_verbose("Found HalfKay Bootloader\n"); + + // if we waited for the device, read the hex file again + // perhaps it changed while we were waiting? + if (waited) { + num = read_intel_hex(filename); + if (num < 0) die("error reading intel hex file \"%s\"", filename); + printf_verbose("Read \"%s\": %d bytes, %.1f%% usage\n", + filename, num, (double)num / (double)code_size * 100.0); + } + + // program the data + printf_verbose("Programming"); + fflush(stdout); + for (addr = 0; addr < code_size; addr += block_size) { + if (addr > 0 && !ihex_bytes_within_range(addr, addr + block_size - 1)) { + // don't waste time on blocks that are unused, + // but always do the first one to erase the chip + continue; + } + printf_verbose("."); + if (code_size < 0x10000) { + buf[0] = addr & 255; + buf[1] = (addr >> 8) & 255; + } else { + buf[0] = (addr >> 8) & 255; + buf[1] = (addr >> 16) & 255; + } + ihex_get_data(addr, block_size, buf + 2); + r = teensy_write(buf, block_size + 2, first_block ? 3.0 : 0.25); + if (!r) die("error writing to Teensy\n"); + first_block = 0; + } + printf_verbose("\n"); + + // reboot to the user's new code + if (reboot_after_programming) { + printf_verbose("Booting\n"); + buf[0] = 0xFF; + buf[1] = 0xFF; + memset(buf + 2, 0, sizeof(buf) - 2); + teensy_write(buf, block_size + 2, 0.25); + } + teensy_close(); + return 0; +} + + + + +/****************************************************************/ +/* */ +/* USB Access - libusb (Linux & FreeBSD) */ +/* */ +/****************************************************************/ + +#if defined(USE_LIBUSB) + +// http://libusb.sourceforge.net/doc/index.html +#include + +usb_dev_handle * open_usb_device(int vid, int pid) +{ + struct usb_bus *bus; + struct usb_device *dev; + usb_dev_handle *h; + #ifdef LIBUSB_HAS_GET_DRIVER_NP + char buf[128]; + #endif + int r; + + usb_init(); + usb_find_busses(); + usb_find_devices(); + //printf_verbose("\nSearching for USB device:\n"); + for (bus = usb_get_busses(); bus; bus = bus->next) { + for (dev = bus->devices; dev; dev = dev->next) { + //printf_verbose("bus \"%s\", device \"%s\" vid=%04X, pid=%04X\n", + // bus->dirname, dev->filename, + // dev->descriptor.idVendor, + // dev->descriptor.idProduct + //); + if (dev->descriptor.idVendor != vid) continue; + if (dev->descriptor.idProduct != pid) continue; + h = usb_open(dev); + if (!h) { + printf_verbose("Found device but unable to open"); + continue; + } + #ifdef LIBUSB_HAS_GET_DRIVER_NP + r = usb_get_driver_np(h, 0, buf, sizeof(buf)); + if (r >= 0) { + r = usb_detach_kernel_driver_np(h, 0); + if (r < 0) { + usb_close(h); + printf_verbose("Device is in use by \"%s\" driver", buf); + continue; + } + } + #endif + // Mac OS-X - removing this call to usb_claim_interface() might allow + // this to work, even though it is a clear misuse of the libusb API. + // normally Apple's IOKit should be used on Mac OS-X + r = usb_claim_interface(h, 0); + if (r < 0) { + usb_close(h); + printf_verbose("Unable to claim interface, check USB permissions"); + continue; + } + return h; + } + } + return NULL; +} + +static usb_dev_handle *libusb_teensy_handle = NULL; + +int teensy_open(void) +{ + teensy_close(); + libusb_teensy_handle = open_usb_device(0x16C0, 0x0478); + + if (!libusb_teensy_handle) + libusb_teensy_handle = open_usb_device(0x03eb, 0x2067); + + if (!libusb_teensy_handle) return 0; + return 1; +} + +int teensy_write(void *buf, int len, double timeout) +{ + int r; + + if (!libusb_teensy_handle) return 0; + r = usb_control_msg(libusb_teensy_handle, 0x21, 9, 0x0200, 0, (char *)buf, + len, (int)(timeout * 1000.0)); + if (r < 0) return 0; + return 1; +} + +void teensy_close(void) +{ + if (!libusb_teensy_handle) return; + usb_release_interface(libusb_teensy_handle, 0); + usb_close(libusb_teensy_handle); + libusb_teensy_handle = NULL; +} + +int hard_reboot(void) +{ + usb_dev_handle *rebootor; + int r; + + rebootor = open_usb_device(0x16C0, 0x0477); + + if (!rebootor) + rebootor = open_usb_device(0x03eb, 0x2067); + + if (!rebootor) return 0; + r = usb_control_msg(rebootor, 0x21, 9, 0x0200, 0, "reboot", 6, 100); + usb_release_interface(rebootor, 0); + usb_close(rebootor); + if (r < 0) return 0; + return 1; +} + +#endif + + +/****************************************************************/ +/* */ +/* USB Access - Microsoft WIN32 */ +/* */ +/****************************************************************/ + +#if defined(USE_WIN32) + +// http://msdn.microsoft.com/en-us/library/ms790932.aspx +#include +#include +#include +#include + +HANDLE open_usb_device(int vid, int pid) +{ + GUID guid; + HDEVINFO info; + DWORD index, required_size; + SP_DEVICE_INTERFACE_DATA iface; + SP_DEVICE_INTERFACE_DETAIL_DATA *details; + HIDD_ATTRIBUTES attrib; + HANDLE h; + BOOL ret; + + HidD_GetHidGuid(&guid); + info = SetupDiGetClassDevs(&guid, NULL, NULL, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE); + if (info == INVALID_HANDLE_VALUE) return NULL; + for (index=0; 1 ;index++) { + iface.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA); + ret = SetupDiEnumDeviceInterfaces(info, NULL, &guid, index, &iface); + if (!ret) { + SetupDiDestroyDeviceInfoList(info); + break; + } + SetupDiGetInterfaceDeviceDetail(info, &iface, NULL, 0, &required_size, NULL); + details = (SP_DEVICE_INTERFACE_DETAIL_DATA *)malloc(required_size); + if (details == NULL) continue; + memset(details, 0, required_size); + details->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA); + ret = SetupDiGetDeviceInterfaceDetail(info, &iface, details, + required_size, NULL, NULL); + if (!ret) { + free(details); + continue; + } + h = CreateFile(details->DevicePath, GENERIC_READ|GENERIC_WRITE, + FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, + FILE_FLAG_OVERLAPPED, NULL); + free(details); + if (h == INVALID_HANDLE_VALUE) continue; + attrib.Size = sizeof(HIDD_ATTRIBUTES); + ret = HidD_GetAttributes(h, &attrib); + if (!ret) { + CloseHandle(h); + continue; + } + if (attrib.VendorID != vid || attrib.ProductID != pid) { + CloseHandle(h); + continue; + } + SetupDiDestroyDeviceInfoList(info); + return h; + } + return NULL; +} + +int write_usb_device(HANDLE h, void *buf, int len, int timeout) +{ + static HANDLE event = NULL; + unsigned char tmpbuf[1040]; + OVERLAPPED ov; + DWORD n, r; + + if (len > sizeof(tmpbuf) - 1) return 0; + if (event == NULL) { + event = CreateEvent(NULL, TRUE, TRUE, NULL); + if (!event) return 0; + } + ResetEvent(&event); + memset(&ov, 0, sizeof(ov)); + ov.hEvent = event; + tmpbuf[0] = 0; + memcpy(tmpbuf + 1, buf, len); + if (!WriteFile(h, tmpbuf, len + 1, NULL, &ov)) { + if (GetLastError() != ERROR_IO_PENDING) return 0; + r = WaitForSingleObject(event, timeout); + if (r == WAIT_TIMEOUT) { + CancelIo(h); + return 0; + } + if (r != WAIT_OBJECT_0) return 0; + } + if (!GetOverlappedResult(h, &ov, &n, FALSE)) return 0; + return 1; +} + +static HANDLE win32_teensy_handle = NULL; + +int teensy_open(void) +{ + teensy_close(); + win32_teensy_handle = open_usb_device(0x16C0, 0x0478); + + if (!win32_teensy_handle) + win32_teensy_handle = open_usb_device(0x03eb, 0x2067); + + if (!win32_teensy_handle) return 0; + return 1; +} + +int teensy_write(void *buf, int len, double timeout) +{ + int r; + if (!win32_teensy_handle) return 0; + r = write_usb_device(win32_teensy_handle, buf, len, (int)(timeout * 1000.0)); + return r; +} + +void teensy_close(void) +{ + if (!win32_teensy_handle) return; + CloseHandle(win32_teensy_handle); + win32_teensy_handle = NULL; +} + +int hard_reboot(void) +{ + HANDLE rebootor; + int r; + + rebootor = open_usb_device(0x16C0, 0x0477); + + if (!rebootor) + rebootor = open_usb_device(0x03eb, 0x2067); + + if (!rebootor) return 0; + r = write_usb_device(rebootor, "reboot", 6, 100); + CloseHandle(rebootor); + return r; +} + +#endif + + + +/****************************************************************/ +/* */ +/* USB Access - Apple's IOKit, Mac OS-X */ +/* */ +/****************************************************************/ + +#if defined(USE_APPLE_IOKIT) + +// http://developer.apple.com/technotes/tn2007/tn2187.html +#include +#include +#include + +struct usb_list_struct { + IOHIDDeviceRef ref; + int pid; + int vid; + struct usb_list_struct *next; +}; + +static struct usb_list_struct *usb_list=NULL; +static IOHIDManagerRef hid_manager=NULL; + +void attach_callback(void *context, IOReturn r, void *hid_mgr, IOHIDDeviceRef dev) +{ + CFTypeRef type; + struct usb_list_struct *n, *p; + int32_t pid, vid; + + if (!dev) return; + type = IOHIDDeviceGetProperty(dev, CFSTR(kIOHIDVendorIDKey)); + if (!type || CFGetTypeID(type) != CFNumberGetTypeID()) return; + if (!CFNumberGetValue((CFNumberRef)type, kCFNumberSInt32Type, &vid)) return; + type = IOHIDDeviceGetProperty(dev, CFSTR(kIOHIDProductIDKey)); + if (!type || CFGetTypeID(type) != CFNumberGetTypeID()) return; + if (!CFNumberGetValue((CFNumberRef)type, kCFNumberSInt32Type, &pid)) return; + n = (struct usb_list_struct *)malloc(sizeof(struct usb_list_struct)); + if (!n) return; + //printf("attach callback: vid=%04X, pid=%04X\n", vid, pid); + n->ref = dev; + n->vid = vid; + n->pid = pid; + n->next = NULL; + if (usb_list == NULL) { + usb_list = n; + } else { + for (p = usb_list; p->next; p = p->next) ; + p->next = n; + } +} + +void detach_callback(void *context, IOReturn r, void *hid_mgr, IOHIDDeviceRef dev) +{ + struct usb_list_struct *p, *tmp, *prev=NULL; + + p = usb_list; + while (p) { + if (p->ref == dev) { + if (prev) { + prev->next = p->next; + } else { + usb_list = p->next; + } + tmp = p; + p = p->next; + free(tmp); + } else { + prev = p; + p = p->next; + } + } +} + +void init_hid_manager(void) +{ + CFMutableDictionaryRef dict; + IOReturn ret; + + if (hid_manager) return; + hid_manager = IOHIDManagerCreate(kCFAllocatorDefault, kIOHIDOptionsTypeNone); + if (hid_manager == NULL || CFGetTypeID(hid_manager) != IOHIDManagerGetTypeID()) { + if (hid_manager) CFRelease(hid_manager); + printf_verbose("no HID Manager - maybe this is a pre-Leopard (10.5) system?\n"); + return; + } + dict = CFDictionaryCreateMutable(kCFAllocatorDefault, 0, + &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); + if (!dict) return; + IOHIDManagerSetDeviceMatching(hid_manager, dict); + CFRelease(dict); + IOHIDManagerScheduleWithRunLoop(hid_manager, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode); + IOHIDManagerRegisterDeviceMatchingCallback(hid_manager, attach_callback, NULL); + IOHIDManagerRegisterDeviceRemovalCallback(hid_manager, detach_callback, NULL); + ret = IOHIDManagerOpen(hid_manager, kIOHIDOptionsTypeNone); + if (ret != kIOReturnSuccess) { + IOHIDManagerUnscheduleFromRunLoop(hid_manager, + CFRunLoopGetCurrent(), kCFRunLoopDefaultMode); + CFRelease(hid_manager); + printf_verbose("Error opening HID Manager"); + } +} + +static void do_run_loop(void) +{ + while (CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0, true) == kCFRunLoopRunHandledSource) ; +} + +IOHIDDeviceRef open_usb_device(int vid, int pid) +{ + struct usb_list_struct *p; + IOReturn ret; + + init_hid_manager(); + do_run_loop(); + for (p = usb_list; p; p = p->next) { + if (p->vid == vid && p->pid == pid) { + ret = IOHIDDeviceOpen(p->ref, kIOHIDOptionsTypeNone); + if (ret == kIOReturnSuccess) return p->ref; + } + } + return NULL; +} + +void close_usb_device(IOHIDDeviceRef dev) +{ + struct usb_list_struct *p; + + do_run_loop(); + for (p = usb_list; p; p = p->next) { + if (p->ref == dev) { + IOHIDDeviceClose(dev, kIOHIDOptionsTypeNone); + return; + } + } +} + +static IOHIDDeviceRef iokit_teensy_reference = NULL; + +int teensy_open(void) +{ + teensy_close(); + iokit_teensy_reference = open_usb_device(0x16C0, 0x0478); + + if (!iokit_teensy_reference) + iokit_teensy_reference = open_usb_device(0x03eb, 0x2067); + + if (!iokit_teensy_reference) return 0; + return 1; +} + +int teensy_write(void *buf, int len, double timeout) +{ + IOReturn ret; + + // timeouts do not work on OS-X + // IOHIDDeviceSetReportWithCallback is not implemented + // even though Apple documents it with a code example! + // submitted to Apple on 22-sep-2009, problem ID 7245050 + if (!iokit_teensy_reference) return 0; + ret = IOHIDDeviceSetReport(iokit_teensy_reference, + kIOHIDReportTypeOutput, 0, buf, len); + if (ret == kIOReturnSuccess) return 1; + return 0; +} + +void teensy_close(void) +{ + if (!iokit_teensy_reference) return; + close_usb_device(iokit_teensy_reference); + iokit_teensy_reference = NULL; +} + +int hard_reboot(void) +{ + IOHIDDeviceRef rebootor; + IOReturn ret; + + rebootor = open_usb_device(0x16C0, 0x0477); + + if (!rebootor) + rebootor = open_usb_device(0x03eb, 0x2067); + + if (!rebootor) return 0; + ret = IOHIDDeviceSetReport(rebootor, + kIOHIDReportTypeOutput, 0, (uint8_t *)("reboot"), 6); + close_usb_device(rebootor); + if (ret == kIOReturnSuccess) return 1; + return 0; +} + +#endif + + + +/****************************************************************/ +/* */ +/* USB Access - BSD's UHID driver */ +/* */ +/****************************************************************/ + +#if defined(USE_UHID) + +// Thanks to Todd T Fries for help getting this working on OpenBSD +// and to Chris Kuethe for the initial patch to use UHID. + +#include +#include +#include +#include +#ifndef USB_GET_DEVICEINFO +#include +#endif + +#ifndef USB_GET_DEVICEINFO +# define USB_GET_DEVICEINFO 0 +# error The USB_GET_DEVICEINFO ioctl() value is not defined for your system. +#endif + +int open_usb_device(int vid, int pid) +{ + int r, fd; + DIR *dir; + struct dirent *d; + struct usb_device_info info; + char buf[256]; + + dir = opendir("/dev"); + if (!dir) return -1; + while ((d = readdir(dir)) != NULL) { + if (strncmp(d->d_name, "uhid", 4) != 0) continue; + snprintf(buf, sizeof(buf), "/dev/%s", d->d_name); + fd = open(buf, O_RDWR); + if (fd < 0) continue; + r = ioctl(fd, USB_GET_DEVICEINFO, &info); + if (r < 0) { + // NetBSD: added in 2004 + // OpenBSD: added November 23, 2009 + // FreeBSD: missing (FreeBSD 8.0) - USE_LIBUSB works! + die("Error: your uhid driver does not support" + " USB_GET_DEVICEINFO, please upgrade!\n"); + close(fd); + closedir(dir); + exit(1); + } + //printf("%s: v=%d, p=%d\n", buf, info.udi_vendorNo, info.udi_productNo); + if (info.udi_vendorNo == vid && info.udi_productNo == pid) { + closedir(dir); + return fd; + } + close(fd); + } + closedir(dir); + return -1; +} + +static int uhid_teensy_fd = -1; + +int teensy_open(void) +{ + teensy_close(); + uhid_teensy_fd = open_usb_device(0x16C0, 0x0478); + + if (uhid_teensy_fd < 0) + uhid_teensy_fd = open_usb_device(0x03eb, 0x2067); + + if (uhid_teensy_fd < 0) return 0; + return 1; +} + +int teensy_write(void *buf, int len, double timeout) +{ + int r; + + // TODO: implement timeout... how?? + r = write(uhid_teensy_fd, buf, len); + if (r == len) return 1; + return 0; +} + +void teensy_close(void) +{ + if (uhid_teensy_fd >= 0) { + close(uhid_teensy_fd); + uhid_teensy_fd = -1; + } +} + +int hard_reboot(void) +{ + int r, rebootor_fd; + + rebootor_fd = open_usb_device(0x16C0, 0x0477); + + if (rebootor_fd < 0) + rebootor_fd = open_usb_device(0x03eb, 0x2067); + + if (rebootor_fd < 0) return 0; + r = write(rebootor_fd, "reboot", 6); + delay(0.1); + close(rebootor_fd); + if (r == 6) return 1; + return 0; +} + +#endif + + + +/****************************************************************/ +/* */ +/* Read Intel Hex File */ +/* */ +/****************************************************************/ + +// the maximum flash image size we can support +// chips with larger memory may be used, but only this +// much intel-hex data can be loaded into memory! +#define MAX_MEMORY_SIZE 0x10000 + +static unsigned char firmware_image[MAX_MEMORY_SIZE]; +static unsigned char firmware_mask[MAX_MEMORY_SIZE]; +static int end_record_seen=0; +static int byte_count; +static unsigned int extended_addr = 0; +static int parse_hex_line(char *line); + +int read_intel_hex(const char *filename) +{ + FILE *fp; + int i, lineno=0; + char buf[1024]; + + byte_count = 0; + end_record_seen = 0; + for (i=0; i= MAX_MEMORY_SIZE) return 0; + ptr += 2; + sum = (len & 255) + ((addr >> 8) & 255) + (addr & 255) + (code & 255); + if (code != 0) { + if (code == 1) { + end_record_seen = 1; + return 1; + } + if (code == 2 && len == 2) { + if (!sscanf(ptr, "%04x", &i)) return 1; + ptr += 4; + sum += ((i >> 8) & 255) + (i & 255); + if (!sscanf(ptr, "%02x", &cksum)) return 1; + if (((sum & 255) + (cksum & 255)) & 255) return 1; + extended_addr = i << 4; + //printf("ext addr = %05X\n", extended_addr); + } + if (code == 4 && len == 2) { + if (!sscanf(ptr, "%04x", &i)) return 1; + ptr += 4; + sum += ((i >> 8) & 255) + (i & 255); + if (!sscanf(ptr, "%02x", &cksum)) return 1; + if (((sum & 255) + (cksum & 255)) & 255) return 1; + extended_addr = i << 16; + //printf("ext addr = %08X\n", extended_addr); + } + return 1; // non-data line + } + byte_count += len; + while (num != len) { + if (sscanf(ptr, "%02x", &i) != 1) return 0; + i &= 255; + firmware_image[addr + extended_addr + num] = i; + firmware_mask[addr + extended_addr + num] = 1; + ptr += 2; + sum += i; + (num)++; + if (num >= 256) return 0; + } + if (!sscanf(ptr, "%02x", &cksum)) return 0; + if (((sum & 255) + (cksum & 255)) & 255) return 0; /* checksum error */ + return 1; +} + +int ihex_bytes_within_range(int begin, int end) +{ + int i; + + if (begin < 0 || begin >= MAX_MEMORY_SIZE || + end < 0 || end >= MAX_MEMORY_SIZE) { + return 0; + } + for (i=begin; i<=end; i++) { + if (firmware_mask[i]) return 1; + } + return 0; +} + +void ihex_get_data(int addr, int len, unsigned char *bytes) +{ + int i; + + if (addr < 0 || len < 0 || addr + len >= MAX_MEMORY_SIZE) { + for (i=0; i .hex + + Example: + python hid_bootloader_loader.py at90usb1287 Mouse.hex + + Requires the pywinusb (https://pypi.python.org/pypi/pywinusb/) and + IntelHex (https://pypi.python.org/pypi/IntelHex/) libraries. +""" + +import sys +from pywinusb import hid +from intelhex import IntelHex + + +# Device information table +device_info_map = dict() +device_info_map['at90usb1287'] = {'page_size': 256, 'flash_kb': 128} +device_info_map['at90usb1286'] = {'page_size': 256, 'flash_kb': 128} +device_info_map['at90usb647'] = {'page_size': 256, 'flash_kb': 64} +device_info_map['at90usb646'] = {'page_size': 256, 'flash_kb': 64} +device_info_map['atmega32u4'] = {'page_size': 128, 'flash_kb': 32} +device_info_map['atmega32u2'] = {'page_size': 128, 'flash_kb': 32} +device_info_map['atmega16u4'] = {'page_size': 128, 'flash_kb': 16} +device_info_map['atmega16u2'] = {'page_size': 128, 'flash_kb': 16} +device_info_map['at90usb162'] = {'page_size': 128, 'flash_kb': 16} +device_info_map['atmega8u2'] = {'page_size': 128, 'flash_kb': 8} +device_info_map['at90usb82'] = {'page_size': 128, 'flash_kb': 8} + + +def get_hid_device_handle(): + hid_device_filter = hid.HidDeviceFilter(vendor_id=0x03EB, + product_id=0x2067) + + valid_hid_devices = hid_device_filter.get_devices() + + if len(valid_hid_devices) is 0: + return None + else: + return valid_hid_devices[0] + + +def send_page_data(hid_device, address, data): + # Bootloader page data should be the HID Report ID (always zero) followed + # by the starting address to program, then one device's flash page worth + # of data + output_report_data = [0] + output_report_data.extend([address & 0xFF, address >> 8]) + output_report_data.extend(data) + + hid_device.send_output_report(output_report_data) + + +def program_device(hex_data, device_info): + hid_device = get_hid_device_handle() + + if hid_device is None: + print("No valid HID device found.") + sys.exit(1) + + try: + hid_device.open() + print("Connected to bootloader.") + + # Program in all data from the loaded HEX file, in a number of device + # page sized chunks + for addr in range(0, hex_data.maxaddr(), device_info['page_size']): + # Compute the address range of the current page in the device + current_page_range = range(addr, addr+device_info['page_size']) + + # Extract the data from the hex file at the specified start page + # address and convert it to a regular list of bytes + page_data = [hex_data[i] for i in current_page_range] + + print("Writing address 0x%04X-0x%04X" % (current_page_range[0], current_page_range[-1])) + + # Devices with more than 64KB of flash should shift down the page + # address so that it is 16-bit (page size is guaranteed to be + # >= 256 bytes so no non-zero address bits are discarded) + if device_info['flash_kb'] < 64: + send_page_data(hid_device, addr, page_data) + else: + send_page_data(hid_device, addr >> 8, page_data) + + # Once programming is complete, start the application via a dummy page + # program to the page address 0xFFFF + print("Programming complete, starting application.") + send_page_data(hid_device, 0xFFFF, [0] * device_info['page_size']) + + finally: + hid_device.close() + + +if __name__ == '__main__': + # Load the specified HEX file + try: + hex_data = IntelHex(sys.argv[2]) + except: + print("Could not open the specified HEX file.") + sys.exit(1) + + # Retrieve the device information entry for the specified device + try: + device_info = device_info_map[sys.argv[1]] + except: + print("Unknown device name specified.") + sys.exit(1) + + program_device(hex_data, device_info) diff --git a/Firmware/Keyboard/makefile b/Firmware/Keyboard/makefile index 35343b2..583e665 100644 --- a/Firmware/Keyboard/makefile +++ b/Firmware/Keyboard/makefile @@ -72,8 +72,8 @@ flashboot: flash: all sleep 1 - py -2 DFU/hid_bootloader_loader.py atmega16u2 Keyboard.hex + py -2 ../DFUHID/hid_bootloader_loader.py atmega16u2 Keyboard.hex flashC: all sleep 1 - ../../lufa-LUFA-170418/Bootloaders/HID/HostLoaderApp/hid_bootloader_cli -mmcu=atmega16u2 -r Keyboard.hex \ No newline at end of file + ../DFUHID/hid_bootloader_cli -mmcu=atmega16u2 -r Keyboard.hex \ No newline at end of file diff --git a/Firmware/SwitchPro/makefile b/Firmware/SwitchPro/makefile index d516dc1..b3b8f4e 100644 --- a/Firmware/SwitchPro/makefile +++ b/Firmware/SwitchPro/makefile @@ -78,8 +78,8 @@ flashboot: flash: all sleep 1 - python2 DFU/hid_bootloader_loader.py atmega16u2 Joystick.hex + python2 ../DFUHID/hid_bootloader_loader.py atmega16u2 Joystick.hex flashC: all sleep 1 - ../../lufa-LUFA-170418/Bootloaders/HID/HostLoaderApp/hid_bootloader_cli -mmcu=atmega16u2 -r Joystick.hex \ No newline at end of file + ../DFUHID/hid_bootloader_cli -mmcu=atmega16u2 -r Joystick.hex \ No newline at end of file From 14a0968b1850eb46ea0dcaff83851fe00882d2a3 Mon Sep 17 00:00:00 2001 From: Fergus Leahy Date: Wed, 5 Sep 2018 23:38:21 +0100 Subject: [PATCH 11/15] Updated readme with more info on compiling and installing firmware --- README.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 9347644..8e85719 100644 --- a/README.md +++ b/README.md @@ -23,7 +23,12 @@ To build the PC firmware navigate to `firmware/Keyboard`. To build the Nintendo Switch firmware navigate to `firmware/SwitchPro`. Run `make`. You will need AVR GCC installed. -To install hit the reset button, then `make flash`. +To install hit the reset button, then `make flash` to use the Python loader(Windows) or `make flashC` to use the C loader(unix). + +Python loader requires pywinusb (https://pypi.python.org/pypi/pywinusb/) and +IntelHex (https://pypi.python.org/pypi/IntelHex/) libraries. + +C loader requires compiling with libusb-dev (Ubuntu) installed. ## Building software: It's a Chrome web app. Install it like a normal dev app. From eb6ea9f1b2c794787db8ff4fc6a0303a5ac866de Mon Sep 17 00:00:00 2001 From: Fergus Leahy Date: Wed, 5 Sep 2018 23:52:53 +0100 Subject: [PATCH 12/15] Updated readme with more Nintendo Switch info --- README.md | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 8e85719..6947979 100644 --- a/README.md +++ b/README.md @@ -47,7 +47,14 @@ The makefile is by default setup to use the USBAsp. I recommend pogo pins in a breadboard + USB connection for power. From there, program by hitting the hardware reset button, then `make flash`. +## Nintendo Switch firmware +The Nintendo Switch firmware is based off of work by @progmem, who created the the proof-of-concept Hori Pokken Pad LUFA [firmware](https://github.com/progmem/Switch-Fightstick) and @shinyquagsire23, who extended it to create a [Splatoon 2 image printer](https://github.com/shinyquagsire23/Switch-Fightstick). +The firmware imitates the Hori Pokken Pad, which when connected to a Switch, running V3.0.0 or above, is picked up as a Pro controller. + +By default, when plugged in the firmware performs the sync command L + R, A, in order to pass through the new controller screen. + +Drum hits can be changed to any Switch Pro Controller buttons using the chrome configuration app. ## Linux use In order to use with the chrome configuration app, linux users must edit their udev rules. @@ -61,4 +68,7 @@ ATTRS{manufacturer}=="mon.im", MODE:="0664", GROUP:="plugdev" #Switch/WiiU Hori Pokken Pad SUBSYSTEM=="usb", ATTR{idVendor}=="0f0d", ATTR{idProduct}=="0092", MODE="0664", GROUP="plugdev" KERNEL=="hidraw*", ATTRS{idVendor}=="0f0d", ATTRS{idProduct}=="0092", MODE="0664", GROUP="plugdev" -``` \ No newline at end of file +``` + + + From 2b4734e1dbdfbfd448c6cc249f546969030debbc Mon Sep 17 00:00:00 2001 From: Fergus Leahy Date: Thu, 6 Sep 2018 18:54:31 +0100 Subject: [PATCH 13/15] Fixed endpoint overlap for Switch joystick and configuration --- Firmware/SwitchPro/Descriptors.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Firmware/SwitchPro/Descriptors.h b/Firmware/SwitchPro/Descriptors.h index 729515f..a1cb8c2 100644 --- a/Firmware/SwitchPro/Descriptors.h +++ b/Firmware/SwitchPro/Descriptors.h @@ -55,7 +55,7 @@ enum StringDescriptors_t // Descriptor Header Type - HID Class HID Report Descriptor #define DTYPE_Report 0x22 -#define GENERIC_EPADDR (ENDPOINT_DIR_IN | 2) +#define GENERIC_EPADDR (ENDPOINT_DIR_IN | 3) /** Size in bytes of the Keyboard HID reporting IN endpoint. */ #define GENERIC_EPSIZE TATACON_CONFIG_BYTES From 9a6b0436d1dbc36fa0edd3b42bc6fe27cd9ae0be Mon Sep 17 00:00:00 2001 From: Fergus Leahy Date: Thu, 6 Sep 2018 18:55:15 +0100 Subject: [PATCH 14/15] Updated default Switch mapping to use ZL + ZR to also navigate with --- Firmware/SwitchPro/Config.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Firmware/SwitchPro/Config.c b/Firmware/SwitchPro/Config.c index 5197928..7a3f072 100644 --- a/Firmware/SwitchPro/Config.c +++ b/Firmware/SwitchPro/Config.c @@ -11,9 +11,9 @@ static const tatacon_config_t defaults PROGMEM = { // SWITCH ORDER: CenterLeft, RimLeft, CenterRight, RimRight // ---- osu default SWITCH_LCLICK, - SWITCH_L, + SWITCH_ZL, SWITCH_RCLICK, - SWITCH_R }, + SWITCH_ZR }, .ledsOn = true, .debounce = 30 }; From a6662b37fdb26cb3e48461751164405ea9930cef Mon Sep 17 00:00:00 2001 From: Fergus Leahy Date: Thu, 6 Sep 2018 23:52:56 +0100 Subject: [PATCH 15/15] Added a proof-of-concept version implementing 2 pro controllers - Duplicates the interface and endpoints to add a second controller - Drum output depends on which interface reads it first, but it's just a proof-of-concept --- Firmware/SwitchDual/Config.c | 42 +++ Firmware/SwitchDual/Config.h | 27 ++ Firmware/SwitchDual/Config/LUFAConfig.h | 84 +++++ Firmware/SwitchDual/Descriptors.c | 344 ++++++++++++++++++ Firmware/SwitchDual/Descriptors.h | 80 +++++ Firmware/SwitchDual/Joystick.c | 453 ++++++++++++++++++++++++ Firmware/SwitchDual/Joystick.h | 157 ++++++++ Firmware/SwitchDual/asciihid.h | 145 ++++++++ Firmware/SwitchDual/i2cmaster.S | 366 +++++++++++++++++++ Firmware/SwitchDual/i2cmaster.h | 178 ++++++++++ Firmware/SwitchDual/makefile | 85 +++++ Firmware/SwitchDual/usbio.c | 114 ++++++ Firmware/SwitchDual/usbio.h | 20 ++ 13 files changed, 2095 insertions(+) create mode 100644 Firmware/SwitchDual/Config.c create mode 100644 Firmware/SwitchDual/Config.h create mode 100644 Firmware/SwitchDual/Config/LUFAConfig.h create mode 100644 Firmware/SwitchDual/Descriptors.c create mode 100644 Firmware/SwitchDual/Descriptors.h create mode 100644 Firmware/SwitchDual/Joystick.c create mode 100644 Firmware/SwitchDual/Joystick.h create mode 100644 Firmware/SwitchDual/asciihid.h create mode 100644 Firmware/SwitchDual/i2cmaster.S create mode 100644 Firmware/SwitchDual/i2cmaster.h create mode 100644 Firmware/SwitchDual/makefile create mode 100644 Firmware/SwitchDual/usbio.c create mode 100644 Firmware/SwitchDual/usbio.h diff --git a/Firmware/SwitchDual/Config.c b/Firmware/SwitchDual/Config.c new file mode 100644 index 0000000..7a3f072 --- /dev/null +++ b/Firmware/SwitchDual/Config.c @@ -0,0 +1,42 @@ +#include +#include "Joystick.h" + +#include +#include + +#define MAGIC_NUMBER 43 + +static const tatacon_config_t defaults PROGMEM = { + .switches = { + // SWITCH ORDER: CenterLeft, RimLeft, CenterRight, RimRight + // ---- osu default + SWITCH_LCLICK, + SWITCH_ZL, + SWITCH_RCLICK, + SWITCH_ZR }, + .ledsOn = true, + .debounce = 30 +}; + +uint8_t firstRun EEMEM; // init to 255 +tatacon_config_t eeConfig EEMEM; + +tatacon_config_t tataConfig; + +void InitConfig(void) { + if (eeprom_read_byte(&firstRun) != MAGIC_NUMBER) { // store defaults + memcpy_P(&tataConfig, &defaults, sizeof(tatacon_config_t)); + eeprom_write_block(&tataConfig, &eeConfig, sizeof(tatacon_config_t)); + eeprom_write_byte(&firstRun, MAGIC_NUMBER); // defaults set + } + eeprom_read_block(&tataConfig, &eeConfig, sizeof(tatacon_config_t)); + tataConfig.version = FIRMWARE_VERSION; +} + +void SetConfig(uint8_t* config) { + memcpy(&tataConfig, config, sizeof(tatacon_config_t)); + // Version is set in firmware, not software + tataConfig.version = FIRMWARE_VERSION; + + eeprom_write_block(&tataConfig, &eeConfig, sizeof(tatacon_config_t)); +} \ No newline at end of file diff --git a/Firmware/SwitchDual/Config.h b/Firmware/SwitchDual/Config.h new file mode 100644 index 0000000..da3db28 --- /dev/null +++ b/Firmware/SwitchDual/Config.h @@ -0,0 +1,27 @@ +#ifndef _CONFIG_H +#define _CONFIG_H + +#include +#include +#include + +// For ease of code sharing with the OsuPad +#define KB_SWITCHES 4 +#define TATACON_CONFIG_BYTES 12 +#define MAGIC_RESET_NUMBER 42 +#define FIRMWARE_VERSION 20 + +typedef struct { + // SWITCH ORDER: CenterLeft, RimLeft, CenterRight, RimRight + uint16_t switches[KB_SWITCHES]; + bool ledsOn; + uint8_t debounce; + uint8_t version; +} tatacon_config_t; + +extern tatacon_config_t tataConfig; + +extern void InitConfig(void); +extern void SetConfig(uint8_t* config); + +#endif \ No newline at end of file diff --git a/Firmware/SwitchDual/Config/LUFAConfig.h b/Firmware/SwitchDual/Config/LUFAConfig.h new file mode 100644 index 0000000..5fae1fa --- /dev/null +++ b/Firmware/SwitchDual/Config/LUFAConfig.h @@ -0,0 +1,84 @@ +/* + LUFA Library + Copyright (C) Dean Camera, 2014. + + dean [at] fourwalledcubicle [dot] com + www.lufa-lib.org +*/ + +/* + Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + + Permission to use, copy, modify, distribute, and sell this + software and its documentation for any purpose is hereby granted + without fee, provided that the above copyright notice appear in + all copies and that both that the copyright notice and this + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the + software without specific, written prior permission. + + The author disclaims all warranties with regard to this + software, including all implied warranties of merchantability + and fitness. In no event shall the author be liable for any + special, indirect or consequential damages or any damages + whatsoever resulting from loss of use, data or profits, whether + in an action of contract, negligence or other tortious action, + arising out of or in connection with the use or performance of + this software. +*/ + +/** \file + * \brief LUFA Library Configuration Header File + * + * This header file is used to configure LUFA's compile time options, + * as an alternative to the compile time constants supplied through + * a makefile. + * + * For information on what each token does, refer to the LUFA + * manual section "Summary of Compile Tokens". + */ + +#ifndef _LUFA_CONFIG_H_ +#define _LUFA_CONFIG_H_ + /* Non-USB Related Configuration Tokens: */ +// #define DISABLE_TERMINAL_CODES + + /* USB Class Driver Related Tokens: */ +// #define HID_HOST_BOOT_PROTOCOL_ONLY +// #define HID_STATETABLE_STACK_DEPTH {Insert Value Here} +// #define HID_USAGE_STACK_DEPTH {Insert Value Here} +// #define HID_MAX_COLLECTIONS {Insert Value Here} +// #define HID_MAX_REPORTITEMS {Insert Value Here} +// #define HID_MAX_REPORT_IDS {Insert Value Here} +// #define NO_CLASS_DRIVER_AUTOFLUSH + + /* General USB Driver Related Tokens: */ +// #define ORDERED_EP_CONFIG + #define USE_STATIC_OPTIONS (USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL) + #define USB_DEVICE_ONLY +// #define USB_HOST_ONLY +// #define USB_STREAM_TIMEOUT_MS {Insert Value Here} +// #define NO_LIMITED_CONTROLLER_CONNECT +// #define NO_SOF_EVENTS + + /* USB Device Mode Driver Related Tokens: */ +// #define USE_RAM_DESCRIPTORS + #define USE_FLASH_DESCRIPTORS +// #define USE_EEPROM_DESCRIPTORS +// #define NO_INTERNAL_SERIAL + #define FIXED_CONTROL_ENDPOINT_SIZE 8 +// #define DEVICE_STATE_AS_GPIOR {Insert Value Here} + #define FIXED_NUM_CONFIGURATIONS 1 +// #define CONTROL_ONLY_DEVICE +// #define INTERRUPT_CONTROL_ENDPOINT +// #define NO_DEVICE_REMOTE_WAKEUP +// #define NO_DEVICE_SELF_POWER + + /* USB Host Mode Driver Related Tokens: */ +// #define HOST_STATE_AS_GPIOR {Insert Value Here} +// #define USB_HOST_TIMEOUT_MS {Insert Value Here} +// #define HOST_DEVICE_SETTLE_DELAY_MS {Insert Value Here} +// #define NO_AUTO_VBUS_MANAGEMENT +// #define INVERTED_VBUS_ENABLE_LINE +#endif diff --git a/Firmware/SwitchDual/Descriptors.c b/Firmware/SwitchDual/Descriptors.c new file mode 100644 index 0000000..e6c4446 --- /dev/null +++ b/Firmware/SwitchDual/Descriptors.c @@ -0,0 +1,344 @@ +#include "Descriptors.h" +#include "Config.h" +// HID Descriptors. +const USB_Descriptor_HIDReport_Datatype_t PROGMEM JoystickReport[] = { + HID_RI_USAGE_PAGE(8,1), /* Generic Desktop */ + HID_RI_USAGE(8,5), /* Joystick */ + HID_RI_COLLECTION(8,1), /* Application */ + // Buttons (2 bytes) + HID_RI_LOGICAL_MINIMUM(8,0), + HID_RI_LOGICAL_MAXIMUM(8,1), + HID_RI_PHYSICAL_MINIMUM(8,0), + HID_RI_PHYSICAL_MAXIMUM(8,1), + // The Switch will allow us to expand the original HORI descriptors to a full 16 buttons. + // The Switch will make use of 14 of those buttons. + HID_RI_REPORT_SIZE(8,1), + HID_RI_REPORT_COUNT(8,16), + HID_RI_USAGE_PAGE(8,9), + HID_RI_USAGE_MINIMUM(8,1), + HID_RI_USAGE_MAXIMUM(8,16), + HID_RI_INPUT(8,2), + // HAT Switch (1 nibble) + HID_RI_USAGE_PAGE(8,1), + HID_RI_LOGICAL_MAXIMUM(8,7), + HID_RI_PHYSICAL_MAXIMUM(16,315), + HID_RI_REPORT_SIZE(8,4), + HID_RI_REPORT_COUNT(8,1), + HID_RI_UNIT(8,20), + HID_RI_USAGE(8,57), + HID_RI_INPUT(8,66), + // There's an additional nibble here that's utilized as part of the Switch Pro Controller. + // I believe this -might- be separate U/D/L/R bits on the Switch Pro Controller, as they're utilized as four button descriptors on the Switch Pro Controller. + HID_RI_UNIT(8,0), + HID_RI_REPORT_COUNT(8,1), + HID_RI_INPUT(8,1), + // Joystick (4 bytes) + HID_RI_LOGICAL_MAXIMUM(16,255), + HID_RI_PHYSICAL_MAXIMUM(16,255), + HID_RI_USAGE(8,48), + HID_RI_USAGE(8,49), + HID_RI_USAGE(8,50), + HID_RI_USAGE(8,53), + HID_RI_REPORT_SIZE(8,8), + HID_RI_REPORT_COUNT(8,4), + HID_RI_INPUT(8,2), + // ??? Vendor Specific (1 byte) + // This byte requires additional investigation. + HID_RI_USAGE_PAGE(16,65280), + HID_RI_USAGE(8,32), + HID_RI_REPORT_COUNT(8,1), + HID_RI_INPUT(8,2), + // Output (8 bytes) + // Original observation of this suggests it to be a mirror of the inputs that we sent. + // The Switch requires us to have these descriptors available. + HID_RI_USAGE(16,9761), + HID_RI_REPORT_COUNT(8,8), + HID_RI_OUTPUT(8,2), + HID_RI_END_COLLECTION(0), +}; + + +/** HID class report descriptor. This is a special descriptor constructed with values from the + * USBIF HID class specification to describe the reports and capabilities of the HID device. This + * descriptor is parsed by the host and its contents used to determine what data (and in what encoding) + * the device will send, and what it may be sent back from the host. Refer to the HID specification for + * more details on HID report descriptors. + */ +const USB_Descriptor_HIDReport_Datatype_t PROGMEM GenericReport[] = +{ + HID_RI_USAGE_PAGE(16, 0xFFDC), /* Vendor Page 0xDC */ + HID_RI_USAGE(8, 0xFB), /* Vendor Usage 0xFB */ + HID_RI_COLLECTION(8, 0x01), /* Vendor Usage 1 */ + HID_RI_USAGE(8, 0x02), /* Vendor Usage 2 */ + HID_RI_LOGICAL_MINIMUM(8, 0x00), + HID_RI_LOGICAL_MAXIMUM(8, 0xFF), + HID_RI_REPORT_SIZE(8, 8), + HID_RI_REPORT_COUNT(8, TATACON_CONFIG_BYTES), + HID_RI_OUTPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE | HID_IOF_NON_VOLATILE), + + HID_RI_USAGE(8, 0x02), /* Vendor Usage 2 */ + HID_RI_LOGICAL_MINIMUM(8, 0x00), + HID_RI_LOGICAL_MAXIMUM(8, 0xFF), + HID_RI_REPORT_SIZE(8, 8), + HID_RI_REPORT_COUNT(8, TATACON_CONFIG_BYTES), + HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE | HID_IOF_NON_VOLATILE), + HID_RI_END_COLLECTION(0), +}; +// Device Descriptor Structure +const USB_Descriptor_Device_t PROGMEM DeviceDescriptor = { + .Header = {.Size = sizeof(USB_Descriptor_Device_t), .Type = DTYPE_Device}, + + .USBSpecification = VERSION_BCD(2,0,0), + .Class = USB_CSCP_NoDeviceClass, + .SubClass = USB_CSCP_NoDeviceSubclass, + .Protocol = USB_CSCP_NoDeviceProtocol, + + .Endpoint0Size = FIXED_CONTROL_ENDPOINT_SIZE, + + .VendorID = 0x0F0D, + .ProductID = 0x0092, + .ReleaseNumber = VERSION_BCD(1,0,0), + + .ManufacturerStrIndex = STRING_ID_Manufacturer, + .ProductStrIndex = STRING_ID_Product, + .SerialNumStrIndex = NO_DESCRIPTOR, + + .NumberOfConfigurations = FIXED_NUM_CONFIGURATIONS +}; + +// Configuration Descriptor Structure +const 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 = 0x80, + + .MaxPowerConsumption = USB_CONFIG_POWER_MA(500) + }, + + .HID_Interface = + { + .Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, + + .InterfaceNumber = INTERFACE_ID_Joystick, + .AlternateSetting = 0x00, + + .TotalEndpoints = 2, + + .Class = HID_CSCP_HIDClass, + .SubClass = HID_CSCP_NonBootSubclass, + .Protocol = HID_CSCP_NonBootProtocol, + + .InterfaceStrIndex = NO_DESCRIPTOR + }, + + .HID_JoystickHID = + { + .Header = {.Size = sizeof(USB_HID_Descriptor_HID_t), .Type = HID_DTYPE_HID}, + + .HIDSpec = VERSION_BCD(1,1,1), + .CountryCode = 0x00, + .TotalReportDescriptors = 1, + .HIDReportType = HID_DTYPE_Report, + .HIDReportLength = sizeof(JoystickReport) + }, + + .HID_ReportINEndpoint = + { + .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, + + .EndpointAddress = JOYSTICK_IN_EPADDR, + .Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), + .EndpointSize = JOYSTICK_EPSIZE, + .PollingIntervalMS = 0x05 + }, + + .HID_ReportOUTEndpoint = + { + .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, + + .EndpointAddress = JOYSTICK_OUT_EPADDR, + .Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), + .EndpointSize = JOYSTICK_EPSIZE, + .PollingIntervalMS = 0x05 + }, + .HID3_Interface = + { + .Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, + + .InterfaceNumber = INTERFACE_ID_Joystick2, + .AlternateSetting = 0x00, + + .TotalEndpoints = 2, + + .Class = HID_CSCP_HIDClass, + .SubClass = HID_CSCP_NonBootSubclass, + .Protocol = HID_CSCP_NonBootProtocol, + + .InterfaceStrIndex = NO_DESCRIPTOR + }, + + .HID3_JoystickHID = + { + .Header = {.Size = sizeof(USB_HID_Descriptor_HID_t), .Type = HID_DTYPE_HID}, + + .HIDSpec = VERSION_BCD(1,1,1), + .CountryCode = 0x00, + .TotalReportDescriptors = 1, + .HIDReportType = HID_DTYPE_Report, + .HIDReportLength = sizeof(JoystickReport) + }, + + .HID3_ReportINEndpoint = + { + .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, + + .EndpointAddress = JOYSTICK2_IN_EPADDR, + .Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), + .EndpointSize = JOYSTICK_EPSIZE, + .PollingIntervalMS = 0x05 + }, + + .HID3_ReportOUTEndpoint = + { + .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, + + .EndpointAddress = JOYSTICK2_OUT_EPADDR, + .Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), + .EndpointSize = JOYSTICK_EPSIZE, + .PollingIntervalMS = 0x05 + }, + // .HID2_Interface = + // { + // .Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, + + // .InterfaceNumber = INTERFACE_ID_Generic, + // .AlternateSetting = 0x00, + + // .TotalEndpoints = 1, + + // .Class = HID_CSCP_HIDClass, + // .SubClass = HID_CSCP_NonBootSubclass, + // .Protocol = HID_CSCP_NonBootProtocol, + + // .InterfaceStrIndex = STRING_ID_Config + // }, + + // .HID2_VendorHID = + // { + // .Header = {.Size = sizeof(USB_HID_Descriptor_HID_t), .Type = HID_DTYPE_HID}, + + // .HIDSpec = VERSION_BCD(1,1,1), + // .CountryCode = 0x00, + // .TotalReportDescriptors = 1, + // .HIDReportType = HID_DTYPE_Report, + // .HIDReportLength = sizeof(GenericReport) + // }, + + // .HID2_ReportINEndpoint = + // { + // .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, + + // .EndpointAddress = GENERIC_EPADDR, + // .Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), + // .EndpointSize = GENERIC_EPSIZE, + // .PollingIntervalMS = 255 + // }, +}; + +// Language Descriptor Structure +const USB_Descriptor_String_t PROGMEM LanguageString = USB_STRING_DESCRIPTOR_ARRAY(LANGUAGE_ID_ENG); + +// Manufacturer and Product Descriptor Strings +const USB_Descriptor_String_t PROGMEM ManufacturerString = USB_STRING_DESCRIPTOR(L"HORI CO.,LTD."); +const USB_Descriptor_String_t PROGMEM ProductString = USB_STRING_DESCRIPTOR(L"POKKEN CONTROLLER"); +const USB_Descriptor_String_t PROGMEM ConfigString = USB_STRING_DESCRIPTOR(L"Tatacon Config"); +const USB_Descriptor_String_t PROGMEM TataconString = USB_STRING_DESCRIPTOR(L"Tatacon"); +// USB Device Callback - Get Descriptor +uint16_t CALLBACK_USB_GetDescriptor( + const uint16_t wValue, + const uint16_t wIndex, + const void** const DescriptorAddress +) { + const uint8_t DescriptorType = (wValue >> 8); + const uint8_t DescriptorNumber = (wValue & 0xFF); + + const void* Address = NULL; + uint16_t Size = NO_DESCRIPTOR; + + switch (DescriptorType) + { + case DTYPE_Device: + Address = &DeviceDescriptor; + Size = sizeof(USB_Descriptor_Device_t); + break; + case DTYPE_Configuration: + Address = &ConfigurationDescriptor; + Size = sizeof(USB_Descriptor_Configuration_t); + break; + case DTYPE_String: + switch (DescriptorNumber) { + case STRING_ID_Language: + Address = &LanguageString; + Size = pgm_read_byte(&LanguageString.Header.Size); + break; + case STRING_ID_Manufacturer: + Address = &ManufacturerString; + Size = pgm_read_byte(&ManufacturerString.Header.Size); + break; + case STRING_ID_Product: + Address = &ProductString; + Size = pgm_read_byte(&ProductString.Header.Size); + break; + case STRING_ID_Config: + Address = &ConfigString; + Size = pgm_read_byte(&ConfigString.Header.Size); + break; + case STRING_ID_Tatacon: + Address = &TataconString; + Size = pgm_read_byte(&TataconString.Header.Size); + break; + } + break; + case DTYPE_HID: + switch (wIndex) { + case INTERFACE_ID_Joystick: + Address = &ConfigurationDescriptor.HID_JoystickHID; + Size = sizeof(USB_HID_Descriptor_HID_t); + break; + // case INTERFACE_ID_Generic: + // Address = &ConfigurationDescriptor.HID2_VendorHID; + // break; + case INTERFACE_ID_Joystick2: + Address = &ConfigurationDescriptor.HID3_JoystickHID; + Size = sizeof(USB_HID_Descriptor_HID_t); + break; + } + case DTYPE_Report: + switch (wIndex) { + case INTERFACE_ID_Joystick: + Address = &JoystickReport; + Size = sizeof(JoystickReport); + break; + // case INTERFACE_ID_Generic: + // Address = &GenericReport; + // Size = sizeof(GenericReport); + // break; + case INTERFACE_ID_Joystick2: + Address = &JoystickReport; + Size = sizeof(JoystickReport); + break; + } + break; + } + + *DescriptorAddress = Address; + return Size; +} diff --git a/Firmware/SwitchDual/Descriptors.h b/Firmware/SwitchDual/Descriptors.h new file mode 100644 index 0000000..e9d984d --- /dev/null +++ b/Firmware/SwitchDual/Descriptors.h @@ -0,0 +1,80 @@ +#ifndef _DESCRIPTORS_H_ +#define _DESCRIPTORS_H_ + +// Includes +#include + +#include + +// Type Defines +// Device Configuration Descriptor Structure +typedef struct +{ + USB_Descriptor_Configuration_Header_t Config; + + // Joystick HID Interface + USB_Descriptor_Interface_t HID_Interface; + USB_HID_Descriptor_HID_t HID_JoystickHID; + USB_Descriptor_Endpoint_t HID_ReportOUTEndpoint; + USB_Descriptor_Endpoint_t HID_ReportINEndpoint; + + + // Joystick HID Interface + USB_Descriptor_Interface_t HID3_Interface; + USB_HID_Descriptor_HID_t HID3_JoystickHID; + USB_Descriptor_Endpoint_t HID3_ReportOUTEndpoint; + USB_Descriptor_Endpoint_t HID3_ReportINEndpoint; + + // Generic HID Interface + // USB_Descriptor_Interface_t HID2_Interface; + // USB_HID_Descriptor_HID_t HID2_VendorHID; + // USB_Descriptor_Endpoint_t HID2_ReportINEndpoint; + +} USB_Descriptor_Configuration_t; + +// Device Interface Descriptor IDs +enum InterfaceDescriptors_t +{ + INTERFACE_ID_Joystick = 0, /**< Joystick interface descriptor ID */ + INTERFACE_ID_Joystick2 = 1, + // INTERFACE_ID_Generic = 2, /**< Generic interface descriptor ID */ +}; + +// Device String Descriptor IDs +enum StringDescriptors_t +{ + STRING_ID_Language = 0, // Supported Languages string descriptor ID (must be zero) + STRING_ID_Manufacturer = 1, // Manufacturer string ID + STRING_ID_Product = 2, // Product string ID + STRING_ID_Config = 3, /**< Config string ID */ + STRING_ID_Tatacon = 4, /**< Config string ID */ +}; + +// Macros +// Endpoint Addresses +#define JOYSTICK_IN_EPADDR (ENDPOINT_DIR_IN | 1) +#define JOYSTICK_OUT_EPADDR (ENDPOINT_DIR_OUT | 3) +#define JOYSTICK2_IN_EPADDR (ENDPOINT_DIR_IN | 2) +#define JOYSTICK2_OUT_EPADDR (ENDPOINT_DIR_OUT | 4) +// HID Endpoint Size +// The Switch -needs- this to be 64. +// The Wii U is flexible, allowing us to use the default of 8 (which did not match the original Hori descriptors). +#define JOYSTICK_EPSIZE 64 +// Descriptor Header Type - HID Class HID Descriptor +#define DTYPE_HID 0x21 +// Descriptor Header Type - HID Class HID Report Descriptor +#define DTYPE_Report 0x22 + +#define GENERIC_EPADDR (ENDPOINT_DIR_IN | 5) + +/** Size in bytes of the Keyboard HID reporting IN endpoint. */ +#define GENERIC_EPSIZE TATACON_CONFIG_BYTES + +// Function Prototypes +uint16_t CALLBACK_USB_GetDescriptor( + const uint16_t wValue, + const uint16_t wIndex, + const void** const DescriptorAddress +) ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(3); + +#endif \ No newline at end of file diff --git a/Firmware/SwitchDual/Joystick.c b/Firmware/SwitchDual/Joystick.c new file mode 100644 index 0000000..d7eb010 --- /dev/null +++ b/Firmware/SwitchDual/Joystick.c @@ -0,0 +1,453 @@ +#include "Joystick.h" +#include "i2cmaster.h" +#include "Config.h" + +#ifdef DEBUG +#include "usbio.h" +#include +#endif + +static uint8_t PrevGenericHIDReportBuffer[TATACON_CONFIG_BYTES]; + +// USB_ClassInfo_HID_Device_t Generic_HID_Interface = +// { +// .Config = +// { +// .InterfaceNumber = INTERFACE_ID_Generic, +// .ReportINEndpoint = +// { +// .Address = GENERIC_EPADDR, +// .Size = GENERIC_EPSIZE, +// .Banks = 1, +// }, +// .PrevReportINBuffer = PrevGenericHIDReportBuffer, +// .PrevReportINBufferSize = sizeof(PrevGenericHIDReportBuffer), +// }, +// }; +// V1 hardware has no LEDs +#ifdef V1_BUILD + #define SET(port, pin) + #define CLEAR(port, pin) + #define TOGGLE(port, pin) +#else + #define SET(port, pin) port |= _BV(pin) + #define CLEAR(port, pin) port &= ~_BV(pin) + #define TOGGLE(port, pin) port ^= _BV(pin) +#endif + +uint32_t Boot_Key ATTR_NO_INIT; +#define MAGIC_BOOT_KEY 0xDEADBE7A +// offset * word size +#define BOOTLOADER_START_ADDRESS (0x1c00 * 2) + +void Bootloader_Jump_Check(void) ATTR_INIT_SECTION(3); +void Bootloader_Jump_Check(void) { + // If the reset source was the bootloader and the key is correct, clear it and jump to the bootloader + if ((MCUSR & (1 << WDRF)) && (Boot_Key == MAGIC_BOOT_KEY)) { + Boot_Key = 0; + ((void (*)(void))BOOTLOADER_START_ADDRESS)(); + } +} + +typedef struct { + // optimise data sending + uint8_t state; + uint8_t lastReport; + uint8_t debounce; +} switch_t; + + +static switch_t switches[TATACON_SWITCHES]; +static uint8_t switchesChanged = 1; +static uint8_t nunchuckReady = 0; +ControllerState state = {.state = SYNC_CONTROLLER, .report_count = 0, .echoes = 0}; +ControllerState state2 = {.state = SYNC_CONTROLLER, .report_count = 0, .echoes = 0}; +#define ECHOES 2 +int echoes = 0; + +USB_JoystickReport_Input_t last_report; + +// Main entry point. +int main(void) { + InitConfig(); + + // We'll start by performing hardware and peripheral setup. + SetupHardware(); + // We'll then enable global interrupts for our use. + GlobalInterruptEnable(); + // Once that's done, we'll enter an infinite loop. + for (;;) { + // We need to run our task to process and deliver data for our IN and OUT endpoints. + // HID_Device_USBTask(&Generic_HID_Interface); + HID_Task(); + + // We also need to run the main USB management task. + USB_USBTask(); + } +} + +// Process and deliver data from IN and OUT endpoints. +void HID_Task(void) { + // If the device isn't connected and properly configured, we can't do anything here. + if (USB_DeviceState != DEVICE_STATE_Configured) { + SET(LED_PORT, DON_LED_PIN); + SET(LED_PORT, KAT_LED_PIN); + return; + } + + // We'll start with the OUT endpoint. + Endpoint_SelectEndpoint(JOYSTICK_OUT_EPADDR); + // We'll check to see if we received something on the OUT endpoint. + if (Endpoint_IsOUTReceived()) { + // If we did, and the packet has data, we'll react to it. + if (Endpoint_IsReadWriteAllowed()) { + // We'll create a place to store our data received from the host. + USB_JoystickReport_Output_t JoystickOutputData; + // We'll then take in that data, setting it up in our storage. + while(Endpoint_Read_Stream_LE(&JoystickOutputData, sizeof(JoystickOutputData), NULL) != ENDPOINT_RWSTREAM_NoError); + // At this point, we can react to this data. + // However, since we're not doing anything with this data, we abandon it. + } + // Regardless of whether we reacted to the data, we acknowledge an OUT packet on this endpoint. + Endpoint_ClearOUT(); + } + + // We'll then move on to the IN endpoint. + Endpoint_SelectEndpoint(JOYSTICK_IN_EPADDR); + // We first check to see if the host is ready to accept data. + if (Endpoint_IsINReady()) { + // We'll create an empty report. + USB_JoystickReport_Input_t JoystickInputData; + // We'll then populate this report with what we want to send to the host. + GetNextReport(&JoystickInputData, &state2); + // Once populated, we can output this data to the host. We do this by first writing the data to the control stream. + while(Endpoint_Write_Stream_LE(&JoystickInputData, sizeof(JoystickInputData), NULL) != ENDPOINT_RWSTREAM_NoError); + // We then send an IN packet on this endpoint. + Endpoint_ClearIN(); + } + // We'll start with the OUT endpoint. + Endpoint_SelectEndpoint(JOYSTICK2_OUT_EPADDR); + // We'll check to see if we received something on the OUT endpoint. + if (Endpoint_IsOUTReceived()) { + // If we did, and the packet has data, we'll react to it. + if (Endpoint_IsReadWriteAllowed()) { + // We'll create a place to store our data received from the host. + USB_JoystickReport_Output_t JoystickOutputData; + // We'll then take in that data, setting it up in our storage. + while(Endpoint_Read_Stream_LE(&JoystickOutputData, sizeof(JoystickOutputData), NULL) != ENDPOINT_RWSTREAM_NoError); + // At this point, we can react to this data. + // However, since we're not doing anything with this data, we abandon it. + } + // Regardless of whether we reacted to the data, we acknowledge an OUT packet on this endpoint. + Endpoint_ClearOUT(); + } + + // We'll then move on to the IN endpoint. + Endpoint_SelectEndpoint(JOYSTICK2_IN_EPADDR); + // We first check to see if the host is ready to accept data. + if (Endpoint_IsINReady()) { + // We'll create an empty report. + USB_JoystickReport_Input_t JoystickInputData; + // We'll then populate this report with what we want to send to the host. + GetNextReport(&JoystickInputData, &state); + // Once populated, we can output this data to the host. We do this by first writing the data to the control stream. + while(Endpoint_Write_Stream_LE(&JoystickInputData, sizeof(JoystickInputData), NULL) != ENDPOINT_RWSTREAM_NoError); + // We then send an IN packet on this endpoint. + Endpoint_ClearIN(); + } +} + + + + + +void nunchuck_online(void) { + if(!nunchuckReady) { + nunchuckReady = 1; + // Turn LEDs off, it returned + CLEAR(LED_PORT, DON_LED_PIN); + CLEAR(LED_PORT, KAT_LED_PIN); + } +} + +void nunchuck_offline(void) { + i2c_stop(); + if(nunchuckReady) { + nunchuckReady = 0; + // Turn LEDs on until it returns + // SET(LED_PORT, DON_LED_PIN); + // SET(LED_PORT, KAT_LED_PIN); + // Clear structs + for(int i = 0; i < KB_SWITCHES; i++) { + switches[i].state = 0; + if(switches[i].state != switches[i].lastReport) { + switchesChanged = 1; + } + } + } +} + +void nunchuck_init(void) { + // try to say hello + if(!i2c_start(NUNCHUCK_ADDR | I2C_WRITE)) { + i2c_write(0xF0); + i2c_write(0x55); + i2c_stop(); + _delay_ms(25); + + i2c_start(NUNCHUCK_ADDR | I2C_WRITE); + i2c_write(0xFB); + i2c_write(0x00); + i2c_stop(); + _delay_ms(25); + nunchuck_online(); + } else { + nunchuck_offline(); + } +} + +uint8_t nunchuck_readByte(uint8_t address) { + uint8_t data = 0xFF; + + if(!nunchuckReady) { + nunchuck_init(); + } + + if(!i2c_start(NUNCHUCK_ADDR | I2C_WRITE)) { + i2c_write(address); + i2c_stop(); + + i2c_start(NUNCHUCK_ADDR | I2C_READ); + data = i2c_readNak(); + i2c_stop(); + nunchuck_online(); + } else { + nunchuck_offline(); + } + return data; +} + +// Starting at address, read n bytes and return the last +void nunchuck_readMany(uint8_t address, uint8_t *data, uint8_t count) { + + if(!nunchuckReady) { + nunchuck_init(); + } + + if(!i2c_start(NUNCHUCK_ADDR | I2C_WRITE)) { + i2c_write(address); + i2c_stop(); + + i2c_start(NUNCHUCK_ADDR | I2C_READ); + for(uint8_t i = 0; i < count-1; i++) { + data[i] = i2c_readAck(); + } + data[count-1] = i2c_readNak(); + i2c_stop(); + nunchuck_online(); + } else { + nunchuck_offline(); + } +} + + + + + +void GetNextReport(USB_JoystickReport_Input_t* const reportData, ControllerState *cstate) { + uint8_t data, i; + // Prepare an empty report + memset(reportData, 0, sizeof(USB_JoystickReport_Input_t)); + reportData->LX = STICK_CENTER; + reportData->LY = STICK_CENTER; + reportData->RX = STICK_CENTER; + reportData->RY = STICK_CENTER; + reportData->HAT = HAT_CENTER; + + // Repeat ECHOES times the last report + if (cstate->echoes > 0) { + memcpy(reportData, &last_report, sizeof(USB_JoystickReport_Input_t)); + cstate->echoes--; + return; + } + + // States and moves management + switch (cstate->state) { + case SYNC_CONTROLLER: + if (cstate->report_count > 100) { + cstate->report_count = 0; + cstate->state = TATACON_PASSTHROUGH; + } + else if (cstate->report_count == 25 || cstate->report_count == 50) { + reportData->Button |= SWITCH_L | SWITCH_R; + } + else if (cstate->report_count == 75 || cstate->report_count == 100) { + reportData->Button |= SWITCH_A; + } + cstate->report_count++; + break; + case TATACON_PASSTHROUGH: + // Get tatacon button data + data = nunchuck_readByte(BUTTONS_DATA); + CLEAR(LED_PORT, KAT_LED_PIN); + + // Tatacon has 4 inputs to check + for(i = 0; i < TATACON_SWITCHES; i++) { + // The I2C data starts at the 6th bit and goes down + uint8_t newState = !(data & _BV(TATACON_BUTTONS_START - i)); + if(!switches[i].debounce && switches[i].state != newState) { + SET(LED_PORT, KAT_LED_PIN); + reportData->Button |= tataConfig.switches[i]; + switches[i].state = newState; + switches[i].debounce = tataConfig.debounce; + switchesChanged = 1; + } + } + break; + } + memcpy(&last_report, reportData, sizeof(USB_JoystickReport_Input_t)); + cstate->echoes = ECHOES; +} + + + + +void SetupHardware() { + /* Disable watchdog if enabled by bootloader/fuses */ + MCUSR &= ~(1 << WDRF); + wdt_disable(); + +#ifdef V1_BUILD + CLKPR = (1 << CLKPCE); // enable a change to CLKPR + CLKPR = 0; // set the CLKDIV to 0 - was 0011b = div by 8 taking 8MHz to 1MHz +#endif + clock_prescale_set(clock_div_1); + /* Hardware Initialization */ + SET(LED_DIR, DON_LED_PIN); + SET(LED_DIR, KAT_LED_PIN); + +#ifdef DEBUG + init_usb_stdio(); + SET(LED_PORT, DON_LED_PIN); + for(int i = 0; i < 32; i++) { + TOGGLE(LED_PORT, DON_LED_PIN); + TOGGLE(LED_PORT, KAT_LED_PIN); + _delay_ms(125); + } +#endif + // if(tataConfig.ledsOn) { + // Turn them on until we init with the nunchuck + // SET(LED_PORT, DON_LED_PIN); + // SET(LED_PORT, KAT_LED_PIN); + // } + i2c_init(); + nunchuck_init(); + USB_Init(); +} + +// LUFA USB Events + +// Fired to indicate that the device is enumerating. +void EVENT_USB_Device_Connect(void) { + // We can indicate that we're enumerating here (via status LEDs, sound, etc.). + SET(LED_PORT, DON_LED_PIN); + SET(LED_PORT, KAT_LED_PIN); +} + +// Fired to indicate that the device is no longer connected to a host. +void EVENT_USB_Device_Disconnect(void) { + // We can indicate that our device is not ready (via status LEDs, sound, etc.). + CLEAR(LED_PORT, DON_LED_PIN); + CLEAR(LED_PORT, KAT_LED_PIN); +} + +// Fired when the host set the current configuration of the USB device after enumeration. +void EVENT_USB_Device_ConfigurationChanged(void) { + bool ConfigSuccess = true; + + // We setup the HID report endpoints. + ConfigSuccess &= Endpoint_ConfigureEndpoint(JOYSTICK_OUT_EPADDR, EP_TYPE_INTERRUPT, JOYSTICK_EPSIZE, 1); + ConfigSuccess &= Endpoint_ConfigureEndpoint(JOYSTICK_IN_EPADDR, EP_TYPE_INTERRUPT, JOYSTICK_EPSIZE, 1); + ConfigSuccess &= Endpoint_ConfigureEndpoint(JOYSTICK2_OUT_EPADDR, EP_TYPE_INTERRUPT, JOYSTICK_EPSIZE, 1); + ConfigSuccess &= Endpoint_ConfigureEndpoint(JOYSTICK2_IN_EPADDR, EP_TYPE_INTERRUPT, JOYSTICK_EPSIZE, 1); + // HID_Device_ConfigureEndpoints(&Generic_HID_Interface); + + // We can read ConfigSuccess to indicate a success or failure at this point. + if (ConfigSuccess) { + CLEAR(LED_PORT, DON_LED_PIN); + CLEAR(LED_PORT, KAT_LED_PIN); + } + USB_Device_EnableSOFEvents(); + +} + +// Process control requests sent to the device from the USB host. +void EVENT_USB_Device_ControlRequest(void) { + // We can handle two control requests: a GetReport and a SetReport. + // HID_Device_ProcessControlRequest(&Generic_HID_Interface); + + // Not used here, it looks like we don't receive control request from the Switch. +} + +// Event handler for the USB device Start Of Frame event. +void EVENT_USB_Device_StartOfFrame(void) { + // HID_Device_MillisecondElapsed(&Generic_HID_Interface); + + for(int i = 0; i < TATACON_SWITCHES; i++) { + if(switches[i].debounce) { + switches[i].debounce--; + } + } +} + +// bool CALLBACK_HID_Device_CreateHIDReport(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo, +// uint8_t* const ReportID, +// const uint8_t ReportType, +// void* ReportData, +// uint16_t* const ReportSize) +// { +// if(ReportType != HID_REPORT_ITEM_In) { +// *ReportSize = 0; +// return false; +// } +// if(HIDInterfaceInfo == &Generic_HID_Interface) { +// uint8_t* ConfigReport = (uint8_t*)ReportData; +// memcpy(ConfigReport, &tataConfig, sizeof(tatacon_config_t)); +// *ReportSize = TATACON_CONFIG_BYTES; +// //TOGGLE(LED_PORT, DON_LED_PIN); +// return true; +// } +// *ReportSize = 0; +// return false; +// } + +// // * HID class driver callback function for the processing of HID reports from the host. +// // * +// // * \param[in] HIDInterfaceInfo Pointer to the HID class interface configuration structure being referenced +// // * \param[in] ReportID Report ID of the received report from the host +// // * \param[in] ReportType The type of report that the host has sent, either HID_REPORT_ITEM_Out or HID_REPORT_ITEM_Feature +// // * \param[in] ReportData Pointer to a buffer where the received report has been stored +// // * \param[in] ReportSize Size in bytes of the received HID report + +// void CALLBACK_HID_Device_ProcessHIDReport(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo, +// const uint8_t ReportID, +// const uint8_t ReportType, +// const void* ReportData, +// const uint16_t ReportSize) +// { +// if(HIDInterfaceInfo == &Generic_HID_Interface && ReportType == HID_REPORT_ITEM_Out) { +// uint8_t* ConfigReport = (uint8_t*)ReportData; +// // So we can upgrade firmware without having to hit the button +// if(ConfigReport[TATACON_CONFIG_BYTES-1] == MAGIC_RESET_NUMBER) { +// // With this uncommented, reboot fails. Odd. +// //USB_Disable(); +// cli(); + +// // Back to the bootloader +// Boot_Key = MAGIC_BOOT_KEY; +// wdt_enable(WDTO_250MS); +// while(1); +// } +// SetConfig(ConfigReport); +// } +// } \ No newline at end of file diff --git a/Firmware/SwitchDual/Joystick.h b/Firmware/SwitchDual/Joystick.h new file mode 100644 index 0000000..ded9742 --- /dev/null +++ b/Firmware/SwitchDual/Joystick.h @@ -0,0 +1,157 @@ +/* + LUFA Library + Copyright (C) Dean Camera, 2014. + + dean [at] fourwalledcubicle [dot] com + www.lufa-lib.org +*/ + +/* + Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com) + + Permission to use, copy, modify, distribute, and sell this + software and its documentation for any purpose is hereby granted + without fee, provided that the above copyright notice appear in + all copies and that both that the copyright notice and this + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the + software without specific, written prior permission. + + The author disclaims 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 Joystick.c. + */ + +#ifndef _JOYSTICK_H_ +#define _JOYSTICK_H_ + +/* Includes: */ +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include "Descriptors.h" + +// Tatacon USB Pin Config +#define LED_DIR DDRD +#define LED_PORT PORTD +#define DON_LED_PIN 6 +#define KAT_LED_PIN 5 + +// Nunchuck I2C address +#define NUNCHUCK_ADDR (0x52 << 1) +#define BUTTONS_DATA 0x05 +#define TATACON_BUTTONS_START 6 +#define TATACON_SWITCHES 4 + +// Type Defines +// Enumeration for joystick buttons. +typedef enum { + SWITCH_Y = 0x01, + SWITCH_B = 0x02, + SWITCH_A = 0x04, + SWITCH_X = 0x08, + SWITCH_L = 0x10, + SWITCH_R = 0x20, + SWITCH_ZL = 0x40, + SWITCH_ZR = 0x80, + SWITCH_MINUS = 0x100, + SWITCH_PLUS = 0x200, + SWITCH_LCLICK = 0x400, + SWITCH_RCLICK = 0x800, + SWITCH_HOME = 0x1000, + SWITCH_CAPTURE = 0x2000, +} JoystickButtons_t; + +#define HAT_TOP 0x00 +#define HAT_TOP_RIGHT 0x01 +#define HAT_RIGHT 0x02 +#define HAT_BOTTOM_RIGHT 0x03 +#define HAT_BOTTOM 0x04 +#define HAT_BOTTOM_LEFT 0x05 +#define HAT_LEFT 0x06 +#define HAT_TOP_LEFT 0x07 +#define HAT_CENTER 0x08 + +#define STICK_MIN 0 +#define STICK_CENTER 128 +#define STICK_MAX 255 + +// Joystick HID report structure. We have an input and an output. +typedef struct { + uint16_t Button; // 16 buttons; see JoystickButtons_t for bit mapping + uint8_t HAT; // HAT switch; one nibble w/ unused nibble + uint8_t LX; // Left Stick X + uint8_t LY; // Left Stick Y + uint8_t RX; // Right Stick X + uint8_t RY; // Right Stick Y + uint8_t VendorSpec; +} USB_JoystickReport_Input_t; + +// The output is structured as a mirror of the input. +// This is based on initial observations of the Pokken Controller. +typedef struct { + uint16_t Button; // 16 buttons; see JoystickButtons_t for bit mapping + uint8_t HAT; // HAT switch; one nibble w/ unused nibble + uint8_t LX; // Left Stick X + uint8_t LY; // Left Stick Y + uint8_t RX; // Right Stick X + uint8_t RY; // Right Stick Y +} USB_JoystickReport_Output_t; + +typedef enum { + SYNC_CONTROLLER, + TATACON_PASSTHROUGH +} State_t; + +typedef struct controllerState { + State_t state; + int report_count; + int echoes; +} ControllerState; +// Function Prototypes +// Setup all necessary hardware, including USB initialization. +void SetupHardware(void); +// Process and deliver data from IN and OUT endpoints. +void HID_Task(void); +// USB device event handlers. +void EVENT_USB_Device_Connect(void); +void EVENT_USB_Device_Disconnect(void); +void EVENT_USB_Device_ConfigurationChanged(void); +void EVENT_USB_Device_ControlRequest(void); +//void EVENT_USB_Device_StartOfFrame(void); + +// Prepare the next report for the host. +void GetNextReport(USB_JoystickReport_Input_t* const ReportData, ControllerState *cstate); +bool CALLBACK_HID_Device_CreateHIDReport(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo, + uint8_t* const ReportID, + const uint8_t ReportType, + void* ReportData, + uint16_t* const ReportSize); +void CALLBACK_HID_Device_ProcessHIDReport(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo, + const uint8_t ReportID, + const uint8_t ReportType, + const void* ReportData, + const uint16_t ReportSize); +#endif diff --git a/Firmware/SwitchDual/asciihid.h b/Firmware/SwitchDual/asciihid.h new file mode 100644 index 0000000..9f66468 --- /dev/null +++ b/Firmware/SwitchDual/asciihid.h @@ -0,0 +1,145 @@ +// https://github.com/SFE-Chris/UNO-HIDKeyboard-Library/blob/master/HIDKeyboard.h + +#include + +// HID Values of Function Keys +#define F1 0x3a +#define F2 0x3b +#define F3 0x3c +#define F4 0x3d +#define F5 0x3e +#define F6 0x3f +#define F7 0x40 +#define F8 0x41 +#define F9 0x42 +#define F10 0x43 +#define F11 0x44 +#define F12 0x45 + +// HID Values of Special Keys +#define ENTER 0x28 +#define ESCAPE 0x29 +#define BACKSPACE 0x2a +#define TAB 0x2b +#define SPACEBAR 0x2c +#define CAPSLOCK 0x39 +#define PRINTSCREEN 0x46 +#define SCROLLLOCK 0x47 +#define PAUSE 0x48 +#define INSERT 0x49 +#define HOME 0x4a +#define PAGEUP 0x4b +#define DELETE 0x4c +#define END 0x4d +#define PAGEDOWN 0x4e +#define RIGHTARROW 0x4f +#define LEFTARROW 0x50 +#define DOWNARROW 0x51 +#define UPARROW 0x52 + +// HID Values of Keypad Keys +#define NUMLOCK 0x53 +#define KEYPADSLASH 0x54 +#define KEYPADSTAR 0x55 +#define KEYPADMINUS 0x56 +#define KEYPADPLUS 0x57 +#define KEYPADENTER 0x58 +#define KEYPAD1 0x59 +#define KEYPAD2 0x5a +#define KEYPAD3 0x5b +#define KEYPAD4 0x5c +#define KEYPAD5 0x5d +#define KEYPAD6 0x5e +#define KEYPAD7 0x5f +#define KEYPAD8 0x60 +#define KEYPAD9 0x61 +#define KEYPAD0 0x62 +#define KEYPADPERIOD 0x63 + +// HID Values of System Keys +#define KEYBOARDAPPLICATION 0x65 +#define KEYBOARDPOWER 0x66 +#define VOLUMEMUTE 0x7f +#define VOLUMEUP 0x80 +#define VOLUMEDOWN 0x81 + +// Common-use modifiers +#define CTRL 0x01 +#define SHIFT 0x02 +#define ALT 0x04 +#define GUI 0x08 + + +/**************************************************************************** + * + * ASCII->HID LOOKUP TABLE + * + * Taken from the HID Table definition at + * http://www.usb.org/developers/devclass_docs/Hut1_11.pdf + * + * This array maps the ASCII value of a type-able character to its + * corresponding HID value. + * + * Example: + * 'a' = ASCII value 97 = HID value 0x04 + * HIDTable['a'] = HIDTable[97] = 0x04 + * + * NOTE: + * "Shift Modified" HID values are the same as the non Shift-Modified values + * for any given character, e.g. the HID value for '2' is equal to the + * HID value for '@'. The Shift-Modified value is sent by setting the + * modifier value (buf[0]) to the corresponding modifier value in the + * modifier table. + * + ****************************************************************************/ +const PROGMEM uint8_t HIDTable[] = { + 0x00, // 0 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2A, 0x00, 0x28, // 10 + 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 20 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, // 30 + 0x00, 0x2c, 0x1e, 0x34, 0x20, 0x21, 0x22, 0x24, 0x34, 0x26, // 40 + 0x27, 0x25, 0x2e, 0x36, 0x2d, 0x37, 0x38, 0x27, 0x1e, 0x1f, // 50 + 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x33, 0x33, 0x36, // 60 + 0x2e, 0x37, 0x38, 0x1f, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, // 70 + 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, // 80 + 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, // 90 + 0x2f, 0x31, 0x30, 0x23, 0x2d, 0x35, 0x04, 0x05, 0x06, 0x07, // 100 + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, // 110 + 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, // 120 + 0x1c, 0x1d, 0x2f, 0x31, 0x30, 0x35, 127 // 127 +}; + + +/**************************************************************************** + * + * ASCII->MODIFIER LOOKUP TABLE + * + * Looks up whether or not the HID report should use the SHIFT modifier. + * + * Example: + * The character '2' and the character '@' have different ASCII values but + * the same HID value. This table uses the ASCII value to determine if + * we should hold shift while sending the key. e.g.: + * + * HIDTable['2'] = 0x1f and modifierTable['2'] = 0 + * HIDTable['@'] = 0x1f and modifierTable['@'] = SHIFT + * + * There's probaly a better way to do this, but it's functional. + * + ****************************************************************************/ +const PROGMEM uint8_t modifierTable[] = { + 0x00, // 0 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 10 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 20 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 30 + 0x00, 0x00, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, // 40 + SHIFT, 0x00, SHIFT, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 50 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, SHIFT, 0x00, SHIFT, // 60 + 0x00, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, // 70 + SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, // 80 + SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, // 90 + 0x00, 0x00, 0x00, SHIFT, SHIFT, 0x00, 0x00, 0x00, 0x00, 0x00, // 100 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 110 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 120 + 0x00, 0x00, SHIFT, SHIFT, SHIFT, SHIFT, 0x00 // 127 +}; \ No newline at end of file diff --git a/Firmware/SwitchDual/i2cmaster.S b/Firmware/SwitchDual/i2cmaster.S new file mode 100644 index 0000000..0670117 --- /dev/null +++ b/Firmware/SwitchDual/i2cmaster.S @@ -0,0 +1,366 @@ +;************************************************************************* +; Title : I2C (Single) Master Implementation +; Author: Peter Fleury http://jump.to/fleury +; based on Atmel Appl. Note AVR300 +; File: $Id: i2cmaster.S,v 1.12 2008/03/02 08:51:27 peter Exp $ +; Software: AVR-GCC 3.3 or higher +; Target: any AVR device +; +; DESCRIPTION +; Basic routines for communicating with I2C slave devices. This +; "single" master implementation is limited to one bus master on the +; I2C bus. +; +; Based on the Atmel Application Note AVR300, corrected and adapted +; to GNU assembler and AVR-GCC C call interface +; Replaced the incorrect quarter period delays found in AVR300 with +; half period delays. + +; Tweaked by monty for true 400KHz operation at 8MHz system clock on an +; atmega16u2. Duty cycle adjusted for correct 400KHz spec adherence. +; +; 7 cycles = 0.875us high +; 13 cycles = 1.625us low +; +; USAGE +; These routines can be called from C, refere to file i2cmaster.h. +; See example test_i2cmaster.c +; Adapt the SCL and SDA port and pin definitions and eventually +; the delay routine to your target ! +; Use 4.7k pull-up resistor on the SDA and SCL pin. +; +; NOTES +; The I2C routines can be called either from non-interrupt or +; interrupt routines, not both. +; +;************************************************************************* + +#if (__GNUC__ * 100 + __GNUC_MINOR__) < 303 +#error "This library requires AVR-GCC 3.3 or later, update to newer AVR-GCC compiler !" +#endif + + +#include + + + +;***** Adapt these SCA and SCL port and pin definition to your target !! +; +; V1 had different I2C pinouts +#ifdef V1_BUILD + #define SDA 1 ; SDA Port D, Pin 4 + #define SCL 0 ; SCL Port D, Pin 5 + #define SDA_PORT PORTD + #define SCL_PORT PORTD +#else + #define SDA 4 ; SDA Port D, Pin 4 + #define SCL 3 ; SCL Port D, Pin 3 + #define SDA_PORT PORTD + #define SCL_PORT PORTD +#endif + +;****** + +;-- map the IO register back into the IO address space +#define SDA_DDR (_SFR_IO_ADDR(SDA_PORT) - 1) +#define SCL_DDR (_SFR_IO_ADDR(SCL_PORT) - 1) +#define SDA_OUT _SFR_IO_ADDR(SDA_PORT) +#define SCL_OUT _SFR_IO_ADDR(SCL_PORT) +#define SDA_IN (_SFR_IO_ADDR(SDA_PORT) - 2) +#define SCL_IN (_SFR_IO_ADDR(SCL_PORT) - 2) + + +#ifndef __tmp_reg__ +#define __tmp_reg__ 0 +#endif + + + .section .text + +;************************************************************************* +; delay half period +; For I2C in normal mode (100kHz), use T/2 > 5us +; For I2C in fast mode (400kHz), use T/2 > 1.3us +;************************************************************************* + .stabs "",100,0,0,i2c_delay_T2 + .stabs "i2cmaster.S",100,0,0,i2c_delay_T2 + .func i2c_delay_T2 ; delay 1.25 microsec with 8 Mhz crystal +i2c_delay_T2: ; 4 cycles + ret ; 5 " + .endfunc ; total 9 cyles = 1.25 microsec with 8 Mhz crystal, IO op happens on the 10th + +;************************************************************************* +; delay 40 microseconds, to give the slave time to do stuff +;************************************************************************* + .func i2c_delay_40us +i2c_delay_40us: ; 4 cycles + push r16 ; 2 + ldi r16, 102 ; 1 +delay: + dec r16 ; 1 + brne delay ; 2 + ; 1 + pop r16 ; 2 + ret ; 5 + .endfunc ; total 321 cyles almost 40 microsec with 8 Mhz crystal + + +;************************************************************************* +; Initialization of the I2C bus interface. Need to be called only once +; +; extern void i2c_init(void) +;************************************************************************* + .global i2c_init + .func i2c_init +i2c_init: + cbi SDA_DDR,SDA ;release SDA + cbi SCL_DDR,SCL ;release SCL + cbi SDA_OUT,SDA + cbi SCL_OUT,SCL + ret + .endfunc + + +;************************************************************************* +; Issues a start condition and sends address and transfer direction. +; return 0 = device accessible, 1= failed to access device +; +; extern unsigned char i2c_start(unsigned char addr); +; addr = r24, return = r25(=0):r24 +;************************************************************************* + + .global i2c_start + .func i2c_start +i2c_start: + sbi SDA_DDR,SDA ;force SDA low + rcall i2c_delay_T2 ;delay T/2 + + rcall i2c_write ;write address + ret + .endfunc + + +;************************************************************************* +; Issues a repeated start condition and sends address and transfer direction. +; return 0 = device accessible, 1= failed to access device +; +; extern unsigned char i2c_rep_start(unsigned char addr); +; addr = r24, return = r25(=0):r24 +;************************************************************************* + + .global i2c_rep_start + .func i2c_rep_start +i2c_rep_start: + sbi SCL_DDR,SCL ;force SCL low + rcall i2c_delay_T2 ;delay T/2 + cbi SDA_DDR,SDA ;release SDA + rcall i2c_delay_T2 ;delay T/2 + cbi SCL_DDR,SCL ;release SCL + rcall i2c_delay_T2 ;delay T/2 + sbi SDA_DDR,SDA ;force SDA low + rcall i2c_delay_T2 ;delay T/2 + + rcall i2c_write ;write address + ret + .endfunc + + +;************************************************************************* +; Issues a start condition and sends address and transfer direction. +; If device is busy, use ack polling to wait until device is ready +; +; extern void i2c_start_wait(unsigned char addr); +; addr = r24 +;************************************************************************* + + .global i2c_start_wait + .func i2c_start_wait +i2c_start_wait: + mov __tmp_reg__,r24 +i2c_start_wait1: + sbi SDA_DDR,SDA ;force SDA low + rcall i2c_delay_T2 ;delay T/2 + mov r24,__tmp_reg__ + rcall i2c_write ;write address + tst r24 ;if device not busy -> done + breq i2c_start_wait_done + rcall i2c_stop ;terminate write operation + rjmp i2c_start_wait1 ;device busy, poll ack again +i2c_start_wait_done: + ret + .endfunc + + +;************************************************************************* +; Terminates the data transfer and releases the I2C bus +; +; extern void i2c_stop(void) +;************************************************************************* + + .global i2c_stop + .func i2c_stop +i2c_stop: + sbi SCL_DDR,SCL ;force SCL low + sbi SDA_DDR,SDA ;force SDA low + rcall i2c_delay_T2 ;delay T/2 + cbi SCL_DDR,SCL ;release SCL + rcall i2c_delay_T2 ;delay T/2 +i2c_stop_wait: + ;wait SCL high (in case wait states are inserted) + sbis SCL_IN,SCL ; 2 + rjmp i2c_stop_wait + cbi SDA_DDR,SDA ;release SDA + rcall i2c_delay_T2 ;delay T/2 + rcall i2c_delay_40us ; delay 40us to let slave catch its breath + ret + .endfunc + + +;************************************************************************* +; Send one byte to I2C device +; return 0 = write successful, 1 = write failed +; +; extern unsigned char i2c_write( unsigned char data ); +; data = r24, return = r25(=0):r24 +;************************************************************************* + .global i2c_write + .func i2c_write +i2c_write: + sec ;set carry flag ; + rol r24 ;shift in carry and out bit one ; + rjmp i2c_write_first ; +i2c_write_bit: + lsl r24 ;if transmit register empty ; 1 + breq i2c_get_ack ; 1 + nop ; 1 +i2c_write_first: + ; 7 since the last cbi + sbi SCL_DDR,SCL ;force SCL low ; 2 + brcc i2c_write_low ; 1 + nop ; 1 + cbi SDA_DDR,SDA ;release SDA ; 2 + rjmp i2c_write_high ; 2 +i2c_write_low: ; 1 + sbi SDA_DDR,SDA ;force SDA low ; 2 + rjmp i2c_write_high ; 2 +i2c_write_high: + nop + nop + nop + nop + nop + ; 13 since the last + cbi SCL_DDR,SCL ;release SCL ; 2 +i2c_write_wait: + ;wait SCL high (in case wait states are inserted) + sbis SCL_IN,SCL ; 2 + rjmp i2c_write_wait + + rjmp i2c_write_bit ; 2 + +i2c_get_ack: ; 1 + sbi SCL_DDR,SCL ;force SCL low + cbi SDA_DDR,SDA ;release SDA + nop + nop + nop + nop + nop + nop + nop + nop + nop + cbi SCL_DDR,SCL ;release SCL +i2c_ack_wait: + sbis SCL_IN,SCL ;wait SCL high (in case wait states are inserted) + rjmp i2c_ack_wait + + clr r24 ;return 0 + sbic SDA_IN,SDA ;if SDA high -> return 1 + ldi r24,1 + sbi SCL_DDR,SCL ;force SCL low + rcall i2c_delay_T2 ;delay T/2 + clr r25 + ret + .endfunc + + + +;************************************************************************* +; read one byte from the I2C device, send ack or nak to device +; (ack=1, send ack, request more data from device +; ack=0, send nak, read is followed by a stop condition) +; +; extern unsigned char i2c_read(unsigned char ack); +; ack = r24, return = r25(=0):r24 +; extern unsigned char i2c_readAck(void); +; extern unsigned char i2c_readNak(void); +; return = r25(=0):r24 +;************************************************************************* + .global i2c_readAck + .global i2c_readNak + .global i2c_read + .func i2c_read +i2c_readNak: + clr r24 + rjmp i2c_read +i2c_readAck: + ldi r24,0x01 +i2c_read: + ldi r23,0x01 ;data = 0x01 +i2c_read_bit: + sbi SCL_DDR,SCL ;force SCL low ; 2 + nop ; 1 + nop ; 1 + nop ; 1 + nop ; 1 + nop ; 1 + nop ; 1 + nop ; 1 + nop ; 1 + nop ; 1 + nop ; 1 + nop ; 1 + + cbi SCL_DDR,SCL ;release SCL ; 2 + +i2c_read_stretch: + ;loop until SCL is high (allow slave to stretch SCL) + sbis SCL_IN, SCL ; 2 + rjmp i2c_read_stretch + ; + clc ;clear carry flag ; 1 + sbic SDA_IN,SDA ;if SDA is high ; 2 + sec ; set carry flag + ; + rol r23 ;store bit ; 1 + ;while receive register not full + brcc i2c_read_bit ; 2 + +i2c_put_ack: + sbi SCL_DDR,SCL ;force SCL low + cpi r24,1 + breq i2c_put_ack_low ;if (ack=0) + cbi SDA_DDR,SDA ; release SDA + rjmp i2c_put_ack_high +i2c_put_ack_low: ;else + sbi SDA_DDR,SDA ; force SDA low + nop +i2c_put_ack_high: + nop + nop + nop + nop + nop + cbi SCL_DDR,SCL ;release SCL +i2c_put_ack_wait: + sbis SCL_IN,SCL ;wait SCL high + rjmp i2c_put_ack_wait + nop + mov r24,r23 + clr r25 + sbi SCL_DDR,SCL ;force SCL low + cbi SDA_DDR,SDA ;release SDA + ret + .endfunc + diff --git a/Firmware/SwitchDual/i2cmaster.h b/Firmware/SwitchDual/i2cmaster.h new file mode 100644 index 0000000..3917b9e --- /dev/null +++ b/Firmware/SwitchDual/i2cmaster.h @@ -0,0 +1,178 @@ +#ifndef _I2CMASTER_H +#define _I2CMASTER_H 1 +/************************************************************************* +* Title: C include file for the I2C master interface +* (i2cmaster.S or twimaster.c) +* Author: Peter Fleury http://jump.to/fleury +* File: $Id: i2cmaster.h,v 1.10 2005/03/06 22:39:57 Peter Exp $ +* Software: AVR-GCC 3.4.3 / avr-libc 1.2.3 +* Target: any AVR device +* Usage: see Doxygen manual +**************************************************************************/ + +#ifdef DOXYGEN +/** + @defgroup pfleury_ic2master I2C Master library + @code #include @endcode + + @brief I2C (TWI) Master Software Library + + Basic routines for communicating with I2C slave devices. This single master + implementation is limited to one bus master on the I2C bus. + + This I2c library is implemented as a compact assembler software implementation of the I2C protocol + which runs on any AVR (i2cmaster.S) and as a TWI hardware interface for all AVR with built-in TWI hardware (twimaster.c). + Since the API for these two implementations is exactly the same, an application can be linked either against the + software I2C implementation or the hardware I2C implementation. + + Use 4.7k pull-up resistor on the SDA and SCL pin. + + Adapt the SCL and SDA port and pin definitions and eventually the delay routine in the module + i2cmaster.S to your target when using the software I2C implementation ! + + Adjust the CPU clock frequence F_CPU in twimaster.c or in the Makfile when using the TWI hardware implementaion. + + @note + The module i2cmaster.S is based on the Atmel Application Note AVR300, corrected and adapted + to GNU assembler and AVR-GCC C call interface. + Replaced the incorrect quarter period delays found in AVR300 with + half period delays. + + @author Peter Fleury pfleury@gmx.ch http://jump.to/fleury + + @par API Usage Example + The following code shows typical usage of this library, see example test_i2cmaster.c + + @code + + #include + + + #define Dev24C02 0xA2 // device address of EEPROM 24C02, see datasheet + + int main(void) + { + unsigned char ret; + + i2c_init(); // initialize I2C library + + // write 0x75 to EEPROM address 5 (Byte Write) + i2c_start_wait(Dev24C02+I2C_WRITE); // set device address and write mode + i2c_write(0x05); // write address = 5 + i2c_write(0x75); // write value 0x75 to EEPROM + i2c_stop(); // set stop conditon = release bus + + + // read previously written value back from EEPROM address 5 + i2c_start_wait(Dev24C02+I2C_WRITE); // set device address and write mode + + i2c_write(0x05); // write address = 5 + i2c_rep_start(Dev24C02+I2C_READ); // set device address and read mode + + ret = i2c_readNak(); // read one byte from EEPROM + i2c_stop(); + + for(;;); + } + @endcode + +*/ +#endif /* DOXYGEN */ + +/**@{*/ + +#if (__GNUC__ * 100 + __GNUC_MINOR__) < 304 +#error "This library requires AVR-GCC 3.4 or later, update to newer AVR-GCC compiler !" +#endif + +#include + +/** defines the data direction (reading from I2C device) in i2c_start(),i2c_rep_start() */ +#define I2C_READ 1 + +/** defines the data direction (writing to I2C device) in i2c_start(),i2c_rep_start() */ +#define I2C_WRITE 0 + + +/** + @brief initialize the I2C master interace. Need to be called only once + @param void + @return none + */ +extern void i2c_init(void); + + +/** + @brief Terminates the data transfer and releases the I2C bus + @param void + @return none + */ +extern void i2c_stop(void); + + +/** + @brief Issues a start condition and sends address and transfer direction + + @param addr address and transfer direction of I2C device + @retval 0 device accessible + @retval 1 failed to access device + */ +extern unsigned char i2c_start(unsigned char addr); + + +/** + @brief Issues a repeated start condition and sends address and transfer direction + + @param addr address and transfer direction of I2C device + @retval 0 device accessible + @retval 1 failed to access device + */ +extern unsigned char i2c_rep_start(unsigned char addr); + + +/** + @brief Issues a start condition and sends address and transfer direction + + If device is busy, use ack polling to wait until device ready + @param addr address and transfer direction of I2C device + @return none + */ +extern void i2c_start_wait(unsigned char addr); + + +/** + @brief Send one byte to I2C device + @param data byte to be transfered + @retval 0 write successful + @retval 1 write failed + */ +extern unsigned char i2c_write(unsigned char data); + + +/** + @brief read one byte from the I2C device, request more data from device + @return byte read from I2C device + */ +extern unsigned char i2c_readAck(void); + +/** + @brief read one byte from the I2C device, read is followed by a stop condition + @return byte read from I2C device + */ +extern unsigned char i2c_readNak(void); + +/** + @brief read one byte from the I2C device + + Implemented as a macro, which calls either i2c_readAck or i2c_readNak + + @param ack 1 send ack, request more data from device
+ 0 send nak, read is followed by a stop condition + @return byte read from I2C device + */ +extern unsigned char i2c_read(unsigned char ack); +#define i2c_read(ack) (ack) ? i2c_readAck() : i2c_readNak(); + + +/**@}*/ +#endif diff --git a/Firmware/SwitchDual/makefile b/Firmware/SwitchDual/makefile new file mode 100644 index 0000000..b3b8f4e --- /dev/null +++ b/Firmware/SwitchDual/makefile @@ -0,0 +1,85 @@ +# +# LUFA Library +# Copyright (C) Dean Camera, 2014. +# +# dean [at] fourwalledcubicle [dot] com +# www.lufa-lib.org +# +# -------------------------------------- +# LUFA Project Makefile. +# -------------------------------------- + +# Run "make help" for target help. + +MCU = atmega16u2 +ARCH = AVR8 +#BOARD = USER +F_CPU = 8000000 +F_USB = $(F_CPU) +OPTIMIZATION = s +TARGET = Joystick +SRC = $(TARGET).c Descriptors.c i2cmaster.S Config.c usbio.c $(LUFA_SRC_USB) $(LUFA_SRC_USBCLASS) +LUFA_PATH = ../LUFA +CC_FLAGS = -DUSE_LUFA_CONFIG_HEADER -IConfig/ +LD_FLAGS = + +AVRDUDE = avrdude -B 8 -c usbasp -p $(MCU) + + +# Default target +all: + +# Include LUFA-specific DMBS extension modules +DMBS_LUFA_PATH ?= $(LUFA_PATH)/Build/LUFA +include $(DMBS_LUFA_PATH)/lufa-sources.mk +include $(DMBS_LUFA_PATH)/lufa-gcc.mk + +# Include LUFA build script makefiles +DMBS_PATH ?= $(LUFA_PATH)/Build/DMBS/DMBS +include $(LUFA_PATH)/Build/lufa_core.mk +include $(LUFA_PATH)/Build/lufa_sources.mk +include $(LUFA_PATH)/Build/lufa_build.mk +include $(LUFA_PATH)/Build/lufa_cppcheck.mk +include $(LUFA_PATH)/Build/lufa_doxygen.mk +include $(LUFA_PATH)/Build/lufa_dfu.mk +include $(LUFA_PATH)/Build/lufa_hid.mk +include $(LUFA_PATH)/Build/lufa_avrdude.mk +include $(LUFA_PATH)/Build/lufa_atprogram.mk + +v1: CC_FLAGS += -DV1_BUILD +v1: clean all + +debug: CC_FLAGS += -DDEBUG +debug: clean flash + +v1debug: CC_FLAGS += -DV1_BUILD -DDEBUG +v1debug: clean all + +init: erase wfuse flashboot flash + +initboot: erase wfuse flashboot + +erase: + $(AVRDUDE) -e + +rfuse: + $(AVRDUDE) -U hfuse:r:-:h -U lfuse:r:-:h -U efuse:r:-:h + +wfuse: + $(AVRDUDE) -U lfuse:w:0xde:m -U hfuse:w:0xdb:m -U efuse:w:0xf6:m + +# To make this hex, compile HID Bootloader in LUFA +# FLASH_SIZE_KB := 16 +# BOOT_SECTION_SIZE_KB := 2 +# MCU = atmega16u2 +# ARCH = AVR8 +flashboot: + $(AVRDUDE) -U flash:w:DFU/BootloaderHID.hex:i + +flash: all + sleep 1 + python2 ../DFUHID/hid_bootloader_loader.py atmega16u2 Joystick.hex + +flashC: all + sleep 1 + ../DFUHID/hid_bootloader_cli -mmcu=atmega16u2 -r Joystick.hex \ No newline at end of file diff --git a/Firmware/SwitchDual/usbio.c b/Firmware/SwitchDual/usbio.c new file mode 100644 index 0000000..37f250f --- /dev/null +++ b/Firmware/SwitchDual/usbio.c @@ -0,0 +1,114 @@ +/* + * FILE: usbio.c + * + * Original UART code by Peter Sutton. + * Adapted for USB by William Toohey. + * + * Module to allow standard output routines to be used via + * USB keyboard typing. The init_serial_stdio() method must be called before + * any standard IO methods (e.g. printf). We use a circular buffer to + * store output messages. + */ + +#include +#include +#include + +#include + +/* Global variables */ +/* Circular buffer to hold outgoing characters. The insert_pos variable + * keeps track of the position (0 to OUTPUT_BUFFER_SIZE-1) that the next + * outgoing character should be written to. bytes_in_buffer keeps + * count of the number of characters currently stored in the buffer + * (ranging from 0 to OUTPUT_BUFFER_SIZE). This number of bytes immediately + * prior to the current insert_pos are the bytes waiting to be output. + * If the insert_pos reaches the end of the buffer it will wrap around + * to the beginning (assuming those bytes have been output). + * NOTE - OUTPUT_BUFFER_SIZE can not be larger than 255 without changing + * the type of the variables below. + */ +#define OUTPUT_BUFFER_SIZE 255 +char out_buffer[OUTPUT_BUFFER_SIZE]; +uint8_t out_insert_pos; +uint8_t bytes_in_out_buffer; +// Whether we should be depressing or releasing a key +uint8_t liftoff = 0; + +static int usb_put_char(char, FILE*); + +/* Setup a stream that uses the uart get and put functions. We will + * make standard input and output use this stream below. + */ +static FILE myStream = FDEV_SETUP_STREAM(usb_put_char, NULL, + _FDEV_SETUP_WRITE); + +void init_usb_stdio(void) { + /* + * Initialise our buffers + */ + out_insert_pos = 0; + bytes_in_out_buffer = 0; + + /* Set up our stream so the put function below is used + * to write characters via the USB port when we use + * stdio functions + */ + stdout = &myStream; +} + +static int usb_put_char(char c, FILE* stream) { + /* Add the character to the buffer for transmission if there + * is space to do so. We advance the insert_pos to the next + * character position. If this is beyond the end of the buffer + * we wrap around back to the beginning of the buffer + */ + // Drop overrun + if(bytes_in_out_buffer >= OUTPUT_BUFFER_SIZE) { + return 0; + } + out_buffer[out_insert_pos++] = c; + bytes_in_out_buffer++; + if(out_insert_pos == OUTPUT_BUFFER_SIZE) { + /* Wrap around buffer pointer if necessary */ + out_insert_pos = 0; + } + return 0; +} + +int make_report(USB_KeyboardReport_Data_t *KeyboardReport) { + if(liftoff) { + liftoff = 0; + return 1; + } else { + /* Check if we have data in our buffer */ + if(bytes_in_out_buffer > 0) { + /* Yes we do - remove the pending byte and output it + * via the USB. The pending byte (character) is the + * one which is "bytes_in_buffer" characters before the + * insert_pos (taking into account that we may + * need to wrap around to the end of the buffer). + */ + char c; + if(out_insert_pos - bytes_in_out_buffer < 0) { + /* Need to wrap around */ + c = out_buffer[out_insert_pos - bytes_in_out_buffer + + OUTPUT_BUFFER_SIZE]; + } else { + c = out_buffer[out_insert_pos - bytes_in_out_buffer]; + } + /* Decrement our count of the number of bytes in the + * buffer + */ + bytes_in_out_buffer--; + + /* Output the character via USB, converting to scancode */ + KeyboardReport->KeyCode[0] = pgm_read_byte(&HIDTable[(uint8_t)c]); + KeyboardReport->Modifier = pgm_read_byte(&modifierTable[(uint8_t)c]); + liftoff = 1; + return 1; + } else { + return 0; + } + } +} diff --git a/Firmware/SwitchDual/usbio.h b/Firmware/SwitchDual/usbio.h new file mode 100644 index 0000000..e3e379d --- /dev/null +++ b/Firmware/SwitchDual/usbio.h @@ -0,0 +1,20 @@ +/* + * serialio.h + * + * Author: Peter Sutton + * + * Modified by William Toohey + */ + +#ifndef SERIALIO_H_ +#define SERIALIO_H_ + +#include +#include + +/* Initialise IO using USB. + */ +void init_usb_stdio(void); +int make_report(USB_KeyboardReport_Data_t*); + +#endif /* SERIALIO_H_ */ \ No newline at end of file