/* ---------------------------------------------------------------------------- * 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*/