Loading...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 | /* * Copyright (c) 2016 Intel Corporation * * SPDX-License-Identifier: Apache-2.0 */ /** * @addtogroup t_gpio_basic_api * @{ * @defgroup t_gpio_callback_manage test_gpio_callback_manage * @brief TestPurpose: verify zephyr gpio callback add/remvoe and enable/disable * @} */ #include "test_gpio.h" static struct drv_data cb_data[2]; static int cb_cnt[2]; static void callback_1(struct device *dev, struct gpio_callback *gpio_cb, uint32_t pins) { TC_PRINT("%s triggered: %d\n", __func__, ++cb_cnt[0]); } static void callback_2(struct device *dev, struct gpio_callback *gpio_cb, uint32_t pins) { TC_PRINT("%s triggered: %d\n", __func__, ++cb_cnt[1]); } static void init_callback(struct device *dev) { gpio_pin_disable_callback(dev, PIN_IN); gpio_pin_disable_callback(dev, PIN_OUT); /* 1. set PIN_OUT */ gpio_pin_configure(dev, PIN_OUT, GPIO_DIR_OUT); gpio_pin_write(dev, PIN_OUT, 0); /* 2. configure PIN_IN callback and trigger condition */ gpio_pin_configure(dev, PIN_IN, GPIO_DIR_IN | GPIO_INT | GPIO_INT_EDGE | \ GPIO_INT_ACTIVE_HIGH | GPIO_INT_DEBOUNCE); gpio_init_callback(&cb_data[0].gpio_cb, callback_1, BIT(PIN_IN)); gpio_add_callback(dev, &cb_data[0].gpio_cb); gpio_init_callback(&cb_data[1].gpio_cb, callback_2, BIT(PIN_IN)); gpio_add_callback(dev, &cb_data[1].gpio_cb); } static void trigger_callback(struct device *dev, int enable_cb) { gpio_pin_write(dev, PIN_OUT, 0); k_sleep(100); cb_cnt[0] = 0; cb_cnt[1] = 0; if (enable_cb == 1) { gpio_pin_enable_callback(dev, PIN_IN); } else { gpio_pin_disable_callback(dev, PIN_IN); } k_sleep(100); gpio_pin_write(dev, PIN_OUT, 1); k_sleep(1000); } static int test_callback_add_remove(void) { struct device *dev = device_get_binding(DEV_NAME); /* SetUp: initialize environment */ init_callback(dev); /* 3. enable callback, trigger PIN_IN interrupt by operate PIN_OUT */ trigger_callback(dev, 1); /*= checkpoint: check callback is triggered =*/ if (cb_cnt[0] != 1 || cb_cnt[1] != 1) { TC_ERROR("not trigger callback correctly\n"); goto err_exit; } /* 4. remove callback_1 */ gpio_remove_callback(dev, &cb_data[0].gpio_cb); trigger_callback(dev, 1); /*= checkpoint: check callback is triggered =*/ if (cb_cnt[0] != 0 || cb_cnt[1] != 1) { TC_ERROR("not trigger callback correctly\n"); goto err_exit; } /* 5. remove callback_2 */ gpio_remove_callback(dev, &cb_data[1].gpio_cb); trigger_callback(dev, 1); /*= checkpoint: check callback is triggered =*/ if (cb_cnt[0] != 0 || cb_cnt[1] != 0) { TC_ERROR("not trigger callback correctly\n"); goto err_exit; } return TC_PASS; err_exit: gpio_remove_callback(dev, &cb_data[0].gpio_cb); gpio_remove_callback(dev, &cb_data[1].gpio_cb); return TC_FAIL; } static int test_callback_enable_disable(void) { struct device *dev = device_get_binding(DEV_NAME); /* SetUp: initialize environment */ init_callback(dev); /* 3. enable callback, trigger PIN_IN interrupt by operate PIN_OUT */ trigger_callback(dev, 1); /*= checkpoint: check callback is triggered =*/ if (cb_cnt[0] != 1 || cb_cnt[1] != 1) { TC_ERROR("not trigger callback correctly\n"); goto err_exit; } /* 4. disable callback */ trigger_callback(dev, 0); /*= checkpoint: check callback is triggered =*/ if (cb_cnt[0] != 0 || cb_cnt[1] != 0) { TC_ERROR("not trigger callback correctly\n"); goto err_exit; } /* 5. enable callback again */ trigger_callback(dev, 1); /*= checkpoint: check callback is triggered =*/ if (cb_cnt[0] != 1 || cb_cnt[1] != 1) { TC_ERROR("not trigger callback correctly\n"); goto err_exit; } gpio_remove_callback(dev, &cb_data[0].gpio_cb); gpio_remove_callback(dev, &cb_data[1].gpio_cb); return TC_PASS; err_exit: gpio_remove_callback(dev, &cb_data[0].gpio_cb); gpio_remove_callback(dev, &cb_data[1].gpio_cb); return TC_FAIL; } void test_gpio_callback_add_remove(void) { assert_true( test_callback_add_remove() == TC_PASS, NULL); } void test_gpio_callback_enable_disable(void) { assert_true( test_callback_enable_disable() == TC_PASS, NULL); } |