matrix_keypad.h
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2021 Koen Zandberg
3  *
4  * This file is subject to the terms and conditions of the GNU Lesser
5  * General Public License v2.1. See the file LICENSE in the top level
6  * directory for more details.
7  */
8 
9 #pragma once
10 
54 #include <stdint.h>
55 #include <stdbool.h>
56 #include "periph/gpio.h"
57 
58 #ifdef __cplusplus
59 extern "C" {
60 #endif
61 
65 #ifndef CONFIG_MATRIX_KEYPAD_NUM_ROWS
66 #define CONFIG_MATRIX_KEYPAD_NUM_ROWS 2
67 #endif
68 
72 #ifndef CONFIG_MATRIX_KEYPAD_NUM_COLUMNS
73 #define CONFIG_MATRIX_KEYPAD_NUM_COLUMNS 2
74 #endif
75 
83 #ifndef CONFIG_MATRIX_KEYPAD_DEBOUNCE_PATTERN_BEGIN
84 #define CONFIG_MATRIX_KEYPAD_DEBOUNCE_PATTERN_BEGIN 0xC0
85 #endif
86 
94 #ifndef CONFIG_MATRIX_KEYPAD_DEBOUNCE_PATTERN_END
95 #define CONFIG_MATRIX_KEYPAD_DEBOUNCE_PATTERN_END 0x7
96 #endif
97 
101 #ifndef CONFIG_MATRIX_KEYPAD_ROWS_USE_OPEN_DRAIN
102 #define CONFIG_MATRIX_KEYPAD_ROWS_USE_OPEN_DRAIN 0
103 #endif
104 
108 #if CONFIG_MATRIX_KEYPAD_ROWS_USE_OPEN_DRAIN
109 #define MATRIX_KEYPAD_ROWS_GPIO_MODE GPIO_OD_PU
110 #else
111 #define MATRIX_KEYPAD_ROWS_GPIO_MODE GPIO_OUT
112 #endif
113 
117 #define MATRIX_KEYPAD_DEBOUNCE_MASK \
118  (CONFIG_MATRIX_KEYPAD_DEBOUNCE_PATTERN_BEGIN | CONFIG_MATRIX_KEYPAD_DEBOUNCE_PATTERN_END)
119 
124 #if CONFIG_MATRIX_KEYPAD_NUM_COLUMNS <= 8
126 #elif CONFIG_MATRIX_KEYPAD_NUM_COLUMNS <= 16
127 typedef uint16_t matrix_keypad_state_row_t;
128 #elif CONFIG_MATRIX_KEYPAD_NUM_COLUMNS <= 32
129 typedef uint32_t matrix_keypad_state_row_t;
130 #elif CONFIG_MATRIX_KEYPAD_NUM_COLUMNS <= 64
131 typedef uint64_t matrix_keypad_state_row_t;
132 #else
133 #error Too many columns on matrix keypad.
134 #endif
135 
139 typedef struct {
154  uint32_t row2col_delay;
156 
165 typedef void (*matrix_keypad_cb_t)(void *arg, size_t row, size_t column, bool state);
166 
170 typedef struct {
175 
180 
185 
189  void *arg;
190 
196 
208  const matrix_keypad_params_t *params,
209  matrix_keypad_cb_t callback,
210  void *arg);
211 
223 #ifdef __cplusplus
224 }
225 #endif
226 
Low-level GPIO peripheral driver interface definitions.
void(* matrix_keypad_cb_t)(void *arg, size_t row, size_t column, bool state)
Callback for key state changes.
uint8_t matrix_keypad_state_row_t
Type definition for a full row (all columns) state, variable width depending on the number of columns...
#define CONFIG_MATRIX_KEYPAD_NUM_ROWS
Maximum number of rows.
Definition: matrix_keypad.h:66
size_t matrix_keypad_scan(matrix_keypad_t *dev)
Scan through the keypad matrix.
int matrix_keypad_init(matrix_keypad_t *dev, const matrix_keypad_params_t *params, matrix_keypad_cb_t callback, void *arg)
Initialize the given device.
#define CONFIG_MATRIX_KEYPAD_NUM_COLUMNS
Maximum number of columns.
Definition: matrix_keypad.h:73
Device initialization parameters.
uint32_t row2col_delay
Delay in microseconds between configuring the row gpio and reading out the column.
Device descriptor for the driver.
matrix_keypad_cb_t callback
Callback called when a key changes state.
void * arg
callback context
const matrix_keypad_params_t * params
Device initialization parameters.