From ec24a150e02b7eff1271b59f0667cdb94a7aef62 Mon Sep 17 00:00:00 2001 From: "maple \"mavica\" syrup" Date: Mon, 25 Mar 2024 18:32:17 -0300 Subject: [PATCH] extmod/machine_i2s: Prepare methods for PDM RX mode. Signed-off-by: maple "mavica" syrup --- extmod/machine_i2s.c | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/extmod/machine_i2s.c b/extmod/machine_i2s.c index 9c92eb4c92..22eb5af03d 100644 --- a/extmod/machine_i2s.c +++ b/extmod/machine_i2s.c @@ -344,7 +344,11 @@ static void copy_appbuf_to_ringbuf_non_blocking(machine_i2s_obj_t *self) { MP_NOINLINE static void machine_i2s_init_helper(machine_i2s_obj_t *self, size_t n_pos_args, const mp_obj_t *pos_args, mp_map_t *kw_args) { static const mp_arg_t allowed_args[] = { { MP_QSTR_sck, MP_ARG_KW_ONLY | MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL} }, + #if MICROPY_PY_MACHINE_PDM + { MP_QSTR_ws, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = mp_const_none} }, + #else { MP_QSTR_ws, MP_ARG_KW_ONLY | MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL} }, + #endif { MP_QSTR_sd, MP_ARG_KW_ONLY | MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL} }, #if MICROPY_PY_MACHINE_I2S_MCK { MP_QSTR_mck, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = mp_const_none} }, @@ -517,6 +521,9 @@ static const mp_rom_map_elem_t machine_i2s_locals_dict_table[] = { // Constants { MP_ROM_QSTR(MP_QSTR_RX), MP_ROM_INT(MICROPY_PY_MACHINE_I2S_CONSTANT_RX) }, { MP_ROM_QSTR(MP_QSTR_TX), MP_ROM_INT(MICROPY_PY_MACHINE_I2S_CONSTANT_TX) }, + #if MICROPY_PY_MACHINE_PDM + { MP_ROM_QSTR(MP_QSTR_PDM_RX), MP_ROM_INT(MICROPY_PY_MACHINE_I2S_PDM_RX) }, + #endif { MP_ROM_QSTR(MP_QSTR_STEREO), MP_ROM_INT(STEREO) }, { MP_ROM_QSTR(MP_QSTR_MONO), MP_ROM_INT(MONO) }, }; @@ -525,10 +532,18 @@ MP_DEFINE_CONST_DICT(machine_i2s_locals_dict, machine_i2s_locals_dict_table); static mp_uint_t machine_i2s_stream_read(mp_obj_t self_in, void *buf_in, mp_uint_t size, int *errcode) { machine_i2s_obj_t *self = MP_OBJ_TO_PTR(self_in); + #if MICROPY_PY_MACHINE_PDM + if ((self->mode != MICROPY_PY_MACHINE_I2S_CONSTANT_RX) && + (self->mode != MICROPY_PY_MACHINE_I2S_PDM_RX)) { + *errcode = MP_EPERM; + return MP_STREAM_ERROR; + } + #else if (self->mode != MICROPY_PY_MACHINE_I2S_CONSTANT_RX) { *errcode = MP_EPERM; return MP_STREAM_ERROR; } + #endif uint8_t appbuf_sample_size_in_bytes = (self->bits / 8) * (self->format == STEREO ? 2: 1); if (size % appbuf_sample_size_in_bytes != 0) { @@ -623,10 +638,18 @@ static mp_uint_t machine_i2s_ioctl(mp_obj_t self_in, mp_uint_t request, uintptr_ ret = 0; if (flags & MP_STREAM_POLL_RD) { + #if MICROPY_PY_MACHINE_PDM + if ((self->mode != MICROPY_PY_MACHINE_I2S_CONSTANT_RX) && + (self->mode != MICROPY_PY_MACHINE_I2S_PDM_RX)) { + *errcode = MP_EPERM; + return MP_STREAM_ERROR; + } + #else if (self->mode != MICROPY_PY_MACHINE_I2S_CONSTANT_RX) { *errcode = MP_EPERM; return MP_STREAM_ERROR; } + #endif #if MICROPY_PY_MACHINE_I2S_RING_BUF if (!ringbuf_is_empty(&self->ring_buffer)) {