diff --git a/Firmware/Bootloader/BootloaderHID.c b/Firmware/Bootloader/BootloaderHID.c deleted file mode 100644 index 518029a..0000000 --- a/Firmware/Bootloader/BootloaderHID.c +++ /dev/null @@ -1,190 +0,0 @@ -/* - 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 - * - * Main source file for the HID class bootloader. This file contains the complete bootloader logic. - */ - -#include "BootloaderHID.h" - -/** Flag to indicate if the bootloader should be running, or should exit and allow the application code to run - * via a soft reset. When cleared, the bootloader will abort, the USB interface will shut down and the application - * started via a forced watchdog reset. - */ -static bool RunBootloader = true; - -/** Magic lock for forced application start. If the HWBE fuse is programmed and BOOTRST is unprogrammed, the bootloader - * will start if the /HWB line of the AVR is held low and the system is reset. However, if the /HWB line is still held - * low when the application attempts to start via a watchdog reset, the bootloader will re-start. If set to the value - * \ref MAGIC_BOOT_KEY the special init function \ref Application_Jump_Check() will force the application to start. - */ -uint16_t MagicBootKey ATTR_NO_INIT; - - -/** Special startup routine to check if the bootloader was started via a watchdog reset, and if the magic application - * start key has been loaded into \ref MagicBootKey. If the bootloader started via the watchdog and the key is valid, - * this will force the user application to start via a software jump. - */ -void Application_Jump_Check(void) -{ - /* If the reset source was the bootloader and the key is correct, clear it and jump to the application */ - if ((MCUSR & (1 << WDRF)) && (MagicBootKey == MAGIC_BOOT_KEY)) - { - MagicBootKey = 0; - - // cppcheck-suppress constStatement - ((void (*)(void))0x0000)(); - } -} - -/** Main program entry point. This routine configures the hardware required by the bootloader, then continuously - * runs the bootloader processing routine until instructed to soft-exit. - */ -int main(void) -{ - /* Setup hardware required for the bootloader */ - SetupHardware(); - - /* Enable global interrupts so that the USB stack can function */ - GlobalInterruptEnable(); - - while (RunBootloader) - USB_USBTask(); - - /* Disconnect from the host - USB interface will be reset later along with the AVR */ - USB_Detach(); - - /* Unlock the forced application start mode of the bootloader if it is restarted */ - MagicBootKey = MAGIC_BOOT_KEY; - - /* Enable the watchdog and force a timeout to reset the AVR */ - wdt_enable(WDTO_250MS); - - for (;;); -} - -/** Configures all hardware required for the bootloader. */ -static void SetupHardware(void) -{ - /* Disable watchdog if enabled by bootloader/fuses */ - MCUSR &= ~(1 << WDRF); - wdt_disable(); - - /* Relocate the interrupt vector table to the bootloader section */ - MCUCR = (1 << IVCE); - MCUCR = (1 << IVSEL); - - /* Initialize USB subsystem */ - USB_Init(); -} - -/** Event handler for the USB_ConfigurationChanged event. This configures the device's endpoints ready - * to relay data to and from the attached USB host. - */ -void EVENT_USB_Device_ConfigurationChanged(void) -{ - /* Setup HID Report Endpoint */ - Endpoint_ConfigureEndpoint(HID_IN_EPADDR, EP_TYPE_INTERRUPT, HID_IN_EPSIZE, 1); -} - -/** Event handler for the USB_ControlRequest event. This is used to catch and process control requests sent to - * the device from the USB host before passing along unhandled control requests to the library for processing - * internally. - */ -void EVENT_USB_Device_ControlRequest(void) -{ - /* Ignore any requests that aren't directed to the HID interface */ - if ((USB_ControlRequest.bmRequestType & (CONTROL_REQTYPE_TYPE | CONTROL_REQTYPE_RECIPIENT)) != - (REQTYPE_CLASS | REQREC_INTERFACE)) - { - return; - } - - /* Process HID specific control requests */ - switch (USB_ControlRequest.bRequest) - { - case HID_REQ_SetReport: - Endpoint_ClearSETUP(); - - /* Wait until the command has been sent by the host */ - while (!(Endpoint_IsOUTReceived())); - - /* Read in the write destination address */ - #if (FLASHEND > 0xFFFF) - uint32_t PageAddress = ((uint32_t)Endpoint_Read_16_LE() << 8); - #else - uint16_t PageAddress = Endpoint_Read_16_LE(); - #endif - - /* Check if the command is a program page command, or a start application command */ - #if (FLASHEND > 0xFFFF) - if ((uint16_t)(PageAddress >> 8) == COMMAND_STARTAPPLICATION) - #else - if (PageAddress == COMMAND_STARTAPPLICATION) - #endif - { - RunBootloader = false; - } - else - { - /* Erase the given FLASH page, ready to be programmed */ - boot_page_erase(PageAddress); - boot_spm_busy_wait(); - - /* Write each of the FLASH page's bytes in sequence */ - for (uint8_t PageWord = 0; PageWord < (SPM_PAGESIZE / 2); PageWord++) - { - /* Check if endpoint is empty - if so clear it and wait until ready for next packet */ - if (!(Endpoint_BytesInEndpoint())) - { - Endpoint_ClearOUT(); - while (!(Endpoint_IsOUTReceived())); - } - - /* Write the next data word to the FLASH page */ - boot_page_fill(PageAddress + ((uint16_t)PageWord << 1), Endpoint_Read_16_LE()); - } - - /* Write the filled FLASH page to memory */ - boot_page_write(PageAddress); - boot_spm_busy_wait(); - - /* Re-enable RWW section */ - boot_rww_enable(); - } - - Endpoint_ClearOUT(); - - Endpoint_ClearStatusStage(); - break; - } -} - diff --git a/Firmware/Bootloader/BootloaderHID.h b/Firmware/Bootloader/BootloaderHID.h deleted file mode 100644 index 8efd47e..0000000 --- a/Firmware/Bootloader/BootloaderHID.h +++ /dev/null @@ -1,73 +0,0 @@ -/* - 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 BootloaderHID.c. - */ - -#ifndef _BOOTLOADERHID_H_ -#define _BOOTLOADERHID_H_ - - /* Includes: */ - #include - #include - #include - #include - #include - #include - - #include "Descriptors.h" - - #include - #include - - /* Preprocessor Checks: */ - #if !defined(__OPTIMIZE_SIZE__) - #error This bootloader requires that it be optimized for size, not speed, to fit into the target device. Change optimization settings and try again. - #endif - - /* Macros: */ - /** Bootloader special address to start the user application */ - #define COMMAND_STARTAPPLICATION 0xFFFF - - /** Magic bootloader key to unlock forced application start mode. */ - #define MAGIC_BOOT_KEY 0xDC42 - - /* Function Prototypes: */ - static void SetupHardware(void); - - void Application_Jump_Check(void) ATTR_INIT_SECTION(3); - - void EVENT_USB_Device_ConfigurationChanged(void); - void EVENT_USB_Device_UnhandledControlRequest(void); - -#endif - diff --git a/Firmware/Bootloader/BootloaderHID.txt b/Firmware/Bootloader/BootloaderHID.txt deleted file mode 100644 index 63c1505..0000000 --- a/Firmware/Bootloader/BootloaderHID.txt +++ /dev/null @@ -1,105 +0,0 @@ -/** \file - * - * This file contains special DoxyGen information for the generation of the main page and other special - * documentation pages. It is not a project source file. - */ - -/** \mainpage HID Class USB AVR Bootloader - * - * \section SSec_Compat Demo Compatibility: - * - * The following list indicates what microcontrollers are compatible with this demo. - * - * \li Series 7 USB AVRs (AT90USBxxx7) - * \li Series 6 USB AVRs (AT90USBxxx6) - * \li Series 4 USB AVRs (ATMEGAxxU4) - * \li Series 2 USB AVRs (AT90USBxx2, ATMEGAxxU2) - * - * \section SSec_Info USB Information: - * - * The following table gives a rundown of the USB utilization of this demo. - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - *
USB Mode:Device
USB Class:Human Interface Device Class (HID)
USB Subclass:N/A
Relevant Standards:USBIF HID Class Standard \n - * Teensy Programming Protocol Specification
Supported USB Speeds:Low Speed Mode \n - * Full Speed Mode
- * - * \section SSec_Description Project Description: - * - * This bootloader enumerates to the host as a HID Class device, allowing for device FLASH programming through - * the supplied command line software, which is a modified version of Paul's TeensyHID Command Line loader code - * from PJRC (used with permission). This bootloader is deliberately non-compatible with the proprietary PJRC - * HalfKay bootloader GUI; only the command line interface software accompanying this bootloader will work with it. - * - * Out of the box this bootloader builds for the AT90USB1287 with an 8KB bootloader section size, and will fit - * into 2KB of bootloader space for the Series 2 USB AVRs (ATMEGAxxU2, AT90USBxx2) or 4KB of bootloader space for - * all other models. If you wish to alter this size and/or change the AVR model, you will need to edit the MCU, - * FLASH_SIZE_KB and BOOT_SECTION_SIZE_KB values in the accompanying makefile. - * - * \warning THIS BOOTLOADER IS NOT SECURE. Malicious entities can recover written data, even if the device - * lockbits are set. - * - * \section Sec_Running Running the Bootloader - * - * This bootloader is designed to be started via the HWB mechanism of the USB AVRs; ground the HWB pin (see device - * datasheet) then momentarily ground /RESET to start the bootloader. This assumes the HWBE fuse is set and the BOOTRST - * fuse is cleared. - * - * \section Sec_Installation Driver Installation - * - * This bootloader uses the HID class driver inbuilt into all modern operating systems, thus no additional drivers - * need to be supplied for correct operation. - * - * \section Sec_HostApp Host Controller Application - * - * Due to licensing issues, the supplied bootloader is compatible with the HalfKay bootloader protocol designed - * by PJRC, but is non-compatible with the cross-platform loader GUI. A modified version of the open source - * cross-platform TeensyLoader application is supplied, which can be compiled under most operating systems. The - * command-line loader application should remain compatible with genuine Teensy boards in addition to boards using - * this custom bootloader. - * - * Once compiled, programs can be loaded into the AVR's FLASH memory through the following example command: - * \code - * hid_bootloader_cli -mmcu=at90usb1287 Mouse.hex - * \endcode - * - * \section Sec_KnownIssues Known Issues: - * - * \par After loading an application, it is not run automatically on startup. - * Some USB AVR boards ship with the BOOTRST fuse set, causing the bootloader - * to run automatically when the device is reset. In most cases, the BOOTRST - * fuse should be disabled and the HWBE fuse used instead to run the bootloader - * when needed. - * - * \section SSec_Options Project Options - * - * The following defines can be found in this demo, which can control the demo behaviour when defined, or changed in value. - * - * - * - * - * - *
- * None - *
- */ diff --git a/Firmware/Bootloader/Config/LUFAConfig.h b/Firmware/Bootloader/Config/LUFAConfig.h index af2dd30..2a84fbd 100644 --- a/Firmware/Bootloader/Config/LUFAConfig.h +++ b/Firmware/Bootloader/Config/LUFAConfig.h @@ -70,10 +70,10 @@ // #define USE_FLASH_DESCRIPTORS // #define USE_EEPROM_DESCRIPTORS #define NO_INTERNAL_SERIAL - #define FIXED_CONTROL_ENDPOINT_SIZE 8 + #define FIXED_CONTROL_ENDPOINT_SIZE 64 #define DEVICE_STATE_AS_GPIOR 0 #define FIXED_NUM_CONFIGURATIONS 1 -// #define CONTROL_ONLY_DEVICE + #define CONTROL_ONLY_DEVICE // #define INTERRUPT_CONTROL_ENDPOINT #define NO_DEVICE_REMOTE_WAKEUP #define NO_DEVICE_SELF_POWER diff --git a/Firmware/Bootloader/Descriptors.c b/Firmware/Bootloader/Descriptors.c index 274a1a6..e9aacd8 100644 --- a/Firmware/Bootloader/Descriptors.c +++ b/Firmware/Bootloader/Descriptors.c @@ -1,72 +1,43 @@ -/* - 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 - * - * USB Device Descriptors, for library use when in USB device mode. Descriptors are special - * computer-readable structures which the host requests upon device enumeration, to determine - * the device's capabilities and functions. - */ - #include "Descriptors.h" -/** 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 HIDReport[] = +const USB_Descriptor_URL_t ConfigURL = URL_STRING_DESCRIPTOR(URL_HTTPS, "mon.im"); +const USB_Descriptor_URL_t LocalhostURL = URL_STRING_DESCRIPTOR(URL_HTTP, "localhost"); +const USB_Descriptor_String_t ProductString = USB_STRING_DESCRIPTOR(L"VoltexBoot"); +const USB_Descriptor_String_t LanguageString = USB_STRING_DESCRIPTOR_ARRAY(LANGUAGE_ID_ENG); + +const uint8_t MS_OS_Descriptor[] = { - 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, 0x08), - HID_RI_REPORT_COUNT(16, (sizeof(uint16_t) + SPM_PAGESIZE)), - HID_RI_OUTPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE | HID_IOF_NON_VOLATILE), - HID_RI_END_COLLECTION(0), + MS_OS_DESCRIPTOR_SET + ( + MS_OS_COMPAT_ID_WINUSB + ) +}; + +const uint8_t WebUSBAllowedOrigins[] = { + WEBUSB_ALLOWED_ORIGINS_HEADER + ( + 0, // no config header + // Config interface accessible from the web, 2 valid URLs + URL_ID_Config, URL_ID_Localhost + ) +}; + +const uint8_t BOSDescriptor[] = +{ + BOS_DESCRIPTOR + ( + 2, // 2 capability descriptors in use + WEBUSB_CAPABILITY_DESCRIPTOR(WEBUSB_ID, URL_ID_Config), // Vendor request ID, URL ID + // Required to force WinUSB driver for driverless WebUSB compatibility + MS_OS_20_CAPABILITY_DESCRIPTOR(MS_OS_ID, sizeof(MS_OS_Descriptor)) // Vendor request ID, Descriptor set length + ) }; -/** Device descriptor structure. This descriptor, located in SRAM memory, describes the overall - * device characteristics, including the supported USB version, control endpoint size and the - * number of device configurations. The descriptor is read out by the USB host when the enumeration - * process begins. - */ const USB_Descriptor_Device_t DeviceDescriptor = { .Header = {.Size = sizeof(USB_Descriptor_Device_t), .Type = DTYPE_Device}, - .USBSpecification = VERSION_BCD(1,1,0), + .USBSpecification = VERSION_BCD(2,1,0), .Class = USB_CSCP_NoDeviceClass, .SubClass = USB_CSCP_NoDeviceSubclass, .Protocol = USB_CSCP_NoDeviceProtocol, @@ -79,17 +50,12 @@ const USB_Descriptor_Device_t DeviceDescriptor = .ReleaseNumber = VERSION_BCD(0,0,1), .ManufacturerStrIndex = NO_DESCRIPTOR, - .ProductStrIndex = NO_DESCRIPTOR, + .ProductStrIndex = STRING_ID_Product, .SerialNumStrIndex = NO_DESCRIPTOR, .NumberOfConfigurations = FIXED_NUM_CONFIGURATIONS }; -/** Configuration descriptor structure. This descriptor, located in SRAM memory, describes the usage - * of the device in one of its supported configurations, including information about any device interfaces - * and endpoints. The descriptor is read out by the USB host during the enumeration process when selecting - * a configuration so that the host may correctly communicate with the USB device. - */ const USB_Descriptor_Configuration_t ConfigurationDescriptor = { .Config = @@ -106,45 +72,71 @@ const USB_Descriptor_Configuration_t ConfigurationDescriptor = .MaxPowerConsumption = USB_CONFIG_POWER_MA(100) }, - - .HID_Interface = + + .Config_Interface = { .Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, - .InterfaceNumber = INTERFACE_ID_Printer, - .AlternateSetting = 0x00, + .InterfaceNumber = INTERFACE_ID_Config, + .AlternateSetting = 0, - .TotalEndpoints = 1, + .TotalEndpoints = 0, - .Class = HID_CSCP_HIDClass, - .SubClass = HID_CSCP_NonBootSubclass, - .Protocol = HID_CSCP_NonBootProtocol, + .Class = 0xFF, + .SubClass = 0xFF, + .Protocol = 0xFF, .InterfaceStrIndex = NO_DESCRIPTOR }, - - .HID_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(HIDReport) - }, - - .HID_ReportINEndpoint = - { - .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, - - .EndpointAddress = HID_IN_EPADDR, - .Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), - .EndpointSize = HID_IN_EPSIZE, - .PollingIntervalMS = 0x05 - }, }; +void USB_Process_BOS(void) { + const void* Address = NULL; + uint16_t Size = 0; + + /* Caller does this check */ + //if(!(Endpoint_IsSETUPReceived())) { + // return; + //} + if(USB_ControlRequest.bmRequestType != (REQDIR_DEVICETOHOST | REQTYPE_VENDOR | REQREC_DEVICE)) { + return; + } + + switch(USB_ControlRequest.bRequest) { + case WEBUSB_ID: + switch(USB_ControlRequest.wIndex) { + case WEBUSB_REQUEST_GET_ALLOWED_ORIGINS: + Address = &WebUSBAllowedOrigins; + Size = sizeof(WebUSBAllowedOrigins); + break; + case WEBUSB_REQUEST_GET_URL: + switch(USB_ControlRequest.wValue) { + case URL_ID_Localhost: + Address = &LocalhostURL; + Size = LocalhostURL.Header.Size; + break; + case URL_ID_Config: + Address = &ConfigURL; + Size = ConfigURL.Header.Size; + break; + } + break; + } + break; + case MS_OS_ID: + if(USB_ControlRequest.wIndex == MS_OS_20_DESCRIPTOR_INDEX) { + Address = &MS_OS_Descriptor; + Size = sizeof(MS_OS_Descriptor); + } + break; + } + if(Address != NULL) { + Endpoint_ClearSETUP(); + Endpoint_Write_Control_Stream_LE(Address, Size); + Endpoint_ClearOUT(); + } +} + /** This function is called by the library when in device mode, and must be overridden (see library "USB Descriptors" * documentation) by the application code so that the address and size of a requested descriptor can be given * to the USB library. When the device receives a Get Descriptor request on the control endpoint, this function @@ -152,10 +144,11 @@ const USB_Descriptor_Configuration_t ConfigurationDescriptor = * 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); + const uint8_t DescriptorNumber = (wValue & 0xFF); const void* Address = NULL; uint16_t Size = NO_DESCRIPTOR; @@ -171,16 +164,23 @@ uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue, Address = &ConfigurationDescriptor; Size = sizeof(USB_Descriptor_Configuration_t); } - else if (DescriptorType == HID_DTYPE_HID) - { - Address = &ConfigurationDescriptor.HID_VendorHID; - Size = sizeof(USB_HID_Descriptor_HID_t); - } - else - { - Address = &HIDReport; - Size = sizeof(HIDReport); - } + else if (DescriptorType == DTYPE_BOS) { + Address = &BOSDescriptor; + Size = sizeof(BOSDescriptor); + } + else if (DescriptorType == DTYPE_String) { + switch (DescriptorNumber) + { + case STRING_ID_Language: + Address = &LanguageString; + Size = LanguageString.Header.Size; + break; + case STRING_ID_Product: + Address = &ProductString; + Size = ProductString.Header.Size; + break; + } + } *DescriptorAddress = Address; return Size; diff --git a/Firmware/Bootloader/Descriptors.h b/Firmware/Bootloader/Descriptors.h index 4c7d08b..64e63b5 100644 --- a/Firmware/Bootloader/Descriptors.h +++ b/Firmware/Bootloader/Descriptors.h @@ -36,45 +36,44 @@ #ifndef _DESCRIPTORS_H_ #define _DESCRIPTORS_H_ + #define WEBUSB_ID 0x01 + #define MS_OS_ID 0x02 + #define CONFIG_ID 0x03 + /* Includes: */ #include - - /* Type Defines: */ - /** Type define for the device configuration descriptor structure. This must be defined in the - * application code, as the configuration descriptor contains several sub-descriptors which - * vary between devices, and which describe the device's usage to the host. - */ + typedef struct { USB_Descriptor_Configuration_Header_t Config; - - // Generic HID Interface - USB_Descriptor_Interface_t HID_Interface; - USB_HID_Descriptor_HID_t HID_VendorHID; - USB_Descriptor_Endpoint_t HID_ReportINEndpoint; + USB_Descriptor_Interface_t Config_Interface; } USB_Descriptor_Configuration_t; - - /** Enum for the device interface descriptor IDs within the device. Each interface descriptor - * should have a unique ID index associated with it, which can be used to refer to the - * interface from other descriptors. - */ + enum InterfaceDescriptors_t { - INTERFACE_ID_Printer = 0, /**< Printer interface descriptor ID */ + INTERFACE_ID_Config = 0, /**< Config interface descriptor ID */ + }; + + enum URLDescriptors_t + { + URL_ID_Localhost = 1, + URL_ID_Config = 2, + }; + + 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 address of the HID data IN endpoint. */ - #define HID_IN_EPADDR (ENDPOINT_DIR_IN | 1) - - /** Size in bytes of the HID reporting IN endpoint. */ - #define HID_IN_EPSIZE 64 /* 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); + + void USB_Process_BOS(void); #endif diff --git a/Firmware/Bootloader/makefile b/Firmware/Bootloader/makefile index dab58ff..494031a 100644 --- a/Firmware/Bootloader/makefile +++ b/Firmware/Bootloader/makefile @@ -14,15 +14,17 @@ MCU = atmega16u2 ARCH = AVR8 BOARD = USER -F_CPU = 8000000 +F_CPU = 16000000 F_USB = $(F_CPU) OPTIMIZATION = s -TARGET = BootloaderHID +TARGET = Bootloader SRC = $(TARGET).c Descriptors.c $(LUFA_SRC_USB) LUFA_PATH = ../LUFA CC_FLAGS = -DUSE_LUFA_CONFIG_HEADER -IConfig/ LD_FLAGS = -Wl,--section-start=.text=$(BOOT_START_OFFSET) +AVRDUDE = avrdude -B 8 -c usbasp -p $(MCU) + # Flash size and bootloader section sizes of the target, in KB. These must # match the target's total FLASH size and the bootloader size set in the # device's fuses. @@ -46,3 +48,6 @@ include $(LUFA_PATH)/Build/lufa_cppcheck.mk include $(LUFA_PATH)/Build/lufa_doxygen.mk include $(LUFA_PATH)/Build/lufa_avrdude.mk include $(LUFA_PATH)/Build/lufa_atprogram.mk + +flash: all + $(AVRDUDE) -U flash:w:Bootloader.hex:i