summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--stmhal/modselect.c14
-rw-r--r--stmhal/pybioctl.h6
-rw-r--r--stmhal/uart.c33
3 files changed, 43 insertions, 10 deletions
diff --git a/stmhal/modselect.c b/stmhal/modselect.c
index 6b58c04bb8..6ae3585352 100644
--- a/stmhal/modselect.c
+++ b/stmhal/modselect.c
@@ -35,16 +35,10 @@
#include "qstr.h"
#include "obj.h"
#include "objlist.h"
+#include "pybioctl.h"
/// \moduleref select
-#define MP_IOCTL_POLL (0x100 | 1)
-
-#define MP_IOCTL_POLL_RD (0x0001)
-#define MP_IOCTL_POLL_WR (0x0002)
-#define MP_IOCTL_POLL_HUP (0x0004)
-#define MP_IOCTL_POLL_ERR (0x0008)
-
typedef struct _poll_obj_t {
mp_uint_t (*ioctl)(mp_obj_t obj, mp_uint_t request, int *errcode, ...);
mp_uint_t flags;
@@ -85,13 +79,13 @@ STATIC mp_uint_t poll_map_poll(mp_map_t *poll_map, mp_uint_t *rwx_num) {
}
poll_obj_t *poll_obj = (poll_obj_t*)poll_map->table[i].value;
- int errno;
- mp_int_t ret = poll_obj->ioctl(poll_map->table[i].key, MP_IOCTL_POLL, &errno, poll_obj->flags);
+ int errcode;
+ mp_int_t ret = poll_obj->ioctl(poll_map->table[i].key, MP_IOCTL_POLL, &errcode, poll_obj->flags);
poll_obj->flags_ret = ret;
if (ret == -1) {
// error doing ioctl
- nlr_raise(mp_obj_new_exception_arg1(&mp_type_OSError, MP_OBJ_NEW_SMALL_INT(errno)));
+ nlr_raise(mp_obj_new_exception_arg1(&mp_type_OSError, MP_OBJ_NEW_SMALL_INT(errcode)));
}
if (ret != 0) {
diff --git a/stmhal/pybioctl.h b/stmhal/pybioctl.h
new file mode 100644
index 0000000000..79f994b8b6
--- /dev/null
+++ b/stmhal/pybioctl.h
@@ -0,0 +1,6 @@
+#define MP_IOCTL_POLL (0x100 | 1)
+
+#define MP_IOCTL_POLL_RD (0x0001)
+#define MP_IOCTL_POLL_WR (0x0002)
+#define MP_IOCTL_POLL_HUP (0x0004)
+#define MP_IOCTL_POLL_ERR (0x0008)
diff --git a/stmhal/uart.c b/stmhal/uart.c
index 1cf718c5c0..6cb8a8e40d 100644
--- a/stmhal/uart.c
+++ b/stmhal/uart.c
@@ -26,6 +26,7 @@
#include <stdio.h>
#include <string.h>
+#include <stdarg.h>
#include "stm32f4xx_hal.h"
@@ -37,6 +38,7 @@
#include "runtime.h"
#include "bufhelper.h"
#include "uart.h"
+#include "pybioctl.h"
/// \moduleref pyb
/// \class UART - duplex serial communication bus
@@ -475,10 +477,41 @@ STATIC const mp_map_elem_t pyb_uart_locals_dict_table[] = {
STATIC MP_DEFINE_CONST_DICT(pyb_uart_locals_dict, pyb_uart_locals_dict_table);
+mp_uint_t uart_ioctl(mp_obj_t self_in, mp_uint_t request, int *errcode, ...) {
+ pyb_uart_obj_t *self = self_in;
+ va_list vargs;
+ va_start(vargs, errcode);
+ mp_uint_t ret;
+ if (request == MP_IOCTL_POLL) {
+ mp_uint_t flags = va_arg(vargs, mp_uint_t);
+ ret = 0;
+ if (flags & MP_IOCTL_POLL_RD && uart_rx_any(self)) {
+ ret |= MP_IOCTL_POLL_RD;
+ }
+ if (flags & MP_IOCTL_POLL_WR) {
+ // TODO can we always write?
+ ret |= MP_IOCTL_POLL_WR;
+ }
+ } else {
+ *errcode = 1; // EPERM, operation not permitted
+ ret = -1;
+ }
+ va_end(vargs);
+ return ret;
+}
+
+STATIC const mp_stream_p_t uart_stream_p = {
+ //.read = uart_read, // TODO
+ //.write = uart_write, // TODO
+ .ioctl = uart_ioctl,
+ .is_text = false,
+};
+
const mp_obj_type_t pyb_uart_type = {
{ &mp_type_type },
.name = MP_QSTR_UART,
.print = pyb_uart_print,
.make_new = pyb_uart_make_new,
+ .stream_p = &uart_stream_p,
.locals_dict = (mp_obj_t)&pyb_uart_locals_dict,
};