/* ---------------------------------------------------------------------------- * ATMEL Microcontroller Software Support * ---------------------------------------------------------------------------- * Copyright (c) 2010, 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 * * Definitions used for general HID support. * * The HID Function supports following: * - 1 interface with 1 pipe in and 1 pipe out; * - An input report list; * - An output report list; * - handles requests: * - handles: GET_IDLE/SET_IDLE, * GET_REPORT/SET_REPORT, * SET_PROTOCOL/GET_PROTOCOL; * - stall : SET_DESCRIPTOR. */ #ifndef _HIDDFUNCTION_H_ #define _HIDDFUNCTION_H_ /** \addtogroup usbd_hid * @{ */ /*---------------------------------------------------------------------------- * Includes *----------------------------------------------------------------------------*/ #include #include #include #include #include /*---------------------------------------------------------------------------- * Definitions *----------------------------------------------------------------------------*/ /** \addtogroup usbd_hid_events HIDD Event codes * @{ */ /** Report sent */ #define HIDD_EC_REPORTSENT 1 /** Report changed */ #define HIDD_EC_REPORTCHANGED 2 /** Report sent because of GET_REPORT Request */ #define HIDD_EC_GETREPORT 3 /** Report changed because of SET_REPORT Request */ #define HIDD_EC_SETREPORT 4 /** @}*/ /*---------------------------------------------------------------------------- * Types *----------------------------------------------------------------------------*/ /** * Callback function for HID report events. */ typedef void(*HIDDReportEventCallback)(uint32_t ec, void *pArg); /** * Struct for a header of basic HID report descriptor. */ typedef struct _HIDDReportHeader { /** Callback when report done */ HIDDReportEventCallback fCallback; /** Callback arguments */ void* pArg; /** Report size (ID + DATA) */ uint16_t wMaxSize; /** Transfered size */ uint16_t wTransferred; /** Report idle rate */ uint8_t bIdleRate; /** Delay count for Idle */ uint8_t bDelay; /** Report ID */ uint8_t bID; } HIDDReportHeader; /** * Struct for an basic HID report descriptor. */ typedef struct _HIDDReport { /** Callback when report done */ HIDDReportEventCallback fCallback; /** Callback arguments */ void* pArg; /** Report size (ID + DATA) */ uint16_t wMaxSize; /** Transfered size */ uint16_t wTransferred; /** Report idle rate */ uint8_t bIdleRate; /** Delay count for Idle */ uint8_t bDelay; /** Report ID */ uint8_t bID; /** Report data block start ... */ uint8_t bData[1]; } HIDDReport; /** * Struct for an HID general function. * Supports Input/Output reports. No feature report support. */ typedef struct _HIDDFunction { /** USB Driver for the %device */ USBDDriver *pUsbd; /** HID descriptor */ HIDDescriptor *pHidDescriptor; /** HID Specific report descriptor */ uint8_t *pReportDescriptor; /** USB interface for HID function */ uint8_t bInterface; /** USB interrupt IN EP */ uint8_t bPipeIN; /** USB interrupt OUT EP */ uint8_t bPipeOUT; /** HID Protocol */ uint8_t bProtocol; /** HID Input reports list */ HIDDReport **pInputList; /** HID Output reports list */ HIDDReport **pOutputList; /** HID Input report list size */ uint8_t bInputListSize; /** Current input report */ uint8_t bCurrInput; /** HID Output reports list */ uint8_t bOutputListSize; /** Current output report */ uint8_t bCurrOutput; } HIDDFunction; /*---------------------------------------------------------------------------- * Functions *----------------------------------------------------------------------------*/ extern void HIDDFunction_Initialize( HIDDFunction * pHidd, USBDDriver * pUsbd, uint8_t bInterfaceNb, const uint8_t * pReportDescriptor, HIDDReport * pInputList [ ], uint8_t bInputListSize, HIDDReport * pOutputList [ ], uint8_t bOutputListSize); extern USBGenericDescriptor* HIDDFunction_ParseInterface( HIDDFunction * pHidd, USBGenericDescriptor * pDescriptors, uint32_t dwLength); extern uint32_t HIDDFunction_RequestHandler( HIDDFunction * pHidd, const USBGenericRequest * request); extern uint32_t HIDDFunction_StartSendingInputs(HIDDFunction * pHidd); extern uint32_t HIDDFunction_StartPollingOutputs(HIDDFunction * pHidd); extern uint32_t HIDDFunction_Read( const HIDDFunction * pHidd, void * pData, uint32_t dwLength, TransferCallback fCallback, void * pArg); extern uint32_t HIDDFunction_Write( const HIDDFunction * pHidd, void * pData, uint32_t dwLength, TransferCallback fCallback, void * pArg); extern void HIDDFunction_InitializeReport( HIDDReport * pReport, uint16_t wSize, uint8_t bID, HIDDReportEventCallback fCallback, void* pArg); /**@}*/ #endif /* #define _HIDDFUNCTION_H_ */