blob: 26ca808787d50b2656ba5ea02b1569dd13440b28 [file] [log] [blame]
/* ----------------------------------------------------------------------------
* ATMEL Microcontroller Software Support
* ----------------------------------------------------------------------------
* Copyright (c) 2008, 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:
*
* - Redistributions of source code must retain the above copyright notice,
* this list of conditions and the disclaimer below.
*
* Atmel's name may not be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* DISCLAIMER: 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
* 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.
* ----------------------------------------------------------------------------
*/
/**
* \file
* Definition of methods for using a HID keyboard function.
*/
#ifndef HIDDKEYBOARD_H
#define HIDDKEYBOARD_H
/** \addtogroup usbd_hid_key
*@{
*/
/*------------------------------------------------------------------------------
* Headers
*------------------------------------------------------------------------------*/
#include "board.h"
#include "USBDescriptors.h"
#include "USBRequests.h"
#include "HIDDescriptors.h"
#include "USBDDriver.h"
/*------------------------------------------------------------------------------
* Definitions
*------------------------------------------------------------------------------*/
/** \addtogroup usbd_hid_kbd_desc HIDD Keyboard Driver Definitions
* @{
*/
/** Maximum number of simultaneous key presses. */
#define HIDDKeyboardInputReport_MAXKEYPRESSES 3
/** \addtogroup usbd_hid_kbd_keys HID Keypad keys
* @{
* This page lists definition for HID keypad keys.
*
* \section Keys
* - HIDDKeyboardDescriptors_FIRSTMODIFIERKEY
* - HIDDKeyboardDescriptors_LASTMODIFIERKEY
* - HIDDKeyboardDescriptors_FIRSTSTANDARDKEY
* - HIDDKeyboardDescriptors_LASTSTANDARDKEY
*/
/** Key code of the first accepted modifier key */
#define HIDDKeyboardDescriptors_FIRSTMODIFIERKEY HIDKeypad_LEFTCONTROL
/** Key code of the last accepted modifier key */
#define HIDDKeyboardDescriptors_LASTMODIFIERKEY HIDKeypad_RIGHTGUI
/** Key code of the first accepted standard key */
#define HIDDKeyboardDescriptors_FIRSTSTANDARDKEY 0
/** Key code of the last accepted standard key */
#define HIDDKeyboardDescriptors_LASTSTANDARDKEY HIDKeypad_NUMLOCK
/** @}*/
/** \addtogroup usbd_hid_kbd_polling HID Keyboard Default Polling Rates
* @{
*/
/** Default HID interrupt IN endpoint polling rate FS (16ms). */
#define HIDDKeyboardDescriptors_INTERRUPTIN_POLLING_FS 16
/** Default HID interrupt IN endpoint polling rate HS (16ms). */
#define HIDDKeyboardDescriptors_INTERRUPTIN_POLLING_HS 8
/** Default interrupt OUT endpoint polling rate FS (16ms). */
#define HIDDKeyboardDescriptors_INTERRUPTOUT_POLLING_FS 16
/** Default interrupt OUT endpoint polling rate HS (16ms). */
#define HIDDKeyboardDescriptors_INTERRUPTOUT_POLLING_HS 8
/** @}*/
/** Size of the report descriptor in bytes */
#define HIDDKeyboard_REPORTDESCRIPTORSIZE 61
/** @}*/
/*------------------------------------------------------------------------------
* Types
*------------------------------------------------------------------------------*/
#ifdef __ICCARM__ /* IAR */
#pragma pack(1) /* IAR */
#define __attribute__(...) /* IAR */
#endif /* IAR */
/**
* \typedef HIDDKeyboardOutputReport
* \brief HID output report structure used by the host to control the state of
* the keyboard LEDs.
*
* Only the first three bits are relevant, the other 5 are used as
* padding bits.
*/
typedef struct _HIDDKeyboardOutputReport {
uint8_t numLockStatus:1, /** State of the num. lock LED. */
capsLockStatus:1, /** State of the caps lock LED. */
scrollLockStatus:1, /** State of the scroll lock LED. */
padding:5; /** Padding bits. */
} __attribute__ ((packed)) HIDDKeyboardOutputReport; /* GCC */
/**
* \typedef HIDDKeyboardInputReport
* \brief HID input report structure used by the keyboard driver to notify the
* host of pressed keys.
*
* The first byte is used to report the state of modifier keys. The
* other three contains the keycodes of the currently pressed keys.
*/
typedef struct _HIDDKeyboardInputReport {
/** State of modifier keys. */
uint8_t bmModifierKeys:8;
/** Key codes of pressed keys. */
uint8_t pressedKeys[HIDDKeyboardInputReport_MAXKEYPRESSES];
} __attribute__ ((packed)) HIDDKeyboardInputReport; /* GCC */
/**
* \typedef HIDDKeyboardDriverConfigurationDescriptors
* \brief List of descriptors that make up the configuration descriptors of a
* device using the HID keyboard driver.
*/
typedef struct _HIDDKeyboardDriverConfigurationDescriptors {
/** Configuration descriptor. */
USBConfigurationDescriptor configuration;
/** Interface descriptor. */
USBInterfaceDescriptor interface;
/** HID descriptor. */
HIDDescriptor1 hid;
/** Interrupt IN endpoint descriptor. */
USBEndpointDescriptor interruptIn;
/** Interrupt OUT endpoint descriptor. */
USBEndpointDescriptor interruptOut;
} __attribute__ ((packed)) HIDDKeyboardDriverConfigurationDescriptors;
#ifdef __ICCARM__ /* IAR */
#pragma pack() /* IAR */
#endif /* IAR */
/*------------------------------------------------------------------------------
* Exported functions
*------------------------------------------------------------------------------*/
extern void HIDDKeyboard_Initialize(USBDDriver * pUsbd,uint8_t bInterfaceNb);
extern void HIDDKeyboard_ConfigureFunction( USBGenericDescriptor * pDescriptors, uint16_t wLength);
extern uint32_t HIDDKeyboard_RequestHandler( const USBGenericRequest *request);
extern uint32_t HIDDKeyboard_ChangeKeys(
uint8_t *pressedKeys,
uint8_t pressedKeysSize,
uint8_t *releasedKeys,
uint8_t releasedKeysSize);
extern void HIDDKeyboard_RemoteWakeUp(void);
extern void HIDDKeyboardCallbacks_LedsChanged(
uint8_t numLockStatus,
uint8_t capsLockStatus,
uint8_t scrollLockStatus);
extern void HIDDKeyboardInputReport_Initialize(HIDDKeyboardInputReport *report);
extern void HIDDKeyboardInputReport_PressStandardKey( HIDDKeyboardInputReport *report, uint8_t key ) ;
extern void HIDDKeyboardInputReport_ReleaseStandardKey( HIDDKeyboardInputReport *report, uint8_t key ) ;
extern void HIDDKeyboardInputReport_PressModifierKey( HIDDKeyboardInputReport *report, uint8_t key);
extern void HIDDKeyboardInputReport_ReleaseModifierKey( HIDDKeyboardInputReport *report, uint8_t key);
extern void HIDDKeyboardOutputReport_Initialize( HIDDKeyboardOutputReport *report);
extern uint8_t HIDDKeyboardOutputReport_GetNumLockStatus( const HIDDKeyboardOutputReport *report);
extern uint8_t HIDDKeyboardOutputReport_GetCapsLockStatus( const HIDDKeyboardOutputReport *report);
extern uint8_t HIDDKeyboardOutputReport_GetScrollLockStatus( const HIDDKeyboardOutputReport *report);
/**@}*/
#endif /*#ifndef HIDDKEYBOARD_H*/