Re: [RFC PATCH 0/4] IIO: Out of staging step 1. The core.

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

 



Bump. Anyone had a chance to look at the text in this cover letter?

I'm planning ideally to send this first series out shortly.

Jonathan
On 08/30/11 17:18, Jonathan Cameron wrote:
> Hi All,
> 
> I'd like to make a good impression when posting this more widely,
> hence I'm posting it here first. Please comment on both the code
> and the text of this explanatory email!  Are there other things
> I should put in here?  Clearly the set is currently missing
> documentation which will need doing before this goes to lkml etc.
> 
> Also note that the code has to sit on a couple of namespace moves
> to avoid a clash with the staging tree.  These are in the
> outofstaging branch of iio-blue.git.
> 
> Dear All,
> 
> This is our first attempt to propose moving 'some' of the
> Industrial I/O subsystem out of staging.  This cover letter
> attempts to explain what IIO is and why it is needed.
> All comments welcome on this as well as the code!
> 
> So the big question is 'Why is there a need for a new subsystem?'
> 
> To answer this we need two things, a list or requirements and analysis
> of why current subystems (hwmon and input) do not meet them. Focused
> subsytems targetting just one type of sensor have been rejected as
> a concept (see ALS proposal).
> 
> Requirements of IIO.
> 
> 1) Simple interface for simple use cases.
> 2) High performance data route.
> 3) Generic and consistent 'event' handling.
> 4) Wide device type coverage with consistent interface.
> 5) Complex triggering setups - multiple devices capture 'simultaneously'.
> 6) Support output devices.
> 
> Lets take these in turn:
> 
> 1 - Simple interface for simple use cases:
> 
> The requirement boils down to an easy way to get a reading from a device or set
> an output without much overhead.
> 
> This is an area in which hwmon excels. Everything is available via sysfs
> and thats exactly what we allow drivers to provide.
> 
> 2 - High performance data route:
> 
> We want a path via which data can get to userspace without much overhead,
> thus allowing high speed data capture. (Note I'm not arguing we have this
> right yet - but the potential is there).
> 
> Input comes closest to this, but its approach of treating all data as events
> and providing significant filtering options (obvously tailored to human input)
> means that it isn't light weight.
> 
> The approach taken in IIO is to provide a 'buffered' interface.
> 
> The buffer may be in hardware or in software. The 'data' outputs of the
> devices being considered can be mapped onto the concept of 'scans'.  In ADCs it
> is common to have a single actually convertor connected via a multiplexer to a
> much larger set of inputs. The multiplexer will select the channels in turn in a
> repeating sequence.  Each repeat is termed a scan.  The whole scan clearly
> doesn't always occur simultaneously, but can be considered as a single set
> of associated data none the less.  Thus we have repeating sequences of data.
> This means that the meta data about what we are reading can be read
> 'out of band' from the data stream itself.
> 
> In IIO the buffers consist of a sequence of scans. The contents of each scan
> data set (laid out however a driver wants to do it) is provided via a set of
> sysfs attributes in the scan_elements directory.
> 
> The reason we can do it this way is that unlike input we pass our 'unusual'
> events via a different path.
> (see point 3).
> 
> We also allow for the minimum amount of processing of data to occur in the
> kernel possible. Its often best to leave this to userspace and in a number
> of important use cases doesn't need doing at all, either because it can be
> done offline (logging) or because the reverse transform can be applied
> to a much smaller set of data (e.g. software threshold comparison).  Note
> that the raw value off the sensor is often considerably more compact to store
> than a value in some set of consistent units.
> 
> 3 - Generic and consistent 'event' handling.
> 
> Numerous sensing devices provide threshold type detectors designed to do
> simple comparisons on the data without involving the host device.
> 
> In input, these are passed within the main event stream (we don't as that
> would mean all data would need to carry identifying metadata along).  Where
> these events map to typical human input device elements (double click etc)
> these are well handled. Hwmon supports a small set of such events via its alarm
> attributes.
> 
> For IIO we have decided to try and create an event code (litterally one number)
> to describe all types of events that these devices can detect and pass on to
> the host device. This is coupled with appropriate sysfs controls to configure
> the event.  The event code consists of:
> 
> 1) What type of channel
> 
> 2) Which channel (either axis / index or just index) Note this can be compound
> if modified. (e.g. freefall is typically X&Y&Z all less than alpha)
> 
> 3) What type of processed data it is applied to (raw value, abs value,
> rate of change, average shifted value)
> 
> 4) Which direction the threshold is crossed in.
> 
> 4 - Device coverage with a consistent interface
> 
> Hwmon and input have consistent interfaces that cover their chosen target well.
> When considering a wider range of sensors they simply don't generalize well
> enough. Afterall why should they?
> 
> Initially we matched hwmon where ever possible. In the end we broke away for a
> number of reasons. The in / out naming for voltage is a nasty bit of legacy for
> them which we don't want to carry. There is no general way of specifying whether
> a channel is an input or an output.  Having said that there is an easy mapping
> from IIO to hwmon (see possible future work).
> 
> Input is only interested in a narrow set of devices (those for human input).
> 
> 5) Complex triggering setups
> 
> This is probably more of a niche requirement but the generalizations required
> for it do simplify simple cases as well.
> 
> In a traditional data capturing environment (picture oscilloscopes / data
> loggers), the concept of a trigger is vital.  That is, some event on which
> data is captured.
> 
> In IIO this point is stretched somewhat.  For some devices it is indeed the
> point of capture (those with explicit 'capture now' pins, or those that
> capture when asked to by a bus transaction).  For other devices that run on
> their own internal clocks this is actualy a 'data has been captured now'
> signal (dataready).
> 
> What we want to allow (where possible) is for any device to be triggered by
> any other and crucially for any number of devices to be triggered by a single
> source.  As Thomas Gleixner observed, this is pretty much an irq cascade
> (and hence that's how it is now implemented - a very tidy approach!).
> 
> Some of the types of trigger we have are:
> 
> a) Data ready signals
>    These usually need to be used to trigger reading from the device producing
>    them but can be used to get only 'slightly' late readings from other devices.
> b) Software triggers
>    These allow userspace to trigger simultaneous capture from a number of
>    devices.
> c) Standalone triggers.
>    General interrupts from whereever can be used to cause a capture to occur
>    - typically a gpio.
> d) hardware timers
>    (could probably do with a more consistent interface outside of IIO for
>    these).
> 
> 6) Support output devices.
> 
> This is a relatively recent addition to IIO (despite us planning on it when
> the name was picked!).  Right now the support is very rudimentary -
> corresponding to the most basic sysfs only device interfaces.
> 
> It becomes more interesting when buffered outputs are considered, but that
> has not yet been implemented.
> 
> There is rudimentary support for output in hwmon (as is appropriate for its
> use domain) and indeed some of this could map to the regulator api, but
> neither is adaptable or suitable for more complex data flows.
> 
> 
> 
> 
> To get an appreciation for the whole subsystem it is necessary to look at
> what is still in staging as we aren't attempting to move the whole core
> out in one go.  Naturally if anyone fancies diving deeper into that tree
> and commenting on stuff in there it would also be welcomed.
> 
> Note however that being in staging some of the drivers are in 'interesting'
> shape.
> 
> 'Good' drivers include (and this is far from a complete list)
> 
> adc/
> 	ad7192
> 	ad7780
> 	ad7792
> 	ad799x
> 	max1363
> accel/
> 	lis3l02dq
> gyro/
> 	adis16260
> imu/
> 	adis16400
> light/
> 	tsl2563
> 
> 
> So what do we have here?
> 
> Our merge plan (order may change) has the following elements
> 
> 1) Registration core and sysfs interface
> 2) Some stripped down drivers using the above.
> 
> 3) Event interface
> 4) Extend drivers in 2 to provide event interfaces.
> 
> 5) Buffered reading interface
> 6) Extend drivers from 4 to provide buffered reading.
> 7) Pull in hardware ring buffer device examples
> 
> 8) Futher sets pulling across a few drivers at time (keeping review
> manageable!)
> 
> Drivers may be added to the subsystem at any stage (once support for
> what they use is available).
> 
> This patchset (1-2) only covers the simplest type of driver supported
> by IIO, that with only a sysfs based interface.  Please review it
> with that in mind!
> 
> Acknowledgements
> 
> A lot of thanks is due to various people during the IIO development.
> Most of it is born out by commit messages but I'd particularly like to
> thank Michael Hennerich for massive contributions and Arnd Bergmann for
> taking the time to not only suggest what we should do differently but
> to explain it to me and look at the results as they occured.
> 
> Jonathan Cameron (4):
>   IIO: Core sysfs only support.
>   IIO:ADC: max1363 initial import.
>   IIO:light:tsl2563 initial move out of staging.
>   IIO:imu:adis16400 partial move from staging.
> 
>  drivers/Kconfig                  |    2 +
>  drivers/Makefile                 |    2 +
>  drivers/iio/Kconfig              |   19 +
>  drivers/iio/Makefile             |   10 +
>  drivers/iio/adc/Kconfig          |   17 +
>  drivers/iio/adc/Makefile         |    6 +
>  drivers/iio/adc/max1363.h        |  148 ++++++
>  drivers/iio/adc/max1363_core.c   | 1000 ++++++++++++++++++++++++++++++++++++
>  drivers/iio/iio.c                |  593 +++++++++++++++++++++
>  drivers/iio/imu/Kconfig          |   10 +
>  drivers/iio/imu/Makefile         |    6 +
>  drivers/iio/imu/adis16400.h      |  180 +++++++
>  drivers/iio/imu/adis16400_core.c | 1057 ++++++++++++++++++++++++++++++++++++++
>  drivers/iio/light/Kconfig        |   14 +
>  drivers/iio/light/Makefile       |    6 +
>  drivers/iio/light/tsl2563.c      |  653 +++++++++++++++++++++++
>  include/linux/iio/iio.h          |  243 +++++++++
>  include/linux/iio/sysfs.h        |   68 +++
>  include/linux/iio/tsl2563.h      |    9 +
>  19 files changed, 4043 insertions(+), 0 deletions(-)
>  create mode 100644 drivers/iio/Kconfig
>  create mode 100644 drivers/iio/Makefile
>  create mode 100644 drivers/iio/adc/Kconfig
>  create mode 100644 drivers/iio/adc/Makefile
>  create mode 100644 drivers/iio/adc/max1363.h
>  create mode 100644 drivers/iio/adc/max1363_core.c
>  create mode 100644 drivers/iio/iio.c
>  create mode 100644 drivers/iio/imu/Kconfig
>  create mode 100644 drivers/iio/imu/Makefile
>  create mode 100644 drivers/iio/imu/adis16400.h
>  create mode 100644 drivers/iio/imu/adis16400_core.c
>  create mode 100644 drivers/iio/light/Kconfig
>  create mode 100644 drivers/iio/light/Makefile
>  create mode 100644 drivers/iio/light/tsl2563.c
>  create mode 100644 include/linux/iio/iio.h
>  create mode 100644 include/linux/iio/sysfs.h
>  create mode 100644 include/linux/iio/tsl2563.h
> 

--
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