Checkpoint
parent
21ad153941
commit
26fd53251b
|
|
@ -159,7 +159,7 @@ endif()
|
||||||
|
|
||||||
# add_link_dependency(firmware "${LINKER_SCRIPT}")
|
# add_link_dependency(firmware "${LINKER_SCRIPT}")
|
||||||
|
|
||||||
target_include_directories(firmware PRIVATE src)
|
target_include_directories(firmware PRIVATE src lib)
|
||||||
|
|
||||||
target_compile_options(firmware PRIVATE -Wdouble-promotion)
|
target_compile_options(firmware PRIVATE -Wdouble-promotion)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -4,25 +4,17 @@ add_library(
|
||||||
lufa/LUFA/Drivers/USB/Core/AVR8/Device_AVR8.c
|
lufa/LUFA/Drivers/USB/Core/AVR8/Device_AVR8.c
|
||||||
lufa/LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.c
|
lufa/LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.c
|
||||||
lufa/LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.c
|
lufa/LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.c
|
||||||
|
lufa/LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.c
|
||||||
lufa/LUFA/Drivers/USB/Core/ConfigDescriptors.c
|
lufa/LUFA/Drivers/USB/Core/ConfigDescriptors.c
|
||||||
lufa/LUFA/Drivers/USB/Core/Events.c
|
lufa/LUFA/Drivers/USB/Core/Events.c
|
||||||
|
lufa/LUFA/Drivers/USB/Core/DeviceStandardReq.c
|
||||||
|
lufa/LUFA/Drivers/USB/Core/USBTask.c
|
||||||
|
lufa/LUFA/CodeTemplates/DeviceTemplate/Descriptors.c
|
||||||
|
lufa/LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.c
|
||||||
|
Descriptors.c
|
||||||
)
|
)
|
||||||
|
|
||||||
target_compile_definitions(LUFA PUBLIC
|
target_include_directories(LUFA PRIVATE . lufa)
|
||||||
-D USB_DEVICE_ONLY
|
target_compile_options(LUFA PRIVATE -include lufa_config.h)
|
||||||
-D DEVICE_STATE_AS_GPIOR=0
|
|
||||||
-D ORDERED_EP_CONFIG
|
|
||||||
-D FIXED_CONTROL_ENDPOINT_SIZE=8
|
|
||||||
-D FIXED_NUM_CONFIGURATIONS=1
|
|
||||||
-D USE_RAM_DESCRIPTORS
|
|
||||||
# -D USE_STATIC_OPTIONS= "(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"
|
|
||||||
-D NO_INTERNAL_SERIAL
|
|
||||||
-D NO_DEVICE_SELF_POWER
|
|
||||||
-D NO_DEVICE_REMOTE_WAKEUP
|
|
||||||
-D NO_SOF_EVENTS
|
|
||||||
-D F_USB=F_CPU
|
|
||||||
-D DEVICE_VID=0x2C99
|
|
||||||
-D DEVICE_PID=0x0003 #could also be 0x0004. TBD.
|
|
||||||
)
|
|
||||||
|
|
||||||
target_compile_features(LUFA PUBLIC c_std_99)
|
target_compile_features(LUFA PUBLIC c_std_99)
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,245 @@
|
||||||
|
/*
|
||||||
|
LUFA Library
|
||||||
|
Copyright (C) Dean Camera, 2021.
|
||||||
|
|
||||||
|
dean [at] fourwalledcubicle [dot] com
|
||||||
|
www.lufa-lib.org
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
Copyright 2021 Dean Camera (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"
|
||||||
|
|
||||||
|
|
||||||
|
/** Device descriptor structure. This descriptor, located in FLASH memory, describes the overall
|
||||||
|
* device characteristics, including the supported USB version, control endpoint size and the
|
||||||
|
* number of device configurations. The descriptor is read out by the USB host when the enumeration
|
||||||
|
* process begins.
|
||||||
|
*/
|
||||||
|
const USB_Descriptor_Device_t PROGMEM DeviceDescriptor =
|
||||||
|
{
|
||||||
|
.Header = {.Size = sizeof(USB_Descriptor_Device_t), .Type = DTYPE_Device},
|
||||||
|
|
||||||
|
.USBSpecification = VERSION_BCD(1,1,0),
|
||||||
|
.Class = CDC_CSCP_CDCClass,
|
||||||
|
.SubClass = CDC_CSCP_NoSpecificSubclass,
|
||||||
|
.Protocol = CDC_CSCP_NoSpecificProtocol,
|
||||||
|
|
||||||
|
.Endpoint0Size = FIXED_CONTROL_ENDPOINT_SIZE,
|
||||||
|
|
||||||
|
.VendorID = 0x03EB,
|
||||||
|
.ProductID = 0x2044,
|
||||||
|
.ReleaseNumber = VERSION_BCD(0,0,1),
|
||||||
|
|
||||||
|
.ManufacturerStrIndex = STRING_ID_Manufacturer,
|
||||||
|
.ProductStrIndex = STRING_ID_Product,
|
||||||
|
.SerialNumStrIndex = USE_INTERNAL_SERIAL,
|
||||||
|
|
||||||
|
.NumberOfConfigurations = FIXED_NUM_CONFIGURATIONS
|
||||||
|
};
|
||||||
|
|
||||||
|
/** Configuration descriptor structure. This descriptor, located in FLASH memory, describes the usage
|
||||||
|
* of the device in one of its supported configurations, including information about any device interfaces
|
||||||
|
* and endpoints. The descriptor is read out by the USB host during the enumeration process when selecting
|
||||||
|
* a configuration so that the host may correctly communicate with the USB device.
|
||||||
|
*/
|
||||||
|
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 = (USB_CONFIG_ATTR_RESERVED | USB_CONFIG_ATTR_SELFPOWERED),
|
||||||
|
|
||||||
|
.MaxPowerConsumption = USB_CONFIG_POWER_MA(100)
|
||||||
|
},
|
||||||
|
|
||||||
|
.CDC_CCI_Interface =
|
||||||
|
{
|
||||||
|
.Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface},
|
||||||
|
|
||||||
|
.InterfaceNumber = INTERFACE_ID_CDC_CCI,
|
||||||
|
.AlternateSetting = 0,
|
||||||
|
|
||||||
|
.TotalEndpoints = 1,
|
||||||
|
|
||||||
|
.Class = CDC_CSCP_CDCClass,
|
||||||
|
.SubClass = CDC_CSCP_ACMSubclass,
|
||||||
|
.Protocol = CDC_CSCP_ATCommandProtocol,
|
||||||
|
|
||||||
|
.InterfaceStrIndex = NO_DESCRIPTOR
|
||||||
|
},
|
||||||
|
|
||||||
|
.CDC_Functional_Header =
|
||||||
|
{
|
||||||
|
.Header = {.Size = sizeof(USB_CDC_Descriptor_FunctionalHeader_t), .Type = CDC_DTYPE_CSInterface},
|
||||||
|
.Subtype = CDC_DSUBTYPE_CSInterface_Header,
|
||||||
|
|
||||||
|
.CDCSpecification = VERSION_BCD(1,1,0),
|
||||||
|
},
|
||||||
|
|
||||||
|
.CDC_Functional_ACM =
|
||||||
|
{
|
||||||
|
.Header = {.Size = sizeof(USB_CDC_Descriptor_FunctionalACM_t), .Type = CDC_DTYPE_CSInterface},
|
||||||
|
.Subtype = CDC_DSUBTYPE_CSInterface_ACM,
|
||||||
|
|
||||||
|
.Capabilities = 0x06,
|
||||||
|
},
|
||||||
|
|
||||||
|
.CDC_Functional_Union =
|
||||||
|
{
|
||||||
|
.Header = {.Size = sizeof(USB_CDC_Descriptor_FunctionalUnion_t), .Type = CDC_DTYPE_CSInterface},
|
||||||
|
.Subtype = CDC_DSUBTYPE_CSInterface_Union,
|
||||||
|
|
||||||
|
.MasterInterfaceNumber = INTERFACE_ID_CDC_CCI,
|
||||||
|
.SlaveInterfaceNumber = INTERFACE_ID_CDC_DCI,
|
||||||
|
},
|
||||||
|
|
||||||
|
.CDC_NotificationEndpoint =
|
||||||
|
{
|
||||||
|
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
|
||||||
|
|
||||||
|
.EndpointAddress = CDC_NOTIFICATION_EPADDR,
|
||||||
|
.Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
|
||||||
|
.EndpointSize = CDC_NOTIFICATION_EPSIZE,
|
||||||
|
.PollingIntervalMS = 0xFF
|
||||||
|
},
|
||||||
|
|
||||||
|
.CDC_DCI_Interface =
|
||||||
|
{
|
||||||
|
.Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface},
|
||||||
|
|
||||||
|
.InterfaceNumber = INTERFACE_ID_CDC_DCI,
|
||||||
|
.AlternateSetting = 0,
|
||||||
|
|
||||||
|
.TotalEndpoints = 2,
|
||||||
|
|
||||||
|
.Class = CDC_CSCP_CDCDataClass,
|
||||||
|
.SubClass = CDC_CSCP_NoDataSubclass,
|
||||||
|
.Protocol = CDC_CSCP_NoDataProtocol,
|
||||||
|
|
||||||
|
.InterfaceStrIndex = NO_DESCRIPTOR
|
||||||
|
},
|
||||||
|
|
||||||
|
.CDC_DataOutEndpoint =
|
||||||
|
{
|
||||||
|
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
|
||||||
|
|
||||||
|
.EndpointAddress = CDC_RX_EPADDR,
|
||||||
|
.Attributes = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
|
||||||
|
.EndpointSize = CDC_TXRX_EPSIZE,
|
||||||
|
.PollingIntervalMS = 0x05
|
||||||
|
},
|
||||||
|
|
||||||
|
.CDC_DataInEndpoint =
|
||||||
|
{
|
||||||
|
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
|
||||||
|
|
||||||
|
.EndpointAddress = CDC_TX_EPADDR,
|
||||||
|
.Attributes = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
|
||||||
|
.EndpointSize = CDC_TXRX_EPSIZE,
|
||||||
|
.PollingIntervalMS = 0x05
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/** Language descriptor structure. This descriptor, located in FLASH memory, is returned when the host requests
|
||||||
|
* the string descriptor with index 0 (the first index). It is actually an array of 16-bit integers, which indicate
|
||||||
|
* via the language ID table available at USB.org what languages the device supports for its string descriptors.
|
||||||
|
*/
|
||||||
|
const USB_Descriptor_String_t PROGMEM LanguageString = USB_STRING_DESCRIPTOR_ARRAY(LANGUAGE_ID_ENG);
|
||||||
|
|
||||||
|
/** Manufacturer descriptor string. This is a Unicode string containing the manufacturer's details in human readable
|
||||||
|
* form, and is read out upon request by the host when the appropriate string ID is requested, listed in the Device
|
||||||
|
* Descriptor.
|
||||||
|
*/
|
||||||
|
const USB_Descriptor_String_t PROGMEM ManufacturerString = USB_STRING_DESCRIPTOR(L"LUFA Library");
|
||||||
|
|
||||||
|
/** Product descriptor string. This is a Unicode string containing the product's details in human readable form,
|
||||||
|
* and is read out upon request by the host when the appropriate string ID is requested, listed in the Device
|
||||||
|
* Descriptor.
|
||||||
|
*/
|
||||||
|
const USB_Descriptor_String_t PROGMEM ProductString = USB_STRING_DESCRIPTOR(L"LUFA CDC Demo");
|
||||||
|
|
||||||
|
/** 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
|
||||||
|
* is called so that the descriptor details can be passed back and the appropriate descriptor sent back to the
|
||||||
|
* USB host.
|
||||||
|
*/
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
*DescriptorAddress = Address;
|
||||||
|
return Size;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
@ -0,0 +1,110 @@
|
||||||
|
/*
|
||||||
|
LUFA Library
|
||||||
|
Copyright (C) Dean Camera, 2021.
|
||||||
|
|
||||||
|
dean [at] fourwalledcubicle [dot] com
|
||||||
|
www.lufa-lib.org
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
Copyright 2021 Dean Camera (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 Descriptors.c.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _DESCRIPTORS_H_
|
||||||
|
#define _DESCRIPTORS_H_
|
||||||
|
|
||||||
|
/* Includes: */
|
||||||
|
#include <avr/pgmspace.h>
|
||||||
|
|
||||||
|
#include "lufa/LUFA/Drivers/USB/USB.h"
|
||||||
|
|
||||||
|
/* Macros: */
|
||||||
|
/** Endpoint address of the CDC device-to-host notification IN endpoint. */
|
||||||
|
#define CDC_NOTIFICATION_EPADDR (ENDPOINT_DIR_IN | 2)
|
||||||
|
|
||||||
|
/** Endpoint address of the CDC device-to-host data IN endpoint. */
|
||||||
|
#define CDC_TX_EPADDR (ENDPOINT_DIR_IN | 3)
|
||||||
|
|
||||||
|
/** Endpoint address of the CDC host-to-device data OUT endpoint. */
|
||||||
|
#define CDC_RX_EPADDR (ENDPOINT_DIR_OUT | 4)
|
||||||
|
|
||||||
|
/** Size in bytes of the CDC device-to-host notification IN endpoint. */
|
||||||
|
#define CDC_NOTIFICATION_EPSIZE 8
|
||||||
|
|
||||||
|
/** Size in bytes of the CDC data IN and OUT endpoints. */
|
||||||
|
#define CDC_TXRX_EPSIZE 16
|
||||||
|
|
||||||
|
/* Type Defines: */
|
||||||
|
/** Type define for the device configuration descriptor structure. This must be defined in the
|
||||||
|
* application code, as the configuration descriptor contains several sub-descriptors which
|
||||||
|
* vary between devices, and which describe the device's usage to the host.
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
USB_Descriptor_Configuration_Header_t Config;
|
||||||
|
|
||||||
|
// CDC Control Interface
|
||||||
|
USB_Descriptor_Interface_t CDC_CCI_Interface;
|
||||||
|
USB_CDC_Descriptor_FunctionalHeader_t CDC_Functional_Header;
|
||||||
|
USB_CDC_Descriptor_FunctionalACM_t CDC_Functional_ACM;
|
||||||
|
USB_CDC_Descriptor_FunctionalUnion_t CDC_Functional_Union;
|
||||||
|
USB_Descriptor_Endpoint_t CDC_NotificationEndpoint;
|
||||||
|
|
||||||
|
// CDC Data Interface
|
||||||
|
USB_Descriptor_Interface_t CDC_DCI_Interface;
|
||||||
|
USB_Descriptor_Endpoint_t CDC_DataOutEndpoint;
|
||||||
|
USB_Descriptor_Endpoint_t CDC_DataInEndpoint;
|
||||||
|
} 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_CDC_CCI = 0, /**< CDC CCI interface descriptor ID */
|
||||||
|
INTERFACE_ID_CDC_DCI = 1, /**< CDC DCI interface descriptor ID */
|
||||||
|
};
|
||||||
|
|
||||||
|
/** Enum for the device string descriptor IDs within the device. Each string descriptor should
|
||||||
|
* have a unique ID index associated with it, which can be used to refer to the string from
|
||||||
|
* other descriptors.
|
||||||
|
*/
|
||||||
|
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 */
|
||||||
|
};
|
||||||
|
|
||||||
|
/* 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
|
||||||
|
|
||||||
|
|
@ -0,0 +1,16 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#define USB_DEVICE_ONLY
|
||||||
|
#define DEVICE_STATE_AS_GPIOR 0
|
||||||
|
#define ORDERED_EP_CONFIG
|
||||||
|
#define FIXED_CONTROL_ENDPOINT_SIZE 8
|
||||||
|
#define FIXED_NUM_CONFIGURATIONS 1
|
||||||
|
#define USE_FLASH_DESCRIPTORS
|
||||||
|
#define USE_STATIC_OPTIONS (USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)
|
||||||
|
#define NO_INTERNAL_SERIAL
|
||||||
|
#define NO_DEVICE_SELF_POWER
|
||||||
|
#define NO_DEVICE_REMOTE_WAKEUP
|
||||||
|
#define NO_SOF_EVENTS
|
||||||
|
#define F_USB F_CPU
|
||||||
|
#define DEVICE_VID 0x2C99
|
||||||
|
#define DEVICE_PID 0x0004
|
||||||
|
|
@ -3,6 +3,8 @@ target_sources(
|
||||||
PRIVATE main.cpp
|
PRIVATE main.cpp
|
||||||
)
|
)
|
||||||
|
|
||||||
|
target_link_libraries(firmware LUFA)
|
||||||
|
|
||||||
set_property(
|
set_property(
|
||||||
SOURCE src/version.c
|
SOURCE src/version.c
|
||||||
APPEND
|
APPEND
|
||||||
|
|
|
||||||
105
src/main.cpp
105
src/main.cpp
|
|
@ -6,6 +6,12 @@
|
||||||
#include "hal/usart.h"
|
#include "hal/usart.h"
|
||||||
#include "hal/watchdog.h"
|
#include "hal/watchdog.h"
|
||||||
|
|
||||||
|
extern "C" {
|
||||||
|
#include "lufa_config.h"
|
||||||
|
#include "Descriptors.h"
|
||||||
|
#include "lufa/LUFA/Drivers/USB/USB.h"
|
||||||
|
}
|
||||||
|
|
||||||
#include "pins.h"
|
#include "pins.h"
|
||||||
#include <avr/interrupt.h>
|
#include <avr/interrupt.h>
|
||||||
#include <util/delay.h>
|
#include <util/delay.h>
|
||||||
|
|
@ -35,6 +41,100 @@
|
||||||
|
|
||||||
#include "panic.h"
|
#include "panic.h"
|
||||||
|
|
||||||
|
extern "C" {
|
||||||
|
|
||||||
|
/** LUFA CDC Class driver interface configuration and state information. This structure is
|
||||||
|
* passed to all CDC Class driver functions, so that multiple instances of the same class
|
||||||
|
* within a device can be differentiated from one another.
|
||||||
|
*/
|
||||||
|
USB_ClassInfo_CDC_Device_t VirtualSerial_CDC_Interface =
|
||||||
|
{
|
||||||
|
.Config =
|
||||||
|
{
|
||||||
|
.ControlInterfaceNumber = INTERFACE_ID_CDC_CCI,
|
||||||
|
.DataINEndpoint =
|
||||||
|
{
|
||||||
|
.Address = CDC_TX_EPADDR,
|
||||||
|
.Size = CDC_TXRX_EPSIZE,
|
||||||
|
.Type = EP_TYPE_BULK,
|
||||||
|
.Banks = 1,
|
||||||
|
},
|
||||||
|
.DataOUTEndpoint =
|
||||||
|
{
|
||||||
|
.Address = CDC_RX_EPADDR,
|
||||||
|
.Size = CDC_TXRX_EPSIZE,
|
||||||
|
.Type = EP_TYPE_BULK,
|
||||||
|
.Banks = 1,
|
||||||
|
},
|
||||||
|
.NotificationEndpoint =
|
||||||
|
{
|
||||||
|
.Address = CDC_NOTIFICATION_EPADDR,
|
||||||
|
.Size = CDC_NOTIFICATION_EPSIZE,
|
||||||
|
.Type = EP_TYPE_INTERRUPT,
|
||||||
|
.Banks = 1,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
void testFunc(uint8_t i) {
|
||||||
|
char str[30];
|
||||||
|
sprintf_P(str, PSTR("testFunc(%hu)\n"), i);
|
||||||
|
hal::usart::usart1.puts(str);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Event handler for the library USB Connection event. */
|
||||||
|
void EVENT_USB_Device_Connect(void)
|
||||||
|
{
|
||||||
|
hal::usart::usart1.puts("EVENT_USB_Device_Connect\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Event handler for the library USB Disconnection event. */
|
||||||
|
void EVENT_USB_Device_Disconnect(void)
|
||||||
|
{
|
||||||
|
hal::usart::usart1.puts("EVENT_USB_Device_Disconnect\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Event handler for the library USB Configuration Changed event. */
|
||||||
|
void EVENT_USB_Device_ConfigurationChanged(void)
|
||||||
|
{
|
||||||
|
bool ConfigSuccess = true;
|
||||||
|
|
||||||
|
ConfigSuccess &= CDC_Device_ConfigureEndpoints(&VirtualSerial_CDC_Interface);
|
||||||
|
|
||||||
|
// LEDs_SetAllLEDs(ConfigSuccess ? LEDMASK_USB_READY : LEDMASK_USB_ERROR);
|
||||||
|
char str1[] = "ready";
|
||||||
|
char str0[] = "error";
|
||||||
|
hal::usart::usart1.puts("EVENT_USB_Device_ConfigurationChanged:");
|
||||||
|
hal::usart::usart1.puts(ConfigSuccess ? str1 : str0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Event handler for the library USB Control Request reception event. */
|
||||||
|
void EVENT_USB_Device_ControlRequest(void)
|
||||||
|
{
|
||||||
|
hal::usart::usart1.puts("EVENT_USB_Device_ControlRequest\n");
|
||||||
|
CDC_Device_ProcessControlRequest(&VirtualSerial_CDC_Interface);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** CDC class driver callback function the processing of changes to the virtual
|
||||||
|
* control lines sent from the host..
|
||||||
|
*
|
||||||
|
* \param[in] CDCInterfaceInfo Pointer to the CDC class interface configuration structure being referenced
|
||||||
|
*/
|
||||||
|
void EVENT_CDC_Device_ControLineStateChanged(USB_ClassInfo_CDC_Device_t *const CDCInterfaceInfo)
|
||||||
|
{
|
||||||
|
/* You can get changes to the virtual CDC lines in this callback; a common
|
||||||
|
use-case is to use the Data Terminal Ready (DTR) flag to enable and
|
||||||
|
disable CDC communications in your application when set to avoid the
|
||||||
|
application blocking while waiting for a host to become ready and read
|
||||||
|
in the pending data from the USB endpoints.
|
||||||
|
*/
|
||||||
|
bool HostReady = (CDCInterfaceInfo->State.ControlLineStates.HostToDevice & CDC_CONTROL_LINE_OUT_DTR) != 0;
|
||||||
|
|
||||||
|
(void)HostReady;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
/// Global instance of the protocol codec
|
/// Global instance of the protocol codec
|
||||||
static mp::Protocol protocol;
|
static mp::Protocol protocol;
|
||||||
|
|
||||||
|
|
@ -141,6 +241,8 @@ void setup() {
|
||||||
ml::leds.SetMode(0, ml::Color::green, ml::Mode::on);
|
ml::leds.SetMode(0, ml::Color::green, ml::Mode::on);
|
||||||
ml::leds.Step();
|
ml::leds.Step();
|
||||||
|
|
||||||
|
USB_Init();
|
||||||
|
|
||||||
/// Turn off all leds
|
/// Turn off all leds
|
||||||
for (uint8_t i = 0; i < config::toolCount; i++) {
|
for (uint8_t i = 0; i < config::toolCount; i++) {
|
||||||
ml::leds.SetMode(i, ml::Color::green, ml::Mode::off);
|
ml::leds.SetMode(i, ml::Color::green, ml::Mode::off);
|
||||||
|
|
@ -368,6 +470,9 @@ void loop() {
|
||||||
mui::userInput.Step();
|
mui::userInput.Step();
|
||||||
currentCommand->Step();
|
currentCommand->Step();
|
||||||
|
|
||||||
|
CDC_Device_USBTask(&VirtualSerial_CDC_Interface);
|
||||||
|
USB_USBTask();
|
||||||
|
|
||||||
hal::watchdog::Reset();
|
hal::watchdog::Reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue