Hi everyone,

for documentation purposes a quote from a private mail that I wrote Gunar earlier today (at that point I was not aware of this email...):

```
Maybe one think that could (or even should?!) be considered: try to make very specialized features optional (e.g. via "sub-moduling" them). With this I mean thinks like e.g. event detection, interrupt mode vs. polling etc.). I know choosing those features is definitely not a black&white kind of task, but when keeping this on a coarse level I think it should be rather straight forward. The goal with this would be to allow people to use a simple (e.g. polling) driver configuration (-> low ROM/RAM usage), but also allow developers to chose the full fledged feature version of the driver, trading ROM/RAM usage against features.

As said, don't aim for a fine grained configuration (e.g. submodules for every small feature), but rather go with something like `USEMODULE += l3gd20h` for the simple polling configuration, and something like `USEMODULE += l3gd20h_full` for all the additional features.
```

To map this reply to the actual questions see inline comments below.

On 09/26/2018 09:27 AM, Gunar Schorcht wrote:
Hi,

I wrote a series of sensor drivers for esp-open-rtos/ESP-IDF, for
example for different ST sensors, the BME680, the CCS811 or the SHT3x. I
would like to port some of these drivers to RIOT OS. All the drivers are
quite complex as they try to cover all the features of the sensors.

I have seen that most drivers in RIOT for similar sensors usually only
implement an interface to with init, read, power-up and power-down. So
I'm wondering now, what the design rules for sensor drivers in RIOT are?

- Should a driver be as complete as possible, which of cource produces
more code, or should it be kept simple to produce small code? One option
would be to use the pseudomodule approach to enable additional features.
On some platforms unused code is not linked into the binary.
As always, the usage of a driver depends heavily on the application use case and can differ in many ways. Sometimes a simple but small driver is preferable (get me any simple temperature sensor, but I don't have RAM/ROM to spare), in other cases some specialized features of a device are even the key driver for selecting that specific device. In the 2nd case, it is surely of the essence to have a driver that supports all those little specials.

So as stated above: IMO having a coarse modularity inside the driver should be the way to go, this way we can cover both sides.

- Should a driver support at least data-ready interrupts (if possible at
all) to realize event-driven data retrieval?
If the driver comes with a 'full/extra' configuration, this is part of it anyway, right? In the simples 'basic' configuration I don't think this needs to be part of I would say.

- Should a driver always return normalized/converted data, or rather
return the raw data and the application needs to convert them? The
conversion is sometimes quite complex. I saw both approaches of them for
similar sensors.
My opinion is quite clear: I am always in favor of returning normalized/converted data. In 90% of the cases the conversion is not expensive, so just do it. In those rare cases, where the conversions is actually relatively expensive, we can always fall back by providing additional `xx_read_raw()` or similar functions, that allow to access the data before conversion.

The design rules that are clear to me are:

- Drivers have to provide an interface for polling with init and read
that is compatible with SAUL.
that is a nice to have, but not a MUST.

- Output are always 16 bit integers.
Not quite true. The SAUL interface is build around 16-bit integers, and at least when reading/writing data via SAUL the data needs to be converted. But the driver specific interface can always use other data types/lengths. If it is however easily possible to use int16, one should use it.

What else?
All this information should go into the 'device driver guide' (https://github.com/RIOT-OS/RIOT/wiki/Guide:-Writing-a-device-driver-in-RIOT). This guide needs however still work - and I will not have the time to do it. So it would be nice if other people can help here :-)

Cheers,
Hauke



Regards
Gunar



_______________________________________________
devel mailing list
devel@riot-os.org
https://lists.riot-os.org/mailman/listinfo/devel

_______________________________________________
devel mailing list
devel@riot-os.org
https://lists.riot-os.org/mailman/listinfo/devel

Reply via email to