Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add support for the Daisy Seed board - stm32H750 #439

Open
wants to merge 7 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@ jobs:
- 'stm32f3'
- 'stm32f4'
- 'stm32h5'
- 'stm32h7'
- 'stm32l4'
with:
port: ${{ matrix.port }}
Expand Down
8 changes: 5 additions & 3 deletions ports/stm32h7/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -22,11 +22,13 @@ include ../rules.mk
# This uf2 will be loaded into RAM
# TODO: this needs to build the actual uf2 binary first
self-update: $(BUILD)/$(OUTNAME).bin
$(PYTHON3) $(TOP)/lib/uf2/utils/uf2conv.py --carray $^ -o apps/self_update/_build/bootloader_bin.c
$(MAKE) -C $(TOP)/$(PORT_DIR)/apps/self_update uf2
@echo "not implemented yet"
# $(PYTHON3) $(TOP)/lib/uf2/utils/uf2conv.py --carray $^ -o apps/self_update/_build/bootloader_bin.c
# $(MAKE) -C $(TOP)/$(PORT_DIR)/apps/self_update uf2

self-update-clean:
$(MAKE) -C $(TOP)/$(PORT_DIR)/apps/self_update clean
@echo "not implemented yet"
# $(MAKE) -C $(TOP)/$(PORT_DIR)/apps/self_update clean

#---------- Erase app ----------
# Compile apps/erase_firmware/erase_firmware.c
Expand Down
13 changes: 11 additions & 2 deletions ports/stm32h7/apps/erase_firmware/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,17 @@ SRC_C += \
$(TOP)/$(PORT_DIR)/boards.c \
$(TOP)/$(PORT_DIR)/board_flash.c \
$(TOP)/$(PORT_DIR)/board_irq.c \
$(TOP)/$(PORT_DIR)/components/w25qxx/w25qxx.c \
$(TOP)/$(PORT_DIR)/components/w25qxx/w25qxx_qspi.c \

ifeq ($(QSPI_FLASH),W25Qx_QSPI)
SRC_C += \
$(TOP)/$(PORT_DIR)/components/w25qxx/w25qxx.c \
$(TOP)/$(PORT_DIR)/components/w25qxx/w25qxx_qspi.c
endif

ifeq ($(QSPI_FLASH),IS25LP064A)
SRC_C += \
$(TOP)/$(PORT_DIR)/components/is25lp064a/is25lp064a_qspi.c
endif

INC += \
$(TOP)/src \
Expand Down
29 changes: 16 additions & 13 deletions ports/stm32h7/apps/self_update/Makefile
Original file line number Diff line number Diff line change
@@ -1,18 +1,21 @@
OUTNAME = self_update-$(BOARD)
# OUTNAME = self_update-$(BOARD)

# skip tinyusb
BUILD_NO_TINYUSB = 1
# # skip tinyusb
# BUILD_NO_TINYUSB = 1

CFLAGS += -DTINYUF2_SELF_UPDATE
# CFLAGS += -DTINYUF2_SELF_UPDATE

SRC_C += \
apps/self_update/self_update.c \
$(TOP)/$(PORT_DIR)/apps/self_update/_build/bootloader_bin.c \
$(TOP)/$(PORT_DIR)/boards.c \
$(TOP)/$(PORT_DIR)/board_hmi.c \
$(TOP)/$(PORT_DIR)/board_irq.c \
# SRC_C += \
# apps/self_update/self_update.c \
# $(TOP)/$(PORT_DIR)/apps/self_update/_build/bootloader_bin.c \
# $(TOP)/$(PORT_DIR)/boards.c \
# $(TOP)/$(PORT_DIR)/board_hmi.c \
# $(TOP)/$(PORT_DIR)/board_irq.c \

INC += \
$(TOP)/src \
# INC += \
# $(TOP)/src \

include ../app.mk
# include ../app.mk

all:
@echo "not implemented yet"
104 changes: 85 additions & 19 deletions ports/stm32h7/board_flash.c
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
#include "board_api.h"
#include "stm32h7xx_hal.h"
#include "qspi_status.h"

#ifdef W25Qx_SPI
#include "components/w25qxx/w25qxx.h"
Expand All @@ -9,11 +10,15 @@
#include "components/w25qxx/w25qxx_qspi.h"
#endif // W25Qx_QSPI

#if BOARD_QSPI_FLASH_EN
#ifdef IS25LP064A
#include "components/is25lp064a/is25lp064a_qspi.h"
#endif

#if defined (BOARD_QSPI_FLASH_EN) && (BOARD_QSPI_FLASH_EN == 1)
QSPI_HandleTypeDef _qspi_flash;
#endif // BOARD_QSPI_FLASH_EN

#if BOARD_SPI_FLASH_EN
#if defined (BOARD_SPI_FLASH_EN) && (BOARD_SPI_FLASH_EN == 1)
SPI_HandleTypeDef _spi_flash;
#endif // BOARD_SPI_FLASH_EN

Expand Down Expand Up @@ -53,6 +58,67 @@ extern volatile uint32_t _board_tmp_boot_magic[];
#define TMP_BOOT_ADDR _board_tmp_boot_addr[0]
#define TMP_BOOT_MAGIC _board_tmp_boot_magic[0]

static void qspi_Init(void) {
#ifdef W25Qx_QSPI
w25qxx_Init();
#endif
#ifdef IS25LP064A
CSP_QSPI_DisableMemoryMappedMode();
CSP_QSPI_ExitQPIMODE();
if (CSP_QUADSPI_Init() != qspi_OK) {
TUF2_LOG1("Error initializing QSPI Flash\r\n");
}
#endif

}

static void qspi_EnterQPI(void) {
#ifdef W25Qx_QSPI
w25qxx_EnterQPI();
#endif
}

static void qspi_Startup(void) {
#ifdef W25Qx_QSPI
w25qxx_Startup(qspi_DTRMode);
#endif
#ifdef IS25LP064A
if (CSP_QSPI_EnableMemoryMappedMode() != qspi_OK) {
TUF2_LOG1("Error enabling memory map for QSPI Flash\r\n");
}
#endif
}

static uint8_t qspi_Read(uint8_t *pData, uint32_t ReadAddr, uint32_t Size) {
#ifdef W25Qx_QSPI
return w25qxx_Read(pData,ReadAddr,Size);
#endif
#ifdef IS25LP064A
return CSP_QSPI_Read(pData, ReadAddr, Size);
#endif
return qspi_OK;
}

static uint8_t qspi_Write(uint8_t* pData, uint32_t WriteAddr, uint32_t Size) {
#ifdef W25Qx_QSPI
return w25qxx_Write(pData,WriteAddr,Size);
#endif
#ifdef IS25LP064A
return CSP_QSPI_Write(pData,WriteAddr,Size);
#endif
return qspi_OK;
}


static void qspi_EraseChip(void) {
#ifdef W25Qx_QSPI
w25qxx_EraseChip();
#endif
#ifdef IS25LP064A
CSP_QSPI_Erase_Chip();
#endif
}

uint32_t board_get_app_start_address(void)
{
if (TMP_BOOT_MAGIC == 0xDEADBEEFU)
Expand All @@ -79,19 +145,19 @@ void board_clear_temp_boot_addr(void)

void board_flash_early_init(void)
{
#if BOARD_QSPI_FLASH_EN
#if defined (BOARD_QSPI_FLASH_EN) && (BOARD_QSPI_FLASH_EN == 1)
// QSPI is initialized early to check for executable code
qspi_flash_init(&_qspi_flash);
// Initialize QSPI driver
w25qxx_Init();
qspi_Init();
// SPI -> QPI
w25qxx_EnterQPI();
qspi_EnterQPI();
#endif // BOARD_QSPI_FLASH_EN
}

void board_flash_init(void)
{
#if BOARD_SPI_FLASH_EN
#if defined (BOARD_SPI_FLASH_EN) && (BOARD_SPI_FLASH_EN == 1)
// Initialize SPI peripheral
spi_flash_init(&_spi_flash);
// Initialize SPI drivers
Expand All @@ -101,10 +167,10 @@ void board_flash_init(void)

void board_flash_deinit(void)
{
#if BOARD_QSPI_FLASH_EN
#if defined (BOARD_QSPI_FLASH_EN) && (BOARD_QSPI_FLASH_EN == 1)
// Enable Memory Mapped Mode
// QSPI flash will be available at 0x90000000U (readonly)
w25qxx_Startup(w25qxx_DTRMode);
qspi_Startup();
#endif // BOARD_QSPI_FLASH_EN
}

Expand All @@ -123,16 +189,16 @@ void board_flash_flush(void)
void board_flash_read(uint32_t addr, void * data, uint32_t len)
{
TUF2_LOG1("Reading %lu byte(s) from 0x%08lx\r\n", len, addr);
#if BOARD_QSPI_FLASH_EN
#if defined (BOARD_QSPI_FLASH_EN) && (BOARD_QSPI_FLASH_EN == 1)
// addr += QSPI_BASE_ADDR;
if (IS_QSPI_ADDR(addr))
{
(void) W25qxx_Read(data, addr - QSPI_BASE_ADDR, len);
(void) qspi_Read(data, addr - QSPI_BASE_ADDR, len);
return;
}
#endif

#if BOARD_AXISRAM_EN
#if defined (BOARD_AXISRAM_EN) && (BOARD_AXISRAM_EN == 1)
if (IS_AXISRAM_ADDR(addr) && IS_AXISRAM_ADDR(addr + len - 1))
{
memcpy(data, (void *) addr, len);
Expand All @@ -156,32 +222,32 @@ bool board_flash_write(uint32_t addr, void const * data, uint32_t len)
{
TUF2_LOG1("Programming %lu byte(s) at 0x%08lx\r\n", len, addr);

// For external flash, W25Qx
// For external flash
// TODO: these should be configurable parameters
// Page size = 256 bytes
// Sector size = 4K bytes
#if (BOARD_SPI_FLASH_EN == 1U)
#if defined (BOARD_SPI_FLASH_EN) && (BOARD_SPI_FLASH_EN == 1U)
if (IS_SPI_ADDR(addr) && IS_SPI_ADDR(addr + len - 1))
{
W25Qx_Write((uint8_t *) data, (addr - SPI_BASE_ADDR), len);
return true;
}
#endif

#if (BOARD_QSPI_FLASH_EN == 1)
#if defined (BOARD_QSPI_FLASH_EN) && (BOARD_QSPI_FLASH_EN == 1)
if (IS_QSPI_ADDR(addr) && IS_QSPI_ADDR(addr + len - 1))
{
// SET_BOOT_ADDR(BOARD_AXISRAM_APP_ADDR);
// handles erasing internally
if (W25qxx_Write((uint8_t *)data, (addr - QSPI_BASE_ADDR), len) != w25qxx_OK)
if (qspi_Write((uint8_t *)data, (addr - QSPI_BASE_ADDR), len) != qspi_OK)
{
__asm("bkpt #9");
}
return true;
}
#endif

#if BOARD_AXISRAM_EN
#if defined (BOARD_AXISRAM_EN) && (BOARD_AXISRAM_EN == 1)
if (IS_AXISRAM_ADDR(addr) && IS_AXISRAM_ADDR(addr + len - 1))
{
// This memory is cached, DCache is cleaned in dfu_complete
Expand Down Expand Up @@ -211,13 +277,13 @@ void board_flash_erase_app(void)
{
board_flash_init();

#if BOARD_QSPI_FLASH_EN
#if defined (BOARD_QSPI_FLASH_EN) && (BOARD_QSPI_FLASH_EN == 1)
TUF2_LOG1("Erasing QSPI Flash\r\n");
// Erase QSPI Flash
(void) W25qxx_EraseChip();
(void) qspi_EraseChip();
#endif

#if BOARD_SPI_FLASH_EN
#if defined(BOARD_SPI_FLASH_EN) && (BOARD_SPI_FLASH_EN == 1)
TUF2_LOG1("Erasing SPI Flash\r\n");
// Erase QSPI Flash
(void) W25Qx_Erase_Chip();
Expand Down
15 changes: 5 additions & 10 deletions ports/stm32h7/board_hmi.c
Original file line number Diff line number Diff line change
Expand Up @@ -19,49 +19,44 @@ void ST7735_Delay(uint32_t ms)
{
HAL_Delay(ms);
}
#endif

void board_display_init(void)
{
#if (TINYUF2_DISPLAY == 1U)
display_init(&_display_spi);
ST7735_Init();
// Clear previous screen
ST7735_FillScreen(ST7735_BLACK);
#endif // TINYUF2_DISPLAY == 1U
}

// The application draws a complete frame in memory and sends it
// line-by-line to the display
void board_display_draw_line(int y, uint16_t* pixel_color, uint32_t pixel_num)
{
#if (TINYUF2_DISPLAY == 1U)
for (uint32_t x = 0; x < pixel_num; x += 1) {
ST7735_DrawPixel(y, x, pixel_color[x]);
}
#endif // TINYUF2_DISPLAY == 1U
}

#endif // TINYUF2_DISPLAY == 1U

//--------------------------------------------------------------------+
// LED pattern
//--------------------------------------------------------------------+
#if defined(TINYUF2_LED)
void board_led_write(uint32_t state)
{
#if defined(TINYUF2_LED)
HAL_GPIO_WritePin(LED_PORT, LED_PIN, state ? GPIO_PIN_SET : GPIO_PIN_RESET);
#endif // defined(LED_PIN)
}
#endif // defined(LED_PIN)

//--------------------------------------------------------------------+
// Button
//--------------------------------------------------------------------+
#if defined(BUTTON_PIN)
uint32_t board_button_read(void)
{
#if defined(BUTTON_PIN)
return (BUTTON_STATE_ACTIVE == HAL_GPIO_ReadPin(BUTTON_PORT, BUTTON_PIN)) ? 1: 0;
#endif // defined(BUTTON_PIN)
}
#endif // defined(BUTTON_PIN)

//--------------------------------------------------------------------+
// Neopixel color for status
Expand Down
Loading
Loading