iio: Add new event type gesture and use direction for single and double tap

Add new event type for tap called gesture and the direction can be used
to differentiate single and double tap. This may be used by accelerometer
sensors to express single and double tap events. For directional tap,
modifiers like IIO_MOD_(X/Y/Z) can be used along with singletap and
doubletap direction.

Signed-off-by: Jagath Jog J <jagathjog1996@gmail.com>
Link: https://lore.kernel.org/r/20220831063117.4141-2-jagathjog1996@gmail.com
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
This commit is contained in:
Jagath Jog J 2022-08-31 12:01:16 +05:30 committed by Jonathan Cameron
parent 2bc9cd66eb
commit 835e699ef8
5 changed files with 87 additions and 2 deletions

View File

@ -2068,3 +2068,72 @@ Description:
individual channels. If multiple channels are enabled in a scan, individual channels. If multiple channels are enabled in a scan,
then the sampling_frequency of the scan may be computed from the then the sampling_frequency of the scan may be computed from the
per channel sampling frequencies. per channel sampling frequencies.
What: /sys/.../events/in_accel_gesture_singletap_en
What: /sys/.../events/in_accel_gesture_doubletap_en
KernelVersion: 6.1
Contact: linux-iio@vger.kernel.org
Description:
Device generates an event on a single or double tap.
What: /sys/.../events/in_accel_gesture_singletap_value
What: /sys/.../events/in_accel_gesture_doubletap_value
KernelVersion: 6.1
Contact: linux-iio@vger.kernel.org
Description:
Specifies the threshold value that the device is comparing
against to generate the tap gesture event. The lower
threshold value increases the sensitivity of tap detection.
Units and the exact meaning of value are device-specific.
What: /sys/.../events/in_accel_gesture_tap_value_available
KernelVersion: 6.1
Contact: linux-iio@vger.kernel.org
Description:
Lists all available threshold values which can be used to
modify the sensitivity of the tap detection.
What: /sys/.../events/in_accel_gesture_singletap_reset_timeout
What: /sys/.../events/in_accel_gesture_doubletap_reset_timeout
KernelVersion: 6.1
Contact: linux-iio@vger.kernel.org
Description:
Specifies the timeout value in seconds for the tap detector
to not to look for another tap event after the event as
occurred. Basically the minimum quiet time between the two
single-tap's or two double-tap's.
What: /sys/.../events/in_accel_gesture_tap_reset_timeout_available
KernelVersion: 6.1
Contact: linux-iio@vger.kernel.org
Description:
Lists all available tap reset timeout values. Units in seconds.
What: /sys/.../events/in_accel_gesture_doubletap_tap2_min_delay
KernelVersion: 6.1
Contact: linux-iio@vger.kernel.org
Description:
Specifies the minimum quiet time in seconds between the two
taps of a double tap.
What: /sys/.../events/in_accel_gesture_doubletap_tap2_min_delay_available
KernelVersion: 6.1
Contact: linux-iio@vger.kernel.org
Description:
Lists all available delay values between two taps in the double
tap. Units in seconds.
What: /sys/.../events/in_accel_gesture_tap_maxtomin_time
KernelVersion: 6.1
Contact: linux-iio@vger.kernel.org
Description:
Specifies the maximum time difference allowed between upper
and lower peak of tap to consider it as the valid tap event.
Units in seconds.
What: /sys/.../events/in_accel_gesture_tap_maxtomin_time_available
KernelVersion: 6.1
Contact: linux-iio@vger.kernel.org
Description:
Lists all available time values between upper peak to lower
peak. Units in seconds.

View File

@ -231,12 +231,15 @@ static const char * const iio_ev_type_text[] = {
[IIO_EV_TYPE_MAG_ADAPTIVE] = "mag_adaptive", [IIO_EV_TYPE_MAG_ADAPTIVE] = "mag_adaptive",
[IIO_EV_TYPE_CHANGE] = "change", [IIO_EV_TYPE_CHANGE] = "change",
[IIO_EV_TYPE_MAG_REFERENCED] = "mag_referenced", [IIO_EV_TYPE_MAG_REFERENCED] = "mag_referenced",
[IIO_EV_TYPE_GESTURE] = "gesture",
}; };
static const char * const iio_ev_dir_text[] = { static const char * const iio_ev_dir_text[] = {
[IIO_EV_DIR_EITHER] = "either", [IIO_EV_DIR_EITHER] = "either",
[IIO_EV_DIR_RISING] = "rising", [IIO_EV_DIR_RISING] = "rising",
[IIO_EV_DIR_FALLING] = "falling" [IIO_EV_DIR_FALLING] = "falling",
[IIO_EV_DIR_SINGLETAP] = "singletap",
[IIO_EV_DIR_DOUBLETAP] = "doubletap",
}; };
static const char * const iio_ev_info_text[] = { static const char * const iio_ev_info_text[] = {
@ -247,6 +250,8 @@ static const char * const iio_ev_info_text[] = {
[IIO_EV_INFO_HIGH_PASS_FILTER_3DB] = "high_pass_filter_3db", [IIO_EV_INFO_HIGH_PASS_FILTER_3DB] = "high_pass_filter_3db",
[IIO_EV_INFO_LOW_PASS_FILTER_3DB] = "low_pass_filter_3db", [IIO_EV_INFO_LOW_PASS_FILTER_3DB] = "low_pass_filter_3db",
[IIO_EV_INFO_TIMEOUT] = "timeout", [IIO_EV_INFO_TIMEOUT] = "timeout",
[IIO_EV_INFO_RESET_TIMEOUT] = "reset_timeout",
[IIO_EV_INFO_TAP2_MIN_DELAY] = "tap2_min_delay",
}; };
static enum iio_event_direction iio_ev_attr_dir(struct iio_dev_attr *attr) static enum iio_event_direction iio_ev_attr_dir(struct iio_dev_attr *attr)

View File

@ -17,6 +17,8 @@ enum iio_event_info {
IIO_EV_INFO_HIGH_PASS_FILTER_3DB, IIO_EV_INFO_HIGH_PASS_FILTER_3DB,
IIO_EV_INFO_LOW_PASS_FILTER_3DB, IIO_EV_INFO_LOW_PASS_FILTER_3DB,
IIO_EV_INFO_TIMEOUT, IIO_EV_INFO_TIMEOUT,
IIO_EV_INFO_RESET_TIMEOUT,
IIO_EV_INFO_TAP2_MIN_DELAY,
}; };
#define IIO_VAL_INT 1 #define IIO_VAL_INT 1

View File

@ -105,6 +105,7 @@ enum iio_event_type {
IIO_EV_TYPE_MAG_ADAPTIVE, IIO_EV_TYPE_MAG_ADAPTIVE,
IIO_EV_TYPE_CHANGE, IIO_EV_TYPE_CHANGE,
IIO_EV_TYPE_MAG_REFERENCED, IIO_EV_TYPE_MAG_REFERENCED,
IIO_EV_TYPE_GESTURE,
}; };
enum iio_event_direction { enum iio_event_direction {
@ -112,6 +113,8 @@ enum iio_event_direction {
IIO_EV_DIR_RISING, IIO_EV_DIR_RISING,
IIO_EV_DIR_FALLING, IIO_EV_DIR_FALLING,
IIO_EV_DIR_NONE, IIO_EV_DIR_NONE,
IIO_EV_DIR_SINGLETAP,
IIO_EV_DIR_DOUBLETAP,
}; };
#endif /* _UAPI_IIO_TYPES_H_ */ #endif /* _UAPI_IIO_TYPES_H_ */

View File

@ -69,12 +69,15 @@ static const char * const iio_ev_type_text[] = {
[IIO_EV_TYPE_MAG_ADAPTIVE] = "mag_adaptive", [IIO_EV_TYPE_MAG_ADAPTIVE] = "mag_adaptive",
[IIO_EV_TYPE_CHANGE] = "change", [IIO_EV_TYPE_CHANGE] = "change",
[IIO_EV_TYPE_MAG_REFERENCED] = "mag_referenced", [IIO_EV_TYPE_MAG_REFERENCED] = "mag_referenced",
[IIO_EV_TYPE_GESTURE] = "gesture",
}; };
static const char * const iio_ev_dir_text[] = { static const char * const iio_ev_dir_text[] = {
[IIO_EV_DIR_EITHER] = "either", [IIO_EV_DIR_EITHER] = "either",
[IIO_EV_DIR_RISING] = "rising", [IIO_EV_DIR_RISING] = "rising",
[IIO_EV_DIR_FALLING] = "falling" [IIO_EV_DIR_FALLING] = "falling",
[IIO_EV_DIR_SINGLETAP] = "singletap",
[IIO_EV_DIR_DOUBLETAP] = "doubletap",
}; };
static const char * const iio_modifier_names[] = { static const char * const iio_modifier_names[] = {
@ -227,6 +230,7 @@ static bool event_is_known(struct iio_event_data *event)
case IIO_EV_TYPE_THRESH_ADAPTIVE: case IIO_EV_TYPE_THRESH_ADAPTIVE:
case IIO_EV_TYPE_MAG_ADAPTIVE: case IIO_EV_TYPE_MAG_ADAPTIVE:
case IIO_EV_TYPE_CHANGE: case IIO_EV_TYPE_CHANGE:
case IIO_EV_TYPE_GESTURE:
break; break;
default: default:
return false; return false;
@ -236,6 +240,8 @@ static bool event_is_known(struct iio_event_data *event)
case IIO_EV_DIR_EITHER: case IIO_EV_DIR_EITHER:
case IIO_EV_DIR_RISING: case IIO_EV_DIR_RISING:
case IIO_EV_DIR_FALLING: case IIO_EV_DIR_FALLING:
case IIO_EV_DIR_SINGLETAP:
case IIO_EV_DIR_DOUBLETAP:
case IIO_EV_DIR_NONE: case IIO_EV_DIR_NONE:
break; break;
default: default: