blob: fb0e23bf5514776004112eea512831c65f542014 [file] [log] [blame]
/* This header file is part of the AVR Software Framework 2.0.0 release */
/*This file is prepared for Doxygen automatic documentation generation.*/
/*! \file *********************************************************************
*
* \brief Management of the generic HID features.
*
* This file manages the generic HID features.
*
* - Compiler: IAR EWAVR32 and GNU GCC for AVR32
* - Supported devices: All AVR32 devices with a USB module can be used.
* - AppNote:
*
* \author Atmel Corporation: http://www.atmel.com \n
* Support and FAQ: http://support.atmel.no/
*
******************************************************************************/
/* Copyright (c) 2009 Atmel Corporation. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* 3. The name of Atmel may not be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* 4. This software may only be redistributed and used in connection with an Atmel
* AVR product.
*
* THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
* EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
*
*/
#ifndef _HID_H_
#define _HID_H_
//_____ I N C L U D E S ________________________________________________________
//_____ M A C R O S ____________________________________________________________
/*! \name HID Descriptor Types
*/
//! @{
#define HID_DESCRIPTOR 0x21
#define HID_REPORT_DESCRIPTOR 0x22
#define HID_PHYSICAL_DESCRIPTOR 0x23
//! @}
/*! \name Constants of field DESCRIPTOR_HID
*/
//! @{
#define HID_BDC 0x0111 //!< Numeric expression identifying the HID Class Specification release (here V1.11)
#define HID_CLASS_DESC_NB_DEFAULT 0x01 //!< Numeric expression specifying the number of class descriptors (always at least one i.e. Report descriptor.)
//! @}
/*! \name HID Country Codes
*/
//! @{
#define HID_COUNTRY_CODE_NOT_SUPPORTED 0
#define HID_COUNTRY_CODE_ARABIC 1
#define HID_COUNTRY_CODE_BELGIAN 2
#define HID_COUNTRY_CODE_CANADIAN_BILINGUAL 3
#define HID_COUNTRY_CODE_CANADIAN_FRENCH 4
#define HID_COUNTRY_CODE_CZECH_REPUBLIC 5
#define HID_COUNTRY_CODE_DANISH 6
#define HID_COUNTRY_CODE_FINNISH 7
#define HID_COUNTRY_CODE_FRENCH 8
#define HID_COUNTRY_CODE_GERMAN 9
#define HID_COUNTRY_CODE_GREEK 10
#define HID_COUNTRY_CODE_HEBREW 11
#define HID_COUNTRY_CODE_HUNGARY 12
#define HID_COUNTRY_CODE_INTERNATIONAL_ISO 13
#define HID_COUNTRY_CODE_ITALIAN 14
#define HID_COUNTRY_CODE_JAPAN_KATAKANA 15
#define HID_COUNTRY_CODE_KOREAN 16
#define HID_COUNTRY_CODE_LATIN_AMERICAN 17
#define HID_COUNTRY_CODE_NETHERLANDS_DUTCH 18
#define HID_COUNTRY_CODE_NORWEGIAN 19
#define HID_COUNTRY_CODE_PERSIAN_FARSI 20
#define HID_COUNTRY_CODE_POLAND 21
#define HID_COUNTRY_CODE_PORTUGUESE 22
#define HID_COUNTRY_CODE_RUSSIA 23
#define HID_COUNTRY_CODE_SLOVAKIA 24
#define HID_COUNTRY_CODE_SPANISH 25
#define HID_COUNTRY_CODE_SWEDISH 26
#define HID_COUNTRY_CODE_SWISS_FRENCH 27
#define HID_COUNTRY_CODE_SWISS_GERMAN 28
#define HID_COUNTRY_CODE_SWITZERLAND 29
#define HID_COUNTRY_CODE_TAIWAN 30
#define HID_COUNTRY_CODE_TURKISH_Q 31
#define HID_COUNTRY_CODE_UK 32
#define HID_COUNTRY_CODE_US 33
#define HID_COUNTRY_CODE_YUGOSLAVIA 34
#define HID_COUNTRY_CODE_TURKISH_F 35
//! @}
//! \name HID KEYS values
//! @{
#define HID_A 4
#define HID_B 5
#define HID_C 6
#define HID_D 7
#define HID_E 8
#define HID_F 9
#define HID_G 10
#define HID_H 11
#define HID_I 12
#define HID_J 13
#define HID_K 14
#define HID_L 15
#define HID_M 16
#define HID_N 17
#define HID_O 18
#define HID_P 19
#define HID_Q 20
#define HID_R 21
#define HID_S 22
#define HID_T 23
#define HID_U 24
#define HID_V 25
#define HID_W 26
#define HID_X 27
#define HID_Y 28
#define HID_Z 29
#define HID_1 30
#define HID_2 31
#define HID_3 32
#define HID_4 33
#define HID_5 34
#define HID_6 35
#define HID_7 36
#define HID_8 37
#define HID_9 38
#define HID_0 39
#define HID_ENTER 40
#define HID_ESCAPE 41
#define HID_BACKSPACE 42
#define HID_TAB 43
#define HID_SPACEBAR 44
#define HID_UNDERSCORE 45
#define HID_PLUS 46
/*
#define HID_[ { 47
#define HID_] } 48
*/
#define HID_BACKSLASH 49
/*
#define HID_# ~ 50
#define HID_; : 51
#define HID_‘ " 52
*/
#define HID_TILDE 53
#define HID_COMMA 54
#define HID_DOT 55
#define HID_SLASH 56
#define HID_CAPS LOCK 57
#define HID_F1 58
#define HID_F2 59
#define HID_F3 60
#define HID_F4 61
#define HID_F5 62
#define HID_F6 63
#define HID_F7 64
#define HID_F8 65
#define HID_F9 66
#define HID_F10 67
#define HID_F11 68
#define HID_F12 69
#define HID_PRINTSCREEN 70
#define HID_SCROLL LOCK 71
#define HID_PAUSE 72
#define HID_INSERT 73
#define HID_HOME 74
#define HID_PAGEUP 75
#define HID_DELETE 76
#define HID_END 77
#define HID_PAGEDOWN 78
#define HID_RIGHT 79
#define HID_LEFT 80
#define HID_DOWN 81
#define HID_UP 82
#define HID_KEYPAD_NUM_LOCK 83
#define HID_KEYPAD_DIVIDE 84
#define HID_KEYPAD_AT 85
#define HID_KEYPAD_MULTIPLY 85
#define HID_KEYPAD_MINUS 86
#define HID_KEYPAD_PLUS 87
#define HID_KEYPAD_ENTER 88
#define HID_KEYPAD_1 89
#define HID_KEYPAD_2 90
#define HID_KEYPAD_3 91
#define HID_KEYPAD_4 92
#define HID_KEYPAD_5 93
#define HID_KEYPAD_6 94
#define HID_KEYPAD_7 95
#define HID_KEYPAD_8 96
#define HID_KEYPAD_9 97
#define HID_KEYPAD_0 98
//! \name HID modifier values
//! @{
#define HID_MODIFIER_NONE 0x00
#define HID_MODIFIER_LEFT_CTRL 0x01
#define HID_MODIFIER_LEFT_SHIFT 0x02
#define HID_MODIFIER_LEFT_ALT 0x04
#define HID_MODIFIER_LEFT_GUI 0x08
#define HID_MODIFIER_RIGHT_CTRL 0x10
#define HID_MODIFIER_RIGHT_SHIFT 0x20
#define HID_MODIFIER_RIGHT_ALT 0x40
#define HID_MODIFIER_RIGHT_GUI 0x80
//! @}
//! @}
/*! \name HID Requests
*/
//! @{
#define HID_GET_REPORT 0x01
#define HID_GET_IDLE 0x02
#define HID_GET_PROTOCOL 0x03
#define HID_SET_REPORT 0x09
#define HID_SET_IDLE 0x0A
#define HID_SET_PROTOCOL 0x0B
//! @}
/*! \name HID Report Types
*/
//! @{
#define HID_REPORT_INPUT 0x01
#define HID_REPORT_OUTPUT 0x02
#define HID_REPORT_FEATURE 0x03
//! @}
/*! \name Special HID Report IDs
*/
//! @{
#define HID_REPORT_ID_ALL 0x00
//! @}
/*! \name Special HID Idle Durations
*/
//! @{
#define HID_IDLE_DURATION_INDEFINITE 0x00
//! @}
/*! \name HID Protocols
*/
//! @{
#define HID_BOOT_PROTOCOL 0x00
#define HID_REPORT_PROTOCOL 0x01
//! @}
/*! \name HID Report Descriptor Item Types
*/
//! @{
#define HID_ITEM_TYPE_MAIN 0x00
#define HID_ITEM_TYPE_GLOBAL 0x01
#define HID_ITEM_TYPE_LOCAL 0x02
#define HID_ITEM_TYPE_RESERVED 0x03
//! @}
/*! \name Special HID Report Descriptor Item Tags
*/
//! @{
#define HID_ITEM_TAG_LONG_ITEM 0x0F
//! @}
/*! \name HID Report Descriptor Main Item Tags
*/
//! @{
#define HID_MAIN_ITEM_TAG_INPUT 0x08
#define HID_MAIN_ITEM_TAG_OUTPUT 0x09
#define HID_MAIN_ITEM_TAG_FEATURE 0x0B
#define HID_MAIN_ITEM_TAG_COLLECTION 0x0A
#define HID_MAIN_ITEM_TAG_END_COLLECTION 0x0C
//! @}
/*! \name HID Report Descriptor Global Item Tags
*/
//! @{
#define HID_GLOBAL_ITEM_TAG_USAGE_PAGE 0x00
#define HID_GLOBAL_ITEM_TAG_LOGICAL_MINIMUM 0x01
#define HID_GLOBAL_ITEM_TAG_LOGICAL_MAXIMUM 0x02
#define HID_GLOBAL_ITEM_TAG_PHYSICAL_MINIMUM 0x03
#define HID_GLOBAL_ITEM_TAG_PHYSICAL_MAXIMUM 0x04
#define HID_GLOBAL_ITEM_TAG_UNIT_EXPONENT 0x05
#define HID_GLOBAL_ITEM_TAG_UNIT 0x06
#define HID_GLOBAL_ITEM_TAG_REPORT_SIZE 0x07
#define HID_GLOBAL_ITEM_TAG_REPORT_ID 0x08
#define HID_GLOBAL_ITEM_TAG_REPORT_COUNT 0x09
#define HID_GLOBAL_ITEM_TAG_PUSH 0x0A
#define HID_GLOBAL_ITEM_TAG_POP 0x0B
//! @}
/*! \name HID Report Descriptor Local Item Tags
*/
//! @{
#define HID_LOCAL_ITEM_TAG_USAGE 0x00
#define HID_LOCAL_ITEM_TAG_USAGE_MINIMUM 0x01
#define HID_LOCAL_ITEM_TAG_USAGE_MAXIMUM 0x02
#define HID_LOCAL_ITEM_TAG_DESIGNATOR_INDEX 0x03
#define HID_LOCAL_ITEM_TAG_DESIGNATOR_MINIMUM 0x04
#define HID_LOCAL_ITEM_TAG_DESIGNATOR_MAXIMUM 0x05
#define HID_LOCAL_ITEM_TAG_STRING_INDEX 0x07
#define HID_LOCAL_ITEM_TAG_STRING_MINIMUM 0x08
#define HID_LOCAL_ITEM_TAG_STRING_MAXIMUM 0x09
#define HID_LOCAL_ITEM_TAG_DELIMITER 0x0A
//! @}
//_____ D E F I N I T I O N S __________________________________________________
//! HID descriptor.
typedef
#if (defined __ICCAVR32__)
#pragma pack(1)
#endif
struct
#if (defined __GNUC__)
__attribute__((__packed__))
#endif
{
unsigned char bLength;
unsigned char bDescriptorType;
unsigned short bcdHID;
unsigned char bCountryCode;
unsigned char bNumDescriptors;
struct
#if (defined __GNUC__)
__attribute__((__packed__))
#endif
{
unsigned char bType;
unsigned short wLength;
} Descriptor[];
}
#if (defined __ICCAVR32__)
#pragma pack()
#endif
hid_descriptor_t;
//! HID report ID.
typedef unsigned char hid_report_id_t;
//! HID report descriptor item.
typedef
#if (defined __ICCAVR32__)
#pragma pack(1)
#endif
union
#if (defined __GNUC__)
__attribute__((__packed__))
#endif
{
struct
#if (defined __GNUC__)
__attribute__((__packed__))
#endif
{
unsigned char bTag : 4;
unsigned char bType : 2;
unsigned char bSize : 2;
} header;
struct
#if (defined __GNUC__)
__attribute__((__packed__))
#endif
{
unsigned char bTag : 4;
unsigned char bType : 2;
unsigned char bSize : 2;
unsigned char data[];
} short_format;
struct
#if (defined __GNUC__)
__attribute__((__packed__))
#endif
{
unsigned char bTag : 4;
unsigned char bType : 2;
unsigned char bSize : 2;
unsigned char bDataSize;
unsigned char bLongItemTag;
unsigned char data[];
} long_format;
}
#if (defined __ICCAVR32__)
#pragma pack()
#endif
hid_item_t;
//! HID report descriptor short item data.
typedef union
{
unsigned long value;
union
{
struct
{
unsigned int : 23;
unsigned int buffered_bytes : 1;
unsigned int : 1;
unsigned int null_state : 1;
unsigned int no_preferred : 1;
unsigned int non_linear : 1;
unsigned int wrap : 1;
unsigned int relative : 1;
unsigned int variable : 1;
unsigned int constant : 1;
} input;
struct
{
unsigned int : 23;
unsigned int buffered_bytes : 1;
unsigned int volatile_ : 1;
unsigned int null_state : 1;
unsigned int no_preferred : 1;
unsigned int non_linear : 1;
unsigned int wrap : 1;
unsigned int relative : 1;
unsigned int variable : 1;
unsigned int constant : 1;
} output;
struct
{
unsigned int : 23;
unsigned int buffered_bytes : 1;
unsigned int volatile_ : 1;
unsigned int null_state : 1;
unsigned int no_preferred : 1;
unsigned int non_linear : 1;
unsigned int wrap : 1;
unsigned int relative : 1;
unsigned int variable : 1;
unsigned int constant : 1;
} feature;
enum
{
HID_COLLECTION_PHYSICAL = 0x00,
HID_COLLECTION_APPLICATION = 0x01,
HID_COLLECTION_LOGICAL = 0x02,
HID_COLLECTION_REPORT = 0x03,
HID_COLLECTION_NAMED_ARRAY = 0x04,
HID_COLLECTION_USAGE_SWITCH = 0x05,
HID_COLLECTION_USAGE_MODIFIER = 0x06
} collection;
} main;
union
{
unsigned int usage_page;
int logical_minimum;
int logical_maximum;
int physical_minimum;
int physical_maximum;
struct
{
unsigned int : 28;
int unit_exponent : 4;
};
struct
{
unsigned int : 4;
enum
{
HID_UNIT_LUMINOUS_INTENSITY_NONE = 0x0,
HID_UNIT_LUMINOUS_INTENSITY_CANDELA = 0x1
} luminous_intensity : 4;
enum
{
HID_UNIT_CURRENT_NONE = 0x0,
HID_UNIT_CURRENT_AMPERE = 0x1
} current : 4;
enum
{
HID_UNIT_TEMPERATURE_NONE = 0x0,
HID_UNIT_TEMPERATURE_KELVIN = 0x1,
HID_UNIT_TEMPERATURE_FAHRENHEIT = 0x3
} temperature : 4;
enum
{
HID_UNIT_TIME_NONE = 0x0,
HID_UNIT_TIME_SECONDS = 0x1
} time : 4;
enum
{
HID_UNIT_MASS_NONE = 0x0,
HID_UNIT_MASS_GRAM = 0x1,
HID_UNIT_MASS_SLUG = 0x3
} mass : 4;
enum
{
HID_UNIT_LENGTH_NONE = 0x0,
HID_UNIT_LENGTH_CENTIMETER = 0x1,
HID_UNIT_LENGTH_RADIANS = 0x2,
HID_UNIT_LENGTH_INCH = 0x3,
HID_UNIT_LENGTH_DEGREES = 0x4
} length : 4;
enum
{
HID_UNIT_SYSTEM_NONE = 0x0,
HID_UNIT_SYSTEM_SI_LINEAR = 0x1,
HID_UNIT_SYSTEM_SI_ROTATION = 0x2,
HID_UNIT_SYSTEM_ENGLISH_LINEAR = 0x3,
HID_UNIT_SYSTEM_ENGLISH_ROTATION = 0x4
} system : 4;
} unit;
unsigned int report_size;
unsigned int report_id;
unsigned int report_count;
} global;
union
{
unsigned int usage;
unsigned int usage_minimum;
unsigned int usage_maximum;
unsigned int designator_index;
unsigned int designator_minimum;
unsigned int designator_maximum;
unsigned int string_index;
unsigned int string_minimum;
unsigned int string_maximum;
enum
{
HID_DELIMITER_OPEN_SET = 0x01,
HID_DELIMITER_CLOSE_SET = 0x00
} delimiter;
} local;
} hid_short_item_data_t;
//_____ D E C L A R A T I O N S ________________________________________________
#endif // _HID_H_