From 1d417fc6a316e71eb349b0c73bd4076e414e5e82 Mon Sep 17 00:00:00 2001 From: perigoso Date: Thu, 6 May 2021 22:40:03 +0100 Subject: [PATCH] efm32: driver: implement direct gpio key driver Signed-off-by: perigoso --- config/families/efm32gg12b.toml | 1 + src/platform/efm32gg/driver/key_direct.c | 31 ++++++++++++++++++++++++ src/platform/efm32gg/driver/key_direct.h | 22 +++++++++++++++++ 3 files changed, 54 insertions(+) create mode 100644 src/platform/efm32gg/driver/key_direct.c create mode 100644 src/platform/efm32gg/driver/key_direct.h diff --git a/config/families/efm32gg12b.toml b/config/families/efm32gg12b.toml index e1e85d6c..d3068356 100644 --- a/config/families/efm32gg12b.toml +++ b/config/families/efm32gg12b.toml @@ -37,6 +37,7 @@ source = [ 'usb.c', 'usb_descriptors.c', 'hal/hid.c', + 'driver/key_direct.c', ] [dependencies] diff --git a/src/platform/efm32gg/driver/key_direct.c b/src/platform/efm32gg/driver/key_direct.c new file mode 100644 index 00000000..64bf59e8 --- /dev/null +++ b/src/platform/efm32gg/driver/key_direct.c @@ -0,0 +1,31 @@ +/* + * SPDX-License-Identifier: MIT + * SPDX-FileCopyrightText: 2021 Rafael Silva + */ + +#include "platform/efm32gg/driver/key_direct.h" +#include "platform/efm32gg/systick.h" + +struct key_direct_t key_direct_init(struct gpio_pin_t pin, u8 active_low) +{ + struct key_direct_t key; + + key.pin = pin; + key.active_low = active_low; + key.key.key_status = key_released; + key.change_timestamp = systick_get_ticks(); + + return key; +} + +void key_direct_update(struct key_direct_t *key) +{ + enum key_status_t last_status = key->key.key_status; + + key->key.key_status = (gpio_get(key->pin) ^ key->active_low) ? key_pressed : key_released; + + if (key->key.key_status != last_status) + key->change_timestamp = systick_get_ticks(); + + key->key.key_t_delta = systick_get_ticks() - key->change_timestamp; +} diff --git a/src/platform/efm32gg/driver/key_direct.h b/src/platform/efm32gg/driver/key_direct.h new file mode 100644 index 00000000..a0caf9df --- /dev/null +++ b/src/platform/efm32gg/driver/key_direct.h @@ -0,0 +1,22 @@ +/* + * SPDX-License-Identifier: MIT + * SPDX-FileCopyrightText: 2021 Rafael Silva + */ + +#pragma once + +#include "util/types.h" + +#include "platform/efm32gg/gpio.h" + +#include "key_actions/key_actions.h" + +struct key_direct_t { + struct gpio_pin_t pin; + u32 change_timestamp; + u8 active_low : 1; + struct key_t key; +}; + +struct key_direct_t key_direct_init(struct gpio_pin_t pin, u8 active_low); +void key_direct_update(struct key_direct_t *key);