Fix boards with no shared busses.

This commit is contained in:
Scott Shawcroft 2019-04-09 11:36:10 -07:00
parent ac7822ba4c
commit 72992070c5
No known key found for this signature in database
GPG Key ID: FD0EDC4B6C53CA59
5 changed files with 25 additions and 6 deletions

View File

@ -1590,6 +1590,14 @@ NORETURN void mp_raise_NotImplementedError(const compressed_string_t *msg) {
mp_raise_msg(&mp_type_NotImplementedError, msg);
}
NORETURN void mp_raise_NotImplementedError_varg(const compressed_string_t *fmt, ...) {
va_list argptr;
va_start(argptr,fmt);
mp_obj_t exception = mp_obj_new_exception_msg_vlist(&mp_type_NotImplementedError, fmt, argptr);
va_end(argptr);
nlr_raise(exception);
}
#if MICROPY_STACK_CHECK || MICROPY_ENABLE_PYSTACK
NORETURN void mp_raise_recursion_depth(void) {
mp_raise_RuntimeError(translate("maximum recursion depth exceeded"));

View File

@ -162,6 +162,7 @@ NORETURN void mp_raise_OSError(int errno_);
NORETURN void mp_raise_OSError_msg(const compressed_string_t *msg);
NORETURN void mp_raise_OSError_msg_varg(const compressed_string_t *fmt, ...);
NORETURN void mp_raise_NotImplementedError(const compressed_string_t *msg);
NORETURN void mp_raise_NotImplementedError_varg(const compressed_string_t *fmt, ...);
NORETURN void mp_raise_recursion_depth(void);
#if MICROPY_BUILTIN_METHOD_CHECK_SELF_ARG

View File

@ -25,6 +25,7 @@
*/
#include "py/obj.h"
#include "py/runtime.h"
#include "shared-bindings/board/__init__.h"

View File

@ -37,6 +37,7 @@
#include "shared-module/displayio/__init__.h"
#endif
#if BOARD_I2C
mp_obj_t common_hal_board_get_i2c(void) {
return MP_STATE_VM(shared_i2c_bus);
}
@ -49,7 +50,10 @@ mp_obj_t common_hal_board_create_i2c(void) {
MP_STATE_VM(shared_i2c_bus) = MP_OBJ_FROM_PTR(self);
return MP_STATE_VM(shared_i2c_bus);
}
#endif
#if BOARD_SPI
// Statically allocate the SPI object so it can live past the end of the heap and into the next VM.
// That way it can be used by built-in FourWire displays and be accessible through board.SPI().
STATIC busio_spi_obj_t spi_obj;
@ -73,7 +77,9 @@ mp_obj_t common_hal_board_create_spi(void) {
spi_singleton = (mp_obj_t)self;
return spi_singleton;
}
#endif
#if BOARD_UART
mp_obj_t common_hal_board_get_uart(void) {
return MP_STATE_VM(shared_uart_bus);
}
@ -89,6 +95,7 @@ mp_obj_t common_hal_board_create_uart(void) {
MP_STATE_VM(shared_uart_bus) = MP_OBJ_FROM_PTR(self);
return MP_STATE_VM(shared_uart_bus);
}
#endif
void reset_board_busses(void) {
#if BOARD_I2C

View File

@ -191,12 +191,14 @@ void reset_displays(void) {
if (((uint32_t) fourwire->bus) < ((uint32_t) &displays) ||
((uint32_t) fourwire->bus) > ((uint32_t) &displays + CIRCUITPY_DISPLAY_LIMIT)) {
busio_spi_obj_t* original_spi = fourwire->bus;
// We don't need to move original_spi if it is the board.SPI object because it is
// statically allocated already. (Doing so would also make it impossible to reference in
// a subsequent VM run.)
if (original_spi == common_hal_board_get_spi()) {
continue;
}
#if BOARD_SPI
// We don't need to move original_spi if it is the board.SPI object because it is
// statically allocated already. (Doing so would also make it impossible to reference in
// a subsequent VM run.)
if (original_spi == common_hal_board_get_spi()) {
continue;
}
#endif
memcpy(&fourwire->inline_bus, original_spi, sizeof(busio_spi_obj_t));
fourwire->bus = &fourwire->inline_bus;
// Check for other displays that use the same spi bus and swap them too.