linux-input.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: David Herrmann <dh.herrmann@gmail.com>
To: linux-input@vger.kernel.org
Cc: Jiri Kosina <jkosina@suse.cz>, David Herrmann <dh.herrmann@gmail.com>
Subject: [PATCH 21/26] HID: wiimote: add "bboard_calib" attribute
Date: Sun,  5 May 2013 23:13:05 +0200	[thread overview]
Message-ID: <1367788390-29835-22-git-send-email-dh.herrmann@gmail.com> (raw)
In-Reply-To: <1367788390-29835-1-git-send-email-dh.herrmann@gmail.com>

Balance-Boards provide 3 16bit calibration values for each of the 4
sensors. We provide these now as 192bit value via a new "bboard_calib"
sysfs attribute.
We also re-read the calibration data from the device whenever user-space
attempts to read this file. On normal Nintendo boards, this always
produces the same results, however, on some 3rd party devices these values
change until the device is fully initialized. As I have currently no idea
how long to wait until it's ready (sometimes takes up to 10s?) we provide
a simple workaround for users by reading this file.

If we, at some point, figure out how it works, we can implement it in the
kernel and provide offline data via "bboard_calib". This won't break
user-space then.

Signed-off-by: David Herrmann <dh.herrmann@gmail.com>
---
 Documentation/ABI/testing/sysfs-driver-hid-wiimote | 15 +++++
 drivers/hid/hid-wiimote-modules.c                  | 68 +++++++++++++++++++++-
 2 files changed, 82 insertions(+), 1 deletion(-)

diff --git a/Documentation/ABI/testing/sysfs-driver-hid-wiimote b/Documentation/ABI/testing/sysfs-driver-hid-wiimote
index e8f6b16..ed5dd56 100644
--- a/Documentation/ABI/testing/sysfs-driver-hid-wiimote
+++ b/Documentation/ABI/testing/sysfs-driver-hid-wiimote
@@ -42,3 +42,18 @@ Description:	While a device is initialized by the wiimote driver, we perform
 			gen10: First Wii Remote generation
 			gen20: Second Wii Remote Plus generation (builtin MP)
 			balanceboard: Wii Balance Board
+
+What:		/sys/bus/hid/drivers/wiimote/<dev>/bboard_calib
+Date:		May 2013
+KernelVersion:	3.11
+Contact:	David Herrmann <dh.herrmann@gmail.com>
+Description:	This attribute is only provided if the device was detected as a
+		balance board. It provides a single line with 3 calibration
+		values for all 4 sensors. The values are separated by colons and
+		are each 2 bytes long (encoded as 4 digit hexadecimal value).
+		First, 0kg values for all 4 sensors are written, followed by the
+		17kg values for all 4 sensors and last the 34kg values for all 4
+		sensors.
+		Calibration data is already applied by the kernel to all input
+		values but may be used by user-space to perform other
+		transformations.
diff --git a/drivers/hid/hid-wiimote-modules.c b/drivers/hid/hid-wiimote-modules.c
index aee1b2c..19b8b1c 100644
--- a/drivers/hid/hid-wiimote-modules.c
+++ b/drivers/hid/hid-wiimote-modules.c
@@ -1380,6 +1380,60 @@ static void wiimod_bboard_close(struct input_dev *dev)
 	spin_unlock_irqrestore(&wdata->state.lock, flags);
 }
 
+static ssize_t wiimod_bboard_calib_show(struct device *dev,
+					struct device_attribute *attr,
+					char *out)
+{
+	struct wiimote_data *wdata = dev_to_wii(dev);
+	int i, j, ret;
+	__u16 val;
+	__u8 buf[24], offs;
+
+	ret = wiimote_cmd_acquire(wdata);
+	if (ret)
+		return ret;
+
+	ret = wiimote_cmd_read(wdata, 0xa40024, buf, 12);
+	if (ret != 12) {
+		wiimote_cmd_release(wdata);
+		return ret < 0 ? ret : -EIO;
+	}
+	ret = wiimote_cmd_read(wdata, 0xa40024 + 12, buf + 12, 12);
+	if (ret != 12) {
+		wiimote_cmd_release(wdata);
+		return ret < 0 ? ret : -EIO;
+	}
+
+	wiimote_cmd_release(wdata);
+
+	spin_lock_irq(&wdata->state.lock);
+	offs = 0;
+	for (i = 0; i < 3; ++i) {
+		for (j = 0; j < 4; ++j) {
+			wdata->state.calib_bboard[j][i] = buf[offs];
+			wdata->state.calib_bboard[j][i] <<= 8;
+			wdata->state.calib_bboard[j][i] |= buf[offs + 1];
+			offs += 2;
+		}
+	}
+	spin_unlock_irq(&wdata->state.lock);
+
+	ret = 0;
+	for (i = 0; i < 3; ++i) {
+		for (j = 0; j < 4; ++j) {
+			val = wdata->state.calib_bboard[j][i];
+			if (i == 2 && j == 3)
+				ret += sprintf(&out[ret], "%04x\n", val);
+			else
+				ret += sprintf(&out[ret], "%04x:", val);
+		}
+	}
+
+	return ret;
+}
+
+static DEVICE_ATTR(bboard_calib, S_IRUGO, wiimod_bboard_calib_show, NULL);
+
 static int wiimod_bboard_probe(const struct wiimod_ops *ops,
 			       struct wiimote_data *wdata)
 {
@@ -1415,6 +1469,13 @@ static int wiimod_bboard_probe(const struct wiimod_ops *ops,
 	if (!wdata->extension.input)
 		return -ENOMEM;
 
+	ret = device_create_file(&wdata->hdev->dev,
+				 &dev_attr_bboard_calib);
+	if (ret) {
+		hid_err(wdata->hdev, "cannot create sysfs attribute\n");
+		goto err_free;
+	}
+
 	input_set_drvdata(wdata->extension.input, wdata);
 	wdata->extension.input->open = wiimod_bboard_open;
 	wdata->extension.input->close = wiimod_bboard_close;
@@ -1444,10 +1505,13 @@ static int wiimod_bboard_probe(const struct wiimod_ops *ops,
 
 	ret = input_register_device(wdata->extension.input);
 	if (ret)
-		goto err_free;
+		goto err_file;
 
 	return 0;
 
+err_file:
+	device_remove_file(&wdata->hdev->dev,
+			   &dev_attr_bboard_calib);
 err_free:
 	input_free_device(wdata->extension.input);
 	wdata->extension.input = NULL;
@@ -1462,6 +1526,8 @@ static void wiimod_bboard_remove(const struct wiimod_ops *ops,
 
 	input_unregister_device(wdata->extension.input);
 	wdata->extension.input = NULL;
+	device_remove_file(&wdata->hdev->dev,
+			   &dev_attr_bboard_calib);
 }
 
 static const struct wiimod_ops wiimod_bboard = {
-- 
1.8.2.2


  parent reply	other threads:[~2013-05-05 21:14 UTC|newest]

Thread overview: 50+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-05-05 21:12 [PATCH 00/26] Wii Remote Extension Hotplugging Support David Herrmann
2013-05-05 21:12 ` [PATCH 01/26] HID: wiimote: extend driver description David Herrmann
2013-06-03  9:19   ` Jiri Kosina
2013-06-03 20:28     ` David Herrmann
2013-05-05 21:12 ` [PATCH 02/26] HID: wiimote: move queue handling into separate struct David Herrmann
2013-05-05 21:12 ` [PATCH 03/26] HID: wiimote: keep HID device open David Herrmann
2013-05-05 21:12 ` [PATCH 04/26] HID: wiimote: add device detection David Herrmann
2013-05-05 21:12 ` [PATCH 05/26] HID: wiimote: use cached battery values on I/O failure David Herrmann
2013-05-05 21:12 ` [PATCH 06/26] HID: wiimote: wake up if output queue failed David Herrmann
2013-05-05 21:12 ` [PATCH 07/26] HID: wiimote: add sub-device module infrastructure David Herrmann
2013-05-05 21:12 ` [PATCH 08/26] HID: wiimote: convert KEYS and RUMBLE to modules David Herrmann
2013-05-05 21:12 ` [PATCH 09/26] HID: wiimote: convert BATTERY to module David Herrmann
2013-05-05 21:12 ` [PATCH 10/26] HID: wiimote: convert LEDS to modules David Herrmann
2013-05-05 21:12 ` [PATCH 11/26] HID: wiimote: convert ACCEL to module David Herrmann
2013-05-05 21:12 ` [PATCH 12/26] HID: wiimote: convert IR " David Herrmann
2013-05-05 21:12 ` [PATCH 13/26] HID: wiimote: add extension hotplug support David Herrmann
2013-05-23 10:53   ` David Herrmann
2013-05-23 12:28     ` Jiri Kosina
2013-05-05 21:12 ` [PATCH 14/26] HID: wiimote: add Balance Board support David Herrmann
2013-05-05 21:12 ` [PATCH 15/26] HID: wiimote: add Nunchuk support David Herrmann
2013-05-05 21:13 ` [PATCH 16/26] HID: wiimote: add Classic Controller extension David Herrmann
2013-05-06  0:39   ` Todd Showalter
2013-05-06  5:40     ` David Herrmann
2013-05-06 14:15       ` Todd Showalter
2013-05-05 21:13 ` [PATCH 17/26] HID: wiimote: add Motion Plus extension module David Herrmann
2013-05-05 21:13 ` [PATCH 18/26] HID: wiimote: fix ctx pointer in debugfs DRM-write David Herrmann
2013-05-05 21:13 ` [PATCH 19/26] HID: wiimote: lock DRM mode during debugfs overwrite David Herrmann
2013-05-05 21:13 ` [PATCH 20/26] HID: wiimote: add sysfs extension/device-type attrs David Herrmann
2013-05-05 21:13 ` David Herrmann [this message]
2013-05-05 21:13 ` [PATCH 22/26] HID: wiimote: remove old static extension support David Herrmann
2013-05-05 21:13 ` [PATCH 23/26] HID: wiimote: add MP quirks David Herrmann
2013-05-05 21:13 ` [RFC 24/26] HID: wiimote: support Nintendo Wii U Pro Controller David Herrmann
2013-05-06  0:43   ` Todd Showalter
2013-05-06  5:49     ` David Herrmann
2013-05-06 14:14       ` Todd Showalter
2013-05-08 15:33         ` David Herrmann
2013-05-08 16:40           ` Todd Showalter
2013-05-08 17:05             ` Dmitry Torokhov
2013-05-08 17:20               ` Todd Showalter
2013-05-08 17:25                 ` David Herrmann
2013-05-08 17:26                 ` Dmitry Torokhov
2013-05-13 17:03                   ` David Herrmann
2013-05-13 17:40                     ` Todd Showalter
2013-05-22 12:10                       ` David Herrmann
2013-05-22 16:18                         ` Todd Showalter
2013-05-05 21:13 ` [PATCH 25/26] HID: wiimote: fix DRM debug-attr to correctly parse input David Herrmann
2013-05-05 21:13 ` [RFC 26/26] HID/ALSA: wiimote: add speaker support David Herrmann
2013-05-26 20:55 ` [PATCH 27/26] HID: wiimote: init EXT/MP during device detection David Herrmann
2013-05-26 20:55   ` [PATCH 28/26] HID: wiimote: discard invalid EXT data reports David Herrmann
2013-05-26 20:55   ` [PATCH 29/26] HID: wiimote: fix classic controller parsing David Herrmann

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1367788390-29835-22-git-send-email-dh.herrmann@gmail.com \
    --to=dh.herrmann@gmail.com \
    --cc=jkosina@suse.cz \
    --cc=linux-input@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).