Hello Christian,
On Fri, 2022-06-24 at 17:32 +0200, o...@c-mauderer.de wrote:
> Be careful with everything that depends on the BSP. Again: Please
> think
> about an i2c GPIO expander. That chip can be used on different BSPs.
> It
> can be even an independent driver that can be used by a user on
> demand
> on any BSP that supports i2c.
I ended up using a void* so that users can pass anything into it and
the driver/BSP will cast and parse it. Is that a good solution?
Also, here is my updated API:
File: gpio2.h /* API header **/
typedef struct rtems_gpio_handlers rtems_gpio_handlers_t;
typedef struct rtems_gpio_ctrl rtems_gpio_ctrl_t;
typedef struct rtems_gpio_config rtems_gpio_config_t;
typedef struct rtems_gpio_interrupt_config
rtems_gpio_interrupt_config_t;
struct rtems_gpio_handlers {
rtems_status_code (*initialize)(rtems_gpio_ctrl_t *);
rtems_status_code (*deinitialize)(rtems_gpio_ctrl_t *);
rtems_status_code (*configure)(rtems_gpio_ctrl_t *, void *,
rtems_gpio_config_t *);
rtems_status_code (*configure_interrupt)(rtems_gpio_ctrl_t *, void
*, rtems_gpio_interrupt_config_t *);
rtems_status_code (*enable_interrupt)(rtems_gpio_ctrl_t *, void *,
rtems_gpio_interrupt_config_t *);
rtems_status_code (*disable_interrupt)(rtems_gpio_ctrl_t *, void *,
rtems_gpio_interrupt_config_t *);
rtems_status_code (*set_pin_mode)(rtems_gpio_ctrl_t *, void *,
rtems_gpio_pin_mode);
rtems_status_code (*set_pull)(rtems_gpio_ctrl_t *, void *,
rtems_gpio_pull);
rtems_status_code (*read)(rtems_gpio_ctrl_t *, void *,
rtems_gpio_pin_state *);
rtems_status_code (*write)(rtems_gpio_ctrl_t *, void *,
rtems_gpio_pin_state);
rtems_status_code (*toggle)(rtems_gpio_ctrl_t *, void *);
};
struct rtems_gpio_ctrl {
const rtems_gpio_handlers_t *handlers;
};
struct rtems_gpio_config {
rtems_gpio_pin_mode mode; /* Pin mode */
rtems_gpio_pull pull; /* Pull resistor configuration */
};
struct rtems_gpio_interrupt_config {
rtems_gpio_interrupt interrupt_mode;/* Interrupt trigger
mode */
uint32_t interrupt_number; /* Interrupt number */
uint32_t priority; /* Interrupt priority
*/
void *bsp; /* Pointer to BSP-
specific config */
void (*handler) (void *arg);/* Pointer to the IRQ
handler */
void *arg; /* Pointer to the
arguments of IRQ handler */
};
extern void rtems_gpio_register(
rtems_gpio_ctrl_t *base,
const rtems_gpio_handlers_t *handlers
);
extern rtems_status_code rtems_gpio_initialize(
rtems_gpio_ctrl_t *base
);
extern rtems_status_code rtems_gpio_deinitialize(
rtems_gpio_ctrl_t *base
);
extern rtems_status_code rtems_gpio_configure(
rtems_gpio_ctrl_t *base,
void *pin,
rtems_gpio_config_t *config
);
extern rtems_status_code rtems_gpio_set_pin_mode(
rtems_gpio_ctrl_t *base,
void *pin,
rtems_gpio_pin_mode mode
);
extern rtems_status_code rtems_gpio_set_pull(
rtems_gpio_ctrl_t *base,
void *pin,
rtems_gpio_pull pull
);
extern rtems_status_code rtems_gpio_configure_interrupt(
rtems_gpio_ctrl_t *base,
void *pin,
rtems_gpio_interrupt_config_t *int_conf
);
extern rtems_status_code rtems_gpio_enable_interrupt(
rtems_gpio_ctrl_t *base,
void *pin,
rtems_gpio_interrupt_config_t *int_conf
);
extern rtems_status_code rtems_gpio_disable_interrupt(
rtems_gpio_ctrl_t *base,
void *pin,
rtems_gpio_interrupt_config_t *int_conf
);
extern rtems_status_code rtems_gpio_write(
rtems_gpio_ctrl_t *base,
void *pin,
rtems_gpio_pin_state value
);
extern rtems_status_code rtems_gpio_read(
rtems_gpio_ctrl_t *base,
void *pin,
rtems_gpio_pin_state *value
);
extern rtems_status_code rtems_gpio_ctrl_toggle(
rtems_gpio_ctrl_t *base,
void *pin
);
//
File: gpio.c (API source)
#include
void rtems_gpio_register(
rtems_gpio_ctrl_t *base,
const rtems_gpio_handlers_t *handlers
)
{
base->handlers = handlers;
}
rtems_status_code rtems_gpio_initialize(
rtems_gpio_ctrl_t *base
)
{
return base->handlers->initialize(base);
}
rtems_status_code rtems_gpio_deinitialize(
rtems_gpio_ctrl_t *base
)
{
return base->handlers->deinitialize(base);
}
rtems_status_code rtems_gpio_configure(
rtems_gpio_ctrl_t *base,
void *pin,
rtems_gpio_config_t *config
)
{
return base->handlers->configure(base, pin, config);
}
rtems_status_code rtems_gpio_set_pin_mode(
rtems_gpio_ctrl_t *base,
void *pin,
rtems_gpio_pin_mode mode
)
{
return base->handlers->set_pin_mode(base, pin, mode);
}
rtems_status_code rtems_gpio_set_pull(
rtems_gpio_ctrl_t *base,
void *pin,
rtems_gpio_pull pull
)
{
return base->handlers->set_pull(base, pin, pull);
}
rtems_status_code rtems_gpio_configure_interrupt(