samd/machine_uart: Use a finaliser to tidy up UART on soft reset.
And use the common sercom_table, saving a few bytes of RAM.
This commit is contained in:
parent
474233c250
commit
9c2bc379f1
|
@ -59,7 +59,7 @@ typedef struct _machine_uart_obj_t {
|
|||
} machine_uart_obj_t;
|
||||
|
||||
Sercom *sercom_instance[] = SERCOM_INSTS;
|
||||
machine_uart_obj_t *uart_table[SERCOM_INST_NUM] = {};
|
||||
extern void *sercom_table[SERCOM_INST_NUM];
|
||||
|
||||
STATIC const char *_parity_name[] = {"None", "", "0", "1"}; // Is defined as 0, 2, 3
|
||||
|
||||
|
@ -82,7 +82,7 @@ STATIC void uart_drain_rx_fifo(machine_uart_obj_t *self, Sercom *uart) {
|
|||
}
|
||||
|
||||
void common_uart_irq_handler(int uart_id) {
|
||||
machine_uart_obj_t *self = uart_table[uart_id];
|
||||
machine_uart_obj_t *self = sercom_table[uart_id];
|
||||
// Handle IRQ
|
||||
if (self != NULL) {
|
||||
Sercom *uart = sercom_instance[self->id];
|
||||
|
@ -322,7 +322,8 @@ STATIC mp_obj_t machine_uart_make_new(const mp_obj_type_t *type, size_t n_args,
|
|||
}
|
||||
|
||||
// Create the UART object and fill it with defaults.
|
||||
machine_uart_obj_t *self = mp_obj_malloc(machine_uart_obj_t, &machine_uart_type);
|
||||
machine_uart_obj_t *self = m_new_obj_with_finaliser(machine_uart_obj_t);
|
||||
self->base.type = &machine_uart_type;
|
||||
self->id = uart_id;
|
||||
self->baudrate = DEFAULT_UART_BAUDRATE;
|
||||
self->bits = 8;
|
||||
|
@ -332,7 +333,7 @@ STATIC mp_obj_t machine_uart_make_new(const mp_obj_type_t *type, size_t n_args,
|
|||
self->tx = 0xff;
|
||||
self->rx = 0xff;
|
||||
self->new = true;
|
||||
uart_table[uart_id] = self;
|
||||
sercom_table[uart_id] = self;
|
||||
|
||||
mp_map_t kw_args;
|
||||
mp_map_init_fixed_table(&kw_args, n_kw, args + n_args);
|
||||
|
@ -348,10 +349,10 @@ MP_DEFINE_CONST_FUN_OBJ_KW(machine_uart_init_obj, 1, machine_uart_init);
|
|||
STATIC mp_obj_t machine_uart_deinit(mp_obj_t self_in) {
|
||||
machine_uart_obj_t *self = MP_OBJ_TO_PTR(self_in);
|
||||
Sercom *uart = sercom_instance[self->id];
|
||||
// clear table entry of uart
|
||||
uart_table[self->id] = NULL;
|
||||
// Disable interrupts
|
||||
uart->USART.INTENCLR.reg = 0xff;
|
||||
// clear table entry of uart
|
||||
sercom_table[self->id] = NULL;
|
||||
MP_STATE_PORT(samd_uart_rx_buffer[self->id]) = NULL;
|
||||
#if MICROPY_HW_UART_TXBUF
|
||||
MP_STATE_PORT(samd_uart_tx_buffer[self->id]) = NULL;
|
||||
|
@ -409,14 +410,6 @@ STATIC mp_obj_t machine_uart_txdone(mp_obj_t self_in) {
|
|||
}
|
||||
STATIC MP_DEFINE_CONST_FUN_OBJ_1(machine_uart_txdone_obj, machine_uart_txdone);
|
||||
|
||||
void uart_deinit_all(void) {
|
||||
for (int i = 0; i < SERCOM_INST_NUM; i++) {
|
||||
if (uart_table[i] != NULL) {
|
||||
machine_uart_deinit((mp_obj_t)uart_table[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
STATIC const mp_rom_map_elem_t machine_uart_locals_dict_table[] = {
|
||||
{ MP_ROM_QSTR(MP_QSTR_init), MP_ROM_PTR(&machine_uart_init_obj) },
|
||||
{ MP_ROM_QSTR(MP_QSTR_deinit), MP_ROM_PTR(&machine_uart_deinit_obj) },
|
||||
|
@ -430,6 +423,7 @@ STATIC const mp_rom_map_elem_t machine_uart_locals_dict_table[] = {
|
|||
{ MP_ROM_QSTR(MP_QSTR_readline), MP_ROM_PTR(&mp_stream_unbuffered_readline_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___del__), MP_ROM_PTR(&machine_uart_deinit_obj) },
|
||||
};
|
||||
STATIC MP_DEFINE_CONST_DICT(machine_uart_locals_dict, machine_uart_locals_dict_table);
|
||||
|
||||
|
|
|
@ -39,7 +39,6 @@ extern void adc_deinit_all(void);
|
|||
extern void pin_irq_deinit_all(void);
|
||||
extern void pwm_deinit_all(void);
|
||||
extern void sercom_deinit_all(void);
|
||||
extern void uart_deinit_all(void);
|
||||
|
||||
void samd_main(void) {
|
||||
mp_stack_set_top(&_estack);
|
||||
|
@ -86,7 +85,6 @@ void samd_main(void) {
|
|||
pin_irq_deinit_all();
|
||||
pwm_deinit_all();
|
||||
sercom_deinit_all();
|
||||
uart_deinit_all();
|
||||
soft_timer_deinit();
|
||||
gc_sweep_all();
|
||||
mp_deinit();
|
||||
|
|
Loading…
Reference in New Issue