/**
 * \file
 *
 * \brief USB Human Interface Device (HID) protocol definitions.
 *
 * Copyright (c) 2009-2015 Atmel Corporation. All rights reserved.
 *
 * \asf_license_start
 *
 * \page License
 *
 * 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 microcontroller 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.
 *
 * \asf_license_stop
 *
 */
/*
 * Support and FAQ: visit <a href="http://www.atmel.com/design-support/">Atmel Support</a>
 */

#ifndef _USB_PROTOCOL_HID_H_
#define _USB_PROTOCOL_HID_H_

/**
 * \ingroup usb_protocol_group
 * \defgroup usb_hid_protocol USB Human Interface Device (HID)
 * protocol definitions
 * \brief USB Human Interface Device (HID) protocol definitions
 *
 * @{
 */

//! \name Possible Class value
//@{
#define HID_CLASS 0x03
//@}

//! \name Possible SubClass value
//@{
//! Interface subclass NO support BOOT protocol
#define HID_SUB_CLASS_NOBOOT 0x00
//! Interface subclass support BOOT protocol
#define HID_SUB_CLASS_BOOT 0x01
//@}

//! \name Possible protocol value
//@{
//! Protocol generic standard
#define HID_PROTOCOL_GENERIC 0x00
//! Protocol keyboard standard
#define HID_PROTOCOL_KEYBOARD 0x01
//! Protocol mouse standard
#define HID_PROTOCOL_MOUSE 0x02
//@}

//! \brief Hid USB requests (bRequest)
enum usb_reqid_hid {
    USB_REQ_HID_GET_REPORT   = 0x01,
    USB_REQ_HID_GET_IDLE     = 0x02,
    USB_REQ_HID_GET_PROTOCOL = 0x03,
    USB_REQ_HID_SET_REPORT   = 0x09,
    USB_REQ_HID_SET_IDLE     = 0x0A,
    USB_REQ_HID_SET_PROTOCOL = 0x0B,
};

//! \brief HID USB descriptor types
enum usb_descriptor_type_hid {
    USB_DT_HID          = 0x21,
    USB_DT_HID_REPORT   = 0x22,
    USB_DT_HID_PHYSICAL = 0x23,
};

//! \brief HID Type for report descriptor
enum usb_hid_item_report_type {
    USB_HID_ITEM_REPORT_TYPE_MAIN   = 0,
    USB_HID_ITEM_REPORT_TYPE_GLOBAL = 1,
    USB_HID_ITEM_REPORT_TYPE_LOCAL  = 2,
    USB_HID_ITEM_REPORT_TYPE_LONG   = 3,
};

//! \brief HID report type
enum usb_hid_report_type {
    USB_HID_REPORT_TYPE_INPUT   = 1,
    USB_HID_REPORT_TYPE_OUTPUT  = 2,
    USB_HID_REPORT_TYPE_FEATURE = 3,
};

//! \brief HID protocol
enum usb_hid_protocol {
    USB_HID_PROCOTOL_BOOT   = 0,
    USB_HID_PROCOTOL_REPORT = 1,
};

COMPILER_PACK_SET(1)

//! \brief HID Descriptor
typedef struct {
    uint8_t bLength;           //!< Size of this descriptor in bytes
    uint8_t bDescriptorType;   //!< HID descriptor type
    le16_t  bcdHID;            //!< Binary Coded Decimal Spec. release
    uint8_t bCountryCode;      //!< Hardware target country
    uint8_t bNumDescriptors;   //!< Number of HID class descriptors to follow
    uint8_t bRDescriptorType;  //!< Report descriptor type
    le16_t  wDescriptorLength; //!< Total length of Report descriptor
} usb_hid_descriptor_t;

COMPILER_PACK_RESET()

//! \name HID Report type
//! Used by SETUP_HID_GET_REPORT & SETUP_HID_SET_REPORT
//! @{
#define REPORT_TYPE_INPUT 0x01
#define REPORT_TYPE_OUTPUT 0x02
#define REPORT_TYPE_FEATURE 0x03
//! @}

//! \name Constants of field DESCRIPTOR_HID
//! @{
//! Numeric expression identifying the HID Class
//! Specification release (here V1.11)
#define USB_HID_BDC_V1_11 0x0111
//! Numeric expression specifying the number of class descriptors
//! Note: Always at least one i.e. Report descriptor.
#define USB_HID_NUM_DESC 0x01

//! \name Country code
//! @{
#define USB_HID_NO_COUNTRY_CODE 0            // Not Supported
#define USB_HID_COUNTRY_ARABIC 1             // Arabic
#define USB_HID_COUNTRY_BELGIAN 2            // Belgian
#define USB_HID_COUNTRY_CANADIAN_BILINGUAL 3 // Canadian-Bilingual
#define USB_HID_COUNTRY_CANADIAN_FRENCH 4    // Canadian-French
#define USB_HID_COUNTRY_CZECH_REPUBLIC 5     // Czech Republic
#define USB_HID_COUNTRY_DANISH 6             // Danish
#define USB_HID_COUNTRY_FINNISH 7            // Finnish
#define USB_HID_COUNTRY_FRENCH 8             // French
#define USB_HID_COUNTRY_GERMAN 9             // German
#define USB_HID_COUNTRY_GREEK 10             // Greek
#define USB_HID_COUNTRY_HEBREW 11            // Hebrew
#define USB_HID_COUNTRY_HUNGARY 12           // Hungary
#define USB_HID_COUNTRY_INTERNATIONAL_ISO 13 // International (ISO)
#define USB_HID_COUNTRY_ITALIAN 14           // Italian
#define USB_HID_COUNTRY_JAPAN_KATAKANA 15    // Japan (Katakana)
#define USB_HID_COUNTRY_KOREAN 16            // Korean
#define USB_HID_COUNTRY_LATIN_AMERICAN 17    // Latin American
#define USB_HID_COUNTRY_NETHERLANDS_DUTCH 18 // Netherlands/Dutch
#define USB_HID_COUNTRY_NORWEGIAN 19         // Norwegian
#define USB_HID_COUNTRY_PERSIAN_FARSI 20     // Persian (Farsi)
#define USB_HID_COUNTRY_POLAND 21            // Poland
#define USB_HID_COUNTRY_PORTUGUESE 22        // Portuguese
#define USB_HID_COUNTRY_RUSSIA 23            // Russia
#define USB_HID_COUNTRY_SLOVAKIA 24          // Slovakia
#define USB_HID_COUNTRY_SPANISH 25           // Spanish
#define USB_HID_COUNTRY_SWEDISH 26           // Swedish
#define USB_HID_COUNTRY_SWISS_FRENCH 27      // Swiss/French
#define USB_HID_COUNTRY_SWISS_GERMAN 28      // Swiss/German
#define USB_HID_COUNTRY_SWITZERLAND 29       // Switzerland
#define USB_HID_COUNTRY_TAIWAN 30            // Taiwan
#define USB_HID_COUNTRY_TURKISH_Q 31         // Turkish-Q
#define USB_HID_COUNTRY_UK 32                // UK
#define USB_HID_COUNTRY_US 33                // US
#define USB_HID_COUNTRY_YUGOSLAVIA 34        // Yugoslavia
#define USB_HID_COUNTRY_TURKISH_F \
    35 // Turkish-F
       //! @}
       //! @}
//! @}

//! \name HID KEYS values
//! @{
#define HID_A 0x04
#define HID_B 0x05
#define HID_C 0x06
#define HID_D 0x07
#define HID_E 0x08
#define HID_F 0x09
#define HID_G 0x0A
#define HID_H 0x0B
#define HID_I 0x0C
#define HID_J 0x0D
#define HID_K 0x0E
#define HID_L 0x0F
#define HID_M 0x10
#define HID_N 0x11
#define HID_O 0x12
#define HID_P 0x13
#define HID_Q 0x14
#define HID_R 0x15
#define HID_S 0x16
#define HID_T 0x17
#define HID_U 0x18
#define HID_V 0x19
#define HID_W 0x1A
#define HID_X 0x1B
#define HID_Y 0x1C
#define HID_Z 0x1D
#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_OPEN_BRACKET 47  // {
#define HID_CLOSE_BRACKET 48 // }
#define HID_BACKSLASH 49
#define HID_ASH 50   // # ~
#define HID_COLON 51 // ; :
#define HID_QUOTE 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_UI 0x08
#define HID_MODIFIER_RIGHT_CTRL 0x10
#define HID_MODIFIER_RIGHT_SHIFT 0x20
#define HID_MODIFIER_RIGHT_ALT 0x40
#define HID_MODIFIER_RIGHT_UI 0x80
//! @}
//! @}

//! \name HID KEYS values
//! @{
#define HID_LED_NUM_LOCK (1 << 0)
#define HID_LED_CAPS_LOCK (1 << 1)
#define HID_LED_SCROLL_LOCK (1 << 2)
#define HID_LED_COMPOSE (1 << 3)
#define HID_LED_KANA (1 << 4)
//! @}

#endif // _USB_PROTOCOL_HID_H_
