gpio.h 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. #ifndef BFG_GPIO_H
  2. #define BFG_GPIO_H
  3. enum bfg_gpio_direction {
  4. BGD_INPUT = 0,
  5. BGD_OUTPUT = 1,
  6. };
  7. #define BGD_ALT(n) (2 + n)
  8. typedef unsigned gpio_bitmask_t;
  9. static const gpio_bitmask_t gpio_bitmask_all = -1;
  10. static const int gpio_highest = ((sizeof(gpio_bitmask_t) * 8) - 1);
  11. #define gpio_bitmask(pin) (1<<pin)
  12. struct bfg_gpio_controller;
  13. struct bfg_gpio_controller_drv {
  14. bool (*set_mode)(struct bfg_gpio_controller *, gpio_bitmask_t, int);
  15. void (*set_values)(struct bfg_gpio_controller *, gpio_bitmask_t, gpio_bitmask_t);
  16. gpio_bitmask_t (*get_values)(struct bfg_gpio_controller *, gpio_bitmask_t);
  17. };
  18. struct bfg_gpio_controller {
  19. gpio_bitmask_t all_gpios;
  20. const struct bfg_gpio_controller_drv *drv;
  21. void *p;
  22. };
  23. static inline
  24. bool gpio_set_mode(struct bfg_gpio_controller * const gc, const gpio_bitmask_t pins, const int mode)
  25. {
  26. return gc->drv->set_mode(gc, pins, mode);
  27. }
  28. static inline
  29. void gpio_set_values(struct bfg_gpio_controller * const gc, const gpio_bitmask_t pins, const gpio_bitmask_t vals)
  30. {
  31. gc->drv->set_values(gc, pins, vals);
  32. }
  33. static inline
  34. void gpio_set_value(struct bfg_gpio_controller * const gc, const gpio_bitmask_t pins, const bool val)
  35. {
  36. gc->drv->set_values(gc, pins, val ? pins : 0);
  37. }
  38. static inline
  39. gpio_bitmask_t gpio_get_values(struct bfg_gpio_controller * const gc, const gpio_bitmask_t pins)
  40. {
  41. return gc->drv->get_values(gc, pins);
  42. }
  43. extern bool bfg_gpio_init(void);
  44. extern struct bfg_gpio_controller _linux_gpio;
  45. #define linux_gpio (&_linux_gpio)
  46. #endif