2016-09-06 21:59:12 +02:00
/*
2013-07-28 10:34:41 +02:00
* Copyright 2012 , 2013 Jun Wako < wakojun @ gmail . com >
2012-06-29 09:48:36 +02:00
* This file is based on :
* LUFA - 120219 / Demos / Device / Lowlevel / KeyboardMouse
* LUFA - 120219 / Demos / Device / Lowlevel / GenericHID
*/
2012-06-28 05:59:17 +02:00
/*
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 .
*/
/** \file
*
* Header file for Descriptors . c .
*/
# ifndef _DESCRIPTORS_H_
# define _DESCRIPTORS_H_
# include <LUFA/Drivers/USB/USB.h>
2018-02-08 21:07:46 +01:00
# ifdef PROTOCOL_CHIBIOS
# include "hal.h"
# endif
2012-06-28 05:59:17 +02:00
typedef struct
{
USB_Descriptor_Configuration_Header_t Config ;
// Keyboard HID Interface
2012-06-28 09:51:56 +02:00
USB_Descriptor_Interface_t Keyboard_Interface ;
USB_HID_Descriptor_HID_t Keyboard_HID ;
USB_Descriptor_Endpoint_t Keyboard_INEndpoint ;
2012-06-28 05:59:17 +02:00
2012-06-28 20:33:59 +02:00
# ifdef MOUSE_ENABLE
2012-07-13 19:47:29 +02:00
// Mouse HID Interface
2012-06-28 09:51:56 +02:00
USB_Descriptor_Interface_t Mouse_Interface ;
USB_HID_Descriptor_HID_t Mouse_HID ;
USB_Descriptor_Endpoint_t Mouse_INEndpoint ;
2012-06-28 20:33:59 +02:00
# endif
2012-06-28 09:51:56 +02:00
2012-07-13 19:47:29 +02:00
# ifdef EXTRAKEY_ENABLE
// Extrakey HID Interface
USB_Descriptor_Interface_t Extrakey_Interface ;
USB_HID_Descriptor_HID_t Extrakey_HID ;
USB_Descriptor_Endpoint_t Extrakey_INEndpoint ;
# endif
2016-11-28 08:31:16 +01:00
# ifdef RAW_ENABLE
// Raw HID Interface
USB_Descriptor_Interface_t Raw_Interface ;
USB_HID_Descriptor_HID_t Raw_HID ;
USB_Descriptor_Endpoint_t Raw_INEndpoint ;
USB_Descriptor_Endpoint_t Raw_OUTEndpoint ;
# endif
2012-07-13 19:47:29 +02:00
# ifdef CONSOLE_ENABLE
2012-06-28 09:51:56 +02:00
// Console HID Interface
USB_Descriptor_Interface_t Console_Interface ;
USB_HID_Descriptor_HID_t Console_HID ;
USB_Descriptor_Endpoint_t Console_INEndpoint ;
USB_Descriptor_Endpoint_t Console_OUTEndpoint ;
2012-06-28 20:33:59 +02:00
# endif
2013-07-28 10:34:41 +02:00
# ifdef NKRO_ENABLE
// NKRO HID Interface
USB_Descriptor_Interface_t NKRO_Interface ;
USB_HID_Descriptor_HID_t NKRO_HID ;
USB_Descriptor_Endpoint_t NKRO_INEndpoint ;
# endif
2015-08-20 06:42:08 +02:00
2015-08-21 16:46:53 +02:00
# ifdef MIDI_ENABLE
2018-02-08 21:07:46 +01:00
USB_Descriptor_Interface_Association_t Audio_Interface_Association ;
// MIDI Audio Control Interface
USB_Descriptor_Interface_t Audio_ControlInterface ;
USB_Audio_Descriptor_Interface_AC_t Audio_ControlInterface_SPC ;
// MIDI Audio Streaming Interface
USB_Descriptor_Interface_t Audio_StreamInterface ;
USB_MIDI_Descriptor_AudioInterface_AS_t Audio_StreamInterface_SPC ;
USB_MIDI_Descriptor_InputJack_t MIDI_In_Jack_Emb ;
USB_MIDI_Descriptor_InputJack_t MIDI_In_Jack_Ext ;
USB_MIDI_Descriptor_OutputJack_t MIDI_Out_Jack_Emb ;
USB_MIDI_Descriptor_OutputJack_t MIDI_Out_Jack_Ext ;
USB_Audio_Descriptor_StreamEndpoint_Std_t MIDI_In_Jack_Endpoint ;
USB_MIDI_Descriptor_Jack_Endpoint_t MIDI_In_Jack_Endpoint_SPC ;
USB_Audio_Descriptor_StreamEndpoint_Std_t MIDI_Out_Jack_Endpoint ;
USB_MIDI_Descriptor_Jack_Endpoint_t MIDI_Out_Jack_Endpoint_SPC ;
2015-08-21 16:46:53 +02:00
# endif
2015-08-20 06:42:08 +02:00
2016-08-01 07:02:52 +02:00
# ifdef VIRTSER_ENABLE
2018-02-08 21:07:46 +01:00
USB_Descriptor_Interface_Association_t CDC_Interface_Association ;
2016-08-01 07:02:52 +02:00
2018-04-11 02:04:54 +02:00
// 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 ;
2016-08-01 07:02:52 +02:00
# endif
2012-06-28 05:59:17 +02:00
} USB_Descriptor_Configuration_t ;
2012-06-28 13:15:56 +02:00
/* index of interface */
2012-06-28 05:59:17 +02:00
# define KEYBOARD_INTERFACE 0
2012-06-28 20:33:59 +02:00
2017-09-06 19:33:00 +02:00
// It is important that the Raw HID interface is at a constant
// interface number, to support Linux/OSX platforms and chrome.hid
// If Raw HID is enabled, let it be always 1.
# ifdef RAW_ENABLE
2018-04-11 02:04:54 +02:00
# define RAW_INTERFACE (KEYBOARD_INTERFACE + 1)
2017-09-06 19:33:00 +02:00
# else
2018-04-11 02:04:54 +02:00
# define RAW_INTERFACE KEYBOARD_INTERFACE
2017-09-06 19:33:00 +02:00
# endif
2012-06-28 20:33:59 +02:00
# ifdef MOUSE_ENABLE
2017-09-06 19:33:00 +02:00
# define MOUSE_INTERFACE (RAW_INTERFACE + 1)
2012-06-28 20:33:59 +02:00
# else
2017-09-06 19:33:00 +02:00
# define MOUSE_INTERFACE RAW_INTERFACE
2016-09-06 21:59:12 +02:00
# endif
2012-06-28 20:33:59 +02:00
# ifdef EXTRAKEY_ENABLE
2012-07-13 19:47:29 +02:00
# define EXTRAKEY_INTERFACE (MOUSE_INTERFACE + 1)
2012-06-28 20:33:59 +02:00
# else
2012-07-13 19:47:29 +02:00
# define EXTRAKEY_INTERFACE MOUSE_INTERFACE
2016-09-06 21:59:12 +02:00
# endif
2012-06-28 20:33:59 +02:00
2012-07-13 19:47:29 +02:00
# ifdef CONSOLE_ENABLE
2017-09-06 19:33:00 +02:00
# define CONSOLE_INTERFACE (EXTRAKEY_INTERFACE + 1)
2012-07-13 19:47:29 +02:00
# else
2017-09-06 19:33:00 +02:00
# define CONSOLE_INTERFACE EXTRAKEY_INTERFACE
2012-07-13 19:47:29 +02:00
# endif
2012-06-28 20:33:59 +02:00
2013-07-28 10:34:41 +02:00
# ifdef NKRO_ENABLE
# define NKRO_INTERFACE (CONSOLE_INTERFACE + 1)
# else
# define NKRO_INTERFACE CONSOLE_INTERFACE
# endif
2015-08-21 16:46:53 +02:00
# ifdef MIDI_ENABLE
2015-08-25 01:31:12 +02:00
# define AC_INTERFACE (NKRO_INTERFACE + 1)
# define AS_INTERFACE (NKRO_INTERFACE + 2)
2015-08-21 16:46:53 +02:00
# else
2015-08-25 01:31:12 +02:00
# define AS_INTERFACE NKRO_INTERFACE
2015-08-21 16:46:53 +02:00
# endif
2012-06-28 20:33:59 +02:00
2016-08-01 07:02:52 +02:00
# ifdef VIRTSER_ENABLE
# define CCI_INTERFACE (AS_INTERFACE + 1)
# define CDI_INTERFACE (AS_INTERFACE + 2)
# else
# define CDI_INTERFACE AS_INTERFACE
# endif
2012-06-28 20:33:59 +02:00
/* nubmer of interfaces */
2016-08-01 07:02:52 +02:00
# define TOTAL_INTERFACES (CDI_INTERFACE + 1)
2012-06-28 20:33:59 +02:00
2012-06-28 05:59:17 +02:00
2012-06-28 13:15:56 +02:00
// Endopoint number and size
2012-06-28 05:59:17 +02:00
# define KEYBOARD_IN_EPNUM 1
2012-07-13 19:47:29 +02:00
# ifdef MOUSE_ENABLE
2016-09-06 21:59:12 +02:00
# define MOUSE_IN_EPNUM (KEYBOARD_IN_EPNUM + 1)
2012-07-13 19:47:29 +02:00
# else
# define MOUSE_IN_EPNUM KEYBOARD_IN_EPNUM
# endif
# ifdef EXTRAKEY_ENABLE
# define EXTRAKEY_IN_EPNUM (MOUSE_IN_EPNUM + 1)
# else
2016-09-06 21:59:12 +02:00
# define EXTRAKEY_IN_EPNUM MOUSE_IN_EPNUM
2012-07-13 19:47:29 +02:00
# endif
2016-11-28 08:31:16 +01:00
# ifdef RAW_ENABLE
# define RAW_IN_EPNUM (EXTRAKEY_IN_EPNUM + 1)
# define RAW_OUT_EPNUM (EXTRAKEY_IN_EPNUM + 2)
# else
# define RAW_OUT_EPNUM EXTRAKEY_IN_EPNUM
# endif
2012-07-13 19:47:29 +02:00
# ifdef CONSOLE_ENABLE
2016-11-28 08:31:16 +01:00
# define CONSOLE_IN_EPNUM (RAW_OUT_EPNUM + 1)
2018-02-08 21:07:46 +01:00
# ifdef PROTOCOL_CHIBIOS
// ChibiOS has enough memory and descriptor to actually enable the endpoint
// It could use the same endpoint numbers, as that's supported by ChibiOS
// But the QMK code currently assumes that the endpoint numbers are different
# define CONSOLE_OUT_EPNUM (RAW_OUT_EPNUM + 2)
# else
2016-11-28 08:31:16 +01:00
# define CONSOLE_OUT_EPNUM (RAW_OUT_EPNUM + 1)
2018-02-08 21:07:46 +01:00
# endif
2013-07-28 10:34:41 +02:00
# else
2016-11-28 08:31:16 +01:00
# define CONSOLE_OUT_EPNUM RAW_OUT_EPNUM
2013-07-28 10:34:41 +02:00
# endif
# ifdef NKRO_ENABLE
# define NKRO_IN_EPNUM (CONSOLE_OUT_EPNUM + 1)
2015-08-25 01:31:12 +02:00
# else
# define NKRO_IN_EPNUM CONSOLE_OUT_EPNUM
2012-07-13 19:47:29 +02:00
# endif
2015-08-21 16:46:53 +02:00
# ifdef MIDI_ENABLE
2015-08-25 01:31:12 +02:00
# define MIDI_STREAM_IN_EPNUM (NKRO_IN_EPNUM + 1)
// # define MIDI_STREAM_OUT_EPNUM (NKRO_IN_EPNUM + 1)
# define MIDI_STREAM_OUT_EPNUM (NKRO_IN_EPNUM + 2)
# define MIDI_STREAM_IN_EPADDR (ENDPOINT_DIR_IN | MIDI_STREAM_IN_EPNUM)
# define MIDI_STREAM_OUT_EPADDR (ENDPOINT_DIR_OUT | MIDI_STREAM_OUT_EPNUM)
2016-08-01 07:02:52 +02:00
# else
# define MIDI_STREAM_OUT_EPNUM NKRO_IN_EPNUM
# endif
# ifdef VIRTSER_ENABLE
# define CDC_NOTIFICATION_EPNUM (MIDI_STREAM_OUT_EPNUM + 1)
2018-04-11 02:04:54 +02:00
# define CDC_IN_EPNUM (MIDI_STREAM_OUT_EPNUM + 2)
# define CDC_OUT_EPNUM (MIDI_STREAM_OUT_EPNUM + 3)
2016-08-01 07:02:52 +02:00
# define CDC_NOTIFICATION_EPADDR (ENDPOINT_DIR_IN | CDC_NOTIFICATION_EPNUM)
# define CDC_IN_EPADDR (ENDPOINT_DIR_IN | CDC_IN_EPNUM)
# define CDC_OUT_EPADDR (ENDPOINT_DIR_OUT | CDC_OUT_EPNUM)
# else
2018-04-11 02:04:54 +02:00
# define CDC_OUT_EPNUM MIDI_STREAM_OUT_EPNUM
2015-08-21 16:46:53 +02:00
# endif
2015-08-20 06:42:08 +02:00
2018-02-08 21:07:46 +01:00
# if (defined(PROTOCOL_LUFA) && CDC_OUT_EPNUM > (ENDPOINT_TOTAL_ENDPOINTS - 1)) || \
( defined ( PROTOCOL_CHIBIOS ) & & CDC_OUT_EPNUM > USB_MAX_ENDPOINTS )
# error "There are not enough available endpoints to support all functions. Remove some in the rules.mk file.(MOUSEKEY, EXTRAKEY, CONSOLE, NKRO, MIDI, SERIAL, STENO)"
2015-08-25 01:31:12 +02:00
# endif
2012-06-28 13:15:56 +02:00
# define KEYBOARD_EPSIZE 8
# define MOUSE_EPSIZE 8
2012-07-13 19:47:29 +02:00
# define EXTRAKEY_EPSIZE 8
2018-04-11 02:04:54 +02:00
# define RAW_EPSIZE 32
2012-07-08 16:57:25 +02:00
# define CONSOLE_EPSIZE 32
2016-09-06 21:59:12 +02:00
# define NKRO_EPSIZE 32
2015-08-20 06:42:08 +02:00
# define MIDI_STREAM_EPSIZE 64
2018-02-11 00:33:57 +01:00
# define CDC_NOTIFICATION_EPSIZE 8
2016-08-01 07:02:52 +02:00
# define CDC_EPSIZE 16
2012-06-28 05:59:17 +02:00
2018-02-08 21:07:46 +01:00
uint16_t get_usb_descriptor ( const uint16_t wValue ,
const uint16_t wIndex ,
const void * * const DescriptorAddress ) ;
2014-04-25 05:52:47 +02:00
/* new API */
# if LUFA_VERSION_INTEGER < 0x140302
2014-04-28 01:55:07 +02:00
# undef VERSION_BCD
2014-04-25 05:52:47 +02:00
# define VERSION_BCD(Major, Minor, Revision) \
CPU_TO_LE16 ( ( ( Major & 0xFF ) < < 8 ) | \
( ( Minor & 0x0F ) < < 4 ) | \
( Revision & 0x0F ) )
# endif
2012-06-28 05:59:17 +02:00
# endif