From 7181dc23080630abf2770674177a602a59ba9006 Mon Sep 17 00:00:00 2001 From: Olaf Rempel Date: Sat, 13 Feb 2021 21:17:34 +0100 Subject: [PATCH] Control fan pwm from CDC --- Descriptors.h | 109 ------------------- LUFAConfig.h | 4 +- main.c | 219 +++++++++----------------------------- Descriptors.c => usbcdc.c | 219 +++++++++++++++++++++++++++----------- usbcdc.h | 15 +++ 5 files changed, 224 insertions(+), 342 deletions(-) delete mode 100644 Descriptors.h rename Descriptors.c => usbcdc.c (54%) create mode 100644 usbcdc.h diff --git a/Descriptors.h b/Descriptors.h deleted file mode 100644 index 8badb07..0000000 --- a/Descriptors.h +++ /dev/null @@ -1,109 +0,0 @@ -/* - 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 - - #include - - /* 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 diff --git a/LUFAConfig.h b/LUFAConfig.h index 0aa6746..c25c626 100644 --- a/LUFAConfig.h +++ b/LUFAConfig.h @@ -55,7 +55,7 @@ // #define NO_CLASS_DRIVER_AUTOFLUSH /* General USB Driver Related Tokens: */ -// #define ORDERED_EP_CONFIG + #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 @@ -72,7 +72,7 @@ // #define DEVICE_STATE_AS_GPIOR {Insert Value Here} #define FIXED_NUM_CONFIGURATIONS 1 // #define CONTROL_ONLY_DEVICE -// #define INTERRUPT_CONTROL_ENDPOINT + #define INTERRUPT_CONTROL_ENDPOINT // #define NO_DEVICE_REMOTE_WAKEUP // #define NO_DEVICE_SELF_POWER diff --git a/main.c b/main.c index 82e3251..9dc22cc 100644 --- a/main.c +++ b/main.c @@ -1,61 +1,71 @@ -#include -#include -#include +/*************************************************************************** + * Copyright (C) 02/2021 by Olaf Rempel * + * razzor@kopf-tisch.de * + * * + * 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; version 2 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, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ #include -#include +#include +#include -#include "Descriptors.h" #include "event.h" #include "ledfade.h" #include "pwm.h" #include "timer.h" +#include "usbcdc.h" -#include -#include - -void SetupHardware(void); -void CDC_Task(void); - -void EVENT_USB_Device_Connect(void); -void EVENT_USB_Device_Disconnect(void); -void EVENT_USB_Device_ConfigurationChanged(void); -void EVENT_USB_Device_ControlRequest(void); +/* *********************************************************************** */ -/** Contains the current baud rate and other settings of the virtual serial port. While this demo does not use - * the physical USART and thus does not use these settings, they must still be retained and returned to the host - * upon request or the host will assume the device is non-functional. - * - * These values are set by the host via a class-specific request, however they are not required to be used accurately. - * It is possible to completely ignore these value or use other settings as the host is completely unaware of the physical - * serial link characteristics and instead sends and receives data in endpoint streams. - */ -static CDC_LineEncoding_t LineEncoding = { .BaudRateBPS = 0, - .CharFormat = CDC_LINEENCODING_OneStopBit, - .ParityType = CDC_PARITY_None, - .DataBits = 8 }; +/* ************************************************************************* + * disable_wdt_timer + * ************************************************************************* */ +void disable_wdt_timer(void) __attribute__((naked, section(".init3"))); +void disable_wdt_timer(void) +{ + MCUSR = 0; + WDTCSR = (1<num == EVENT_NUM_LED_CH0) + { + PORTD &= ~(1<num == EVENT_NUM_LED_CH0) + { + PORTD |= (1< +#include - dean [at] fourwalledcubicle [dot] com - www.lufa-lib.org -*/ +#include "event.h" +#include "ledfade.h" +#include "pwm.h" +#include "usbcdc.h" -/* - 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. +#define CDC_NOTIFICATION_EPADDR (ENDPOINT_DIR_IN | 2) +#define CDC_TX_EPADDR (ENDPOINT_DIR_IN | 3) +#define CDC_RX_EPADDR (ENDPOINT_DIR_OUT | 4) +#define CDC_NOTIFICATION_EPSIZE 8 +#define CDC_TXRX_EPSIZE 16 - 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. -*/ +typedef struct +{ + USB_Descriptor_Configuration_Header_t Config; -/** \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. - */ + // 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; -#include "Descriptors.h" + // 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 InterfaceDescriptors_t +{ + INTERFACE_ID_CDC_CCI = 0, + INTERFACE_ID_CDC_DCI = 1, +}; + +enum StringDescriptors_t +{ + STRING_ID_Language = 0, + STRING_ID_Manufacturer = 1, + STRING_ID_Product = 2, +}; + +/* *********************************************************************** */ -/** 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}, @@ -60,11 +81,6 @@ const USB_Descriptor_Device_t PROGMEM DeviceDescriptor = .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 = @@ -152,36 +168,16 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor = } }; -/** 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 uint8_t DescriptorType = (wValue >> 8); + const uint8_t DescriptorNumber = (wValue & 0xFF); const void* Address = NULL; uint16_t Size = NO_DESCRIPTOR; @@ -192,10 +188,12 @@ uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue, 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) { @@ -203,16 +201,17 @@ uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue, 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; } @@ -220,3 +219,93 @@ uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue, return Size; } +USB_ClassInfo_CDC_Device_t VirtualSerial_CDC_Interface = +{ + .Config = + { + .ControlInterfaceNumber = INTERFACE_ID_CDC_CCI, + .DataINEndpoint = + { + .Address = CDC_TX_EPADDR, + .Size = CDC_TXRX_EPSIZE, + .Banks = 1, + }, + .DataOUTEndpoint = + { + .Address = CDC_RX_EPADDR, + .Size = CDC_TXRX_EPSIZE, + .Banks = 1, + }, + .NotificationEndpoint = + { + .Address = CDC_NOTIFICATION_EPADDR, + .Size = CDC_NOTIFICATION_EPSIZE, + .Banks = 1, + }, + }, +}; +/* +void EVENT_USB_Device_Connect(void) +{ +} + +void EVENT_USB_Device_Disconnect(void) +{ +} +*/ +void EVENT_USB_Device_ConfigurationChanged(void) +{ + CDC_Device_ConfigureEndpoints(&VirtualSerial_CDC_Interface); +} + +void EVENT_USB_Device_ControlRequest(void) +{ + CDC_Device_ProcessControlRequest(&VirtualSerial_CDC_Interface); +} +/* +void EVENT_CDC_Device_LineEncodingChanged(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo) +{ +} + +void EVENT_CDC_Device_ControLineStateChanged(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo) +{ +} +*/ + +void usbcdc_event_handler(event_entry_t * p_event) +{ + if ((p_event->type == EVENT_TYPE_LEDFADE_STATUS) && + (p_event->num == EVENT_NUM_LED_CH0) + ) + { + if (USB_DeviceState == DEVICE_STATE_Configured) + { + CDC_Device_SendByte(&VirtualSerial_CDC_Interface, '!'); + } + } +} + +void usbcdc_task(void) +{ + CDC_Device_USBTask(&VirtualSerial_CDC_Interface); + USB_USBTask(); + + if (CDC_Device_BytesReceived(&VirtualSerial_CDC_Interface)) + { + uint8_t cmd = CDC_Device_ReceiveByte(&VirtualSerial_CDC_Interface); + uint16_t value = 0; + if ((cmd >= '1') && (cmd <= '8')) + { + value = ((cmd - '0') * 0x2000) -1; + } + + event_queue(EVENT_TYPE_PWM_VALUE, + EVENT_NUM_PWM_CH2, + value); + } +} + +void usbcdc_init(void) +{ + USB_Init(); +} diff --git a/usbcdc.h b/usbcdc.h new file mode 100644 index 0000000..bd468c0 --- /dev/null +++ b/usbcdc.h @@ -0,0 +1,15 @@ +#ifndef USBCDC_H_SEEN +#define USBCDC_H_SEEN + +#include "event.h" + +/* *********************************************************************** */ + +void usbcdc_event_handler (event_entry_t * p_event); + +void usbcdc_task(void); +void usbcdc_init(void); + +/* *********************************************************************** */ + +#endif /* USBCDC_H_SEEN */