Remove the old libusbhid copy from os-support/bsd.
This has been replaced by in-kernel support for USB mices several years ago and hasn't been enabled in build since X.Org 6.8.
This commit is contained in:
		
							parent
							
								
									76fcfc4801
								
							
						
					
					
						commit
						bc0c7075e2
					
				|  | @ -1,7 +1,5 @@ | |||
| noinst_LTLIBRARIES = libbsd.la | ||||
| 
 | ||||
| # FIXME: Add USB mouse support?
 | ||||
| 
 | ||||
| # APM support.
 | ||||
| if BSD_KQUEUE_APM | ||||
| APM_SOURCES = $(srcdir)/bsd_kqueue_apm.c | ||||
|  | @ -78,14 +76,4 @@ libbsd_la_SOURCES = \ | |||
| 
 | ||||
| # FIXME: Add these files to the build as needed
 | ||||
| EXTRA_DIST = \
 | ||||
| 	bsd_apm.c \
 | ||||
| 	bsd_kqueue_apm.c \
 | ||||
| 	memrange.h \
 | ||||
| 	libusb/data.c \
 | ||||
| 	libusb/descr.c \
 | ||||
| 	libusb/parse.c \
 | ||||
| 	libusb/usage.c \
 | ||||
| 	libusb/usb.3 \
 | ||||
| 	libusb/usb.h \
 | ||||
| 	libusb/usb_hid_usages \
 | ||||
| 	libusb/usbvar.h | ||||
| 	memrange.h | ||||
|  |  | |||
|  | @ -1,92 +0,0 @@ | |||
| /*
 | ||||
|  * Copyright (c) 1999 Lennart Augustsson <augustss@netbsd.org> | ||||
|  * All rights reserved. | ||||
|  * | ||||
|  * Redistribution and use in source and binary forms, with or without | ||||
|  * modification, are permitted provided that the following conditions | ||||
|  * are met: | ||||
|  * 1. Redistributions of source code must retain the above copyright | ||||
|  *    notice, this list of conditions and the following disclaimer. | ||||
|  * 2. Redistributions in binary form must reproduce the above copyright | ||||
|  *    notice, this list of conditions and the following disclaimer in the | ||||
|  *    documentation and/or other materials provided with the distribution. | ||||
|  * | ||||
|  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND | ||||
|  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||
|  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||
|  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE | ||||
|  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | ||||
|  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | ||||
|  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | ||||
|  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | ||||
|  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | ||||
|  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | ||||
|  * SUCH DAMAGE. | ||||
|  */ | ||||
| 
 | ||||
| #ifdef HAVE_XORG_CONFIG_H | ||||
| #include <xorg-config.h> | ||||
| #endif | ||||
| 
 | ||||
| #include <assert.h> | ||||
| #include <stdlib.h> | ||||
| #include "usb.h" | ||||
| 
 | ||||
| int | ||||
| hid_get_data(void *p, hid_item_t *h) | ||||
| { | ||||
| 	unsigned char *buf; | ||||
| 	unsigned int hpos; | ||||
| 	unsigned int hsize; | ||||
| 	int data; | ||||
| 	int i, end, offs; | ||||
| 
 | ||||
| 	_DIAGASSERT(p != NULL); | ||||
| 	_DIAGASSERT(h != NULL); | ||||
| 
 | ||||
| 	buf = p; | ||||
| 	hpos = h->pos;			/* bit position of data */ | ||||
| 	hsize = h->report_size;		/* bit length of data */ | ||||
| 
 | ||||
| 	if (hsize == 0) | ||||
| 		return (0); | ||||
| 	offs = hpos / 8; | ||||
| 	end = (hpos + hsize) / 8 - offs; | ||||
| 	data = 0; | ||||
| 	for (i = 0; i <= end; i++) | ||||
| 		data |= buf[offs + i] << (i*8); | ||||
| 	data >>= hpos % 8; | ||||
| 	data &= (1 << hsize) - 1; | ||||
| 	if (h->logical_minimum < 0) { | ||||
| 		/* Need to sign extend */ | ||||
| 		hsize = sizeof data * 8 - hsize; | ||||
| 		data = (data << hsize) >> hsize; | ||||
| 	} | ||||
| 	return (data); | ||||
| } | ||||
| 
 | ||||
| void | ||||
| hid_set_data(void *p, hid_item_t *h, int data) | ||||
| { | ||||
| 	unsigned char *buf; | ||||
| 	unsigned int hpos; | ||||
| 	unsigned int hsize; | ||||
| 	int i, end, offs; | ||||
| 
 | ||||
| 	_DIAGASSERT(p != NULL); | ||||
| 	_DIAGASSERT(h != NULL); | ||||
| 
 | ||||
| 	buf = p; | ||||
| 	hpos = h->pos;			/* bit position of data */ | ||||
| 	hsize = h->report_size;		/* bit length of data */ | ||||
| 
 | ||||
| 	if (hsize != 32) | ||||
| 		data &= (1 << hsize) - 1; | ||||
| 	data <<= (hpos % 8); | ||||
| 
 | ||||
| 	offs = hpos / 8; | ||||
| 	end = (hpos + hsize) / 8 - offs; | ||||
| 	data = 0; | ||||
| 	for (i = 0; i <= end; i++) | ||||
| 		buf[offs + i] |= (data >> (i*8)) & 0xff; | ||||
| } | ||||
|  | @ -1,73 +0,0 @@ | |||
| /*
 | ||||
|  * Copyright (c) 1999 Lennart Augustsson <augustss@netbsd.org> | ||||
|  * All rights reserved. | ||||
|  * | ||||
|  * Redistribution and use in source and binary forms, with or without | ||||
|  * modification, are permitted provided that the following conditions | ||||
|  * are met: | ||||
|  * 1. Redistributions of source code must retain the above copyright | ||||
|  *    notice, this list of conditions and the following disclaimer. | ||||
|  * 2. Redistributions in binary form must reproduce the above copyright | ||||
|  *    notice, this list of conditions and the following disclaimer in the | ||||
|  *    documentation and/or other materials provided with the distribution. | ||||
|  * | ||||
|  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND | ||||
|  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||
|  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||
|  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE | ||||
|  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | ||||
|  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | ||||
|  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | ||||
|  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | ||||
|  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | ||||
|  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | ||||
|  * SUCH DAMAGE. | ||||
|  */ | ||||
| 
 | ||||
| #ifdef HAVE_XORG_CONFIG_H | ||||
| #include <xorg-config.h> | ||||
| #endif | ||||
| 
 | ||||
| #include <sys/types.h> | ||||
| 
 | ||||
| #include <assert.h> | ||||
| #include <errno.h> | ||||
| #include <stdlib.h> | ||||
| #include <string.h> | ||||
| #include <unistd.h> | ||||
| #include <sys/time.h> | ||||
| 
 | ||||
| #include <dev/usb/usb.h> | ||||
| 
 | ||||
| #include "usb.h" | ||||
| #include "usbvar.h" | ||||
| 
 | ||||
| report_desc_t | ||||
| hid_get_report_desc(fd) | ||||
| 	int fd; | ||||
| { | ||||
| 	struct usb_ctl_report_desc rep; | ||||
| 	report_desc_t r; | ||||
| 
 | ||||
| 	_DIAGASSERT(fd != -1); | ||||
| 
 | ||||
| 	rep.size = 0; | ||||
| 	if (ioctl(fd, USB_GET_REPORT_DESC, &rep) < 0) | ||||
| 		return (0); | ||||
| 	r = malloc(sizeof *r + rep.size); | ||||
| 	if (r == 0) { | ||||
| 		errno = ENOMEM; | ||||
| 		return (0); | ||||
| 	} | ||||
| 	r->size = rep.size; | ||||
| 	memcpy(r->data, rep.data, (unsigned int)rep.size); | ||||
| 	return (r); | ||||
| } | ||||
| 
 | ||||
| void | ||||
| hid_dispose_report_desc(r) | ||||
| 	report_desc_t r; | ||||
| { | ||||
| 
 | ||||
| 	free(r); | ||||
| } | ||||
|  | @ -1,400 +0,0 @@ | |||
| /*
 | ||||
|  * Copyright (c) 1999 Lennart Augustsson <augustss@netbsd.org> | ||||
|  * All rights reserved. | ||||
|  * | ||||
|  * Redistribution and use in source and binary forms, with or without | ||||
|  * modification, are permitted provided that the following conditions | ||||
|  * are met: | ||||
|  * 1. Redistributions of source code must retain the above copyright | ||||
|  *    notice, this list of conditions and the following disclaimer. | ||||
|  * 2. Redistributions in binary form must reproduce the above copyright | ||||
|  *    notice, this list of conditions and the following disclaimer in the | ||||
|  *    documentation and/or other materials provided with the distribution. | ||||
|  * | ||||
|  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND | ||||
|  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||
|  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||
|  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE | ||||
|  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | ||||
|  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | ||||
|  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | ||||
|  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | ||||
|  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | ||||
|  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | ||||
|  * SUCH DAMAGE. | ||||
|  */ | ||||
| 
 | ||||
| #ifdef HAVE_XORG_CONFIG_H | ||||
| #include <xorg-config.h> | ||||
| #endif | ||||
| 
 | ||||
| #include <assert.h> | ||||
| #include <stdlib.h> | ||||
| #include <string.h> | ||||
| #include <sys/time.h> | ||||
| 
 | ||||
| #include <dev/usb/usb.h> | ||||
| #include <dev/usb/usbhid.h> | ||||
| 
 | ||||
| #include "usb.h" | ||||
| #include "usbvar.h" | ||||
| 
 | ||||
| #define MAXUSAGE 100 | ||||
| struct hid_data { | ||||
| 	u_char *start; | ||||
| 	u_char *end; | ||||
| 	u_char *p; | ||||
| 	hid_item_t cur; | ||||
| 	unsigned int usages[MAXUSAGE]; | ||||
| 	int nusage; | ||||
| 	int minset; | ||||
| 	int multi; | ||||
| 	int multimax; | ||||
| 	int kindset; | ||||
| }; | ||||
| 
 | ||||
| static int min(int x, int y) { return x < y ? x : y; } | ||||
| 
 | ||||
| static void | ||||
| hid_clear_local(hid_item_t *c) | ||||
| { | ||||
| 
 | ||||
| 	_DIAGASSERT(c != NULL); | ||||
| 
 | ||||
| 	c->usage = 0; | ||||
| 	c->usage_minimum = 0; | ||||
| 	c->usage_maximum = 0; | ||||
| 	c->designator_index = 0; | ||||
| 	c->designator_minimum = 0; | ||||
| 	c->designator_maximum = 0; | ||||
| 	c->string_index = 0; | ||||
| 	c->string_minimum = 0; | ||||
| 	c->string_maximum = 0; | ||||
| 	c->set_delimiter = 0; | ||||
| } | ||||
| 
 | ||||
| hid_data_t | ||||
| hid_start_parse(report_desc_t d, int kindset) | ||||
| { | ||||
| 	struct hid_data *s; | ||||
| 
 | ||||
| 	_DIAGASSERT(d != NULL); | ||||
| 
 | ||||
| 	s = calloc(1, sizeof *s); | ||||
| 	s->start = s->p = d->data; | ||||
| 	s->end = d->data + d->size; | ||||
| 	s->kindset = kindset; | ||||
| 	return (s); | ||||
| } | ||||
| 
 | ||||
| void | ||||
| hid_end_parse(hid_data_t s) | ||||
| { | ||||
| 
 | ||||
| 	_DIAGASSERT(s != NULL); | ||||
| 
 | ||||
| 	while (s->cur.next) { | ||||
| 		hid_item_t *hi = s->cur.next->next; | ||||
| 		free(s->cur.next); | ||||
| 		s->cur.next = hi; | ||||
| 	} | ||||
| 	free(s); | ||||
| } | ||||
| 
 | ||||
| int | ||||
| hid_get_item(hid_data_t s, hid_item_t *h) | ||||
| { | ||||
| 	hid_item_t *c; | ||||
| 	unsigned int bTag = 0, bType = 0, bSize; | ||||
| 	unsigned char *data; | ||||
| 	int dval; | ||||
| 	unsigned char *p; | ||||
| 	hid_item_t *hi; | ||||
| 	int i; | ||||
| 
 | ||||
| 	_DIAGASSERT(s != NULL); | ||||
| 	_DIAGASSERT(h != NULL); | ||||
| 
 | ||||
| 	c = &s->cur; | ||||
| 
 | ||||
|  top: | ||||
| 	if (s->multimax) { | ||||
| 		if (s->multi < s->multimax) { | ||||
| 			c->usage = s->usages[min(s->multi, s->nusage-1)]; | ||||
| 			s->multi++; | ||||
| 			*h = *c; | ||||
| 			c->pos += c->report_size; | ||||
| 			h->next = 0; | ||||
| 			return (1); | ||||
| 		} else { | ||||
| 			c->report_count = s->multimax; | ||||
| 			s->multimax = 0; | ||||
| 			s->nusage = 0; | ||||
| 			hid_clear_local(c); | ||||
| 		} | ||||
| 	} | ||||
| 	for (;;) { | ||||
| 		p = s->p; | ||||
| 		if (p >= s->end) | ||||
| 			return (0); | ||||
| 
 | ||||
| 		bSize = *p++; | ||||
| 		if (bSize == 0xfe) { | ||||
| 			/* long item */ | ||||
| 			bSize = *p++; | ||||
| 			bSize |= *p++ << 8; | ||||
| 			bTag = *p++; | ||||
| 			data = p; | ||||
| 			p += bSize; | ||||
| 		} else { | ||||
| 			/* short item */ | ||||
| 			bTag = bSize >> 4; | ||||
| 			bType = (bSize >> 2) & 3; | ||||
| 			bSize &= 3; | ||||
| 			if (bSize == 3) bSize = 4; | ||||
| 			data = p; | ||||
| 			p += bSize; | ||||
| 		} | ||||
| 		s->p = p; | ||||
| 		/*
 | ||||
| 		 * The spec is unclear if the data is signed or unsigned. | ||||
| 		 */ | ||||
| 		switch(bSize) { | ||||
| 		case 0: | ||||
| 			dval = 0; | ||||
| 			break; | ||||
| 		case 1: | ||||
| 			dval = (int8_t)*data++; | ||||
| 			break; | ||||
| 		case 2: | ||||
| 			dval = *data++; | ||||
| 			dval |= *data++ << 8; | ||||
| 			dval = (int16_t)dval; | ||||
| 			break; | ||||
| 		case 4: | ||||
| 			dval = *data++; | ||||
| 			dval |= *data++ << 8; | ||||
| 			dval |= *data++ << 16; | ||||
| 			dval |= *data++ << 24; | ||||
| 			break; | ||||
| 		default: | ||||
| 			return (-1); | ||||
| 		} | ||||
| 
 | ||||
| 		switch (bType) { | ||||
| 		case 0:			/* Main */ | ||||
| 			switch (bTag) { | ||||
| 			case 8:		/* Input */ | ||||
| 				if (!(s->kindset & (1 << hid_input))) | ||||
| 					continue; | ||||
| 				c->kind = hid_input; | ||||
| 				c->flags = dval; | ||||
| 			ret: | ||||
| 				if (c->flags & HIO_VARIABLE) { | ||||
| 					s->multimax = c->report_count; | ||||
| 					s->multi = 0; | ||||
| 					c->report_count = 1; | ||||
| 					if (s->minset) { | ||||
| 						for (i = c->usage_minimum; | ||||
| 						     i <= c->usage_maximum; | ||||
| 						     i++) { | ||||
| 							s->usages[s->nusage] = i; | ||||
| 							if (s->nusage < MAXUSAGE-1) | ||||
| 								s->nusage++; | ||||
| 						} | ||||
| 						s->minset = 0; | ||||
| 					} | ||||
| 					goto top; | ||||
| 				} else { | ||||
| 					if (s->minset) | ||||
| 						c->usage = c->usage_minimum; | ||||
| 					*h = *c; | ||||
| 					h->next = 0; | ||||
| 					c->pos += c->report_size * c->report_count; | ||||
| 					hid_clear_local(c); | ||||
| 					s->minset = 0; | ||||
| 					return (1); | ||||
| 				} | ||||
| 			case 9:		/* Output */ | ||||
| 				if (!(s->kindset & (1 << hid_output))) | ||||
| 					continue; | ||||
| 				c->kind = hid_output; | ||||
| 				c->flags = dval; | ||||
| 				goto ret; | ||||
| 			case 10:	/* Collection */ | ||||
| 				c->kind = hid_collection; | ||||
| 				c->collection = dval; | ||||
| 				c->collevel++; | ||||
| 				*h = *c; | ||||
| 				hid_clear_local(c); | ||||
| 				s->nusage = 0; | ||||
| 				return (1); | ||||
| 			case 11:	/* Feature */ | ||||
| 				if (!(s->kindset & (1 << hid_feature))) | ||||
| 					continue; | ||||
| 				c->kind = hid_feature; | ||||
| 				c->flags = dval; | ||||
| 				goto ret; | ||||
| 			case 12:	/* End collection */ | ||||
| 				c->kind = hid_endcollection; | ||||
| 				c->collevel--; | ||||
| 				*h = *c; | ||||
| 				hid_clear_local(c); | ||||
| 				s->nusage = 0; | ||||
| 				return (1); | ||||
| 			default: | ||||
| 				return (-2); | ||||
| 			} | ||||
| 
 | ||||
| 		case 1:		/* Global */ | ||||
| 			switch (bTag) { | ||||
| 			case 0: | ||||
| 				c->_usage_page = dval << 16; | ||||
| 				break; | ||||
| 			case 1: | ||||
| 				c->logical_minimum = dval; | ||||
| 				break; | ||||
| 			case 2: | ||||
| 				c->logical_maximum = dval; | ||||
| 				break; | ||||
| 			case 3: | ||||
| 				c->physical_maximum = dval; | ||||
| 				break; | ||||
| 			case 4: | ||||
| 				c->physical_maximum = dval; | ||||
| 				break; | ||||
| 			case 5: | ||||
| 				c->unit_exponent = dval; | ||||
| 				break; | ||||
| 			case 6: | ||||
| 				c->unit = dval; | ||||
| 				break; | ||||
| 			case 7: | ||||
| 				c->report_size = dval; | ||||
| 				break; | ||||
| 			case 8: | ||||
| 				c->report_ID = dval; | ||||
| 				break; | ||||
| 			case 9: | ||||
| 				c->report_count = dval; | ||||
| 				break; | ||||
| 			case 10: /* Push */ | ||||
| 				hi = malloc(sizeof *hi); | ||||
| 				*hi = s->cur; | ||||
| 				c->next = hi; | ||||
| 				break; | ||||
| 			case 11: /* Pop */ | ||||
| 				hi = c->next; | ||||
| 				s->cur = *hi; | ||||
| 				free(hi); | ||||
| 				break; | ||||
| 			default: | ||||
| 				return (-3); | ||||
| 			} | ||||
| 			break; | ||||
| 		case 2:		/* Local */ | ||||
| 			switch (bTag) { | ||||
| 			case 0: | ||||
| 				if (bSize == 1) | ||||
| 					dval = c->_usage_page | (dval&0xff); | ||||
| 				else if (bSize == 2) | ||||
| 					dval = c->_usage_page | (dval&0xffff); | ||||
| 				c->usage = dval; | ||||
| 				if (s->nusage < MAXUSAGE) | ||||
| 					s->usages[s->nusage++] = dval; | ||||
| 				/* else XXX */ | ||||
| 				break; | ||||
| 			case 1: | ||||
| 				s->minset = 1; | ||||
| 				if (bSize == 1) | ||||
| 					dval = c->_usage_page | (dval&0xff); | ||||
| 				else if (bSize == 2) | ||||
| 					dval = c->_usage_page | (dval&0xffff); | ||||
| 				c->usage_minimum = dval; | ||||
| 				break; | ||||
| 			case 2: | ||||
| 				if (bSize == 1) | ||||
| 					dval = c->_usage_page | (dval&0xff); | ||||
| 				else if (bSize == 2) | ||||
| 					dval = c->_usage_page | (dval&0xffff); | ||||
| 				c->usage_maximum = dval; | ||||
| 				break; | ||||
| 			case 3: | ||||
| 				c->designator_index = dval; | ||||
| 				break; | ||||
| 			case 4: | ||||
| 				c->designator_minimum = dval; | ||||
| 				break; | ||||
| 			case 5: | ||||
| 				c->designator_maximum = dval; | ||||
| 				break; | ||||
| 			case 7: | ||||
| 				c->string_index = dval; | ||||
| 				break; | ||||
| 			case 8: | ||||
| 				c->string_minimum = dval; | ||||
| 				break; | ||||
| 			case 9: | ||||
| 				c->string_maximum = dval; | ||||
| 				break; | ||||
| 			case 10: | ||||
| 				c->set_delimiter = dval; | ||||
| 				break; | ||||
| 			default: | ||||
| 				return (-4); | ||||
| 			} | ||||
| 			break; | ||||
| 		default: | ||||
| 			return (-5); | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| int | ||||
| hid_report_size(report_desc_t r, enum hid_kind k, int *idp) | ||||
| { | ||||
| 	struct hid_data *d; | ||||
| 	hid_item_t h; | ||||
| 	int size, id; | ||||
| 
 | ||||
| 	_DIAGASSERT(r != NULL); | ||||
| 	/* idp may be NULL */ | ||||
| 
 | ||||
| 	id = 0; | ||||
| 	if (idp) | ||||
| 		*idp = 0; | ||||
| 	memset(&h, 0, sizeof h); | ||||
| 	for (d = hid_start_parse(r, 1<<k); hid_get_item(d, &h); ) { | ||||
| 		if (h.report_ID != 0) { | ||||
| 			if (idp) | ||||
| 				*idp = h.report_ID; | ||||
| 			id = 8; | ||||
| 		} | ||||
| 	} | ||||
| 	hid_end_parse(d); | ||||
| 	size = h.pos + id; | ||||
| 	return ((size + 7) / 8); | ||||
| } | ||||
| 
 | ||||
| int | ||||
| hid_locate(desc, u, k, h) | ||||
| 	report_desc_t desc; | ||||
| 	unsigned int u; | ||||
| 	enum hid_kind k; | ||||
| 	hid_item_t *h; | ||||
| { | ||||
| 	hid_data_t d; | ||||
| 
 | ||||
| 	_DIAGASSERT(desc != NULL); | ||||
| 	_DIAGASSERT(h != NULL); | ||||
| 
 | ||||
| 	for (d = hid_start_parse(desc, 1<<k); hid_get_item(d, h); ) { | ||||
| 		if (h->kind == k && !(h->flags & HIO_CONST) && h->usage == u) { | ||||
| 			hid_end_parse(d); | ||||
| 			return (1); | ||||
| 		} | ||||
| 	} | ||||
| 	hid_end_parse(d); | ||||
| 	h->report_size = 0; | ||||
| 	return (0); | ||||
| } | ||||
|  | @ -1,196 +0,0 @@ | |||
| /*
 | ||||
|  * Copyright (c) 1999 Lennart Augustsson <augustss@netbsd.org> | ||||
|  * All rights reserved. | ||||
|  * | ||||
|  * Redistribution and use in source and binary forms, with or without | ||||
|  * modification, are permitted provided that the following conditions | ||||
|  * are met: | ||||
|  * 1. Redistributions of source code must retain the above copyright | ||||
|  *    notice, this list of conditions and the following disclaimer. | ||||
|  * 2. Redistributions in binary form must reproduce the above copyright | ||||
|  *    notice, this list of conditions and the following disclaimer in the | ||||
|  *    documentation and/or other materials provided with the distribution. | ||||
|  * | ||||
|  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND | ||||
|  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||
|  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||
|  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE | ||||
|  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | ||||
|  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | ||||
|  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | ||||
|  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | ||||
|  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | ||||
|  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | ||||
|  * SUCH DAMAGE. | ||||
|  */ | ||||
| 
 | ||||
| #ifdef HAVE_XORG_CONFIG_H | ||||
| #include <xorg-config.h> | ||||
| #endif | ||||
| 
 | ||||
| #include <ctype.h> | ||||
| #include <err.h> | ||||
| #include <stdio.h> | ||||
| #include <stdlib.h> | ||||
| #include <string.h> | ||||
| 
 | ||||
| #include "usb.h" | ||||
| 
 | ||||
| #define _PATH_HIDTABLE "/usr/share/misc/usb_hid_usages" | ||||
| 
 | ||||
| struct usage_in_page { | ||||
| 	char *name; | ||||
| 	int usage; | ||||
| }; | ||||
| 
 | ||||
| static struct usage_page { | ||||
| 	char *name; | ||||
| 	int usage; | ||||
| 	struct usage_in_page *page_contents; | ||||
| 	int pagesize, pagesizemax; | ||||
| } *pages; | ||||
| static int npages, npagesmax; | ||||
| 
 | ||||
| #ifdef DEBUG | ||||
| void | ||||
| dump_hid_table(void) | ||||
| { | ||||
| 	int i, j; | ||||
| 
 | ||||
| 	for (i = 0; i < npages; i++) { | ||||
| 		printf("%d\t%s\n", pages[i].usage, pages[i].name); | ||||
| 		for (j = 0; j < pages[i].pagesize; j++) { | ||||
| 			printf("\t%d\t%s\n", pages[i].page_contents[j].usage, | ||||
| 			       pages[i].page_contents[j].name); | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| void | ||||
| hid_init(char *hidname) | ||||
| { | ||||
| 	FILE *f; | ||||
| 	char line[100], name[100], *p, *n; | ||||
| 	int no; | ||||
| 	int lineno; | ||||
| 	struct usage_page *curpage = 0; | ||||
| 
 | ||||
| 	if (hidname == 0) | ||||
| 		hidname = _PATH_HIDTABLE; | ||||
| 
 | ||||
| 	f = fopen(hidname, "r"); | ||||
| 	if (f == NULL) | ||||
| 		err(1, "%s", hidname); | ||||
| 	for (lineno = 1; ; lineno++) { | ||||
| 		if (fgets(line, sizeof line, f) == NULL) | ||||
| 			break; | ||||
| 		if (line[0] == '#') | ||||
| 			continue; | ||||
| 		for (p = line; *p && isspace(*p); p++) | ||||
| 			; | ||||
| 		if (!*p) | ||||
| 			continue; | ||||
| 		if (sscanf(line, " * %[^\n]", name) == 1) | ||||
| 			no = -1; | ||||
| 		else if (sscanf(line, " 0x%x %[^\n]", &no, name) != 2 && | ||||
| 			 sscanf(line, " %d %[^\n]", &no, name) != 2) | ||||
| 			errx(1, "file %s, line %d, syntax error\n", | ||||
| 			     hidname, lineno); | ||||
| 		for (p = name; *p; p++) | ||||
| 			if (isspace(*p) || *p == '.') | ||||
| 				*p = '_'; | ||||
| 		n = strdup(name); | ||||
| 		if (!n) | ||||
| 			err(1, "strdup"); | ||||
| 		if (isspace(line[0])) { | ||||
| 			if (!curpage) | ||||
| 				errx(1, "file %s, line %d, syntax error\n", | ||||
| 				     hidname, lineno); | ||||
| 			if (curpage->pagesize >= curpage->pagesizemax) { | ||||
| 				curpage->pagesizemax += 10; | ||||
| 				curpage->page_contents = | ||||
| 					realloc(curpage->page_contents, | ||||
| 						curpage->pagesizemax * | ||||
| 						sizeof (struct usage_in_page)); | ||||
| 				if (!curpage->page_contents) | ||||
| 					err(1, "realloc"); | ||||
| 			} | ||||
| 			curpage->page_contents[curpage->pagesize].name = n; | ||||
| 			curpage->page_contents[curpage->pagesize].usage = no; | ||||
| 			curpage->pagesize++; | ||||
| 		} else { | ||||
| 			if (npages >= npagesmax) { | ||||
| 				if (pages == 0) { | ||||
| 					npagesmax = 5; | ||||
| 					pages = malloc(npagesmax * | ||||
| 						  sizeof (struct usage_page)); | ||||
| 				} else { | ||||
| 					npagesmax += 5; | ||||
| 					pages = realloc(pages, | ||||
| 						   npagesmax * | ||||
| 						   sizeof (struct usage_page)); | ||||
| 				} | ||||
| 				if (!pages) | ||||
| 					err(1, "alloc"); | ||||
| 			} | ||||
| 			curpage = &pages[npages++]; | ||||
| 			curpage->name = n; | ||||
| 			curpage->usage = no; | ||||
| 			curpage->pagesize = 0; | ||||
| 			curpage->pagesizemax = 10; | ||||
| 			curpage->page_contents = | ||||
| 				malloc(curpage->pagesizemax * | ||||
| 				       sizeof (struct usage_in_page)); | ||||
| 			if (!curpage->page_contents) | ||||
| 				err(1, "malloc"); | ||||
| 		} | ||||
| 	} | ||||
| 	fclose(f); | ||||
| #ifdef DEBUG | ||||
| 	dump_hid_table(); | ||||
| #endif | ||||
| } | ||||
| 
 | ||||
| char * | ||||
| hid_usage_page(int i) | ||||
| { | ||||
| 	static char b[10]; | ||||
| 	int k; | ||||
| 
 | ||||
| 	if (!pages) | ||||
| 		errx(1, "no hid table\n"); | ||||
| 
 | ||||
| 	for (k = 0; k < npages; k++) | ||||
| 		if (pages[k].usage == i) | ||||
| 			return pages[k].name; | ||||
| 	sprintf(b, "0x%02x", i); | ||||
| 	return b; | ||||
| } | ||||
| 
 | ||||
| char * | ||||
| hid_usage_in_page(unsigned int u) | ||||
| { | ||||
| 	int page = HID_PAGE(u); | ||||
| 	int i = HID_USAGE(u); | ||||
| 	static char b[100]; | ||||
| 	int j, k, us; | ||||
| 
 | ||||
| 	for (k = 0; k < npages; k++) | ||||
| 		if (pages[k].usage == page) | ||||
| 			break; | ||||
| 	if (k >= npages) | ||||
| 		goto bad; | ||||
| 	for (j = 0; j < pages[k].pagesize; j++) { | ||||
| 		us = pages[k].page_contents[j].usage; | ||||
| 		if (us == -1) { | ||||
| 			sprintf(b, pages[k].page_contents[j].name, i); | ||||
| 			return b; | ||||
| 		} | ||||
| 		if (us == i) | ||||
| 			return pages[k].page_contents[j].name; | ||||
| 	} | ||||
|  bad: | ||||
| 	sprintf(b, "0x%02x", i); | ||||
| 	return b; | ||||
| } | ||||
|  | @ -1,191 +0,0 @@ | |||
| .\"	$NetBSD: usb.3,v 1.9 1999/11/08 22:33:40 augustss Exp $ | ||||
| .\" | ||||
| .\" Copyright (c) 1999 Lennart Augustsson <augustss@netbsd.org> | ||||
| .\" All rights reserved. | ||||
| .\" | ||||
| .\" Redistribution and use in source and binary forms, with or without | ||||
| .\" modification, are permitted provided that the following conditions | ||||
| .\" are met: | ||||
| .\" 1. Redistributions of source code must retain the above copyright | ||||
| .\"    notice, this list of conditions and the following disclaimer. | ||||
| .\" 2. Redistributions in binary form must reproduce the above copyright | ||||
| .\"    notice, this list of conditions and the following disclaimer in the | ||||
| .\"    documentation and/or other materials provided with the distribution. | ||||
| .\" | ||||
| .\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND | ||||
| .\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||
| .\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||
| .\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE | ||||
| .\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | ||||
| .\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | ||||
| .\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | ||||
| .\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | ||||
| .\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | ||||
| .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | ||||
| .\" SUCH DAMAGE. | ||||
| .\" | ||||
| .\" $XFree86: xc/programs/Xserver/hw/xfree86/os-support/bsd/libusb/usb.3,v 1.1 2000/02/11 18:06:50 dawes Exp $  | ||||
| .\" | ||||
| .Dd May 11, 1999 | ||||
| .Dt USB 3 | ||||
| .Os | ||||
| .Sh NAME | ||||
| .Nm usb , | ||||
| .Nm hid_get_report_desc , | ||||
| .Nm hid_dispose_report_desc , | ||||
| .Nm hid_start_parse , | ||||
| .Nm hid_end_parse , | ||||
| .Nm hid_get_item , | ||||
| .Nm hid_report_size , | ||||
| .Nm hid_locate , | ||||
| .Nm hid_usage_page , | ||||
| .Nm hid_usage_in_page , | ||||
| .Nm hid_init , | ||||
| .Nm hid_get_data , | ||||
| .Nm hid_set_data | ||||
| .Nd USB HID access routines | ||||
| .Sh LIBRARY | ||||
| .Lb libusb | ||||
| .Sh SYNOPSIS | ||||
| .Fd #include <usb.h> | ||||
| .Ft report_desc_t | ||||
| .Fn hid_get_report_desc "int file" | ||||
| .Ft void | ||||
| .Fn hid_dispose_report_desc "report_desc_t d" | ||||
| .Ft hid_data_t | ||||
| .Fn hid_start_parse "report_desc_t d" "int kindset" | ||||
| .Ft void | ||||
| .Fn hid_end_parse "hid_data_t s" | ||||
| .Ft int | ||||
| .Fn hid_get_item "hid_data_t s" "hid_item_t *h" | ||||
| .Ft int | ||||
| .Fn hid_report_size "report_desc_t d" "hid_kind_t k" "int *idp" | ||||
| .Ft int | ||||
| .Fn hid_locate "report_desc_t d" "u_int usage" "hid_kind_t k" "hid_item_t *h" | ||||
| .Ft char * | ||||
| .Fn hid_usage_page "int i" | ||||
| .Ft char * | ||||
| .Fn hid_usage_in_page "u_int u" | ||||
| .Ft void | ||||
| .Fn hid_init "char *file" | ||||
| .Ft int | ||||
| .Fn hid_get_data "void *data" "hid_item_t *h" | ||||
| .Ft void | ||||
| .Fn hid_set_data "void *data" "hid_item_t *h" "u_int data" | ||||
| .Sh DESCRIPTION | ||||
| The | ||||
| .Nm | ||||
| library provides routines to extract data from USB Human Interface Devices. | ||||
| .Ss INTRODUCTION | ||||
| USB HID devices send and receive data layed out a device dependent | ||||
| way.  The | ||||
| .Nm | ||||
| library contains routines to extract the | ||||
| .Em report descriptor | ||||
| which contains the data layout information and then use this information. | ||||
| .Pp | ||||
| The routines can be divided into four parts: extraction of the descriptor, | ||||
| parsing of the descriptor, translating to/from symbolic names, and | ||||
| data manipulation. | ||||
| .Ss DESCRIPTOR FUNCTIONS | ||||
| A report descriptor can be obtained by calling | ||||
| .Fn hid_get_report_desc | ||||
| with a file descriptor obtained by opening a | ||||
| .Xr uhid 4 | ||||
| device. | ||||
| When the report descriptor is no longer needed it should be freed | ||||
| by calling | ||||
| .Fn hid_dispose_report_desc . | ||||
| The type | ||||
| .Fa report_desc_t | ||||
| is opaque and should be used when calling the parsing functions. | ||||
| .Ss DESCRIPTOR PARSING FUNCTIONS | ||||
| To parse the report descriptor the | ||||
| .Fn hid_start_parse | ||||
| function should be called with a report descriptor and a set that | ||||
| describes which items that are interesting.  The set is obtained | ||||
| by oring together values | ||||
| .Fa "(1 << k)" | ||||
| where | ||||
| .Fa k | ||||
| is an item of type | ||||
| .Fa hid_kind_t . | ||||
| The function returns | ||||
| .Fa NULL | ||||
| if the initialization fails, otherwise an opaque value to be used | ||||
| in subsequent calls. | ||||
| After parsing the | ||||
| .Fn hid_end_parse | ||||
| function should be called to free internal data structures. | ||||
| .Pp | ||||
| To iterate through all the items in the report descriptor | ||||
| .Fn hid_get_item | ||||
| should be called while it returns a value greater than 0. | ||||
| When the report descriptor ends it will returns 0; a syntax | ||||
| error within the report descriptor will cause a return value less | ||||
| than 0. | ||||
| The struct pointed to by | ||||
| .Fa h | ||||
| will be filled with the relevant data for the item. | ||||
| The definition of | ||||
| .Fa hid_item_t | ||||
| can be found in | ||||
| .Pa <usb.h> | ||||
| and the meaning of the components in the USB HID documentation. | ||||
| .Pp | ||||
| Data should be read/written to the device in the size of | ||||
| the report.  The size of a report (of a certain kind) can be | ||||
| computed by the | ||||
| .Fn hid_report_size | ||||
| function.  If the report is prefixed by an ID byte it is | ||||
| stored at | ||||
| .Fa idp , | ||||
| otherwise it will contain 0. | ||||
| .Pp | ||||
| To locate a single item the | ||||
| .Fn hid_locate | ||||
| function can be used.  It should be given the usage code of | ||||
| the item and its kind and it will fill the item and return | ||||
| non-zero if the item was found. | ||||
| .Pp | ||||
| .Ss NAME TRANSLATION FUNCTIONS | ||||
| The function | ||||
| .Fn hid_usage_page | ||||
| will return the symbolic name of a usage page, and the function | ||||
| .Fn hid_usage_in_page | ||||
| will return the symbolic name of the usage within the page. | ||||
| Both these functions may return a pointer to static data. | ||||
| Before either of these functions can be called the usage table | ||||
| must be parsed, this is done by calling | ||||
| .Fn hid_init | ||||
| with the name of the table.  Passing | ||||
| .Fa NULL | ||||
| to this function will cause it to use the default table. | ||||
| .Ss DATA EXTRACTION FUNCTIONS | ||||
| Given the data obtained from a HID device and an item in the | ||||
| report descriptor the | ||||
| .Fn hid_get_data | ||||
| function extracts the value of the item. | ||||
| Conversely | ||||
| .Fn hid_set_data | ||||
| can be used to put data into a report (which must be zeroed first). | ||||
| .Sh EXAMPLE | ||||
| Not yet. | ||||
| .Sh FILES | ||||
| .Pa /usr/share/misc/usb_hid_usages | ||||
| The default HID usage table. | ||||
| .Sh BUGS | ||||
| This man page is woefully incomplete. | ||||
| .Sh SEE ALSO | ||||
| The | ||||
| .Tn USB | ||||
| specifications can be found at | ||||
| .Dv http://www.usb.org/developers/docs.htm . | ||||
| .Pp | ||||
| .Xr hid 4 , | ||||
| .Xr usb 4 . | ||||
| .Sh HISTORY | ||||
| The | ||||
| .Nm | ||||
| library first appeared in | ||||
| .Nx 1.5 . | ||||
|  | @ -1,92 +0,0 @@ | |||
| /*
 | ||||
|  * Copyright (c) 1999 Lennart Augustsson <augustss@netbsd.org> | ||||
|  * All rights reserved. | ||||
|  * | ||||
|  * Redistribution and use in source and binary forms, with or without | ||||
|  * modification, are permitted provided that the following conditions | ||||
|  * are met: | ||||
|  * 1. Redistributions of source code must retain the above copyright | ||||
|  *    notice, this list of conditions and the following disclaimer. | ||||
|  * 2. Redistributions in binary form must reproduce the above copyright | ||||
|  *    notice, this list of conditions and the following disclaimer in the | ||||
|  *    documentation and/or other materials provided with the distribution. | ||||
|  * | ||||
|  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND | ||||
|  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||
|  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||
|  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE | ||||
|  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | ||||
|  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | ||||
|  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | ||||
|  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | ||||
|  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | ||||
|  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | ||||
|  * SUCH DAMAGE. | ||||
|  */ | ||||
| 
 | ||||
| #define _DIAGASSERT(e) assert(e) | ||||
| 
 | ||||
| typedef struct report_desc *report_desc_t; | ||||
| 
 | ||||
| typedef struct hid_data *hid_data_t; | ||||
| 
 | ||||
| typedef enum hid_kind { | ||||
| 	hid_input, hid_output, hid_feature, hid_collection, hid_endcollection | ||||
| }hid_kind_t; | ||||
| 
 | ||||
| typedef struct hid_item { | ||||
| 	/* Global */ | ||||
| 	int _usage_page; | ||||
| 	int logical_minimum; | ||||
| 	int logical_maximum; | ||||
| 	int physical_minimum; | ||||
| 	int physical_maximum; | ||||
| 	int unit_exponent; | ||||
| 	int unit; | ||||
| 	int report_size; | ||||
| 	int report_ID; | ||||
| 	int report_count; | ||||
| 	/* Local */ | ||||
| 	unsigned int usage; | ||||
| 	int usage_minimum; | ||||
| 	int usage_maximum; | ||||
| 	int designator_index; | ||||
| 	int designator_minimum; | ||||
| 	int designator_maximum; | ||||
| 	int string_index; | ||||
| 	int string_minimum; | ||||
| 	int string_maximum; | ||||
| 	int set_delimiter; | ||||
| 	/* Misc */ | ||||
| 	int collection; | ||||
| 	int collevel; | ||||
| 	enum hid_kind kind; | ||||
| 	unsigned int flags; | ||||
| 	/* Absolute data position (bits) */ | ||||
| 	unsigned int pos; | ||||
| 	/* */ | ||||
| 	struct hid_item *next; | ||||
| } hid_item_t; | ||||
| 
 | ||||
| #define HID_PAGE(u) ((u) >> 16) | ||||
| #define HID_USAGE(u) ((u) & 0xffff) | ||||
| 
 | ||||
| /* Obtaining a report descriptor, descr.c: */ | ||||
| report_desc_t hid_get_report_desc __P((int file)); | ||||
| void hid_dispose_report_desc __P((report_desc_t)); | ||||
| 
 | ||||
| /* Parsing of a HID report descriptor, parse.c: */ | ||||
| hid_data_t hid_start_parse __P((report_desc_t d, int kindset)); | ||||
| void hid_end_parse __P((hid_data_t s)); | ||||
| int hid_get_item __P((hid_data_t s, hid_item_t *h)); | ||||
| int hid_report_size __P((report_desc_t d, enum hid_kind k, int *idp)); | ||||
| int hid_locate __P((report_desc_t d, unsigned int usage, enum hid_kind k, hid_item_t *h)); | ||||
| 
 | ||||
| /* Conversion to/from usage names, usage.c: */ | ||||
| char *hid_usage_page __P((int i)); | ||||
| char *hid_usage_in_page __P((unsigned int u)); | ||||
| void hid_init __P((char *file)); | ||||
| 
 | ||||
| /* Extracting/insertion of data, data.c: */ | ||||
| int hid_get_data __P((void *p, hid_item_t *h)); | ||||
| void hid_set_data __P((void *p, hid_item_t *h, int data)); | ||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							|  | @ -1,31 +0,0 @@ | |||
| /*
 | ||||
|  * Copyright (c) 1999 Lennart Augustsson <augustss@netbsd.org> | ||||
|  * All rights reserved. | ||||
|  * | ||||
|  * Redistribution and use in source and binary forms, with or without | ||||
|  * modification, are permitted provided that the following conditions | ||||
|  * are met: | ||||
|  * 1. Redistributions of source code must retain the above copyright | ||||
|  *    notice, this list of conditions and the following disclaimer. | ||||
|  * 2. Redistributions in binary form must reproduce the above copyright | ||||
|  *    notice, this list of conditions and the following disclaimer in the | ||||
|  *    documentation and/or other materials provided with the distribution. | ||||
|  * | ||||
|  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND | ||||
|  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||
|  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||
|  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE | ||||
|  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | ||||
|  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | ||||
|  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | ||||
|  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | ||||
|  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | ||||
|  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | ||||
|  * SUCH DAMAGE. | ||||
|  */ | ||||
| 
 | ||||
| struct report_desc { | ||||
| 	unsigned int size; | ||||
| 	unsigned char data[1]; | ||||
| }; | ||||
| 
 | ||||
		Loading…
	
		Reference in New Issue