From c49b00c699f37621aae2f42a00c06f6afbf779df Mon Sep 17 00:00:00 2001 From: Harold De Armas Date: Wed, 17 May 2023 23:44:04 -0700 Subject: [PATCH 1/2] Initial bringup for inky frame 7.3 --- .../boards/pimoroni_inky_frame_7_3/board.c | 196 ++++++++++++++++++ .../boards/pimoroni_inky_frame_7_3/link.ld | 1 + .../pimoroni_inky_frame_7_3/mpconfigboard.h | 17 ++ .../pimoroni_inky_frame_7_3/mpconfigboard.mk | 26 +++ .../pico-sdk-configboard.h | 1 + .../boards/pimoroni_inky_frame_7_3/pins.c | 52 +++++ shared-module/displayio/EPaperDisplay.c | 25 ++- shared-module/displayio/EPaperDisplay.h | 1 + 8 files changed, 315 insertions(+), 4 deletions(-) create mode 100644 ports/raspberrypi/boards/pimoroni_inky_frame_7_3/board.c create mode 100644 ports/raspberrypi/boards/pimoroni_inky_frame_7_3/link.ld create mode 100644 ports/raspberrypi/boards/pimoroni_inky_frame_7_3/mpconfigboard.h create mode 100644 ports/raspberrypi/boards/pimoroni_inky_frame_7_3/mpconfigboard.mk create mode 100644 ports/raspberrypi/boards/pimoroni_inky_frame_7_3/pico-sdk-configboard.h create mode 100644 ports/raspberrypi/boards/pimoroni_inky_frame_7_3/pins.c diff --git a/ports/raspberrypi/boards/pimoroni_inky_frame_7_3/board.c b/ports/raspberrypi/boards/pimoroni_inky_frame_7_3/board.c new file mode 100644 index 0000000000000..5b4c0fd3a98a7 --- /dev/null +++ b/ports/raspberrypi/boards/pimoroni_inky_frame_7_3/board.c @@ -0,0 +1,196 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2021 Scott Shawcroft for Adafruit Industries + * + * 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 "supervisor/board.h" + +#include "mpconfigboard.h" +#include "shared-bindings/board/__init__.h" +#include "shared-bindings/busio/SPI.h" +#include "shared-bindings/displayio/FourWire.h" +#include "shared-bindings/microcontroller/Pin.h" +#include "shared-bindings/time/__init__.h" +#include "shared-module/displayio/__init__.h" +#include "supervisor/shared/board.h" + +#define DELAY 0x80 + +// This is an SPD1656 control chip. The display is a 5.7" ACeP EInk. + +digitalio_digitalinout_obj_t sr_clock; +digitalio_digitalinout_obj_t sr_data; +digitalio_digitalinout_obj_t sr_latch; + +enum reg { + PSR = 0x00, + PWR = 0x01, + POF = 0x02, + PFS = 0x03, + PON = 0x04, + BTST1 = 0x05, + BTST2 = 0x06, + DSLP = 0x07, + BTST3 = 0x08, + DTM1 = 0x10, + DSP = 0x11, + DRF = 0x12, + IPC = 0x13, + PLL = 0x30, + TSC = 0x40, + TSE = 0x41, + TSW = 0x42, + TSR = 0x43, + CDI = 0x50, + LPD = 0x51, + TCON = 0x60, + TRES = 0x61, + DAM = 0x65, + REV = 0x70, + FLG = 0x71, + AMV = 0x80, + VV = 0x81, + VDCS = 0x82, + T_VDCS = 0x84, + AGID = 0x86, + CMDH = 0xAA, + CCSET =0xE0, + PWS = 0xE3, + TSSET = 0xE6 // E5 or E6 +}; + +const uint8_t display_start_sequence[] = { + CMDH, 6, 0x49, 0x55, 0x20, 0x08, 0x09, 0x18, + PWR, 6, 0x3F, 0x00, 0x32, 0x2A, 0x0E, 0x2A, + PSR, 2, 0x53, 0x69, + PFS, 4, 0x00, 0x54, 0x00, 0x44, + BTST1, 4, 0x40, 0x1F, 0x1F, 0x2C, + BTST2, 4, 0x6F, 0x1F, 0x16, 0x25, + BTST3, 4, 0x6F, 0x1F, 0x1F, 0x22, + IPC, 2, 0x00, 0x04, + PLL, 1, 0x02, + TSE, 1, 0x00, + CDI, 1, 0x3F, + TCON, 2, 0x02, 0x00, + TRES, 4, 0x03, 0x20, 0x01, 0xE0, + VDCS, 1, 0x1E, + T_VDCS, 1, 0x00, + AGID, 1, 0x00, + PWS, 1, 0x2F, + CCSET, 1, 0x00, + TSSET, 1, 0x00, +}; + +const uint8_t display_stop_sequence[] = { + POF, 0, +}; + +const uint8_t refresh_sequence[] = { + PON, DELAY | 1, 0xc8, 0x00, + DRF, 1, 0x00, +}; + +bool displayio_epaperdisplay_query_busy(displayio_epaperdisplay_obj_t *self) { + common_hal_digitalio_digitalinout_set_value(&sr_latch, false); + common_hal_time_delay_ms(1); + common_hal_digitalio_digitalinout_set_value(&sr_latch, true); + common_hal_time_delay_ms(1); + + uint8_t result = 0; + uint8_t bits = 8; + while(bits--) { + result <<= 1; + result |= common_hal_digitalio_digitalinout_get_value(&sr_data); + + common_hal_digitalio_digitalinout_set_value(&sr_clock, false); + common_hal_time_delay_ms(1); + common_hal_digitalio_digitalinout_set_value(&sr_clock, true); + common_hal_time_delay_ms(1); + } + + // mp_printf(MICROPY_DEBUG_PRINTER, "busy check: %d", result); + return result & 0x40; +} + +void board_init(void) { + + common_hal_digitalio_digitalinout_construct(&sr_clock, &pin_GPIO8); + common_hal_digitalio_digitalinout_switch_to_output(&sr_clock, false, DRIVE_MODE_PUSH_PULL); + + common_hal_digitalio_digitalinout_construct(&sr_data, &pin_GPIO10); + common_hal_digitalio_digitalinout_switch_to_input(&sr_data, PULL_NONE); + + common_hal_digitalio_digitalinout_construct(&sr_latch, &pin_GPIO9); + common_hal_digitalio_digitalinout_switch_to_output(&sr_latch, true, DRIVE_MODE_PUSH_PULL); + + displayio_fourwire_obj_t *bus = &allocate_display_bus()->fourwire_bus; + busio_spi_obj_t *spi = common_hal_board_create_spi(0); + + bus->base.type = &displayio_fourwire_type; + common_hal_displayio_fourwire_construct(bus, + spi, + &pin_GPIO28, // EPD_DC Command or data + &pin_GPIO17, // EPD_CS Chip select + &pin_GPIO27, // EPD_RST Reset + 1000000, // Baudrate + 0, // Polarity + 0); // Phase + + displayio_epaperdisplay_obj_t *display = &allocate_display()->epaper_display; + display->base.type = &displayio_epaperdisplay_type; + common_hal_displayio_epaperdisplay_construct( + display, + bus, + display_start_sequence, sizeof(display_start_sequence), + 1.0, // start up time + display_stop_sequence, sizeof(display_stop_sequence), + 800, // width + 480, // height + 800, // ram_width + 480, // ram_height + 0, // colstart + 0, // rowstart + 180, // rotation + NO_COMMAND, // set_column_window_command + NO_COMMAND, // set_row_window_command + NO_COMMAND, // set_current_column_command + NO_COMMAND, // set_current_row_command + 0x10, // write_black_ram_command + false, // black_bits_inverted + NO_COMMAND, // write_color_ram_command + false, // color_bits_inverted + 0x000000, // highlight_color + refresh_sequence, sizeof(refresh_sequence), + 8.0, // refresh_time + NULL, // busy_pin + false, // busy_state + 10.0, // seconds_per_frame + false, // always_toggle_chip_select + false, // grayscale + true, // acep + false, // two_byte_sequence_length + false); // address_little_endian +} + +// Use the MP_WEAK supervisor/shared/board.c versions of routines not defined here. diff --git a/ports/raspberrypi/boards/pimoroni_inky_frame_7_3/link.ld b/ports/raspberrypi/boards/pimoroni_inky_frame_7_3/link.ld new file mode 100644 index 0000000000000..e814bead4c51e --- /dev/null +++ b/ports/raspberrypi/boards/pimoroni_inky_frame_7_3/link.ld @@ -0,0 +1 @@ +firmware_size = 1532k; diff --git a/ports/raspberrypi/boards/pimoroni_inky_frame_7_3/mpconfigboard.h b/ports/raspberrypi/boards/pimoroni_inky_frame_7_3/mpconfigboard.h new file mode 100644 index 0000000000000..1e9343101e6c5 --- /dev/null +++ b/ports/raspberrypi/boards/pimoroni_inky_frame_7_3/mpconfigboard.h @@ -0,0 +1,17 @@ +#define MICROPY_HW_BOARD_NAME "Pimoroni Inky Frame 7.3" +#define MICROPY_HW_MCU_NAME "rp2040" + +#define CIRCUITPY_DIGITALIO_HAVE_INVALID_PULL (1) +#define CIRCUITPY_DIGITALIO_HAVE_INVALID_DRIVE_MODE (1) + +#define MICROPY_HW_LED_STATUS (&pin_GPIO6) + +#define DEFAULT_I2C_BUS_SCL (&pin_GPIO4) +#define DEFAULT_I2C_BUS_SDA (&pin_GPIO5) + +#define DEFAULT_UART_BUS_TX (&pin_GPIO0) +#define DEFAULT_UART_BUS_RX (&pin_GPIO1) + +#define DEFAULT_SPI_BUS_SCK (&pin_GPIO18) +#define DEFAULT_SPI_BUS_MOSI (&pin_GPIO19) +#define DEFAULT_SPI_BUS_MISO (&pin_GPIO16) diff --git a/ports/raspberrypi/boards/pimoroni_inky_frame_7_3/mpconfigboard.mk b/ports/raspberrypi/boards/pimoroni_inky_frame_7_3/mpconfigboard.mk new file mode 100644 index 0000000000000..50fa2f97c78b4 --- /dev/null +++ b/ports/raspberrypi/boards/pimoroni_inky_frame_7_3/mpconfigboard.mk @@ -0,0 +1,26 @@ +USB_VID = 0x2E8A +USB_PID = 0x1018 +USB_PRODUCT = "Inky Frame 7.3" +USB_MANUFACTURER = "Pimoroni" + +CHIP_VARIANT = RP2040 +CHIP_FAMILY = rp2 + +EXTERNAL_FLASH_DEVICES = "W25Q16JVxQ" + +CIRCUITPY__EVE = 1 + +CIRCUITPY_CYW43 = 1 +CIRCUITPY_SSL = 1 +CIRCUITPY_SSL_MBEDTLS = 1 +CIRCUITPY_HASHLIB = 1 +CIRCUITPY_WEB_WORKFLOW = 1 +CIRCUITPY_MDNS = 1 +CIRCUITPY_SOCKETPOOL = 1 +CIRCUITPY_WIFI = 1 + +CFLAGS += -DCYW43_PIN_WL_HOST_WAKE=24 -DCYW43_PIN_WL_REG_ON=23 -DCYW43_WL_GPIO_COUNT=3 -DCYW43_WL_GPIO_LED_PIN=0 +# Must be accompanied by a linker script change +CFLAGS += -DCIRCUITPY_FIRMWARE_SIZE='(1536 * 1024)' + +FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_NeoPixel diff --git a/ports/raspberrypi/boards/pimoroni_inky_frame_7_3/pico-sdk-configboard.h b/ports/raspberrypi/boards/pimoroni_inky_frame_7_3/pico-sdk-configboard.h new file mode 100644 index 0000000000000..36da55d457197 --- /dev/null +++ b/ports/raspberrypi/boards/pimoroni_inky_frame_7_3/pico-sdk-configboard.h @@ -0,0 +1 @@ +// Put board-specific pico-sdk definitions here. This file must exist. diff --git a/ports/raspberrypi/boards/pimoroni_inky_frame_7_3/pins.c b/ports/raspberrypi/boards/pimoroni_inky_frame_7_3/pins.c new file mode 100644 index 0000000000000..4496790c6cb22 --- /dev/null +++ b/ports/raspberrypi/boards/pimoroni_inky_frame_7_3/pins.c @@ -0,0 +1,52 @@ +#include "shared-bindings/board/__init__.h" + +#include "supervisor/board.h" +#include "shared-module/displayio/__init__.h" + +STATIC const mp_rom_map_elem_t board_module_globals_table[] = { + CIRCUITPYTHON_BOARD_DICT_STANDARD_ITEMS + + { MP_ROM_QSTR(MP_QSTR_TX), MP_ROM_PTR(&pin_GPIO0) }, + { MP_ROM_QSTR(MP_QSTR_RX), MP_ROM_PTR(&pin_GPIO1) }, + { MP_ROM_QSTR(MP_QSTR_HOLD_SYS_EN), MP_ROM_PTR(&pin_GPIO2) }, + { MP_ROM_QSTR(MP_QSTR_I2C_INT), MP_ROM_PTR(&pin_GPIO3) }, + + { MP_ROM_QSTR(MP_QSTR_SDA), MP_ROM_PTR(&pin_GPIO4) }, + { MP_ROM_QSTR(MP_QSTR_SCL), MP_ROM_PTR(&pin_GPIO5) }, + + { MP_ROM_QSTR(MP_QSTR_LED_ACT), MP_ROM_PTR(&pin_GPIO6) }, + { MP_ROM_QSTR(MP_QSTR_LED), MP_ROM_PTR(&pin_GPIO6) }, + { MP_ROM_QSTR(MP_QSTR_LED_CONN), MP_ROM_PTR(&pin_GPIO7) }, + { MP_ROM_QSTR(MP_QSTR_SWITCH_CLK), MP_ROM_PTR(&pin_GPIO8) }, + { MP_ROM_QSTR(MP_QSTR_SWITCH_LATCH), MP_ROM_PTR(&pin_GPIO9) }, + { MP_ROM_QSTR(MP_QSTR_SWITCH_OUT), MP_ROM_PTR(&pin_GPIO10) }, + { MP_ROM_QSTR(MP_QSTR_LED_A), MP_ROM_PTR(&pin_GPIO11) }, + { MP_ROM_QSTR(MP_QSTR_LED_B), MP_ROM_PTR(&pin_GPIO12) }, + { MP_ROM_QSTR(MP_QSTR_LED_C), MP_ROM_PTR(&pin_GPIO13) }, + { MP_ROM_QSTR(MP_QSTR_LED_D), MP_ROM_PTR(&pin_GPIO14) }, + { MP_ROM_QSTR(MP_QSTR_LED_E), MP_ROM_PTR(&pin_GPIO15) }, + + { MP_ROM_QSTR(MP_QSTR_MISO), MP_ROM_PTR(&pin_GPIO16) }, + { MP_ROM_QSTR(MP_QSTR_INKY_CS), MP_ROM_PTR(&pin_GPIO17) }, + { MP_ROM_QSTR(MP_QSTR_SCLK), MP_ROM_PTR(&pin_GPIO18) }, + { MP_ROM_QSTR(MP_QSTR_MOSI), MP_ROM_PTR(&pin_GPIO19) }, + { MP_ROM_QSTR(MP_QSTR_SD_DAT1), MP_ROM_PTR(&pin_GPIO20) }, + { MP_ROM_QSTR(MP_QSTR_SD_DAT2), MP_ROM_PTR(&pin_GPIO21) }, + { MP_ROM_QSTR(MP_QSTR_SD_CS), MP_ROM_PTR(&pin_GPIO22) }, + + { MP_ROM_QSTR(MP_QSTR_A0), MP_ROM_PTR(&pin_GPIO26) }, + + { MP_ROM_QSTR(MP_QSTR_INKY_RES), MP_ROM_PTR(&pin_GPIO27) }, + { MP_ROM_QSTR(MP_QSTR_INKY_DC), MP_ROM_PTR(&pin_GPIO28) }, + + { MP_ROM_QSTR(MP_QSTR_SMPS_MODE), MP_ROM_PTR(&pin_CYW1) }, + { MP_ROM_QSTR(MP_QSTR_VBUS_SENSE), MP_ROM_PTR(&pin_CYW2) }, + + { MP_ROM_QSTR(MP_QSTR_I2C), MP_ROM_PTR(&board_i2c_obj) }, + { MP_ROM_QSTR(MP_QSTR_STEMMA_I2C), MP_ROM_PTR(&board_i2c_obj) }, + { MP_ROM_QSTR(MP_QSTR_SPI), MP_ROM_PTR(&board_spi_obj) }, + { MP_ROM_QSTR(MP_QSTR_UART), MP_ROM_PTR(&board_uart_obj) }, + + { MP_ROM_QSTR(MP_QSTR_DISPLAY), MP_ROM_PTR(&displays[0].epaper_display)}, +}; +MP_DEFINE_CONST_DICT(board_module_globals, board_module_globals_table); diff --git a/shared-module/displayio/EPaperDisplay.c b/shared-module/displayio/EPaperDisplay.c index e79c6927668e6..030b2240e8d1b 100644 --- a/shared-module/displayio/EPaperDisplay.c +++ b/shared-module/displayio/EPaperDisplay.c @@ -155,11 +155,16 @@ uint16_t common_hal_displayio_epaperdisplay_get_height(displayio_epaperdisplay_o return displayio_display_core_get_height(&self->core); } -STATIC void wait_for_busy(displayio_epaperdisplay_obj_t *self) { - if (self->busy.base.type == &mp_type_NoneType) { - return; +MP_WEAK bool displayio_epaperdisplay_query_busy(displayio_epaperdisplay_obj_t *self) { + if (self->busy.base.type != &mp_type_NoneType) { + return common_hal_digitalio_digitalinout_get_value(&self->busy) == self->busy_state; } - while (common_hal_digitalio_digitalinout_get_value(&self->busy) == self->busy_state) { + return false; +} + +STATIC void wait_for_busy(displayio_epaperdisplay_obj_t *self) { + mp_printf(MICROPY_DEBUG_PRINTER, "busy_wait\n"); + while (displayio_epaperdisplay_query_busy(self)) { RUN_BACKGROUND_TASKS; } } @@ -178,8 +183,12 @@ STATIC void send_command_sequence(displayio_epaperdisplay_obj_t *self, data = cmd + 3; } displayio_display_core_begin_transaction(&self->core); + mp_printf(MICROPY_DEBUG_PRINTER, "command: 0x%02x\n", sequence[i]); + mp_printf(MICROPY_DEBUG_PRINTER, "data (%d): ", data_size); + mp_printf(MICROPY_DEBUG_PRINTER, "\n"); self->core.send(self->core.bus, DISPLAY_COMMAND, self->chip_select, cmd, 1); self->core.send(self->core.bus, DISPLAY_DATA, self->chip_select, data, data_size); + displayio_display_core_end_transaction(&self->core); uint16_t delay_length_ms = 0; if (delay) { @@ -273,6 +282,7 @@ mp_obj_t common_hal_displayio_epaperdisplay_get_root_group(displayio_epaperdispl } STATIC bool displayio_epaperdisplay_refresh_area(displayio_epaperdisplay_obj_t *self, const displayio_area_t *area) { + mp_printf(MICROPY_DEBUG_PRINTER, "_refresh_area\n"); uint16_t buffer_size = 128; // In uint32_ts displayio_area_t clipped; @@ -322,6 +332,7 @@ STATIC bool displayio_epaperdisplay_refresh_area(displayio_epaperdisplay_obj_t * write_command = self->write_color_ram_command; } displayio_display_core_begin_transaction(&self->core); + mp_printf(MICROPY_DEBUG_PRINTER, "command: 0x%02x\n", write_command); self->core.send(self->core.bus, DISPLAY_COMMAND, self->chip_select, &write_command, 1); displayio_display_core_end_transaction(&self->core); @@ -373,6 +384,8 @@ STATIC bool displayio_epaperdisplay_refresh_area(displayio_epaperdisplay_obj_t * // Can't acquire display bus; skip the rest of the data. Try next display. return false; } + mp_printf(MICROPY_DEBUG_PRINTER, "graphics (%d): ", subrectangle_size_bytes); + mp_printf(MICROPY_DEBUG_PRINTER, "\n"); self->core.send(self->core.bus, DISPLAY_DATA, self->chip_select, (uint8_t *)buffer, subrectangle_size_bytes); displayio_display_core_end_transaction(&self->core); @@ -388,6 +401,7 @@ STATIC bool displayio_epaperdisplay_refresh_area(displayio_epaperdisplay_obj_t * } STATIC bool _clean_area(displayio_epaperdisplay_obj_t *self) { + mp_printf(MICROPY_DEBUG_PRINTER, "_clean_area\n"); uint16_t width = displayio_display_core_get_width(&self->core); uint16_t height = displayio_display_core_get_height(&self->core); @@ -396,6 +410,7 @@ STATIC bool _clean_area(displayio_epaperdisplay_obj_t *self) { uint8_t write_command = self->write_black_ram_command; displayio_display_core_begin_transaction(&self->core); + mp_printf(MICROPY_DEBUG_PRINTER, "command: 0x%02x\n", write_command); self->core.send(self->core.bus, DISPLAY_COMMAND, self->chip_select, &write_command, 1); displayio_display_core_end_transaction(&self->core); @@ -404,6 +419,8 @@ STATIC bool _clean_area(displayio_epaperdisplay_obj_t *self) { // Can't acquire display bus; skip the rest of the data. Try next display. return false; } + mp_printf(MICROPY_DEBUG_PRINTER, "graphics (%d): ", width/2); + mp_printf(MICROPY_DEBUG_PRINTER, "\n"); self->core.send(self->core.bus, DISPLAY_DATA, self->chip_select, buffer, width / 2); displayio_display_core_end_transaction(&self->core); diff --git a/shared-module/displayio/EPaperDisplay.h b/shared-module/displayio/EPaperDisplay.h index 13cf84dbd3106..4db10d772c939 100644 --- a/shared-module/displayio/EPaperDisplay.h +++ b/shared-module/displayio/EPaperDisplay.h @@ -66,5 +66,6 @@ void release_epaperdisplay(displayio_epaperdisplay_obj_t *self); size_t maybe_refresh_epaperdisplay(void); void displayio_epaperdisplay_collect_ptrs(displayio_epaperdisplay_obj_t *self); +bool displayio_epaperdisplay_query_busy(displayio_epaperdisplay_obj_t *self); #endif // MICROPY_INCLUDED_SHARED_MODULE_DISPLAYIO_EPAPERDISPLAY_H From 0513fb022f5781b43e5a4ab99b100dc7420da916 Mon Sep 17 00:00:00 2001 From: Harold De Armas Date: Tue, 23 May 2023 23:18:35 -0700 Subject: [PATCH 2/2] Update startup sequence to match Adafruit_CircuitPython_ACeP7In It's hard to argue with success, it "just works". Also incorporate some of the pending changes for the inky 5.7 as well --- .../boards/pimoroni_inky_frame_7_3/board.c | 19 +++++++--- .../pimoroni_inky_frame_7_3/inky-shared.h | 8 ++++ .../pimoroni_inky_frame_7_3/mpconfigboard.mk | 5 ++- .../boards/pimoroni_inky_frame_7_3/pins.c | 37 +++++++++++++++++++ shared-module/displayio/EPaperDisplay.c | 12 ------ 5 files changed, 63 insertions(+), 18 deletions(-) create mode 100644 ports/raspberrypi/boards/pimoroni_inky_frame_7_3/inky-shared.h diff --git a/ports/raspberrypi/boards/pimoroni_inky_frame_7_3/board.c b/ports/raspberrypi/boards/pimoroni_inky_frame_7_3/board.c index 5b4c0fd3a98a7..abc0b525c3777 100644 --- a/ports/raspberrypi/boards/pimoroni_inky_frame_7_3/board.c +++ b/ports/raspberrypi/boards/pimoroni_inky_frame_7_3/board.c @@ -37,7 +37,9 @@ #define DELAY 0x80 -// This is an SPD1656 control chip. The display is a 5.7" ACeP EInk. +// This is a 7.3" ACeP EInk. + +digitalio_digitalinout_obj_t enable_pin_obj; digitalio_digitalinout_obj_t sr_clock; digitalio_digitalinout_obj_t sr_data; @@ -83,7 +85,7 @@ enum reg { const uint8_t display_start_sequence[] = { CMDH, 6, 0x49, 0x55, 0x20, 0x08, 0x09, 0x18, PWR, 6, 0x3F, 0x00, 0x32, 0x2A, 0x0E, 0x2A, - PSR, 2, 0x53, 0x69, + PSR, 2, 0x5F, 0x69, PFS, 4, 0x00, 0x54, 0x00, 0x44, BTST1, 4, 0x40, 0x1F, 0x1F, 0x2C, BTST2, 4, 0x6F, 0x1F, 0x16, 0x25, @@ -100,6 +102,7 @@ const uint8_t display_start_sequence[] = { PWS, 1, 0x2F, CCSET, 1, 0x00, TSSET, 1, 0x00, + PON, DELAY, 0xc8, }; const uint8_t display_stop_sequence[] = { @@ -107,7 +110,6 @@ const uint8_t display_stop_sequence[] = { }; const uint8_t refresh_sequence[] = { - PON, DELAY | 1, 0xc8, 0x00, DRF, 1, 0x00, }; @@ -134,6 +136,13 @@ bool displayio_epaperdisplay_query_busy(displayio_epaperdisplay_obj_t *self) { } void board_init(void) { + // Drive the EN_3V3 pin high so the board stays awake on battery power + enable_pin_obj.base.type = &digitalio_digitalinout_type; + common_hal_digitalio_digitalinout_construct(&enable_pin_obj, &pin_GPIO2); + common_hal_digitalio_digitalinout_switch_to_output(&enable_pin_obj, true, DRIVE_MODE_PUSH_PULL); + + // Never reset + common_hal_digitalio_digitalinout_never_reset(&enable_pin_obj); common_hal_digitalio_digitalinout_construct(&sr_clock, &pin_GPIO8); common_hal_digitalio_digitalinout_switch_to_output(&sr_clock, false, DRIVE_MODE_PUSH_PULL); @@ -182,10 +191,10 @@ void board_init(void) { false, // color_bits_inverted 0x000000, // highlight_color refresh_sequence, sizeof(refresh_sequence), - 8.0, // refresh_time + 80.0, // refresh_time NULL, // busy_pin false, // busy_state - 10.0, // seconds_per_frame + 80.0, // seconds_per_frame false, // always_toggle_chip_select false, // grayscale true, // acep diff --git a/ports/raspberrypi/boards/pimoroni_inky_frame_7_3/inky-shared.h b/ports/raspberrypi/boards/pimoroni_inky_frame_7_3/inky-shared.h new file mode 100644 index 0000000000000..6f85d68002855 --- /dev/null +++ b/ports/raspberrypi/boards/pimoroni_inky_frame_7_3/inky-shared.h @@ -0,0 +1,8 @@ +#ifndef PIMORONI_INKY_SHARED +#define PIMORONI_INKY_SHARED + +#include "shared-bindings/digitalio/DigitalInOut.h" + +extern digitalio_digitalinout_obj_t enable_pin_obj; + +#endif // PIMORONI_INKY_SHARED diff --git a/ports/raspberrypi/boards/pimoroni_inky_frame_7_3/mpconfigboard.mk b/ports/raspberrypi/boards/pimoroni_inky_frame_7_3/mpconfigboard.mk index 50fa2f97c78b4..5ce9c9ecaa0af 100644 --- a/ports/raspberrypi/boards/pimoroni_inky_frame_7_3/mpconfigboard.mk +++ b/ports/raspberrypi/boards/pimoroni_inky_frame_7_3/mpconfigboard.mk @@ -23,4 +23,7 @@ CFLAGS += -DCYW43_PIN_WL_HOST_WAKE=24 -DCYW43_PIN_WL_REG_ON=23 -DCYW43_WL_GPIO_C # Must be accompanied by a linker script change CFLAGS += -DCIRCUITPY_FIRMWARE_SIZE='(1536 * 1024)' -FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_NeoPixel +FROZEN_MPY_DIRS += $(TOP)/frozen/circuitpython-pcf85063a +FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_Register +FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_SD + diff --git a/ports/raspberrypi/boards/pimoroni_inky_frame_7_3/pins.c b/ports/raspberrypi/boards/pimoroni_inky_frame_7_3/pins.c index 4496790c6cb22..1748acbf067cc 100644 --- a/ports/raspberrypi/boards/pimoroni_inky_frame_7_3/pins.c +++ b/ports/raspberrypi/boards/pimoroni_inky_frame_7_3/pins.c @@ -2,6 +2,40 @@ #include "supervisor/board.h" #include "shared-module/displayio/__init__.h" +#include "py/objtuple.h" +#include "py/qstr.h" + +#include "inky-shared.h" + +// for use with keypad.ShiftRegisterKeys: map keycode (bit-number) +// to logical names board.KEYCODES.SW_A etc. +// N.B.: labels and bit-numbers in the schematic are reversed, i.e. +// SW_A on D0 has bit-number 7 + +STATIC const qstr board_keycodes_fields[] = { + MP_QSTR_SW_A, + MP_QSTR_SW_B, + MP_QSTR_SW_C, + MP_QSTR_SW_D, + MP_QSTR_SW_E, + MP_QSTR_RTC_ALARM, + MP_QSTR_EXT_TRIGGER, + MP_QSTR_INKY_BUS +}; + +STATIC MP_DEFINE_ATTRTUPLE( + board_keycodes_obj, + board_keycodes_fields, + 8, + MP_ROM_INT(7), + MP_ROM_INT(6), + MP_ROM_INT(5), + MP_ROM_INT(4), + MP_ROM_INT(3), + MP_ROM_INT(2), + MP_ROM_INT(1), + MP_ROM_INT(0) + ); STATIC const mp_rom_map_elem_t board_module_globals_table[] = { CIRCUITPYTHON_BOARD_DICT_STANDARD_ITEMS @@ -39,6 +73,7 @@ STATIC const mp_rom_map_elem_t board_module_globals_table[] = { { MP_ROM_QSTR(MP_QSTR_INKY_RES), MP_ROM_PTR(&pin_GPIO27) }, { MP_ROM_QSTR(MP_QSTR_INKY_DC), MP_ROM_PTR(&pin_GPIO28) }, + { MP_ROM_QSTR(MP_QSTR_PICO_LED), MP_ROM_PTR(&pin_CYW0) }, { MP_ROM_QSTR(MP_QSTR_SMPS_MODE), MP_ROM_PTR(&pin_CYW1) }, { MP_ROM_QSTR(MP_QSTR_VBUS_SENSE), MP_ROM_PTR(&pin_CYW2) }, @@ -48,5 +83,7 @@ STATIC const mp_rom_map_elem_t board_module_globals_table[] = { { MP_ROM_QSTR(MP_QSTR_UART), MP_ROM_PTR(&board_uart_obj) }, { MP_ROM_QSTR(MP_QSTR_DISPLAY), MP_ROM_PTR(&displays[0].epaper_display)}, + { MP_ROM_QSTR(MP_QSTR_ENABLE_DIO), MP_ROM_PTR(&enable_pin_obj)}, // GP2 + { MP_ROM_QSTR(MP_QSTR_KEYCODES), MP_ROM_PTR(&board_keycodes_obj)}, }; MP_DEFINE_CONST_DICT(board_module_globals, board_module_globals_table); diff --git a/shared-module/displayio/EPaperDisplay.c b/shared-module/displayio/EPaperDisplay.c index 030b2240e8d1b..bd2e5c39806c7 100644 --- a/shared-module/displayio/EPaperDisplay.c +++ b/shared-module/displayio/EPaperDisplay.c @@ -163,7 +163,6 @@ MP_WEAK bool displayio_epaperdisplay_query_busy(displayio_epaperdisplay_obj_t *s } STATIC void wait_for_busy(displayio_epaperdisplay_obj_t *self) { - mp_printf(MICROPY_DEBUG_PRINTER, "busy_wait\n"); while (displayio_epaperdisplay_query_busy(self)) { RUN_BACKGROUND_TASKS; } @@ -183,9 +182,6 @@ STATIC void send_command_sequence(displayio_epaperdisplay_obj_t *self, data = cmd + 3; } displayio_display_core_begin_transaction(&self->core); - mp_printf(MICROPY_DEBUG_PRINTER, "command: 0x%02x\n", sequence[i]); - mp_printf(MICROPY_DEBUG_PRINTER, "data (%d): ", data_size); - mp_printf(MICROPY_DEBUG_PRINTER, "\n"); self->core.send(self->core.bus, DISPLAY_COMMAND, self->chip_select, cmd, 1); self->core.send(self->core.bus, DISPLAY_DATA, self->chip_select, data, data_size); @@ -282,7 +278,6 @@ mp_obj_t common_hal_displayio_epaperdisplay_get_root_group(displayio_epaperdispl } STATIC bool displayio_epaperdisplay_refresh_area(displayio_epaperdisplay_obj_t *self, const displayio_area_t *area) { - mp_printf(MICROPY_DEBUG_PRINTER, "_refresh_area\n"); uint16_t buffer_size = 128; // In uint32_ts displayio_area_t clipped; @@ -332,7 +327,6 @@ STATIC bool displayio_epaperdisplay_refresh_area(displayio_epaperdisplay_obj_t * write_command = self->write_color_ram_command; } displayio_display_core_begin_transaction(&self->core); - mp_printf(MICROPY_DEBUG_PRINTER, "command: 0x%02x\n", write_command); self->core.send(self->core.bus, DISPLAY_COMMAND, self->chip_select, &write_command, 1); displayio_display_core_end_transaction(&self->core); @@ -384,8 +378,6 @@ STATIC bool displayio_epaperdisplay_refresh_area(displayio_epaperdisplay_obj_t * // Can't acquire display bus; skip the rest of the data. Try next display. return false; } - mp_printf(MICROPY_DEBUG_PRINTER, "graphics (%d): ", subrectangle_size_bytes); - mp_printf(MICROPY_DEBUG_PRINTER, "\n"); self->core.send(self->core.bus, DISPLAY_DATA, self->chip_select, (uint8_t *)buffer, subrectangle_size_bytes); displayio_display_core_end_transaction(&self->core); @@ -401,7 +393,6 @@ STATIC bool displayio_epaperdisplay_refresh_area(displayio_epaperdisplay_obj_t * } STATIC bool _clean_area(displayio_epaperdisplay_obj_t *self) { - mp_printf(MICROPY_DEBUG_PRINTER, "_clean_area\n"); uint16_t width = displayio_display_core_get_width(&self->core); uint16_t height = displayio_display_core_get_height(&self->core); @@ -410,7 +401,6 @@ STATIC bool _clean_area(displayio_epaperdisplay_obj_t *self) { uint8_t write_command = self->write_black_ram_command; displayio_display_core_begin_transaction(&self->core); - mp_printf(MICROPY_DEBUG_PRINTER, "command: 0x%02x\n", write_command); self->core.send(self->core.bus, DISPLAY_COMMAND, self->chip_select, &write_command, 1); displayio_display_core_end_transaction(&self->core); @@ -419,8 +409,6 @@ STATIC bool _clean_area(displayio_epaperdisplay_obj_t *self) { // Can't acquire display bus; skip the rest of the data. Try next display. return false; } - mp_printf(MICROPY_DEBUG_PRINTER, "graphics (%d): ", width/2); - mp_printf(MICROPY_DEBUG_PRINTER, "\n"); self->core.send(self->core.bus, DISPLAY_DATA, self->chip_select, buffer, width / 2); displayio_display_core_end_transaction(&self->core);