tests/drivers/gpio: replace legacy API in callback tests
Switch to gpio_pin_interrupt_configure() and the new interrupt flags. Use logical level pin set operations. Test all standard interrupt configurations including double edge. Signed-off-by: Peter Bigot <peter.bigot@nordicsemi.no>
This commit is contained in:
parent
8f4369bfd9
commit
e26f741132
3 changed files with 71 additions and 56 deletions
|
@ -45,9 +45,6 @@ void test_main(void)
|
|||
ztest_unit_test(test_gpio_callback_add_remove),
|
||||
ztest_unit_test(test_gpio_callback_self_remove),
|
||||
ztest_unit_test(test_gpio_callback_enable_disable),
|
||||
ztest_unit_test(test_gpio_callback_edge_high),
|
||||
ztest_unit_test(test_gpio_callback_edge_low),
|
||||
ztest_unit_test(test_gpio_callback_level_high),
|
||||
ztest_unit_test(test_gpio_callback_level_low));
|
||||
ztest_unit_test(test_gpio_callback_variants));
|
||||
ztest_run_test_suite(gpio_basic_test);
|
||||
}
|
||||
|
|
|
@ -31,15 +31,20 @@ static int pin_num(u32_t pins)
|
|||
static void callback(struct device *dev,
|
||||
struct gpio_callback *gpio_cb, u32_t pins)
|
||||
{
|
||||
const struct drv_data *dd = CONTAINER_OF(gpio_cb,
|
||||
struct drv_data, gpio_cb);
|
||||
|
||||
/*= checkpoint: pins should be marked with correct pin number bit =*/
|
||||
zassert_true(pin_num(pins) == PIN_IN, NULL);
|
||||
TC_PRINT("callback triggered: %d\n", ++cb_cnt);
|
||||
++cb_cnt;
|
||||
TC_PRINT("callback triggered: %d\n", cb_cnt);
|
||||
if ((cb_cnt == 1)
|
||||
&& (dd->mode == GPIO_INT_EDGE_BOTH)) {
|
||||
gpio_pin_toggle(dev, PIN_OUT);
|
||||
}
|
||||
if (cb_cnt >= MAX_INT_CNT) {
|
||||
struct drv_data *drv_data = CONTAINER_OF(gpio_cb,
|
||||
struct drv_data, gpio_cb);
|
||||
gpio_pin_write(dev, PIN_OUT,
|
||||
(drv_data->mode & GPIO_INT_ACTIVE_HIGH) ? 0 : 1);
|
||||
gpio_pin_configure(dev, PIN_IN, GPIO_DIR_IN);
|
||||
gpio_pin_set(dev, PIN_OUT, 0);
|
||||
gpio_pin_interrupt_configure(dev, PIN_IN, GPIO_INT_DISABLE);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -48,43 +53,65 @@ static int test_callback(int mode)
|
|||
struct device *dev = device_get_binding(DEV_NAME);
|
||||
struct drv_data *drv_data = &data;
|
||||
|
||||
gpio_pin_disable_callback(dev, PIN_IN);
|
||||
gpio_pin_disable_callback(dev, PIN_OUT);
|
||||
gpio_pin_interrupt_configure(dev, PIN_IN, GPIO_INT_DISABLE);
|
||||
gpio_pin_interrupt_configure(dev, PIN_OUT, GPIO_INT_DISABLE);
|
||||
|
||||
/* 1. set PIN_OUT to initial state */
|
||||
if (gpio_pin_configure(dev, PIN_OUT, GPIO_DIR_OUT) != 0) {
|
||||
TC_ERROR("PIN_OUT config fail\n");
|
||||
return TC_FAIL;
|
||||
/* 1. set PIN_OUT to logical initial state inactive */
|
||||
u32_t out_flags = GPIO_OUTPUT_LOW;
|
||||
|
||||
if ((mode & GPIO_INT_LOW_0) != 0) {
|
||||
out_flags = GPIO_OUTPUT_HIGH | GPIO_ACTIVE_LOW;
|
||||
}
|
||||
if (gpio_pin_write(dev, PIN_OUT,
|
||||
(mode & GPIO_INT_ACTIVE_HIGH) ? 0 : 1) != 0) {
|
||||
TC_ERROR("set PIN_OUT init voltage fail\n");
|
||||
|
||||
int rc = gpio_pin_configure(dev, PIN_OUT, out_flags);
|
||||
|
||||
if (rc != 0) {
|
||||
TC_ERROR("PIN_OUT config fail: %d", rc);
|
||||
return TC_FAIL;
|
||||
}
|
||||
|
||||
/* 2. configure PIN_IN callback and trigger condition */
|
||||
if (gpio_pin_configure(dev, PIN_IN,
|
||||
GPIO_DIR_IN | GPIO_INT | mode | GPIO_INT_DEBOUNCE) != 0) {
|
||||
TC_ERROR("config PIN_IN fail");
|
||||
rc = gpio_pin_configure(dev, PIN_IN, GPIO_INPUT);
|
||||
if (rc != 0) {
|
||||
TC_ERROR("config PIN_IN fail: %d\n", rc);
|
||||
goto err_exit;
|
||||
}
|
||||
|
||||
drv_data->mode = mode;
|
||||
gpio_init_callback(&drv_data->gpio_cb, callback, BIT(PIN_IN));
|
||||
if (gpio_add_callback(dev, &drv_data->gpio_cb) != 0) {
|
||||
TC_ERROR("set PIN_IN callback fail\n");
|
||||
rc = gpio_add_callback(dev, &drv_data->gpio_cb);
|
||||
if (rc == -ENOTSUP) {
|
||||
TC_PRINT("interrupts not supported\n");
|
||||
return TC_PASS;
|
||||
} else if (rc != 0) {
|
||||
TC_ERROR("set PIN_IN callback fail: %d\n", rc);
|
||||
return TC_FAIL;
|
||||
}
|
||||
|
||||
/* 3. enable callback, trigger PIN_IN interrupt by operate PIN_OUT */
|
||||
cb_cnt = 0;
|
||||
gpio_pin_enable_callback(dev, PIN_IN);
|
||||
rc = gpio_pin_interrupt_configure(dev, PIN_IN, mode | GPIO_INT_DEBOUNCE);
|
||||
if (rc == -ENOTSUP) {
|
||||
TC_PRINT("Mode %x not supported\n", mode);
|
||||
goto pass_exit;
|
||||
} else if (rc != 0) {
|
||||
TC_ERROR("config PIN_IN interrupt fail: %d\n", rc);
|
||||
goto err_exit;
|
||||
}
|
||||
k_sleep(K_MSEC(100));
|
||||
gpio_pin_write(dev, PIN_OUT, (mode & GPIO_INT_ACTIVE_HIGH) ? 1 : 0);
|
||||
gpio_pin_set(dev, PIN_OUT, 1);
|
||||
k_sleep(K_MSEC(1000));
|
||||
(void)gpio_pin_interrupt_configure(dev, PIN_IN, GPIO_INT_DISABLE);
|
||||
|
||||
/*= checkpoint: check callback is triggered =*/
|
||||
TC_PRINT("check enabled callback\n");
|
||||
TC_PRINT("OUT init %x, IN cfg %x, cnt %d\n", out_flags, mode, cb_cnt);
|
||||
if (mode == GPIO_INT_EDGE_BOTH) {
|
||||
if (cb_cnt != 2) {
|
||||
TC_ERROR("double edge not detected\n");
|
||||
goto err_exit;
|
||||
}
|
||||
goto pass_exit;
|
||||
}
|
||||
if ((mode & GPIO_INT_EDGE) == GPIO_INT_EDGE) {
|
||||
if (cb_cnt != 1) {
|
||||
TC_ERROR("not trigger callback correctly\n");
|
||||
|
@ -110,30 +137,24 @@ err_exit:
|
|||
}
|
||||
|
||||
/* export test cases */
|
||||
void test_gpio_callback_edge_high(void)
|
||||
void test_gpio_callback_variants(void)
|
||||
{
|
||||
zassert_true(
|
||||
test_callback(GPIO_INT_EDGE | GPIO_INT_ACTIVE_HIGH) == TC_PASS,
|
||||
NULL);
|
||||
}
|
||||
|
||||
void test_gpio_callback_edge_low(void)
|
||||
{
|
||||
zassert_true(
|
||||
test_callback(GPIO_INT_EDGE | GPIO_INT_ACTIVE_LOW) == TC_PASS,
|
||||
NULL);
|
||||
}
|
||||
|
||||
void test_gpio_callback_level_high(void)
|
||||
{
|
||||
zassert_true(
|
||||
test_callback(GPIO_INT_LEVEL | GPIO_INT_ACTIVE_HIGH) == TC_PASS,
|
||||
NULL);
|
||||
}
|
||||
|
||||
void test_gpio_callback_level_low(void)
|
||||
{
|
||||
zassert_true(
|
||||
test_callback(GPIO_INT_LEVEL | GPIO_INT_ACTIVE_LOW) == TC_PASS,
|
||||
NULL);
|
||||
zassert_equal(test_callback(GPIO_INT_EDGE_FALLING), TC_PASS,
|
||||
"falling edge failed");
|
||||
zassert_equal(test_callback(GPIO_INT_EDGE_RISING), TC_PASS,
|
||||
"rising edge failed");
|
||||
zassert_equal(test_callback(GPIO_INT_EDGE_TO_ACTIVE), TC_PASS,
|
||||
"edge active failed");
|
||||
zassert_equal(test_callback(GPIO_INT_EDGE_TO_INACTIVE), TC_PASS,
|
||||
"edge inactive failed");
|
||||
zassert_equal(test_callback(GPIO_INT_LEVEL_HIGH), TC_PASS,
|
||||
"level high failed");
|
||||
zassert_equal(test_callback(GPIO_INT_LEVEL_LOW), TC_PASS,
|
||||
"level low failed");
|
||||
zassert_equal(test_callback(GPIO_INT_LEVEL_ACTIVE), TC_PASS,
|
||||
"level active failed");
|
||||
zassert_equal(test_callback(GPIO_INT_LEVEL_INACTIVE), TC_PASS,
|
||||
"level inactive failed");
|
||||
zassert_equal(test_callback(GPIO_INT_EDGE_BOTH), TC_PASS,
|
||||
"edge both failed");
|
||||
}
|
||||
|
|
|
@ -50,13 +50,10 @@ struct drv_data {
|
|||
};
|
||||
|
||||
void test_gpio_pin_read_write(void);
|
||||
void test_gpio_callback_edge_high(void);
|
||||
void test_gpio_callback_edge_low(void);
|
||||
void test_gpio_callback_level_high(void);
|
||||
void test_gpio_callback_level_low(void);
|
||||
void test_gpio_callback_add_remove(void);
|
||||
void test_gpio_callback_self_remove(void);
|
||||
void test_gpio_callback_enable_disable(void);
|
||||
void test_gpio_callback_variants(void);
|
||||
|
||||
void test_gpio_port(void);
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue