/**
 * \file
 *
 * \brief USB Human Interface Device (HID) protocol definitions.
 *
 * Copyright (c) 2009-2018 Microchip Technology Inc. and its subsidiaries.
 *
 * \asf_license_start
 *
 * \page License
 *
 * Subject to your compliance with these terms, you may use Microchip
 * software and any derivatives exclusively with Microchip products.
 * It is your responsibility to comply with third party license terms applicable
 * to your use of third party software (including open source software) that
 * may accompany Microchip software.
 *
 * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES,
 * WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE,
 * INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY,
 * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE
 * LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL
 * LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE
 * SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE
 * POSSIBILITY OR THE DAMAGES ARE FORESEEABLE.  TO THE FULLEST EXTENT
 * ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY
 * RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY,
 * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE.
 *
 * \asf_license_stop
 *
 */
/*
 * Support and FAQ: visit <a href="https://www.microchip.com/support/">Microchip 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_
