All of lore.kernel.org
 help / color / mirror / Atom feed
* [RFC ebeam PATCH v3 0/2]
@ 2012-08-06 21:21 Yann Cantin
  2012-08-06 21:21 ` [RFC ebeam PATCH v3 1/2] hid: Blacklist new eBeam classic device Yann Cantin
                   ` (2 more replies)
  0 siblings, 3 replies; 19+ messages in thread
From: Yann Cantin @ 2012-08-06 21:21 UTC (permalink / raw)
  To: linux-input, linux-usb; +Cc: gregkh, dmitry.torokhov, linux-kernel

Hi,

New USB input driver for eBeam devices.

Currently, only the Luidia eBeam classic projection model is supported.
Edge model and a NEC interactive video-projector support planned for the
end of the mounth. 

Patch 1 to blacklist the device for hid generic-usb.

Patch 2 is the actual driver.

Changes from previous :
- switch to div64_s64 for portable 64/64-bits divisions
- some cosmetics in device name
- unused include and def removed
- variables name changes for readability

Pending issues :
- sysfs custom files : need to pass 13 parameters for calibration :
  choice is between lots of simply-handled, or few with a big sscanf.
- is div64_s64 safe and available on all plateform ? this is the only
  use of this function i've found in all the kernel tree.

The module run fine with a 3.3.6 and a 3.5.0 kernel, both x86_32 and 64.

Thanks for your help.


^ permalink raw reply	[flat|nested] 19+ messages in thread

* [RFC ebeam PATCH v3 1/2] hid: Blacklist new eBeam classic device
  2012-08-06 21:21 [RFC ebeam PATCH v3 0/2] Yann Cantin
@ 2012-08-06 21:21 ` Yann Cantin
  2012-08-06 21:43   ` Greg KH
  2012-08-06 21:21 ` [RFC ebeam PATCH v3 2/2] input: misc: New USB eBeam input driver Yann Cantin
  2012-08-06 21:44 ` [RFC ebeam PATCH v3 0/2] Greg KH
  2 siblings, 1 reply; 19+ messages in thread
From: Yann Cantin @ 2012-08-06 21:21 UTC (permalink / raw)
  To: linux-input, linux-usb; +Cc: gregkh, dmitry.torokhov, linux-kernel, Yann Cantin


Signed-off-by: Yann Cantin <yann.cantin@laposte.net>
---
 drivers/hid/hid-core.c |    3 +++
 drivers/hid/hid-ids.h  |    3 +++
 2 files changed, 6 insertions(+)

diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c
index 60ea284..b1ed8ee 100644
--- a/drivers/hid/hid-core.c
+++ b/drivers/hid/hid-core.c
@@ -1908,6 +1908,9 @@ static const struct hid_device_id hid_ignore_list[] = {
 	{ HID_USB_DEVICE(USB_VENDOR_ID_DELORME, USB_DEVICE_ID_DELORME_EM_LT20) },
 	{ HID_USB_DEVICE(USB_VENDOR_ID_DREAM_CHEEKY, 0x0004) },
 	{ HID_USB_DEVICE(USB_VENDOR_ID_DREAM_CHEEKY, 0x000a) },
+#if defined(CONFIG_INPUT_EBEAM_USB)
+	{ HID_USB_DEVICE(USB_VENDOR_ID_EFI, USB_DEVICE_ID_EFI_CLASSIC) },
+#endif
 	{ HID_USB_DEVICE(USB_VENDOR_ID_ESSENTIAL_REALITY, USB_DEVICE_ID_ESSENTIAL_REALITY_P5) },
 	{ HID_USB_DEVICE(USB_VENDOR_ID_ETT, USB_DEVICE_ID_TC5UH) },
 	{ HID_USB_DEVICE(USB_VENDOR_ID_ETT, USB_DEVICE_ID_TC4UM) },
diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h
index 1dcb76f..b985059 100644
--- a/drivers/hid/hid-ids.h
+++ b/drivers/hid/hid-ids.h
@@ -271,6 +271,9 @@
 #define USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_7349	0x7349
 #define USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_A001	0xa001
 
+#define USB_VENDOR_ID_EFI		0x2650
+#define USB_DEVICE_ID_EFI_CLASSIC	0x1311
+
 #define USB_VENDOR_ID_ELECOM		0x056e
 #define USB_DEVICE_ID_ELECOM_BM084	0x0061
 
-- 
1.7.10


^ permalink raw reply related	[flat|nested] 19+ messages in thread

* [RFC ebeam PATCH v3 2/2] input: misc: New USB eBeam input driver.
  2012-08-06 21:21 [RFC ebeam PATCH v3 0/2] Yann Cantin
  2012-08-06 21:21 ` [RFC ebeam PATCH v3 1/2] hid: Blacklist new eBeam classic device Yann Cantin
@ 2012-08-06 21:21 ` Yann Cantin
  2012-08-06 21:43   ` Greg KH
  2012-08-06 21:44 ` [RFC ebeam PATCH v3 0/2] Greg KH
  2 siblings, 1 reply; 19+ messages in thread
From: Yann Cantin @ 2012-08-06 21:21 UTC (permalink / raw)
  To: linux-input, linux-usb; +Cc: gregkh, dmitry.torokhov, linux-kernel, Yann Cantin


Signed-off-by: Yann Cantin <yann.cantin@laposte.net>
---
 drivers/input/misc/ebeam.c |  764 ++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 764 insertions(+)
 create mode 100644 drivers/input/misc/ebeam.c

diff --git a/drivers/input/misc/ebeam.c b/drivers/input/misc/ebeam.c
new file mode 100644
index 0000000..54e2cd6
--- /dev/null
+++ b/drivers/input/misc/ebeam.c
@@ -0,0 +1,764 @@
+/******************************************************************************
+ *
+ * eBeam driver
+ *
+ * Copyright (C) 2012 Yann Cantin (yann.cantin@laposte.net)
+ *
+ *	This program is free software; you can redistribute it and/or
+ *	modify it under the terms of the GNU General Public License as
+ *	published by the Free Software Foundation; either version 2 of the
+ *	License, or (at your option) any later version.
+ *
+ *  based on
+ *
+ *	usbtouchscreen.c by Daniel Ritz <daniel.ritz@gmx.ch>
+ *	aiptek.c (sysfs/settings) by Chris Atenasio <chris@crud.net>
+ *				     Bryan W. Headley <bwheadley@earthlink.net>
+ *
+ *****************************************************************************/
+
+#include <linux/kernel.h>
+#include <linux/slab.h>
+#include <linux/math64.h>
+#include <linux/input.h>
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/usb.h>
+#include <linux/usb/input.h>
+
+#define DRIVER_AUTHOR	"Yann Cantin <yann.cantin@laposte.net>"
+#define DRIVER_DESC	"USB eBeam Driver"
+
+/* Common values for eBeam devices */
+#define REPT_SIZE	8		/* packet size		  */
+#define MIN_RAW_X	0		/* raw coordinates ranges */
+#define MAX_RAW_X	0xFFFF
+#define MIN_RAW_Y	0
+#define MAX_RAW_Y	0xFFFF
+
+
+#define USB_VENDOR_ID_EFI	   0x2650   /* Electronics For Imaging, Inc   */
+#define USB_DEVICE_ID_EFI_CLASSIC  0x1311   /* Classic projection "La banane" */
+
+#define EBEAM_BTN_TIP	0x1      /* tip    */
+#define EBEAM_BTN_LIT	0x2      /* little */
+#define EBEAM_BTN_BIG	0x4      /* big    */
+
+/* ebeam settings */
+struct ebeam_settings {
+	int min_x;	/* computed coordinates ranges for the input layer */
+	int max_x;
+	int min_y;
+	int max_y;
+
+	/* H matrix */
+	s64 h1;
+	s64 h2;
+	s64 h3;
+	s64 h4;
+	s64 h5;
+	s64 h6;
+	s64 h7;
+	s64 h8;
+	s64 h9;
+};
+
+/* ebeam device */
+struct ebeam_device {
+	unsigned char		 *data;
+	dma_addr_t		 data_dma;
+	unsigned char		 *buffer;
+	int			 buf_len;
+	struct urb		 *irq;
+	struct usb_interface	 *interface;
+	struct input_dev	 *input;
+	char			 name[128];
+	char			 phys[64];
+	void			 *priv;
+
+	struct ebeam_settings	 cursetting;	/* device's current settings */
+	struct ebeam_settings	 newsetting;	/* ... and new ones	     */
+
+	bool			 calibrated;	/* false : send raw	     */
+						/* true  : send computed     */
+
+	u16			 raw_x, raw_y;	/* raw coordinates	     */
+	int			 x, y;		/* computed coordinates      */
+	int			 btn_map;	/* internal buttons map      */
+};
+
+/* device types */
+enum {
+	DEVTYPE_CLASSIC,
+};
+
+static const struct usb_device_id ebeam_devices[] = {
+	{USB_DEVICE(USB_VENDOR_ID_EFI, USB_DEVICE_ID_EFI_CLASSIC),
+			.driver_info = DEVTYPE_CLASSIC},
+	{}
+};
+
+static void ebeam_init_settings(struct ebeam_device *ebeam)
+{
+	ebeam->calibrated = false;
+
+	/* Init (x,y) min/max to raw ones */
+	ebeam->cursetting.min_x = ebeam->newsetting.min_x = MIN_RAW_X;
+	ebeam->cursetting.max_x = ebeam->newsetting.max_x = MAX_RAW_X;
+	ebeam->cursetting.min_y = ebeam->newsetting.min_y = MIN_RAW_Y;
+	ebeam->cursetting.max_y = ebeam->newsetting.max_y = MAX_RAW_Y;
+
+	/* Safe values for the H matrix (Identity) */
+	ebeam->cursetting.h1 = ebeam->newsetting.h1 = 1;
+	ebeam->cursetting.h2 = ebeam->newsetting.h2 = 0;
+	ebeam->cursetting.h3 = ebeam->newsetting.h3 = 0;
+
+	ebeam->cursetting.h4 = ebeam->newsetting.h4 = 0;
+	ebeam->cursetting.h5 = ebeam->newsetting.h5 = 1;
+	ebeam->cursetting.h6 = ebeam->newsetting.h6 = 0;
+
+	ebeam->cursetting.h7 = ebeam->newsetting.h7 = 0;
+	ebeam->cursetting.h8 = ebeam->newsetting.h8 = 0;
+	ebeam->cursetting.h9 = ebeam->newsetting.h9 = 1;
+}
+
+static void ebeam_setup_input(struct ebeam_device *ebeam,
+			      struct input_dev *input_dev)
+{
+	unsigned long flags;
+
+	/* Take event lock while modifying parameters */
+	spin_lock_irqsave(&input_dev->event_lock, flags);
+
+	/* Properties */
+	set_bit(INPUT_PROP_DIRECT,  input_dev->propbit);
+
+	/* Events generated */
+	set_bit(EV_KEY, input_dev->evbit);
+	set_bit(EV_ABS, input_dev->evbit);
+
+	/* Keys */
+	set_bit(BTN_LEFT,   input_dev->keybit);
+	set_bit(BTN_MIDDLE, input_dev->keybit);
+	set_bit(BTN_RIGHT,  input_dev->keybit);
+
+	/* Axis */
+	if (!ebeam->calibrated) {
+		ebeam->cursetting.min_x = MIN_RAW_X;
+		ebeam->cursetting.max_x = MAX_RAW_X;
+		ebeam->cursetting.min_y = MIN_RAW_Y;
+		ebeam->cursetting.max_y = MAX_RAW_Y;
+	}
+
+	input_set_abs_params(input_dev, ABS_X,
+			     ebeam->cursetting.min_x, ebeam->cursetting.max_x,
+			     0, 0);
+	input_set_abs_params(input_dev, ABS_Y,
+			     ebeam->cursetting.min_y, ebeam->cursetting.max_y,
+			     0, 0);
+
+	spin_unlock_irqrestore(&input_dev->event_lock, flags);
+}
+
+/*******************************************************************************
+ * sysfs part
+ */
+
+/*
+ * screen min/max and H matrix coefs
+ * _get return *current* value
+ * _set set new value
+ */
+#define DEVICE_MINMAX_ATTR(MM)						       \
+static ssize_t ebeam_##MM##_get(struct device *dev,			       \
+				struct device_attribute *attr,		       \
+				char *buf)				       \
+{									       \
+	struct ebeam_device *ebeam = dev_get_drvdata(dev);		       \
+									       \
+	return snprintf(buf, PAGE_SIZE, "%d\n", ebeam->cursetting.MM);	       \
+}									       \
+static ssize_t ebeam_##MM##_set(struct device *dev,			       \
+				struct device_attribute *attr,		       \
+				const char *buf,			       \
+				size_t count)				       \
+{									       \
+	struct ebeam_device *ebeam = dev_get_drvdata(dev);		       \
+	int err, MM;							       \
+									       \
+	err = kstrtoint(buf, 10, &MM);					       \
+	if (err)							       \
+		return err;						       \
+									       \
+	ebeam->newsetting.MM = MM;					       \
+	return count;							       \
+}									       \
+static DEVICE_ATTR(MM, S_IRUGO | S_IWUGO,				       \
+		   ebeam_##MM##_get,					       \
+		   ebeam_##MM##_set)
+
+DEVICE_MINMAX_ATTR(min_x);
+DEVICE_MINMAX_ATTR(max_x);
+DEVICE_MINMAX_ATTR(min_y);
+DEVICE_MINMAX_ATTR(max_y);
+
+#define DEVICE_H_ATTR(SET_ID)						       \
+static ssize_t ebeam_h##SET_ID##_get(struct device *dev,		       \
+				     struct device_attribute *attr,	       \
+				     char *buf)				       \
+{									       \
+	struct ebeam_device *ebeam = dev_get_drvdata(dev);		       \
+									       \
+	return snprintf(buf, PAGE_SIZE, "%lld\n", ebeam->cursetting.h##SET_ID);\
+}									       \
+static ssize_t ebeam_h##SET_ID##_set(struct device *dev,		       \
+				     struct device_attribute *attr,	       \
+				     const char *buf,			       \
+				     size_t count)			       \
+{									       \
+	struct ebeam_device *ebeam = dev_get_drvdata(dev);		       \
+	int err;							       \
+	u64 h;								       \
+									       \
+	err = kstrtoll(buf, 10, &h);					       \
+	if (err)							       \
+		return err;						       \
+									       \
+	ebeam->newsetting.h##SET_ID = h;				       \
+	return count;							       \
+}									       \
+static DEVICE_ATTR(h##SET_ID, S_IRUGO | S_IWUGO,			       \
+		   ebeam_h##SET_ID##_get,				       \
+		   ebeam_h##SET_ID##_set)
+
+DEVICE_H_ATTR(1);
+DEVICE_H_ATTR(2);
+DEVICE_H_ATTR(3);
+DEVICE_H_ATTR(4);
+DEVICE_H_ATTR(5);
+DEVICE_H_ATTR(6);
+DEVICE_H_ATTR(7);
+DEVICE_H_ATTR(8);
+DEVICE_H_ATTR(9);
+
+/*
+ * sysfs calibrated
+ * Once H matrix coefs are set, writing 1 to this file triggers
+ * coordinates mapping.
+ * Anything else reset the device to un-calibrated mode,
+ * storing cursetting in newsetting.
+*/
+static ssize_t ebeam_calibrated_get(struct device *dev,
+				    struct device_attribute *attr,
+				    char *buf)
+{
+	struct ebeam_device *ebeam = dev_get_drvdata(dev);
+
+	return snprintf(buf, PAGE_SIZE, "%d\n", ebeam->calibrated);
+}
+
+static ssize_t ebeam_calibrated_set(struct device *dev,
+				    struct device_attribute *attr,
+				    const char *buf,
+				    size_t count)
+{
+	struct ebeam_device *ebeam = dev_get_drvdata(dev);
+	int err, c;
+
+	err = kstrtoint(buf, 10, &c);
+	if (err)
+		return err;
+
+	if (c == 1) {
+		memcpy(&ebeam->cursetting, &ebeam->newsetting,
+		       sizeof(struct ebeam_settings));
+		ebeam->calibrated = true;
+		ebeam_setup_input(ebeam, ebeam->input);
+	} else {
+		memcpy(&ebeam->newsetting, &ebeam->cursetting,
+		       sizeof(struct ebeam_settings));
+		ebeam->calibrated = false;
+		ebeam_setup_input(ebeam, ebeam->input);
+	}
+
+	return count;
+}
+
+static DEVICE_ATTR(calibrated, S_IRUGO | S_IWUGO,
+		   ebeam_calibrated_get, ebeam_calibrated_set);
+
+static struct attribute *ebeam_attrs[] = {
+	&dev_attr_min_x.attr,
+	&dev_attr_min_y.attr,
+	&dev_attr_max_x.attr,
+	&dev_attr_max_y.attr,
+	&dev_attr_h1.attr,
+	&dev_attr_h2.attr,
+	&dev_attr_h3.attr,
+	&dev_attr_h4.attr,
+	&dev_attr_h5.attr,
+	&dev_attr_h6.attr,
+	&dev_attr_h7.attr,
+	&dev_attr_h8.attr,
+	&dev_attr_h9.attr,
+	&dev_attr_calibrated.attr,
+	NULL
+};
+
+static const struct attribute_group ebeam_attr_group = {
+	.attrs = ebeam_attrs,
+};
+
+/* IRQ */
+static int ebeam_read_data(struct ebeam_device *ebeam, unsigned char *pkt)
+{
+
+/*
+ * Packet description : 8 bytes
+ *
+ *  nop packet : FF FF FF FF FF FF FF FF
+ *
+ *  pkt[0] : Sensors
+ *	bit 1 : ultrasound signal (guessed)
+ *	bit 2 : IR signal (tested with a remote...) ;
+ *	readings OK : 0x03 (anything else is a show-stopper)
+ *
+ *  pkt[1] : raw_x low
+ *  pkt[2] : raw_x high
+ *
+ *  pkt[3] : raw_y low
+ *  pkt[4] : raw_y high
+ *
+ *  pkt[5] : fiability ?
+ *	often 0xC0
+ *	> 0x80 : OK
+ *
+ *  pkt[6] :
+ *	buttons state (low 4 bits)
+ *		0x1 = no buttons
+ *		bit 0 : tip (WARNING inversed : 0=pressed)
+ *		bit 1 : ? (always 0 during tests)
+ *		bit 2 : little (1=pressed)
+ *		bit 3 : big (1=pressed)
+ *
+ *	pointer ID : (hight 4 bits)
+ *		Tested  : 0x6=wand ;
+ *		Guessed : 0x1=red ; 0x2=blue ; 0x3=green ; 0x4=black ;
+ *			  0x5=eraser
+ *		bit 4 : pointer ID
+ *		bit 5 : pointer ID
+ *		bit 6 : pointer ID
+ *		bit 7 : pointer ID
+ *
+ *
+ *  pkt[7] : fiability ?
+ *	often 0xFF
+ *
+ */
+
+	/* Filtering bad/nop packet */
+	if (pkt[0] != 0x03)
+		return 0;
+
+	ebeam->raw_x = (pkt[2] << 8) | pkt[1];
+	ebeam->raw_y = (pkt[4] << 8) | pkt[3];
+
+	ebeam->btn_map = (!(pkt[6] & 0x1))	|
+			 ((pkt[6] & 0x4) >> 1)	|
+			 ((pkt[6] & 0x8) >> 1);
+
+	return 1;
+}
+
+/*
+ * IRQ
+ * compute screen coordinates from raw
+ * Overflow and negative values are user space's problem
+ */
+static bool ebeam_calculate_xy(struct ebeam_device *ebeam)
+{
+	/* 64-bits divisions handled by div64_s64 */
+
+	s64 scale;
+
+	if (!ebeam->calibrated) {
+		ebeam->x = ebeam->raw_x;
+		ebeam->y = ebeam->raw_y;
+	} else {
+		scale = ebeam->cursetting.h7 * ebeam->raw_x +
+			ebeam->cursetting.h8 * ebeam->raw_y +
+			ebeam->cursetting.h9;
+
+		/* Who want a division by zero in kernel ? */
+		if (scale == 0) {
+			dev_err(&(ebeam->interface)->dev,
+				"%s - Division by zero, wrong calibration.\n",
+				__func__);
+			dev_err(&(ebeam->interface)->dev,
+				"%s - Resetting to un-calibrated mode.\n",
+				__func__);
+			ebeam->calibrated = false;
+			return 0;
+		}
+
+		/*
+		 * We *must* round the result, but can't do (int) (v1/v2 + 0.5)
+		 *
+		 * (int) (v1/v2 + 0.5) <=> (int) ( (2*v1 + v2)/(2*v2) )
+		 */
+		ebeam->x =
+			(int) div64_s64((((ebeam->cursetting.h1 * ebeam->raw_x +
+					   ebeam->cursetting.h2 * ebeam->raw_y +
+					   ebeam->cursetting.h3) << 1) + scale),
+					   (scale << 1));
+		ebeam->y =
+			(int) div64_s64((((ebeam->cursetting.h4 * ebeam->raw_x +
+					   ebeam->cursetting.h5 * ebeam->raw_y +
+					   ebeam->cursetting.h6) << 1) + scale),
+					   (scale << 1));
+	}
+
+	return 1;
+}
+
+/* IRQ */
+static void ebeam_report_input(struct ebeam_device *ebeam)
+{
+	input_report_key(ebeam->input, BTN_LEFT,
+			 (ebeam->btn_map & EBEAM_BTN_TIP));
+	input_report_key(ebeam->input, BTN_MIDDLE,
+			 (ebeam->btn_map & EBEAM_BTN_LIT));
+	input_report_key(ebeam->input, BTN_RIGHT,
+			 (ebeam->btn_map & EBEAM_BTN_BIG));
+
+	input_report_abs(ebeam->input, ABS_X, ebeam->x);
+	input_report_abs(ebeam->input, ABS_Y, ebeam->y);
+
+	input_sync(ebeam->input);
+}
+
+/* IRQ */
+static void ebeam_process_pkt(struct ebeam_device *ebeam,
+			      unsigned char *pkt, int len)
+{
+	if (!ebeam_read_data(ebeam, pkt))
+		return;
+
+	if (!ebeam_calculate_xy(ebeam))
+		return;
+
+	ebeam_report_input(ebeam);
+}
+
+/* IRQ
+ * handler */
+static void ebeam_irq(struct urb *urb)
+{
+	struct ebeam_device *ebeam = urb->context;
+	struct device *dev = &ebeam->interface->dev;
+	int retval;
+
+	switch (urb->status) {
+	case 0:
+		/* success */
+		break;
+	case -ETIME:
+		/* this urb is timing out */
+		dev_dbg(dev,
+			"%s - urb timed out - was the device unplugged?\n",
+			__func__);
+		return;
+	case -ECONNRESET:
+	case -ENOENT:
+	case -ESHUTDOWN:
+	case -EPIPE:
+		/* this urb is terminated, clean up */
+		dev_dbg(dev, "%s - urb shutting down with status: %d\n",
+			__func__, urb->status);
+		return;
+	default:
+		dev_dbg(dev, "%s - nonzero urb status received: %d\n",
+			__func__, urb->status);
+		goto exit;
+	}
+
+	ebeam_process_pkt(ebeam, ebeam->data, urb->actual_length);
+
+exit:
+	usb_mark_last_busy(interface_to_usbdev(ebeam->interface));
+	retval = usb_submit_urb(urb, GFP_ATOMIC);
+	if (retval)
+		dev_err(dev, "%s - usb_submit_urb failed with result: %d\n",
+			__func__, retval);
+}
+
+static int ebeam_open(struct input_dev *input)
+{
+	struct ebeam_device *ebeam = input_get_drvdata(input);
+	int r;
+
+	ebeam->irq->dev = interface_to_usbdev(ebeam->interface);
+
+	r = usb_autopm_get_interface(ebeam->interface) ? -EIO : 0;
+	if (r < 0)
+		goto out;
+
+	if (usb_submit_urb(ebeam->irq, GFP_KERNEL)) {
+		r = -EIO;
+		goto out_put;
+	}
+
+	ebeam->interface->needs_remote_wakeup = 1;
+out_put:
+	usb_autopm_put_interface(ebeam->interface);
+out:
+	return r;
+}
+
+static void ebeam_close(struct input_dev *input)
+{
+	struct ebeam_device *ebeam = input_get_drvdata(input);
+	int r;
+
+	usb_kill_urb(ebeam->irq);
+
+	r = usb_autopm_get_interface(ebeam->interface);
+	ebeam->interface->needs_remote_wakeup = 0;
+
+	if (!r)
+		usb_autopm_put_interface(ebeam->interface);
+}
+
+static int ebeam_suspend(struct usb_interface *intf, pm_message_t message)
+{
+	struct ebeam_device *ebeam = usb_get_intfdata(intf);
+
+	usb_kill_urb(ebeam->irq);
+
+	return 0;
+}
+
+static int ebeam_resume(struct usb_interface *intf)
+{
+	struct ebeam_device *ebeam = usb_get_intfdata(intf);
+	struct input_dev *input = ebeam->input;
+	int result = 0;
+
+	mutex_lock(&input->mutex);
+	if (input->users)
+		result = usb_submit_urb(ebeam->irq, GFP_NOIO);
+	mutex_unlock(&input->mutex);
+
+	return result;
+}
+
+static int ebeam_reset_resume(struct usb_interface *intf)
+{
+	struct ebeam_device *ebeam = usb_get_intfdata(intf);
+	struct input_dev *input = ebeam->input;
+	int err = 0;
+
+	/* restart IO if needed */
+	mutex_lock(&input->mutex);
+	if (input->users)
+		err = usb_submit_urb(ebeam->irq, GFP_NOIO);
+	mutex_unlock(&input->mutex);
+
+	return err;
+}
+
+static void ebeam_free_buffers(struct usb_device *udev,
+			       struct ebeam_device *ebeam)
+{
+	usb_free_coherent(udev, REPT_SIZE,
+			  ebeam->data, ebeam->data_dma);
+	kfree(ebeam->buffer);
+}
+
+static struct usb_endpoint_descriptor *
+ebeam_get_input_endpoint(struct usb_host_interface *interface)
+{
+	int i;
+
+	for (i = 0; i < interface->desc.bNumEndpoints; i++)
+		if (usb_endpoint_dir_in(&interface->endpoint[i].desc))
+			return &interface->endpoint[i].desc;
+
+	return NULL;
+}
+
+static int ebeam_probe(struct usb_interface *intf,
+		       const struct usb_device_id *id)
+{
+	struct ebeam_device *ebeam;
+	struct input_dev *input_dev;
+	struct usb_endpoint_descriptor *endpoint;
+	struct usb_device *udev = interface_to_usbdev(intf);
+	int err = -ENOMEM;
+
+	endpoint = ebeam_get_input_endpoint(intf->cur_altsetting);
+	if (!endpoint)
+		return -ENXIO;
+
+	ebeam = kzalloc(sizeof(struct ebeam_device), GFP_KERNEL);
+	input_dev = input_allocate_device();
+	if (!ebeam || !input_dev)
+		goto out_free;
+
+	ebeam_init_settings(ebeam);
+
+	ebeam->data = usb_alloc_coherent(udev, REPT_SIZE,
+					 GFP_KERNEL, &ebeam->data_dma);
+	if (!ebeam->data)
+		goto out_free;
+
+	ebeam->irq = usb_alloc_urb(0, GFP_KERNEL);
+	if (!ebeam->irq) {
+		dev_dbg(&intf->dev,
+			"%s - usb_alloc_urb failed: ebeam->irq\n", __func__);
+		goto out_free_buffers;
+	}
+
+	ebeam->interface = intf;
+	ebeam->input = input_dev;
+
+	/* setup name */
+	snprintf(ebeam->name, sizeof(ebeam->name),
+		 "USB eBeam %04x:%04x",
+		 le16_to_cpu(udev->descriptor.idVendor),
+		 le16_to_cpu(udev->descriptor.idProduct));
+
+	if (udev->manufacturer || udev->product) {
+		strlcat(ebeam->name,
+			" (",
+			sizeof(ebeam->name));
+
+		if (udev->manufacturer)
+			strlcat(ebeam->name,
+				udev->manufacturer,
+				sizeof(ebeam->name));
+
+		if (udev->product) {
+			if (udev->manufacturer)
+				strlcat(ebeam->name,
+					" ",
+					sizeof(ebeam->name));
+			strlcat(ebeam->name,
+				udev->product,
+				sizeof(ebeam->name));
+		}
+
+		if (strlcat(ebeam->name, ")", sizeof(ebeam->name))
+			>= sizeof(ebeam->name)) {
+			/* overflowed, closing ) anyway */
+			ebeam->name[sizeof(ebeam->name)-2] = ')';
+		}
+	}
+
+	/* usb tree */
+	usb_make_path(udev, ebeam->phys, sizeof(ebeam->phys));
+	strlcat(ebeam->phys, "/input0", sizeof(ebeam->phys));
+
+	/* input setup */
+	input_dev->name = ebeam->name;
+	input_dev->phys = ebeam->phys;
+	usb_to_input_id(udev, &input_dev->id);
+	input_dev->dev.parent = &intf->dev;
+
+	input_set_drvdata(input_dev, ebeam);
+
+	input_dev->open = ebeam_open;
+	input_dev->close = ebeam_close;
+
+	/* usb urb setup */
+	if (usb_endpoint_type(endpoint) == USB_ENDPOINT_XFER_INT)
+		usb_fill_int_urb(ebeam->irq, udev,
+			usb_rcvintpipe(udev, endpoint->bEndpointAddress),
+			ebeam->data, REPT_SIZE,
+			ebeam_irq, ebeam, endpoint->bInterval);
+	else
+		usb_fill_bulk_urb(ebeam->irq, udev,
+			usb_rcvbulkpipe(udev, endpoint->bEndpointAddress),
+			ebeam->data, REPT_SIZE,
+			ebeam_irq, ebeam);
+
+	ebeam->irq->dev = udev;
+	ebeam->irq->transfer_dma = ebeam->data_dma;
+	ebeam->irq->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
+
+	/* input final setup */
+	err = input_register_device(ebeam->input);
+	if (err) {
+		dev_dbg(&intf->dev,
+			"%s - input_register_device failed, err: %d\n",
+			__func__, err);
+		goto out_free_urb;
+	}
+
+	ebeam_setup_input(ebeam, input_dev);
+
+	/* usb final setup */
+	usb_set_intfdata(intf, ebeam);
+
+	/* sysfs setup */
+	err = sysfs_create_group(&intf->dev.kobj, &ebeam_attr_group);
+	if (err) {
+		dev_dbg(&intf->dev,
+			"%s - cannot create sysfs group, err: %d\n",
+			__func__, err);
+		goto out_unregister_input;
+	}
+
+	return 0;
+
+out_unregister_input:
+	input_unregister_device(input_dev);
+	input_dev = NULL;
+out_free_urb:
+	usb_free_urb(ebeam->irq);
+out_free_buffers:
+	ebeam_free_buffers(udev, ebeam);
+out_free:
+	input_free_device(input_dev);
+	kfree(ebeam);
+	return err;
+}
+
+static void ebeam_disconnect(struct usb_interface *intf)
+{
+	struct ebeam_device *ebeam = usb_get_intfdata(intf);
+
+	if (!ebeam)
+		return;
+
+	dev_dbg(&intf->dev,
+		"%s - ebeam is initialized, cleaning up\n", __func__);
+
+	usb_set_intfdata(intf, NULL);
+	/* this will stop IO via close */
+	input_unregister_device(ebeam->input);
+	sysfs_remove_group(&intf->dev.kobj, &ebeam_attr_group);
+	usb_free_urb(ebeam->irq);
+	ebeam_free_buffers(interface_to_usbdev(intf), ebeam);
+	kfree(ebeam);
+}
+
+MODULE_DEVICE_TABLE(usb, ebeam_devices);
+
+static struct usb_driver ebeam_driver = {
+	.name			= "ebeam",
+	.probe			= ebeam_probe,
+	.disconnect		= ebeam_disconnect,
+	.suspend		= ebeam_suspend,
+	.resume			= ebeam_resume,
+	.reset_resume		= ebeam_reset_resume,
+	.id_table		= ebeam_devices,
+	.supports_autosuspend	= 1,
+};
+
+module_usb_driver(ebeam_driver);
+
+MODULE_AUTHOR(DRIVER_AUTHOR);
+MODULE_DESCRIPTION(DRIVER_DESC);
+MODULE_LICENSE("GPL");
+
-- 
1.7.10


^ permalink raw reply related	[flat|nested] 19+ messages in thread

* Re: [RFC ebeam PATCH v3 1/2] hid: Blacklist new eBeam classic device
  2012-08-06 21:21 ` [RFC ebeam PATCH v3 1/2] hid: Blacklist new eBeam classic device Yann Cantin
@ 2012-08-06 21:43   ` Greg KH
  2012-08-06 22:07     ` Dmitry Torokhov
  0 siblings, 1 reply; 19+ messages in thread
From: Greg KH @ 2012-08-06 21:43 UTC (permalink / raw)
  To: Yann Cantin; +Cc: linux-input, linux-usb, dmitry.torokhov, linux-kernel

On Mon, Aug 06, 2012 at 11:21:43PM +0200, Yann Cantin wrote:
> 
> Signed-off-by: Yann Cantin <yann.cantin@laposte.net>
> ---
>  drivers/hid/hid-core.c |    3 +++
>  drivers/hid/hid-ids.h  |    3 +++
>  2 files changed, 6 insertions(+)
> 
> diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c
> index 60ea284..b1ed8ee 100644
> --- a/drivers/hid/hid-core.c
> +++ b/drivers/hid/hid-core.c
> @@ -1908,6 +1908,9 @@ static const struct hid_device_id hid_ignore_list[] = {
>  	{ HID_USB_DEVICE(USB_VENDOR_ID_DELORME, USB_DEVICE_ID_DELORME_EM_LT20) },
>  	{ HID_USB_DEVICE(USB_VENDOR_ID_DREAM_CHEEKY, 0x0004) },
>  	{ HID_USB_DEVICE(USB_VENDOR_ID_DREAM_CHEEKY, 0x000a) },
> +#if defined(CONFIG_INPUT_EBEAM_USB)
> +	{ HID_USB_DEVICE(USB_VENDOR_ID_EFI, USB_DEVICE_ID_EFI_CLASSIC) },
> +#endif

Why is this #if in here?  Just always do it, how could it not be
defined?

greg k-h

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [RFC ebeam PATCH v3 2/2] input: misc: New USB eBeam input driver.
  2012-08-06 21:21 ` [RFC ebeam PATCH v3 2/2] input: misc: New USB eBeam input driver Yann Cantin
@ 2012-08-06 21:43   ` Greg KH
  2012-08-07  0:56       ` Yann Cantin
  0 siblings, 1 reply; 19+ messages in thread
From: Greg KH @ 2012-08-06 21:43 UTC (permalink / raw)
  To: Yann Cantin; +Cc: linux-input, linux-usb, dmitry.torokhov, linux-kernel

On Mon, Aug 06, 2012 at 11:21:44PM +0200, Yann Cantin wrote:
> 
> Signed-off-by: Yann Cantin <yann.cantin@laposte.net>
> ---
>  drivers/input/misc/ebeam.c |  764 ++++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 764 insertions(+)
>  create mode 100644 drivers/input/misc/ebeam.c

What adds this file to the build?

greg k-h

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [RFC ebeam PATCH v3 0/2]
  2012-08-06 21:21 [RFC ebeam PATCH v3 0/2] Yann Cantin
  2012-08-06 21:21 ` [RFC ebeam PATCH v3 1/2] hid: Blacklist new eBeam classic device Yann Cantin
  2012-08-06 21:21 ` [RFC ebeam PATCH v3 2/2] input: misc: New USB eBeam input driver Yann Cantin
@ 2012-08-06 21:44 ` Greg KH
  2012-08-06 22:09   ` Dmitry Torokhov
  2 siblings, 1 reply; 19+ messages in thread
From: Greg KH @ 2012-08-06 21:44 UTC (permalink / raw)
  To: Yann Cantin; +Cc: linux-input, linux-usb, dmitry.torokhov, linux-kernel

On Mon, Aug 06, 2012 at 11:21:42PM +0200, Yann Cantin wrote:
> Hi,
> 
> New USB input driver for eBeam devices.
> 
> Currently, only the Luidia eBeam classic projection model is supported.
> Edge model and a NEC interactive video-projector support planned for the
> end of the mounth. 
> 
> Patch 1 to blacklist the device for hid generic-usb.
> 
> Patch 2 is the actual driver.
> 
> Changes from previous :
> - switch to div64_s64 for portable 64/64-bits divisions
> - some cosmetics in device name
> - unused include and def removed
> - variables name changes for readability
> 
> Pending issues :
> - sysfs custom files : need to pass 13 parameters for calibration :
>   choice is between lots of simply-handled, or few with a big sscanf.

sysfs is "one value per file", so use lots of different files please.

greg k-h

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [RFC ebeam PATCH v3 1/2] hid: Blacklist new eBeam classic device
  2012-08-06 21:43   ` Greg KH
@ 2012-08-06 22:07     ` Dmitry Torokhov
  2012-08-07  1:21         ` Yann Cantin
  0 siblings, 1 reply; 19+ messages in thread
From: Dmitry Torokhov @ 2012-08-06 22:07 UTC (permalink / raw)
  To: Greg KH; +Cc: Yann Cantin, linux-input, linux-usb, linux-kernel

On Monday, August 06, 2012 02:43:40 PM Greg KH wrote:
> On Mon, Aug 06, 2012 at 11:21:43PM +0200, Yann Cantin wrote:
> > Signed-off-by: Yann Cantin <yann.cantin@laposte.net>
> > ---
> > 
> >  drivers/hid/hid-core.c |    3 +++
> >  drivers/hid/hid-ids.h  |    3 +++
> >  2 files changed, 6 insertions(+)
> > 
> > diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c
> > index 60ea284..b1ed8ee 100644
> > --- a/drivers/hid/hid-core.c
> > +++ b/drivers/hid/hid-core.c
> > @@ -1908,6 +1908,9 @@ static const struct hid_device_id hid_ignore_list[]
> > = {> 
> >  	{ HID_USB_DEVICE(USB_VENDOR_ID_DELORME, USB_DEVICE_ID_DELORME_EM_LT20)
> >  	},
> >  	{ HID_USB_DEVICE(USB_VENDOR_ID_DREAM_CHEEKY, 0x0004) },
> >  	{ HID_USB_DEVICE(USB_VENDOR_ID_DREAM_CHEEKY, 0x000a) },
> > 
> > +#if defined(CONFIG_INPUT_EBEAM_USB)
> > +	{ HID_USB_DEVICE(USB_VENDOR_ID_EFI, USB_DEVICE_ID_EFI_CLASSIC) },
> > +#endif
> 
> Why is this #if in here?  Just always do it, how could it not be
> defined?

User might disable the driver and CONFIG_INPUT_EBEAM_USB will not be
set. But I agree, since the device is unusable with generic HID driver
there is no point in doing this conditionally.

-- 
Dmitry

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [RFC ebeam PATCH v3 0/2]
  2012-08-06 21:44 ` [RFC ebeam PATCH v3 0/2] Greg KH
@ 2012-08-06 22:09   ` Dmitry Torokhov
  2012-08-07  1:45     ` Yann Cantin
  0 siblings, 1 reply; 19+ messages in thread
From: Dmitry Torokhov @ 2012-08-06 22:09 UTC (permalink / raw)
  To: Greg KH; +Cc: Yann Cantin, linux-input, linux-usb, linux-kernel

On Monday, August 06, 2012 02:44:23 PM Greg KH wrote:
> On Mon, Aug 06, 2012 at 11:21:42PM +0200, Yann Cantin wrote:
> > Hi,
> > 
> > New USB input driver for eBeam devices.
> > 
> > Currently, only the Luidia eBeam classic projection model is supported.
> > Edge model and a NEC interactive video-projector support planned for the
> > end of the mounth.
> > 
> > Patch 1 to blacklist the device for hid generic-usb.
> > 
> > Patch 2 is the actual driver.
> > 
> > Changes from previous :
> > - switch to div64_s64 for portable 64/64-bits divisions

Do you really need this much precision? It will be slower on 32 bits..

> > - some cosmetics in device name
> > - unused include and def removed
> > - variables name changes for readability
> > 
> > Pending issues :
> > 
> > - sysfs custom files : need to pass 13 parameters for calibration :
> >   choice is between lots of simply-handled, or few with a big sscanf.
> 
> sysfs is "one value per file", so use lots of different files please.

This is kind of a "one value" though - it is a transformation matrix.
Maybe switch it to binary - 9 s32?

-- 
Dmitry

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [RFC ebeam PATCH v3 2/2] input: misc: New USB eBeam input driver.
  2012-08-06 21:43   ` Greg KH
@ 2012-08-07  0:56       ` Yann Cantin
  0 siblings, 0 replies; 19+ messages in thread
From: Yann Cantin @ 2012-08-07  0:56 UTC (permalink / raw)
  To: Greg KH; +Cc: linux-input, linux-usb, dmitry.torokhov, linux-kernel

Hi,

Le 06/08/2012 23:43, Greg KH a écrit :
> On Mon, Aug 06, 2012 at 11:21:44PM +0200, Yann Cantin wrote:
>>
>> Signed-off-by: Yann Cantin <yann.cantin@laposte.net>
>> ---
>>  drivers/input/misc/ebeam.c |  764 ++++++++++++++++++++++++++++++++++++++++++++
>>  1 file changed, 764 insertions(+)
>>  create mode 100644 drivers/input/misc/ebeam.c
> 
> What adds this file to the build?
 
Sorry, i don't get it : what do you mean ?

> greg k-h

-- 
Yann Cantin
A4FEB47F
--

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [RFC ebeam PATCH v3 2/2] input: misc: New USB eBeam input driver.
@ 2012-08-07  0:56       ` Yann Cantin
  0 siblings, 0 replies; 19+ messages in thread
From: Yann Cantin @ 2012-08-07  0:56 UTC (permalink / raw)
  To: Greg KH; +Cc: linux-input, linux-usb, dmitry.torokhov, linux-kernel

Hi,

Le 06/08/2012 23:43, Greg KH a écrit :
> On Mon, Aug 06, 2012 at 11:21:44PM +0200, Yann Cantin wrote:
>>
>> Signed-off-by: Yann Cantin <yann.cantin@laposte.net>
>> ---
>>  drivers/input/misc/ebeam.c |  764 ++++++++++++++++++++++++++++++++++++++++++++
>>  1 file changed, 764 insertions(+)
>>  create mode 100644 drivers/input/misc/ebeam.c
> 
> What adds this file to the build?
 
Sorry, i don't get it : what do you mean ?

> greg k-h

-- 
Yann Cantin
A4FEB47F
--
--
To unsubscribe from this list: send the line "unsubscribe linux-input" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [RFC ebeam PATCH v3 1/2] hid: Blacklist new eBeam classic device
  2012-08-06 22:07     ` Dmitry Torokhov
@ 2012-08-07  1:21         ` Yann Cantin
  0 siblings, 0 replies; 19+ messages in thread
From: Yann Cantin @ 2012-08-07  1:21 UTC (permalink / raw)
  To: Dmitry Torokhov; +Cc: Greg KH, linux-input, linux-usb, linux-kernel

Le 07/08/2012 00:07, Dmitry Torokhov a écrit :
> On Monday, August 06, 2012 02:43:40 PM Greg KH wrote:
>> On Mon, Aug 06, 2012 at 11:21:43PM +0200, Yann Cantin wrote:
>>> Signed-off-by: Yann Cantin <yann.cantin@laposte.net>
>>> ---
>>>
>>>  drivers/hid/hid-core.c |    3 +++
>>>  drivers/hid/hid-ids.h  |    3 +++
>>>  2 files changed, 6 insertions(+)
>>>
>>> diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c
>>> index 60ea284..b1ed8ee 100644
>>> --- a/drivers/hid/hid-core.c
>>> +++ b/drivers/hid/hid-core.c
>>> @@ -1908,6 +1908,9 @@ static const struct hid_device_id hid_ignore_list[]
>>> = {> 
>>>  	{ HID_USB_DEVICE(USB_VENDOR_ID_DELORME, USB_DEVICE_ID_DELORME_EM_LT20)
>>>  	},
>>>  	{ HID_USB_DEVICE(USB_VENDOR_ID_DREAM_CHEEKY, 0x0004) },
>>>  	{ HID_USB_DEVICE(USB_VENDOR_ID_DREAM_CHEEKY, 0x000a) },
>>>
>>> +#if defined(CONFIG_INPUT_EBEAM_USB)
>>> +	{ HID_USB_DEVICE(USB_VENDOR_ID_EFI, USB_DEVICE_ID_EFI_CLASSIC) },
>>> +#endif
>>
>> Why is this #if in here?  Just always do it, how could it not be
>> defined?
> 
> User might disable the driver and CONFIG_INPUT_EBEAM_USB will not be
> set. But I agree, since the device is unusable with generic HID driver
> there is no point in doing this conditionally.

There's a closed-source user-space stack (libusb based daemon + xorg driver
+ wine apps) provided for some distro (Ubuntu 10.04, works on mandriva 2010,
maybe others but break on recent xorg).

I don't know exactly what to do : i don't want to break hypothetical support,
even proprietary.
Leaving the choice at kernel compile time seems to be safer, no ?

-- 
Yann Cantin
A4FEB47F
--

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [RFC ebeam PATCH v3 1/2] hid: Blacklist new eBeam classic device
@ 2012-08-07  1:21         ` Yann Cantin
  0 siblings, 0 replies; 19+ messages in thread
From: Yann Cantin @ 2012-08-07  1:21 UTC (permalink / raw)
  To: Dmitry Torokhov; +Cc: Greg KH, linux-input, linux-usb, linux-kernel

Le 07/08/2012 00:07, Dmitry Torokhov a écrit :
> On Monday, August 06, 2012 02:43:40 PM Greg KH wrote:
>> On Mon, Aug 06, 2012 at 11:21:43PM +0200, Yann Cantin wrote:
>>> Signed-off-by: Yann Cantin <yann.cantin@laposte.net>
>>> ---
>>>
>>>  drivers/hid/hid-core.c |    3 +++
>>>  drivers/hid/hid-ids.h  |    3 +++
>>>  2 files changed, 6 insertions(+)
>>>
>>> diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c
>>> index 60ea284..b1ed8ee 100644
>>> --- a/drivers/hid/hid-core.c
>>> +++ b/drivers/hid/hid-core.c
>>> @@ -1908,6 +1908,9 @@ static const struct hid_device_id hid_ignore_list[]
>>> = {> 
>>>  	{ HID_USB_DEVICE(USB_VENDOR_ID_DELORME, USB_DEVICE_ID_DELORME_EM_LT20)
>>>  	},
>>>  	{ HID_USB_DEVICE(USB_VENDOR_ID_DREAM_CHEEKY, 0x0004) },
>>>  	{ HID_USB_DEVICE(USB_VENDOR_ID_DREAM_CHEEKY, 0x000a) },
>>>
>>> +#if defined(CONFIG_INPUT_EBEAM_USB)
>>> +	{ HID_USB_DEVICE(USB_VENDOR_ID_EFI, USB_DEVICE_ID_EFI_CLASSIC) },
>>> +#endif
>>
>> Why is this #if in here?  Just always do it, how could it not be
>> defined?
> 
> User might disable the driver and CONFIG_INPUT_EBEAM_USB will not be
> set. But I agree, since the device is unusable with generic HID driver
> there is no point in doing this conditionally.

There's a closed-source user-space stack (libusb based daemon + xorg driver
+ wine apps) provided for some distro (Ubuntu 10.04, works on mandriva 2010,
maybe others but break on recent xorg).

I don't know exactly what to do : i don't want to break hypothetical support,
even proprietary.
Leaving the choice at kernel compile time seems to be safer, no ?

-- 
Yann Cantin
A4FEB47F
--
--
To unsubscribe from this list: send the line "unsubscribe linux-input" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [RFC ebeam PATCH v3 2/2] input: misc: New USB eBeam input driver.
  2012-08-07  0:56       ` Yann Cantin
  (?)
@ 2012-08-07  1:43       ` Dmitry Torokhov
  2012-08-07  7:59           ` Yann Cantin
  -1 siblings, 1 reply; 19+ messages in thread
From: Dmitry Torokhov @ 2012-08-07  1:43 UTC (permalink / raw)
  To: Yann Cantin; +Cc: Greg KH, linux-input, linux-usb, linux-kernel

On Tue, Aug 07, 2012 at 02:56:40AM +0200, Yann Cantin wrote:
> Hi,
> 
> Le 06/08/2012 23:43, Greg KH a écrit :
> > On Mon, Aug 06, 2012 at 11:21:44PM +0200, Yann Cantin wrote:
> >>
> >> Signed-off-by: Yann Cantin <yann.cantin@laposte.net>
> >> ---
> >>  drivers/input/misc/ebeam.c |  764 ++++++++++++++++++++++++++++++++++++++++++++
> >>  1 file changed, 764 insertions(+)
> >>  create mode 100644 drivers/input/misc/ebeam.c
> > 
> > What adds this file to the build?
>  
> Sorry, i don't get it : what do you mean ?

Greg meant that you forgot to include Makefile and Kconfig changes with
this patch.

-- 
Dmitry

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [RFC ebeam PATCH v3 1/2] hid: Blacklist new eBeam classic device
  2012-08-07  1:21         ` Yann Cantin
  (?)
@ 2012-08-07  1:45         ` Dmitry Torokhov
  2012-08-07  8:10             ` Yann Cantin
  -1 siblings, 1 reply; 19+ messages in thread
From: Dmitry Torokhov @ 2012-08-07  1:45 UTC (permalink / raw)
  To: Yann Cantin; +Cc: Greg KH, linux-input, linux-usb, linux-kernel

On Tue, Aug 07, 2012 at 03:21:45AM +0200, Yann Cantin wrote:
> Le 07/08/2012 00:07, Dmitry Torokhov a écrit :
> > On Monday, August 06, 2012 02:43:40 PM Greg KH wrote:
> >> On Mon, Aug 06, 2012 at 11:21:43PM +0200, Yann Cantin wrote:
> >>> Signed-off-by: Yann Cantin <yann.cantin@laposte.net>
> >>> ---
> >>>
> >>>  drivers/hid/hid-core.c |    3 +++
> >>>  drivers/hid/hid-ids.h  |    3 +++
> >>>  2 files changed, 6 insertions(+)
> >>>
> >>> diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c
> >>> index 60ea284..b1ed8ee 100644
> >>> --- a/drivers/hid/hid-core.c
> >>> +++ b/drivers/hid/hid-core.c
> >>> @@ -1908,6 +1908,9 @@ static const struct hid_device_id hid_ignore_list[]
> >>> = {> 
> >>>  	{ HID_USB_DEVICE(USB_VENDOR_ID_DELORME, USB_DEVICE_ID_DELORME_EM_LT20)
> >>>  	},
> >>>  	{ HID_USB_DEVICE(USB_VENDOR_ID_DREAM_CHEEKY, 0x0004) },
> >>>  	{ HID_USB_DEVICE(USB_VENDOR_ID_DREAM_CHEEKY, 0x000a) },
> >>>
> >>> +#if defined(CONFIG_INPUT_EBEAM_USB)
> >>> +	{ HID_USB_DEVICE(USB_VENDOR_ID_EFI, USB_DEVICE_ID_EFI_CLASSIC) },
> >>> +#endif
> >>
> >> Why is this #if in here?  Just always do it, how could it not be
> >> defined?
> > 
> > User might disable the driver and CONFIG_INPUT_EBEAM_USB will not be
> > set. But I agree, since the device is unusable with generic HID driver
> > there is no point in doing this conditionally.
> 
> There's a closed-source user-space stack (libusb based daemon + xorg driver
> + wine apps) provided for some distro (Ubuntu 10.04, works on mandriva 2010,
> maybe others but break on recent xorg).
> 
> I don't know exactly what to do : i don't want to break hypothetical support,
> even proprietary.
> Leaving the choice at kernel compile time seems to be safer, no ?

If they are using libusb that means that they use userspace solution and
do not require HID or any other in-kernel driver. They should still be
able to claim the port even if your driver is in use.

Thanks.

-- 
Dmitry

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [RFC ebeam PATCH v3 0/2]
  2012-08-06 22:09   ` Dmitry Torokhov
@ 2012-08-07  1:45     ` Yann Cantin
  0 siblings, 0 replies; 19+ messages in thread
From: Yann Cantin @ 2012-08-07  1:45 UTC (permalink / raw)
  To: Dmitry Torokhov; +Cc: Greg KH, linux-input, linux-usb, linux-kernel

Le 07/08/2012 00:09, Dmitry Torokhov a écrit :
> On Monday, August 06, 2012 02:44:23 PM Greg KH wrote:
>> On Mon, Aug 06, 2012 at 11:21:42PM +0200, Yann Cantin wrote:
>>> Hi,
>>>
>>> New USB input driver for eBeam devices.
>>>
>>> Currently, only the Luidia eBeam classic projection model is supported.
>>> Edge model and a NEC interactive video-projector support planned for the
>>> end of the mounth.
>>>
>>> Patch 1 to blacklist the device for hid generic-usb.
>>>
>>> Patch 2 is the actual driver.
>>>
>>> Changes from previous :
>>> - switch to div64_s64 for portable 64/64-bits divisions
> 
> Do you really need this much precision? It will be slower on 32 bits..

Yes. I can give the details if you want (homography computation without
floating point maths).

>>> - some cosmetics in device name
>>> - unused include and def removed
>>> - variables name changes for readability
>>>
>>> Pending issues :
>>>
>>> - sysfs custom files : need to pass 13 parameters for calibration :
>>>   choice is between lots of simply-handled, or few with a big sscanf.
>>
>> sysfs is "one value per file", so use lots of different files please.
> 
> This is kind of a "one value" though - it is a transformation matrix.
> Maybe switch it to binary - 9 s32?

Right, but this somehow obfuscate the api. In the other hand, i doubt
there will be lots of calibration tools other that mine.

Is there any drawback for numerous sysfs custom files ?

-- 
Yann Cantin
A4FEB47F
--

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [RFC ebeam PATCH v3 2/2] input: misc: New USB eBeam input driver.
  2012-08-07  1:43       ` Dmitry Torokhov
@ 2012-08-07  7:59           ` Yann Cantin
  0 siblings, 0 replies; 19+ messages in thread
From: Yann Cantin @ 2012-08-07  7:59 UTC (permalink / raw)
  To: Dmitry Torokhov; +Cc: Greg KH, linux-input, linux-usb, linux-kernel

Le 07/08/2012 03:43, Dmitry Torokhov a écrit :
> On Tue, Aug 07, 2012 at 02:56:40AM +0200, Yann Cantin wrote:
>> Hi,
>>
>> Le 06/08/2012 23:43, Greg KH a écrit :
>>> On Mon, Aug 06, 2012 at 11:21:44PM +0200, Yann Cantin wrote:
>>>>
>>>> Signed-off-by: Yann Cantin <yann.cantin@laposte.net>
>>>> ---
>>>>  drivers/input/misc/ebeam.c |  764 ++++++++++++++++++++++++++++++++++++++++++++
>>>>  1 file changed, 764 insertions(+)
>>>>  create mode 100644 drivers/input/misc/ebeam.c
>>>
>>> What adds this file to the build?
>>  
>> Sorry, i don't get it : what do you mean ?
> 
> Greg meant that you forgot to include Makefile and Kconfig changes with
> this patch.
 
My bad. Looked twice and yet miss that...
Will be in v4. For info :

---
diff --git a/drivers/input/misc/Kconfig b/drivers/input/misc/Kconfig
index 7c0f1ec..1e575e4 100644
--- a/drivers/input/misc/Kconfig
+++ b/drivers/input/misc/Kconfig
@@ -83,6 +83,22 @@ config INPUT_BMA150
 	  To compile this driver as a module, choose M here: the
 	  module will be called bma150.
 
+config INPUT_EBEAM_USB
+	tristate "USB eBeam driver"
+	depends on USB_ARCH_HAS_HCD
+	select USB
+	help
+	  Say Y here if you have a USB eBeam pointing device and want to
+	  use it without any proprietary user space tools.
+
+	  Have a look at <http://sourceforge.net/projects/ebeam/> for
+	  a usage description and the required user-space tools.
+
+	  Currently, only the Classic Projection model is supported.
+
+	  To compile this driver as a module, choose M here: the
+	  module will be called ebeam.
+
 config INPUT_PCSPKR
 	tristate "PC Speaker support"
 	depends on PCSPKR_PLATFORM
diff --git a/drivers/input/misc/Makefile b/drivers/input/misc/Makefile
index 83fe6f5..2aa9813 100644
--- a/drivers/input/misc/Makefile
+++ b/drivers/input/misc/Makefile
@@ -24,6 +24,7 @@ obj-$(CONFIG_INPUT_CMA3000_I2C)		+= cma3000_d0x_i2c.o
 obj-$(CONFIG_INPUT_COBALT_BTNS)		+= cobalt_btns.o
 obj-$(CONFIG_INPUT_DA9052_ONKEY)	+= da9052_onkey.o
 obj-$(CONFIG_INPUT_DM355EVM)		+= dm355evm_keys.o
+obj-$(CONFIG_INPUT_EBEAM_USB)		+= ebeam.o
 obj-$(CONFIG_INPUT_GP2A)		+= gp2ap002a00f.o
 obj-$(CONFIG_INPUT_GPIO_TILT_POLLED)	+= gpio_tilt_polled.o
 obj-$(CONFIG_HP_SDC_RTC)		+= hp_sdc_rtc.o

-- 
Yann Cantin
A4FEB47F
--

^ permalink raw reply related	[flat|nested] 19+ messages in thread

* Re: [RFC ebeam PATCH v3 2/2] input: misc: New USB eBeam input driver.
@ 2012-08-07  7:59           ` Yann Cantin
  0 siblings, 0 replies; 19+ messages in thread
From: Yann Cantin @ 2012-08-07  7:59 UTC (permalink / raw)
  To: Dmitry Torokhov; +Cc: Greg KH, linux-input, linux-usb, linux-kernel

Le 07/08/2012 03:43, Dmitry Torokhov a écrit :
> On Tue, Aug 07, 2012 at 02:56:40AM +0200, Yann Cantin wrote:
>> Hi,
>>
>> Le 06/08/2012 23:43, Greg KH a écrit :
>>> On Mon, Aug 06, 2012 at 11:21:44PM +0200, Yann Cantin wrote:
>>>>
>>>> Signed-off-by: Yann Cantin <yann.cantin@laposte.net>
>>>> ---
>>>>  drivers/input/misc/ebeam.c |  764 ++++++++++++++++++++++++++++++++++++++++++++
>>>>  1 file changed, 764 insertions(+)
>>>>  create mode 100644 drivers/input/misc/ebeam.c
>>>
>>> What adds this file to the build?
>>  
>> Sorry, i don't get it : what do you mean ?
> 
> Greg meant that you forgot to include Makefile and Kconfig changes with
> this patch.
 
My bad. Looked twice and yet miss that...
Will be in v4. For info :

---
diff --git a/drivers/input/misc/Kconfig b/drivers/input/misc/Kconfig
index 7c0f1ec..1e575e4 100644
--- a/drivers/input/misc/Kconfig
+++ b/drivers/input/misc/Kconfig
@@ -83,6 +83,22 @@ config INPUT_BMA150
 	  To compile this driver as a module, choose M here: the
 	  module will be called bma150.
 
+config INPUT_EBEAM_USB
+	tristate "USB eBeam driver"
+	depends on USB_ARCH_HAS_HCD
+	select USB
+	help
+	  Say Y here if you have a USB eBeam pointing device and want to
+	  use it without any proprietary user space tools.
+
+	  Have a look at <http://sourceforge.net/projects/ebeam/> for
+	  a usage description and the required user-space tools.
+
+	  Currently, only the Classic Projection model is supported.
+
+	  To compile this driver as a module, choose M here: the
+	  module will be called ebeam.
+
 config INPUT_PCSPKR
 	tristate "PC Speaker support"
 	depends on PCSPKR_PLATFORM
diff --git a/drivers/input/misc/Makefile b/drivers/input/misc/Makefile
index 83fe6f5..2aa9813 100644
--- a/drivers/input/misc/Makefile
+++ b/drivers/input/misc/Makefile
@@ -24,6 +24,7 @@ obj-$(CONFIG_INPUT_CMA3000_I2C)		+= cma3000_d0x_i2c.o
 obj-$(CONFIG_INPUT_COBALT_BTNS)		+= cobalt_btns.o
 obj-$(CONFIG_INPUT_DA9052_ONKEY)	+= da9052_onkey.o
 obj-$(CONFIG_INPUT_DM355EVM)		+= dm355evm_keys.o
+obj-$(CONFIG_INPUT_EBEAM_USB)		+= ebeam.o
 obj-$(CONFIG_INPUT_GP2A)		+= gp2ap002a00f.o
 obj-$(CONFIG_INPUT_GPIO_TILT_POLLED)	+= gpio_tilt_polled.o
 obj-$(CONFIG_HP_SDC_RTC)		+= hp_sdc_rtc.o

-- 
Yann Cantin
A4FEB47F
--
--
To unsubscribe from this list: send the line "unsubscribe linux-input" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply related	[flat|nested] 19+ messages in thread

* Re: [RFC ebeam PATCH v3 1/2] hid: Blacklist new eBeam classic device
  2012-08-07  1:45         ` Dmitry Torokhov
@ 2012-08-07  8:10             ` Yann Cantin
  0 siblings, 0 replies; 19+ messages in thread
From: Yann Cantin @ 2012-08-07  8:10 UTC (permalink / raw)
  To: Dmitry Torokhov; +Cc: Greg KH, linux-input, linux-usb, linux-kernel

Le 07/08/2012 03:45, Dmitry Torokhov a écrit :
> On Tue, Aug 07, 2012 at 03:21:45AM +0200, Yann Cantin wrote:
>> Le 07/08/2012 00:07, Dmitry Torokhov a écrit :
>>> On Monday, August 06, 2012 02:43:40 PM Greg KH wrote:
>>>> On Mon, Aug 06, 2012 at 11:21:43PM +0200, Yann Cantin wrote:
>>>>> Signed-off-by: Yann Cantin <yann.cantin@laposte.net>
>>>>> ---
>>>>>
>>>>>  drivers/hid/hid-core.c |    3 +++
>>>>>  drivers/hid/hid-ids.h  |    3 +++
>>>>>  2 files changed, 6 insertions(+)
>>>>>
>>>>> diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c
>>>>> index 60ea284..b1ed8ee 100644
>>>>> --- a/drivers/hid/hid-core.c
>>>>> +++ b/drivers/hid/hid-core.c
>>>>> @@ -1908,6 +1908,9 @@ static const struct hid_device_id hid_ignore_list[]
>>>>> = {> 
>>>>>  	{ HID_USB_DEVICE(USB_VENDOR_ID_DELORME, USB_DEVICE_ID_DELORME_EM_LT20)
>>>>>  	},
>>>>>  	{ HID_USB_DEVICE(USB_VENDOR_ID_DREAM_CHEEKY, 0x0004) },
>>>>>  	{ HID_USB_DEVICE(USB_VENDOR_ID_DREAM_CHEEKY, 0x000a) },
>>>>>
>>>>> +#if defined(CONFIG_INPUT_EBEAM_USB)
>>>>> +	{ HID_USB_DEVICE(USB_VENDOR_ID_EFI, USB_DEVICE_ID_EFI_CLASSIC) },
>>>>> +#endif
>>>>
>>>> Why is this #if in here?  Just always do it, how could it not be
>>>> defined?
>>>
>>> User might disable the driver and CONFIG_INPUT_EBEAM_USB will not be
>>> set. But I agree, since the device is unusable with generic HID driver
>>> there is no point in doing this conditionally.
>>
>> There's a closed-source user-space stack (libusb based daemon + xorg driver
>> + wine apps) provided for some distro (Ubuntu 10.04, works on mandriva 2010,
>> maybe others but break on recent xorg).
>>
>> I don't know exactly what to do : i don't want to break hypothetical support,
>> even proprietary.
>> Leaving the choice at kernel compile time seems to be safer, no ?
> 
> If they are using libusb that means that they use userspace solution and
> do not require HID or any other in-kernel driver. They should still be
> able to claim the port even if your driver is in use.

Ok, that solve one of my issue.
But if the driver isn't built, there will be absolutely no kernel support,
even basic hiddev/hidraw. Is there a kernel policy for that situation ?

-- 
Yann Cantin
A4FEB47F
--

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [RFC ebeam PATCH v3 1/2] hid: Blacklist new eBeam classic device
@ 2012-08-07  8:10             ` Yann Cantin
  0 siblings, 0 replies; 19+ messages in thread
From: Yann Cantin @ 2012-08-07  8:10 UTC (permalink / raw)
  To: Dmitry Torokhov; +Cc: Greg KH, linux-input, linux-usb, linux-kernel

Le 07/08/2012 03:45, Dmitry Torokhov a écrit :
> On Tue, Aug 07, 2012 at 03:21:45AM +0200, Yann Cantin wrote:
>> Le 07/08/2012 00:07, Dmitry Torokhov a écrit :
>>> On Monday, August 06, 2012 02:43:40 PM Greg KH wrote:
>>>> On Mon, Aug 06, 2012 at 11:21:43PM +0200, Yann Cantin wrote:
>>>>> Signed-off-by: Yann Cantin <yann.cantin@laposte.net>
>>>>> ---
>>>>>
>>>>>  drivers/hid/hid-core.c |    3 +++
>>>>>  drivers/hid/hid-ids.h  |    3 +++
>>>>>  2 files changed, 6 insertions(+)
>>>>>
>>>>> diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c
>>>>> index 60ea284..b1ed8ee 100644
>>>>> --- a/drivers/hid/hid-core.c
>>>>> +++ b/drivers/hid/hid-core.c
>>>>> @@ -1908,6 +1908,9 @@ static const struct hid_device_id hid_ignore_list[]
>>>>> = {> 
>>>>>  	{ HID_USB_DEVICE(USB_VENDOR_ID_DELORME, USB_DEVICE_ID_DELORME_EM_LT20)
>>>>>  	},
>>>>>  	{ HID_USB_DEVICE(USB_VENDOR_ID_DREAM_CHEEKY, 0x0004) },
>>>>>  	{ HID_USB_DEVICE(USB_VENDOR_ID_DREAM_CHEEKY, 0x000a) },
>>>>>
>>>>> +#if defined(CONFIG_INPUT_EBEAM_USB)
>>>>> +	{ HID_USB_DEVICE(USB_VENDOR_ID_EFI, USB_DEVICE_ID_EFI_CLASSIC) },
>>>>> +#endif
>>>>
>>>> Why is this #if in here?  Just always do it, how could it not be
>>>> defined?
>>>
>>> User might disable the driver and CONFIG_INPUT_EBEAM_USB will not be
>>> set. But I agree, since the device is unusable with generic HID driver
>>> there is no point in doing this conditionally.
>>
>> There's a closed-source user-space stack (libusb based daemon + xorg driver
>> + wine apps) provided for some distro (Ubuntu 10.04, works on mandriva 2010,
>> maybe others but break on recent xorg).
>>
>> I don't know exactly what to do : i don't want to break hypothetical support,
>> even proprietary.
>> Leaving the choice at kernel compile time seems to be safer, no ?
> 
> If they are using libusb that means that they use userspace solution and
> do not require HID or any other in-kernel driver. They should still be
> able to claim the port even if your driver is in use.

Ok, that solve one of my issue.
But if the driver isn't built, there will be absolutely no kernel support,
even basic hiddev/hidraw. Is there a kernel policy for that situation ?

-- 
Yann Cantin
A4FEB47F
--
--
To unsubscribe from this list: send the line "unsubscribe linux-input" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 19+ messages in thread

end of thread, other threads:[~2012-08-07  8:09 UTC | newest]

Thread overview: 19+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-08-06 21:21 [RFC ebeam PATCH v3 0/2] Yann Cantin
2012-08-06 21:21 ` [RFC ebeam PATCH v3 1/2] hid: Blacklist new eBeam classic device Yann Cantin
2012-08-06 21:43   ` Greg KH
2012-08-06 22:07     ` Dmitry Torokhov
2012-08-07  1:21       ` Yann Cantin
2012-08-07  1:21         ` Yann Cantin
2012-08-07  1:45         ` Dmitry Torokhov
2012-08-07  8:10           ` Yann Cantin
2012-08-07  8:10             ` Yann Cantin
2012-08-06 21:21 ` [RFC ebeam PATCH v3 2/2] input: misc: New USB eBeam input driver Yann Cantin
2012-08-06 21:43   ` Greg KH
2012-08-07  0:56     ` Yann Cantin
2012-08-07  0:56       ` Yann Cantin
2012-08-07  1:43       ` Dmitry Torokhov
2012-08-07  7:59         ` Yann Cantin
2012-08-07  7:59           ` Yann Cantin
2012-08-06 21:44 ` [RFC ebeam PATCH v3 0/2] Greg KH
2012-08-06 22:09   ` Dmitry Torokhov
2012-08-07  1:45     ` Yann Cantin

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.