mp_flipper_modflipperzero_gpio.c 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. #include <furi_hal.h>
  2. #include <mp_flipper_modflipperzero.h>
  3. #include <mp_flipper_runtime.h>
  4. #include "mp_flipper_context.h"
  5. static const GpioPin* decode_pin(uint8_t pin) {
  6. switch(pin) {
  7. case MP_FLIPPER_GPIO_PIN_PC0:
  8. return &gpio_ext_pc0;
  9. case MP_FLIPPER_GPIO_PIN_PC1:
  10. return &gpio_ext_pc1;
  11. case MP_FLIPPER_GPIO_PIN_PC3:
  12. return &gpio_ext_pc3;
  13. case MP_FLIPPER_GPIO_PIN_PB2:
  14. return &gpio_ext_pb2;
  15. case MP_FLIPPER_GPIO_PIN_PB3:
  16. return &gpio_ext_pb3;
  17. case MP_FLIPPER_GPIO_PIN_PA4:
  18. return &gpio_ext_pa4;
  19. case MP_FLIPPER_GPIO_PIN_PA6:
  20. return &gpio_ext_pa6;
  21. case MP_FLIPPER_GPIO_PIN_PA7:
  22. return &gpio_ext_pa7;
  23. default:
  24. furi_crash("unknown GPIO pin");
  25. }
  26. }
  27. static inline const GpioMode decode_mode(uint8_t mode) {
  28. switch(mode) {
  29. case MP_FLIPPER_GPIO_MODE_INPUT:
  30. return GpioModeInput;
  31. case MP_FLIPPER_GPIO_MODE_OUTPUT_PUSH_PULL:
  32. return GpioModeOutputPushPull;
  33. case MP_FLIPPER_GPIO_MODE_OUTPUT_OPEN_DRAIN:
  34. return GpioModeOutputOpenDrain;
  35. case MP_FLIPPER_GPIO_MODE_ANALOG:
  36. return GpioModeAnalog;
  37. case MP_FLIPPER_GPIO_MODE_INTERRUPT_FALL:
  38. return GpioModeInterruptFall;
  39. case MP_FLIPPER_GPIO_MODE_INTERRUPT_RISE:
  40. return GpioModeInterruptRise;
  41. }
  42. if((mode & MP_FLIPPER_GPIO_MODE_INTERRUPT_FALL) &&
  43. (mode & MP_FLIPPER_GPIO_MODE_INTERRUPT_RISE)) {
  44. return GpioModeInterruptRiseFall;
  45. }
  46. furi_crash("unknown GPIO mode");
  47. }
  48. static inline const GpioPull decode_pull(uint8_t pull) {
  49. switch(pull) {
  50. case MP_FLIPPER_GPIO_PULL_NO:
  51. return GpioPullNo;
  52. case MP_FLIPPER_GPIO_PULL_UP:
  53. return GpioPullUp;
  54. case MP_FLIPPER_GPIO_PULL_DOWN:
  55. return GpioPullDown;
  56. default:
  57. furi_crash("unknown GPIO pull");
  58. }
  59. }
  60. static inline const GpioSpeed decode_speed(uint8_t speed) {
  61. switch(speed) {
  62. case MP_FLIPPER_GPIO_SPEED_LOW:
  63. return GpioSpeedLow;
  64. case MP_FLIPPER_GPIO_SPEED_MEDIUM:
  65. return GpioSpeedMedium;
  66. case MP_FLIPPER_GPIO_SPEED_HIGH:
  67. return GpioSpeedHigh;
  68. case MP_FLIPPER_GPIO_SPEED_VERY_HIGH:
  69. return GpioSpeedVeryHigh;
  70. default:
  71. furi_crash("unknown GPIO speed");
  72. }
  73. }
  74. inline void mp_flipper_gpio_init_pin(
  75. uint8_t raw_pin,
  76. uint8_t raw_mode,
  77. uint8_t raw_pull,
  78. uint8_t raw_speed) {
  79. mp_flipper_context_t* ctx = mp_flipper_context;
  80. furi_check(raw_pin < MP_FLIPPER_GPIO_PINS);
  81. const GpioPin* pin = decode_pin(raw_pin);
  82. const GpioMode mode = decode_mode(raw_mode);
  83. const GpioPull pull = decode_pull(raw_pull);
  84. const GpioSpeed speed = decode_speed(raw_speed);
  85. furi_hal_gpio_init(pin, mode, pull, speed);
  86. if(raw_mode & (MP_FLIPPER_GPIO_MODE_INTERRUPT_FALL | MP_FLIPPER_GPIO_MODE_INTERRUPT_RISE)) {
  87. furi_hal_gpio_add_int_callback(pin, mp_flipper_on_gpio, (void*)raw_pin);
  88. furi_hal_gpio_enable_int_callback(pin);
  89. } else {
  90. furi_hal_gpio_disable_int_callback(pin);
  91. furi_hal_gpio_remove_int_callback(pin);
  92. }
  93. if(raw_mode == MP_FLIPPER_GPIO_MODE_ANALOG && ctx->adc_handle == NULL) {
  94. ctx->adc_handle = furi_hal_adc_acquire();
  95. furi_hal_adc_configure(ctx->adc_handle);
  96. }
  97. ctx->gpio_pins_used[raw_pin] = true;
  98. }
  99. inline void mp_flipper_gpio_deinit_pin(uint8_t raw_pin) {
  100. mp_flipper_context_t* ctx = mp_flipper_context;
  101. furi_check(raw_pin < MP_FLIPPER_GPIO_PINS);
  102. if(ctx->gpio_pins_used[raw_pin]) {
  103. const GpioPin* pin = decode_pin(raw_pin);
  104. furi_hal_gpio_disable_int_callback(pin);
  105. furi_hal_gpio_remove_int_callback(pin);
  106. furi_hal_gpio_init_simple(pin, GpioModeAnalog);
  107. ctx->gpio_pins_used[raw_pin] = false;
  108. }
  109. }
  110. inline void mp_flipper_gpio_set_pin(uint8_t raw_pin, bool state) {
  111. const GpioPin* pin = decode_pin(raw_pin);
  112. furi_hal_gpio_write(pin, state);
  113. }
  114. inline bool mp_flipper_gpio_get_pin(uint8_t raw_pin) {
  115. const GpioPin* pin = decode_pin(raw_pin);
  116. return furi_hal_gpio_read(pin);
  117. }