xref: /freebsd/sys/dev/hid/hid_if.m (revision c66ec88fed842fbaad62c30d510644ceb7bd2d71)
1#-
2# Copyright (c) 2019 Vladimir Kondratyev
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# $FreeBSD$
26#
27
28#include <sys/param.h>
29#include <sys/bus.h>
30#include <sys/kernel.h>
31#include <sys/malloc.h>
32#include <dev/hid/hid.h>
33
34# Any function listed here can do unbound sleeps waiting for IO to complete.
35
36INTERFACE hid;
37
38# Interrupts interface
39
40#
41# Allocate memory and initialise interrupt transfers.
42# intr callback function which is called if input data is available.
43# context is the private softc pointer, which will be used to callback.
44# rdesc is pointer to structire containing requested maximal sizes of input,
45# output and feature reports.  It is used by hardware transport drivers
46# to determine sizes of internal buffers.
47# This function returns zero upon success. A non-zero return value indicates
48# failure.
49#
50METHOD void intr_setup {
51	device_t dev;
52	hid_intr_t intr;
53	void *context;
54	struct hid_rdesc_info *rdesc;
55};
56
57#
58# Release all allocated resources associated with interrupt transfers.
59#
60METHOD void intr_unsetup {
61	device_t dev;
62};
63
64#
65# Start the interrupt transfers if not already started.
66#
67METHOD int intr_start {
68	device_t dev;
69};
70
71#
72# Stop the interrupt transfers if not already stopped.
73#
74METHOD int intr_stop {
75	device_t dev;
76};
77
78#
79# The following function gets called from the HID keyboard driver
80# when the system has paniced.
81#
82METHOD void intr_poll {
83	device_t dev;
84};
85
86# HID interface
87
88#
89# Read out an report descriptor from the HID device.
90#
91METHOD int get_rdesc {
92	device_t dev;
93	void *data;
94	hid_size_t len;
95};
96
97#
98# Get input data from the device. Data should be read in chunks
99# of the size prescribed by the report descriptor.
100# This function interferes with interrupt transfers and should not be used.
101#
102METHOD int read {
103	device_t dev;
104	void *data;
105	hid_size_t maxlen;
106	hid_size_t *actlen;
107};
108
109#
110# Send data to the device. Data should be written in
111# chunks of the size prescribed by the report descriptor.
112#
113METHOD int write {
114	device_t dev;
115	const void *data;
116	hid_size_t len;
117};
118
119#
120# Get a report from the device without waiting for data on the interrupt.
121# Copies a maximum of len bytes of the report data into the memory specified
122# by data. Upon return actlen is set to the number of bytes copied. The type
123# field indicates which report is requested. It should be HID_INPUT_REPORT,
124# HID_OUTPUT_REPORT, or HID_FEATURE_REPORT. This call may fail if the device
125# does not support this feature.
126#
127METHOD int get_report {
128	device_t dev;
129	void *data;
130	hid_size_t maxlen;
131	hid_size_t *actlen;
132	uint8_t type;
133	uint8_t id;
134};
135
136#
137# Set a report in the device. The type field indicates which report is to be
138# set. It should be HID_INPUT_REPORT, HID_OUTPUT_REPORT, or HID_FEATURE_REPORT.
139# The value of the report is specified by the data and the len fields.
140# This call may fail if the device does not support this feature.
141#
142METHOD int set_report {
143	device_t dev;
144	const void *data;
145	hid_size_t len;
146	uint8_t type;
147	uint8_t id;
148};
149
150#
151# Set duration between input reports (in mSec).
152#
153METHOD int set_idle {
154	device_t dev;
155	uint16_t duration;
156	uint8_t id;
157};
158
159#
160# Switch between the boot protocol and the report protocol (or vice versa).
161#
162METHOD int set_protocol {
163	device_t dev;
164	uint16_t protocol;
165};
166