Skip to content

Commit

Permalink
efm32: driver: implement direct gpio key driver
Browse files Browse the repository at this point in the history
Signed-off-by: perigoso <perigoso@riseup.net>
  • Loading branch information
perigoso committed May 15, 2022
1 parent 62e4a45 commit 1d417fc
Show file tree
Hide file tree
Showing 3 changed files with 54 additions and 0 deletions.
1 change: 1 addition & 0 deletions config/families/efm32gg12b.toml
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ source = [
'usb.c',
'usb_descriptors.c',
'hal/hid.c',
'driver/key_direct.c',
]

[dependencies]
Expand Down
31 changes: 31 additions & 0 deletions src/platform/efm32gg/driver/key_direct.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
/*
* SPDX-License-Identifier: MIT
* SPDX-FileCopyrightText: 2021 Rafael Silva <perigoso@riseup.net>
*/

#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;
}
22 changes: 22 additions & 0 deletions src/platform/efm32gg/driver/key_direct.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
/*
* SPDX-License-Identifier: MIT
* SPDX-FileCopyrightText: 2021 Rafael Silva <perigoso@riseup.net>
*/

#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);

0 comments on commit 1d417fc

Please sign in to comment.