Re: [PATCH v4 1/1] hid: Add HID Report Descriptor to sysfs.

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Sun, 23 Jan 2011 22:50:18 -0500
Alan Ott <alan@xxxxxxxxxxx> wrote:

> Add a new binary sysfs entry called report_descriptor which contains
> the HID report descriptor.
> 
> Signed-off-by: Alan Ott <alan@xxxxxxxxxxx>

Adding Marcin Tolysz to CC, he is interested in a mechanism to
override the hid_descriptor from userspace dynamically.

Marcin, now that this 'report_descriptor' sysfs attribute has been
accepted as read-only in mainline, maybe you could implement the .write
method for it if your firmware approach to override hid descriptors
would not be accepted. Just pointing at an alternative option, not sure
if it is the best one.

Regards,
   Antonio

> ---
>  Documentation/ABI/testing/sysfs-driver-hid |   10 ++++++++
>  drivers/hid/hid-core.c                     |   33 ++++++++++++++++++++++++++++
>  2 files changed, 43 insertions(+), 0 deletions(-)
>  create mode 100644 Documentation/ABI/testing/sysfs-driver-hid
> 
> diff --git a/Documentation/ABI/testing/sysfs-driver-hid b/Documentation/ABI/testing/sysfs-driver-hid
> new file mode 100644
> index 0000000..b6490e1
> --- /dev/null
> +++ b/Documentation/ABI/testing/sysfs-driver-hid
> @@ -0,0 +1,10 @@
> +What:		For USB devices	: /sys/bus/usb/devices/<busnum>-<devnum>:<config num>.<interface num>/<hid-bus>:<vendor-id>:<product-id>.<num>/report_descriptor
> +		For BT devices	: /sys/class/bluetooth/hci<addr>/<hid-bus>:<vendor-id>:<product-id>.<num>/report_descriptor
> +		Symlink		: /sys/class/hidraw/hidraw<num>/device/report_descriptor
> +Date:		Jan 2011
> +KernelVersion:	2.0.39
> +Contact:	Alan Ott <alan@xxxxxxxxxxx>
> +Description:	When read, this file returns the device's raw binary HID
> +		report descriptor.
> +		This file cannot be written.
> +Users:		HIDAPI library (http://www.signal11.us/oss/hidapi)
> diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c
> index d678cf3..32bbd5d 100644
> --- a/drivers/hid/hid-core.c
> +++ b/drivers/hid/hid-core.c
> @@ -1159,6 +1159,32 @@ static bool hid_hiddev(struct hid_device *hdev)
>  	return !!hid_match_id(hdev, hid_hiddev_list);
>  }
>  
> +
> +static ssize_t
> +read_report_descriptor(struct file *filp, struct kobject *kobj,
> +		struct bin_attribute *attr,
> +		char *buf, loff_t off, size_t count)
> +{
> +	struct device *dev = container_of(kobj, struct device, kobj);
> +	struct hid_device *hdev = container_of(dev, struct hid_device, dev);
> +
> +	if (off >= hdev->rsize)
> +		return 0;
> +
> +	if (off + count > hdev->rsize)
> +		count = hdev->rsize - off;
> +
> +	memcpy(buf, hdev->rdesc + off, count);
> +
> +	return count;
> +}
> +
> +static struct bin_attribute dev_bin_attr_report_desc = {
> +	.attr = { .name = "report_descriptor", .mode = 0444 },
> +	.read = read_report_descriptor,
> +	.size = HID_MAX_DESCRIPTOR_SIZE,
> +};
> +
>  int hid_connect(struct hid_device *hdev, unsigned int connect_mask)
>  {
>  	static const char *types[] = { "Device", "Pointer", "Mouse", "Device",
> @@ -1169,6 +1195,7 @@ int hid_connect(struct hid_device *hdev, unsigned int connect_mask)
>  	char buf[64];
>  	unsigned int i;
>  	int len;
> +	int ret;
>  
>  	if (hdev->quirks & HID_QUIRK_HIDDEV_FORCE)
>  		connect_mask |= (HID_CONNECT_HIDDEV_FORCE | HID_CONNECT_HIDDEV);
> @@ -1230,6 +1257,11 @@ int hid_connect(struct hid_device *hdev, unsigned int connect_mask)
>  		bus = "<UNKNOWN>";
>  	}
>  
> +	ret = device_create_bin_file(&hdev->dev, &dev_bin_attr_report_desc);
> +	if (ret)
> +		hid_warn(hdev,
> +			 "can't create sysfs report descriptor attribute err: %d\n", ret);
> +
>  	hid_info(hdev, "%s: %s HID v%x.%02x %s [%s] on %s\n",
>  		 buf, bus, hdev->version >> 8, hdev->version & 0xff,
>  		 type, hdev->name, hdev->phys);
> @@ -1240,6 +1272,7 @@ EXPORT_SYMBOL_GPL(hid_connect);
>  
>  void hid_disconnect(struct hid_device *hdev)
>  {
> +	device_remove_bin_file(&hdev->dev, &dev_bin_attr_report_desc);
>  	if (hdev->claimed & HID_CLAIMED_INPUT)
>  		hidinput_disconnect(hdev);
>  	if (hdev->claimed & HID_CLAIMED_HIDDEV)
> -- 
> 1.7.0.4
> 
> 
> --
> To unsubscribe from this list: send the line "unsubscribe linux-input" in
> the body of a message to majordomo@xxxxxxxxxxxxxxx
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> 


-- 
Antonio Ospite
http://ao2.it

PGP public key ID: 0x4553B001

A: Because it messes up the order in which people normally read text.
   See http://en.wikipedia.org/wiki/Posting_style
Q: Why is top-posting such a bad thing?

Attachment: pgpyFJAUS3VJa.pgp
Description: PGP signature


[Index of Archives]     [Linux Media Devel]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Linux Wireless Networking]     [Linux Omap]

  Powered by Linux