@ -69,6 +69,34 @@ static const struct iio_event_spec iio_dummy_event = {
. mask_separate = BIT ( IIO_EV_INFO_VALUE ) | BIT ( IIO_EV_INFO_ENABLE ) ,
} ;
/*
* simple step detect event - triggered when a step is detected
*/
static const struct iio_event_spec step_detect_event = {
. type = IIO_EV_TYPE_INSTANCE ,
. dir = IIO_EV_DIR_NONE ,
. mask_separate = BIT ( IIO_EV_INFO_ENABLE ) ,
} ;
/*
* simple transition event - triggered when the reported running confidence
* value rises above a threshold value
*/
static const struct iio_event_spec iio_running_event = {
. type = IIO_EV_TYPE_THRESH ,
. dir = IIO_EV_DIR_RISING ,
. mask_separate = BIT ( IIO_EV_INFO_VALUE ) | BIT ( IIO_EV_INFO_ENABLE ) ,
} ;
/*
* simple transition event - triggered when the reported walking confidence
* value falls under a threshold value
*/
static const struct iio_event_spec iio_walking_event = {
. type = IIO_EV_TYPE_THRESH ,
. dir = IIO_EV_DIR_FALLING ,
. mask_separate = BIT ( IIO_EV_INFO_VALUE ) | BIT ( IIO_EV_INFO_ENABLE ) ,
} ;
# endif
/*
@ -215,6 +243,37 @@ static const struct iio_chan_spec iio_dummy_channels[] = {
. indexed = 1 ,
. channel = 0 ,
} ,
{
. type = IIO_STEPS ,
. info_mask_shared_by_type = BIT ( IIO_CHAN_INFO_ENABLE ) |
BIT ( IIO_CHAN_INFO_CALIBHEIGHT ) ,
. info_mask_separate = BIT ( IIO_CHAN_INFO_PROCESSED ) ,
. scan_index = - 1 ,
# ifdef CONFIG_IIO_SIMPLE_DUMMY_EVENTS
. event_spec = & step_detect_event ,
. num_event_specs = 1 ,
# endif /* CONFIG_IIO_SIMPLE_DUMMY_EVENTS */
} ,
{
. type = IIO_ACTIVITY ,
. modified = 1 ,
. channel2 = IIO_MOD_RUNNING ,
. info_mask_separate = BIT ( IIO_CHAN_INFO_PROCESSED ) ,
# ifdef CONFIG_IIO_SIMPLE_DUMMY_EVENTS
. event_spec = & iio_running_event ,
. num_event_specs = 1 ,
# endif /* CONFIG_IIO_SIMPLE_DUMMY_EVENTS */
} ,
{
. type = IIO_ACTIVITY ,
. modified = 1 ,
. channel2 = IIO_MOD_WALKING ,
. info_mask_separate = BIT ( IIO_CHAN_INFO_PROCESSED ) ,
# ifdef CONFIG_IIO_SIMPLE_DUMMY_EVENTS
. event_spec = & iio_walking_event ,
. num_event_specs = 1 ,
# endif /* CONFIG_IIO_SIMPLE_DUMMY_EVENTS */
} ,
} ;
/**
@ -263,24 +322,55 @@ static int iio_dummy_read_raw(struct iio_dev *indio_dev,
break ;
}
break ;
case IIO_CHAN_INFO_PROCESSED :
switch ( chan - > type ) {
case IIO_STEPS :
* val = st - > steps ;
ret = IIO_VAL_INT ;
break ;
case IIO_ACTIVITY :
switch ( chan - > channel2 ) {
case IIO_MOD_RUNNING :
* val = st - > activity_running ;
ret = IIO_VAL_INT ;
break ;
case IIO_MOD_WALKING :
* val = st - > activity_walking ;
ret = IIO_VAL_INT ;
break ;
default :
break ;
}
break ;
default :
break ;
}
break ;
case IIO_CHAN_INFO_OFFSET :
/* only single ended adc -> 7 */
* val = 7 ;
ret = IIO_VAL_INT ;
break ;
case IIO_CHAN_INFO_SCALE :
switch ( chan - > differential ) {
case 0 :
/* only single ended adc -> 0.001333 */
* val = 0 ;
* val2 = 1333 ;
ret = IIO_VAL_INT_PLUS_MICRO ;
switch ( chan - > type ) {
case IIO_VOLTAGE :
switch ( chan - > differential ) {
case 0 :
/* only single ended adc -> 0.001333 */
* val = 0 ;
* val2 = 1333 ;
ret = IIO_VAL_INT_PLUS_MICRO ;
break ;
case 1 :
/* all differential adc channels ->
* 0.000001344 */
* val = 0 ;
* val2 = 1344 ;
ret = IIO_VAL_INT_PLUS_NANO ;
}
break ;
default :
break ;
case 1 :
/* all differential adc channels -> 0.000001344 */
* val = 0 ;
* val2 = 1344 ;
ret = IIO_VAL_INT_PLUS_NANO ;
}
break ;
case IIO_CHAN_INFO_CALIBBIAS :
@ -298,6 +388,27 @@ static int iio_dummy_read_raw(struct iio_dev *indio_dev,
* val2 = 33 ;
ret = IIO_VAL_INT_PLUS_NANO ;
break ;
case IIO_CHAN_INFO_ENABLE :
switch ( chan - > type ) {
case IIO_STEPS :
* val = st - > steps_enabled ;
ret = IIO_VAL_INT ;
break ;
default :
break ;
}
break ;
case IIO_CHAN_INFO_CALIBHEIGHT :
switch ( chan - > type ) {
case IIO_STEPS :
* val = st - > height ;
ret = IIO_VAL_INT ;
break ;
default :
break ;
}
break ;
default :
break ;
}
@ -330,14 +441,45 @@ static int iio_dummy_write_raw(struct iio_dev *indio_dev,
switch ( mask ) {
case IIO_CHAN_INFO_RAW :
if ( chan - > output = = 0 )
switch ( chan - > type ) {
case IIO_VOLTAGE :
if ( chan - > output = = 0 )
return - EINVAL ;
/* Locking not required as writing single value */
mutex_lock ( & st - > lock ) ;
st - > dac_val = val ;
mutex_unlock ( & st - > lock ) ;
return 0 ;
default :
return - EINVAL ;
/* Locking not required as writing single value */
mutex_lock ( & st - > lock ) ;
st - > dac_val = val ;
mutex_unlock ( & st - > lock ) ;
return 0 ;
}
case IIO_CHAN_INFO_PROCESSED :
switch ( chan - > type ) {
case IIO_STEPS :
mutex_lock ( & st - > lock ) ;
st - > steps = val ;
mutex_unlock ( & st - > lock ) ;
return 0 ;
case IIO_ACTIVITY :
if ( val < 0 )
val = 0 ;
if ( val > 100 )
val = 100 ;
switch ( chan - > channel2 ) {
case IIO_MOD_RUNNING :
st - > activity_running = val ;
return 0 ;
case IIO_MOD_WALKING :
st - > activity_walking = val ;
return 0 ;
default :
return - EINVAL ;
}
break ;
default :
return - EINVAL ;
}
case IIO_CHAN_INFO_CALIBSCALE :
mutex_lock ( & st - > lock ) ;
/* Compare against table - hard matching here */
@ -356,6 +498,24 @@ static int iio_dummy_write_raw(struct iio_dev *indio_dev,
st - > accel_calibbias = val ;
mutex_unlock ( & st - > lock ) ;
return 0 ;
case IIO_CHAN_INFO_ENABLE :
switch ( chan - > type ) {
case IIO_STEPS :
mutex_lock ( & st - > lock ) ;
st - > steps_enabled = val ;
mutex_unlock ( & st - > lock ) ;
return 0 ;
default :
return - EINVAL ;
}
case IIO_CHAN_INFO_CALIBHEIGHT :
switch ( chan - > type ) {
case IIO_STEPS :
st - > height = val ;
return 0 ;
default :
return - EINVAL ;
}
default :
return - EINVAL ;
@ -395,6 +555,9 @@ static int iio_dummy_init_device(struct iio_dev *indio_dev)
st - > accel_val = 34 ;
st - > accel_calibbias = - 7 ;
st - > accel_calibscale = & dummy_scales [ 0 ] ;
st - > steps = 47 ;
st - > activity_running = 98 ;
st - > activity_walking = 4 ;
return 0 ;
}