Oliver Fabel 1 год назад
Родитель
Сommit
d86c8f9765
4 измененных файлов с 91 добавлено и 1 удалено
  1. 4 0
      CHANGELOG.md
  2. 12 0
      examples/flipperzero_gpio_test.py
  3. 1 1
      lib/micropython
  4. 74 0
      lib/micropython-port/mp_flipper_modflipperzero_gpio.c

+ 4 - 0
CHANGELOG.md

@@ -11,6 +11,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
 
 
 * Constants for all musical notes from C0 up to B8.
 * Constants for all musical notes from C0 up to B8.
 * Constants for minimum and maximum speaker volumes.
 * Constants for minimum and maximum speaker volumes.
+* Simple GPIO support for the `flipperzero` module:
+  * Initialize a pin.
+  * Read from a pin.
+  * Write to a pin.
 
 
 ### Fixed
 ### Fixed
 
 

+ 12 - 0
examples/flipperzero_gpio_test.py

@@ -0,0 +1,12 @@
+import flipperzero as f0
+import time
+
+f0.gpio_init_pin(f0.GPIO_PIN_PC3, f0.GPIO_MODE_OUTPUT_PUSH_PULL)
+
+f0.gpio_set_pin(f0.GPIO_PIN_PC3, True)
+time.sleep(1)
+f0.gpio_set_pin(f0.GPIO_PIN_PC3, False)
+time.sleep(1)
+f0.gpio_set_pin(f0.GPIO_PIN_PC3, True)
+time.sleep(1)
+f0.gpio_set_pin(f0.GPIO_PIN_PC3, False)

+ 1 - 1
lib/micropython

@@ -1 +1 @@
-Subproject commit 52168fc98fd2578b20fb9ed915ea0d3fa1948e20
+Subproject commit 561f03769c724277ab8d809a79522cbdababa526

+ 74 - 0
lib/micropython-port/mp_flipper_modflipperzero_gpio.c

@@ -0,0 +1,74 @@
+#include <furi_hal.h>
+
+#include <mp_flipper_modflipperzero.h>
+
+static const GpioPin* decode_pin(uint8_t pin) {
+    switch(pin) {
+    case MP_FLIPPER_GPIO_PIN_PC0:
+        return &gpio_ext_pc0;
+    case MP_FLIPPER_GPIO_PIN_PC1:
+        return &gpio_ext_pc1;
+    case MP_FLIPPER_GPIO_PIN_PC3:
+        return &gpio_ext_pc3;
+    case MP_FLIPPER_GPIO_PIN_PB2:
+        return &gpio_ext_pb2;
+    case MP_FLIPPER_GPIO_PIN_PB3:
+        return &gpio_ext_pb3;
+    case MP_FLIPPER_GPIO_PIN_PA4:
+        return &gpio_ext_pa4;
+    case MP_FLIPPER_GPIO_PIN_PA6:
+        return &gpio_ext_pa6;
+    case MP_FLIPPER_GPIO_PIN_PA7:
+        return &gpio_ext_pa7;
+    default:
+        furi_crash("unknown GPIO pin");
+    }
+}
+
+static const GpioMode decode_mode(uint8_t mode) {
+    switch(mode) {
+    case MP_FLIPPER_GPIO_MODE_INPUT:
+        return GpioModeInput;
+    case MP_FLIPPER_GPIO_MODE_OUTPUT_PUSH_PULL:
+        return GpioModeOutputPushPull;
+    case MP_FLIPPER_GPIO_MODE_OUTPUT_OPEN_DRAIN:
+        return GpioModeOutputOpenDrain;
+    case MP_FLIPPER_GPIO_MODE_ANALOG:
+        return GpioModeAnalog;
+    case MP_FLIPPER_GPIO_MODE_INTERRUPT_FALL:
+        return GpioModeInterruptFall;
+    case MP_FLIPPER_GPIO_MODE_INTERRUPT_RISE:
+        return GpioModeInterruptRise;
+    }
+
+    if(mode & MP_FLIPPER_GPIO_MODE_INTERRUPT_FALL & MP_FLIPPER_GPIO_MODE_INTERRUPT_RISE) {
+        return GpioModeInterruptRiseFall;
+    }
+
+    furi_crash("unknown GPIO mode");
+}
+
+inline void mp_flipper_gpio_init_pin(uint8_t raw_pin, uint8_t raw_mode) {
+    const GpioPin* pin = decode_pin(raw_pin);
+    const GpioMode mode = decode_mode(raw_mode);
+
+    furi_hal_gpio_init_simple(pin, mode);
+
+    if(raw_mode & (MP_FLIPPER_GPIO_MODE_INTERRUPT_FALL | MP_FLIPPER_GPIO_MODE_INTERRUPT_RISE)) {
+        furi_hal_gpio_enable_int_callback(pin);
+    } else {
+        furi_hal_gpio_disable_int_callback(pin);
+    }
+}
+
+inline void mp_flipper_gpio_set_pin(uint8_t raw_pin, bool state) {
+    const GpioPin* pin = decode_pin(raw_pin);
+
+    furi_hal_gpio_write(pin, state);
+}
+
+inline bool mp_flipper_gpio_get_pin(uint8_t raw_pin) {
+    const GpioPin* pin = decode_pin(raw_pin);
+
+    return furi_hal_gpio_read(pin);
+}