@ -18,6 +18,9 @@
# include <linux/bitops.h>
# include <linux/iio/iio.h>
# include <linux/iio/sysfs.h>
# include <linux/iio/buffer.h>
# include <linux/iio/trigger_consumer.h>
# include <linux/iio/triggered_buffer.h>
/* registers of SRF08 device */
# define SRF08_WRITE_COMMAND 0x00 /* Command Register */
@ -35,9 +38,22 @@
struct srf08_data {
struct i2c_client * client ;
int sensitivity ; /* Gain */
int range_mm ; /* max. Range in mm */
/*
* Gain in the datasheet is called sensitivity here to distinct it
* from the gain used with amplifiers of adc ' s
*/
int sensitivity ;
/* max. Range in mm */
int range_mm ;
struct mutex lock ;
/*
* triggered buffer
* 1 x16 - bit channel + 3 x16 padding + 4 x16 timestamp
*/
s16 buffer [ 8 ] ;
} ;
/*
@ -110,6 +126,29 @@ static int srf08_read_ranging(struct srf08_data *data)
return ret ;
}
static irqreturn_t srf08_trigger_handler ( int irq , void * p )
{
struct iio_poll_func * pf = p ;
struct iio_dev * indio_dev = pf - > indio_dev ;
struct srf08_data * data = iio_priv ( indio_dev ) ;
s16 sensor_data ;
sensor_data = srf08_read_ranging ( data ) ;
if ( sensor_data < 0 )
goto err ;
mutex_lock ( & data - > lock ) ;
data - > buffer [ 0 ] = sensor_data ;
iio_push_to_buffers_with_timestamp ( indio_dev ,
data - > buffer , pf - > timestamp ) ;
mutex_unlock ( & data - > lock ) ;
err :
iio_trigger_notify_done ( indio_dev - > trig ) ;
return IRQ_HANDLED ;
}
static int srf08_read_raw ( struct iio_dev * indio_dev ,
struct iio_chan_spec const * channel , int * val ,
int * val2 , long mask )
@ -323,7 +362,15 @@ static const struct iio_chan_spec srf08_channels[] = {
. info_mask_separate =
BIT ( IIO_CHAN_INFO_RAW ) |
BIT ( IIO_CHAN_INFO_SCALE ) ,
. scan_index = 0 ,
. scan_type = {
. sign = ' s ' ,
. realbits = 16 ,
. storagebits = 16 ,
. endianness = IIO_CPU ,
} ,
} ,
IIO_CHAN_SOFT_TIMESTAMP ( 1 ) ,
} ;
static const struct iio_info srf08_info = {
@ -362,6 +409,13 @@ static int srf08_probe(struct i2c_client *client,
mutex_init ( & data - > lock ) ;
ret = devm_iio_triggered_buffer_setup ( & client - > dev , indio_dev ,
iio_pollfunc_store_time , srf08_trigger_handler , NULL ) ;
if ( ret < 0 ) {
dev_err ( & client - > dev , " setup of iio triggered buffer failed \n " ) ;
return ret ;
}
/*
* set default values of device here
* these register values cannot be read from the hardware
@ -402,5 +456,5 @@ static struct i2c_driver srf08_driver = {
module_i2c_driver ( srf08_driver ) ;
MODULE_AUTHOR ( " Andreas Klinger <ak@it-klinger.de> " ) ;
MODULE_DESCRIPTION ( " Devantech SRF08 ultrasonic ranger driver " ) ;
MODULE_DESCRIPTION ( " Devantech SRF08/SRF10 ultrasonic ranger driver " ) ;
MODULE_LICENSE ( " GPL " ) ;