Skip to content

Commit 1328e32

Browse files
committed
gpio-async: convert to ywf
1 parent ac8604e commit 1328e32

File tree

3 files changed

+68
-52
lines changed

3 files changed

+68
-52
lines changed
Lines changed: 27 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -1,92 +1,67 @@
11
#include "gpio_async.h"
2+
#include "syscalls/gpio_async_syscalls.h"
23

3-
struct gpio_async_data {
4-
bool fired;
5-
bool value;
4+
static returncode_t gpio_async_command(uint32_t port, uint8_t pin, returncode_t (*command_fn)(uint32_t, uint8_t)) {
65
returncode_t ret;
7-
};
86

9-
static struct gpio_async_data result = { .fired = false };
7+
ret = command_fn(port, pin);
8+
if (ret != RETURNCODE_SUCCESS) return ret;
109

11-
static void gpio_async_callback_command(returncode_t ret, bool value) {
12-
result.fired = true;
13-
result.value = value;
14-
result.ret = ret;
15-
}
16-
17-
static returncode_t gpio_async_op(uint32_t port, uint8_t pin, returncode_t (*op)(uint32_t, uint8_t,
18-
libtock_gpio_async_callback_command)) {
19-
returncode_t err;
20-
result.fired = false;
21-
22-
err = op(port, pin, gpio_async_callback_command);
23-
if (err != RETURNCODE_SUCCESS) return err;
24-
25-
// Wait for the callback.
26-
yield_for(&result.fired);
27-
return result.ret;
10+
ret = libtocksync_gpio_async_yield_wait_for_generic_command();
11+
return ret;
2812
}
2913

3014
returncode_t libtocksync_gpio_async_make_output(uint32_t port, uint8_t pin) {
31-
return gpio_async_op(port, pin, libtock_gpio_async_make_output);
15+
return gpio_async_command(port, pin, libtock_gpio_async_command_make_output);
3216
}
3317

3418
returncode_t libtocksync_gpio_async_set(uint32_t port, uint8_t pin) {
35-
return gpio_async_op(port, pin, libtock_gpio_async_set);
19+
return gpio_async_command(port, pin, libtock_gpio_async_command_set);
3620
}
3721

3822
returncode_t libtocksync_gpio_async_clear(uint32_t port, uint8_t pin) {
39-
return gpio_async_op(port, pin, libtock_gpio_async_clear);
23+
return gpio_async_command(port, pin, libtock_gpio_async_command_clear);
4024
}
4125

4226
returncode_t libtocksync_gpio_async_toggle(uint32_t port, uint8_t pin) {
43-
return gpio_async_op(port, pin, libtock_gpio_async_toggle);
27+
return gpio_async_command(port, pin, libtock_gpio_async_command_toggle);
4428
}
4529

4630
returncode_t libtocksync_gpio_async_make_input(uint32_t port, uint8_t pin, libtock_gpio_input_mode_t pin_config) {
47-
returncode_t err;
48-
result.fired = false;
31+
returncode_t ret;
4932

50-
err = libtock_gpio_async_make_input(port, pin, pin_config, gpio_async_callback_command);
51-
if (err != RETURNCODE_SUCCESS) return err;
33+
ret = libtock_gpio_async_command_make_input(port, pin, pin_config);
34+
if (ret != RETURNCODE_SUCCESS) return ret;
5235

53-
// Wait for the callback.
54-
yield_for(&result.fired);
55-
return result.ret;
36+
ret = libtocksync_gpio_async_yield_wait_for_generic_command();
37+
return ret;
5638
}
5739

5840
returncode_t libtocksync_gpio_async_read(uint32_t port, uint8_t pin, bool* value) {
59-
returncode_t err;
60-
result.fired = false;
61-
62-
err = libtock_gpio_async_read(port, pin, gpio_async_callback_command);
63-
if (err != RETURNCODE_SUCCESS) return err;
41+
returncode_t ret;
6442

65-
// Wait for the callback.
66-
yield_for(&result.fired);
67-
if (result.ret != RETURNCODE_SUCCESS) return result.ret;
43+
ret = libtock_gpio_async_command_read(port, pin);
44+
if (ret != RETURNCODE_SUCCESS) return ret;
6845

69-
*value = result.value;
70-
return RETURNCODE_SUCCESS;
46+
ret = libtocksync_gpio_async_yield_wait_for_read(value);
47+
return ret;
7148
}
7249

7350
returncode_t libtocksync_gpio_async_enable_interrupt(uint32_t port, uint8_t pin,
7451
libtock_gpio_interrupt_mode_t irq_config) {
75-
returncode_t err;
76-
result.fired = false;
52+
returncode_t ret;
7753

78-
err = libtock_gpio_async_enable_interrupt(port, pin, irq_config, gpio_async_callback_command);
79-
if (err != RETURNCODE_SUCCESS) return err;
54+
ret = libtock_gpio_async_command_enable_interrupt(port, pin, irq_config);
55+
if (ret != RETURNCODE_SUCCESS) return ret;
8056

81-
// Wait for the callback.
82-
yield_for(&result.fired);
83-
return result.ret;
57+
ret = libtocksync_gpio_async_yield_wait_for_generic_command();
58+
return ret;
8459
}
8560

8661
returncode_t libtocksync_gpio_async_disable_interrupt(uint32_t port, uint8_t pin) {
87-
return gpio_async_op(port, pin, libtock_gpio_async_disable_interrupt);
62+
return gpio_async_command(port, pin, libtock_gpio_async_command_disable_interrupt);
8863
}
8964

9065
returncode_t libtocksync_gpio_async_disable_sync(uint32_t port, uint8_t pin) {
91-
return gpio_async_op(port, pin, libtock_gpio_async_disable);
66+
return gpio_async_command(port, pin, libtock_gpio_async_command_disable);
9267
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
#include "gpio_async_syscalls.h"
2+
3+
returncode_t libtocksync_gpio_async_yield_wait_for_generic_command(void) {
4+
yield_waitfor_return_t ret;
5+
ret = yield_wait_for(DRIVER_NUM_GPIO_ASYNC, 0);
6+
7+
return (returncode_t) ret.data0;
8+
}
9+
10+
returncode_t libtocksync_gpio_async_yield_wait_for_read(bool* value) {
11+
yield_waitfor_return_t ywf;
12+
returncode_t ret;
13+
14+
ywf = yield_wait_for(DRIVER_NUM_GPIO_ASYNC, 0);
15+
16+
ret = (returncode_t) ywf.data0;
17+
if (ret != RETURNCODE_SUCCESS) return ret;
18+
19+
*value = (bool) ywf.data1;
20+
return ret;
21+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
#pragma once
2+
3+
#include <libtock/peripherals/syscalls/gpio_async_syscalls.h>
4+
#include <libtock/tock.h>
5+
6+
#ifdef __cplusplus
7+
extern "C" {
8+
#endif
9+
10+
// Wait for a GPIO-Async operation with no values to finish.
11+
//
12+
// In lieu of redundant `wait_for_[set|clear|...]`, generic_command can be used
13+
// for any operation that only reports success or failure, expecting no values.
14+
returncode_t libtocksync_gpio_async_yield_wait_for_generic_command(void);
15+
16+
returncode_t libtocksync_gpio_async_yield_wait_for_read(bool* value);
17+
18+
#ifdef __cplusplus
19+
}
20+
#endif

0 commit comments

Comments
 (0)