Loading...
Searching...
No Matches
matrix_keypad.h
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2021 Koen Zandberg
3 * SPDX-License-Identifier: LGPL-2.1-only
4 */
5
6#pragma once
7
50
51#include <stdint.h>
52#include <stdbool.h>
53#include "periph/gpio.h"
54
55#ifdef __cplusplus
56extern "C" {
57#endif
58
62#ifndef CONFIG_MATRIX_KEYPAD_NUM_ROWS
63#define CONFIG_MATRIX_KEYPAD_NUM_ROWS 2
64#endif
65
69#ifndef CONFIG_MATRIX_KEYPAD_NUM_COLUMNS
70#define CONFIG_MATRIX_KEYPAD_NUM_COLUMNS 2
71#endif
72
80#ifndef CONFIG_MATRIX_KEYPAD_DEBOUNCE_PATTERN_BEGIN
81#define CONFIG_MATRIX_KEYPAD_DEBOUNCE_PATTERN_BEGIN 0xC0
82#endif
83
91#ifndef CONFIG_MATRIX_KEYPAD_DEBOUNCE_PATTERN_END
92#define CONFIG_MATRIX_KEYPAD_DEBOUNCE_PATTERN_END 0x7
93#endif
94
98#ifndef CONFIG_MATRIX_KEYPAD_ROWS_USE_OPEN_DRAIN
99#define CONFIG_MATRIX_KEYPAD_ROWS_USE_OPEN_DRAIN 0
100#endif
101
105#if CONFIG_MATRIX_KEYPAD_ROWS_USE_OPEN_DRAIN
106#define MATRIX_KEYPAD_ROWS_GPIO_MODE GPIO_OD_PU
107#else
108#define MATRIX_KEYPAD_ROWS_GPIO_MODE GPIO_OUT
109#endif
110
114#define MATRIX_KEYPAD_DEBOUNCE_MASK \
115 (CONFIG_MATRIX_KEYPAD_DEBOUNCE_PATTERN_BEGIN | CONFIG_MATRIX_KEYPAD_DEBOUNCE_PATTERN_END)
116
121#if CONFIG_MATRIX_KEYPAD_NUM_COLUMNS <= 8
123#elif CONFIG_MATRIX_KEYPAD_NUM_COLUMNS <= 16
124typedef uint16_t matrix_keypad_state_row_t;
125#elif CONFIG_MATRIX_KEYPAD_NUM_COLUMNS <= 32
126typedef uint32_t matrix_keypad_state_row_t;
127#elif CONFIG_MATRIX_KEYPAD_NUM_COLUMNS <= 64
128typedef uint64_t matrix_keypad_state_row_t;
129#else
130#error Too many columns on matrix keypad.
131#endif
132
153
162typedef void (*matrix_keypad_cb_t)(void *arg, size_t row, size_t column, bool state);
163
193
205 const matrix_keypad_params_t *params,
206 matrix_keypad_cb_t callback,
207 void *arg);
208
220#ifdef __cplusplus
221}
222#endif
223
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.
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.
Device initialization parameters.
gpio_t rows[CONFIG_MATRIX_KEYPAD_NUM_ROWS]
GPIO pin array for the rows.
gpio_t columns[CONFIG_MATRIX_KEYPAD_NUM_COLUMNS]
GPIO pin array for the columns.
uint32_t row2col_delay
Delay in microseconds between configuring the row gpio and reading out the column.
Device descriptor for the driver.
matrix_keypad_state_row_t state[CONFIG_MATRIX_KEYPAD_NUM_ROWS]
Current button state.
matrix_keypad_cb_t callback
Callback called when a key changes state.
uint8_t debounce[CONFIG_MATRIX_KEYPAD_NUM_ROWS][CONFIG_MATRIX_KEYPAD_NUM_COLUMNS]
Debounce history.
void * arg
callback context
const matrix_keypad_params_t * params
Device initialization parameters.