mp_flipper_modflipperzero_gpio.c 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. #include <furi_hal.h>
  2. #include <mp_flipper_modflipperzero.h>
  3. static const GpioPin* decode_pin(uint8_t pin) {
  4. switch(pin) {
  5. case MP_FLIPPER_GPIO_PIN_PC0:
  6. return &gpio_ext_pc0;
  7. case MP_FLIPPER_GPIO_PIN_PC1:
  8. return &gpio_ext_pc1;
  9. case MP_FLIPPER_GPIO_PIN_PC3:
  10. return &gpio_ext_pc3;
  11. case MP_FLIPPER_GPIO_PIN_PB2:
  12. return &gpio_ext_pb2;
  13. case MP_FLIPPER_GPIO_PIN_PB3:
  14. return &gpio_ext_pb3;
  15. case MP_FLIPPER_GPIO_PIN_PA4:
  16. return &gpio_ext_pa4;
  17. case MP_FLIPPER_GPIO_PIN_PA6:
  18. return &gpio_ext_pa6;
  19. case MP_FLIPPER_GPIO_PIN_PA7:
  20. return &gpio_ext_pa7;
  21. default:
  22. furi_crash("unknown GPIO pin");
  23. }
  24. }
  25. static const GpioMode decode_mode(uint8_t mode) {
  26. switch(mode) {
  27. case MP_FLIPPER_GPIO_MODE_INPUT:
  28. return GpioModeInput;
  29. case MP_FLIPPER_GPIO_MODE_OUTPUT_PUSH_PULL:
  30. return GpioModeOutputPushPull;
  31. case MP_FLIPPER_GPIO_MODE_OUTPUT_OPEN_DRAIN:
  32. return GpioModeOutputOpenDrain;
  33. case MP_FLIPPER_GPIO_MODE_ANALOG:
  34. return GpioModeAnalog;
  35. case MP_FLIPPER_GPIO_MODE_INTERRUPT_FALL:
  36. return GpioModeInterruptFall;
  37. case MP_FLIPPER_GPIO_MODE_INTERRUPT_RISE:
  38. return GpioModeInterruptRise;
  39. }
  40. if(mode & MP_FLIPPER_GPIO_MODE_INTERRUPT_FALL & MP_FLIPPER_GPIO_MODE_INTERRUPT_RISE) {
  41. return GpioModeInterruptRiseFall;
  42. }
  43. furi_crash("unknown GPIO mode");
  44. }
  45. inline void mp_flipper_gpio_init_pin(uint8_t raw_pin, uint8_t raw_mode) {
  46. const GpioPin* pin = decode_pin(raw_pin);
  47. const GpioMode mode = decode_mode(raw_mode);
  48. furi_hal_gpio_init_simple(pin, mode);
  49. if(raw_mode & (MP_FLIPPER_GPIO_MODE_INTERRUPT_FALL | MP_FLIPPER_GPIO_MODE_INTERRUPT_RISE)) {
  50. furi_hal_gpio_enable_int_callback(pin);
  51. } else {
  52. furi_hal_gpio_disable_int_callback(pin);
  53. }
  54. }
  55. inline void mp_flipper_gpio_set_pin(uint8_t raw_pin, bool state) {
  56. const GpioPin* pin = decode_pin(raw_pin);
  57. furi_hal_gpio_write(pin, state);
  58. }
  59. inline bool mp_flipper_gpio_get_pin(uint8_t raw_pin) {
  60. const GpioPin* pin = decode_pin(raw_pin);
  61. return furi_hal_gpio_read(pin);
  62. }