From mboxrd@z Thu Jan 1 00:00:00 1970 From: Philippe Gerum Subject: [PATCH 03/12] testsuite/gpiotest: enable timestamping on 'timestamp' argument Date: Thu, 24 Jan 2019 16:34:19 +0100 Message-Id: <20190124153428.21006-4-rpm@xenomai.org> In-Reply-To: <20190124153428.21006-1-rpm@xenomai.org> References: <20190124153428.21006-1-rpm@xenomai.org> List-Id: Discussions about the Xenomai project List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: xenomai@xenomai.org Cc: Jan Kiszka , Philippe Gerum Signed-off-by: Philippe Gerum --- testsuite/gpiotest/gpiotest.c | 37 +++++++++++++++++++++++++++-------- 1 file changed, 29 insertions(+), 8 deletions(-) diff --git a/testsuite/gpiotest/gpiotest.c b/testsuite/gpiotest/gpiotest.c index 3c8c6c318..7347ac506 100644 --- a/testsuite/gpiotest/gpiotest.c +++ b/testsuite/gpiotest/gpiotest.c @@ -28,6 +28,7 @@ #include #include #include +#include smokey_test_plugin(interrupt, SMOKEY_ARGLIST( @@ -39,6 +40,7 @@ smokey_test_plugin(interrupt, "\tdevice=\n" "\trigger={edge[-rising/falling/both], level[-low/high]}\n" "\tselect, wait on select(2)." + "\ttimestamp, enable timestamping." ); smokey_test_plugin(read_value, @@ -72,8 +74,10 @@ static int run_interrupt(struct smokey_test *t, int argc, char *const argv[]) { .name = "level-high", .flag = GPIO_TRIGGER_LEVEL_HIGH }, { NULL, 0 }, }; - int do_select = 0, fd, ret, trigger, n, value; + int do_select = 0, fd, ret, trigger, n, value, do_timestamp = 0; const char *device = NULL, *trigname; + struct rtdm_gpio_readout rdo; + struct timespec now; fd_set set; smokey_parse_args(t, argc, argv); @@ -95,6 +99,9 @@ static int run_interrupt(struct smokey_test *t, int argc, char *const argv[]) if (SMOKEY_ARG_ISSET(interrupt, select)) do_select = SMOKEY_ARG_BOOL(interrupt, select); + if (SMOKEY_ARG_ISSET(interrupt, timestamp)) + do_timestamp = SMOKEY_ARG_BOOL(interrupt, timestamp); + trigger = GPIO_TRIGGER_NONE; if (SMOKEY_ARG_ISSET(interrupt, trigger)) { trigname = SMOKEY_ARG_STRING(interrupt, trigger); @@ -131,14 +138,28 @@ static int run_interrupt(struct smokey_test *t, int argc, char *const argv[]) return ret; } } - ret = read(fd, &value, sizeof(value)); - if (ret < 0) { - ret = -errno; - warning("failed reading from %s [%s]", - device, symerror(ret)); - return ret; + if (do_timestamp) { + ret = read(fd, &rdo, sizeof(rdo)); + if (ret < 0) { + ret = -errno; + warning("failed reading from %s [%s]", + device, symerror(ret)); + return ret; + } + clock_gettime(CLOCK_MONOTONIC, &now); + printf("received irq %llu us from now, GPIO state=%d\n", + (timespec_scalar(&now) - rdo.timestamp) / 1000ULL, + rdo.value); + } else { + ret = read(fd, &value, sizeof(value)); + if (ret < 0) { + ret = -errno; + warning("failed reading from %s [%s]", + device, symerror(ret)); + return ret; + } + printf("received irq, GPIO state=%d\n", value); } - printf("received irq, GPIO state=%d\n", value); } close(fd); -- 2.17.2