From 53e51de832189a30a2a6e9fae77d0f58a3616ccc Mon Sep 17 00:00:00 2001 From: Zach Eveland Date: Thu, 8 Mar 2012 13:47:42 -0500 Subject: removed old version of Leonardo's caterina bootloader, replaced with LUFA-based caterina --- bootloaders/caterina/Descriptors.c | 265 +++++++++++++++++++++++++++++++++++++ 1 file changed, 265 insertions(+) create mode 100755 bootloaders/caterina/Descriptors.c (limited to 'bootloaders/caterina/Descriptors.c') diff --git a/bootloaders/caterina/Descriptors.c b/bootloaders/caterina/Descriptors.c new file mode 100755 index 0000000..f1756e2 --- /dev/null +++ b/bootloaders/caterina/Descriptors.c @@ -0,0 +1,265 @@ +/* + LUFA Library + Copyright (C) Dean Camera, 2011. + + dean [at] fourwalledcubicle [dot] com + www.lufa-lib.org +*/ + +/* + Copyright 2011 Dean Camera (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 disclaim all warranties with regard to this + software, including all implied warranties of merchantability + and fitness. In no event shall the author be liable for any + special, indirect or consequential damages or any damages + whatsoever resulting from loss of use, data or profits, whether + in an action of contract, negligence or other tortious action, + arising out of or in connection with the use or performance of + this software. +*/ + +/** \file + * + * USB Device Descriptors, for library use when in USB device mode. Descriptors are special + * computer-readable structures which the host requests upon device enumeration, to determine + * the device's capabilities and functions. + */ + +#include "Descriptors.h" + +/** Device descriptor structure. This descriptor, located in 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(01.10), + .Class = CDC_CSCP_CDCClass, + .SubClass = CDC_CSCP_NoSpecificSubclass, + .Protocol = CDC_CSCP_NoSpecificProtocol, + + .Endpoint0Size = FIXED_CONTROL_ENDPOINT_SIZE, + + .VendorID = 0x2341, + .ProductID = 0x0701, + .ReleaseNumber = VERSION_BCD(00.01), + + .ManufacturerStrIndex = 0x02, + .ProductStrIndex = 0x01, + .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 = + { + .Header = {.Size = sizeof(USB_Descriptor_Configuration_Header_t), .Type = DTYPE_Configuration}, + + .TotalConfigurationSize = sizeof(USB_Descriptor_Configuration_t), + .TotalInterfaces = 2, + + .ConfigurationNumber = 1, + .ConfigurationStrIndex = NO_DESCRIPTOR, + + .ConfigAttributes = USB_CONFIG_ATTR_BUSPOWERED, + + .MaxPowerConsumption = USB_CONFIG_POWER_MA(100) + }, + + .CDC_CCI_Interface = + { + .Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, + + .InterfaceNumber = 0, + .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 = DTYPE_CSInterface}, + .Subtype = 0x00, + + .CDCSpecification = VERSION_BCD(01.10), + }, + + .CDC_Functional_ACM = + { + .Header = {.Size = sizeof(USB_CDC_Descriptor_FunctionalACM_t), .Type = DTYPE_CSInterface}, + .Subtype = 0x02, + + .Capabilities = 0x04, + }, + + .CDC_Functional_Union = + { + .Header = {.Size = sizeof(USB_CDC_Descriptor_FunctionalUnion_t), .Type = DTYPE_CSInterface}, + .Subtype = 0x06, + + .MasterInterfaceNumber = 0, + .SlaveInterfaceNumber = 1, + }, + + .CDC_NotificationEndpoint = + { + .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, + + .EndpointAddress = (ENDPOINT_DIR_IN | CDC_NOTIFICATION_EPNUM), + .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 = 1, + .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 = (ENDPOINT_DIR_OUT | CDC_RX_EPNUM), + .Attributes = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), + .EndpointSize = CDC_TXRX_EPSIZE, + .PollingIntervalMS = 0x01 + }, + + .CDC_DataInEndpoint = + { + .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, + + .EndpointAddress = (ENDPOINT_DIR_IN | CDC_TX_EPNUM), + .Attributes = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), + .EndpointSize = CDC_TXRX_EPSIZE, + .PollingIntervalMS = 0x01 + } +}; + +/** Language descriptor structure. This descriptor, located in SRAM 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 LanguageString = +{ + .Header = {.Size = USB_STRING_LEN(1), .Type = DTYPE_String}, + + .UnicodeString = {LANGUAGE_ID_ENG} +}; + +/** 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 ProductString = +{ + .Header = {.Size = USB_STRING_LEN(16), .Type = DTYPE_String}, + + .UnicodeString = L"Arduino Leonardo" +}; +/* +const USB_Descriptor_String_t SerialNumString = +{ + .Header = {.Size = USB_STRING_LEN(12), .Type = DTYPE_String}, + + .UnicodeString = L"000000001452" +}; +*/ +const USB_Descriptor_String_t ManufNameString = +{ + .Header = {.Size = USB_STRING_LEN(11), .Type = DTYPE_String}, + + .UnicodeString = L"Arduino LLC" +}; + +/** This function is called by the library when in device mode, and must be overridden (see LUFA 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 uint8_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: + if (!(DescriptorNumber)) + { + Address = &LanguageString; + Size = LanguageString.Header.Size; + } + else if (DescriptorNumber == DeviceDescriptor.ProductStrIndex) + { + Address = &ProductString; + Size = ProductString.Header.Size; +// } else if (DescriptorNumber == DeviceDescriptor.SerialNumStrIndex) +// { +// Address = &SerialNumString; +// Size = SerialNumString.Header.Size; + } else if (DescriptorNumber == DeviceDescriptor.ManufacturerStrIndex) + { + Address = &ManufNameString; + Size = ManufNameString.Header.Size; + } + + break; + } + + *DescriptorAddress = Address; + return Size; +} + -- cgit v1.2.3-18-g5258 From afedb5a92bac5c7f62a02ba085b4fff2b4f2070a Mon Sep 17 00:00:00 2001 From: Zach Eveland Date: Mon, 9 Apr 2012 08:03:56 -0400 Subject: PID and VID are no longer hard-coded in bootloader. instead they are passed in at compile-time from makefile. also added and renamed built bootloader images for Micro and Leonardo --- bootloaders/caterina/Descriptors.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) (limited to 'bootloaders/caterina/Descriptors.c') diff --git a/bootloaders/caterina/Descriptors.c b/bootloaders/caterina/Descriptors.c index f1756e2..824e0dd 100755 --- a/bootloaders/caterina/Descriptors.c +++ b/bootloaders/caterina/Descriptors.c @@ -53,8 +53,8 @@ const USB_Descriptor_Device_t DeviceDescriptor = .Endpoint0Size = FIXED_CONTROL_ENDPOINT_SIZE, - .VendorID = 0x2341, - .ProductID = 0x0701, + .VendorID = DEVICE_VID, + .ProductID = DEVICE_PID, .ReleaseNumber = VERSION_BCD(00.01), .ManufacturerStrIndex = 0x02, @@ -193,7 +193,13 @@ const USB_Descriptor_String_t ProductString = { .Header = {.Size = USB_STRING_LEN(16), .Type = DTYPE_String}, - .UnicodeString = L"Arduino Leonardo" + #if DEVICE_PID == 0x0034 + .UnicodeString = L"Arduino Leonardo" + #elif DEVICE_PID == 0x0035 + .UnicodeString = L"Arduino Micro " + #else + .UnicodeString = L"USB IO board " + #endif }; /* const USB_Descriptor_String_t SerialNumString = -- cgit v1.2.3-18-g5258 From e2e0260094c762fddf4669b7a957914405ae9f19 Mon Sep 17 00:00:00 2001 From: Zach Eveland Date: Mon, 9 Apr 2012 10:12:14 -0400 Subject: Micro I hardly knew ye --- bootloaders/caterina/Descriptors.c | 17 ++--------------- 1 file changed, 2 insertions(+), 15 deletions(-) (limited to 'bootloaders/caterina/Descriptors.c') diff --git a/bootloaders/caterina/Descriptors.c b/bootloaders/caterina/Descriptors.c index 824e0dd..e0d3304 100755 --- a/bootloaders/caterina/Descriptors.c +++ b/bootloaders/caterina/Descriptors.c @@ -195,20 +195,11 @@ const USB_Descriptor_String_t ProductString = #if DEVICE_PID == 0x0034 .UnicodeString = L"Arduino Leonardo" - #elif DEVICE_PID == 0x0035 - .UnicodeString = L"Arduino Micro " - #else + #else .UnicodeString = L"USB IO board " #endif }; -/* -const USB_Descriptor_String_t SerialNumString = -{ - .Header = {.Size = USB_STRING_LEN(12), .Type = DTYPE_String}, - - .UnicodeString = L"000000001452" -}; -*/ + const USB_Descriptor_String_t ManufNameString = { .Header = {.Size = USB_STRING_LEN(11), .Type = DTYPE_String}, @@ -252,10 +243,6 @@ uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue, { Address = &ProductString; Size = ProductString.Header.Size; -// } else if (DescriptorNumber == DeviceDescriptor.SerialNumStrIndex) -// { -// Address = &SerialNumString; -// Size = SerialNumString.Header.Size; } else if (DescriptorNumber == DeviceDescriptor.ManufacturerStrIndex) { Address = &ManufNameString; -- cgit v1.2.3-18-g5258 From d755d0035d4e3a816c127fd8207722bfe6629eee Mon Sep 17 00:00:00 2001 From: Zach Eveland Date: Wed, 25 Apr 2012 15:56:18 -0400 Subject: changed PID values for Leonardo bootloader and sketch done to avoid driver problems for users who installed the pre-release bootloader and driver --- bootloaders/caterina/Descriptors.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'bootloaders/caterina/Descriptors.c') diff --git a/bootloaders/caterina/Descriptors.c b/bootloaders/caterina/Descriptors.c index e0d3304..c5feaf5 100755 --- a/bootloaders/caterina/Descriptors.c +++ b/bootloaders/caterina/Descriptors.c @@ -193,7 +193,7 @@ const USB_Descriptor_String_t ProductString = { .Header = {.Size = USB_STRING_LEN(16), .Type = DTYPE_String}, - #if DEVICE_PID == 0x0034 + #if DEVICE_PID == 0x0036 .UnicodeString = L"Arduino Leonardo" #else .UnicodeString = L"USB IO board " @@ -204,7 +204,11 @@ const USB_Descriptor_String_t ManufNameString = { .Header = {.Size = USB_STRING_LEN(11), .Type = DTYPE_String}, + #if DEVICE_VID == 0x2341 .UnicodeString = L"Arduino LLC" + #else + .UnicodeString = L"Unknown " + #endif }; /** This function is called by the library when in device mode, and must be overridden (see LUFA library "USB Descriptors" -- cgit v1.2.3-18-g5258