104 lines
2.5 KiB
Plaintext
104 lines
2.5 KiB
Plaintext
|
Driver for tilt-switches connected via GPIOs
|
||
|
============================================
|
||
|
|
||
|
Generic driver to read data from tilt switches connected via gpios.
|
||
|
Orientation can be provided by one or more than one tilt switches,
|
||
|
i.e. each tilt switch providing one axis, and the number of axes
|
||
|
is also not limited.
|
||
|
|
||
|
|
||
|
Data structures:
|
||
|
----------------
|
||
|
|
||
|
The array of struct gpio in the gpios field is used to list the gpios
|
||
|
that represent the current tilt state.
|
||
|
|
||
|
The array of struct gpio_tilt_axis describes the axes that are reported
|
||
|
to the input system. The values set therein are used for the
|
||
|
input_set_abs_params calls needed to init the axes.
|
||
|
|
||
|
The array of struct gpio_tilt_state maps gpio states to the corresponding
|
||
|
values to report. The gpio state is represented as a bitfield where the
|
||
|
bit-index corresponds to the index of the gpio in the struct gpio array.
|
||
|
In the same manner the values stored in the axes array correspond to
|
||
|
the elements of the gpio_tilt_axis-array.
|
||
|
|
||
|
|
||
|
Example:
|
||
|
--------
|
||
|
|
||
|
Example configuration for a single TS1003 tilt switch that rotates around
|
||
|
one axis in 4 steps and emitts the current tilt via two GPIOs.
|
||
|
|
||
|
static int sg060_tilt_enable(struct device *dev) {
|
||
|
/* code to enable the sensors */
|
||
|
};
|
||
|
|
||
|
static void sg060_tilt_disable(struct device *dev) {
|
||
|
/* code to disable the sensors */
|
||
|
};
|
||
|
|
||
|
static struct gpio sg060_tilt_gpios[] = {
|
||
|
{ SG060_TILT_GPIO_SENSOR1, GPIOF_IN, "tilt_sensor1" },
|
||
|
{ SG060_TILT_GPIO_SENSOR2, GPIOF_IN, "tilt_sensor2" },
|
||
|
};
|
||
|
|
||
|
static struct gpio_tilt_state sg060_tilt_states[] = {
|
||
|
{
|
||
|
.gpios = (0 << 1) | (0 << 0),
|
||
|
.axes = (int[]) {
|
||
|
0,
|
||
|
},
|
||
|
}, {
|
||
|
.gpios = (0 << 1) | (1 << 0),
|
||
|
.axes = (int[]) {
|
||
|
1, /* 90 degrees */
|
||
|
},
|
||
|
}, {
|
||
|
.gpios = (1 << 1) | (1 << 0),
|
||
|
.axes = (int[]) {
|
||
|
2, /* 180 degrees */
|
||
|
},
|
||
|
}, {
|
||
|
.gpios = (1 << 1) | (0 << 0),
|
||
|
.axes = (int[]) {
|
||
|
3, /* 270 degrees */
|
||
|
},
|
||
|
},
|
||
|
};
|
||
|
|
||
|
static struct gpio_tilt_axis sg060_tilt_axes[] = {
|
||
|
{
|
||
|
.axis = ABS_RY,
|
||
|
.min = 0,
|
||
|
.max = 3,
|
||
|
.fuzz = 0,
|
||
|
.flat = 0,
|
||
|
},
|
||
|
};
|
||
|
|
||
|
static struct gpio_tilt_platform_data sg060_tilt_pdata= {
|
||
|
.gpios = sg060_tilt_gpios,
|
||
|
.nr_gpios = ARRAY_SIZE(sg060_tilt_gpios),
|
||
|
|
||
|
.axes = sg060_tilt_axes,
|
||
|
.nr_axes = ARRAY_SIZE(sg060_tilt_axes),
|
||
|
|
||
|
.states = sg060_tilt_states,
|
||
|
.nr_states = ARRAY_SIZE(sg060_tilt_states),
|
||
|
|
||
|
.debounce_interval = 100,
|
||
|
|
||
|
.poll_interval = 1000,
|
||
|
.enable = sg060_tilt_enable,
|
||
|
.disable = sg060_tilt_disable,
|
||
|
};
|
||
|
|
||
|
static struct platform_device sg060_device_tilt = {
|
||
|
.name = "gpio-tilt-polled",
|
||
|
.id = -1,
|
||
|
.dev = {
|
||
|
.platform_data = &sg060_tilt_pdata,
|
||
|
},
|
||
|
};
|