[En-Nut-Discussion] Nut/OS GPIO API Initial Design and Current Status

Uwe Bonnes bon at elektron.ikp.physik.tu-darmstadt.de
Tue Oct 16 11:19:05 CEST 2012


>>>>> "Ole" == Ole Reinhardt <ole.reinhardt at embedded-it.de> writes:

    Ole> Hi Uwe,
    >> This sounds good. But what do with platform independant code
    >> requesting e.g.  pulldown on AVR? Should configure fail or should
    >> user code check the actual flags? The AVR can't pulldown at all.

    Ole> Yes, I know...

    Ole> Even with this little sub-set we will find architectures that do
    Ole> not support every setting. For example the LPC, it has some port
    Ole> pins that even do not support to set a pin high, as they are only
    Ole> open drain.

    Ole> But we have to find a compromise:

    Ole> My first intention would be:

    Ole> Keep it simple. If the CPU does not support pulldown, just ignore
    Ole> the flag. Returning an error code would be an option as well but
    Ole> would need more code to check this flag.

    Ole> In this case I realy vould vote for simplicity. Better document the
    Ole> behaviour for different platforms, but do not complicate the code.

    >> We also miss MULTIDRIVE here. Without MULTIDRIVE we can't do e.g. a
    >> bitbanging TWI driver.

    Ole> Why not? There are tons of bitbanging TWI implementations for AVR
    Ole> out there...

    Ole> You just would have to change pin-configuration from output / low
    Ole> to input / pullup. and the other way round to emulate open-drain
    Ole> outputs.

    Ole> That's why I would not use MULTIDRIVE in a portable bitbanging
    Ole> driver but this way of emulation.


    >> With MULTIDRIVE we also have a problem with AVR. Let's take this
    >> example for AVR:
    >> 
    >> NutGpioPinSet( p, b,.. MULTIDRIVE) NutGpioPinSetLow( p, b);
    >> NutGpioPinSetHigh( p, b);
    >> 
    >> This doesn't result in a TRISTATE AVR pin. If we add a explicit
    >> function to release and drive a pin, we can handle this for AVR. For
    >> most other platforms release() and drive() will be empty macros.

    Ole> Exactly. But we can emulate the multidrive behaviour as shown
    Ole> above, so why not use the emulation for portable drivers and
    Ole> specialization for architecture specific drivers.

I am so fed up by this discussion that I don't see where above you have shown
portable code that can e.g. implement a bitbanging TWI or one-wire
driver. We now have such portable drivers as dev/twibus_gpio.c and
owibus_bbif.c.

Tell me how you would implement e.g. for dev/owibus_bbif.c the
BB_OwiTransaction() bitbanging as platform independant as it is now with your
proposal that dislike MULTIDRIVE, release() and drive().

Bye
-- 
Uwe Bonnes                bon at elektron.ikp.physik.tu-darmstadt.de

Institut fuer Kernphysik  Schlossgartenstrasse 9  64289 Darmstadt
--------- Tel. 06151 162516 -------- Fax. 06151 164321 ----------


More information about the En-Nut-Discussion mailing list