root/usr/src/uts/common/sys/usb/clients/hidparser/hidparser.h
/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License (the "License").
 * You may not use this file except in compliance with the License.
 *
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
 * or http://www.opensolaris.org/os/licensing.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information: Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 */
/*
 * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
 * Use is subject to license terms.
 */

#ifndef _SYS_USB_HIDPARSER_H
#define _SYS_USB_HIDPARSER_H


#ifdef __cplusplus
extern "C" {
#endif

#include <sys/usb/usbai.h>
#include <sys/usb/usba/usbai_private.h>

/*
 * This file contains interfaces accessible by both the hid driver and
 * a hid module.
 */

/*
 * HID parser handle
 *      The handle is opaque to the hid driver as well as the hid streams
 *      modules.
 */
typedef struct hidparser_handle_impl *hidparser_handle_t;

#define HID_REPORT_ID_UNDEFINED 0


#define USAGE_MAX       100     /* Max no. of usages in a report */

typedef struct hidparser_usage_info {
        uint16_t        usage_page;
        uint16_t        usage_id;
        uint32_t        usage_min;
        uint32_t        usage_max;
        uint32_t        collection_usage;
        int32_t         lmax;
        int32_t         lmin;
        uint32_t        rptcnt;
        uint32_t        rptsz;
} hidparser_usage_info_t;

/*
 * structure for each report type, INPUT, OUTPUT or FEATURE
 * Note report id 0 and only one collection is handled
 */
typedef struct hidparser_rpt {
        uint_t          report_id;
        uint_t          main_item_value;
        uint_t          no_of_usages;
        hidparser_usage_info_t  usage_descr[USAGE_MAX];
} hidparser_rpt_t;

/*
 * structure to return a list of report id used for a report
 * type, INPUT, OUTPUT or FEATURE.
 */
#define REPORT_ID_MAX   10      /* Max no. of report ids supported per type */

typedef struct hidparser_report_id_list {
        uint_t          main_item_value;
        uint_t          no_of_report_ids;
        uint_t          report_id[REPORT_ID_MAX];
} hidparser_report_id_list_t;

typedef struct hidparser_packet_info {
        uint_t          max_packet_size;
        uint_t          report_id;
} hidparser_packet_info_t;

/*
 * hidparser_get_country_code():
 *      Obtain the country code value that was returned in the hid descriptor
 *      Fill in the country_code argument
 *
 * Arguments:
 *      parser_handle:
 *              hid parser handle
 *      country code
 *              filled in with the country code value, upon success
 *
 * Return values:
 *      HIDPARSER_SUCCESS - returned on success
 *      HIDPARSER_FAILURE - returned on an unspecified error
 */
int hidparser_get_country_code(hidparser_handle_t parser_handle,
                                uint16_t *country_code);


/*
 * hidparser_get_packet_size():
 *      Obtain the size(no. of bits) for a particular packet type. Note
 *      that a hid transfer may span more than one USB transaction.
 *
 * Arguments:
 *      parser_handle:
 *              hid parser handle
 *      report_id:
 *              report id
 *      main_item_type:
 *              type of report, either Input, Output, or Feature
 *      size:
 *              the size if filled in upon success
 * Return values:
 *      HIDPARSER_SUCCESS - returned success
 *      HIDPARSER_FAILURE - returned failure
 */
int hidparser_get_packet_size(hidparser_handle_t parser_handle,
                                uint_t report_id,
                                uint_t main_item_type,
                                uint_t *size);

/*
 * hidparser_get_usage_attribute()
 *      Find the specified local item associated with the given usage. For
 *      example, this function may be used to find the logical minimum for
 *      an X usage.  Note that only short items are supported.
 *
 *
 * Arguments:
 *      parser_handle:
 *              hid parser handle
 *      report id:
 *              report id of the particular report that the usage may be
 *              found in.
 *      main_item_type:
 *              type of report, either Input, Output, or Feature
 *      usage_page:
 *              usage page that the Usage may be found on.
 *      usage:
 *              the Usage for which the local item will be found
 *      usage_attribute:
 *              type of local item to be found. Possible local and global
 *              items are given below.
 *
 *      usage_attribute_value:
 *              filled in with the value of the attribute upon return
 *
 * Return values:
 *      HIDPARSER_SUCCESS - returned success
 *      HIDPARSER_NOT_FOUND - usage specified by the parameters was not found
 *      HIDPARSER_FAILURE - unspecified failure
 *
 */
int hidparser_get_usage_attribute(hidparser_handle_t parser_handle,
                                        uint_t report_id,
                                        uint_t main_item_type,
                                        uint_t usage_page,
                                        uint_t usage,
                                        uint_t usage_attribute,
                                        int *usage_attribute_value);

/*
 * hidparser_get_main_item_data_descr()
 *
 * Description:
 *      Query the parser to find the data description of the main item.
 *      Section 6.2.2.5 of the HID 1.0 specification gives details
 *      about the data descriptions. For example, this function may be
 *      used to find out if an X value sent by the a USB mouse is an
 *      absolute or relative value.
 *
 * Parameters:
 *      parser_handle           parser handle
 *      report_id               report id of the particular report that the
 *                              usage may be found in
 *      main_item_type          type of report - either Input, Output, Feature,
 *                              or Collection
 *      usage_page              usage page that the usage may be found on
 *      usage                   type of local item to be found
 *      main_item_descr_value   filled in with the data description
 *
 * Return values:
 *      HIDPARSER_SUCCESS       attribute found successfully
 *      HIDPARSER_NOT_FOUND     usage specified by the parameters was not found
 *      HIDPARSER_FAILURE       unspecified failure
 */
int
hidparser_get_main_item_data_descr(
                        hidparser_handle_t      parser_handle,
                        uint_t          report_id,
                        uint_t          main_item_type,
                        uint_t          usage_page,
                        uint_t          usage,
                        uint_t          *main_item_descr_value);


/*
 * hidparser_get_usage_list_in_order()
 *      Find all the usages corresponding to a main item, report id and
 *      a particular usage page.
 *      Note that only short items and 0 report id is supported.
 *
 * Arguments:
 *      parser_handle:
 *              hid parser handle
 *      report id:
 *              report id of the particular report where the usages belong to
 *      main_item_type:
 *              type of report, either Input, Output, or Feature
 *      usage_list:
 *              Filled in with the pointer to the first element of the
 *              usage list
 *
 * Return values:
 *      HIDPARSER_SUCCESS - returned success
 *      HIDPARSER_NOT_FOUND - usage specified by the parameters was not found
 *      HIDPARSER_FAILURE - unspecified failure
 */
int
hidparser_get_usage_list_in_order(hidparser_handle_t parse_handle,
                                uint_t report_id,
                                uint_t main_item_type,
                                hidparser_rpt_t *rpt);


/*
 * hidparser_get_report_id_list()
 *      Return a list of all report ids used for descriptor items
 *      corresponding to a main item.
 *
 * Arguments:
 *      parser_handle:
 *              hid parser handle
 *      main_item_type:
 *              type of report, either Input, Output, or Feature
 *      report_id_list:
 *              Filled in with a list of report ids found in the descriptor
 *
 * Return values:
 *      HIDPARSER_SUCCESS - returned success
 *      HIDPARSER_FAILURE - unspecified failure
 */
int
hidparser_get_report_id_list(hidparser_handle_t parser_handle,
    uint_t main_item_type, hidparser_report_id_list_t *report_id_list);

/*
 * hidparser_find_max_packet_size_from_report_descriptor()
 *      Returns the packet size of the largest report in the complete
 *      report descriptor.
 *
 * Arguments
 *      parser_handle:
 *              hidparser_handle_t
 *      packet_info:
 *              hidparser_packet_info_t *
 */
void
hidparser_find_max_packet_size_from_report_descriptor(
    hidparser_handle_t parser_handle, hidparser_packet_info_t *hpack);



/*
 * Local Items
 *      See section 6.2.2.8 of the HID 1.0 specification for
 *      more details.
 */
#define HIDPARSER_ITEM_USAGE            0x08
#define HIDPARSER_ITEM_USAGE_MIN        0x18
#define HIDPARSER_ITEM_USAGE_MAX        0x28
#define HIDPARSER_ITEM_DESIGNATOR_INDEX 0x38
#define HIDPARSER_ITEM_DESIGNATOR_MIN   0x48
#define HIDPARSER_ITEM_DESIGNATOR_MAX   0x58
#define HIDPARSER_ITEM_STRING_INDEX     0x78
#define HIDPARSER_ITEM_STRING_MIN       0x88
#define HIDPARSER_ITEM_STRING_MAX       0x98

/*
 * Global Items
 *      See section 6.2.2.7 of the HID 1.0 specifations for
 *      more details.
 */
#define HIDPARSER_ITEM_LOGICAL_MINIMUM  0x14
#define HIDPARSER_ITEM_LOGICAL_MAXIMUM  0x24
#define HIDPARSER_ITEM_PHYSICAL_MINIMUM 0x34
#define HIDPARSER_ITEM_PHYSICAL_MAXIMUM 0x44
#define HIDPARSER_ITEM_EXPONENT         0x54
#define HIDPARSER_ITEM_UNIT             0x64
#define HIDPARSER_ITEM_REPORT_SIZE      0x74
#define HIDPARSER_ITEM_REPORT_ID        0x84
#define HIDPARSER_ITEM_REPORT_COUNT     0x94

/*
 * Main Items
 *      See section 6.2.2.5 of the HID 1.0 specification for
 *      more details.
 */
#define HIDPARSER_ITEM_INPUT            0x80
#define HIDPARSER_ITEM_OUTPUT           0x90
#define HIDPARSER_ITEM_FEATURE          0xB0
#define HIDPARSER_ITEM_COLLECTION       0xA0


/*
 * Macros to extract the usage page and usage id from a 32 bit usage
 * value.
 */
#define HID_USAGE_ID(usage)             ((usage) & 0xffff)
#define HID_USAGE_PAGE(usage)           ((usage)>>16 & 0xffff)
#define HID_BUILD_USAGE(page, id)       (((page) & 0xffff) << 16 | \
                                        ((id) & 0xffff))

/*
 * Usage Pages
 *      See the "Universal Serial Bus HID Usages Table"
 *      specification for more information
 */
#define HID_GENERIC_DESKTOP             0x01
#define HID_KEYBOARD_KEYPAD_KEYS        0x07
#define HID_LEDS                        0x08
#define HID_CONSUMER                    0x0C
#define HID_BUTTON_PAGE                 0x09

/*
 * Any Usage Page
 *      See the "Universal Serial Bus HID Usages Table"
 *      specification for more information
 */
#define HID_USAGE_UNDEFINED     0x00

/*
 * Generic Desktop Page (0x01)
 *      See the "Universal Serial Bus HID Usages Table"
 *      specification for more information
 */
#define HID_GD_POINTER          0x01
#define HID_GD_MOUSE            0x02
#define HID_GD_KEYBOARD         0x06
#define HID_GD_X                0x30
#define HID_GD_Y                0x31
#define HID_GD_Z                0x32
#define HID_GD_WHEEL            0x38

/*
 * LED Page (0x08)
 *      See the "Universal Serial Bus HID Usages Table"
 *      specification for more information
 */
#define HID_LED_NUM_LOCK        0x01
#define HID_LED_CAPS_LOCK       0x02
#define HID_LED_SCROLL_LOCK     0x03
#define HID_LED_COMPOSE         0x04
#define HID_LED_KANA            0x05

/*
 * Consumer page (0x0C)
 *      See the "Universal Serial Bus HID Usages Table"
 *      specification for more information
 */
#define HID_CONSUMER_CONTROL    0x01
#define HID_CONSUMER_MICROPHONE 0x04
#define HID_CONSUMER_HEADPHONE  0x05
#define HID_CONSUMER_GRAPHIC_EQ 0x06
#define HID_CONSUMER_PLAY       0xB0
#define HID_CONSUMER_RECORD     0xB2
#define HID_CONSUMER_VOL        0xE0
#define HID_CONSUMER_BALANCE    0xE1
#define HID_CONSUMER_MUTE       0xE2
#define HID_CONSUMER_BASS       0xE3
#define HID_CONSUMER_TREBLE     0xE4
#define HID_CONSUMER_VOL_INCR   0xE9
#define HID_CONSUMER_VOL_DECR   0xEA
#define HID_CONSUMER_BAL_RIGHT  0x150
#define HID_CONSUMER_BAL_LEFT   0x151
#define HID_CONSUMER_BASS_INCR  0x152
#define HID_CONSUMER_BASS_DECR  0x153
#define HID_CONSUMER_TREBLE_INCR 0x154
#define HID_CONSUMER_TREBLE_DECR 0x155


/*
 * Main Item Data Descriptor Information for
 *      Input, Output, and Feature Main Items
 *      See section 6.2.2.5 of the HID 1.0 specification for
 *      more details.
 */


#define HID_MAIN_ITEM_DATA              0x0000
#define HID_MAIN_ITEM_CONSTANT          0x0001
#define HID_MAIN_ITEM_ARRAY             0x0000
#define HID_MAIN_ITEM_VARIABLE          0x0002
#define HID_MAIN_ITEM_ABSOLUTE          0x0000
#define HID_MAIN_ITEM_RELATIVE          0x0004
#define HID_MAIN_ITEM_NO_WRAP           0x0000
#define HID_MAIN_ITEM_WRAP              0x0008
#define HID_MAIN_ITEM_LINEAR            0x0000
#define HID_MAIN_ITEM_NONLINEAR         0x0010
#define HID_MAIN_ITEM_PREFERRED         0x0000
#define HID_MAIN_ITEM_NO_PREFERRED      0x0020
#define HID_MAIN_ITEM_NO_NULL           0x0000
#define HID_MAIN_ITEM_NULL              0x0040
#define HID_MAIN_ITEM_NON_VOLATILE      0x0000
#define HID_MAIN_ITEM_VOLATILE          0x0080
#define HID_MAIN_ITEM_BIT_FIELD         0x0000
#define HID_MAIN_ITEM_BUFFERED_BYTE     0x0100

/*
 * Main Item Data Descriptor Information for
 *      Collection Main Items
 *      See section 6.2.2.4 of the HID 1.0 specification for
 *      more details.
 */
#define HID_MAIN_ITEM_PHYSICAL          0x0000
#define HID_MAIN_ITEM_APPLICATION       0x0001
#define HID_MAIN_ITEM_LOGICAL           0x0002


/*
 * Other
 */
#define HIDPARSER_SUCCESS       0
#define HIDPARSER_FAILURE       1
#define HIDPARSER_NOT_FOUND     2

#ifdef __cplusplus
}
#endif

#endif  /* _SYS_USB_HIDPARSER_H */