/**
 * \file
 *
 * \brief USB Human Interface Device (HID) protocol definitions.
 *
 * Copyright (c) 2009 Atmel Corporation. All rights reserved.
 *
 * \asf_license_start
 *
 * 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
 *
 */

#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;            //!< Binay 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_
