Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 1 Aug 2011 08:34:00 +0000 (UTC)
From:      Alexander Motin <mav@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r224567 - projects/hid/lib/libusbhid
Message-ID:  <201108010834.p718Y0VP085064@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: mav
Date: Mon Aug  1 08:34:00 2011
New Revision: 224567
URL: http://svn.freebsd.org/changeset/base/224567

Log:
  Add hid_get_report()/hid_set_report() functions to the libusbhid, wrapping
  respective IOCTLs.

Modified:
  projects/hid/lib/libusbhid/data.c
  projects/hid/lib/libusbhid/usbhid.3
  projects/hid/lib/libusbhid/usbhid.h

Modified: projects/hid/lib/libusbhid/data.c
==============================================================================
--- projects/hid/lib/libusbhid/data.c	Mon Aug  1 08:22:40 2011	(r224566)
+++ projects/hid/lib/libusbhid/data.c	Mon Aug  1 08:34:00 2011	(r224567)
@@ -29,10 +29,14 @@
 #include <sys/cdefs.h>
 __FBSDID("$FreeBSD$");
 
+#include <errno.h>
 #include <sys/param.h>
 #include <assert.h>
 #include <stdlib.h>
+#include <string.h>
+#include <dev/usb/usb_ioctl.h>
 #include "usbhid.h"
+#include "usbvar.h"
 
 int32_t
 hid_get_data(const void *p, const hid_item_t *h)
@@ -114,3 +118,31 @@ hid_set_data(void *p, const hid_item_t *
 		buf[offs + i] = (buf[offs + i] & (mask >> (i*8))) |
 		    ((data >> (i*8)) & 0xff);
 }
+
+int
+hid_get_report(int fd, enum hid_kind k, unsigned char *data, unsigned int size)
+{
+	struct usb_gen_descriptor ugd;
+
+	memset(&ugd, 0, sizeof(ugd));
+	ugd.ugd_data = hid_pass_ptr(data);
+	ugd.ugd_maxlen = size;
+	ugd.ugd_report_type = k + 1;
+	if (ioctl(fd, USB_GET_REPORT, &ugd) < 0)
+		return (errno);
+	return (0);
+}
+
+int
+hid_set_report(int fd, enum hid_kind k, unsigned char *data, unsigned int size)
+{
+	struct usb_gen_descriptor ugd;
+
+	memset(&ugd, 0, sizeof(ugd));
+	ugd.ugd_data = hid_pass_ptr(data);
+	ugd.ugd_maxlen = size;
+	ugd.ugd_report_type = k + 1;
+	if (ioctl(fd, USB_SET_REPORT, &ugd) < 0)
+		return (errno);
+	return (0);
+}

Modified: projects/hid/lib/libusbhid/usbhid.3
==============================================================================
--- projects/hid/lib/libusbhid/usbhid.3	Mon Aug  1 08:22:40 2011	(r224566)
+++ projects/hid/lib/libusbhid/usbhid.3	Mon Aug  1 08:34:00 2011	(r224567)
@@ -44,7 +44,9 @@
 .Nm hid_usage_in_page ,
 .Nm hid_init ,
 .Nm hid_get_data ,
-.Nm hid_set_data
+.Nm hid_set_data ,
+.Nm hid_get_report ,
+.Nm hid_set_report
 .Nd USB HID access routines
 .Sh LIBRARY
 .Lb libusbhid
@@ -84,6 +86,10 @@
 .Fn hid_get_data "const void *data" "const hid_item_t *h"
 .Ft void
 .Fn hid_set_data "void *buf" "const hid_item_t *h" "int data"
+.Ft int
+.Fn hid_get_report "int fd" "enum hid_kind k" "unsigned char *data" "unsigned int size"
+.Ft int
+.Fn hid_set_report "int fd" "enum hid_kind k" "unsigned char *data" "unsigned int size"
 .Sh DESCRIPTION
 The
 .Nm
@@ -105,6 +111,14 @@ Synchronous HID operation can be enabled
 If the second argument is zero synchronous HID operation is disabled.
 Else synchronous HID operation is enabled.
 The function returns a negative value on failure.
+.Pp
+.Fn hid_get_report
+and
+.Fn hid_set_report
+functions allow to synchronously get and set specific report if device
+supports it.
+For devices with multiple report IDs, wanted ID should be provided in the
+first byte of the buffer for both get and set.
 .Ss Descriptor Functions
 The report descriptor ID can be obtained by calling
 .Fn hid_get_report_id .

Modified: projects/hid/lib/libusbhid/usbhid.h
==============================================================================
--- projects/hid/lib/libusbhid/usbhid.h	Mon Aug  1 08:22:40 2011	(r224566)
+++ projects/hid/lib/libusbhid/usbhid.h	Mon Aug  1 08:34:00 2011	(r224567)
@@ -76,6 +76,7 @@ typedef struct hid_item {
 
 #define HID_PAGE(u) (((u) >> 16) & 0xffff)
 #define HID_USAGE(u) ((u) & 0xffff)
+#define HID_HAS_GET_SET_REPORT 1
 
 __BEGIN_DECLS
 
@@ -104,5 +105,9 @@ int hid_parse_usage_page(const char *nam
 /* Extracting/insertion of data, data.c: */
 int32_t hid_get_data(const void *p, const hid_item_t *h);
 void hid_set_data(void *p, const hid_item_t *h, int32_t data);
+int hid_get_report(int fd, enum hid_kind k,
+    unsigned char *data, unsigned int size);
+int hid_set_report(int fd, enum hid_kind k,
+    unsigned char *data, unsigned int size);
 
 __END_DECLS



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201108010834.p718Y0VP085064>