1 /* $NetBSD: ihidev.h,v 1.4 2020/01/09 04:04:01 thorpej Exp $ */ 2 /* $OpenBSD ihidev.h,v 1.4 2016/01/31 18:24:35 jcs Exp $ */ 3 4 /*- 5 * Copyright (c) 2017 The NetBSD Foundation, Inc. 6 * All rights reserved. 7 * 8 * This code is derived from software contributed to The NetBSD Foundation 9 * by Manuel Bouyer. 10 * 11 * Redistribution and use in source and binary forms, with or without 12 * modification, are permitted provided that the following conditions 13 * are met: 14 * 1. Redistributions of source code must retain the above copyright 15 * notice, this list of conditions and the following disclaimer. 16 * 2. Redistributions in binary form must reproduce the above copyright 17 * notice, this list of conditions and the following disclaimer in the 18 * documentation and/or other materials provided with the distribution. 19 * 20 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 21 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 22 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 23 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 24 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 25 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 26 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 27 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 28 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 29 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 30 * POSSIBILITY OF SUCH DAMAGE. 31 */ 32 33 /* 34 * HID-over-i2c driver 35 * 36 * Copyright (c) 2015, 2016 joshua stein <jcs@openbsd.org> 37 * 38 * Permission to use, copy, modify, and distribute this software for any 39 * purpose with or without fee is hereby granted, provided that the above 40 * copyright notice and this permission notice appear in all copies. 41 * 42 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 43 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 44 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 45 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 46 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 47 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 48 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 49 */ 50 51 /* from usbdi.h: Match codes. */ 52 /* First five codes is for a whole device. */ 53 #define IMATCH_VENDOR_PRODUCT_REV 14 54 #define IMATCH_VENDOR_PRODUCT 13 55 #define IMATCH_VENDOR_DEVCLASS_DEVPROTO 12 56 #define IMATCH_DEVCLASS_DEVSUBCLASS_DEVPROTO 11 57 #define IMATCH_DEVCLASS_DEVSUBCLASS 10 58 /* Next six codes are for interfaces. */ 59 #define IMATCH_VENDOR_PRODUCT_REV_CONF_IFACE 9 60 #define IMATCH_VENDOR_PRODUCT_CONF_IFACE 8 61 #define IMATCH_VENDOR_IFACESUBCLASS_IFACEPROTO 7 62 #define IMATCH_VENDOR_IFACESUBCLASS 6 63 #define IMATCH_IFACECLASS_IFACESUBCLASS_IFACEPROTO 5 64 #define IMATCH_IFACECLASS_IFACESUBCLASS 4 65 #define IMATCH_IFACECLASS 3 66 #define IMATCH_IFACECLASS_GENERIC 2 67 /* Generic driver */ 68 #define IMATCH_GENERIC 1 69 /* No match */ 70 #define IMATCH_NONE 0 71 72 #define IHIDBUSCF_REPORTID 0 73 #define IHIDBUSCF_REPORTID_DEFAULT -1 74 75 #define ihidevcf_reportid cf_loc[IHIDBUSCF_REPORTID] 76 #define IHIDEV_UNK_REPORTID IHIDBUSCF_REPORTID_DEFAULT 77 78 /* 5.1.1 - HID Descriptor Format */ 79 struct i2c_hid_desc { 80 uint16_t wHIDDescLength; 81 uint16_t bcdVersion; 82 uint16_t wReportDescLength; 83 uint16_t wReportDescRegister; 84 uint16_t wInputRegister; 85 uint16_t wMaxInputLength; 86 uint16_t wOutputRegister; 87 uint16_t wMaxOutputLength; 88 uint16_t wCommandRegister; 89 uint16_t wDataRegister; 90 uint16_t wVendorID; 91 uint16_t wProductID; 92 uint16_t wVersionID; 93 uint32_t reserved; 94 } __packed; 95 96 struct ihidev_softc { 97 device_t sc_dev; 98 i2c_tag_t sc_tag; 99 i2c_addr_t sc_addr; 100 uint64_t sc_phandle; 101 102 void * sc_ih; 103 void * sc_sih; 104 kmutex_t sc_intr_lock; 105 int sc_intr_type; 106 107 u_int sc_hid_desc_addr; 108 union { 109 uint8_t hid_desc_buf[sizeof(struct i2c_hid_desc)]; 110 struct i2c_hid_desc hid_desc; 111 }; 112 113 uint8_t *sc_report; 114 int sc_reportlen; 115 116 int sc_nrepid; 117 struct ihidev **sc_subdevs; 118 119 u_int sc_isize; 120 u_char *sc_ibuf; 121 122 int sc_refcnt; 123 }; 124 125 struct ihidev { 126 device_t sc_idev; 127 struct ihidev_softc *sc_parent; 128 uint8_t sc_report_id; 129 uint8_t sc_state; 130 #define IHIDEV_OPEN 0x01 /* device is open */ 131 void (*sc_intr)(struct ihidev *, void *, u_int); 132 133 int sc_isize; 134 int sc_osize; 135 int sc_fsize; 136 }; 137 138 struct ihidev_attach_arg { 139 struct i2c_attach_args *iaa; 140 struct ihidev_softc *parent; 141 uint8_t reportid; 142 #define IHIDEV_CLAIM_ALLREPORTID 255 143 }; 144 145 struct i2c_hid_report_request { 146 u_int id; 147 u_int type; 148 #define I2C_HID_REPORT_TYPE_INPUT 0x1 149 #define I2C_HID_REPORT_TYPE_OUTPUT 0x2 150 #define I2C_HID_REPORT_TYPE_FEATURE 0x3 151 void *data; 152 u_int len; 153 }; 154 155 void ihidev_get_report_desc(struct ihidev_softc *, void **, int *); 156 int ihidev_open(struct ihidev *); 157 void ihidev_close(struct ihidev *); 158 159 int ihidev_set_report(device_t, int, int, void *, int); 160 int ihidev_get_report(device_t, int, int, void *, int); 161 int ihidev_report_type_conv(int); 162 163