Skip to content

Commit 56a0e43

Browse files
committed
efm32: driver: implement matrix key driver
Signed-off-by: perigoso <perigoso@riseup.net>
1 parent 1d417fc commit 56a0e43

File tree

3 files changed

+93
-0
lines changed

3 files changed

+93
-0
lines changed

config/families/efm32gg12b.toml

+1
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ source = [
3838
'usb_descriptors.c',
3939
'hal/hid.c',
4040
'driver/key_direct.c',
41+
'driver/key_matrix.c',
4142
]
4243

4344
[dependencies]
+61
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
/*
2+
* SPDX-License-Identifier: MIT
3+
* SPDX-FileCopyrightText: 2021 Rafael Silva <perigoso@riseup.net>
4+
*/
5+
6+
#include "platform/efm32gg/driver/key_matrix.h"
7+
#include "platform/efm32gg/systick.h"
8+
9+
struct key_matrix_t key_matrix_init(
10+
struct gpio_pin_t *col_pin_list,
11+
u8 col_pin_list_size,
12+
struct gpio_pin_t *row_pin_list,
13+
u8 row_pin_list_size,
14+
struct key_t *key_data,
15+
u8 col_to_row)
16+
{
17+
struct key_matrix_t matrix = {};
18+
19+
matrix.col_pin_list = col_pin_list;
20+
matrix.col_pin_list_size = col_pin_list_size;
21+
matrix.row_pin_list = row_pin_list;
22+
matrix.row_pin_list_size = row_pin_list_size;
23+
matrix.key_data = key_data;
24+
matrix.col_to_row = col_to_row;
25+
matrix.update_timestamp = systick_get_ticks();
26+
27+
for (size_t col = 0; col < matrix.col_pin_list_size; col++) gpio_set(col_pin_list[col], !matrix.col_to_row);
28+
29+
return matrix;
30+
}
31+
32+
void key_matrix_scan(struct key_matrix_t *matrix)
33+
{
34+
u16 t_delta = systick_get_ticks() - matrix->update_timestamp;
35+
matrix->update_timestamp = systick_get_ticks();
36+
37+
for (size_t col = 0; col < matrix->col_pin_list_size; col++) {
38+
/* set col output */
39+
gpio_set(matrix->col_pin_list[col], matrix->col_to_row);
40+
41+
for (size_t row = 0; row < matrix->row_pin_list_size; row++) {
42+
u8 index = (col * matrix->row_pin_list_size) + row;
43+
enum key_status_t last_status = matrix->key_data[index].key_status;
44+
45+
/* get row input */
46+
matrix->key_data[index].key_status =
47+
(gpio_get(matrix->row_pin_list[row]) ^ matrix->col_to_row) ? key_released : key_pressed;
48+
49+
if (matrix->key_data[index].key_status != last_status)
50+
matrix->key_data[index].key_t_delta = 0;
51+
else
52+
matrix->key_data[index].key_t_delta += t_delta;
53+
}
54+
55+
/* clear col output */
56+
gpio_set(matrix->col_pin_list[col], !matrix->col_to_row);
57+
58+
/* settle time */
59+
delay_us(1);
60+
}
61+
}
+31
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
/*
2+
* SPDX-License-Identifier: MIT
3+
* SPDX-FileCopyrightText: 2021 Rafael Silva <perigoso@riseup.net>
4+
*/
5+
6+
#pragma once
7+
8+
#include "util/types.h"
9+
10+
#include "platform/efm32gg/gpio.h"
11+
12+
#include "key_actions/key_actions.h"
13+
14+
struct key_matrix_t {
15+
struct gpio_pin_t *col_pin_list;
16+
u8 col_pin_list_size;
17+
struct gpio_pin_t *row_pin_list;
18+
u8 row_pin_list_size;
19+
struct key_t *key_data;
20+
u32 update_timestamp;
21+
u8 col_to_row : 1;
22+
};
23+
24+
struct key_matrix_t key_matrix_init(
25+
struct gpio_pin_t *col_pin_list,
26+
u8 col_pin_list_size,
27+
struct gpio_pin_t *row_pin_list,
28+
u8 row_pin_list_size,
29+
struct key_t *key_data,
30+
u8 col_to_row);
31+
void key_matrix_scan(struct key_matrix_t *matrix);

0 commit comments

Comments
 (0)