| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975 |
- //*****************************************************************************
- //
- // usbdhid.h - Definitions used by HID class devices.
- //
- // Copyright (c) 2008-2010 Texas Instruments Incorporated. All rights reserved.
- // Software License Agreement
- //
- // Texas Instruments (TI) is supplying this software for use solely and
- // exclusively on TI's microcontroller products. The software is owned by
- // TI and/or its suppliers, and is protected under applicable copyright
- // laws. You may not combine this software with "viral" open-source
- // software in order to form a larger program.
- //
- // THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS.
- // NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT
- // NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- // A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY
- // CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
- // DAMAGES, FOR ANY REASON WHATSOEVER.
- //
- // This is part of AM1808 StarterWare USB Library and reused from revision 6288
- // of the Stellaris USB Library.
- //
- //*****************************************************************************
- #ifndef __USBDHID_H__
- #define __USBDHID_H__
- //*****************************************************************************
- //
- // If building with a C++ compiler, make all of the definitions in this header
- // have a C binding.
- //
- //*****************************************************************************
- #ifdef __cplusplus
- extern "C"
- {
- #endif
- //*****************************************************************************
- //
- //! \addtogroup hid_device_class_api
- //! @{
- //
- //*****************************************************************************
- //*****************************************************************************
- //
- //! The size of the memory that should be allocated to create a configuration
- //! descriptor for a single instance of the USB HID Device.
- //! This does not include the configuration descriptor which is automatically
- //! ignored by the composite device class.
- //
- // For reference this is
- // sizeof(g_sHIDInterfaceSection) + sizeof(g_sHIDDescriptorSection) +
- // sizeof(g_sHIDInEndpointSection) + sizeof(g_sHIDOutEndpointSection)
- //
- //*****************************************************************************
- #define COMPOSITE_DHID_SIZE (32)
- //*****************************************************************************
- //
- // Macros used to create the static Report Descriptors.
- //
- //*****************************************************************************
- //*****************************************************************************
- //
- //! This is a macro to assist adding Usage Page entries in HID report
- //! descriptors.
- //!
- //! \param ucValue is the Usage Page value.
- //!
- //! This macro takes a value and prepares it to be placed as a Usage Page entry
- //! into a HID report structure. These are defined by the USB HID
- //! specification.
- //!
- //! \return Not a function.
- //
- //*****************************************************************************
- #define UsagePage(ucValue) 0x05, ((ucValue) & 0xff)
- //*****************************************************************************
- //
- //! This is a macro to assist adding Usage entries in HID report descriptors.
- //!
- //! \param ucValue is the Usage value.
- //!
- //! This macro takes a value and prepares it to be placed as a Usage entry into
- //! a HID report structure. These are defined by the USB HID specification.
- //!
- //! \return Not a function.
- //
- //*****************************************************************************
- #define Usage(ucValue) 0x09, ((ucValue) & 0xff)
- //*****************************************************************************
- //
- //! This is a macro to assist adding Usage Minimum entries in HID report
- //! descriptors.
- //!
- //! \param ucValue is the Usage Minimum value.
- //!
- //! This macro takes a value and prepares it to be placed as a Usage Minimum
- //! entry into a HID report structure. This is the first or minimum value
- //! associated with a usage value.
- //!
- //! \return Not a function.
- //
- //*****************************************************************************
- #define UsageMinimum(ucValue) 0x19, ((ucValue) & 0xff)
- //*****************************************************************************
- //
- //! This is a macro to assist adding Usage Maximum entries in HID report
- //! descriptors.
- //!
- //! \param ucValue is the Usage Maximum value.
- //!
- //! This macro takes a value and prepares it to be placed as a Usage Maximum
- //! entry into a HID report structure. This is the last or maximum value
- //! associated with a usage value.
- //!
- //! \return Not a function.
- //
- //*****************************************************************************
- #define UsageMaximum(ucValue) 0x29, ((ucValue) & 0xff)
- //*****************************************************************************
- //
- //! This is a macro to assist adding Logical Minimum entries in HID report
- //! descriptors.
- //!
- //! \param cValue is the Logical Minimum value.
- //!
- //! This macro takes a value and prepares it to be placed as a Logical Minimum
- //! entry into a HID report structure. This is the actual minimum value for a
- //! range of values associated with a field.
- //!
- //! \return Not a function.
- //
- //*****************************************************************************
- #define LogicalMinimum(cValue) 0x15, ((cValue) & 0xff)
- //*****************************************************************************
- //
- //! This is a macro to assist adding Logical Maximum entries in HID report
- //! descriptors.
- //!
- //! \param cValue is the Logical Maximum value.
- //!
- //! This macro takes a value and prepares it to be placed as a Logical Maximum
- //! entry into a HID report structure. This is the actual maximum value for a
- //! range of values associated with a field.
- //!
- //! \return Not a function.
- //
- //*****************************************************************************
- #define LogicalMaximum(cValue) 0x25, ((cValue) & 0xff)
- //*****************************************************************************
- //
- //! This is a macro to assist adding Physical Minimum entries in HID report
- //! descriptors.
- //!
- //! \param sValue is the Physical Minimum value. It is a signed, 16 bit
- //! number.
- //!
- //! This macro takes a value and prepares it to be placed as a Physical Minimum
- //! entry into a HID report structure. This is value is used in conversion of
- //! the control logical value, as returned to the host in the relevant report,
- //! to a physical measurement in the appropriate units.
- //!
- //! \return Not a function.
- //
- //*****************************************************************************
- #define PhysicalMinimum(sValue) 0x36, ((sValue) & 0xFF), \
- (((sValue) >> 8) & 0xFF)
- //*****************************************************************************
- //
- //! This is a macro to assist adding Physical Maximum entries in HID report
- //! descriptors.
- //!
- //! \param sValue is the Physical Maximum value. It is a signed, 16 bit
- //! number.
- //!
- //! This macro takes a value and prepares it to be placed as a Physical Maximum
- //! entry into a HID report structure. This is value is used in conversion of
- //! the control logical value, as returned to the host in the relevant report,
- //! to a physical measurement in the appropriate units.
- //!
- //! \return Not a function.
- //
- //*****************************************************************************
- #define PhysicalMaximum(sValue) 0x46, ((sValue) & 0xFF), \
- (((sValue) >> 8) & 0xFF)
- //*****************************************************************************
- //
- //! This is a macro to assist adding Collection entries in HID report
- //! descriptors.
- //!
- //! \param ucValue is the type of Collection.
- //!
- //! This macro takes a value and prepares it to be placed as a Collection
- //! entry into a HID report structure. This is the type of values that are
- //! being grouped together, for instance input, output or features can be
- //! grouped together as a collection.
- //!
- //! \return Not a function.
- //
- //*****************************************************************************
- #define Collection(ucValue) 0xa1, ((ucValue) & 0xff)
- //*****************************************************************************
- //
- //! This is a macro to assist adding End Collection entries in HID report
- //! descriptors.
- //!
- //! This macro can be used to place an End Collection entry into a HID report
- //! structure. This is a tag to indicate that a collection of entries has
- //! ended in the HID report structure. This terminates a previous Collection()
- //! entry.
- //!
- //! \return Not a function.
- //
- //*****************************************************************************
- #define EndCollection 0xc0
- //*****************************************************************************
- //
- //! This is a macro to assist adding Report Count entries in HID report
- //! descriptors.
- //!
- //! \param ucValue is the number of items in a report item.
- //!
- //! This macro takes a value and prepares it to be placed as a Report Count
- //! entry into a HID report structure. This is number of entries of Report
- //! Size for a given item.
- //!
- //! \return Not a function.
- //
- //*****************************************************************************
- #define ReportCount(ucValue) 0x95, ((ucValue) & 0xff)
- //*****************************************************************************
- //
- //! This is a macro to assist adding Report ID entries in HID report
- //! descriptors.
- //!
- //! \param ucValue is the identifier prefix for the current report.
- //!
- //! This macro takes a value and prepares it to be placed as a Report ID
- //! entry into a HID report structure. This value is used as a 1 byte prefix
- //! for the report it is contained within.
- //!
- //! \return Not a function.
- //
- //*****************************************************************************
- #define ReportID(ucValue) 0x85, ((ucValue) & 0xff)
- //*****************************************************************************
- //
- //! This is a macro to assist adding Report Size entries in HID report
- //! descriptors.
- //!
- //! \param ucValue is the size, in bits, of items in a report item.
- //!
- //! This macro takes a value and prepares it to be placed as a Report Size
- //! entry into a HID report structure. This is size in bits of the entries of
- //! of a report entry. The Report Count specifies how many entries of Report
- //! Size are in a given item. These can be individual bits or bit fields.
- //!
- //! \return Not a function.
- //
- //*****************************************************************************
- #define ReportSize(ucValue) 0x75, ((ucValue) & 0xff)
- //*****************************************************************************
- //
- //! This is a macro to assist adding Input entries in HID report descriptors.
- //!
- //! \param ucValue is bit mask to specify the type of a set of input report
- //! items. Note that if the USB_HID_INPUT_BITF flag is required, the Input2
- //! macro (which uses a 2 byte version of the Input item tag) must be used
- //! instead of this macro.
- //!
- //! This macro takes a value and prepares it to be placed as an Input entry
- //! into a HID report structure. This specifies the type of an input item in
- //! a report structure. These refer to a bit mask of flags that indicate the
- //! type of input for a set of items.
- //!
- //! \return Not a function.
- //
- //*****************************************************************************
- #define Input(ucValue) 0x81, ((ucValue) & 0xff)
- //*****************************************************************************
- //
- //! This is a macro to assist adding Input entries in HID report descriptors.
- //!
- //! \param usValue is bit mask to specify the type of a set of input report
- //! items. Note that this macro uses a version of the Input item tag with a
- //! two byte payload and allows any of the 8 possible data bits for the tag to
- //! be used. If USB_HID_INPUT_BITF (bit 8) is not required, the Input macro
- //! may be used instead.
- //!
- //! This macro takes a value and prepares it to be placed as an Input entry
- //! into a HID report structure. This specifies the type of an input item in
- //! a report structure. These refer to a bit mask of flags that indicate the
- //! type of input for a set of items.
- //!
- //! \return Not a function.
- //
- //*****************************************************************************
- #define Input2(usValue) 0x82, ((usValue) & 0xff), \
- (((usValue) >> 8) & 0xFF)
- //*****************************************************************************
- //
- //! This is a macro to assist adding Feature entries in HID report descriptors.
- //!
- //! \param ucValue is bit mask to specify the type of a set of feature report
- //! items. Note that if the USB_HID_FEATURE_BITF flag is required, the
- //! Feature2 macro (which uses a 2 byte version of the Feature item tag) must
- //! be used instead of this macro.
- //!
- //! This macro takes a value and prepares it to be placed as a Feature entry
- //! into a HID report structure. This specifies the type of a feature item in
- //! a report structure. These refer to a bit mask of flags that indicate the
- //! type of feature for a set of items.
- //!
- //! \return Not a function.
- //
- //*****************************************************************************
- #define Feature(ucValue) 0xB1, ((ucValue) & 0xff)
- //*****************************************************************************
- //
- //! This is a macro to assist adding Feature entries in HID report descriptors.
- //!
- //! \param usValue is bit mask to specify the type of a set of feature report
- //! items. Note that this macro uses a version of the Feature item tag with a
- //! two byte payload and allows any of the 8 possible data bits for the tag to
- //! be used. If USB_HID_FEATURE_BITF (bit 8) is not required, the Feature
- //! macro may be used instead.
- //!
- //! This macro takes a value and prepares it to be placed as a Feature entry
- //! into a HID report structure. This specifies the type of a feature item in
- //! a report structure. These refer to a bit mask of flags that indicate the
- //! type of feature for a set of items.
- //!
- //! \return Not a function.
- //
- //*****************************************************************************
- #define Feature2(usValue) 0xB2, ((usValue) & 0xff), \
- (((usValue) >> 8) & 0xFF)
- //*****************************************************************************
- //
- //! This is a macro to assist adding Output entries in HID report descriptors.
- //!
- //! \param ucValue is bit mask to specify the type of a set of output report
- //! items. Note that if the USB_HID_OUTPUT_BITF flag is required, the Output2
- //! macro (which uses a 2 byte version of the Output item tag) must be used
- //! instead of this macro.
- //!
- //! This macro takes a value and prepares it to be placed as an Output entry
- //! into a HID report structure. This specifies the type of an output item in
- //! a report structure. These refer to a bit mask of flags that indicate the
- //! type of output for a set of items.
- //!
- //! \return Not a function.
- //
- //*****************************************************************************
- #define Output(ucValue) 0x91, ((ucValue) & 0xff)
- //*****************************************************************************
- //
- //! This is a macro to assist adding Output entries in HID report descriptors.
- //!
- //! \param usValue is bit mask to specify the type of a set of output report
- //! items. Note that this macro uses a version of the Output item tag with a
- //! two byte payload and allows any of the 8 possible data bits for the tag to
- //! be used. If USB_HID_OUTPUT_BITF (bit 8) is not required, the Output macro
- //! may be used instead.
- //!
- //! This macro takes a value and prepares it to be placed as an Output entry
- //! into a HID report structure. This specifies the type of an output item in
- //! a report structure. These refer to a bit mask of flags that indicate the
- //! type of output for a set of items.
- //!
- //! \return Not a function.
- //
- //*****************************************************************************
- #define Output2(usValue) 0x92, ((usValue) & 0xff), \
- (((usValue) >> 8) & 0xFF)
- //*****************************************************************************
- //
- //! This is a macro to assist adding Unit Exponent entries in HID report
- //! descriptors.
- //!
- //! \param cValue is the required exponent in the range [-8, 7].
- //!
- //! This macro takes a value and prepares it to be placed as a Unit Exponent
- //! entry into a HID report structure. This is the exponent applied to
- //! PhysicalMinimum and PhysicalMaximum when scaling and converting control
- //! values to "real" units.
- //!
- //! \return Not a function.
- //
- //*****************************************************************************
- #define UnitExponent(cValue) 0x55, ((cValue) & 0x0f)
- //*****************************************************************************
- //
- //! This is a macro to assist adding Unit entries for uncommon units in HID
- //! report descriptors.
- //!
- //! \param ulValue is the definition of the unit required as defined in section
- //! 6.2.2.7 of the USB HID device class definition document.
- //!
- //! This macro takes a value and prepares it to be placed as a Unit entry into
- //! a HID report structure. Note that individual macros are defined for common
- //! units and this macro is intended for use when a complex or uncommon unit
- //! is needed. It allows entry of a 5 nibble unit definition into the report
- //! descriptor.
- //!
- //! \return Not a function.
- //
- //*****************************************************************************
- #define Unit(ulValue) 0x67, (ulValue) & 0x0f), \
- (((ulValue) >> 8) & 0xFF), \
- (((ulValue) >> 16) & 0xFF), \
- (((ulValue) >> 24) & 0xFF)
- //*****************************************************************************
- //
- //! This macro inserts a Unit entry for centimeters into a report descriptor.
- //!
- //*****************************************************************************
- #define UnitDistance_cm 0x66, 0x11, 0x00
- //*****************************************************************************
- //
- //! This macro inserts a Unit entry for inches into a report descriptor.
- //!
- //*****************************************************************************
- #define UnitDistance_i 0x66, 0x13, 0x00
- //*****************************************************************************
- //
- //! This macro inserts a Unit entry for degrees into a report descriptor.
- //!
- //*****************************************************************************
- #define UnitRotation_deg 0x66, 0x14, 0x00
- //*****************************************************************************
- //
- //! This macro inserts a Unit entry for radians into a report descriptor.
- //!
- //*****************************************************************************
- #define UnitRotation_rad 0x66, 0x12, 0x00
- //*****************************************************************************
- //
- //! This macro inserts a Unit entry for grams into a report descriptor.
- //!
- //*****************************************************************************
- #define UnitMass_g 0x66, 0x01, 0x01
- //*****************************************************************************
- //
- //! This macro inserts a Unit entry for seconds into a report descriptor.
- //!
- //*****************************************************************************
- #define UnitTime_s 0x66, 0x01, 0x10
- //*****************************************************************************
- //
- //! This macro inserts a Unit entry for temperature in Kelvin into a report
- //! descriptor.
- //!
- //*****************************************************************************
- #define UnitTemp_K 0x67, 0x01, 0x00, 0x01, 0x00
- //*****************************************************************************
- //
- //! This macro inserts a Unit entry for temperature in Fahrenheit into a report
- //! descriptor.
- //!
- //*****************************************************************************
- #define UnitTemp_F 0x67, 0x03, 0x00, 0x01, 0x00
- //*****************************************************************************
- //
- //! This macro inserts a Unit entry for velocity in cm/s into a report
- //! descriptor.
- //!
- //*****************************************************************************
- #define UnitVelocitySI 0x66, 0x11, 0xF0
- //*****************************************************************************
- //
- //! This macro inserts a Unit entry for momentum in (grams * cm)/s into a
- //! report descriptor.
- //!
- //*****************************************************************************
- #define UnitMomentumSI 0x66, 0x11, 0xF1
- //*****************************************************************************
- //
- //! This macro inserts a Unit entry for acceleration in cm/s**2 into a
- //! report descriptor.
- //!
- //*****************************************************************************
- #define UnitAccelerationSI 0x66, 0x11, 0xE0
- //*****************************************************************************
- //
- //! This macro inserts a Unit entry for force in (cm * grams)/s**2 into a
- //! report descriptor.
- //!
- //*****************************************************************************
- #define UnitForceSI 0x66, 0x11, 0xE1
- //*****************************************************************************
- //
- //! This macro inserts a Unit entry for energy in (grams * cm**2)/s**2 into a
- //! report descriptor.
- //!
- //*****************************************************************************
- #define UnitEnergySI 0x66, 0x21, 0xE1
- //*****************************************************************************
- //
- //! This macro inserts a Unit entry for angular acceleration in degrees/s**2
- //! into a report descriptor.
- //!
- //*****************************************************************************
- #define UnitAngAccelerationSI 0x66, 0x12, 0xE0
- //*****************************************************************************
- //
- //! This macro inserts a Unit entry for voltage into a a report descriptor.
- //!
- //*****************************************************************************
- #define UnitVoltage 0x67, 0x21, 0xD1, 0xF0, 0x00
- //*****************************************************************************
- //
- //! This macro inserts a Unit entry for voltage into a a report descriptor.
- //!
- //*****************************************************************************
- #define UnitCurrent_A 0x67, 0x01, 0x00, 0x10, 0x00
- //*****************************************************************************
- //
- // PRIVATE
- //
- // The first few sections of this header are private defines that are used by
- // the USB HID code and are here only to help with the application
- // allocating the correct amount of memory for the HID device code.
- //
- //*****************************************************************************
- //*****************************************************************************
- //
- // PRIVATE
- //
- // This enumeration holds the various states that the device can be in during
- // normal operation.
- //
- //*****************************************************************************
- typedef enum
- {
- //
- // Unconfigured.
- //
- HID_STATE_UNCONFIGURED,
- //
- // No outstanding transaction remains to be completed.
- //
- HID_STATE_IDLE,
- //
- // Waiting on completion of a send or receive transaction.
- //
- HID_STATE_WAIT_DATA
- }
- tHIDState;
- //*****************************************************************************
- //
- // PRIVATE
- //
- // This structure defines the private instance data and state variables for
- // HID devices. The memory for this structure is pointed to by the
- // psPrivateHIDData field in the tUSBDHIDDevice structure passed in the
- // USBDHIDInit() function.
- //
- //*****************************************************************************
- typedef struct
- {
- unsigned int ulUSBBase;
- tDeviceInfo *psDevInfo;
- tConfigDescriptor *psConfDescriptor;
- volatile tHIDState eHIDRxState;
- volatile tHIDState eHIDTxState;
- volatile unsigned short usDeferredOpFlags;
- unsigned short usInReportSize;
- unsigned short usInReportIndex;
- unsigned short usOutReportSize;
- unsigned char *pucInReportData;
- unsigned char *pucOutReportData;
- volatile tBoolean bConnected;
- volatile tBoolean bSendInProgress;
- tBoolean bGetRequestPending;
- unsigned char ucINEndpoint;
- unsigned char ucOUTEndpoint;
- unsigned char ucInterface;
- }
- tHIDInstance;
- #ifndef DEPRECATED
- //*****************************************************************************
- //
- // The number of bytes of workspace required by the HID device class driver.
- // The client must provide a block of RAM of at least this size in the
- // pvWorkspace field of the tUSBDHIDDevice structure passed on USBDHIDInit.
- //
- //*****************************************************************************
- #define USB_HID_WORKSPACE_SIZE sizeof(tHIDInstance)
- #endif
- //*****************************************************************************
- //
- //! The structure used to track idle time for reports. An array of these
- //! structures is passed to the HID device class driver during USBDHIDInit and
- //! is used to track automatic resending of each report (if not disabled by
- //! the host).
- //
- //*****************************************************************************
- typedef struct
- {
- //
- //! The idle duration for the report expressed in units of 4mS. 0
- //! indicates infinite and informs the class driver not to send the report
- //! unless a state change occurs.
- //
- unsigned char ucDuration4mS;
- //
- //! The ID of the report which this structure applies to. This is the
- //! report ID as specified using a ReportID tag in the report descriptor
- //! rather than the index of the report in the HID class descriptor array.
- //! If only a single Input report is supported and, thus, no ReportID tag
- //! is present, this field should be set to 0.
- //
- unsigned char ucReportID;
- //
- //! The number of milliseconds before we need to send a copy of a given
- //! report back to the host. This field is updated by the HID driver and
- //! used to time sending of USBD_HID_EVENT_IDLE_TIMEOUT.
- //
- unsigned short usTimeTillNextmS;
- //
- //! The number of milliseconds that have passed since the last time this
- //! report was sent. The HID class driver needs to track this since
- //! Set_Idle requests are required to take effect as if issued immediately
- //! after the last transmission of the report to which they refer.
- //
- unsigned int ulTimeSinceReportmS;
- }
- tHIDReportIdle;
- //*****************************************************************************
- //
- //! The structure used by the application to define operating parameters for
- //! the HID device.
- //
- //*****************************************************************************
- typedef struct
- {
- //
- //! The vendor ID that this device is to present in the device descriptor.
- //
- unsigned short usVID;
- //
- //! The product ID that this device is to present in the device descriptor.
- //
- unsigned short usPID;
- //
- //! The maximum power consumption of the device, expressed in milliamps.
- //
- unsigned short usMaxPowermA;
- //
- //! Indicates whether the device is self- or bus-powered and whether or not
- //! it supports remote wakeup. Valid values are USB_CONF_ATTR_SELF_PWR or
- //! USB_CONF_ATTR_BUS_PWR, optionally ORed with USB_CONF_ATTR_RWAKE.
- //
- unsigned char ucPwrAttributes;
- //
- //! The interface subclass to publish to the server for this HID device.
- //
- unsigned char ucSubclass;
- //
- //! The interface protocol to publish to the server for this HID device.
- //
- unsigned char ucProtocol;
- //
- //! The number of Input reports that this device supports. This field
- //! must equal the number of reports published in the HID class descriptors
- //! for the device and also the number of entries in the array whose first
- //! element is pointed to by field psReportIdle below.
- //
- unsigned char ucNumInputReports;
- //
- //! A pointer to the first element in an array of structures used to track
- //! idle time for each Input report. When USBDHIDInit is called, the
- //! ucDuration4mS and ucReportID fields of each of these array members
- //! should be initialized to indicate the default idle timeout for each
- //! input report. This array must be in RAM since the HID device class
- //! driver will update values in it in response to requests from the host
- //! and to track elapsed time. The number of elements in the array must
- //! match the number supplied in the ucNumInputReports field above.
- //
- tHIDReportIdle *psReportIdle;
- //! A pointer to the callback function which will be called to notify
- //! the application of general events, events related to report transfers
- //! on endpoint zero and events related to reception of Output and Feature
- //! reports via the (optional) interrupt OUT endpoint.
- //
- tUSBCallback pfnRxCallback;
- //
- //! A client-supplied pointer which will be sent as the first
- //! parameter in all calls made to the receive channel callback,
- //! pfnRxCallback.
- //
- void *pvRxCBData;
- //
- //! A pointer to the callback function which will be called to notify
- //! the application of events related to transmission of Input reports
- //! via the interrupt IN endpoint.
- //
- tUSBCallback pfnTxCallback;
- //
- //! A client-supplied pointer which will be sent as the first
- //! parameter in all calls made to the transmit channel callback,
- //! pfnTxCallback.
- //
- void *pvTxCBData;
- //
- //! If set to true, this field indicates that the device should use a
- //! dedicated interrupt OUT endpoint to receive reports from the host. In
- //! this case, reports from the host are passed to the application via the
- //! receive callback using USB_EVENT_RX_AVAILABLE events. If false,
- //! reports from the host are received via endpoint zero and passed to the
- //! application via USBD_HID_EVENT_REPORT_SENT events.
- //
- tBoolean bUseOutEndpoint;
- //
- //! The HID descriptor that the device is to publish (following the
- //! standard interface descriptor and prior to the endpoint descriptors for
- //! the interface).
- //
- const tHIDDescriptor *psHIDDescriptor;
- //
- //! The HID class descriptors offered by the device are defined in an
- //! array of byte pointers and this field points to that array. The
- //! order and number of elements in the array must match the associated
- //! information provided in the HID descriptor in field by psHIDDescriptor.
- //
- const unsigned char * const *ppClassDescriptors;
- //
- //! A pointer to the string descriptor array for this device. This array
- //! must contain the following string descriptor pointers in this order.
- //! Language descriptor, Manufacturer name string (language 1), Product
- //! name string (language 1), Serial number string (language 1),HID
- //! Interface description string (language 1), Configuration description
- //! string (language 1), (optionally) First HID device-specific string
- //! (language 1), (optionally) Second HID device-specific string (language
- //! 1), etc.
- //!
- //! If supporting more than 1 language, the descriptor block (except for
- //! string descriptor 0) must be repeated for each language defined in the
- //! language descriptor.
- //!
- //! The number of HID device-specific strings is dependent upon the content
- //! of the report descriptor passed to the interface and is, thus,
- //! application controlled.
- //
- const unsigned char * const *ppStringDescriptors;
- //
- //! The number of descriptors provided in the ppStringDescriptors
- //! array. This must be 1 + ((5 + (num HID strings)) * (num languages)).
- //
- unsigned int ulNumStringDescriptors;
- //
- //! A pointer to private instance data for this device instance. This
- //! memory must remain accessible for as long as the HID device is in use
- //! and must not be modified by any code outside the HID class driver.
- //
- tHIDInstance *psPrivateHIDData;
- }
- tUSBDHIDDevice;
- //*****************************************************************************
- //
- // HID-specific device class driver events
- //
- //*****************************************************************************
- //*****************************************************************************
- //
- //! This event indicates that the host is requesting a particular report be
- //! returned via endpoint 0, the control endpoint. The ulMsgValue parameter
- //! contains the requested report type in the high byte and report ID in the
- //! low byte (as passed in the wValue field of the USB request structure).
- //! The pvMsgData parameter contains a pointer which must be written with the
- //! address of the first byte of the requested report. The callback must
- //! return the size in bytes of the report pointed to by *pvMsgData. The
- //! memory returned in response to this event must remain unaltered until
- //! USBD_HID_EVENT_REPORT_SENT is sent.
- //
- //*****************************************************************************
- #define USBD_HID_EVENT_GET_REPORT \
- (USBD_HID_EVENT_BASE + 0)
- //*****************************************************************************
- //
- //! This event indicates that a report previously requested via a
- //! USBD_HID_EVENT_GET_REPORT has been successfully transmitted to the host.
- //! The application may now free or reuse the report memory passed on the
- //! previous event. Although this would seem to be an event that would be
- //! passed to the transmit channel callback, it is actually passed to the
- //! receive channel callback. This ensures that all events related to the
- //! request and transmission of reports via endpoint zero can be handled in
- //! a single function.
- //
- //*****************************************************************************
- #define USBD_HID_EVENT_REPORT_SENT \
- (USBD_HID_EVENT_BASE + 1)
- //*****************************************************************************
- //
- //! This event indicates that the host has sent a Set_Report request to
- //! the device and requests that the device provide a buffer into which the
- //! report can be written. The ulMsgValue parameter contains the received
- //! report type in the high byte and report ID in the low byte (as passed in
- //! the wValue field of the USB request structure). The pvMsgData parameter
- //! contains the length of buffer requested. Note that this is the actual
- //! length value cast to a "void *" type and not a pointer in this case.
- //! The callback must return a pointer to a suitable buffer (cast to the
- //! standard "unsigned int" return type for the callback).
- //
- //*****************************************************************************
- #define USBD_HID_EVENT_GET_REPORT_BUFFER \
- (USBD_HID_EVENT_BASE + 2)
- //*****************************************************************************
- //
- //! This event indicates that the host has sent the device a report via
- //! endpoint 0, the control endpoint. The ulMsgValue field indicates the
- //! size of the report and pvMsgData points to the first byte of the report.
- //! The report buffer will previously have been returned in response to an
- //! earlier USBD_HID_EVENT_GET_REPORT_BUFFER callback. The HID device class
- //! driver will not access the memory pointed to by pvMsgData after this
- //! callback is made so the application is free to reuse or free it at this
- //! point.
- //
- //*****************************************************************************
- #define USBD_HID_EVENT_SET_REPORT \
- (USBD_HID_EVENT_BASE + 3)
- //*****************************************************************************
- //
- //! This event is sent in response to a Get_Protocol request from the host.
- //! The callback should provide the current protocol via the return code,
- //! USB_HID_PROTOCOL_BOOT or USB_HID_PROTOCOL_REPORT.
- //
- //*****************************************************************************
- #define USBD_HID_EVENT_GET_PROTOCOL \
- (USBD_HID_EVENT_BASE + 4)
- //*****************************************************************************
- //
- //! This event is sent in response to a Set_Protocol request from the host.
- //! The ulMsgData value will contain the requested protocol,
- //! USB_HID_PROTOCOL_BOOT or USB_HID_PROTOCOL_REPORT.
- //
- //*****************************************************************************
- #define USBD_HID_EVENT_SET_PROTOCOL \
- (USBD_HID_EVENT_BASE + 5)
- //*****************************************************************************
- //
- //! This event indicates to an application that a report idle timeout has
- //! occurred and requests a pointer to the report that must be sent back to
- //! the host. The ulMsgData value will contain the requested report ID and
- //! pvMsgData contains a pointer that must be written with a pointer to the
- //! report data that is to be sent. The callback must return the number of
- //! bytes in the report pointed to by *pvMsgData.
- //
- //*****************************************************************************
- #define USBD_HID_EVENT_IDLE_TIMEOUT \
- (USBD_HID_EVENT_BASE + 6)
- extern tDeviceInfo g_sHIDDeviceInfo;
- //*****************************************************************************
- //
- // API Function Prototypes
- //
- //*****************************************************************************
- extern void *USBDHIDInit(unsigned int ulIndex,
- const tUSBDHIDDevice *psHIDDevice);
- extern void *USBDHIDCompositeInit(unsigned int ulIndex,
- const tUSBDHIDDevice *psDevice);
- extern void USBDHIDTerm(void *pvInstance);
- extern void *USBDHIDSetRxCBData(void *pvInstance, void *pvCBData);
- extern void *USBDHIDSetTxCBData(void *pvInstance, void *pvCBData);
- extern unsigned int USBDHIDReportWrite(void *pvInstance,
- unsigned char *pcData,
- unsigned int ulLength,
- tBoolean bLast);
- extern unsigned int USBDHIDPacketRead(void *pvInstance,
- unsigned char *pcData,
- unsigned int ulLength,
- tBoolean bLast);
- extern unsigned int USBDHIDTxPacketAvailable(void *pvInstance);
- extern unsigned int USBDHIDRxPacketAvailable(void *pvInstance);
- extern void USBDHIDPowerStatusSet(void *pvInstance, unsigned char ucPower);
- extern tBoolean USBDHIDRemoteWakeupRequest(void *pvInstance);
- //*****************************************************************************
- //
- // Close the Doxygen group.
- //! @}
- //
- //*****************************************************************************
- //*****************************************************************************
- //
- // Mark the end of the C bindings section for C++ compilers.
- //
- //*****************************************************************************
- #ifdef __cplusplus
- }
- #endif
- #endif // __USBDHID_H__
|