[PATCH] Beagle BSP Improvements (GPIO driver)

Chris Johns chrisj at rtems.org
Wed Apr 29 01:09:18 UTC 2015


 [ Just catching up ]

On 26/04/2015 9:26 pm, Ben Gras wrote:
> All,
> 
> I think the API as it is (for digital GPIO's) is pretty close to
> generic. I like my suggestion (gpio_* in my previous mail) better as
> more generic. (More configuration is hidden from the application.)
> 
> Joel I just read your presentation.
> 
> I have come up with a minimal GPIO API based on the above (so
> ultimately based on the RPI API) that just covers the GPIO digital out
> case but allows expansion (with more defines and functions).
> 
> https://devel.rtems.org/wiki/TBR/User/BenGras
> 
> Is this an idea? Then we can merge this code implementing a reasonably
> generic API without having to flesh out the whole thing.
> 

How do we define hardware specific details without bloating the API ?

For example on a zynq project I am working on I needed a GPIO interface
and I decided to use a struct to define the pin and the API takes
references to it. For example to control the write enable pin on a flash
device I have:

static const gpio_pin_def gpio_Flash_WD =
{
  pin:      4,
  output:   true,
  on:       GPIO_FLASH_WD_EN,
  outen:    true,
  volts:    gpio_LVCMOS33,
  pullup:   true,
  fast:     false,
  tristate: false
};

and then I have:

   gpio_error ge = gpio_setup_pin(&gpio_Flash_WD);
   if (ge != GPIO_NO_ERROR)
       return FLASH_WRITE_LOCK_FAIL;

   ....

    gpio_output(gpio_Flash_WD.pin, GPIO_FLASH_WD_EN);

   ....

I need to set the voltage on the pin on the Zynq but this is Zynq specific.

We need a way to let a user convey specific hardware details to the BSP
driver through the API plus we need a light weight API with minimal
internal translations. This approach also lets me define an array of
pins and a single set up call configures them.

So you could have:

typedef struct
{
    int   pin;       /* The pin number. */
    bool  output;    /* True for output, false for input. */
    bool  on;        /* True default output is on */
    bool  outen;     /* True for output enable on, false for off. */
    bool  pullup;    /* True to enable the pull up. */
    bool  tristate;  /* True to enable tri-state. */
    void* platform;  /* Opaque hardware specific set up details. */
} gpio_pin_def;

where the 'platform' references a struct agreed between the BSP (or
device layer) and the user code. For the generic cases this is not
needed and NULL. It also allows layering where a device set up phase of
user code sets the voltages and the generic code can play with the pin
at a generic level, eg direction etc.

What locking is being considered in this API ?

Chris


More information about the devel mailing list