diff --git a/extmod/extmod.cmake b/extmod/extmod.cmake index 063df70f5f..ccb6f0465b 100644 --- a/extmod/extmod.cmake +++ b/extmod/extmod.cmake @@ -9,6 +9,7 @@ set(MICROPY_SOURCE_EXTMOD ${MICROPY_EXTMOD_DIR}/btstack/modbluetooth_btstack.c ${MICROPY_EXTMOD_DIR}/machine_bitstream.c ${MICROPY_EXTMOD_DIR}/machine_i2c.c + ${MICROPY_EXTMOD_DIR}/machine_i2s.c ${MICROPY_EXTMOD_DIR}/machine_mem.c ${MICROPY_EXTMOD_DIR}/machine_pulse.c ${MICROPY_EXTMOD_DIR}/machine_pwm.c diff --git a/extmod/extmod.mk b/extmod/extmod.mk index a6c7826867..44b41f5ffb 100644 --- a/extmod/extmod.mk +++ b/extmod/extmod.mk @@ -4,6 +4,7 @@ SRC_EXTMOD_C += \ extmod/machine_bitstream.c \ extmod/machine_i2c.c \ + extmod/machine_i2s.c \ extmod/machine_mem.c \ extmod/machine_pinbase.c \ extmod/machine_pulse.c \ diff --git a/extmod/machine_i2s.c b/extmod/machine_i2s.c new file mode 100644 index 0000000000..53de7293f2 --- /dev/null +++ b/extmod/machine_i2s.c @@ -0,0 +1,111 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2021 Mike Teachman + * Copyright (c) 2023 Damien P. George + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include "py/runtime.h" + +#if MICROPY_PY_MACHINE_I2S + +#include "extmod/modmachine.h" + +// The port must provide implementations of these low-level I2S functions. +STATIC void mp_machine_i2s_init_helper(machine_i2s_obj_t *self, size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args); +STATIC machine_i2s_obj_t *mp_machine_i2s_make_new_instance(mp_int_t i2s_id); +STATIC void mp_machine_i2s_deinit(machine_i2s_obj_t *self); + +// The port provides implementations of the above in this file. +#include MICROPY_PY_MACHINE_I2S_INCLUDEFILE + +STATIC mp_obj_t machine_i2s_make_new(const mp_obj_type_t *type, size_t n_pos_args, size_t n_kw_args, const mp_obj_t *args) { + mp_arg_check_num(n_pos_args, n_kw_args, 1, MP_OBJ_FUN_ARGS_MAX, true); + mp_int_t i2s_id = mp_obj_get_int(args[0]); + + machine_i2s_obj_t *self = mp_machine_i2s_make_new_instance(i2s_id); + + mp_map_t kw_args; + mp_map_init_fixed_table(&kw_args, n_kw_args, args + n_pos_args); + mp_machine_i2s_init_helper(self, n_pos_args - 1, args + 1, &kw_args); + + return MP_OBJ_FROM_PTR(self); +} + +// I2S.init(...) +STATIC mp_obj_t machine_i2s_init(size_t n_pos_args, const mp_obj_t *pos_args, mp_map_t *kw_args) { + machine_i2s_obj_t *self = MP_OBJ_TO_PTR(pos_args[0]); + mp_machine_i2s_deinit(self); + mp_machine_i2s_init_helper(self, n_pos_args - 1, pos_args + 1, kw_args); + return mp_const_none; +} +STATIC MP_DEFINE_CONST_FUN_OBJ_KW(machine_i2s_init_obj, 1, machine_i2s_init); + +// I2S.deinit() +STATIC mp_obj_t machine_i2s_deinit(mp_obj_t self_in) { + machine_i2s_obj_t *self = MP_OBJ_TO_PTR(self_in); + mp_machine_i2s_deinit(self); + return mp_const_none; +} +STATIC MP_DEFINE_CONST_FUN_OBJ_1(machine_i2s_deinit_obj, machine_i2s_deinit); + +STATIC const mp_rom_map_elem_t machine_i2s_locals_dict_table[] = { + // Methods + { MP_ROM_QSTR(MP_QSTR_init), MP_ROM_PTR(&machine_i2s_init_obj) }, + { MP_ROM_QSTR(MP_QSTR_readinto), MP_ROM_PTR(&mp_stream_readinto_obj) }, + { MP_ROM_QSTR(MP_QSTR_write), MP_ROM_PTR(&mp_stream_write_obj) }, + { MP_ROM_QSTR(MP_QSTR_deinit), MP_ROM_PTR(&machine_i2s_deinit_obj) }, + { MP_ROM_QSTR(MP_QSTR_irq), MP_ROM_PTR(&machine_i2s_irq_obj) }, + #if MICROPY_PY_MACHINE_I2S_FINALISER + { MP_ROM_QSTR(MP_QSTR___del__), MP_ROM_PTR(&machine_i2s_deinit_obj) }, + #endif + + // Static method + { MP_ROM_QSTR(MP_QSTR_shift), MP_ROM_PTR(&machine_i2s_shift_obj) }, + + // 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) }, + { MP_ROM_QSTR(MP_QSTR_STEREO), MP_ROM_INT(STEREO) }, + { MP_ROM_QSTR(MP_QSTR_MONO), MP_ROM_INT(MONO) }, +}; +MP_DEFINE_CONST_DICT(machine_i2s_locals_dict, machine_i2s_locals_dict_table); + +STATIC const mp_stream_p_t i2s_stream_p = { + .read = machine_i2s_stream_read, + .write = machine_i2s_stream_write, + .ioctl = machine_i2s_ioctl, + .is_text = false, +}; + +MP_DEFINE_CONST_OBJ_TYPE( + machine_i2s_type, + MP_QSTR_I2S, + MP_TYPE_FLAG_ITER_IS_STREAM, + make_new, machine_i2s_make_new, + print, machine_i2s_print, + protocol, &i2s_stream_p, + locals_dict, &machine_i2s_locals_dict + ); + +#endif // MICROPY_PY_MACHINE_I2S diff --git a/extmod/modmachine.h b/extmod/modmachine.h index 22bd0d6258..b0235dcf64 100644 --- a/extmod/modmachine.h +++ b/extmod/modmachine.h @@ -30,6 +30,7 @@ #include "py/obj.h" // A port must provide these types, but they are otherwise opaque. +typedef struct _machine_i2s_obj_t machine_i2s_obj_t; typedef struct _machine_pwm_obj_t machine_pwm_obj_t; typedef struct _machine_wdt_obj_t machine_wdt_obj_t; @@ -37,6 +38,7 @@ typedef struct _machine_wdt_obj_t machine_wdt_obj_t; // Their Python bindings are implemented in extmod, and their implementation // is provided by a port. extern const mp_obj_type_t machine_i2c_type; +extern const mp_obj_type_t machine_i2s_type; extern const mp_obj_type_t machine_pwm_type; extern const mp_obj_type_t machine_spi_type; extern const mp_obj_type_t machine_timer_type; diff --git a/ports/esp32/esp32_common.cmake b/ports/esp32/esp32_common.cmake index e1dd546ea3..2c82c1f10f 100644 --- a/ports/esp32/esp32_common.cmake +++ b/ports/esp32/esp32_common.cmake @@ -70,7 +70,6 @@ list(APPEND MICROPY_SOURCE_PORT machine_adcblock.c machine_dac.c machine_i2c.c - machine_i2s.c machine_uart.c modmachine.c network_common.c diff --git a/ports/esp32/machine_i2s.c b/ports/esp32/machine_i2s.c index 95751c87c3..5a78e3b740 100644 --- a/ports/esp32/machine_i2s.c +++ b/ports/esp32/machine_i2s.c @@ -24,19 +24,11 @@ * THE SOFTWARE. */ -#include -#include -#include -#include -#include +// This file is never compiled standalone, it's included directly from +// extmod/machine_i2s.c via MICROPY_PY_MACHINE_I2S_INCLUDEFILE. -#include "py/obj.h" -#include "py/runtime.h" -#include "py/misc.h" +#include "py/mphal.h" #include "py/stream.h" -#include "py/objstr.h" -#include "modmachine.h" -#include "mphalport.h" #if MICROPY_PY_MACHINE_I2S @@ -360,7 +352,7 @@ STATIC void task_for_non_blocking_mode(void *self_in) { } } -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 void mp_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) { enum { ARG_sck, @@ -501,10 +493,8 @@ STATIC void machine_i2s_print(const mp_print_t *print, mp_obj_t self_in, mp_prin ); } -STATIC mp_obj_t machine_i2s_make_new(const mp_obj_type_t *type, size_t n_pos_args, size_t n_kw_args, const mp_obj_t *args) { - mp_arg_check_num(n_pos_args, n_kw_args, 1, MP_OBJ_FUN_ARGS_MAX, true); - - i2s_port_t port = mp_obj_get_int(args[0]); +STATIC machine_i2s_obj_t *mp_machine_i2s_make_new_instance(mp_int_t i2s_id) { + i2s_port_t port = i2s_id; if (port < 0 || port >= I2S_NUM_AUTO) { mp_raise_ValueError(MP_ERROR_TEXT("invalid id")); } @@ -520,23 +510,10 @@ STATIC mp_obj_t machine_i2s_make_new(const mp_obj_type_t *type, size_t n_pos_arg machine_i2s_deinit(self); } - mp_map_t kw_args; - mp_map_init_fixed_table(&kw_args, n_kw_args, args + n_pos_args); - machine_i2s_init_helper(self, n_pos_args - 1, args + 1, &kw_args); - - return MP_OBJ_FROM_PTR(self); + return self; } -STATIC mp_obj_t machine_i2s_obj_init(size_t n_pos_args, const mp_obj_t *pos_args, mp_map_t *kw_args) { - machine_i2s_obj_t *self = pos_args[0]; - machine_i2s_deinit(self); - machine_i2s_init_helper(self, n_pos_args - 1, pos_args + 1, kw_args); - return mp_const_none; -} -STATIC MP_DEFINE_CONST_FUN_OBJ_KW(machine_i2s_init_obj, 1, machine_i2s_obj_init); - -STATIC mp_obj_t machine_i2s_deinit(mp_obj_t self_in) { - machine_i2s_obj_t *self = MP_OBJ_TO_PTR(self_in); +STATIC void mp_machine_i2s_deinit(machine_i2s_obj_t *self) { i2s_driver_uninstall(self->port); if (self->non_blocking_mode_task != NULL) { @@ -550,9 +527,7 @@ STATIC mp_obj_t machine_i2s_deinit(mp_obj_t self_in) { } self->i2s_event_queue = NULL; - return mp_const_none; } -STATIC MP_DEFINE_CONST_FUN_OBJ_1(machine_i2s_deinit_obj, machine_i2s_deinit); STATIC mp_obj_t machine_i2s_irq(mp_obj_t self_in, mp_obj_t handler) { machine_i2s_obj_t *self = MP_OBJ_TO_PTR(self_in); @@ -660,26 +635,6 @@ STATIC mp_obj_t machine_i2s_shift(size_t n_args, const mp_obj_t *pos_args, mp_ma STATIC MP_DEFINE_CONST_FUN_OBJ_KW(machine_i2s_shift_fun_obj, 0, machine_i2s_shift); STATIC MP_DEFINE_CONST_STATICMETHOD_OBJ(machine_i2s_shift_obj, MP_ROM_PTR(&machine_i2s_shift_fun_obj)); -STATIC const mp_rom_map_elem_t machine_i2s_locals_dict_table[] = { - // Methods - { MP_ROM_QSTR(MP_QSTR_init), MP_ROM_PTR(&machine_i2s_init_obj) }, - { MP_ROM_QSTR(MP_QSTR_readinto), MP_ROM_PTR(&mp_stream_readinto_obj) }, - { MP_ROM_QSTR(MP_QSTR_write), MP_ROM_PTR(&mp_stream_write_obj) }, - { MP_ROM_QSTR(MP_QSTR_deinit), MP_ROM_PTR(&machine_i2s_deinit_obj) }, - { MP_ROM_QSTR(MP_QSTR_irq), MP_ROM_PTR(&machine_i2s_irq_obj) }, - { MP_ROM_QSTR(MP_QSTR___del__), MP_ROM_PTR(&machine_i2s_deinit_obj) }, - - // Static method - { MP_ROM_QSTR(MP_QSTR_shift), MP_ROM_PTR(&machine_i2s_shift_obj) }, - - // Constants - { MP_ROM_QSTR(MP_QSTR_RX), MP_ROM_INT(I2S_MODE_MASTER | I2S_MODE_RX) }, - { MP_ROM_QSTR(MP_QSTR_TX), MP_ROM_INT(I2S_MODE_MASTER | I2S_MODE_TX) }, - { MP_ROM_QSTR(MP_QSTR_STEREO), MP_ROM_INT(STEREO) }, - { MP_ROM_QSTR(MP_QSTR_MONO), MP_ROM_INT(MONO) }, -}; -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); @@ -802,23 +757,6 @@ STATIC mp_uint_t machine_i2s_ioctl(mp_obj_t self_in, mp_uint_t request, uintptr_ return ret; } -STATIC const mp_stream_p_t i2s_stream_p = { - .read = machine_i2s_stream_read, - .write = machine_i2s_stream_write, - .ioctl = machine_i2s_ioctl, - .is_text = false, -}; - -MP_DEFINE_CONST_OBJ_TYPE( - machine_i2s_type, - MP_QSTR_I2S, - MP_TYPE_FLAG_ITER_IS_STREAM, - make_new, machine_i2s_make_new, - print, machine_i2s_print, - protocol, &i2s_stream_p, - locals_dict, &machine_i2s_locals_dict - ); - MP_REGISTER_ROOT_POINTER(struct _machine_i2s_obj_t *machine_i2s_obj[I2S_NUM_AUTO]); #endif // MICROPY_PY_MACHINE_I2S diff --git a/ports/esp32/modmachine.h b/ports/esp32/modmachine.h index 24f27101a8..abf029c473 100644 --- a/ports/esp32/modmachine.h +++ b/ports/esp32/modmachine.h @@ -17,7 +17,6 @@ extern const mp_obj_type_t machine_adcblock_type; extern const mp_obj_type_t machine_dac_type; extern const mp_obj_type_t machine_i2c_type; extern const mp_obj_type_t machine_spi_type; -extern const mp_obj_type_t machine_i2s_type; extern const mp_obj_type_t machine_uart_type; extern const mp_obj_type_t machine_rtc_type; extern const mp_obj_type_t machine_sdcard_type; diff --git a/ports/esp32/mpconfigport.h b/ports/esp32/mpconfigport.h index 5d39323c58..8b59dc1225 100644 --- a/ports/esp32/mpconfigport.h +++ b/ports/esp32/mpconfigport.h @@ -115,6 +115,10 @@ #ifndef MICROPY_PY_MACHINE_I2S #define MICROPY_PY_MACHINE_I2S (1) #endif +#define MICROPY_PY_MACHINE_I2S_INCLUDEFILE "ports/esp32/machine_i2s.c" +#define MICROPY_PY_MACHINE_I2S_FINALISER (1) +#define MICROPY_PY_MACHINE_I2S_CONSTANT_RX (I2S_MODE_MASTER | I2S_MODE_RX) +#define MICROPY_PY_MACHINE_I2S_CONSTANT_TX (I2S_MODE_MASTER | I2S_MODE_TX) #define MICROPY_PY_MACHINE_WDT (1) #define MICROPY_PY_MACHINE_WDT_INCLUDEFILE "ports/esp32/machine_wdt.c" #define MICROPY_PY_NETWORK (1) diff --git a/ports/mimxrt/Makefile b/ports/mimxrt/Makefile index d29b38e040..2f4b13ad92 100644 --- a/ports/mimxrt/Makefile +++ b/ports/mimxrt/Makefile @@ -198,7 +198,6 @@ SRC_C += \ machine_adc.c \ machine_bitstream.c \ machine_i2c.c \ - machine_i2s.c \ machine_led.c \ machine_pin.c \ machine_rtc.c \ diff --git a/ports/mimxrt/machine_i2s.c b/ports/mimxrt/machine_i2s.c index 7711219441..979872dd16 100644 --- a/ports/mimxrt/machine_i2s.c +++ b/ports/mimxrt/machine_i2s.c @@ -25,19 +25,11 @@ * THE SOFTWARE. */ -#include -#include -#include -#include -#include +// This file is never compiled standalone, it's included directly from +// extmod/machine_i2s.c via MICROPY_PY_MACHINE_I2S_INCLUDEFILE. -#include "py/obj.h" -#include "py/runtime.h" #include "py/mphal.h" -#include "py/misc.h" #include "py/stream.h" -#include "py/objstr.h" -#include "modmachine.h" #include "dma_manager.h" #include CLOCK_CONFIG_H @@ -845,7 +837,7 @@ STATIC bool i2s_init(machine_i2s_obj_t *self) { return true; } -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 void mp_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) { enum { ARG_sck, @@ -994,10 +986,7 @@ STATIC void machine_i2s_print(const mp_print_t *print, mp_obj_t self_in, mp_prin ); } -STATIC mp_obj_t machine_i2s_make_new(const mp_obj_type_t *type, size_t n_pos_args, size_t n_kw_args, const mp_obj_t *args) { - mp_arg_check_num(n_pos_args, n_kw_args, 1, MP_OBJ_FUN_ARGS_MAX, true); - uint8_t i2s_id = mp_obj_get_int(args[0]); - +STATIC machine_i2s_obj_t *mp_machine_i2s_make_new_instance(mp_int_t i2s_id) { if (i2s_id < 1 || i2s_id > MICROPY_HW_I2S_NUM) { mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("I2S(%d) does not exist"), i2s_id); } @@ -1021,23 +1010,10 @@ STATIC mp_obj_t machine_i2s_make_new(const mp_obj_type_t *type, size_t n_pos_arg // fill the DMA buffer with NULLs memset(self->dma_buffer_dcache_aligned, 0, SIZEOF_DMA_BUFFER_IN_BYTES); - mp_map_t kw_args; - mp_map_init_fixed_table(&kw_args, n_kw_args, args + n_pos_args); - machine_i2s_init_helper(self, n_pos_args - 1, args + 1, &kw_args); - return MP_OBJ_FROM_PTR(self); + return self; } -STATIC mp_obj_t machine_i2s_init(size_t n_pos_args, const mp_obj_t *pos_args, mp_map_t *kw_args) { - machine_i2s_obj_t *self = MP_OBJ_TO_PTR(pos_args[0]); - machine_i2s_deinit(MP_OBJ_FROM_PTR(self)); - machine_i2s_init_helper(self, n_pos_args - 1, pos_args + 1, kw_args); - return mp_const_none; -} -STATIC MP_DEFINE_CONST_FUN_OBJ_KW(machine_i2s_init_obj, 1, machine_i2s_init); - -STATIC mp_obj_t machine_i2s_deinit(mp_obj_t self_in) { - machine_i2s_obj_t *self = MP_OBJ_TO_PTR(self_in); - +STATIC void mp_machine_i2s_deinit(machine_i2s_obj_t *self) { // use self->i2s_inst as in indication that I2S object has already been de-initialized if (self->i2s_inst != NULL) { EDMA_AbortTransfer(&self->edmaHandle); @@ -1059,9 +1035,7 @@ STATIC mp_obj_t machine_i2s_deinit(mp_obj_t self_in) { m_free(self->ring_buffer_storage); self->i2s_inst = NULL; // flag object as de-initialized } - return mp_const_none; } -STATIC MP_DEFINE_CONST_FUN_OBJ_1(machine_i2s_deinit_obj, machine_i2s_deinit); STATIC mp_obj_t machine_i2s_irq(mp_obj_t self_in, mp_obj_t handler) { machine_i2s_obj_t *self = MP_OBJ_TO_PTR(self_in); @@ -1142,25 +1116,6 @@ STATIC mp_obj_t machine_i2s_shift(size_t n_args, const mp_obj_t *pos_args, mp_ma STATIC MP_DEFINE_CONST_FUN_OBJ_KW(machine_i2s_shift_fun_obj, 0, machine_i2s_shift); STATIC MP_DEFINE_CONST_STATICMETHOD_OBJ(machine_i2s_shift_obj, MP_ROM_PTR(&machine_i2s_shift_fun_obj)); -STATIC const mp_rom_map_elem_t machine_i2s_locals_dict_table[] = { - // Methods - { MP_ROM_QSTR(MP_QSTR_init), MP_ROM_PTR(&machine_i2s_init_obj) }, - { MP_ROM_QSTR(MP_QSTR_readinto), MP_ROM_PTR(&mp_stream_readinto_obj) }, - { MP_ROM_QSTR(MP_QSTR_write), MP_ROM_PTR(&mp_stream_write_obj) }, - { MP_ROM_QSTR(MP_QSTR_deinit), MP_ROM_PTR(&machine_i2s_deinit_obj) }, - { MP_ROM_QSTR(MP_QSTR_irq), MP_ROM_PTR(&machine_i2s_irq_obj) }, - - // Static method - { MP_ROM_QSTR(MP_QSTR_shift), MP_ROM_PTR(&machine_i2s_shift_obj) }, - - // Constants - { MP_ROM_QSTR(MP_QSTR_RX), MP_ROM_INT(RX) }, - { MP_ROM_QSTR(MP_QSTR_TX), MP_ROM_INT(TX) }, - { MP_ROM_QSTR(MP_QSTR_STEREO), MP_ROM_INT(STEREO) }, - { MP_ROM_QSTR(MP_QSTR_MONO), MP_ROM_INT(MONO) }, -}; -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); @@ -1259,23 +1214,6 @@ STATIC mp_uint_t machine_i2s_ioctl(mp_obj_t self_in, mp_uint_t request, uintptr_ return ret; } -STATIC const mp_stream_p_t i2s_stream_p = { - .read = machine_i2s_stream_read, - .write = machine_i2s_stream_write, - .ioctl = machine_i2s_ioctl, - .is_text = false, -}; - -MP_DEFINE_CONST_OBJ_TYPE( - machine_i2s_type, - MP_QSTR_I2S, - MP_TYPE_FLAG_ITER_IS_STREAM, - make_new, machine_i2s_make_new, - print, machine_i2s_print, - protocol, &i2s_stream_p, - locals_dict, &machine_i2s_locals_dict - ); - MP_REGISTER_ROOT_POINTER(struct _machine_i2s_obj_t *machine_i2s_obj[MICROPY_HW_I2S_NUM]); #endif // MICROPY_PY_MACHINE_I2S diff --git a/ports/mimxrt/modmachine.h b/ports/mimxrt/modmachine.h index 92d875b4d0..fed75fdd54 100644 --- a/ports/mimxrt/modmachine.h +++ b/ports/mimxrt/modmachine.h @@ -31,7 +31,6 @@ extern const mp_obj_type_t machine_adc_type; extern const mp_obj_type_t machine_i2c_type; -extern const mp_obj_type_t machine_i2s_type; extern const mp_obj_type_t machine_rtc_type; extern const mp_obj_type_t machine_sdcard_type; extern const mp_obj_type_t machine_spi_type; diff --git a/ports/mimxrt/mpconfigport.h b/ports/mimxrt/mpconfigport.h index 1eb3b17112..24c2436dbf 100644 --- a/ports/mimxrt/mpconfigport.h +++ b/ports/mimxrt/mpconfigport.h @@ -87,6 +87,9 @@ uint32_t trng_random_u32(void); #ifndef MICROPY_PY_MACHINE_I2S #define MICROPY_PY_MACHINE_I2S (0) #endif +#define MICROPY_PY_MACHINE_I2S_INCLUDEFILE "ports/mimxrt/machine_i2s.c" +#define MICROPY_PY_MACHINE_I2S_CONSTANT_RX (RX) +#define MICROPY_PY_MACHINE_I2S_CONSTANT_TX (TX) #ifndef MICROPY_PY_MACHINE_SDCARD #define MICROPY_PY_MACHINE_SDCARD (1) #endif diff --git a/ports/rp2/CMakeLists.txt b/ports/rp2/CMakeLists.txt index b8cf4d7bec..d5302e3369 100644 --- a/ports/rp2/CMakeLists.txt +++ b/ports/rp2/CMakeLists.txt @@ -120,7 +120,6 @@ set(MICROPY_SOURCE_PORT machine_adc.c machine_bitstream.c machine_i2c.c - machine_i2s.c machine_pin.c machine_rtc.c machine_spi.c @@ -149,7 +148,6 @@ set(MICROPY_SOURCE_QSTR ${MICROPY_DIR}/shared/runtime/sys_stdio_mphal.c ${MICROPY_PORT_DIR}/machine_adc.c ${MICROPY_PORT_DIR}/machine_i2c.c - ${MICROPY_PORT_DIR}/machine_i2s.c ${MICROPY_PORT_DIR}/machine_pin.c ${MICROPY_PORT_DIR}/machine_rtc.c ${MICROPY_PORT_DIR}/machine_spi.c diff --git a/ports/rp2/machine_i2s.c b/ports/rp2/machine_i2s.c index 5ad1a748b9..6ed982ba45 100644 --- a/ports/rp2/machine_i2s.c +++ b/ports/rp2/machine_i2s.c @@ -24,19 +24,13 @@ * THE SOFTWARE. */ -#include -#include -#include -#include -#include +// This file is never compiled standalone, it's included directly from +// extmod/machine_i2s.c via MICROPY_PY_MACHINE_I2S_INCLUDEFILE. -#include "py/obj.h" -#include "py/runtime.h" +#include +#include #include "py/mphal.h" -#include "py/misc.h" #include "py/stream.h" -#include "py/objstr.h" -#include "modmachine.h" #include "hardware/pio.h" #include "hardware/clocks.h" @@ -771,7 +765,7 @@ STATIC void dma_irq1_handler(void) { dma_irq_handler(1); } -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 void mp_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) { enum { ARG_sck, @@ -887,10 +881,7 @@ STATIC void machine_i2s_print(const mp_print_t *print, mp_obj_t self_in, mp_prin ); } -STATIC mp_obj_t machine_i2s_make_new(const mp_obj_type_t *type, size_t n_pos_args, size_t n_kw_args, const mp_obj_t *args) { - mp_arg_check_num(n_pos_args, n_kw_args, 1, MP_OBJ_FUN_ARGS_MAX, true); - uint8_t i2s_id = mp_obj_get_int(args[0]); - +STATIC machine_i2s_obj_t *mp_machine_i2s_make_new_instance(mp_int_t i2s_id) { if (i2s_id >= MAX_I2S_RP2) { mp_raise_ValueError(MP_ERROR_TEXT("invalid id")); } @@ -905,23 +896,10 @@ STATIC mp_obj_t machine_i2s_make_new(const mp_obj_type_t *type, size_t n_pos_arg machine_i2s_deinit(MP_OBJ_FROM_PTR(self)); } - mp_map_t kw_args; - mp_map_init_fixed_table(&kw_args, n_kw_args, args + n_pos_args); - machine_i2s_init_helper(self, n_pos_args - 1, args + 1, &kw_args); - return MP_OBJ_FROM_PTR(self); + return self; } -STATIC mp_obj_t machine_i2s_init(size_t n_pos_args, const mp_obj_t *pos_args, mp_map_t *kw_args) { - machine_i2s_obj_t *self = MP_OBJ_TO_PTR(pos_args[0]); - machine_i2s_deinit(MP_OBJ_FROM_PTR(self)); - machine_i2s_init_helper(self, n_pos_args - 1, pos_args + 1, kw_args); - return mp_const_none; -} -STATIC MP_DEFINE_CONST_FUN_OBJ_KW(machine_i2s_init_obj, 1, machine_i2s_init); - -STATIC mp_obj_t machine_i2s_deinit(mp_obj_t self_in) { - machine_i2s_obj_t *self = MP_OBJ_TO_PTR(self_in); - +STATIC void mp_machine_i2s_deinit(machine_i2s_obj_t *self) { // use self->pio as in indication that I2S object has already been de-initialized if (self->pio != NULL) { pio_deinit(self); @@ -930,9 +908,7 @@ STATIC mp_obj_t machine_i2s_deinit(mp_obj_t self_in) { m_free(self->ring_buffer_storage); self->pio = NULL; // flag object as de-initialized } - return mp_const_none; } -STATIC MP_DEFINE_CONST_FUN_OBJ_1(machine_i2s_deinit_obj, machine_i2s_deinit); STATIC mp_obj_t machine_i2s_irq(mp_obj_t self_in, mp_obj_t handler) { machine_i2s_obj_t *self = MP_OBJ_TO_PTR(self_in); @@ -1013,25 +989,6 @@ STATIC mp_obj_t machine_i2s_shift(size_t n_args, const mp_obj_t *pos_args, mp_ma STATIC MP_DEFINE_CONST_FUN_OBJ_KW(machine_i2s_shift_fun_obj, 0, machine_i2s_shift); STATIC MP_DEFINE_CONST_STATICMETHOD_OBJ(machine_i2s_shift_obj, MP_ROM_PTR(&machine_i2s_shift_fun_obj)); -STATIC const mp_rom_map_elem_t machine_i2s_locals_dict_table[] = { - // Methods - { MP_ROM_QSTR(MP_QSTR_init), MP_ROM_PTR(&machine_i2s_init_obj) }, - { MP_ROM_QSTR(MP_QSTR_readinto), MP_ROM_PTR(&mp_stream_readinto_obj) }, - { MP_ROM_QSTR(MP_QSTR_write), MP_ROM_PTR(&mp_stream_write_obj) }, - { MP_ROM_QSTR(MP_QSTR_deinit), MP_ROM_PTR(&machine_i2s_deinit_obj) }, - { MP_ROM_QSTR(MP_QSTR_irq), MP_ROM_PTR(&machine_i2s_irq_obj) }, - - // Static method - { MP_ROM_QSTR(MP_QSTR_shift), MP_ROM_PTR(&machine_i2s_shift_obj) }, - - // Constants - { MP_ROM_QSTR(MP_QSTR_RX), MP_ROM_INT(RX) }, - { MP_ROM_QSTR(MP_QSTR_TX), MP_ROM_INT(TX) }, - { MP_ROM_QSTR(MP_QSTR_STEREO), MP_ROM_INT(STEREO) }, - { MP_ROM_QSTR(MP_QSTR_MONO), MP_ROM_INT(MONO) }, -}; -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); @@ -1130,21 +1087,4 @@ STATIC mp_uint_t machine_i2s_ioctl(mp_obj_t self_in, mp_uint_t request, uintptr_ return ret; } -STATIC const mp_stream_p_t i2s_stream_p = { - .read = machine_i2s_stream_read, - .write = machine_i2s_stream_write, - .ioctl = machine_i2s_ioctl, - .is_text = false, -}; - -MP_DEFINE_CONST_OBJ_TYPE( - machine_i2s_type, - MP_QSTR_I2S, - MP_TYPE_FLAG_ITER_IS_STREAM, - make_new, machine_i2s_make_new, - print, machine_i2s_print, - protocol, &i2s_stream_p, - locals_dict, &machine_i2s_locals_dict - ); - MP_REGISTER_ROOT_POINTER(void *machine_i2s_obj[2]); diff --git a/ports/rp2/modmachine.h b/ports/rp2/modmachine.h index 559fb34814..39a6e9c81e 100644 --- a/ports/rp2/modmachine.h +++ b/ports/rp2/modmachine.h @@ -5,7 +5,6 @@ extern const mp_obj_type_t machine_adc_type; extern const mp_obj_type_t machine_i2c_type; -extern const mp_obj_type_t machine_i2s_type; extern const mp_obj_type_t machine_pin_type; extern const mp_obj_type_t machine_rtc_type; extern const mp_obj_type_t machine_spi_type; diff --git a/ports/rp2/mpconfigport.h b/ports/rp2/mpconfigport.h index bf43b5ce7f..5e6cf0b2d5 100644 --- a/ports/rp2/mpconfigport.h +++ b/ports/rp2/mpconfigport.h @@ -118,6 +118,10 @@ #define MICROPY_PY_MACHINE_PWM_INCLUDEFILE "ports/rp2/machine_pwm.c" #define MICROPY_PY_MACHINE_I2C (1) #define MICROPY_PY_MACHINE_SOFTI2C (1) +#define MICROPY_PY_MACHINE_I2S (1) +#define MICROPY_PY_MACHINE_I2S_INCLUDEFILE "ports/rp2/machine_i2s.c" +#define MICROPY_PY_MACHINE_I2S_CONSTANT_RX (RX) +#define MICROPY_PY_MACHINE_I2S_CONSTANT_TX (TX) #define MICROPY_PY_MACHINE_SPI (1) #define MICROPY_PY_MACHINE_SPI_MSB (SPI_MSB_FIRST) #define MICROPY_PY_MACHINE_SPI_LSB (SPI_LSB_FIRST) diff --git a/ports/stm32/Makefile b/ports/stm32/Makefile index 589ef4cdbb..9c73c5c956 100644 --- a/ports/stm32/Makefile +++ b/ports/stm32/Makefile @@ -335,7 +335,6 @@ SRC_C += \ machine_adc.c \ machine_bitstream.c \ machine_i2c.c \ - machine_i2s.c \ machine_spi.c \ machine_uart.c \ modmachine.c \ diff --git a/ports/stm32/dma.c b/ports/stm32/dma.c index 36f4a67859..0a5d25c16c 100644 --- a/ports/stm32/dma.c +++ b/ports/stm32/dma.c @@ -131,7 +131,7 @@ static const DMA_InitTypeDef dma_init_struct_spi_i2c = { }; #endif -#if MICROPY_HW_ENABLE_I2S +#if MICROPY_PY_MACHINE_I2S // Default parameters to dma_init() for i2s; Channel and Direction // vary depending on the peripheral instance so they get passed separately static const DMA_InitTypeDef dma_init_struct_i2s = { @@ -314,7 +314,7 @@ const dma_descr_t dma_I2C_3_RX = { DMA1_Stream2, DMA_CHANNEL_3, dma_id_2, &dma const dma_descr_t dma_I2C_2_RX = { DMA1_Stream2, DMA_CHANNEL_7, dma_id_2, &dma_init_struct_spi_i2c }; const dma_descr_t dma_SPI_2_RX = { DMA1_Stream3, DMA_CHANNEL_0, dma_id_3, &dma_init_struct_spi_i2c }; const dma_descr_t dma_SPI_2_TX = { DMA1_Stream4, DMA_CHANNEL_0, dma_id_4, &dma_init_struct_spi_i2c }; -#if MICROPY_HW_ENABLE_I2S +#if MICROPY_PY_MACHINE_I2S const dma_descr_t dma_I2S_2_RX = { DMA1_Stream3, DMA_CHANNEL_0, dma_id_3, &dma_init_struct_i2s }; const dma_descr_t dma_I2S_2_TX = { DMA1_Stream4, DMA_CHANNEL_0, dma_id_4, &dma_init_struct_i2s }; #endif @@ -342,7 +342,7 @@ const dma_descr_t dma_SDMMC_2 = { DMA2_Stream0, DMA_CHANNEL_11, dma_id_8, &dma_ const dma_descr_t dma_DCMI_0 = { DMA2_Stream1, DMA_CHANNEL_1, dma_id_9, &dma_init_struct_dcmi }; #endif const dma_descr_t dma_SPI_1_RX = { DMA2_Stream2, DMA_CHANNEL_3, dma_id_10, &dma_init_struct_spi_i2c }; -#if MICROPY_HW_ENABLE_I2S +#if MICROPY_PY_MACHINE_I2S const dma_descr_t dma_I2S_1_RX = { DMA2_Stream2, DMA_CHANNEL_3, dma_id_10, &dma_init_struct_i2s }; #endif #if ENABLE_SDIO @@ -356,7 +356,7 @@ const dma_descr_t dma_SPI_5_TX = { DMA2_Stream4, DMA_CHANNEL_2, dma_id_12, &dma const dma_descr_t dma_SPI_4_TX = { DMA2_Stream4, DMA_CHANNEL_5, dma_id_12, &dma_init_struct_spi_i2c }; const dma_descr_t dma_SPI_6_TX = { DMA2_Stream5, DMA_CHANNEL_1, dma_id_13, &dma_init_struct_spi_i2c }; const dma_descr_t dma_SPI_1_TX = { DMA2_Stream5, DMA_CHANNEL_3, dma_id_13, &dma_init_struct_spi_i2c }; -#if MICROPY_HW_ENABLE_I2S +#if MICROPY_PY_MACHINE_I2S const dma_descr_t dma_I2S_1_TX = { DMA2_Stream5, DMA_CHANNEL_3, dma_id_13, &dma_init_struct_i2s }; #endif // #if defined(STM32F7) && defined(SDMMC2) && ENABLE_SDIO diff --git a/ports/stm32/machine_i2s.c b/ports/stm32/machine_i2s.c index bb595a2579..58b85c7a79 100644 --- a/ports/stm32/machine_i2s.c +++ b/ports/stm32/machine_i2s.c @@ -25,23 +25,17 @@ * THE SOFTWARE. */ -#include -#include -#include -#include -#include +// This file is never compiled standalone, it's included directly from +// extmod/machine_i2s.c via MICROPY_PY_MACHINE_I2S_INCLUDEFILE. -#include "py/obj.h" -#include "py/runtime.h" +#include #include "py/mphal.h" -#include "py/misc.h" #include "py/stream.h" -#include "py/objstr.h" -#include "modmachine.h" #include "pin.h" #include "dma.h" -#if MICROPY_HW_ENABLE_I2S +#if MICROPY_PY_MACHINE_I2S + // The I2S module has 3 modes of operation: // // Mode1: Blocking @@ -591,7 +585,7 @@ STATIC bool i2s_init(machine_i2s_obj_t *self) { void HAL_I2S_ErrorCallback(I2S_HandleTypeDef *hi2s) { uint32_t errorCode = HAL_I2S_GetError(hi2s); - printf("I2S Error = %ld\n", errorCode); + mp_printf(MICROPY_ERROR_PRINTER, "I2S Error = %ld\n", errorCode); } void HAL_I2S_RxCpltCallback(I2S_HandleTypeDef *hi2s) { @@ -671,7 +665,7 @@ void HAL_I2S_TxHalfCpltCallback(I2S_HandleTypeDef *hi2s) { feed_dma(self, TOP_HALF); } -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 void mp_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) { enum { ARG_sck, @@ -839,9 +833,7 @@ STATIC void machine_i2s_print(const mp_print_t *print, mp_obj_t self_in, mp_prin ); } -STATIC mp_obj_t machine_i2s_make_new(const mp_obj_type_t *type, size_t n_pos_args, size_t n_kw_args, const mp_obj_t *args) { - mp_arg_check_num(n_pos_args, n_kw_args, 1, MP_OBJ_FUN_ARGS_MAX, true); - uint8_t i2s_id = mp_obj_get_int(args[0]); +STATIC machine_i2s_obj_t *mp_machine_i2s_make_new_instance(mp_int_t i2s_id) { uint8_t i2s_id_zero_base = 0; if (0) { @@ -870,24 +862,10 @@ STATIC mp_obj_t machine_i2s_make_new(const mp_obj_type_t *type, size_t n_pos_arg // align DMA buffer start to the cache line size (32 bytes) self->dma_buffer_dcache_aligned = (uint8_t *)((uint32_t)(self->dma_buffer + 0x1f) & ~0x1f); - mp_map_t kw_args; - mp_map_init_fixed_table(&kw_args, n_kw_args, args + n_pos_args); - machine_i2s_init_helper(self, n_pos_args - 1, args + 1, &kw_args); - - return MP_OBJ_FROM_PTR(self); + return self; } -STATIC mp_obj_t machine_i2s_init(size_t n_pos_args, const mp_obj_t *pos_args, mp_map_t *kw_args) { - machine_i2s_obj_t *self = MP_OBJ_TO_PTR(pos_args[0]); - machine_i2s_deinit(MP_OBJ_FROM_PTR(self)); - machine_i2s_init_helper(self, n_pos_args - 1, pos_args + 1, kw_args); - return mp_const_none; -} -STATIC MP_DEFINE_CONST_FUN_OBJ_KW(machine_i2s_init_obj, 1, machine_i2s_init); - -STATIC mp_obj_t machine_i2s_deinit(mp_obj_t self_in) { - machine_i2s_obj_t *self = MP_OBJ_TO_PTR(self_in); - +STATIC void mp_machine_i2s_deinit(machine_i2s_obj_t *self) { if (self->ring_buffer_storage != NULL) { dma_deinit(self->dma_descr_tx); dma_deinit(self->dma_descr_rx); @@ -906,10 +884,7 @@ STATIC mp_obj_t machine_i2s_deinit(mp_obj_t self_in) { m_free(self->ring_buffer_storage); self->ring_buffer_storage = NULL; } - - return mp_const_none; } -STATIC MP_DEFINE_CONST_FUN_OBJ_1(machine_i2s_deinit_obj, machine_i2s_deinit); STATIC mp_obj_t machine_i2s_irq(mp_obj_t self_in, mp_obj_t handler) { machine_i2s_obj_t *self = MP_OBJ_TO_PTR(self_in); @@ -990,25 +965,6 @@ STATIC mp_obj_t machine_i2s_shift(size_t n_args, const mp_obj_t *pos_args, mp_ma STATIC MP_DEFINE_CONST_FUN_OBJ_KW(machine_i2s_shift_fun_obj, 0, machine_i2s_shift); STATIC MP_DEFINE_CONST_STATICMETHOD_OBJ(machine_i2s_shift_obj, MP_ROM_PTR(&machine_i2s_shift_fun_obj)); -STATIC const mp_rom_map_elem_t machine_i2s_locals_dict_table[] = { - // Methods - { MP_ROM_QSTR(MP_QSTR_init), MP_ROM_PTR(&machine_i2s_init_obj) }, - { MP_ROM_QSTR(MP_QSTR_readinto), MP_ROM_PTR(&mp_stream_readinto_obj) }, - { MP_ROM_QSTR(MP_QSTR_write), MP_ROM_PTR(&mp_stream_write_obj) }, - { MP_ROM_QSTR(MP_QSTR_deinit), MP_ROM_PTR(&machine_i2s_deinit_obj) }, - { MP_ROM_QSTR(MP_QSTR_irq), MP_ROM_PTR(&machine_i2s_irq_obj) }, - - // Static method - { MP_ROM_QSTR(MP_QSTR_shift), MP_ROM_PTR(&machine_i2s_shift_obj) }, - - // Constants - { MP_ROM_QSTR(MP_QSTR_RX), MP_ROM_INT(I2S_MODE_MASTER_RX) }, - { MP_ROM_QSTR(MP_QSTR_TX), MP_ROM_INT(I2S_MODE_MASTER_TX) }, - { MP_ROM_QSTR(MP_QSTR_STEREO), MP_ROM_INT(STEREO) }, - { MP_ROM_QSTR(MP_QSTR_MONO), MP_ROM_INT(MONO) }, -}; -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); @@ -1107,23 +1063,6 @@ STATIC mp_uint_t machine_i2s_ioctl(mp_obj_t self_in, mp_uint_t request, uintptr_ return ret; } -STATIC const mp_stream_p_t i2s_stream_p = { - .read = machine_i2s_stream_read, - .write = machine_i2s_stream_write, - .ioctl = machine_i2s_ioctl, - .is_text = false, -}; - -MP_DEFINE_CONST_OBJ_TYPE( - machine_i2s_type, - MP_QSTR_I2S, - MP_TYPE_FLAG_ITER_IS_STREAM, - make_new, machine_i2s_make_new, - print, machine_i2s_print, - protocol, &i2s_stream_p, - locals_dict, &machine_i2s_locals_dict - ); - MP_REGISTER_ROOT_POINTER(struct _machine_i2s_obj_t *machine_i2s_obj[MICROPY_HW_MAX_I2S]); -#endif // MICROPY_HW_ENABLE_I2S +#endif // MICROPY_PY_MACHINE_I2S diff --git a/ports/stm32/main.c b/ports/stm32/main.c index 95b74c621a..9e5dafc9f6 100644 --- a/ports/stm32/main.c +++ b/ports/stm32/main.c @@ -528,7 +528,7 @@ soft_reset: pyb_usb_init0(); #endif - #if MICROPY_HW_ENABLE_I2S + #if MICROPY_PY_MACHINE_I2S machine_i2s_init0(); #endif diff --git a/ports/stm32/modmachine.c b/ports/stm32/modmachine.c index 926dc30413..a0e2da89f8 100644 --- a/ports/stm32/modmachine.c +++ b/ports/stm32/modmachine.c @@ -443,7 +443,7 @@ STATIC const mp_rom_map_elem_t machine_module_globals_table[] = { { MP_ROM_QSTR(MP_QSTR_SPI), MP_ROM_PTR(&machine_spi_type) }, { MP_ROM_QSTR(MP_QSTR_SoftSPI), MP_ROM_PTR(&mp_machine_soft_spi_type) }, #endif - #if MICROPY_HW_ENABLE_I2S + #if MICROPY_PY_MACHINE_I2S { MP_ROM_QSTR(MP_QSTR_I2S), MP_ROM_PTR(&machine_i2s_type) }, #endif { MP_ROM_QSTR(MP_QSTR_UART), MP_ROM_PTR(&pyb_uart_type) }, diff --git a/ports/stm32/modmachine.h b/ports/stm32/modmachine.h index 28d9c699d6..9838eafdb0 100644 --- a/ports/stm32/modmachine.h +++ b/ports/stm32/modmachine.h @@ -30,7 +30,6 @@ extern const mp_obj_type_t machine_adc_type; extern const mp_obj_type_t machine_i2c_type; -extern const mp_obj_type_t machine_i2s_type; extern const mp_obj_type_t machine_spi_type; extern const mp_obj_type_t machine_timer_type; diff --git a/ports/stm32/mpconfigboard_common.h b/ports/stm32/mpconfigboard_common.h index b6cc7f84db..6d9ef8de3b 100644 --- a/ports/stm32/mpconfigboard_common.h +++ b/ports/stm32/mpconfigboard_common.h @@ -591,10 +591,10 @@ // Enable I2S if there are any peripherals defined #if defined(MICROPY_HW_I2S1) || defined(MICROPY_HW_I2S2) -#define MICROPY_HW_ENABLE_I2S (1) +#define MICROPY_PY_MACHINE_I2S (1) #define MICROPY_HW_MAX_I2S (2) #else -#define MICROPY_HW_ENABLE_I2S (0) +#define MICROPY_PY_MACHINE_I2S (0) #define MICROPY_HW_MAX_I2S (0) #endif diff --git a/ports/stm32/mpconfigport.h b/ports/stm32/mpconfigport.h index 0e9df54ff4..1dae9f7f08 100644 --- a/ports/stm32/mpconfigport.h +++ b/ports/stm32/mpconfigport.h @@ -117,6 +117,9 @@ #define MICROPY_PY_MACHINE_PIN_MAKE_NEW mp_pin_make_new #define MICROPY_PY_MACHINE_I2C (1) #define MICROPY_PY_MACHINE_SOFTI2C (1) +#define MICROPY_PY_MACHINE_I2S_INCLUDEFILE "ports/stm32/machine_i2s.c" +#define MICROPY_PY_MACHINE_I2S_CONSTANT_RX (I2S_MODE_MASTER_RX) +#define MICROPY_PY_MACHINE_I2S_CONSTANT_TX (I2S_MODE_MASTER_TX) #define MICROPY_PY_MACHINE_SPI (1) #define MICROPY_PY_MACHINE_SPI_MSB (SPI_FIRSTBIT_MSB) #define MICROPY_PY_MACHINE_SPI_LSB (SPI_FIRSTBIT_LSB)