The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/dev/hid/hidbus.h

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*-
    2  * Copyright (c) 2019 Vladimir Kondratyev <wulf@FreeBSD.org>
    3  *
    4  * Redistribution and use in source and binary forms, with or without
    5  * modification, are permitted provided that the following conditions
    6  * are met:
    7  * 1. Redistributions of source code must retain the above copyright
    8  *    notice, this list of conditions and the following disclaimer.
    9  * 2. Redistributions in binary form must reproduce the above copyright
   10  *    notice, this list of conditions and the following disclaimer in the
   11  *    documentation and/or other materials provided with the distribution.
   12  *
   13  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
   14  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   16  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
   17  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   18  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   19  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   20  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   21  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   22  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   23  * SUCH DAMAGE.
   24  */
   25 
   26 #ifndef _HID_HIDBUS_H_
   27 #define _HID_HIDBUS_H_
   28 
   29 enum {
   30         HIDBUS_IVAR_USAGE,
   31         HIDBUS_IVAR_INDEX,
   32         HIDBUS_IVAR_FLAGS,
   33 #define HIDBUS_FLAG_AUTOCHILD   (0<<1)  /* Child is autodiscovered */
   34 #define HIDBUS_FLAG_CAN_POLL    (1<<1)  /* Child can work during panic */
   35         HIDBUS_IVAR_DRIVER_INFO,
   36         HIDBUS_IVAR_LOCK,
   37 };
   38 
   39 #define HIDBUS_ACCESSOR(A, B, T)                                        \
   40         __BUS_ACCESSOR(hidbus, A, HIDBUS, B, T)
   41 
   42 HIDBUS_ACCESSOR(usage,          USAGE,          int32_t)
   43 HIDBUS_ACCESSOR(index,          INDEX,          uint8_t)
   44 HIDBUS_ACCESSOR(flags,          FLAGS,          uint32_t)
   45 HIDBUS_ACCESSOR(driver_info,    DRIVER_INFO,    uintptr_t)
   46 HIDBUS_ACCESSOR(lock,           LOCK,           struct mtx *)
   47 
   48 /*
   49  * The following structure is used when looking up an HID driver for
   50  * an HID device. It is inspired by the structure called "usb_device_id".
   51  * which is originated in Linux and ported to FreeBSD.
   52  */
   53 struct hid_device_id {
   54 
   55         /* Select which fields to match against */
   56 #if BYTE_ORDER == LITTLE_ENDIAN
   57         uint16_t
   58                 match_flag_page:1,
   59                 match_flag_usage:1,
   60                 match_flag_bus:1,
   61                 match_flag_vendor:1,
   62                 match_flag_product:1,
   63                 match_flag_ver_lo:1,
   64                 match_flag_ver_hi:1,
   65                 match_flag_pnp:1,
   66                 match_flag_unused:8;
   67 #else
   68         uint16_t
   69                 match_flag_unused:8,
   70                 match_flag_pnp:1,
   71                 match_flag_ver_hi:1,
   72                 match_flag_ver_lo:1,
   73                 match_flag_product:1,
   74                 match_flag_vendor:1,
   75                 match_flag_bus:1,
   76                 match_flag_usage:1,
   77                 match_flag_page:1;
   78 #endif
   79 
   80         /* Used for top level collection usage matches */
   81         uint16_t page;
   82         uint16_t usage;
   83 
   84         /* Used for product specific matches; the Version range is inclusive */
   85         uint8_t idBus;
   86         uint16_t idVendor;
   87         uint16_t idProduct;
   88         uint16_t idVersion_lo;
   89         uint16_t idVersion_hi;
   90         char *idPnP;
   91 
   92         /* Hook for driver specific information */
   93         uintptr_t driver_info;
   94 };
   95 
   96 #define HID_STD_PNP_INFO                                        \
   97   "M16:mask;U16:page;U16:usage;U8:bus;U16:vendor;U16:product;"  \
   98   "L16:version;G16:version;Z:_HID"
   99 #define HID_PNP_INFO(table)                     \
  100   MODULE_PNP_INFO(HID_STD_PNP_INFO, hidbus, table, table, nitems(table))
  101 
  102 #define HID_TLC(pg,usg)                         \
  103   .match_flag_page = 1, .match_flag_usage = 1, .page = (pg), .usage = (usg)
  104 
  105 #define HID_BUS(bus)                            \
  106   .match_flag_bus = 1, .idBus = (bus)
  107 
  108 #define HID_VENDOR(vend)                        \
  109   .match_flag_vendor = 1, .idVendor = (vend)
  110 
  111 #define HID_PRODUCT(prod)                       \
  112   .match_flag_product = 1, .idProduct = (prod)
  113 
  114 #define HID_VP(vend,prod)                       \
  115   HID_VENDOR(vend), HID_PRODUCT(prod)
  116 
  117 #define HID_BVP(bus,vend,prod)                  \
  118   HID_BUS(bus), HID_VENDOR(vend), HID_PRODUCT(prod)
  119 
  120 #define HID_BVPI(bus,vend,prod,info)            \
  121   HID_BUS(bus), HID_VENDOR(vend), HID_PRODUCT(prod), HID_DRIVER_INFO(info)
  122 
  123 #define HID_VERSION_GTEQ(lo)    /* greater than or equal */     \
  124   .match_flag_ver_lo = 1, .idVersion_lo = (lo)
  125 
  126 #define HID_VERSION_LTEQ(hi)    /* less than or equal */        \
  127   .match_flag_ver_hi = 1, .idVersion_hi = (hi)
  128 
  129 #define HID_PNP(pnp)                            \
  130   .match_flag_pnp = 1, .idPnP = (pnp)
  131 
  132 #define HID_DRIVER_INFO(n)                      \
  133   .driver_info = (n)
  134 
  135 #define HID_GET_DRIVER_INFO(did)                \
  136   (did)->driver_info
  137 
  138 #define HIDBUS_LOOKUP_ID(d, h)  hidbus_lookup_id((d), (h), nitems(h))
  139 #define HIDBUS_LOOKUP_DRIVER_INFO(d, h)         \
  140         hidbus_lookup_driver_info((d), (h), nitems(h))
  141 
  142 /*
  143  * Walk through all HID items hi belonging Top Level Collection #tlc_index
  144  */
  145 #define HIDBUS_FOREACH_ITEM(hd, hi, tlc_index)                          \
  146         for (uint8_t _iter = 0;                                         \
  147             _iter <= (tlc_index) && hid_get_item((hd), (hi));           \
  148             _iter += (hi)->kind == hid_endcollection && (hi)->collevel == 0) \
  149                 if (_iter == (tlc_index))
  150 
  151 int     hidbus_locate(const void *desc, hid_size_t size, int32_t u,
  152             enum hid_kind k, uint8_t tlc_index, uint8_t index,
  153             struct hid_location *loc, uint32_t *flags, uint8_t *id,
  154             struct hid_absinfo *ai);
  155 bool    hidbus_is_collection(const void *, hid_size_t, int32_t, uint8_t);
  156 
  157 const struct hid_device_id *hidbus_lookup_id(device_t,
  158                     const struct hid_device_id *, int);
  159 struct hid_rdesc_info *hidbus_get_rdesc_info(device_t);
  160 int             hidbus_lookup_driver_info(device_t,
  161                     const struct hid_device_id *, int);
  162 void            hidbus_set_intr(device_t, hid_intr_t*, void *);
  163 int             hidbus_intr_start(device_t);
  164 int             hidbus_intr_stop(device_t);
  165 void            hidbus_intr_poll(device_t);
  166 void            hidbus_set_desc(device_t, const char *);
  167 device_t        hidbus_find_child(device_t, int32_t);
  168 
  169 /* hidbus HID interface */
  170 int     hid_get_report_descr(device_t, void **, hid_size_t *);
  171 int     hid_set_report_descr(device_t, const void *, hid_size_t);
  172 
  173 const struct hid_device_info *hid_get_device_info(device_t);
  174 
  175 extern devclass_t hidbus_devclass;
  176 
  177 #endif  /* _HID_HIDBUS_H_ */

Cache object: 04ce78798847c9669ae359923ac0d67f


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.