2012-06-27 09:31:33 +00:00
/*
* Copyright 2012 Jun Wako < wakojun @ gmail . com >
* This file is based on :
* LUFA - 120219 / Demos / Device / Lowlevel / KeyboardMouse
* LUFA - 120219 / Demos / Device / Lowlevel / GenericHID
*/
/*
LUFA Library
Copyright ( C ) Dean Camera , 2012.
dean [ at ] fourwalledcubicle [ dot ] com
www . lufa - lib . org
*/
/*
Copyright 2012 Dean Camera ( dean [ at ] fourwalledcubicle [ dot ] com )
Copyright 2010 Denver Gingerich ( denver [ at ] ossguy [ 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 .
*/
2012-06-28 03:59:17 +00:00
# include "util.h"
2012-06-28 11:15:56 +00:00
# include "report.h"
2012-06-28 03:59:17 +00:00
# include "descriptor.h"
2012-06-27 09:31:33 +00:00
/*******************************************************************************
* HID Report Descriptors
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
const USB_Descriptor_HIDReport_Datatype_t PROGMEM KeyboardReport [ ] =
{
HID_RI_USAGE_PAGE ( 8 , 0x01 ) , /* Generic Desktop */
HID_RI_USAGE ( 8 , 0x06 ) , /* Keyboard */
HID_RI_COLLECTION ( 8 , 0x01 ) , /* Application */
HID_RI_USAGE_PAGE ( 8 , 0x07 ) , /* Key Codes */
HID_RI_USAGE_MINIMUM ( 8 , 0xE0 ) , /* Keyboard Left Control */
HID_RI_USAGE_MAXIMUM ( 8 , 0xE7 ) , /* Keyboard Right GUI */
HID_RI_LOGICAL_MINIMUM ( 8 , 0x00 ) ,
HID_RI_LOGICAL_MAXIMUM ( 8 , 0x01 ) ,
HID_RI_REPORT_COUNT ( 8 , 0x08 ) ,
2012-06-28 18:33:59 +00:00
HID_RI_REPORT_SIZE ( 8 , 0x01 ) ,
2012-06-27 09:31:33 +00:00
HID_RI_INPUT ( 8 , HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE ) ,
HID_RI_REPORT_COUNT ( 8 , 0x01 ) ,
HID_RI_REPORT_SIZE ( 8 , 0x08 ) ,
HID_RI_INPUT ( 8 , HID_IOF_CONSTANT ) ,
HID_RI_USAGE_PAGE ( 8 , 0x08 ) , /* LEDs */
HID_RI_USAGE_MINIMUM ( 8 , 0x01 ) , /* Num Lock */
HID_RI_USAGE_MAXIMUM ( 8 , 0x05 ) , /* Kana */
HID_RI_REPORT_COUNT ( 8 , 0x05 ) ,
HID_RI_REPORT_SIZE ( 8 , 0x01 ) ,
HID_RI_OUTPUT ( 8 , HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE | HID_IOF_NON_VOLATILE ) ,
HID_RI_REPORT_COUNT ( 8 , 0x01 ) ,
HID_RI_REPORT_SIZE ( 8 , 0x03 ) ,
HID_RI_OUTPUT ( 8 , HID_IOF_CONSTANT ) ,
HID_RI_USAGE_PAGE ( 8 , 0x07 ) , /* Keyboard */
HID_RI_USAGE_MINIMUM ( 8 , 0x00 ) , /* Reserved (no event indicated) */
2012-06-28 18:33:59 +00:00
HID_RI_USAGE_MAXIMUM ( 8 , 0xFF ) , /* Keyboard Application */
HID_RI_LOGICAL_MINIMUM ( 8 , 0x00 ) ,
HID_RI_LOGICAL_MAXIMUM ( 8 , 0xFF ) ,
2012-06-27 09:31:33 +00:00
HID_RI_REPORT_COUNT ( 8 , 0x06 ) ,
HID_RI_REPORT_SIZE ( 8 , 0x08 ) ,
HID_RI_INPUT ( 8 , HID_IOF_DATA | HID_IOF_ARRAY | HID_IOF_ABSOLUTE ) ,
HID_RI_END_COLLECTION ( 0 ) ,
} ;
2012-07-13 17:47:29 +00:00
# ifdef MOUSE_ENABLE
2012-06-27 09:31:33 +00:00
const USB_Descriptor_HIDReport_Datatype_t PROGMEM MouseReport [ ] =
{
HID_RI_USAGE_PAGE ( 8 , 0x01 ) , /* Generic Desktop */
HID_RI_USAGE ( 8 , 0x02 ) , /* Mouse */
HID_RI_COLLECTION ( 8 , 0x01 ) , /* Application */
HID_RI_USAGE ( 8 , 0x01 ) , /* Pointer */
HID_RI_COLLECTION ( 8 , 0x00 ) , /* Physical */
2012-06-28 11:15:56 +00:00
2012-06-27 09:31:33 +00:00
HID_RI_USAGE_PAGE ( 8 , 0x09 ) , /* Button */
2012-06-28 11:15:56 +00:00
HID_RI_USAGE_MINIMUM ( 8 , 0x01 ) , /* Button 1 */
HID_RI_USAGE_MAXIMUM ( 8 , 0x05 ) , /* Button 5 */
2012-06-27 09:31:33 +00:00
HID_RI_LOGICAL_MINIMUM ( 8 , 0x00 ) ,
HID_RI_LOGICAL_MAXIMUM ( 8 , 0x01 ) ,
2012-06-28 11:15:56 +00:00
HID_RI_REPORT_COUNT ( 8 , 0x05 ) ,
2012-06-27 09:31:33 +00:00
HID_RI_REPORT_SIZE ( 8 , 0x01 ) ,
HID_RI_INPUT ( 8 , HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE ) ,
HID_RI_REPORT_COUNT ( 8 , 0x01 ) ,
2012-06-28 11:15:56 +00:00
HID_RI_REPORT_SIZE ( 8 , 0x03 ) ,
2012-06-27 09:31:33 +00:00
HID_RI_INPUT ( 8 , HID_IOF_CONSTANT ) ,
2012-06-28 11:15:56 +00:00
2012-06-27 09:31:33 +00:00
HID_RI_USAGE_PAGE ( 8 , 0x01 ) , /* Generic Desktop */
HID_RI_USAGE ( 8 , 0x30 ) , /* Usage X */
HID_RI_USAGE ( 8 , 0x31 ) , /* Usage Y */
2012-06-28 11:15:56 +00:00
HID_RI_LOGICAL_MINIMUM ( 8 , - 127 ) ,
HID_RI_LOGICAL_MAXIMUM ( 8 , 127 ) ,
2012-06-27 09:31:33 +00:00
HID_RI_REPORT_COUNT ( 8 , 0x02 ) ,
HID_RI_REPORT_SIZE ( 8 , 0x08 ) ,
HID_RI_INPUT ( 8 , HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_RELATIVE ) ,
2012-06-28 11:15:56 +00:00
HID_RI_USAGE ( 8 , 0x38 ) , /* Wheel */
HID_RI_LOGICAL_MINIMUM ( 8 , - 127 ) ,
HID_RI_LOGICAL_MAXIMUM ( 8 , 127 ) ,
HID_RI_REPORT_COUNT ( 8 , 0x01 ) ,
HID_RI_REPORT_SIZE ( 8 , 0x08 ) ,
HID_RI_INPUT ( 8 , HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_RELATIVE ) ,
HID_RI_USAGE_PAGE ( 8 , 0x0C ) , /* Consumer */
HID_RI_USAGE ( 16 , 0x0238 ) , /* AC Pan (Horizontal wheel) */
HID_RI_LOGICAL_MINIMUM ( 8 , - 127 ) ,
HID_RI_LOGICAL_MAXIMUM ( 8 , 127 ) ,
HID_RI_REPORT_COUNT ( 8 , 0x01 ) ,
HID_RI_REPORT_SIZE ( 8 , 0x08 ) ,
HID_RI_INPUT ( 8 , HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_RELATIVE ) ,
2012-06-27 09:31:33 +00:00
HID_RI_END_COLLECTION ( 0 ) ,
HID_RI_END_COLLECTION ( 0 ) ,
} ;
2012-07-13 17:47:29 +00:00
# endif
2012-06-27 09:31:33 +00:00
2012-06-28 18:33:59 +00:00
# ifdef EXTRAKEY_ENABLE
2012-07-13 17:47:29 +00:00
const USB_Descriptor_HIDReport_Datatype_t PROGMEM ExtrakeyReport [ ] =
2012-06-28 11:15:56 +00:00
{
HID_RI_USAGE_PAGE ( 8 , 0x01 ) , /* Generic Desktop */
HID_RI_USAGE ( 8 , 0x80 ) , /* System Control */
HID_RI_COLLECTION ( 8 , 0x01 ) , /* Application */
HID_RI_REPORT_ID ( 8 , REPORT_ID_SYSTEM ) ,
2012-07-02 02:53:11 +00:00
HID_RI_LOGICAL_MINIMUM ( 16 , 0x0001 ) ,
2012-06-28 11:15:56 +00:00
HID_RI_LOGICAL_MAXIMUM ( 16 , 0x00B7 ) ,
2012-07-02 02:53:11 +00:00
HID_RI_USAGE_MINIMUM ( 16 , 0x0001 ) , /* System Power Down */
2012-06-28 11:15:56 +00:00
HID_RI_USAGE_MAXIMUM ( 16 , 0x00B7 ) , /* System Display LCD Autoscale */
HID_RI_REPORT_SIZE ( 8 , 16 ) ,
HID_RI_REPORT_COUNT ( 8 , 1 ) ,
HID_RI_INPUT ( 8 , HID_IOF_DATA | HID_IOF_ARRAY | HID_IOF_ABSOLUTE ) ,
HID_RI_END_COLLECTION ( 0 ) ,
HID_RI_USAGE_PAGE ( 8 , 0x0C ) , /* Consumer */
HID_RI_USAGE ( 8 , 0x01 ) , /* Consumer Control */
HID_RI_COLLECTION ( 8 , 0x01 ) , /* Application */
HID_RI_REPORT_ID ( 8 , REPORT_ID_CONSUMER ) ,
2012-07-02 02:53:11 +00:00
HID_RI_LOGICAL_MINIMUM ( 16 , 0x0001 ) ,
2012-06-28 11:15:56 +00:00
HID_RI_LOGICAL_MAXIMUM ( 16 , 0x029C ) ,
2012-07-02 02:53:11 +00:00
HID_RI_USAGE_MINIMUM ( 16 , 0x0001 ) , /* +10 */
2012-06-28 11:15:56 +00:00
HID_RI_USAGE_MAXIMUM ( 16 , 0x029C ) , /* AC Distribute Vertically */
HID_RI_REPORT_SIZE ( 8 , 16 ) ,
HID_RI_REPORT_COUNT ( 8 , 1 ) ,
HID_RI_INPUT ( 8 , HID_IOF_DATA | HID_IOF_ARRAY | HID_IOF_ABSOLUTE ) ,
HID_RI_END_COLLECTION ( 0 ) ,
} ;
2012-06-28 18:33:59 +00:00
# endif
2012-07-13 17:47:29 +00:00
# ifdef CONSOLE_ENABLE
const USB_Descriptor_HIDReport_Datatype_t PROGMEM ConsoleReport [ ] =
{
HID_RI_USAGE_PAGE ( 16 , 0xFF31 ) , /* Vendor Page(PJRC Teensy compatible) */
HID_RI_USAGE ( 8 , 0x74 ) , /* Vendor Usage(PJRC Teensy compatible) */
HID_RI_COLLECTION ( 8 , 0x01 ) , /* Application */
HID_RI_USAGE ( 8 , 0x75 ) , /* Vendor Usage 0x75 */
HID_RI_LOGICAL_MINIMUM ( 8 , 0x00 ) ,
HID_RI_LOGICAL_MAXIMUM ( 8 , 0xFF ) ,
HID_RI_REPORT_COUNT ( 8 , CONSOLE_EPSIZE ) ,
HID_RI_REPORT_SIZE ( 8 , 0x08 ) ,
HID_RI_INPUT ( 8 , HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE ) ,
HID_RI_USAGE ( 8 , 0x76 ) , /* Vendor Usage 0x76 */
HID_RI_LOGICAL_MINIMUM ( 8 , 0x00 ) ,
HID_RI_LOGICAL_MAXIMUM ( 8 , 0xFF ) ,
HID_RI_REPORT_COUNT ( 8 , CONSOLE_EPSIZE ) ,
HID_RI_REPORT_SIZE ( 8 , 0x08 ) ,
HID_RI_OUTPUT ( 8 , HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE | HID_IOF_NON_VOLATILE ) ,
HID_RI_END_COLLECTION ( 0 ) ,
} ;
# endif
2012-06-28 18:33:59 +00:00
# ifdef NKRO_ENABLE
const USB_Descriptor_HIDReport_Datatype_t PROGMEM NKROReport [ ] =
{
HID_RI_USAGE_PAGE ( 8 , 0x01 ) , /* Generic Desktop */
HID_RI_USAGE ( 8 , 0x06 ) , /* Keyboard */
HID_RI_COLLECTION ( 8 , 0x01 ) , /* Application */
HID_RI_USAGE_PAGE ( 8 , 0x07 ) , /* Key Codes */
HID_RI_USAGE_MINIMUM ( 8 , 0xE0 ) , /* Keyboard Left Control */
HID_RI_USAGE_MAXIMUM ( 8 , 0xE7 ) , /* Keyboard Right GUI */
HID_RI_LOGICAL_MINIMUM ( 8 , 0x00 ) ,
HID_RI_LOGICAL_MAXIMUM ( 8 , 0x01 ) ,
HID_RI_REPORT_COUNT ( 8 , 0x08 ) ,
HID_RI_REPORT_SIZE ( 8 , 0x01 ) ,
HID_RI_INPUT ( 8 , HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE ) ,
HID_RI_USAGE_PAGE ( 8 , 0x08 ) , /* LEDs */
HID_RI_USAGE_MINIMUM ( 8 , 0x01 ) , /* Num Lock */
HID_RI_USAGE_MAXIMUM ( 8 , 0x05 ) , /* Kana */
HID_RI_REPORT_COUNT ( 8 , 0x05 ) ,
HID_RI_REPORT_SIZE ( 8 , 0x01 ) ,
HID_RI_OUTPUT ( 8 , HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE | HID_IOF_NON_VOLATILE ) ,
HID_RI_REPORT_COUNT ( 8 , 0x01 ) ,
HID_RI_REPORT_SIZE ( 8 , 0x03 ) ,
HID_RI_OUTPUT ( 8 , HID_IOF_CONSTANT ) ,
HID_RI_USAGE_PAGE ( 8 , 0x07 ) , /* Key Codes */
HID_RI_USAGE_MINIMUM ( 8 , 0x00 ) , /* Keyboard 0 */
HID_RI_USAGE_MAXIMUM ( 8 , NKRO_SIZE * 8 - 1 ) , /* Keyboard Right GUI */
HID_RI_LOGICAL_MINIMUM ( 8 , 0x00 ) ,
HID_RI_LOGICAL_MAXIMUM ( 8 , 0x01 ) ,
HID_RI_REPORT_COUNT ( 8 , NKRO_SIZE * 8 ) ,
HID_RI_REPORT_SIZE ( 8 , 0x01 ) ,
} ;
# endif
2012-06-27 09:31:33 +00:00
/*******************************************************************************
* Device Descriptors
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
const USB_Descriptor_Device_t PROGMEM DeviceDescriptor =
{
. Header = { . Size = sizeof ( USB_Descriptor_Device_t ) , . Type = DTYPE_Device } ,
. USBSpecification = VERSION_BCD ( 01.10 ) ,
. Class = USB_CSCP_NoDeviceClass ,
. SubClass = USB_CSCP_NoDeviceSubclass ,
. Protocol = USB_CSCP_NoDeviceProtocol ,
. Endpoint0Size = FIXED_CONTROL_ENDPOINT_SIZE ,
2012-06-28 03:59:17 +00:00
. VendorID = VENDOR_ID ,
. ProductID = PRODUCT_ID ,
. ReleaseNumber = DEVICE_VER ,
2012-06-27 09:31:33 +00:00
. ManufacturerStrIndex = 0x01 ,
. ProductStrIndex = 0x02 ,
. SerialNumStrIndex = NO_DESCRIPTOR ,
. NumberOfConfigurations = FIXED_NUM_CONFIGURATIONS
} ;
/*******************************************************************************
* Configuration Descriptors
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
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 ) ,
2012-06-28 11:15:56 +00:00
. TotalInterfaces = TOTAL_INTERFACES ,
2012-06-27 09:31:33 +00:00
. ConfigurationNumber = 1 ,
. ConfigurationStrIndex = NO_DESCRIPTOR ,
2012-06-28 03:59:17 +00:00
. ConfigAttributes = ( USB_CONFIG_ATTR_RESERVED | USB_CONFIG_ATTR_REMOTEWAKEUP ) ,
2012-06-27 09:31:33 +00:00
. MaxPowerConsumption = USB_CONFIG_POWER_MA ( 100 )
} ,
2012-06-28 11:15:56 +00:00
/*
* Keyboard
*/
2012-06-28 07:51:56 +00:00
. Keyboard_Interface =
2012-06-27 09:31:33 +00:00
{
. Header = { . Size = sizeof ( USB_Descriptor_Interface_t ) , . Type = DTYPE_Interface } ,
2012-06-28 03:59:17 +00:00
. InterfaceNumber = KEYBOARD_INTERFACE ,
2012-06-27 09:31:33 +00:00
. AlternateSetting = 0x00 ,
2012-06-28 03:59:17 +00:00
. TotalEndpoints = 1 ,
2012-06-27 09:31:33 +00:00
. Class = HID_CSCP_HIDClass ,
. SubClass = HID_CSCP_BootSubclass ,
. Protocol = HID_CSCP_KeyboardBootProtocol ,
. InterfaceStrIndex = NO_DESCRIPTOR
} ,
2012-06-28 07:51:56 +00:00
. Keyboard_HID =
2012-06-27 09:31:33 +00:00
{
. Header = { . Size = sizeof ( USB_HID_Descriptor_HID_t ) , . Type = HID_DTYPE_HID } ,
. HIDSpec = VERSION_BCD ( 01.11 ) ,
. CountryCode = 0x00 ,
. TotalReportDescriptors = 1 ,
. HIDReportType = HID_DTYPE_Report ,
. HIDReportLength = sizeof ( KeyboardReport )
} ,
2012-06-28 07:51:56 +00:00
. Keyboard_INEndpoint =
2012-06-27 09:31:33 +00:00
{
. Header = { . Size = sizeof ( USB_Descriptor_Endpoint_t ) , . Type = DTYPE_Endpoint } ,
. EndpointAddress = ( ENDPOINT_DIR_IN | KEYBOARD_IN_EPNUM ) ,
. Attributes = ( EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA ) ,
2012-06-28 11:15:56 +00:00
. EndpointSize = KEYBOARD_EPSIZE ,
2012-06-27 09:31:33 +00:00
. PollingIntervalMS = 0x01
} ,
/*
* Mouse
*/
2012-06-28 18:33:59 +00:00
# ifdef MOUSE_ENABLE
2012-06-28 07:51:56 +00:00
. Mouse_Interface =
2012-06-27 09:31:33 +00:00
{
. Header = { . Size = sizeof ( USB_Descriptor_Interface_t ) , . Type = DTYPE_Interface } ,
2012-06-28 03:59:17 +00:00
. InterfaceNumber = MOUSE_INTERFACE ,
2012-06-27 09:31:33 +00:00
. AlternateSetting = 0x00 ,
. TotalEndpoints = 1 ,
. Class = HID_CSCP_HIDClass ,
. SubClass = HID_CSCP_BootSubclass ,
. Protocol = HID_CSCP_MouseBootProtocol ,
. InterfaceStrIndex = NO_DESCRIPTOR
} ,
2012-06-28 07:51:56 +00:00
. Mouse_HID =
2012-06-27 09:31:33 +00:00
{
. Header = { . Size = sizeof ( USB_HID_Descriptor_HID_t ) , . Type = HID_DTYPE_HID } ,
. HIDSpec = VERSION_BCD ( 01.11 ) ,
. CountryCode = 0x00 ,
. TotalReportDescriptors = 1 ,
. HIDReportType = HID_DTYPE_Report ,
. HIDReportLength = sizeof ( MouseReport )
} ,
2012-06-28 07:51:56 +00:00
. Mouse_INEndpoint =
2012-06-27 09:31:33 +00:00
{
. Header = { . Size = sizeof ( USB_Descriptor_Endpoint_t ) , . Type = DTYPE_Endpoint } ,
. EndpointAddress = ( ENDPOINT_DIR_IN | MOUSE_IN_EPNUM ) ,
. Attributes = ( EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA ) ,
2012-06-28 11:15:56 +00:00
. EndpointSize = MOUSE_EPSIZE ,
2012-06-27 09:31:33 +00:00
. PollingIntervalMS = 0x01
} ,
2012-06-28 18:33:59 +00:00
# endif
2012-06-27 09:31:33 +00:00
/*
2012-07-13 17:47:29 +00:00
* Extra
2012-06-27 09:31:33 +00:00
*/
2012-07-13 17:47:29 +00:00
# ifdef EXTRAKEY_ENABLE
. Extrakey_Interface =
2012-06-27 09:31:33 +00:00
{
. Header = { . Size = sizeof ( USB_Descriptor_Interface_t ) , . Type = DTYPE_Interface } ,
2012-07-13 17:47:29 +00:00
. InterfaceNumber = EXTRAKEY_INTERFACE ,
2012-06-27 09:31:33 +00:00
. AlternateSetting = 0x00 ,
2012-07-13 17:47:29 +00:00
. TotalEndpoints = 1 ,
2012-06-27 09:31:33 +00:00
. Class = HID_CSCP_HIDClass ,
. SubClass = HID_CSCP_NonBootSubclass ,
. Protocol = HID_CSCP_NonBootProtocol ,
. InterfaceStrIndex = NO_DESCRIPTOR
} ,
2012-07-13 17:47:29 +00:00
. Extrakey_HID =
2012-06-27 09:31:33 +00:00
{
. Header = { . Size = sizeof ( USB_HID_Descriptor_HID_t ) , . Type = HID_DTYPE_HID } ,
. HIDSpec = VERSION_BCD ( 01.11 ) ,
. CountryCode = 0x00 ,
. TotalReportDescriptors = 1 ,
. HIDReportType = HID_DTYPE_Report ,
2012-07-13 17:47:29 +00:00
. HIDReportLength = sizeof ( ExtrakeyReport )
2012-06-27 09:31:33 +00:00
} ,
2012-07-13 17:47:29 +00:00
. Extrakey_INEndpoint =
2012-06-27 09:31:33 +00:00
{
. Header = { . Size = sizeof ( USB_Descriptor_Endpoint_t ) , . Type = DTYPE_Endpoint } ,
2012-07-13 17:47:29 +00:00
. EndpointAddress = ( ENDPOINT_DIR_IN | EXTRAKEY_IN_EPNUM ) ,
2012-06-27 09:31:33 +00:00
. Attributes = ( EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA ) ,
2012-07-13 17:47:29 +00:00
. EndpointSize = EXTRAKEY_EPSIZE ,
2012-06-28 11:15:56 +00:00
. PollingIntervalMS = 0x01
} ,
2012-07-13 17:47:29 +00:00
# endif
2012-06-28 11:15:56 +00:00
/*
2012-07-13 17:47:29 +00:00
* Console
2012-06-28 11:15:56 +00:00
*/
2012-07-13 17:47:29 +00:00
# ifdef CONSOLE_ENABLE
. Console_Interface =
2012-06-28 11:15:56 +00:00
{
. Header = { . Size = sizeof ( USB_Descriptor_Interface_t ) , . Type = DTYPE_Interface } ,
2012-07-13 17:47:29 +00:00
. InterfaceNumber = CONSOLE_INTERFACE ,
2012-06-28 11:15:56 +00:00
. AlternateSetting = 0x00 ,
2012-07-13 17:47:29 +00:00
. TotalEndpoints = 2 ,
2012-06-28 11:15:56 +00:00
. Class = HID_CSCP_HIDClass ,
. SubClass = HID_CSCP_NonBootSubclass ,
. Protocol = HID_CSCP_NonBootProtocol ,
. InterfaceStrIndex = NO_DESCRIPTOR
} ,
2012-07-13 17:47:29 +00:00
. Console_HID =
2012-06-28 11:15:56 +00:00
{
. Header = { . Size = sizeof ( USB_HID_Descriptor_HID_t ) , . Type = HID_DTYPE_HID } ,
. HIDSpec = VERSION_BCD ( 01.11 ) ,
. CountryCode = 0x00 ,
. TotalReportDescriptors = 1 ,
. HIDReportType = HID_DTYPE_Report ,
2012-07-13 17:47:29 +00:00
. HIDReportLength = sizeof ( ConsoleReport )
2012-06-28 11:15:56 +00:00
} ,
2012-07-13 17:47:29 +00:00
. Console_INEndpoint =
2012-06-28 11:15:56 +00:00
{
. Header = { . Size = sizeof ( USB_Descriptor_Endpoint_t ) , . Type = DTYPE_Endpoint } ,
2012-07-13 17:47:29 +00:00
. EndpointAddress = ( ENDPOINT_DIR_IN | CONSOLE_IN_EPNUM ) ,
2012-06-27 09:31:33 +00:00
. Attributes = ( EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA ) ,
2012-07-13 17:47:29 +00:00
. EndpointSize = CONSOLE_EPSIZE ,
. PollingIntervalMS = 0x01
} ,
. Console_OUTEndpoint =
{
. Header = { . Size = sizeof ( USB_Descriptor_Endpoint_t ) , . Type = DTYPE_Endpoint } ,
. EndpointAddress = ( ENDPOINT_DIR_OUT | CONSOLE_OUT_EPNUM ) ,
. Attributes = ( EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA ) ,
. EndpointSize = CONSOLE_EPSIZE ,
2012-06-27 09:31:33 +00:00
. PollingIntervalMS = 0x01
2012-06-28 11:15:56 +00:00
} ,
2012-06-28 18:33:59 +00:00
# endif
2012-06-27 09:31:33 +00:00
} ;
/*******************************************************************************
* String Descriptors
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
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 } ,
2012-06-28 03:59:17 +00:00
. UnicodeString = LSTR ( MANUFACTURER )
2012-06-27 09:31:33 +00:00
} ;
const USB_Descriptor_String_t PROGMEM ProductString =
{
. Header = { . Size = USB_STRING_LEN ( 28 ) , . Type = DTYPE_String } ,
2012-06-28 03:59:17 +00:00
. UnicodeString = LSTR ( PRODUCT )
2012-06-27 09:31:33 +00:00
} ;
/** 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 uint8_t wIndex ,
const void * * const DescriptorAddress )
{
const uint8_t DescriptorType = ( wValue > > 8 ) ;
const uint8_t DescriptorIndex = ( 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 ( DescriptorIndex )
{
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 ;
}
break ;
case HID_DTYPE_HID :
switch ( wIndex ) {
2012-06-28 03:59:17 +00:00
case KEYBOARD_INTERFACE :
2012-06-28 07:51:56 +00:00
Address = & ConfigurationDescriptor . Keyboard_HID ;
2012-06-27 09:31:33 +00:00
Size = sizeof ( USB_HID_Descriptor_HID_t ) ;
break ;
2012-06-28 18:33:59 +00:00
# ifdef MOUSE_ENABLE
2012-06-28 03:59:17 +00:00
case MOUSE_INTERFACE :
2012-06-28 07:51:56 +00:00
Address = & ConfigurationDescriptor . Mouse_HID ;
2012-06-27 09:31:33 +00:00
Size = sizeof ( USB_HID_Descriptor_HID_t ) ;
break ;
2012-06-28 18:33:59 +00:00
# endif
2012-07-13 17:47:29 +00:00
# ifdef EXTRAKEY_ENABLE
case EXTRAKEY_INTERFACE :
Address = & ConfigurationDescriptor . Extrakey_HID ;
2012-06-27 09:31:33 +00:00
Size = sizeof ( USB_HID_Descriptor_HID_t ) ;
break ;
2012-07-13 17:47:29 +00:00
# endif
# ifdef CONSOLE_ENABLE
case CONSOLE_INTERFACE :
Address = & ConfigurationDescriptor . Console_HID ;
2012-06-28 11:15:56 +00:00
Size = sizeof ( USB_HID_Descriptor_HID_t ) ;
break ;
2012-06-28 18:33:59 +00:00
# endif
2012-06-27 09:31:33 +00:00
}
break ;
case HID_DTYPE_Report :
switch ( wIndex ) {
2012-06-28 03:59:17 +00:00
case KEYBOARD_INTERFACE :
2012-06-27 09:31:33 +00:00
Address = & KeyboardReport ;
Size = sizeof ( KeyboardReport ) ;
break ;
2012-06-28 18:33:59 +00:00
# ifdef MOUSE_ENABLE
2012-06-28 03:59:17 +00:00
case MOUSE_INTERFACE :
2012-06-27 09:31:33 +00:00
Address = & MouseReport ;
Size = sizeof ( MouseReport ) ;
break ;
2012-06-28 18:33:59 +00:00
# endif
2012-07-13 17:47:29 +00:00
# ifdef EXTRAKEY_ENABLE
case EXTRAKEY_INTERFACE :
Address = & ExtrakeyReport ;
Size = sizeof ( ExtrakeyReport ) ;
break ;
# endif
# ifdef CONSOLE_ENABLE
2012-06-28 11:15:56 +00:00
case CONSOLE_INTERFACE :
2012-06-28 07:51:56 +00:00
Address = & ConsoleReport ;
Size = sizeof ( ConsoleReport ) ;
2012-06-27 09:31:33 +00:00
break ;
2012-06-28 18:33:59 +00:00
# endif
2012-06-27 09:31:33 +00:00
}
break ;
}
* DescriptorAddress = Address ;
return Size ;
}