merge 3.0.2 to master
This commit is contained in:
commit
bc510e714f
20
.travis.yml
20
.travis.yml
@ -5,6 +5,9 @@ compiler:
|
||||
- gcc
|
||||
git:
|
||||
depth: 1
|
||||
|
||||
# Put a representative board from each port or sub-port near the top
|
||||
# to determine more quickly whether that port is going to build or not.
|
||||
env:
|
||||
- TRAVIS_TEST=unix
|
||||
- TRAVIS_TEST=docs
|
||||
@ -15,24 +18,25 @@ env:
|
||||
- TRAVIS_BOARD=trinket_m0
|
||||
- TRAVIS_BOARD=feather_m4_express
|
||||
- TRAVIS_BOARD=grandcentral_m4_express
|
||||
- TRAVIS_BOARD=feather_radiofruit_zigbee
|
||||
- TRAVIS_BOARD=arduino_zero
|
||||
- TRAVIS_BOARD=circuitplayground_express_crickit
|
||||
- TRAVIS_BOARD=feather_m0_basic
|
||||
- TRAVIS_BOARD=feather_m0_adalogger
|
||||
- TRAVIS_BOARD=feather_m0_rfm69
|
||||
- TRAVIS_BOARD=feather_m0_rfm9x
|
||||
- TRAVIS_BOARD=feather_m0_basic
|
||||
- TRAVIS_BOARD=feather_m0_express
|
||||
- TRAVIS_BOARD=feather_m0_express_crickit
|
||||
- TRAVIS_BOARD=feather_m0_rfm69
|
||||
- TRAVIS_BOARD=feather_m0_rfm9x
|
||||
- TRAVIS_BOARD=feather_nrf52832
|
||||
- TRAVIS_BOARD=feather_nrf52840_express
|
||||
- TRAVIS_BOARD=feather_radiofruit_zigbee
|
||||
- TRAVIS_BOARD=gemma_m0
|
||||
- TRAVIS_BOARD=hallowing_m0_express
|
||||
- TRAVIS_BOARD=itsybitsy_m0_express
|
||||
- TRAVIS_BOARD=itsybitsy_m4_express
|
||||
- TRAVIS_BOARD=metro_m0_express
|
||||
- TRAVIS_BOARD=metro_m4_express
|
||||
- TRAVIS_BOARD=pca10059
|
||||
- TRAVIS_BOARD=pirkey_m0
|
||||
- TRAVIS_BOARD=gemma_m0
|
||||
- TRAVIS_BOARD=hallowing_m0_express
|
||||
- TRAVIS_BOARD=feather_nrf52832
|
||||
- TRAVIS_BOARD=feather_nrf52840_express
|
||||
- TRAVIS_BOARD=trellis_m4_express
|
||||
|
||||
addons:
|
||||
|
@ -113,7 +113,7 @@ else
|
||||
# -finline-limit=80 or so is similar to not having it on.
|
||||
# There is no simple default value, though.
|
||||
ifdef INTERNAL_FLASH_FILESYSTEM
|
||||
CFLAGS += -finline-limit=55
|
||||
CFLAGS += -finline-limit=50
|
||||
endif
|
||||
ifdef CFLAGS_INLINE_LIMIT
|
||||
CFLAGS += -finline-limit=$(CFLAGS_INLINE_LIMIT)
|
||||
|
@ -34,81 +34,96 @@
|
||||
#include "samd/pins.h"
|
||||
#include "py/runtime.h"
|
||||
|
||||
#if !defined(DEFAULT_I2C_BUS_SDA) || !defined(DEFAULT_I2C_BUS_SCL)
|
||||
STATIC mp_obj_t board_i2c(void) {
|
||||
mp_raise_NotImplementedError(translate("No default I2C bus"));
|
||||
return NULL;
|
||||
#define BOARD_I2C (defined(DEFAULT_I2C_BUS_SDA) && defined(DEFAULT_I2C_BUS_SCL))
|
||||
#define BOARD_SPI (defined(DEFAULT_SPI_BUS_SCK) && defined(DEFAULT_SPI_BUS_MISO) && defined(DEFAULT_SPI_BUS_MOSI))
|
||||
#define BOARD_UART (defined(DEFAULT_UART_BUS_RX) && defined(DEFAULT_UART_BUS_TX))
|
||||
|
||||
#if BOARD_I2C
|
||||
STATIC mp_obj_t i2c_singleton = NULL;
|
||||
|
||||
STATIC mp_obj_t board_i2c(void) {
|
||||
|
||||
if (i2c_singleton == NULL) {
|
||||
busio_i2c_obj_t *self = m_new_obj(busio_i2c_obj_t);
|
||||
self->base.type = &busio_i2c_type;
|
||||
|
||||
assert_pin_free(DEFAULT_I2C_BUS_SDA);
|
||||
assert_pin_free(DEFAULT_I2C_BUS_SCL);
|
||||
common_hal_busio_i2c_construct(self, DEFAULT_I2C_BUS_SCL, DEFAULT_I2C_BUS_SDA, 400000, 0);
|
||||
i2c_singleton = (mp_obj_t)self;
|
||||
}
|
||||
return i2c_singleton;
|
||||
}
|
||||
#else
|
||||
STATIC mp_obj_t i2c_singleton = NULL;
|
||||
|
||||
STATIC mp_obj_t board_i2c(void) {
|
||||
|
||||
if (i2c_singleton == NULL) {
|
||||
busio_i2c_obj_t *self = m_new_obj(busio_i2c_obj_t);
|
||||
self->base.type = &busio_i2c_type;
|
||||
|
||||
assert_pin_free(DEFAULT_I2C_BUS_SDA);
|
||||
assert_pin_free(DEFAULT_I2C_BUS_SCL);
|
||||
common_hal_busio_i2c_construct(self, DEFAULT_I2C_BUS_SCL, DEFAULT_I2C_BUS_SDA, 400000, 0);
|
||||
i2c_singleton = (mp_obj_t)self;
|
||||
}
|
||||
return i2c_singleton;
|
||||
|
||||
}
|
||||
STATIC mp_obj_t board_i2c(void) {
|
||||
mp_raise_NotImplementedError(translate("No default I2C bus"));
|
||||
return NULL;
|
||||
}
|
||||
#endif
|
||||
MP_DEFINE_CONST_FUN_OBJ_0(board_i2c_obj, board_i2c);
|
||||
|
||||
#if !defined(DEFAULT_SPI_BUS_SCK) || !defined(DEFAULT_SPI_BUS_MISO) || !defined(DEFAULT_SPI_BUS_MOSI)
|
||||
STATIC mp_obj_t board_spi(void) {
|
||||
mp_raise_NotImplementedError(translate("No default SPI bus"));
|
||||
return NULL;
|
||||
#if BOARD_SPI
|
||||
STATIC mp_obj_t spi_singleton = NULL;
|
||||
|
||||
STATIC mp_obj_t board_spi(void) {
|
||||
if (spi_singleton == NULL) {
|
||||
busio_spi_obj_t *self = m_new_obj(busio_spi_obj_t);
|
||||
self->base.type = &busio_spi_type;
|
||||
assert_pin_free(DEFAULT_SPI_BUS_SCK);
|
||||
assert_pin_free(DEFAULT_SPI_BUS_MOSI);
|
||||
assert_pin_free(DEFAULT_SPI_BUS_MISO);
|
||||
const mcu_pin_obj_t* clock = MP_OBJ_TO_PTR(DEFAULT_SPI_BUS_SCK);
|
||||
const mcu_pin_obj_t* mosi = MP_OBJ_TO_PTR(DEFAULT_SPI_BUS_MOSI);
|
||||
const mcu_pin_obj_t* miso = MP_OBJ_TO_PTR(DEFAULT_SPI_BUS_MISO);
|
||||
common_hal_busio_spi_construct(self, clock, mosi, miso);
|
||||
spi_singleton = (mp_obj_t)self;
|
||||
}
|
||||
return spi_singleton;
|
||||
}
|
||||
#else
|
||||
STATIC mp_obj_t spi_singleton = NULL;
|
||||
|
||||
STATIC mp_obj_t board_spi(void) {
|
||||
|
||||
if (spi_singleton == NULL) {
|
||||
busio_spi_obj_t *self = m_new_obj(busio_spi_obj_t);
|
||||
self->base.type = &busio_spi_type;
|
||||
assert_pin_free(DEFAULT_SPI_BUS_SCK);
|
||||
assert_pin_free(DEFAULT_SPI_BUS_MOSI);
|
||||
assert_pin_free(DEFAULT_SPI_BUS_MISO);
|
||||
const mcu_pin_obj_t* clock = MP_OBJ_TO_PTR(DEFAULT_SPI_BUS_SCK);
|
||||
const mcu_pin_obj_t* mosi = MP_OBJ_TO_PTR(DEFAULT_SPI_BUS_MOSI);
|
||||
const mcu_pin_obj_t* miso = MP_OBJ_TO_PTR(DEFAULT_SPI_BUS_MISO);
|
||||
common_hal_busio_spi_construct(self, clock, mosi, miso);
|
||||
spi_singleton = (mp_obj_t)self;
|
||||
}
|
||||
return spi_singleton;
|
||||
}
|
||||
STATIC mp_obj_t board_spi(void) {
|
||||
mp_raise_NotImplementedError(translate("No default SPI bus"));
|
||||
return NULL;
|
||||
}
|
||||
#endif
|
||||
MP_DEFINE_CONST_FUN_OBJ_0(board_spi_obj, board_spi);
|
||||
|
||||
#if !defined(DEFAULT_UART_BUS_RX) || !defined(DEFAULT_UART_BUS_TX)
|
||||
STATIC mp_obj_t board_uart(void) {
|
||||
mp_raise_NotImplementedError(translate("No default UART bus"));
|
||||
return NULL;
|
||||
#if BOARD_UART
|
||||
STATIC mp_obj_t uart_singleton = NULL;
|
||||
|
||||
STATIC mp_obj_t board_uart(void) {
|
||||
if (uart_singleton == NULL) {
|
||||
busio_uart_obj_t *self = m_new_obj(busio_uart_obj_t);
|
||||
self->base.type = &busio_uart_type;
|
||||
|
||||
assert_pin_free(DEFAULT_UART_BUS_RX);
|
||||
assert_pin_free(DEFAULT_UART_BUS_TX);
|
||||
|
||||
const mcu_pin_obj_t* rx = MP_OBJ_TO_PTR(DEFAULT_UART_BUS_RX);
|
||||
const mcu_pin_obj_t* tx = MP_OBJ_TO_PTR(DEFAULT_UART_BUS_TX);
|
||||
|
||||
common_hal_busio_uart_construct(self, tx, rx, 9600, 8, PARITY_NONE, 1, 1000, 64);
|
||||
uart_singleton = (mp_obj_t)self;
|
||||
}
|
||||
return uart_singleton;
|
||||
}
|
||||
#else
|
||||
STATIC mp_obj_t uart_singleton = NULL;
|
||||
|
||||
STATIC mp_obj_t board_uart(void) {
|
||||
if (uart_singleton == NULL) {
|
||||
busio_uart_obj_t *self = m_new_obj(busio_uart_obj_t);
|
||||
self->base.type = &busio_uart_type;
|
||||
|
||||
assert_pin_free(DEFAULT_UART_BUS_RX);
|
||||
assert_pin_free(DEFAULT_UART_BUS_TX);
|
||||
|
||||
const mcu_pin_obj_t* rx = MP_OBJ_TO_PTR(DEFAULT_UART_BUS_RX);
|
||||
const mcu_pin_obj_t* tx = MP_OBJ_TO_PTR(DEFAULT_UART_BUS_TX);
|
||||
|
||||
common_hal_busio_uart_construct(self, tx, rx, 9600, 8, PARITY_NONE, 1, 1000, 64);
|
||||
uart_singleton = (mp_obj_t)self;
|
||||
}
|
||||
return uart_singleton;
|
||||
}
|
||||
STATIC mp_obj_t board_uart(void) {
|
||||
mp_raise_NotImplementedError(translate("No default UART bus"));
|
||||
return NULL;
|
||||
}
|
||||
#endif
|
||||
MP_DEFINE_CONST_FUN_OBJ_0(board_uart_obj, board_uart);
|
||||
|
||||
|
||||
void reset_board_busses(void) {
|
||||
#if BOARD_I2C
|
||||
i2c_singleton = NULL;
|
||||
#endif
|
||||
#if BOARD_SPI
|
||||
spi_singleton = NULL;
|
||||
#endif
|
||||
#if BOARD_UART
|
||||
uart_singleton = NULL;
|
||||
#endif
|
||||
}
|
||||
|
@ -36,4 +36,6 @@ extern mp_obj_fun_builtin_fixed_t board_spi_obj;
|
||||
void board_uart(void);
|
||||
extern mp_obj_fun_builtin_fixed_t board_uart_obj;
|
||||
|
||||
void reset_board_busses(void);
|
||||
|
||||
#endif // MICROPY_INCLUDED_ATMEL_SAMD_BOARD_BUSSES_H
|
||||
|
@ -62,4 +62,4 @@
|
||||
#define IGNORE_PIN_PA24 1
|
||||
#define IGNORE_PIN_PA25 1
|
||||
|
||||
#define CIRCUITPY_DISPLAYIO
|
||||
#define CIRCUITPY_DISPLAYIO (1)
|
||||
|
@ -133,7 +133,13 @@ void common_hal_busio_uart_construct(busio_uart_obj_t *self,
|
||||
|
||||
if (rx && receiver_buffer_size > 0) {
|
||||
self->buffer_length = receiver_buffer_size;
|
||||
self->buffer = (uint8_t *) gc_alloc(self->buffer_length * sizeof(uint8_t), false, false);
|
||||
// Initially allocate the UART's buffer in the long-lived part of the
|
||||
// heap. UARTs are generally long-lived objects, but the "make long-
|
||||
// lived" machinery is incapable of moving internal pointers like
|
||||
// self->buffer, so do it manually. (However, as long as internal
|
||||
// pointers like this are NOT moved, allocating the buffer
|
||||
// in the long-lived pool is not strictly necessary)
|
||||
self->buffer = (uint8_t *) gc_alloc(self->buffer_length * sizeof(uint8_t), false, true);
|
||||
if (self->buffer == NULL) {
|
||||
common_hal_busio_uart_deinit(self);
|
||||
mp_raise_msg(&mp_type_MemoryError, translate("Failed to allocate RX buffer"));
|
||||
@ -268,7 +274,7 @@ size_t common_hal_busio_uart_read(busio_uart_obj_t *self, uint8_t *data, size_t
|
||||
#ifdef MICROPY_VM_HOOK_LOOP
|
||||
MICROPY_VM_HOOK_LOOP
|
||||
#endif
|
||||
// If we are zero timeout, make sure we don't loop again (in the event
|
||||
// If we are zero timeout, make sure we don't loop again (in the event
|
||||
// we read in under 1ms)
|
||||
if (self->timeout_ms == 0)
|
||||
break;
|
||||
@ -344,7 +350,18 @@ void common_hal_busio_uart_set_baudrate(busio_uart_obj_t *self, uint32_t baudrat
|
||||
}
|
||||
|
||||
uint32_t common_hal_busio_uart_rx_characters_available(busio_uart_obj_t *self) {
|
||||
return self->buffer_size;
|
||||
// This assignment is only here because the usart_async routines take a *const argument.
|
||||
struct usart_async_descriptor * const usart_desc_p = (struct usart_async_descriptor * const) &self->usart_desc;
|
||||
struct usart_async_status async_status;
|
||||
usart_async_get_status(usart_desc_p, &async_status);
|
||||
return async_status.rxcnt;
|
||||
}
|
||||
|
||||
void common_hal_busio_uart_clear_rx_buffer(busio_uart_obj_t *self) {
|
||||
// This assignment is only here because the usart_async routines take a *const argument.
|
||||
struct usart_async_descriptor * const usart_desc_p = (struct usart_async_descriptor * const) &self->usart_desc;
|
||||
usart_async_flush_rx_buffer(usart_desc_p);
|
||||
|
||||
}
|
||||
|
||||
bool common_hal_busio_uart_ready_to_tx(busio_uart_obj_t *self) {
|
||||
|
@ -42,10 +42,6 @@ typedef struct {
|
||||
bool rx_error;
|
||||
uint32_t baudrate;
|
||||
uint32_t timeout_ms;
|
||||
// Index of the oldest received character.
|
||||
uint32_t buffer_start;
|
||||
// Index of the next available spot to store a character.
|
||||
uint32_t buffer_size;
|
||||
uint32_t buffer_length;
|
||||
uint8_t* buffer;
|
||||
} busio_uart_obj_t;
|
||||
|
@ -109,16 +109,16 @@ void common_hal_neopixel_write(const digitalio_digitalinout_obj_t* digitalinout,
|
||||
asm("nop; nop;");
|
||||
#endif
|
||||
#ifdef SAMD51
|
||||
delay_cycles(3);
|
||||
delay_cycles(2);
|
||||
#endif
|
||||
if(p & bitMask) {
|
||||
if((p & bitMask) != 0) {
|
||||
// This is the high delay unique to a one bit.
|
||||
// For the SK6812 its 0.3us
|
||||
#ifdef SAMD21
|
||||
asm("nop; nop; nop; nop; nop; nop; nop;");
|
||||
#endif
|
||||
#ifdef SAMD51
|
||||
delay_cycles(11);
|
||||
delay_cycles(3);
|
||||
#endif
|
||||
*clr = pinMask;
|
||||
} else {
|
||||
@ -129,7 +129,7 @@ void common_hal_neopixel_write(const digitalio_digitalinout_obj_t* digitalinout,
|
||||
asm("nop; nop;");
|
||||
#endif
|
||||
#ifdef SAMD51
|
||||
delay_cycles(3);
|
||||
delay_cycles(2);
|
||||
#endif
|
||||
}
|
||||
if((bitMask >>= 1) != 0) {
|
||||
@ -140,7 +140,7 @@ void common_hal_neopixel_write(const digitalio_digitalinout_obj_t* digitalinout,
|
||||
asm("nop; nop; nop; nop; nop;");
|
||||
#endif
|
||||
#ifdef SAMD51
|
||||
delay_cycles(20);
|
||||
delay_cycles(4);
|
||||
#endif
|
||||
} else {
|
||||
if(ptr >= end) break;
|
||||
@ -151,7 +151,7 @@ void common_hal_neopixel_write(const digitalio_digitalinout_obj_t* digitalinout,
|
||||
// above operations take.
|
||||
// For the SK6812 its 0.6us +- 0.15us
|
||||
#ifdef SAMD51
|
||||
delay_cycles(15);
|
||||
delay_cycles(3);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
@ -52,10 +52,10 @@ uint8_t tcc_refcount[TCC_INST_NUM];
|
||||
|
||||
// This bitmask keeps track of which channels of a TCC are currently claimed.
|
||||
#ifdef SAMD21
|
||||
uint8_t tcc_channels[3] = {0xf0, 0xfc, 0xfc};
|
||||
uint8_t tcc_channels[3]; // Set by pwmout_reset() to {0xf0, 0xfc, 0xfc} initially.
|
||||
#endif
|
||||
#ifdef SAMD51
|
||||
uint8_t tcc_channels[5] = {0xc0, 0xf0, 0xf8, 0xfc, 0xfc};
|
||||
uint8_t tcc_channels[5]; // Set by pwmout_reset() to {0xc0, 0xf0, 0xf8, 0xfc, 0xfc} initially.
|
||||
#endif
|
||||
|
||||
void pwmout_reset(void) {
|
||||
@ -76,7 +76,7 @@ void pwmout_reset(void) {
|
||||
for (uint8_t j = 0; j < tcc_cc_num[i]; j++) {
|
||||
mask <<= 1;
|
||||
}
|
||||
tcc_channels[i] = 0xf0;
|
||||
tcc_channels[i] = mask;
|
||||
tccs[i]->CTRLA.bit.SWRST = 1;
|
||||
}
|
||||
Tc *tcs[TC_INST_NUM] = TC_INSTS;
|
||||
@ -123,7 +123,7 @@ void common_hal_pulseio_pwmout_construct(pulseio_pwmout_obj_t* self,
|
||||
// Figure out which timer we are using.
|
||||
|
||||
// First see if a tcc is already going with the frequency we want and our
|
||||
// channel is unused. tc's don't have neough channels to share.
|
||||
// channel is unused. tc's don't have enough channels to share.
|
||||
const pin_timer_t* timer = NULL;
|
||||
uint8_t mux_position = 0;
|
||||
if (!variable_frequency) {
|
||||
@ -140,6 +140,9 @@ void common_hal_pulseio_pwmout_construct(pulseio_pwmout_obj_t* self,
|
||||
if (tcc->CTRLA.bit.ENABLE == 1 && channel_ok(t)) {
|
||||
timer = t;
|
||||
mux_position = j;
|
||||
// Claim channel.
|
||||
tcc_channels[timer->index] |= (1 << tcc_channel(timer));
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -61,6 +61,7 @@
|
||||
#include "samd/external_interrupts.h"
|
||||
#include "samd/dma.h"
|
||||
#include "shared-bindings/rtc/__init__.h"
|
||||
#include "board_busses.h"
|
||||
#include "tick.h"
|
||||
#include "usb.h"
|
||||
|
||||
@ -278,6 +279,8 @@ void reset_port(void) {
|
||||
|
||||
reset_all_pins();
|
||||
|
||||
reset_board_busses();
|
||||
|
||||
// Output clocks for debugging.
|
||||
// not supported by SAMD51G; uncomment for SAMD51J or update for 51G
|
||||
// #ifdef SAMD51
|
||||
|
@ -288,7 +288,7 @@ void usb_write(const char* buffer, uint32_t len) {
|
||||
return;
|
||||
}
|
||||
uint8_t * output_buffer;
|
||||
uint8_t output_len;
|
||||
uint32_t output_len;
|
||||
while (len > 0) {
|
||||
while (usb_transmitting) {}
|
||||
output_buffer = (uint8_t *) buffer;
|
||||
|
@ -138,6 +138,9 @@ uint32_t common_hal_busio_uart_rx_characters_available(busio_uart_obj_t *self) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
void common_hal_busio_uart_clear_rx_buffer(busio_uart_obj_t *self) {
|
||||
}
|
||||
|
||||
bool common_hal_busio_uart_ready_to_tx(busio_uart_obj_t *self) {
|
||||
return true;
|
||||
}
|
||||
|
@ -82,6 +82,10 @@ uint32_t common_hal_busio_uart_rx_characters_available(busio_uart_obj_t *self) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
void common_hal_busio_uart_clear_rx_buffer(busio_uart_obj_t *self) {
|
||||
mp_raise_NotImplementedError("busio.UART not yet implemented");
|
||||
}
|
||||
|
||||
bool common_hal_busio_uart_ready_to_tx(busio_uart_obj_t *self) {
|
||||
mp_raise_NotImplementedError(translate("busio.UART not yet implemented"));
|
||||
return false;
|
||||
|
@ -67,7 +67,11 @@ extern const busio_uart_parity_obj_t busio_uart_parity_odd_obj;
|
||||
|
||||
STATIC mp_obj_t busio_uart_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *pos_args) {
|
||||
mp_arg_check_num(n_args, n_kw, 0, MP_OBJ_FUN_ARGS_MAX, true);
|
||||
busio_uart_obj_t *self = m_new_obj(busio_uart_obj_t);
|
||||
// Always initially allocate the UART object within the long-lived heap.
|
||||
// This is needed to avoid crashes with certain UART implementations which
|
||||
// cannot accomodate being moved after creation. (See
|
||||
// https://github.com/adafruit/circuitpython/issues/1056)
|
||||
busio_uart_obj_t *self = m_new_ll_obj(busio_uart_obj_t);
|
||||
self->base.type = &busio_uart_type;
|
||||
mp_map_t kw_args;
|
||||
mp_map_init_fixed_table(&kw_args, n_kw, pos_args + n_args);
|
||||
@ -249,6 +253,36 @@ const mp_obj_property_t busio_uart_baudrate_obj = {
|
||||
(mp_obj_t)&mp_const_none_obj},
|
||||
};
|
||||
|
||||
//| .. attribute:: in_waiting
|
||||
//|
|
||||
//| The number of bytes in the input buffer, available to be read
|
||||
//|
|
||||
STATIC mp_obj_t busio_uart_obj_get_in_waiting(mp_obj_t self_in) {
|
||||
busio_uart_obj_t *self = MP_OBJ_TO_PTR(self_in);
|
||||
raise_error_if_deinited(common_hal_busio_uart_deinited(self));
|
||||
return MP_OBJ_NEW_SMALL_INT(common_hal_busio_uart_rx_characters_available(self));
|
||||
}
|
||||
MP_DEFINE_CONST_FUN_OBJ_1(busio_uart_get_in_waiting_obj, busio_uart_obj_get_in_waiting);
|
||||
|
||||
const mp_obj_property_t busio_uart_in_waiting_obj = {
|
||||
.base.type = &mp_type_property,
|
||||
.proxy = {(mp_obj_t)&busio_uart_get_in_waiting_obj,
|
||||
(mp_obj_t)&mp_const_none_obj,
|
||||
(mp_obj_t)&mp_const_none_obj},
|
||||
};
|
||||
|
||||
//| .. method:: reset_input_buffer()
|
||||
//|
|
||||
//| Discard any unread characters in the input buffer.
|
||||
//|
|
||||
STATIC mp_obj_t busio_uart_obj_reset_input_buffer(mp_obj_t self_in) {
|
||||
busio_uart_obj_t *self = MP_OBJ_TO_PTR(self_in);
|
||||
raise_error_if_deinited(common_hal_busio_uart_deinited(self));
|
||||
common_hal_busio_uart_clear_rx_buffer(self);
|
||||
return mp_const_none;
|
||||
}
|
||||
STATIC MP_DEFINE_CONST_FUN_OBJ_1(busio_uart_reset_input_buffer_obj, busio_uart_obj_reset_input_buffer);
|
||||
|
||||
//| .. class:: busio.UART.Parity
|
||||
//|
|
||||
//| Enum-like class to define the parity used to verify correct data transfer.
|
||||
@ -303,8 +337,11 @@ STATIC const mp_rom_map_elem_t busio_uart_locals_dict_table[] = {
|
||||
{ MP_OBJ_NEW_QSTR(MP_QSTR_readinto), MP_ROM_PTR(&mp_stream_readinto_obj) },
|
||||
{ MP_OBJ_NEW_QSTR(MP_QSTR_write), MP_ROM_PTR(&mp_stream_write_obj) },
|
||||
|
||||
{ MP_OBJ_NEW_QSTR(MP_QSTR_reset_input_buffer), MP_ROM_PTR(&busio_uart_reset_input_buffer_obj) },
|
||||
|
||||
// Properties
|
||||
{ MP_ROM_QSTR(MP_QSTR_baudrate), MP_ROM_PTR(&busio_uart_baudrate_obj) },
|
||||
{ MP_ROM_QSTR(MP_QSTR_in_waiting), MP_ROM_PTR(&busio_uart_in_waiting_obj) },
|
||||
|
||||
// Nested Enum-like Classes.
|
||||
{ MP_ROM_QSTR(MP_QSTR_Parity), MP_ROM_PTR(&busio_uart_parity_type) },
|
||||
|
@ -60,6 +60,7 @@ extern void common_hal_busio_uart_set_baudrate(busio_uart_obj_t *self, uint32_t
|
||||
|
||||
|
||||
extern uint32_t common_hal_busio_uart_rx_characters_available(busio_uart_obj_t *self);
|
||||
extern void common_hal_busio_uart_clear_rx_buffer(busio_uart_obj_t *self);
|
||||
extern bool common_hal_busio_uart_ready_to_tx(busio_uart_obj_t *self);
|
||||
|
||||
#endif // MICROPY_INCLUDED_SHARED_BINDINGS_BUSIO_UART_H
|
||||
|
@ -2,6 +2,7 @@ rm -rf ports/atmel-samd/build*
|
||||
rm -rf ports/esp8266/build*
|
||||
rm -rf ports/nrf/build*
|
||||
|
||||
# Alphabetical.
|
||||
HW_BOARDS="\
|
||||
arduino_zero \
|
||||
circuitplayground_express \
|
||||
@ -16,18 +17,19 @@ feather_m0_rfm9x \
|
||||
feather_m4_express \
|
||||
feather_nrf52832 \
|
||||
feather_nrf52840_express \
|
||||
grandcentral_m4_express \
|
||||
pca10056 \
|
||||
feather_radiofruit_zigbee \
|
||||
gemma_m0 \
|
||||
grandcentral_m4_express \
|
||||
hallowing_m0_express \
|
||||
itsybitsy_m0_express \
|
||||
itsybitsy_m4_express \
|
||||
metro_m0_express \
|
||||
metro_m4_express \
|
||||
pca10056 \
|
||||
pca10059 \
|
||||
pirkey_m0 \
|
||||
trinket_m0 \
|
||||
trellis_m4_express \
|
||||
trinket_m0 \
|
||||
"
|
||||
ROSIE_SETUPS="rosie-ci"
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user