mp_flipper_modflipperzero_gpio.c 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  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 inline 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) &&
  41. (mode & MP_FLIPPER_GPIO_MODE_INTERRUPT_RISE)) {
  42. return GpioModeInterruptRiseFall;
  43. }
  44. furi_crash("unknown GPIO mode");
  45. }
  46. static inline const GpioPull decode_pull(uint8_t pull) {
  47. switch(pull) {
  48. case MP_FLIPPER_GPIO_PULL_NO:
  49. return GpioPullNo;
  50. case MP_FLIPPER_GPIO_PULL_UP:
  51. return GpioPullUp;
  52. case MP_FLIPPER_GPIO_PULL_DOWN:
  53. return GpioPullDown;
  54. default:
  55. furi_crash("unknown GPIO pull");
  56. }
  57. }
  58. static inline const GpioSpeed decode_speed(uint8_t speed) {
  59. switch(speed) {
  60. case MP_FLIPPER_GPIO_SPEED_LOW:
  61. return GpioSpeedLow;
  62. case MP_FLIPPER_GPIO_SPEED_MEDIUM:
  63. return GpioSpeedMedium;
  64. case MP_FLIPPER_GPIO_SPEED_HIGH:
  65. return GpioSpeedHigh;
  66. case MP_FLIPPER_GPIO_SPEED_VERY_HIGH:
  67. return GpioSpeedVeryHigh;
  68. default:
  69. furi_crash("unknown GPIO speed");
  70. }
  71. }
  72. inline void mp_flipper_gpio_init_pin(
  73. uint8_t raw_pin,
  74. uint8_t raw_mode,
  75. uint8_t raw_pull,
  76. uint8_t raw_speed) {
  77. const GpioPin* pin = decode_pin(raw_pin);
  78. const GpioMode mode = decode_mode(raw_mode);
  79. const GpioPull pull = decode_pull(raw_pull);
  80. const GpioSpeed speed = decode_speed(raw_speed);
  81. furi_hal_gpio_init(pin, mode, pull, speed);
  82. if(raw_mode & (MP_FLIPPER_GPIO_MODE_INTERRUPT_FALL | MP_FLIPPER_GPIO_MODE_INTERRUPT_RISE)) {
  83. furi_hal_gpio_add_int_callback(pin, mp_flipper_on_gpio, (void*)raw_pin);
  84. furi_hal_gpio_enable_int_callback(pin);
  85. } else {
  86. furi_hal_gpio_disable_int_callback(pin);
  87. furi_hal_gpio_remove_int_callback(pin);
  88. }
  89. }
  90. inline void mp_flipper_gpio_set_pin(uint8_t raw_pin, bool state) {
  91. const GpioPin* pin = decode_pin(raw_pin);
  92. furi_hal_gpio_write(pin, state);
  93. }
  94. inline bool mp_flipper_gpio_get_pin(uint8_t raw_pin) {
  95. const GpioPin* pin = decode_pin(raw_pin);
  96. return furi_hal_gpio_read(pin);
  97. }