Hi Jonathan, Thanks for accepting the patches. On Sat, May 7, 2022 at 9:45 PM Jonathan Cameron <jic23@xxxxxxxxxx> wrote: > > On Thu, 5 May 2022 19:00:20 +0530 > Jagath Jog J <jagathjog1996@xxxxxxxxx> wrote: > > Strangely the last time I can remember discussion around how to > support tap detection was way back in the early days of IIO, perhaps > 10 years ago. I don't recall us ever coming to a conclusion on how to do it. > > > Add new channel type for tap and also add new modifiers for single and > > double tap. This channel and modifiers 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 rising and > > falling direction. > > Not sure how that would work seeing as there is only one modifier > field and it's not a bitmap. > The event code would need to encode both what type of tap and > the direction and there aren't two fields in which to do that. > > One way I can see this 'might' work would be to use > the event type to encode tap and the direction could be 'abused' > to encode single vs double (or other events like this) > > in_accel_x_tap_single > in_accel_x_tap_double > > We could possibly be more generic and have the 'type' as > 'event' or something like that allowing us to use the > 7 bit direction field to encode different detectable events > (I'm not that keen on the name event though, could maybe > map it to gesture which would cover some of the other > motion pattern detection devices out there) > > That would give us > > in_accel_x_event_singletap > in_accel_y_event_doubletap > > etc. > > How ever we move forwards we do it this want to be in a new series with a nice > bold title to attract that attention of people who don't really > care about he bma400 but do care about tap detection; it's > a common feature of accelerometers. Sure, I will try to make a new series for tap events with the given inputs and send the RFC first to get all the comments from everyone. > > Jonathan > > > > > > > Signed-off-by: Jagath Jog J <jagathjog1996@xxxxxxxxx> > > > > --- > > Documentation/ABI/testing/sysfs-bus-iio | 11 +++++++++++ > > drivers/iio/industrialio-core.c | 3 +++ > > include/uapi/linux/iio/types.h | 3 +++ > > tools/iio/iio_event_monitor.c | 6 ++++++ > > 4 files changed, 23 insertions(+) > > > > diff --git a/Documentation/ABI/testing/sysfs-bus-iio b/Documentation/ABI/testing/sysfs-bus-iio > > index d4ccc68fdcf0..bf2d10d6ad9b 100644 > > --- a/Documentation/ABI/testing/sysfs-bus-iio > > +++ b/Documentation/ABI/testing/sysfs-bus-iio > > @@ -2030,3 +2030,14 @@ Description: > > Available range for the forced calibration value, expressed as: > > > > - a range specified as "[min step max]" > > + > > +What: /sys/.../events/in_tap_single_change_en > > +What: /sys/.../events/in_tap_double_change_en > > +KernelVersion: 5.19 > > +Contact: linux-iio@xxxxxxxxxxxxxxx > > +Description: > > + Accelerometer device detects single or double taps and generate > > + events when threshold for minimum tap amplitide passes. > > + E.g. a single tap event is generated when acceleration value > > + crosses the minimum tap amplitude value set. Where tap threshold > > + value is set by using in_tap_change_value. > > diff --git a/drivers/iio/industrialio-core.c b/drivers/iio/industrialio-core.c > > index e1ed44dec2ab..9b0d7bbd07fc 100644 > > --- a/drivers/iio/industrialio-core.c > > +++ b/drivers/iio/industrialio-core.c > > @@ -87,6 +87,7 @@ static const char * const iio_chan_type_name_spec[] = { > > [IIO_POSITIONRELATIVE] = "positionrelative", > > [IIO_PHASE] = "phase", > > [IIO_MASSCONCENTRATION] = "massconcentration", > > + [IIO_TAP] = "tap" > > }; > > > > static const char * const iio_modifier_names[] = { > > @@ -134,6 +135,8 @@ static const char * const iio_modifier_names[] = { > > [IIO_MOD_ETHANOL] = "ethanol", > > [IIO_MOD_H2] = "h2", > > [IIO_MOD_O2] = "o2", > > + [IIO_MOD_TAP_SINGLE] = "single", > > + [IIO_MOD_TAP_DOUBLE] = "double", > > }; > > > > /* relies on pairs of these shared then separate */ > > diff --git a/include/uapi/linux/iio/types.h b/include/uapi/linux/iio/types.h > > index 472cead10d8d..d1e61c84e0d5 100644 > > --- a/include/uapi/linux/iio/types.h > > +++ b/include/uapi/linux/iio/types.h > > @@ -47,6 +47,7 @@ enum iio_chan_type { > > IIO_POSITIONRELATIVE, > > IIO_PHASE, > > IIO_MASSCONCENTRATION, > > + IIO_TAP, > > }; > > > > enum iio_modifier { > > @@ -95,6 +96,8 @@ enum iio_modifier { > > IIO_MOD_ETHANOL, > > IIO_MOD_H2, > > IIO_MOD_O2, > > + IIO_MOD_TAP_SINGLE, > > + IIO_MOD_TAP_DOUBLE, > > }; > > > > enum iio_event_type { > > diff --git a/tools/iio/iio_event_monitor.c b/tools/iio/iio_event_monitor.c > > index 2f4581658859..7fa7d4285f40 100644 > > --- a/tools/iio/iio_event_monitor.c > > +++ b/tools/iio/iio_event_monitor.c > > @@ -59,6 +59,7 @@ static const char * const iio_chan_type_name_spec[] = { > > [IIO_POSITIONRELATIVE] = "positionrelative", > > [IIO_PHASE] = "phase", > > [IIO_MASSCONCENTRATION] = "massconcentration", > > + [IIO_TAP] = "tap", > > }; > > > > static const char * const iio_ev_type_text[] = { > > @@ -122,6 +123,8 @@ static const char * const iio_modifier_names[] = { > > [IIO_MOD_PM4] = "pm4", > > [IIO_MOD_PM10] = "pm10", > > [IIO_MOD_O2] = "o2", > > + [IIO_MOD_TAP_SINGLE] = "single", > > + [IIO_MOD_TAP_DOUBLE] = "double", > > }; > > > > static bool event_is_known(struct iio_event_data *event) > > @@ -164,6 +167,7 @@ static bool event_is_known(struct iio_event_data *event) > > case IIO_POSITIONRELATIVE: > > case IIO_PHASE: > > case IIO_MASSCONCENTRATION: > > + case IIO_TAP: > > break; > > default: > > return false; > > @@ -215,6 +219,8 @@ static bool event_is_known(struct iio_event_data *event) > > case IIO_MOD_PM4: > > case IIO_MOD_PM10: > > case IIO_MOD_O2: > > + case IIO_MOD_TAP_SINGLE: > > + case IIO_MOD_TAP_DOUBLE: > > break; > > default: > > return false; >