-/*\r
- LUFA Library\r
- Copyright (C) Dean Camera, 2010.\r
- \r
- dean [at] fourwalledcubicle [dot] com\r
- www.fourwalledcubicle.com\r
-*/\r
-\r
-/*\r
- Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com)\r
-\r
- Permission to use, copy, modify, distribute, and sell this \r
- software and its documentation for any purpose is hereby granted\r
- without fee, provided that the above copyright notice appear in \r
- all copies and that both that the copyright notice and this\r
- permission notice and warranty disclaimer appear in supporting \r
- documentation, and that the name of the author not be used in \r
- advertising or publicity pertaining to distribution of the \r
- software without specific, written prior permission.\r
-\r
- The author disclaim all warranties with regard to this\r
- software, including all implied warranties of merchantability\r
- and fitness. In no event shall the author be liable for any\r
- special, indirect or consequential damages or any damages\r
- whatsoever resulting from loss of use, data or profits, whether\r
- in an action of contract, negligence or other tortious action,\r
- arising out of or in connection with the use or performance of\r
- this software.\r
-*/\r
-\r
-#include "Descriptors.h"\r
-\r
-USB_Descriptor_Device_t PROGMEM DeviceDescriptor =\r
-{\r
- Header: {Size: sizeof(USB_Descriptor_Device_t), Type: DTYPE_Device},\r
- \r
- USBSpecification: VERSION_BCD(02.00),\r
- Class: 0x00,\r
- SubClass: 0x00,\r
- Protocol: 0x00,\r
- \r
- Endpoint0Size: 8,\r
- \r
- VendorID: 0x03EB,\r
- ProductID: 0x2040,\r
- ReleaseNumber: 0x0001,\r
- \r
- ManufacturerStrIndex: 0x01,\r
- ProductStrIndex: 0x02,\r
- SerialNumStrIndex: 0x03,\r
- \r
- NumberOfConfigurations: 1\r
-};\r
- \r
-USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =\r
-{\r
- .Config =\r
- {\r
- Header: {Size: sizeof(USB_Descriptor_Configuration_Header_t), Type: DTYPE_Configuration},\r
-\r
- TotalConfigurationSize: sizeof(USB_Descriptor_Configuration_t),\r
- TotalInterfaces: 1,\r
- \r
- ConfigurationNumber: 1,\r
- ConfigurationStrIndex: NO_DESCRIPTOR,\r
- \r
- ConfigAttributes: (USB_CONFIG_ATTR_BUSPOWERED | USB_CONFIG_ATTR_SELFPOWERED),\r
- \r
- MaxPowerConsumption: USB_CONFIG_POWER_MA(100)\r
- },\r
- \r
- .SSHOW_Interface =\r
- {\r
- Header: {Size: sizeof(USB_Descriptor_Interface_t), Type: DTYPE_Interface},\r
-\r
- InterfaceNumber: 0,\r
- AlternateSetting: 0,\r
- \r
- TotalEndpoints: 2,\r
- \r
- Class: 0xFF,\r
- SubClass: 0x00,\r
- Protocol: 0x00,\r
- \r
- InterfaceStrIndex: NO_DESCRIPTOR\r
- },\r
-\r
- .SSHOW_DataInEndpoint =\r
- {\r
- Header: {Size: sizeof(USB_Descriptor_Endpoint_t), Type: DTYPE_Endpoint},\r
-\r
- EndpointAddress: (ENDPOINT_DESCRIPTOR_DIR_IN | SIDESHOW_IN_EPNUM),\r
- Attributes: EP_TYPE_BULK,\r
- EndpointSize: SIDESHOW_IO_EPSIZE,\r
- PollingIntervalMS: 0x00\r
- },\r
-\r
- .SSHOW_DataOutEndpoint =\r
- {\r
- Header: {Size: sizeof(USB_Descriptor_Endpoint_t), Type: DTYPE_Endpoint},\r
-\r
- EndpointAddress: (ENDPOINT_DESCRIPTOR_DIR_OUT | SIDESHOW_OUT_EPNUM),\r
- Attributes: EP_TYPE_BULK,\r
- EndpointSize: SIDESHOW_IO_EPSIZE,\r
- PollingIntervalMS: 0x00\r
- }\r
-};\r
-\r
-USB_Descriptor_String_t PROGMEM LanguageString =\r
-{\r
- Header: {Size: USB_STRING_LEN(1), Type: DTYPE_String},\r
- \r
- UnicodeString: {LANGUAGE_ID_ENG}\r
-};\r
-\r
-USB_Descriptor_String_t PROGMEM ManufacturerString =\r
-{\r
- Header: {Size: USB_STRING_LEN(11), Type: DTYPE_String},\r
- \r
- UnicodeString: L"Dean Camera"\r
-};\r
-\r
-USB_Descriptor_String_t PROGMEM ProductString =\r
-{\r
- Header: {Size: USB_STRING_LEN(22), Type: DTYPE_String},\r
- \r
- UnicodeString: L"LUFA Sideshow Demo"\r
-};\r
-\r
-USB_Descriptor_String_t PROGMEM SerialNumberString =\r
-{\r
- Header: {Size: USB_STRING_LEN(12), Type: DTYPE_String},\r
- \r
- UnicodeString: L"000000000000"\r
-};\r
-\r
-USB_OSDescriptor_t PROGMEM OSDescriptorString =\r
-{\r
- Header: {Size: sizeof(USB_OSDescriptor_t), Type: DTYPE_String},\r
- \r
- Signature: L"MSFT100",\r
- VendorCode: REQ_GetOSFeatureDescriptor\r
-};\r
-\r
-USB_OSCompatibleIDDescriptor_t PROGMEM DevCompatIDs =\r
-{\r
- TotalLength: sizeof(USB_OSCompatibleIDDescriptor_t),\r
- Version: 0x0100,\r
- Index: EXTENDED_COMPAT_ID_DESCRIPTOR,\r
- TotalSections: 1,\r
- \r
- SideshowCompatID: {FirstInterfaceNumber: 0x00,\r
- CompatibleID: "SIDESHW",\r
- SubCompatibleID: "UNIV1"}\r
-};\r
-\r
-uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue, const uint8_t wIndex, void** const DescriptorAddress)\r
-{\r
- const uint8_t DescriptorType = (wValue >> 8);\r
- const uint8_t DescriptorNumber = (wValue & 0xFF);\r
-\r
- void* Address = NULL;\r
- uint16_t Size = NO_DESCRIPTOR;\r
-\r
- switch (DescriptorType)\r
- {\r
- case DTYPE_Device:\r
- Address = (void*)&DeviceDescriptor;\r
- Size = sizeof(USB_Descriptor_Device_t);\r
- break;\r
- case DTYPE_Configuration:\r
- Address = (void*)&ConfigurationDescriptor;\r
- Size = sizeof(USB_Descriptor_Configuration_t);\r
- break;\r
- case DTYPE_String:\r
- switch (DescriptorNumber)\r
- {\r
- case 0x00:\r
- Address = (void*)&LanguageString;\r
- Size = pgm_read_byte(&LanguageString.Header.Size);\r
- break;\r
- case 0x01:\r
- Address = (void*)&ManufacturerString;\r
- Size = pgm_read_byte(&ManufacturerString.Header.Size);\r
- break;\r
- case 0x02:\r
- Address = (void*)&ProductString;\r
- Size = pgm_read_byte(&ProductString.Header.Size);\r
- break;\r
- case 0x03:\r
- Address = (void*)&SerialNumberString;\r
- Size = pgm_read_byte(&SerialNumberString.Header.Size);\r
- break;\r
- case 0xEE:\r
- /* A Microsoft-proprietary extention. String address 0xEE is used by Windows for\r
- "OS Descriptors", which in this case allows us to indicate that our device is\r
- Sideshow compatible regardless of VID/PID values. */\r
- Address = (void*)&OSDescriptorString;\r
- Size = pgm_read_byte(&OSDescriptorString.Header.Size);\r
- break;\r
- }\r
- \r
- break;\r
- }\r
- \r
- *DescriptorAddress = Address; \r
- return Size;\r
-}\r
-\r
-bool USB_GetOSFeatureDescriptor(const uint16_t wValue, const uint8_t wIndex,\r
- void** const DescriptorAddress, uint16_t* const DescriptorSize)\r
-{\r
- void* Address = NULL;\r
- uint16_t Size = 0;\r
-\r
- /* Check if a device level OS feature descriptor is being requested */\r
- if (wValue == 0x0000)\r
- {\r
- /* Only the Extended Device Compatibility descriptor is supported */\r
- if (wIndex == EXTENDED_COMPAT_ID_DESCRIPTOR)\r
- {\r
- Address = (void*)&DevCompatIDs;\r
- Size = sizeof(USB_OSCompatibleIDDescriptor_t);\r
- }\r
- }\r
-\r
- if (Address != NULL)\r
- {\r
- *DescriptorAddress = Address;\r
- *DescriptorSize = Size;\r
-\r
- return true;\r
- }\r
- \r
- return false;\r
-}
\ No newline at end of file
+/*
+ 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.
+*/
+
+#include "Descriptors.h"
+
+const USB_Descriptor_Device_t PROGMEM DeviceDescriptor =
+{
+ Header: {Size: sizeof(USB_Descriptor_Device_t), Type: DTYPE_Device},
+
+ USBSpecification: VERSION_BCD(01.10),
+ Class: 0x00,
+ SubClass: 0x00,
+ Protocol: 0x00,
+
+ Endpoint0Size: 8,
+
+ VendorID: 0x03EB,
+ ProductID: 0x2040,
+ ReleaseNumber: VERSION_BCD(00.01),
+
+ ManufacturerStrIndex: 0x01,
+ ProductStrIndex: 0x02,
+ SerialNumStrIndex: 0x03,
+
+ NumberOfConfigurations: 1
+};
+
+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: (USB_CONFIG_ATTR_BUSPOWERED | USB_CONFIG_ATTR_SELFPOWERED),
+
+ MaxPowerConsumption: USB_CONFIG_POWER_MA(100)
+ },
+
+ .SSHOW_Interface =
+ {
+ Header: {Size: sizeof(USB_Descriptor_Interface_t), Type: DTYPE_Interface},
+
+ InterfaceNumber: 0,
+ AlternateSetting: 0,
+
+ TotalEndpoints: 2,
+
+ Class: 0xFF,
+ SubClass: 0x00,
+ Protocol: 0x00,
+
+ InterfaceStrIndex: NO_DESCRIPTOR
+ },
+
+ .SSHOW_DataInEndpoint =
+ {
+ Header: {Size: sizeof(USB_Descriptor_Endpoint_t), Type: DTYPE_Endpoint},
+
+ EndpointAddress: (ENDPOINT_DESCRIPTOR_DIR_IN | SIDESHOW_IN_EPNUM),
+ Attributes: EP_TYPE_BULK,
+ EndpointSize: SIDESHOW_IO_EPSIZE,
+ PollingIntervalMS: 0x00
+ },
+
+ .SSHOW_DataOutEndpoint =
+ {
+ Header: {Size: sizeof(USB_Descriptor_Endpoint_t), Type: DTYPE_Endpoint},
+
+ EndpointAddress: (ENDPOINT_DESCRIPTOR_DIR_OUT | SIDESHOW_OUT_EPNUM),
+ Attributes: EP_TYPE_BULK,
+ EndpointSize: SIDESHOW_IO_EPSIZE,
+ PollingIntervalMS: 0x00
+ }
+};
+
+const USB_Descriptor_String_t PROGMEM LanguageString =
+{
+ Header: {Size: USB_STRING_LEN(1), Type: DTYPE_String},
+
+ UnicodeString: {LANGUAGE_ID_ENG}
+};
+
+const USB_Descriptor_String_t PROGMEM ManufacturerString =
+{
+ Header: {Size: USB_STRING_LEN(11), Type: DTYPE_String},
+
+ UnicodeString: L"Dean Camera"
+};
+
+const USB_Descriptor_String_t PROGMEM ProductString =
+{
+ Header: {Size: USB_STRING_LEN(22), Type: DTYPE_String},
+
+ UnicodeString: L"LUFA Sideshow Demo"
+};
+
+const USB_Descriptor_String_t PROGMEM SerialNumberString =
+{
+ Header: {Size: USB_STRING_LEN(12), Type: DTYPE_String},
+
+ UnicodeString: L"000000000000"
+};
+
+const USB_OSDescriptor_t PROGMEM OSDescriptorString =
+{
+ Header: {Size: sizeof(USB_OSDescriptor_t), Type: DTYPE_String},
+
+ Signature: L"MSFT100",
+ VendorCode: REQ_GetOSFeatureDescriptor
+};
+
+const USB_OSCompatibleIDDescriptor_t PROGMEM DevCompatIDs =
+{
+ TotalLength: sizeof(USB_OSCompatibleIDDescriptor_t),
+ Version: 0x0100,
+ Index: EXTENDED_COMPAT_ID_DESCRIPTOR,
+ TotalSections: 1,
+
+ SideshowCompatID: {FirstInterfaceNumber: 0x00,
+ CompatibleID: "SIDESHW",
+ SubCompatibleID: "UNIV1"}
+};
+
+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:
+ switch (DescriptorNumber)
+ {
+ case 0x00:
+ Address = &LanguageString;
+ Size = pgm_read_byte(&LanguageString.Header.Size);
+ break;
+ case 0x01:
+ Address = &ManufacturerString;
+ Size = pgm_read_byte(&ManufacturerString.Header.Size);
+ break;
+ case 0x02:
+ Address = &ProductString;
+ Size = pgm_read_byte(&ProductString.Header.Size);
+ break;
+ case 0x03:
+ Address = &SerialNumberString;
+ Size = pgm_read_byte(&SerialNumberString.Header.Size);
+ break;
+ case 0xEE:
+ /* A Microsoft-proprietary extension. String address 0xEE is used by Windows for
+ "OS Descriptors", which in this case allows us to indicate that our device is
+ Sideshow compatible regardless of VID/PID values. */
+ Address = &OSDescriptorString;
+ Size = pgm_read_byte(&OSDescriptorString.Header.Size);
+ break;
+ }
+
+ break;
+ }
+
+ *DescriptorAddress = Address;
+ return Size;
+}
+
+uint16_t USB_GetOSFeatureDescriptor(const uint16_t wValue,
+ const uint8_t wIndex,
+ const void** const DescriptorAddress)
+{
+ const void* Address = NULL;
+ uint16_t Size = NO_DESCRIPTOR;
+
+ /* Check if a device level OS feature descriptor is being requested */
+ if (wValue == 0x0000)
+ {
+ /* Only the Extended Device Compatibility descriptor is supported */
+ if (wIndex == EXTENDED_COMPAT_ID_DESCRIPTOR)
+ {
+ Address = &DevCompatIDs;
+ Size = sizeof(USB_OSCompatibleIDDescriptor_t);
+ }
+ }
+
+ *DescriptorAddress = Address;
+ return Size;
+}
+