[RFC] Add Input IOCTL for accelerometer devices

Felipe Balbi
2009-05-15T13:27:20Z

Hi all,

the following patch is just an idea to see how the community feels about
it. Considering accelerometer devices, you might have different use
cases for it while running different applications. You could be using it
for screen rotation in one case but when opening a game, you could use
it as a game controller by turning the device side-by-side.

Thinking about that, I decided it would be nice to have some parameters
configured at runtime in order to be able to use the accelerometer on
different use cases.

The following proposal (really draft) tries to add a new IOCTL on input
layer such as userland could use that for passing proper parameters to
accelerometer drivers.

ps: the patch is in really early stage, I'm guessing the best would be
to, as force feedback devices, provide proper registration for an
accelerometer device.

diff --git a/include/linux/input.h b/include/linux/input.h
index adc1332..c3c9e82 100644
--- a/include/linux/input.h
+++ b/include/linux/input.h
@@ -55,6 +55,26 @@ struct input_absinfo {
__s32 flat;
};

+#define INPUT_ACCEL_IRQ_NONE 0
+#define INPUT_ACCEL_IRQ_HIGH BIT(0)
+#define INPUT_ACCEL_IRQ_LOW BIT(1)
+#define INPUT_ACCEL_IRQ_LATCH BIT(2)
+
+struct input_accelinfo {
+ __u32 threshold;
+ __u32 duration;
+
+ /* the following 4 fields configure how the irqs will be generated:
+ * - High Event
+ * - Low Event
+ * - Latch irq request
+ */
+ __u8 x_irq;
+ __u8 y_irq;
+ __u8 z_irq;
+ __u8 click_irq;
+};
+
#define EVIOCGVERSION _IOR('E', 0x01, int) /* get driver version */
#define EVIOCGID _IOR('E', 0x02, struct input_id) /* get device ID */
#define EVIOCGREP _IOR('E', 0x03, int[2]) /* get repeat settings */
@@ -81,6 +101,8 @@ struct input_absinfo {

#define EVIOCGRAB _IOW('E', 0x90, int) /* Grab/Release device */

+#define EVIOCACCELINFO _IOW('E', 0x91, struct input_accelinfo) /* set accelerometer's parameters */
+
/*
* Event types
*/
@@ -975,6 +997,8 @@ struct ff_effect {
#include <linux/timer.h>
#include <linux/mod_devicetable.h>

+struct input_accelinfo;
+
/**
* struct input_dev - represents an input device
* @name: name of the device
@@ -1069,6 +1093,7 @@ struct input_dev {
void *keycode;
int (*setkeycode)(struct input_dev *dev, int scancode, int keycode);
int (*getkeycode)(struct input_dev *dev, int scancode, int *keycode);
+ int (*set_accelinfo)(struct input_dev *dev, struct input_accelinfo *info);

struct ff_device *ff;

--
balbi