blob: 09d78c3dc6be7c705b0dae53540ccc2ccff4a35c [file] [log] [blame]
/*
* Copyright (c) 2022 Google LLC
*
* SPDX-License-Identifier: Apache-2.0
*/
#include "zephyr/sys/util.h"
#include <zephyr/device.h>
#include <zephyr/drivers/gpio/gpio_emul.h>
#include <zephyr/kernel.h>
#include <zephyr/ztest.h>
#include <zephyr/input/input.h>
static const struct device *const test_gpio_keys_dev = DEVICE_DT_GET(DT_NODELABEL(buttons));
#define BUTTON_0_IDX DT_NODE_CHILD_IDX(DT_NODELABEL(voldown_button))
struct gpio_keys_pin_config {
/** GPIO specification from devicetree */
struct gpio_dt_spec spec;
/** Zephyr code from devicetree */
uint32_t zephyr_code;
};
struct gpio_keys_config {
/** Debounce interval in milliseconds from devicetree */
uint32_t debounce_interval_ms;
const int num_keys;
const struct gpio_keys_pin_config *pin_cfg;
};
/**
* @brief Test Suite: Verifies gpio_keys_config functionality.
*/
ZTEST_SUITE(gpio_keys, NULL, NULL, NULL, NULL, NULL);
static int event_count;
static uint16_t last_code;
static bool last_val;
static void test_gpio_keys_cb_handler(struct input_event *evt)
{
TC_PRINT("GPIO_KEY %s pressed, zephyr_code=%u, value=%d\n",
evt->dev->name, evt->code, evt->value);
event_count++;
last_code = evt->code;
last_val = evt->value;
}
INPUT_LISTENER_CB_DEFINE(test_gpio_keys_dev, test_gpio_keys_cb_handler);
/**
* @brief TestPurpose: Verify gpio_keys_config pressed raw.
*
*/
ZTEST(gpio_keys, test_gpio_keys_pressed)
{
const struct gpio_keys_config *config = test_gpio_keys_dev->config;
const struct gpio_keys_pin_config *pin_cfg = &config->pin_cfg[BUTTON_0_IDX];
const struct gpio_dt_spec *spec = &pin_cfg->spec;
last_code = 0;
last_val = false;
zassert_ok(gpio_emul_input_set(spec->port, spec->pin, 0));
/* Check interrupt doesn't prematurely fires */
k_sleep(K_MSEC(config->debounce_interval_ms / 2));
zassert_equal(event_count, 0);
/* Check interrupt fires after debounce interval */
k_sleep(K_MSEC(config->debounce_interval_ms));
zassert_equal(event_count, 1);
zassert_equal(last_code, pin_cfg->zephyr_code);
zassert_equal(last_val, true);
zassert_ok(gpio_emul_input_set(spec->port, spec->pin, 1));
/* Check interrupt doesn't prematurely fires */
k_sleep(K_MSEC(config->debounce_interval_ms / 2));
zassert_equal(event_count, 1);
/* Check interrupt fires after debounce interval */
k_sleep(K_MSEC(config->debounce_interval_ms));
zassert_equal(event_count, 2);
zassert_equal(last_code, pin_cfg->zephyr_code);
zassert_equal(last_val, false);
}