blob: 8fa93243d54e87c3f884f3adc17b0d80e9ba4d0e [file] [log] [blame]
/* ----------------------------------------------------------------------------
* 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 <stdint.h>
#include <HIDRequests.h>
#include <HIDDescriptors.h>
#include <USBD.h>
#include <USBDDriver.h>
/*----------------------------------------------------------------------------
* 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_ */