From 13bc16381b7248d3cfc8434107be2054b2d26b28 Mon Sep 17 00:00:00 2001 From: Alice Grey Date: Tue, 26 Jan 2021 15:29:50 -0600 Subject: [PATCH 01/11] Get RebbleOS compiling on Python 3.9 & Arch --- Apps/System/testapp.c | 2 +- Apps/System/widgettest.c | 2 +- Utilities/stm32_crc.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Apps/System/testapp.c b/Apps/System/testapp.c index cc251a7f..a6e5d696 100644 --- a/Apps/System/testapp.c +++ b/Apps/System/testapp.c @@ -14,7 +14,7 @@ static Window *s_main_window; static Menu *s_menu; -StatusBarLayer *status_bar; +static StatusBarLayer *status_bar; static void testapp_exec_window_unload(Window *window); static void _reset_menu_items(void); diff --git a/Apps/System/widgettest.c b/Apps/System/widgettest.c index a3ce1cb6..4361a682 100644 --- a/Apps/System/widgettest.c +++ b/Apps/System/widgettest.c @@ -18,7 +18,7 @@ const char * const test_name = "Test"; static Window *s_main_window; ActionBarLayer *action_bar; -StatusBarLayer *status_bar; +static StatusBarLayer *status_bar; typedef struct { uint8_t hours; diff --git a/Utilities/stm32_crc.py b/Utilities/stm32_crc.py index 1c0bd08d..40df7848 100644 --- a/Utilities/stm32_crc.py +++ b/Utilities/stm32_crc.py @@ -9,7 +9,7 @@ def process_word(data, crc=0xffffffff): for x in range(0, 4 - len(data)): d_array.insert(0,0) d_array.reverse() - data = d_array.tostring() + data = d_array.tobytes() d = array.array('I', data)[0] crc = crc ^ d From f81a6d5080bfe4b6fe4103420e47033d7a03dbf5 Mon Sep 17 00:00:00 2001 From: Alice Grey Date: Wed, 10 Feb 2021 21:23:40 -0600 Subject: [PATCH 02/11] asterix_vla_dvb2 Initial build config. A lot is probably wrong but it's a start :) --- config.mk | 1 + hw/drivers/nrf52_ls013b7dh03/config.mk | 3 + .../nrf52_ls013b7dh03/nrf52_ls013b7dh03.c | 85 +++++++++++++++++++ .../nrf52_qspi_flash/nrf52_qspi_flash.c | 5 +- hw/platform/asterix/board_config.h | 22 +++++ hw/platform/asterix/config.mk | 16 +++- hw/platform/asterix/platform.h | 17 ++++ 7 files changed, 146 insertions(+), 3 deletions(-) create mode 100644 hw/drivers/nrf52_ls013b7dh03/config.mk create mode 100644 hw/drivers/nrf52_ls013b7dh03/nrf52_ls013b7dh03.c diff --git a/config.mk b/config.mk index c8dc81ab..366061d6 100644 --- a/config.mk +++ b/config.mk @@ -209,6 +209,7 @@ else include hw/chip/nrf52840/config.mk include hw/drivers/nrf52_buttons/config.mk include hw/drivers/nrf52_ls013b7dh05/config.mk +include hw/drivers/nrf52_ls013b7dh03/config.mk include hw/drivers/nrf52_qspi_flash/config.mk include hw/drivers/nrf52_bluetooth/config.mk include hw/platform/asterix/config.mk diff --git a/hw/drivers/nrf52_ls013b7dh03/config.mk b/hw/drivers/nrf52_ls013b7dh03/config.mk new file mode 100644 index 00000000..cad50e61 --- /dev/null +++ b/hw/drivers/nrf52_ls013b7dh03/config.mk @@ -0,0 +1,3 @@ +CFLAGS_driver_nrf52_ls013b7dh03 = -Ihw/drivers/nrf52_ls013b7dh03 + +SRCS_driver_nrf52_ls013b7dh03 = hw/drivers/nrf52_ls013b7dh03/nrf52_ls013b7dh03.c diff --git a/hw/drivers/nrf52_ls013b7dh03/nrf52_ls013b7dh03.c b/hw/drivers/nrf52_ls013b7dh03/nrf52_ls013b7dh03.c new file mode 100644 index 00000000..c6367843 --- /dev/null +++ b/hw/drivers/nrf52_ls013b7dh03/nrf52_ls013b7dh03.c @@ -0,0 +1,85 @@ +/* nrf52_ls013b7dh03.c + * Display driver for LS013B7DH03 attached via SPI to nRF52840 + * RebbleOS + * + * Author: Joshua Wise + */ + +#include "rebbleos.h" +#include "nrfx_spim.h" +#include "nrf_gpio.h" +#include "board_config.h" + +#define DISPLAY_LINES_PER_CHUNK 18 /* 8 chunks per frame */ + +static void _spi_handler(const nrfx_spim_evt_t *p_event, void *p_context) { + display_done_isr(0); +} + +/* XXX: We have enough padding here to do this all in-place... */ +static uint8_t _display_fb[168][18]; +static nrfx_spim_t _display_spi = NRFX_SPIM_INSTANCE(3); +static int _display_curline = 0; + +void hw_display_init() { + nrfx_err_t err; + + nrfx_spim_config_t config = NRFX_SPIM_DEFAULT_CONFIG; + config.mosi_pin = BOARD_DISPLAY_PIN_MOSI; + config.sck_pin = BOARD_DISPLAY_PIN_SCK; + config.ss_pin = BOARD_DISPLAY_PIN_SCS; + config.ss_active_high = true; + config.use_hw_ss = true; /* only available with SPIM3 */ + config.frequency = NRF_SPIM_FREQ_1M; + config.irq_priority = configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY + 1; + + err = nrfx_spim_init(&_display_spi, &config, _spi_handler, NULL); + assert(err == NRFX_SUCCESS); + + DRV_LOG("hw", APP_LOG_LEVEL_INFO, "nrf52_ls013b7dh03: hw_display_init"); +} + +void hw_display_reset() { +} + +void hw_display_start_frame(uint8_t x, uint8_t y) { + _display_curline = 0; + display_done_isr(0); +} + +uint8_t *hw_display_get_buffer(void) { + return (uint8_t *)_display_fb; +} + +static uint8_t _dispbuf[DISPLAY_LINES_PER_CHUNK * 18 + 2]; +static nrfx_spim_xfer_desc_t _spi_desc = NRFX_SPIM_XFER_TX(_dispbuf, 0); + +uint8_t hw_display_process_isr() { + nrfx_err_t err; + + if (_display_curline == 168) + return 1; + + int p = 0; + _dispbuf[p++] = 0x80; + for (int i = 0; i < DISPLAY_LINES_PER_CHUNK; i++) { +#ifdef BOARD_DISPLAY_ROT180 + _dispbuf[p++] = __RBIT(__REV(_display_curline + 1)); + for (int j = 0; j < 18; j++) + _dispbuf[p++] = __RBIT(__REV(_display_fb[_display_curline][j])); +#else + _dispbuf[p++] = __RBIT(__REV(168 - _display_curline)); + for (int j = 0; j < 18; j++) + _dispbuf[p++] = _display_fb[_display_curline][17-j]; +#endif + _dispbuf[p++] = 0; + _display_curline++; + } + _dispbuf[p++] = 0; + + _spi_desc.tx_length = p; + err = nrfx_spim_xfer(&_display_spi, &_spi_desc, 0); + assert(err == NRFX_SUCCESS); + + return 0; +} diff --git a/hw/drivers/nrf52_qspi_flash/nrf52_qspi_flash.c b/hw/drivers/nrf52_qspi_flash/nrf52_qspi_flash.c index 5920fb0a..48e300a3 100644 --- a/hw/drivers/nrf52_qspi_flash/nrf52_qspi_flash.c +++ b/hw/drivers/nrf52_qspi_flash/nrf52_qspi_flash.c @@ -12,9 +12,12 @@ /* Asterix has 128Mbit (16MB) of QSPI flash -- a W25Q128JV. */ #define QSPI_JEDEC_ID_W25Q128JV 0xEF4018 -/* Asterix-Vla has 64Mbit (8MB) of QSPI flash - a XT25F64B. */ +/* Asterix-Vla-dvb1 has 64Mbit (8MB) of QSPI flash - a XT25F64B. */ #define QSPI_JEDEC_ID_XT25F64B 0x0B4017 +/* Asterix-Vla-dvb2 has 64Mbit (8MB) of QSPI flash - a MX25L64 . */ +#define QSPI_JEDEC_ID_MX25L64 0xc22017 // this may be the wrong code. + #include "board_config.h" #define QSPI_INSTR_JEDEC_ID 0x9F diff --git a/hw/platform/asterix/board_config.h b/hw/platform/asterix/board_config.h index 7a644422..e299fa64 100644 --- a/hw/platform/asterix/board_config.h +++ b/hw/platform/asterix/board_config.h @@ -58,6 +58,28 @@ #define BOARD_DISPLAY_ROT180 +#elif defined(ASTERIX_BOARD_VLA_DVB2) + +#define BOARD_BUTTON_BACK_PIN NRF_GPIO_PIN_MAP(0,27) +#define BOARD_BUTTON_UP_PIN NRF_GPIO_PIN_MAP(0,11) +#define BOARD_BUTTON_SELECT_PIN NRF_GPIO_PIN_MAP(1,00) +#define BOARD_BUTTON_DOWN_PIN NRF_GPIO_PIN_MAP(1,02) + +#define BOARD_DISPLAY_PIN_MOSI 3 +#define BOARD_DISPLAY_PIN_SCK 2 +#define BOARD_DISPLAY_PIN_SCS 25 + +#define BOARD_QSPI_SCK_PIN 17 +#define BOARD_QSPI_CSN_PIN 17 +#define BOARD_QSPI_IO0_PIN 20 /* MOSI */ +#define BOARD_QSPI_IO1_PIN 24 /* MISO */ + +#define BOARD_QSPI_JEDEC_ID QSPI_JEDEC_ID_MX25L64 // TBD + +#define BOARD_DEBUG_UART_TXD 29 // TBD + +#define BOARD_BACKLIGHT_PIN NRF_GPIO_PIN_MAP(1,04) + #else #error unknown Asterix board diff --git a/hw/platform/asterix/config.mk b/hw/platform/asterix/config.mk index 81952c7d..c9a424f4 100644 --- a/hw/platform/asterix/config.mk +++ b/hw/platform/asterix/config.mk @@ -2,7 +2,6 @@ CFLAGS_asterix_common = $(CFLAGS_nrf52840) CFLAGS_asterix_common += $(CFLAGS_driver_nrf52_buttons) -CFLAGS_asterix_common += $(CFLAGS_driver_nrf52_ls013b7dh05) CFLAGS_asterix_common += $(CFLAGS_driver_nrf52_qspi_flash) CFLAGS_asterix_common += $(CFLAGS_driver_nrf52_bluetooth) CFLAGS_asterix_common += -Ihw/platform/asterix @@ -10,7 +9,6 @@ CFLAGS_asterix_common += -DREBBLE_PLATFORM=asterix -DREBBLE_PLATFORM_TINTIN -DPB SRCS_asterix_common = $(SRCS_nrf52840) SRCS_asterix_common += $(SRCS_driver_nrf52_buttons) -SRCS_asterix_common += $(SRCS_driver_nrf52_ls013b7dh05) SRCS_asterix_common += $(SRCS_driver_nrf52_qspi_flash) SRCS_asterix_common += $(SRCS_driver_nrf52_bluetooth) SRCS_asterix_common += hw/platform/asterix/asterix.c @@ -35,7 +33,9 @@ CFLAGS_asterix += -DASTERIX_BOARD_ASTERIX PLATFORMS += asterix CFLAGS_asterix_vla_dvb1 = $(CFLAGS_asterix_common) +CFLAGS_asterix_vla_dvb1 += $(CFLAGS_driver_nrf52_ls013b7dh05) SRCS_asterix_vla_dvb1 = $(SRCS_asterix_common) +SRCS_asteri_vla_dvb1 += $(SRCS_driver_nrf52_ls013b7dh05) LDFLAGS_asterix_vla_dvb1 = $(LDFLAGS_asterix_common) LIBS_asterix_vla_dvb1 = $(LIBS_asterix_common) HWREV_asterix_vla_dvb1 = asterix_vla_dvb1 @@ -43,3 +43,15 @@ HWREV_asterix_vla_dvb1 = asterix_vla_dvb1 CFLAGS_asterix_vla_dvb1 += -DASTERIX_BOARD_VLA_DVB1 PLATFORMS += asterix_vla_dvb1 + +CFLAGS_asterix_vla_dvb2 = $(CFLAGS_asterix_common) +CFLAGS_asterix_vla_dvb2 += $(CFLAGS_driver_nrf52_ls013b7dh03) +SRCS_asterix_vla_dvb2 = $(SRCS_asterix_common) +SRCS_asterix_vla_dvb2 += $(SRCS_driver_nrf52_ls013b7dh03) +LDFLAGS_asterix_vla_dvb2 = $(LDFLAGS_asterix_common) +LIBS_asterix_vla_dvb2 = $(LIBS_asterix_common) +HWREV_asterix_vla_dvb2 = asterix_vla_dvb2 + +CFLAGS_asterix_vla_dvb2 += -DASTERIX_BOARD_VLA_DVB2 + +PLATFORMS += asterix_vla_dvb2 diff --git a/hw/platform/asterix/platform.h b/hw/platform/asterix/platform.h index ce7e95b8..900fe298 100644 --- a/hw/platform/asterix/platform.h +++ b/hw/platform/asterix/platform.h @@ -50,6 +50,23 @@ #define REGION_FS_N_PAGES ((0x7E0000 - REGION_FS_START) / REGION_FS_PAGE_SIZE) #define REGION_FS_ERASE_SIZE (64*1024) +#elif defined(ASTERIX_BOARD_VLA_DVB2) + +/* Asterix-VLA has 8MB of flash. */ + +/* Bootloader private area: 1MB */ +#define REGION_BOOTLOADER_START 0x0 +#define REGION_BOOTLOADER_SIZE 0x100000 + +/* System resources: 1MB */ +#define REGION_RES_START 0x100000 +#define REGION_RES_SIZE 0x100000 + +/* The rest of the filesystem: 6MB */ +#define REGION_FS_START 0x200000 +#define REGION_FS_PAGE_SIZE 0x2000 +#define REGION_FS_N_PAGES ((0x7E0000 - REGION_FS_START) / REGION_FS_PAGE_SIZE) +#define REGION_FS_ERASE_SIZE (64*1024) #else #error incorrect board From 2d2d7de6054a5c22b1379c95b5296c53a8c2e028 Mon Sep 17 00:00:00 2001 From: Alice Date: Wed, 10 Feb 2021 21:56:47 -0600 Subject: [PATCH 03/11] Update UART pin --- hw/platform/asterix/board_config.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hw/platform/asterix/board_config.h b/hw/platform/asterix/board_config.h index e299fa64..3e6da63c 100644 --- a/hw/platform/asterix/board_config.h +++ b/hw/platform/asterix/board_config.h @@ -76,7 +76,7 @@ #define BOARD_QSPI_JEDEC_ID QSPI_JEDEC_ID_MX25L64 // TBD -#define BOARD_DEBUG_UART_TXD 29 // TBD +#define BOARD_DEBUG_UART_TXD 35 #define BOARD_BACKLIGHT_PIN NRF_GPIO_PIN_MAP(1,04) From 95c19b0eaafc90a3f97a040bafe6727f6bac727d Mon Sep 17 00:00:00 2001 From: Joshua Wise Date: Wed, 10 Feb 2021 23:08:25 -0800 Subject: [PATCH 04/11] stm32_crc: add backwards compatibility, sigh --- Utilities/stm32_crc.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Utilities/stm32_crc.py b/Utilities/stm32_crc.py index 40df7848..ad8119aa 100644 --- a/Utilities/stm32_crc.py +++ b/Utilities/stm32_crc.py @@ -9,7 +9,10 @@ def process_word(data, crc=0xffffffff): for x in range(0, 4 - len(data)): d_array.insert(0,0) d_array.reverse() - data = d_array.tobytes() + try: + data = d_array.tobytes() + except: + data = d_array.tostring() d = array.array('I', data)[0] crc = crc ^ d From 15fd4706a039f25d7db6e084fc9a335196d8c4ee Mon Sep 17 00:00:00 2001 From: Joshua Wise Date: Wed, 10 Feb 2021 23:08:54 -0800 Subject: [PATCH 05/11] asterix_vla_dvb2: fix up pinmappings and flash ID number --- .../nrf52_qspi_flash/nrf52_qspi_flash.c | 6 ++--- hw/platform/asterix/board_config.h | 23 ++++++++++--------- res | 2 +- 3 files changed, 15 insertions(+), 16 deletions(-) diff --git a/hw/drivers/nrf52_qspi_flash/nrf52_qspi_flash.c b/hw/drivers/nrf52_qspi_flash/nrf52_qspi_flash.c index 48e300a3..ea6028de 100644 --- a/hw/drivers/nrf52_qspi_flash/nrf52_qspi_flash.c +++ b/hw/drivers/nrf52_qspi_flash/nrf52_qspi_flash.c @@ -7,17 +7,15 @@ #include #include "rebbleos.h" +#include "nrf_gpio.h" #include "nrfx_qspi.h" /* Asterix has 128Mbit (16MB) of QSPI flash -- a W25Q128JV. */ #define QSPI_JEDEC_ID_W25Q128JV 0xEF4018 -/* Asterix-Vla-dvb1 has 64Mbit (8MB) of QSPI flash - a XT25F64B. */ +/* Asterix-Vla-dvb1 and -dvb2 have 64Mbit (8MB) of QSPI flash - a XT25F64B. */ #define QSPI_JEDEC_ID_XT25F64B 0x0B4017 -/* Asterix-Vla-dvb2 has 64Mbit (8MB) of QSPI flash - a MX25L64 . */ -#define QSPI_JEDEC_ID_MX25L64 0xc22017 // this may be the wrong code. - #include "board_config.h" #define QSPI_INSTR_JEDEC_ID 0x9F diff --git a/hw/platform/asterix/board_config.h b/hw/platform/asterix/board_config.h index 3e6da63c..2dee2978 100644 --- a/hw/platform/asterix/board_config.h +++ b/hw/platform/asterix/board_config.h @@ -62,23 +62,24 @@ #define BOARD_BUTTON_BACK_PIN NRF_GPIO_PIN_MAP(0,27) #define BOARD_BUTTON_UP_PIN NRF_GPIO_PIN_MAP(0,11) -#define BOARD_BUTTON_SELECT_PIN NRF_GPIO_PIN_MAP(1,00) -#define BOARD_BUTTON_DOWN_PIN NRF_GPIO_PIN_MAP(1,02) +#define BOARD_BUTTON_SELECT_PIN NRF_GPIO_PIN_MAP(1,0) +#define BOARD_BUTTON_DOWN_PIN NRF_GPIO_PIN_MAP(1,2) -#define BOARD_DISPLAY_PIN_MOSI 3 -#define BOARD_DISPLAY_PIN_SCK 2 -#define BOARD_DISPLAY_PIN_SCS 25 +#define BOARD_DISPLAY_PIN_MOSI NRF_GPIO_PIN_MAP(0,3) +#define BOARD_DISPLAY_PIN_SCK NRF_GPIO_PIN_MAP(0,2) +#define BOARD_DISPLAY_PIN_SCS NRF_GPIO_PIN_MAP(0,25) -#define BOARD_QSPI_SCK_PIN 17 -#define BOARD_QSPI_CSN_PIN 17 -#define BOARD_QSPI_IO0_PIN 20 /* MOSI */ -#define BOARD_QSPI_IO1_PIN 24 /* MISO */ +#define BOARD_QSPI_SCK_PIN NRF_GPIO_PIN_MAP(0,2) +#define BOARD_QSPI_CSN_PIN NRF_GPIO_PIN_MAP(0,5) +#define BOARD_QSPI_IO0_PIN NRF_GPIO_PIN_MAP(0,3) /* MOSI */ +#define BOARD_QSPI_IO1_PIN NRF_GPIO_PIN_MAP(0,4) /* MISO */ +#define BOARD_QSPI_SHARED_DISPLAY 1 -#define BOARD_QSPI_JEDEC_ID QSPI_JEDEC_ID_MX25L64 // TBD +#define BOARD_QSPI_JEDEC_ID QSPI_JEDEC_ID_XT25F64B #define BOARD_DEBUG_UART_TXD 35 -#define BOARD_BACKLIGHT_PIN NRF_GPIO_PIN_MAP(1,04) +#define BOARD_BACKLIGHT_PIN NRF_GPIO_PIN_MAP(1,4) #else diff --git a/res b/res index 3e53cb2d..4746cac8 160000 --- a/res +++ b/res @@ -1 +1 @@ -Subproject commit 3e53cb2d05818129dd7b8645894ee0b3d8b65fbb +Subproject commit 4746cac86d91ae8a98e2788c80bf27613a33b212 From d6c4b692a65ac88b29f6e6c2485701ced1f83716 Mon Sep 17 00:00:00 2001 From: Joshua Wise Date: Wed, 10 Feb 2021 23:53:23 -0800 Subject: [PATCH 06/11] Add SPI locking mechanism for boards that share SPI interface. Switch vla_dvb2 to ls013b7dh05. --- .../nrf52_ls013b7dh03/nrf52_ls013b7dh03.c | 7 +++ .../nrf52_ls013b7dh05/nrf52_ls013b7dh05.c | 7 +++ .../nrf52_qspi_flash/nrf52_qspi_flash.c | 63 +++++++++++++++++++ hw/platform/asterix/board_config.h | 2 + hw/platform/asterix/config.mk | 4 +- 5 files changed, 81 insertions(+), 2 deletions(-) diff --git a/hw/drivers/nrf52_ls013b7dh03/nrf52_ls013b7dh03.c b/hw/drivers/nrf52_ls013b7dh03/nrf52_ls013b7dh03.c index c6367843..5ad40b1c 100644 --- a/hw/drivers/nrf52_ls013b7dh03/nrf52_ls013b7dh03.c +++ b/hw/drivers/nrf52_ls013b7dh03/nrf52_ls013b7dh03.c @@ -12,7 +12,13 @@ #define DISPLAY_LINES_PER_CHUNK 18 /* 8 chunks per frame */ +#ifdef BOARD_QSPI_SHARED_DISPLAY +extern void nrf52_spi_lock(); +extern void nrf52_spi_unlock(); +#endif + static void _spi_handler(const nrfx_spim_evt_t *p_event, void *p_context) { + nrf52_spi_unlock(); display_done_isr(0); } @@ -78,6 +84,7 @@ uint8_t hw_display_process_isr() { _dispbuf[p++] = 0; _spi_desc.tx_length = p; + nrf52_spi_lock(); /* handled in _spi_handler */ err = nrfx_spim_xfer(&_display_spi, &_spi_desc, 0); assert(err == NRFX_SUCCESS); diff --git a/hw/drivers/nrf52_ls013b7dh05/nrf52_ls013b7dh05.c b/hw/drivers/nrf52_ls013b7dh05/nrf52_ls013b7dh05.c index 3a5a6ca6..52726bd9 100644 --- a/hw/drivers/nrf52_ls013b7dh05/nrf52_ls013b7dh05.c +++ b/hw/drivers/nrf52_ls013b7dh05/nrf52_ls013b7dh05.c @@ -12,7 +12,13 @@ #define DISPLAY_LINES_PER_CHUNK 21 /* 8 chunks per frame */ +#ifdef BOARD_QSPI_SHARED_DISPLAY +extern void nrf52_spi_lock(); +extern void nrf52_spi_unlock(); +#endif + static void _spi_handler(const nrfx_spim_evt_t *p_event, void *p_context) { + nrf52_spi_unlock(); display_done_isr(0); } @@ -78,6 +84,7 @@ uint8_t hw_display_process_isr() { _dispbuf[p++] = 0; _spi_desc.tx_length = p; + nrf52_spi_lock(); /* handled in _spi_handler */ err = nrfx_spim_xfer(&_display_spi, &_spi_desc, 0); assert(err == NRFX_SUCCESS); diff --git a/hw/drivers/nrf52_qspi_flash/nrf52_qspi_flash.c b/hw/drivers/nrf52_qspi_flash/nrf52_qspi_flash.c index ea6028de..acb0a22c 100644 --- a/hw/drivers/nrf52_qspi_flash/nrf52_qspi_flash.c +++ b/hw/drivers/nrf52_qspi_flash/nrf52_qspi_flash.c @@ -9,6 +9,7 @@ #include "rebbleos.h" #include "nrf_gpio.h" #include "nrfx_qspi.h" +#include "rtoswrap.h" /* Asterix has 128Mbit (16MB) of QSPI flash -- a W25Q128JV. */ #define QSPI_JEDEC_ID_W25Q128JV 0xEF4018 @@ -18,6 +19,52 @@ #include "board_config.h" +#if BOARD_QSPI_SHARED_DISPLAY +/* XXX: abstraction violation: would be nice not to call into rtoswrap stuff + * in HAL */ +static StaticSemaphore_t _nrf52_spi_lock_buf; +static SemaphoreHandle_t _nrf52_spi_lock; + +void nrf52_spi_lock() { + xSemaphoreTake(_nrf52_spi_lock, portMAX_DELAY); +} + +void nrf52_spi_unlock() { + if (xPortIsInsideInterrupt()) { + BaseType_t woken = pdFALSE; + + xSemaphoreGiveFromISR(_nrf52_spi_lock, &woken); + portYIELD_FROM_ISR(woken); + + return; + } + + xSemaphoreGive(_nrf52_spi_lock); +} + +static void _qspi_prepare() { + nrf52_spi_lock(); + nrf_qspi_enable(NRF_QSPI); +} + +static void _qspi_teardown() { + nrf_qspi_disable(NRF_QSPI); + nrf52_spi_unlock(); +} +#else +void nrf52_spi_lock() { +} + +void nrf52_spi_unlock() { +} + +static void _qspi_prepare() { +} + +static void _qspi_teardown() { +} +#endif + #define QSPI_INSTR_JEDEC_ID 0x9F /* We can have out-of-band flash transactions -- like if we break in with @@ -27,6 +74,7 @@ volatile static int _flash_sync = 0; static void _flash_handler(nrfx_qspi_evt_t event, void *ctx) { assert(event == NRFX_QSPI_EVENT_DONE); + _qspi_teardown(); if (_flash_sync) { _flash_sync = 0; return; @@ -35,6 +83,11 @@ static void _flash_handler(nrfx_qspi_evt_t event, void *ctx) { } void hw_flash_init() { +#if BOARD_QSPI_SHARED_DISPLAY + _nrf52_spi_lock = xSemaphoreCreateBinaryStatic(&_nrf52_spi_lock_buf); + nrf52_spi_unlock(); +#endif + nrfx_qspi_config_t config = NRFX_QSPI_DEFAULT_CONFIG; config.phy_if.sck_freq = NRF_QSPI_FREQ_32MDIV1; config.pins.sck_pin = BOARD_QSPI_SCK_PIN; @@ -62,6 +115,9 @@ void hw_flash_init() { nrf_qspi_cinstr_conf_t instr = NRFX_QSPI_DEFAULT_CINSTR(QSPI_INSTR_JEDEC_ID, 4); uint8_t buf[16]; + + /* We are single-threaded at this stage, so we do not need to + * nrf52_spi_lock(). */ err = nrfx_qspi_cinstr_xfer(&instr, NULL, buf); assert(err == NRFX_SUCCESS && "QSPI JEDEC ID read failed"); @@ -79,6 +135,7 @@ void hw_flash_init() { void hw_flash_read_bytes(uint32_t addr, uint8_t *buf, size_t len) { nrfx_err_t err; + _qspi_prepare(); /* unlocked in ISR */ err = nrfx_qspi_read(buf, len, addr); assert(err == NRFX_SUCCESS); } @@ -87,14 +144,17 @@ void hw_flash_erase_64k_sync(uint32_t addr) { nrfx_err_t err; _flash_sync = 1; + _qspi_prepare(); /* unlocked in ISR */ err = nrfx_qspi_erase(NRF_QSPI_ERASE_LEN_64KB, addr); assert(err == NRFX_SUCCESS); while (_flash_sync) ; + _qspi_prepare(); while (nrfx_qspi_mem_busy_check() != NRFX_SUCCESS) ; + _qspi_teardown(); } int hw_flash_erase_sync(uint32_t addr, uint32_t len) { @@ -116,14 +176,17 @@ int hw_flash_write_sync(uint32_t addr, uint8_t *buf, size_t len) { assert((((uint32_t)buf) & 3) == 0); _flash_sync = 1; + _qspi_prepare(); /* unlocked in ISR */ err = nrfx_qspi_write(buf, len, addr); assert(err == NRFX_SUCCESS); while (_flash_sync) ; + _qspi_prepare(); while (nrfx_qspi_mem_busy_check() != NRFX_SUCCESS) ; + _qspi_teardown(); return 0; } diff --git a/hw/platform/asterix/board_config.h b/hw/platform/asterix/board_config.h index 2dee2978..611f4578 100644 --- a/hw/platform/asterix/board_config.h +++ b/hw/platform/asterix/board_config.h @@ -81,6 +81,8 @@ #define BOARD_BACKLIGHT_PIN NRF_GPIO_PIN_MAP(1,4) +#define BOARD_DISPLAY_ROT180 + #else #error unknown Asterix board diff --git a/hw/platform/asterix/config.mk b/hw/platform/asterix/config.mk index c9a424f4..73436aa0 100644 --- a/hw/platform/asterix/config.mk +++ b/hw/platform/asterix/config.mk @@ -45,9 +45,9 @@ CFLAGS_asterix_vla_dvb1 += -DASTERIX_BOARD_VLA_DVB1 PLATFORMS += asterix_vla_dvb1 CFLAGS_asterix_vla_dvb2 = $(CFLAGS_asterix_common) -CFLAGS_asterix_vla_dvb2 += $(CFLAGS_driver_nrf52_ls013b7dh03) +CFLAGS_asterix_vla_dvb2 += $(CFLAGS_driver_nrf52_ls013b7dh05) SRCS_asterix_vla_dvb2 = $(SRCS_asterix_common) -SRCS_asterix_vla_dvb2 += $(SRCS_driver_nrf52_ls013b7dh03) +SRCS_asterix_vla_dvb2 += $(SRCS_driver_nrf52_ls013b7dh05) LDFLAGS_asterix_vla_dvb2 = $(LDFLAGS_asterix_common) LIBS_asterix_vla_dvb2 = $(LIBS_asterix_common) HWREV_asterix_vla_dvb2 = asterix_vla_dvb2 From 088d68c0fdff00cfda7886ec19474df6209e5a59 Mon Sep 17 00:00:00 2001 From: Alice Grey Date: Thu, 11 Feb 2021 22:31:16 -0600 Subject: [PATCH 07/11] Swap button GPIO pins Correct GPIO pins --- hw/platform/asterix/board_config.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/hw/platform/asterix/board_config.h b/hw/platform/asterix/board_config.h index 611f4578..f473b0c9 100644 --- a/hw/platform/asterix/board_config.h +++ b/hw/platform/asterix/board_config.h @@ -61,8 +61,8 @@ #elif defined(ASTERIX_BOARD_VLA_DVB2) #define BOARD_BUTTON_BACK_PIN NRF_GPIO_PIN_MAP(0,27) -#define BOARD_BUTTON_UP_PIN NRF_GPIO_PIN_MAP(0,11) -#define BOARD_BUTTON_SELECT_PIN NRF_GPIO_PIN_MAP(1,0) +#define BOARD_BUTTON_UP_PIN NRF_GPIO_PIN_MAP(1,0) +#define BOARD_BUTTON_SELECT_PIN NRF_GPIO_PIN_MAP(0,11) #define BOARD_BUTTON_DOWN_PIN NRF_GPIO_PIN_MAP(1,2) #define BOARD_DISPLAY_PIN_MOSI NRF_GPIO_PIN_MAP(0,3) From f907ed16616d3897bb277e33474c0baca8c966f4 Mon Sep 17 00:00:00 2001 From: Alice Grey Date: Sat, 27 Feb 2021 00:33:53 -0600 Subject: [PATCH 08/11] Fix asterix build --- hw/platform/asterix/config.mk | 2 ++ 1 file changed, 2 insertions(+) diff --git a/hw/platform/asterix/config.mk b/hw/platform/asterix/config.mk index 73436aa0..b4ad9797 100644 --- a/hw/platform/asterix/config.mk +++ b/hw/platform/asterix/config.mk @@ -2,6 +2,7 @@ CFLAGS_asterix_common = $(CFLAGS_nrf52840) CFLAGS_asterix_common += $(CFLAGS_driver_nrf52_buttons) +CFLAGS_asterix_common += $(CFLAGS_driver_nrf52_ls013b7dh05) CFLAGS_asterix_common += $(CFLAGS_driver_nrf52_qspi_flash) CFLAGS_asterix_common += $(CFLAGS_driver_nrf52_bluetooth) CFLAGS_asterix_common += -Ihw/platform/asterix @@ -9,6 +10,7 @@ CFLAGS_asterix_common += -DREBBLE_PLATFORM=asterix -DREBBLE_PLATFORM_TINTIN -DPB SRCS_asterix_common = $(SRCS_nrf52840) SRCS_asterix_common += $(SRCS_driver_nrf52_buttons) +SRCS_asterix_common += $(SRCS_driver_nrf52_ls013b7dh05) SRCS_asterix_common += $(SRCS_driver_nrf52_qspi_flash) SRCS_asterix_common += $(SRCS_driver_nrf52_bluetooth) SRCS_asterix_common += hw/platform/asterix/asterix.c From 982d9277368b6ec82c84fd51bb6f47a5baa4e7b2 Mon Sep 17 00:00:00 2001 From: Alice Grey Date: Sat, 27 Feb 2021 00:46:33 -0600 Subject: [PATCH 09/11] Remove nrf52_ls013b7dh03 as it's not needed --- config.mk | 1 - hw/drivers/nrf52_ls013b7dh03/config.mk | 3 - .../nrf52_ls013b7dh03/nrf52_ls013b7dh03.c | 92 ------------------- 3 files changed, 96 deletions(-) delete mode 100644 hw/drivers/nrf52_ls013b7dh03/config.mk delete mode 100644 hw/drivers/nrf52_ls013b7dh03/nrf52_ls013b7dh03.c diff --git a/config.mk b/config.mk index 366061d6..c8dc81ab 100644 --- a/config.mk +++ b/config.mk @@ -209,7 +209,6 @@ else include hw/chip/nrf52840/config.mk include hw/drivers/nrf52_buttons/config.mk include hw/drivers/nrf52_ls013b7dh05/config.mk -include hw/drivers/nrf52_ls013b7dh03/config.mk include hw/drivers/nrf52_qspi_flash/config.mk include hw/drivers/nrf52_bluetooth/config.mk include hw/platform/asterix/config.mk diff --git a/hw/drivers/nrf52_ls013b7dh03/config.mk b/hw/drivers/nrf52_ls013b7dh03/config.mk deleted file mode 100644 index cad50e61..00000000 --- a/hw/drivers/nrf52_ls013b7dh03/config.mk +++ /dev/null @@ -1,3 +0,0 @@ -CFLAGS_driver_nrf52_ls013b7dh03 = -Ihw/drivers/nrf52_ls013b7dh03 - -SRCS_driver_nrf52_ls013b7dh03 = hw/drivers/nrf52_ls013b7dh03/nrf52_ls013b7dh03.c diff --git a/hw/drivers/nrf52_ls013b7dh03/nrf52_ls013b7dh03.c b/hw/drivers/nrf52_ls013b7dh03/nrf52_ls013b7dh03.c deleted file mode 100644 index 5ad40b1c..00000000 --- a/hw/drivers/nrf52_ls013b7dh03/nrf52_ls013b7dh03.c +++ /dev/null @@ -1,92 +0,0 @@ -/* nrf52_ls013b7dh03.c - * Display driver for LS013B7DH03 attached via SPI to nRF52840 - * RebbleOS - * - * Author: Joshua Wise - */ - -#include "rebbleos.h" -#include "nrfx_spim.h" -#include "nrf_gpio.h" -#include "board_config.h" - -#define DISPLAY_LINES_PER_CHUNK 18 /* 8 chunks per frame */ - -#ifdef BOARD_QSPI_SHARED_DISPLAY -extern void nrf52_spi_lock(); -extern void nrf52_spi_unlock(); -#endif - -static void _spi_handler(const nrfx_spim_evt_t *p_event, void *p_context) { - nrf52_spi_unlock(); - display_done_isr(0); -} - -/* XXX: We have enough padding here to do this all in-place... */ -static uint8_t _display_fb[168][18]; -static nrfx_spim_t _display_spi = NRFX_SPIM_INSTANCE(3); -static int _display_curline = 0; - -void hw_display_init() { - nrfx_err_t err; - - nrfx_spim_config_t config = NRFX_SPIM_DEFAULT_CONFIG; - config.mosi_pin = BOARD_DISPLAY_PIN_MOSI; - config.sck_pin = BOARD_DISPLAY_PIN_SCK; - config.ss_pin = BOARD_DISPLAY_PIN_SCS; - config.ss_active_high = true; - config.use_hw_ss = true; /* only available with SPIM3 */ - config.frequency = NRF_SPIM_FREQ_1M; - config.irq_priority = configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY + 1; - - err = nrfx_spim_init(&_display_spi, &config, _spi_handler, NULL); - assert(err == NRFX_SUCCESS); - - DRV_LOG("hw", APP_LOG_LEVEL_INFO, "nrf52_ls013b7dh03: hw_display_init"); -} - -void hw_display_reset() { -} - -void hw_display_start_frame(uint8_t x, uint8_t y) { - _display_curline = 0; - display_done_isr(0); -} - -uint8_t *hw_display_get_buffer(void) { - return (uint8_t *)_display_fb; -} - -static uint8_t _dispbuf[DISPLAY_LINES_PER_CHUNK * 18 + 2]; -static nrfx_spim_xfer_desc_t _spi_desc = NRFX_SPIM_XFER_TX(_dispbuf, 0); - -uint8_t hw_display_process_isr() { - nrfx_err_t err; - - if (_display_curline == 168) - return 1; - - int p = 0; - _dispbuf[p++] = 0x80; - for (int i = 0; i < DISPLAY_LINES_PER_CHUNK; i++) { -#ifdef BOARD_DISPLAY_ROT180 - _dispbuf[p++] = __RBIT(__REV(_display_curline + 1)); - for (int j = 0; j < 18; j++) - _dispbuf[p++] = __RBIT(__REV(_display_fb[_display_curline][j])); -#else - _dispbuf[p++] = __RBIT(__REV(168 - _display_curline)); - for (int j = 0; j < 18; j++) - _dispbuf[p++] = _display_fb[_display_curline][17-j]; -#endif - _dispbuf[p++] = 0; - _display_curline++; - } - _dispbuf[p++] = 0; - - _spi_desc.tx_length = p; - nrf52_spi_lock(); /* handled in _spi_handler */ - err = nrfx_spim_xfer(&_display_spi, &_spi_desc, 0); - assert(err == NRFX_SUCCESS); - - return 0; -} From eea11c3ffc7132584f81c3763c025ea1d9e0f2af Mon Sep 17 00:00:00 2001 From: Alice Grey Date: Sat, 27 Feb 2021 00:52:05 -0600 Subject: [PATCH 10/11] Add dvb2 to CI --- .github/workflows/main.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index f33d7eca..043bb4ef 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -22,3 +22,5 @@ jobs: run: docker run rebbleos make snowy - name: Build asterix run: docker run rebbleos make asterix + - name: Build asterix dvb2 + run: docker run rebbleos make asterix_vla_dvb2 From 902800e423140a29754bd37ee0a4e082a987b765 Mon Sep 17 00:00:00 2001 From: Alice Grey Date: Sat, 27 Feb 2021 00:59:45 -0600 Subject: [PATCH 11/11] Fix dvb2 make Don't edit make files at 1AM --- hw/platform/asterix/config.mk | 4 ---- 1 file changed, 4 deletions(-) diff --git a/hw/platform/asterix/config.mk b/hw/platform/asterix/config.mk index b4ad9797..4428693e 100644 --- a/hw/platform/asterix/config.mk +++ b/hw/platform/asterix/config.mk @@ -35,9 +35,7 @@ CFLAGS_asterix += -DASTERIX_BOARD_ASTERIX PLATFORMS += asterix CFLAGS_asterix_vla_dvb1 = $(CFLAGS_asterix_common) -CFLAGS_asterix_vla_dvb1 += $(CFLAGS_driver_nrf52_ls013b7dh05) SRCS_asterix_vla_dvb1 = $(SRCS_asterix_common) -SRCS_asteri_vla_dvb1 += $(SRCS_driver_nrf52_ls013b7dh05) LDFLAGS_asterix_vla_dvb1 = $(LDFLAGS_asterix_common) LIBS_asterix_vla_dvb1 = $(LIBS_asterix_common) HWREV_asterix_vla_dvb1 = asterix_vla_dvb1 @@ -47,9 +45,7 @@ CFLAGS_asterix_vla_dvb1 += -DASTERIX_BOARD_VLA_DVB1 PLATFORMS += asterix_vla_dvb1 CFLAGS_asterix_vla_dvb2 = $(CFLAGS_asterix_common) -CFLAGS_asterix_vla_dvb2 += $(CFLAGS_driver_nrf52_ls013b7dh05) SRCS_asterix_vla_dvb2 = $(SRCS_asterix_common) -SRCS_asterix_vla_dvb2 += $(SRCS_driver_nrf52_ls013b7dh05) LDFLAGS_asterix_vla_dvb2 = $(LDFLAGS_asterix_common) LIBS_asterix_vla_dvb2 = $(LIBS_asterix_common) HWREV_asterix_vla_dvb2 = asterix_vla_dvb2