123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103 |
- 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 emits 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,
- },
- };
|