RE: [PATCH] iio - add barometer bmp085

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




> -----Original Message-----
> From: Datta, Shubhrajyoti
>
> > -----Original Message-----
> > From: linux-iio-owner@xxxxxxxxxxxxxxx [mailto:linux-iio-
> > owner@xxxxxxxxxxxxxxx] On Behalf Of Jonathan Cameron
> > Sent: Friday, October 15, 2010 3:51 PM
> > To: Matthias Brugger
> > Cc: linux-iio@xxxxxxxxxxxxxxx; matthias
> > Subject: Re: [PATCH] iio - add barometer bmp085
> >
> > On 10/15/10 10:16, Matthias Brugger wrote:
> > > This patch adds:
> > > - digital barometer support to the iio subsytem
> > > - Bosch Sensortec bmp085 driver
> > >
> > > I resend the patches I sent yesterday, because I merged them to one.
> > > Also the comments and the define has been deleted and so, from my
> point
> > of view is ready to merge.
> > One quick comment about patch submissions in general. When it's an
> updated
> > version of a previously posted patch, the title should be something like
> > [PATCH V2] iio - add barometer bmp085.  Makes it easy down the line to
> > make
> > sure you have the right patch!.
> >
> > To sumarise the important inline comments:
> >
> > As a general rule, if you know the size of the storage of a give value
> > (because it is comming from hardware) it is better to use fixed sized
> > types.  u16 and friends.  It's way too unpredictable how large a long or
> > a short might be.
> >
> > Don't eat errors.
> >
> > All channel naming must have either _raw or _input on the end of
> > the direct read attributes so we know whether it is already in SI units.
> >
> > Mostly fine, but various comments inline.
>
> Some of the comments are fixed in the following you may want to see
> Drivers/misc/bmp085.c.
Does this work for you?

>
> Some of the points
> 1. You may solve the dependency of the pressure needing the temperature by
> triggering the temperature measurement.
> 2. Secondly I personally prefer the temperature reported in milli units.
> However that will standardize various. Also solves the decimal point
> issue.
>
However that will standardize various. - > drivers.
> However I am OK with your take.
>
> 3. I appreciate your attempts to make it an IIO as I think it may make it
> more futuristic.
>
>
>
>
>
>
> >
> > Thanks,
> >
> > Jonathan
> >
> > >
> > > Signed-off-by: Matthias Brugger <m_brugger@xxxxxx>
> > > ---
> > >  drivers/staging/iio/Kconfig            |    1 +
> > >  drivers/staging/iio/Makefile           |    1 +
> > >  drivers/staging/iio/barometer/Kconfig  |   12 +
> > >  drivers/staging/iio/barometer/Makefile |    5 +
> > >  drivers/staging/iio/barometer/baro.h   |    8 +
> > >  drivers/staging/iio/barometer/bmp085.c |  418
> > ++++++++++++++++++++++++++++++++
> > >  drivers/staging/iio/barometer/bmp085.h |   73 ++++++
> > >  7 files changed, 518 insertions(+), 0 deletions(-)
> > >  create mode 100644 drivers/staging/iio/barometer/Kconfig
> > >  create mode 100644 drivers/staging/iio/barometer/Makefile
> > >  create mode 100644 drivers/staging/iio/barometer/baro.h
> > >  create mode 100644 drivers/staging/iio/barometer/bmp085.c
> > >  create mode 100644 drivers/staging/iio/barometer/bmp085.h
> > >
> > > diff --git a/drivers/staging/iio/Kconfig b/drivers/staging/iio/Kconfig
> > > index ed48815..d5ca09a 100644
> > > --- a/drivers/staging/iio/Kconfig
> > > +++ b/drivers/staging/iio/Kconfig
> > > @@ -46,6 +46,7 @@ source "drivers/staging/iio/gyro/Kconfig"
> > >  source "drivers/staging/iio/imu/Kconfig"
> > >  source "drivers/staging/iio/light/Kconfig"
> > >  source "drivers/staging/iio/magnetometer/Kconfig"
> > > +source "drivers/staging/iio/barometer/Kconfig"
> > >
> > >  source "drivers/staging/iio/trigger/Kconfig"
> > >
> > > diff --git a/drivers/staging/iio/Makefile
> b/drivers/staging/iio/Makefile
> > > index e909674..73112b2 100644
> > > --- a/drivers/staging/iio/Makefile
> > > +++ b/drivers/staging/iio/Makefile
> > > @@ -16,3 +16,4 @@ obj-y += imu/
> > >  obj-y += light/
> > >  obj-y += trigger/
> > >  obj-y += magnetometer/
> > > +obj-y += barometer/
> > > diff --git a/drivers/staging/iio/barometer/Kconfig
> > b/drivers/staging/iio/barometer/Kconfig
> > > new file mode 100644
> > > index 0000000..d5942e9
> > > --- /dev/null
> > > +++ b/drivers/staging/iio/barometer/Kconfig
> > > @@ -0,0 +1,12 @@
> > > +#
> > > +# IIO Digital Barometer Sensor drivers configuration
> > > +#
> > > +comment "Digital barometer sensors"
> > > +
> > > +config BMP085
> > > +
> > > + tristate "BMP085 Barometer Sensor I2C driver"
> > > + depends on I2C
> > > + help
> > > +   Say yes here to build support for Bosch Sensortec BMP085,
> > > +   digital barometer sensor.
> > > diff --git a/drivers/staging/iio/barometer/Makefile
> > b/drivers/staging/iio/barometer/Makefile
> > > new file mode 100644
> > > index 0000000..3234d96
> > > --- /dev/null
> > > +++ b/drivers/staging/iio/barometer/Makefile
> > > @@ -0,0 +1,5 @@
> > > +#
> > > +# Makefile for digital barometer sensor drivers
> > > +#
> > > +
> > > +obj-$(CONFIG_BMP085) += bmp085.o
> > > diff --git a/drivers/staging/iio/barometer/baro.h
> > b/drivers/staging/iio/barometer/baro.h
> > > new file mode 100644
> > > index 0000000..e3b73a1
> > > --- /dev/null
> > > +++ b/drivers/staging/iio/barometer/baro.h
> > > @@ -0,0 +1,8 @@
> > > +
> > > +#include "../sysfs.h"
> > > +
> > > +/* Barometer types of attribute */
> > > +
> > > +#define IIO_DEV_ATTR_BARO_PRESSURE(_mode, _show, _store, _addr)  \
> > > + IIO_DEVICE_ATTR(baro_pressure, _mode, _show, NULL, _addr)
> > If it's processed (i.e. si units) it needs to be baro_pressure_input.
> > If raw it needs to be baro_pressure_raw and conversion factors etc
> > provided.
> > > +
> > > diff --git a/drivers/staging/iio/barometer/bmp085.c
> > b/drivers/staging/iio/barometer/bmp085.c
> > > new file mode 100644
> > > index 0000000..67dac39
> > > --- /dev/null
> > > +++ b/drivers/staging/iio/barometer/bmp085.c
> > > @@ -0,0 +1,418 @@
> > > +/**
> > > + * Bosch Sensortec BMP085 Digital Pressure Sensor
> > > + *
> > > + * Written by: Matthias Brugger <m_brugger@xxxxxx>
> > > + *
> > > + * Copyright (C) 2010 Fraunhofer Institute for Integrated Circuits
> > > + *
> > > + * This program is free software; you can redistribute it and/or
> modify
> > > + * it under the terms of the GNU General Public License as published
> by
> > > + * the Free Software Foundation; either version 2 of the License, or
> > > + * (at your option) any later version.
> > > + *
> > > + * This program is distributed in the hope that it will be useful,
> > > + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> > > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> > > + * GNU General Public License for more details.
> > > + *
> > > + * You should have received a copy of the GNU General Public License
> > > + * along with this program; if not, write to the
> > > + * Free Software Foundation, Inc.,
> > > + * 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
> > > + */
> > > +
> > > +#include <linux/module.h>
> > > +#include <linux/init.h>
> > > +#include <linux/slab.h>
> > > +#include <linux/i2c.h>
> > > +#include <linux/mutex.h>
> > > +#include <linux/delay.h>
> > > +#include <linux/time.h>
> > > +#include <linux/mutex.h>
> > > +
> > > +#include "bmp085.h"
> > > +
> > > +int oss = 3;
> > > +module_param(oss, int , S_IRUSR);
> > > +MODULE_PARM_DESC(oss, "Oversampling setting [0-3]");
> > Not convinced this should be a module parameter.  Better to use a
> > combination
> > of board config (for default on a given board) and appropriate sysfs
> > attribute
> > to allow it to be changed.  Still, fine for initial merge, we can change
> > this
> > later.
> > > +
> > >
> >
> +/************************************************************************
> > **
> > > + * Calcualtion of temperature and pressure
> > Typo Calcualtion -> Calculation.
> > > +
> >
> **************************************************************************
> > /
> > > +static short bmp085_calc_temperature(struct i2c_client *client,
> > > +        unsigned long ut)
> > > +{
> > > + struct bmp085_data *data = i2c_get_clientdata(client);
> > > + long x1, x2;
> > > + short temp;
> > > +
> > > + x1 = ((long) ut - (long) data->ac6) * (long) data->ac5 >> 15;
> > > + x2 = ((long) data->mc << 11) / (x1 + data->md);
> > > + data->b5 = x1 + x2;
> > > + temp = ((data->b5 + 8) >> 4);
> > > +
> > > + return temp;
> > > +}
> > > +
> > > +static long bmp085_calc_pressure(struct i2c_client *client, unsigned
> > long up)
> > > +{
> > > + struct bmp085_data *data = i2c_get_clientdata(client);
> > > + long b6, x1, x2, x3, b3;
> > > + unsigned long b4, b7;
> > > + long pressure, p;
> > > + long tmp;
> > > +
> > > + b6 = data->b5 - 4000;
> > > + x1 = (data->b2 * (b6 * b6 / (1<<12))) / (1<<11);
> > > + x2 = data->ac2 * b6 / (1<<11);
> > > + x3 = x1 + x2;
> > > + b3 = (((data->ac1 * 4 + x3) << data->oss) + 2) / 4;
> > > +
> > > + x1 = data->ac3 * b6 / (1<<13);
> > > + x2 = (data->b1 * ((b6 * b6) / (1<<12))) / (1<<16);
> > > + x3 = ((x1 + x2) + 2) / (1<<2);
> > > + b4 = data->ac4 * (unsigned long) (x3 + 32768) / (1<<15);
> > > + b7 = ((unsigned long)up - b3) * (50000 >> data->oss);
> > > +
> > > + if (b7 < 0x80000000)
> > > +         p = (b7 * 2) / b4;
> > > + else
> > > +         p = (b7 / b4) * 2;
> > > + tmp = (p / (1<<8)) * (p / (1<<8));
> > > + x1 = (tmp * 3038) / (1<<16);
> > > + x2 = (-7357 * p) / (1<<16);
> > > + pressure = p + ((x1 + x2 + 3791) / (1<<4));
> > > +
> > > + return pressure;
> > > +}
> > > +
> > >
> >
> +/************************************************************************
> > **
> > > + * Digital interface to sensor
> > > +
> >
> **************************************************************************
> > /
> > > +
> > This is an extremely slim function.  I think it would be easier to
> remove
> > it and
> > just ahve the i2c_block_data function inline in the code.
> > > +static ssize_t bmp085_read(struct i2c_client *client, u8 reg, size_t
> > count,
> > > +        unsigned char *buffer)
> > > +{
> > > + int rc;
> > > + rc = i2c_smbus_read_i2c_block_data(client, reg, count, buffer);
> > > + if (rc < 0)
> > No.  Pass the error that came out of the i2c command on.  Never eat an
> > error as you just reduce the information available.
> > > +                 return -EIO;
> > > +
> > > + return count;
> > > +}
> > > +
> > > +static short bmp085_read_temp(struct i2c_client *client)
> > > +{
> > > + s32 ret;
> > > + short temp;
> > > + struct bmp085_data *data = i2c_get_clientdata(client);
> > > +
> > > + mutex_lock(&data->bmp085_lock);
> > > + ret = i2c_smbus_write_byte_data(client, BMP085_START_CONV,
> > > +                BMP085_START_TEMP);
> > > + mutex_unlock(&data->bmp085_lock);
> > > + if (ret < 0) {
> > > +         dev_warn(&client->dev, "starting temperature conversation "
> > > +                        "failed\n");
> > > +         return ret;
> > > + }
> > > +
> > probably msleep.
> > > + mdelay(5);
> > > + ret = bmp085_read(client, BMP085_REG_CONV, 2, data->data);
> > > + if (ret < 0) {
> > > +         dev_warn(&client->dev, "reading ut failed, value is %#x\n"
> > > +                         , ret);
> > > +         return ret;
> > > + }
> > > +
> > > + data->ut = (data->data[0] << 8) | data->data[1];
> > > +
> > > + temp = bmp085_calc_temperature(client, data->ut);
> > > +
> > > + return temp;
> > > +}
> > > +
> > > +static long bmp085_read_pressure(struct i2c_client *client)
> > > +{
> > > + unsigned long up = 0;
> > > + int ret;
> > > + u8 xlsb, ret1, ret2;
> > > + long pressure;
> > > + u8 reg;
> > Don't worry about the todo.  Overshooting on this isn't going
> > to greatly change your possible read rate.
> > > + /* TODO should be 4.5, 7.5, 13.5, 25.5 ms */
> > > + int time_delay[4] = {5, 8, 14, 26};
> > > + struct bmp085_data *data = i2c_get_clientdata(client);
> > > +
> > > + if (data->oss == 0)
> > > +         reg = BMP085_START_PRESS_OSRS0;
> > > + else if (data->oss == 1)
> > > +         reg = BMP085_START_PRESS_OSRS1;
> > > + else if (data->oss == 2)
> > > +         reg = BMP085_START_PRESS_OSRS2;
> > > + else if (data->oss == 3)
> > > +         reg = BMP085_START_PRESS_OSRS3;
> > > + else {
> > > +         dev_warn(&client->dev, "undefined oss value, use oss = 0\n");
> > > +         data->oss = 0;
> > > +         reg = BMP085_START_PRESS_OSRS0;
> > > + }
> > > +
> > > + mutex_lock(&data->bmp085_lock);
> > > + ret = i2c_smbus_write_byte_data(client, BMP085_START_CONV, reg);
> > > + mutex_unlock(&data->bmp085_lock);
> > > + if (ret < 0)
> > > +         return ret;
> > > +
> > Does this need to be that precise?  If not an msleep would be a better
> > bet to allow the system to get on with something else.
> > > + mdelay(time_delay[data->oss]);
> > > +
> > > + mutex_lock(&data->bmp085_lock);
> > > + ret1 = i2c_smbus_read_byte_data(client, 0xf6);
> > > + ret2 = i2c_smbus_read_byte_data(client, 0xf7);
> > > + xlsb = i2c_smbus_read_byte_data(client, 0xf8);
> > > + mutex_unlock(&data->bmp085_lock);
> > > +
> > > + up = (((unsigned long) ret1 << 16) | ((unsigned long) ret2 << 8)
> > > +                         | (unsigned long) xlsb) >> (8 - data->oss);
> > > + data->up = up;
> > > +
> > > + pressure = bmp085_calc_pressure(client, up);
> > Why cache the pressure?
> > > + data->pressure = pressure;
> > > +
> > > + return pressure;
> > > +}
> > > +
> > >
> >
> +/************************************************************************
> > **
> > > + * sysfs attributes
> > > +
> >
> **************************************************************************
> > /
> > > +static ssize_t barometer_show_temp(struct device *dev,
> > > +         struct device_attribute *da, char *buf)
> > > +{
> > > + struct iio_dev *indio_dev = dev_get_drvdata(dev);
> > > + struct bmp085_data *data = indio_dev->dev_data;
> > > + struct i2c_client *client = data->client;
> > > + long status;
> > > +
> > > + status = bmp085_read_temp(client);
> > > + if (status < 0)
> > > +         dev_warn(&client->dev, "error reading temperature: %ld\n",
> > > +                         status);
> > > +
> > > + data->temp = status;
> > > +
> > > + return sprintf(buf, "%ld\n", data->temp);
> > > +}
> > > +static IIO_DEV_ATTR_TEMP_RAW(barometer_show_temp);
> > > +
> > > +/**
> > > + * In standard mode, the temperature has to be reat every second
> before
> > the
> > > + * pressure can be reat. We leave this semantics to the userspace, if
> > later
> > past tense of read is infact read not reat.
> > > + * on a trigger based reading will be implemented, this should be
> taken
> > into
> > > + * account.
> > Ouch, that's an uggly requirement.
> > > + */
> > > +static ssize_t barometer_show_pressure(struct device *dev,
> > > +         struct device_attribute *da, char *buf)
> > > +{
> > > + struct iio_dev *indio_dev = dev_get_drvdata(dev);
> > > + struct bmp085_data *data = indio_dev->dev_data;
> > > + struct i2c_client *client = data->client;
> > > + long status;
> > > +
> > > + status = bmp085_read_pressure(client);
> > > + if (status < 0)
> > > +         dev_warn(&client->dev, "error reading pressure: %ld\n",
> > status);
> > > +
> > Why cache the preesure?
> > > + data->pressure = status;
> > > +
> > > + return sprintf(buf, "%ld\n", data->pressure);
> > > +}
> > > +static IIO_DEV_ATTR_BARO_PRESSURE(S_IRUGO, barometer_show_pressure,
> > NULL, 0);
> > > +
> > > +static ssize_t barometer_show_id_version(struct device *dev,
> > > +         struct device_attribute *da, char *buf)
> > > +{
> > > + struct iio_dev *indio_dev = dev_get_drvdata(dev);
> > > + struct bmp085_data *data = indio_dev->dev_data;
> > Doesn't really matter, but we do have a helper function for this
> > (and at somepoint I'll clean all the direct reads out of the tree)
> > struct bmp085_data *data = iio_dev_get_devdata(indio_dev);
> > > +
> > > + return sprintf(buf, "%x_%x\n", data->chip_id, data->chip_version);
> > > +}
> > > +static IIO_DEV_ATTR_REV(barometer_show_id_version);
> > > +
> > > +static ssize_t barometer_show_oss(struct device *dev,
> > > +         struct device_attribute *da, char *buf)
> > > +{
> > > + struct iio_dev *indio_dev = dev_get_drvdata(dev);
> > > + struct bmp085_data *data = indio_dev->dev_data;
> > > +
> > > + return sprintf(buf, "%d\n", data->oss);
> > > +}
> > So is oss (which is sampling frequency) either 1Hz or 2Hz?
> > (I haven't looked at datasheet but under the abi that's what this is
> > giving us).
> > > +static IIO_DEV_ATTR_SAMP_FREQ(S_IRUGO, barometer_show_oss, NULL);
> > > +
> > > +static IIO_CONST_ATTR_TEMP_SCALE("0.1");
> > No real problem with this.  Personally I'd probably just do
> > the trivial amount of fixed point arithmetic in the temperature
> > output.
> >
> > sprintf(buf, "%d.%d\n", temp/10, temp%10);
> > > +
> > > +static struct attribute *bmp085_attributes[] = {
> > > + &iio_dev_attr_temp_raw.dev_attr.attr,
> > > + &iio_dev_attr_baro_pressure.dev_attr.attr,
> > > + &iio_dev_attr_revision.dev_attr.attr,
> > > + &iio_dev_attr_sampling_frequency.dev_attr.attr,
> > > + &iio_const_attr_temp_scale.dev_attr.attr,
> > > + NULL
> > > +};
> > > +
> > > +static const struct attribute_group bmp085_attr_group = {
> > > + .attrs = bmp085_attributes,
> > > +};
> > > +
> > >
> >
> +/************************************************************************
> > **
> > > + * Calibration data processing
> > > +
> >
> **************************************************************************
> > /
> > > +
> > > +static int bmp085_init_client(struct i2c_client *client)
> > > +{
> > > + struct bmp085_data *data = i2c_get_clientdata(client);
> > > + int i;
> > > +
> > > + i = bmp085_read(client, BMP085_REG_CHIP_ID, 1, &data->chip_id);
> > > + if (i < 0)
> > > +         dev_warn(&client->dev, "Chip ID not read\n");
> > > +
> > > + i = bmp085_read(client, BMP085_REG_VERSION, 1, &data->chip_version);
> > > + if (i < 0)
> > > +         dev_warn(&client->dev, "Version not read\n");
> > > +
> > > + i = bmp085_read(client, BMP085_REG_PROM, BMP085_PROM_LENGTH,
> > > +                 data->data);
> > > + if (i < 0)
> > > +         dev_warn(&client->dev, "Unable to read %d bytes from address "
> > > +                         "%#x\n", BMP085_PROM_LENGTH, BMP085_REG_PROM);
> > > +
> > > + data->ac1 = (data->data[0] << 8) | data->data[1];
> > > + data->ac2 = (data->data[2] << 8) | data->data[3];
> > > + data->ac3 = (data->data[4] << 8) | data->data[5];
> > > + data->ac4 = (data->data[6] << 8) | data->data[7];
> > > + data->ac5 = (data->data[8] << 8) | data->data[9];
> > > + data->ac6 = (data->data[10] << 8) | data->data[11];
> > > + data->b1 = (data->data[12] << 8) | data->data[13];
> > > + data->b2 = (data->data[14] << 8) | data->data[15];
> > > + data->mb = (data->data[16] << 8) | data->data[17];
> > > + data->mc = (data->data[18] << 8) | data->data[19];
> > > + data->md = (data->data[20] << 8) | data->data[21];
> > > +
> > > + return 0;
> > > +}
> > > +
> > > +static struct i2c_driver bmp085_drv;
> > Why is this here?
> >
> > > +static int bmp085_probe(struct i2c_client *client,
> > > +         const struct i2c_device_id *id)
> > > +{
> > > + struct i2c_adapter *adapter = to_i2c_adapter(client->dev.parent);
> > > + struct bmp085_data *data;
> > > + struct bmp085_data *data2;
> > > + int status = 0;
> > > +
> > > + if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA |
> > > +                         I2C_FUNC_SMBUS_WORD_DATA))
> > > +         return -EIO;
> > > +
> > > + /* Allocate driver data */
> > > + data = kzalloc(sizeof(struct bmp085_data), GFP_KERNEL);
> > > + if (!data)
> > > +         return -ENOMEM;
> > > +
> > > + if ((oss < 0) || (oss > 3)) {
> > > +         status = -EINVAL;
> > > +         goto err;
> > > + }
> > > + data->oss = oss;
> > > +
> > > + data->client = client;
> > > + i2c_set_clientdata(client, data);
> > > + data2 = i2c_get_clientdata(client);
> > Guessing the above is dead debug code?
> >
> > > +
> > > + /* Initialize the BMP085 chip */
> > > + bmp085_init_client(client);
> > > +
> > > + __mutex_init(&data->bmp085_lock, "bmp085_lock", NULL);
> > Why the underscore form?  I've not seen this before.
> > > +
> > > + /* Register with IIO */
> > > + data->indio_dev = iio_allocate_device();
> > > + if (data->indio_dev == NULL) {
> > > +         status = -ENOMEM;
> > > +         goto err;
> > > + }
> > > +
> > > + data->indio_dev->dev.parent = &client->dev;
> > > + data->indio_dev->attrs = &bmp085_attr_group;
> > > + data->indio_dev->dev_data = (void *)(data);
> > > + data->indio_dev->driver_module = THIS_MODULE;
> > > + data->indio_dev->modes = INDIO_DIRECT_MODE;
> > > +
> > > + status = iio_device_register(data->indio_dev);
> > > + if (status < 0)
> > > +         goto err_iio;
> > > +
> > Remove this as it's not needed.
> > > + dev_info(&client->dev, "driver enabled\n");
> > > +
> > > + return 0;
> > > +
> > > +err_iio:
> > > + kfree(data->indio_dev);
> > > +err:
> > > + kfree(data);
> > > + return status;
> > > +}
> > > +
> > > +static int __devexit bmp085_remove(struct i2c_client *client)
> > > +{
> > > + struct bmp085_data *data = i2c_get_clientdata(client);
> > > +
> > > + if (mutex_is_locked(&data->bmp085_lock))
> > > +         mutex_unlock(&data->bmp085_lock);
> > Something weird is occuring if you can get here without the lock
> > being unlocked.
> > > +
> > > + iio_device_unregister(data->indio_dev);
> > > + iio_free_device(data->indio_dev);
> > > +
> > > + kfree(data);
> > > +
> > > + dev_info(&client->dev, "driver removed\n");
> > > +
> > > + return 0;
> > > +}
> > > +
> > > +static const struct i2c_device_id bmp085_id[] = {
> > > + { "bmp085", 0 },
> > > + {}
> > > +};
> > > +MODULE_DEVICE_TABLE(i2c, bmp085_id);
> > > +
> > > +static struct i2c_driver bmp085_drv = {
> > > + .driver = {
> > > +         .name =  "bmp085",
> > > +         .owner = THIS_MODULE,
> > > + },
> > > + .suspend = NULL,
> > > + .resume = NULL,
> > > + .probe = bmp085_probe,
> > > + .remove = __devexit_p(bmp085_remove),
> > > + .id_table = bmp085_id,
> > > +};
> > > +
> > > +/*-------------------------------------------------------------------
> --
> > ----*/
> > > +
> > > +static int __init bmp085_init_module(void)
> > > +{
> > Get rid of tis debug.
> > > + printk(KERN_INFO"bmp085 loading...\n");
> > > +
> > > + return i2c_add_driver(&bmp085_drv);
> > > +}
> > > +
> > > +static void __exit bmp085_exit_module(void)
> > > +{
> > > + i2c_del_driver(&bmp085_drv);
> > > +}
> > > +
> > > +MODULE_AUTHOR("Matthias Brugger
> <matthias.brugger@xxxxxxxxxxxxxxxxx>");
> > > +MODULE_DESCRIPTION("I2c device driver for BMP085 barometererator
> > sensor");
> > > +MODULE_LICENSE("GPL");
> > > +
> > > +module_init(bmp085_init_module);
> > > +module_exit(bmp085_exit_module);
> > > diff --git a/drivers/staging/iio/barometer/bmp085.h
> > b/drivers/staging/iio/barometer/bmp085.h
> > > new file mode 100644
> > > index 0000000..5ed2fb1
> > > --- /dev/null
> > > +++ b/drivers/staging/iio/barometer/bmp085.h
> > > @@ -0,0 +1,73 @@
> > > +#ifndef BMP085_H
> > > +#define BMP085_H
> > > +
> > > +#include "../iio.h"
> > > +#include "baro.h"
> > > +
> > > +#define BMP085_REG_CONV          0xF6 /* Temperature/pressure value UT
> > or UP */
> > > +#define BMP085_REG_CONV_XLS      0xF8
> > > +
> > > +#define BMP085_REG_PROM          0xAA
> > > +#define BMP085_PROM_LENGTH       22
> > > +
> > > +#define BMP085_REG_AC1           0xAA
> > > +#define BMP085_REG_AC2           0xAC
> > > +#define BMP085_REG_AC3           0xAE
> > > +#define BMP085_REG_AC4           0xB0
> > > +#define BMP085_REG_AC5           0xB2
> > > +#define BMP085_REG_AC6           0xB4
> > > +#define BMP085_REG_B1            0xB6
> > > +#define BMP085_REG_B2            0xB8
> > > +#define BMP085_REG_MB            0xBA
> > > +#define BMP085_REG_MC            0xBC
> > > +#define BMP085_REG_MD            0xBE
> > > +
> > > +#define BMP085_START_CONV        0xF4
> > > +
> > > +#define BMP085_START_TEMP        0x2E  /* wait 4.5 ms */
> > > +
> > > +#define BMP085_START_PRESS_OSRS0 0x34 /* wait 4.5 ms */
> > > +#define BMP085_START_PRESS_OSRS1 0x74 /* wait 7.5 ms */
> > > +#define BMP085_START_PRESS_OSRS2 0xB4 /* wait 13.5 ms */
> > > +#define BMP085_START_PRESS_OSRS3 0xF4 /* wait 25.5 ms */
> > > +
> > > +#define BMP085_REG_CHIP_ID       0xD0
> > > +#define BMP085_REG_VERSION       0xD1
> > > +#define BMP085_CHIP_ID           0x55
> > > +
> > Ideally this structure would have some documentation (kernel doc)
> > to make reviewing the driver easier.
> >
> > > +struct bmp085_data {
> > > + struct i2c_client *client;
> > > + struct iio_dev *indio_dev;
> > > +
> > > + struct mutex bmp085_lock;
> > > +
> > > + int oss;
> > > + long temp;
> > Why long?  Looking at the code this always looks to be
> > 16 bit to me, so s16 would be more appropraite.
> >
> > > + long pressure;
> > > +
> > > + short ac1;
> > > + short ac2;
> > > + short ac3;
> > > + unsigned short ac4;
> > > + unsigned short ac5;
> > > + unsigned short ac6;
> > > +
> > > + short b1;
> > > + short b2;
> > > + long b5;
> > > +
> > > + short mb;
> > > + short mc;
> > > + short md;
> > > +
> > > + unsigned long ut;
> > > + unsigned long up;
> > > +
> > > + u8 chip_id;
> > > + u8 chip_version;
> > > +
> > > + unsigned char data[22];
> > > +};
> > > +
> > > +
> > > +#endif
> >
> > --
> > To unsubscribe from this list: send the line "unsubscribe linux-iio" in
> > the body of a message to majordomo@xxxxxxxxxxxxxxx
> > More majordomo info at  http://vger.kernel.org/majordomo-info.html
--
To unsubscribe from this list: send the line "unsubscribe linux-iio" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Input]     [Linux Kernel]     [Linux SCSI]     [X.org]

  Powered by Linux