Skip to content

Commit 8268093

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

File tree

3 files changed

+69
-52
lines changed

3 files changed

+69
-52
lines changed
Lines changed: 28 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -1,92 +1,68 @@
11
#include "gpio_async.h"
22

3-
struct gpio_async_data {
4-
bool fired;
5-
bool value;
6-
returncode_t ret;
7-
};
8-
9-
static struct gpio_async_data result = { .fired = false };
3+
#include "syscalls/gpio_async_syscalls.h"
104

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;
5+
static returncode_t gpio_async_command(uint32_t port, uint8_t pin, returncode_t (*command_fn)(uint32_t, uint8_t)) {
6+
returncode_t ret;
217

22-
err = op(port, pin, gpio_async_callback_command);
23-
if (err != RETURNCODE_SUCCESS) return err;
8+
ret = command_fn(port, pin);
9+
if (ret != RETURNCODE_SUCCESS) return ret;
2410

25-
// Wait for the callback.
26-
yield_for(&result.fired);
27-
return result.ret;
11+
ret = libtocksync_gpio_async_yield_wait_for_generic_command();
12+
return ret;
2813
}
2914

3015
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);
16+
return gpio_async_command(port, pin, libtock_gpio_async_command_make_output);
3217
}
3318

3419
returncode_t libtocksync_gpio_async_set(uint32_t port, uint8_t pin) {
35-
return gpio_async_op(port, pin, libtock_gpio_async_set);
20+
return gpio_async_command(port, pin, libtock_gpio_async_command_set);
3621
}
3722

3823
returncode_t libtocksync_gpio_async_clear(uint32_t port, uint8_t pin) {
39-
return gpio_async_op(port, pin, libtock_gpio_async_clear);
24+
return gpio_async_command(port, pin, libtock_gpio_async_command_clear);
4025
}
4126

4227
returncode_t libtocksync_gpio_async_toggle(uint32_t port, uint8_t pin) {
43-
return gpio_async_op(port, pin, libtock_gpio_async_toggle);
28+
return gpio_async_command(port, pin, libtock_gpio_async_command_toggle);
4429
}
4530

4631
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;
32+
returncode_t ret;
4933

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

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

5841
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;
42+
returncode_t ret;
6443

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

69-
*value = result.value;
70-
return RETURNCODE_SUCCESS;
47+
ret = libtocksync_gpio_async_yield_wait_for_read(value);
48+
return ret;
7149
}
7250

7351
returncode_t libtocksync_gpio_async_enable_interrupt(uint32_t port, uint8_t pin,
7452
libtock_gpio_interrupt_mode_t irq_config) {
75-
returncode_t err;
76-
result.fired = false;
53+
returncode_t ret;
7754

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

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

8662
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);
63+
return gpio_async_command(port, pin, libtock_gpio_async_command_disable_interrupt);
8864
}
8965

9066
returncode_t libtocksync_gpio_async_disable_sync(uint32_t port, uint8_t pin) {
91-
return gpio_async_op(port, pin, libtock_gpio_async_disable);
67+
return gpio_async_command(port, pin, libtock_gpio_async_command_disable);
9268
}
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)