Skip to content

Add support for Nicla Vision #11

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

Merged
merged 13 commits into from
Apr 8, 2022
Merged
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
7 changes: 4 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@ MCUboot bootloader porting for Arduino [Mbed OS](https://os.mbed.com/docs/mbed-o
The following boards are supported:
* [Portenta H7](https://store.arduino.cc/products/portenta-h7)
* [Portenta H7 Lite](https://store.arduino.cc/products/portenta-h7-lite)
* [Portenta H7 Lite Connected]((https://store.arduino.cc/products/portenta-h7-lite))
* [Portenta H7 Lite Connected](https://store.arduino.cc/products/portenta-h7-lite)
* [Nicla Vision](https://store.arduino.cc/products/nicla-vision)

## :grey_question: What
MCUboot provides secure boot for 32-bit microcontrollers. For a detailed description on what MCUboot does and how it works please read the [official documentaion](https://docs.mcuboot.com/).
Expand Down Expand Up @@ -112,7 +113,7 @@ The following command will setup the mbed environment and clone the needed repos
mbed config root . && mbed deploy
mbed compile -m PORTENTA_H7_M7 -t GCC_ARM --profile=release --profile mbed-os/tools/profiles/extensions/lto.json
```
Additional flags are needed for [Lite](generate_rel.sh#L24) and [Lite Connected](generate_rel.sh#L35) boards.
Additional flags are needed for [Lite](generate_rel.sh#L24), [Lite Connected](generate_rel.sh#L35) and [Nicla Vision](generate_rel.sh#L46) boards.

### Debug

Expand All @@ -121,7 +122,7 @@ Additional flags are needed for [Lite](generate_rel.sh#L24) and [Lite Connected]
- MCUboot idle: The board green LED will fade-in fade-out

2. Serial
- MCUboot debug prints are disabled by default. They can be enabled putting `BT_SEL` (`PI8`) pin `HIGH` or calling `MCUboot::bootDebug(1);` in your Sketch.
- MCUboot debug prints are disabled by default. They can be enabled putting `BT_SEL` (`PI8`) pin `HIGH` if available or calling `MCUboot::bootDebug(1);` in your Sketch.

## :mag_right: Other resources

Expand Down
208 changes: 140 additions & 68 deletions app/board.h
Original file line number Diff line number Diff line change
Expand Up @@ -63,76 +63,148 @@
#define BOARD_EXTCLOCK 25
#endif

#define BOARD_GREEN_LED PK_6
#define BOARD_RED_LED PK_5
#define BOARD_BLUE_LED PK_7
#if BOARD_HAS_VIDEO
#define BOARD_VIDEO_ENABLE PJ_2
#define BOARD_VIDEO_RESET PJ_3
#endif

#define BOARD_BOOT_SEL PI_8
#define BOARD_USB_RESET PJ_4
#if defined TARGET_PORTENTA_H7_M7
#define BOARD_GREEN_LED PK_6
#define BOARD_RED_LED PK_5
#define BOARD_BLUE_LED PK_7

#define BOARD_USB_RESET PJ_4
#define BOARD_BOOT_SEL PI_8

#define BOARD_I2C_SCL PB_6
#define BOARD_I2C_SDA PB_7

#define BOARD_USBD_VID 0x2341
#define BOARD_USBD_PID 0x035B

#define BOARD_USBD_STRING "Portenta H7 MCUboot"

#define BOARD_QSPI_SO0 PD_11
#define BOARD_QSPI_SO1 PD_12
#define BOARD_QSPI_SO2 PF_7
#define BOARD_QSPI_SO3 PD_13
#define BOARD_QSPI_SCK PF_10
#define BOARD_QSPI_CS PG_6

#define BOARD_USB_OTG_FS_DM_DP_PIN (GPIO_PIN_11 | GPIO_PIN_12)
#define BOARD_USB_OTG_FS_DM_DP_MODE (GPIO_MODE_AF_PP)
#define BOARD_USB_OTG_FS_DM_DP_PULL (GPIO_NOPULL)
#define BOARD_USB_OTG_FS_DM_DP_SPEED (GPIO_SPEED_FREQ_VERY_HIGH)
#define BOARD_USB_OTG_FS_DM_DP_ALTERNATE (GPIO_AF10_OTG1_FS)
#define BOARD_USB_OTG_FS_DM_DP_GPIO (GPIOA)

#define BOARD_USB_OTG_HS_CLK_PIN (GPIO_PIN_5)
#define BOARD_USB_OTG_HS_CLK_MODE (GPIO_MODE_AF_PP)
#define BOARD_USB_OTG_HS_CLK_PULL (GPIO_NOPULL)
#define BOARD_USB_OTG_HS_CLK_SPEED (GPIO_SPEED_FREQ_VERY_HIGH)
#define BOARD_USB_OTG_HS_CLK_ALTERNATE (GPIO_AF10_OTG2_HS)
#define BOARD_USB_OTG_HS_CLK_GPIO (GPIOA)

#define BOARD_USB_OTG_HS_D0_PIN (GPIO_PIN_3)
#define BOARD_USB_OTG_HS_D0_MODE (GPIO_MODE_AF_PP)
#define BOARD_USB_OTG_HS_D0_PULL (GPIO_NOPULL)
#define BOARD_USB_OTG_HS_D0_SPEED (GPIO_SPEED_FREQ_VERY_HIGH)
#define BOARD_USB_OTG_HS_D0_ALTERNATE (GPIO_AF10_OTG2_HS)
#define BOARD_USB_OTG_HS_D0_GPIO (GPIOA)

#define BOARD_USB_OTG_HS_D1_D7_PIN (GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_5 | GPIO_PIN_10 | GPIO_PIN_11 | GPIO_PIN_12 | GPIO_PIN_13)
#define BOARD_USB_OTG_HS_D1_D7_MODE (GPIO_MODE_AF_PP)
#define BOARD_USB_OTG_HS_D1_D7_PULL (GPIO_NOPULL)
#define BOARD_USB_OTG_HS_D1_D7_ALTERNATE (GPIO_AF10_OTG2_HS)
#define BOARD_USB_OTG_HS_D1_D7_GPIO (GPIOB)

#define BOARD_USB_OTG_HS_STP_PIN (GPIO_PIN_0)
#define BOARD_USB_OTG_HS_STP_MODE (GPIO_MODE_AF_PP)
#define BOARD_USB_OTG_HS_STP_PULL (GPIO_NOPULL)
#define BOARD_USB_OTG_HS_STP_ALTERNATE (GPIO_AF10_OTG2_HS)
#define BOARD_USB_OTG_HS_STP_GPIO (GPIOC)

#define BOARD_USB_OTG_HS_NXT_PIN (GPIO_PIN_4)
#define BOARD_USB_OTG_HS_NXT_MODE (GPIO_MODE_AF_PP)
#define BOARD_USB_OTG_HS_NXT_PULL (GPIO_NOPULL)
#define BOARD_USB_OTG_HS_NXT_ALTERNATE (GPIO_AF10_OTG2_HS)
#define BOARD_USB_OTG_HS_NXT_GPIO (GPIOH)

#define BOARD_USB_OTG_HS_DIR_PIN (GPIO_PIN_11)
#define BOARD_USB_OTG_HS_DIR_MODE (GPIO_MODE_AF_PP)
#define BOARD_USB_OTG_HS_DIR_PULL (GPIO_NOPULL)
#define BOARD_USB_OTG_HS_DIR_ALTERNATE (GPIO_AF10_OTG2_HS)
#define BOARD_USB_OTG_HS_DIR_GPIO (GPIOI)

#elif defined TARGET_NICLA_VISION
#define BOARD_GREEN_LED PC_13
#define BOARD_RED_LED PE_3
#define BOARD_BLUE_LED PF_4

#define BOARD_USB_RESET PA_2

#define BOARD_I2C_SCL PF_1
#define BOARD_I2C_SDA PF_0

#define BOARD_USBD_VID 0x2341
#define BOARD_USBD_PID 0x035F

#define BOARD_USBD_STRING "Nicla Vision MCUboot"

#define BOARD_QSPI_SO0 PD_11
#define BOARD_QSPI_SO1 PF_9
#define BOARD_QSPI_SO2 PE_2
#define BOARD_QSPI_SO3 PD_13
#define BOARD_QSPI_SCK PF_10
#define BOARD_QSPI_CS PG_6

#define BOARD_USB_OTG_FS_DM_DP_PIN (GPIO_PIN_11 | GPIO_PIN_12)
#define BOARD_USB_OTG_FS_DM_DP_MODE (GPIO_MODE_AF_PP)
#define BOARD_USB_OTG_FS_DM_DP_PULL (GPIO_PULLUP)
#define BOARD_USB_OTG_FS_DM_DP_SPEED (GPIO_SPEED_FREQ_VERY_HIGH)
#define BOARD_USB_OTG_FS_DM_DP_ALTERNATE (GPIO_AF10_OTG1_FS)
#define BOARD_USB_OTG_FS_DM_DP_GPIO (GPIOA)

#define BOARD_USB_OTG_HS_CLK_PIN (GPIO_PIN_5)
#define BOARD_USB_OTG_HS_CLK_MODE (GPIO_MODE_AF_PP)
#define BOARD_USB_OTG_HS_CLK_PULL (GPIO_NOPULL)
#define BOARD_USB_OTG_HS_CLK_SPEED (GPIO_SPEED_FREQ_VERY_HIGH)
#define BOARD_USB_OTG_HS_CLK_ALTERNATE (GPIO_AF10_OTG2_HS)
#define BOARD_USB_OTG_HS_CLK_GPIO (GPIOA)

#define BOARD_USB_OTG_HS_D0_PIN (GPIO_PIN_3)
#define BOARD_USB_OTG_HS_D0_MODE (GPIO_MODE_AF_PP)
#define BOARD_USB_OTG_HS_D0_PULL (GPIO_NOPULL)
#define BOARD_USB_OTG_HS_D0_SPEED (GPIO_SPEED_FREQ_VERY_HIGH)
#define BOARD_USB_OTG_HS_D0_ALTERNATE (GPIO_AF10_OTG2_HS)
#define BOARD_USB_OTG_HS_D0_GPIO (GPIOA)

#define BOARD_USB_OTG_HS_D1_D7_PIN (GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_5 | GPIO_PIN_10 | GPIO_PIN_11 | GPIO_PIN_12 | GPIO_PIN_13)
#define BOARD_USB_OTG_HS_D1_D7_MODE (GPIO_MODE_AF_PP)
#define BOARD_USB_OTG_HS_D1_D7_PULL (GPIO_NOPULL)
#define BOARD_USB_OTG_HS_D1_D7_ALTERNATE (GPIO_AF10_OTG2_HS)
#define BOARD_USB_OTG_HS_D1_D7_GPIO (GPIOB)

#define BOARD_USB_OTG_HS_STP_PIN (GPIO_PIN_0)
#define BOARD_USB_OTG_HS_STP_MODE (GPIO_MODE_AF_PP)
#define BOARD_USB_OTG_HS_STP_PULL (GPIO_NOPULL)
#define BOARD_USB_OTG_HS_STP_ALTERNATE (GPIO_AF10_OTG2_HS)
#define BOARD_USB_OTG_HS_STP_GPIO (GPIOC)

#define BOARD_USB_OTG_HS_NXT_PIN (GPIO_PIN_3)
#define BOARD_USB_OTG_HS_NXT_MODE (GPIO_MODE_AF_PP)
#define BOARD_USB_OTG_HS_NXT_PULL (GPIO_NOPULL)
#define BOARD_USB_OTG_HS_NXT_ALTERNATE (GPIO_AF10_OTG2_HS)
#define BOARD_USB_OTG_HS_NXT_GPIO (GPIOC)

#define BOARD_USB_OTG_HS_DIR_PIN (GPIO_PIN_2)
#define BOARD_USB_OTG_HS_DIR_MODE (GPIO_MODE_AF_PP)
#define BOARD_USB_OTG_HS_DIR_PULL (GPIO_NOPULL)
#define BOARD_USB_OTG_HS_DIR_ALTERNATE (GPIO_AF10_OTG2_HS)
#define BOARD_USB_OTG_HS_DIR_GPIO (GPIOC)

#ifdef BOARD_HAS_VIDEO
#define BOARD_VIDEO_ENABLE PJ_2
#define BOARD_VIDEO_RESET PJ_3
#endif
#else

#define BOARD_I2C_SCL PB_6
#define BOARD_I2C_SDA PB_7

#define BOARD_USBD_VID 0x2341
#define BOARD_USBD_PID 0x035B

#define BOARD_USBD_STRING "Portenta H7 MCUboot"

#define BOARD_QSPI_SO0 PD_11
#define BOARD_QSPI_SO1 PD_12
#define BOARD_QSPI_SO2 PF_7
#define BOARD_QSPI_SO3 PD_13
#define BOARD_QSPI_SCK PF_10
#define BOARD_QSPI_CS PG_6

#define BOARD_USB_OTG_FS_DM_DP_PIN (GPIO_PIN_11 | GPIO_PIN_12)
#define BOARD_USB_OTG_FS_DM_DP_MODE (GPIO_MODE_AF_PP)
#define BOARD_USB_OTG_FS_DM_DP_PULL (GPIO_NOPULL)
#define BOARD_USB_OTG_FS_DM_DP_SPEED (GPIO_SPEED_FREQ_VERY_HIGH)
#define BOARD_USB_OTG_FS_DM_DP_ALTERNATE (GPIO_AF10_OTG1_FS)
#define BOARD_USB_OTG_FS_DM_DP_GPIO (GPIOA)

#define BOARD_USB_OTG_HS_CLK_PIN (GPIO_PIN_5)
#define BOARD_USB_OTG_HS_CLK_MODE (GPIO_MODE_AF_PP)
#define BOARD_USB_OTG_HS_CLK_PULL (GPIO_NOPULL)
#define BOARD_USB_OTG_HS_CLK_SPEED (GPIO_SPEED_FREQ_VERY_HIGH)
#define BOARD_USB_OTG_HS_CLK_ALTERNATE (GPIO_AF10_OTG2_HS)
#define BOARD_USB_OTG_HS_CLK_GPIO (GPIOA)

#define BOARD_USB_OTG_HS_D0_PIN (GPIO_PIN_3)
#define BOARD_USB_OTG_HS_D0_MODE (GPIO_MODE_AF_PP)
#define BOARD_USB_OTG_HS_D0_PULL (GPIO_NOPULL)
#define BOARD_USB_OTG_HS_D0_SPEED (GPIO_SPEED_FREQ_VERY_HIGH)
#define BOARD_USB_OTG_HS_D0_ALTERNATE (GPIO_AF10_OTG2_HS)
#define BOARD_USB_OTG_HS_D0_GPIO (GPIOA)

#define BOARD_USB_OTG_HS_D1_D7_PIN (GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_5 | GPIO_PIN_10 | GPIO_PIN_11 | GPIO_PIN_12 | GPIO_PIN_13)
#define BOARD_USB_OTG_HS_D1_D7_MODE (GPIO_MODE_AF_PP)
#define BOARD_USB_OTG_HS_D1_D7_PULL (GPIO_NOPULL)
#define BOARD_USB_OTG_HS_D1_D7_ALTERNATE (GPIO_AF10_OTG2_HS)
#define BOARD_USB_OTG_HS_D1_D7_GPIO (GPIOB)

#define BOARD_USB_OTG_HS_STP_PIN (GPIO_PIN_0)
#define BOARD_USB_OTG_HS_STP_MODE (GPIO_MODE_AF_PP)
#define BOARD_USB_OTG_HS_STP_PULL (GPIO_NOPULL)
#define BOARD_USB_OTG_HS_STP_ALTERNATE (GPIO_AF10_OTG2_HS)
#define BOARD_USB_OTG_HS_STP_GPIO (GPIOC)

#define BOARD_USB_OTG_HS_NXT_PIN (GPIO_PIN_4)
#define BOARD_USB_OTG_HS_NXT_MODE (GPIO_MODE_AF_PP)
#define BOARD_USB_OTG_HS_NXT_PULL (GPIO_NOPULL)
#define BOARD_USB_OTG_HS_NXT_ALTERNATE (GPIO_AF10_OTG2_HS)
#define BOARD_USB_OTG_HS_NXT_GPIO (GPIOH)

#define BOARD_USB_OTG_HS_DIR_PIN (GPIO_PIN_11)
#define BOARD_USB_OTG_HS_DIR_MODE (GPIO_MODE_AF_PP)
#define BOARD_USB_OTG_HS_DIR_PULL (GPIO_NOPULL)
#define BOARD_USB_OTG_HS_DIR_ALTERNATE (GPIO_AF10_OTG2_HS)
#define BOARD_USB_OTG_HS_DIR_GPIO (GPIOI)
#endif

#endif /* __BOARD_H */
8 changes: 5 additions & 3 deletions app/default_bd.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -148,7 +148,7 @@ static void initBlockTable(void) {
BOOT_LOG_ERR("SDMMC");
#endif
} else if (block_info[SECONDARY_BLOCK_DEVICE].raw_type & QSPI_FLASH_FLAG) {
block_info[SECONDARY_BLOCK_DEVICE].raw_bd = new QSPIFBlockDevice(PD_11, PD_12, PF_7, PD_13, PF_10, PG_6, QSPIF_POLARITY_MODE_1, 40000000);
block_info[SECONDARY_BLOCK_DEVICE].raw_bd = mbed::BlockDevice::get_default_instance();
block_info[SCRATCH_BLOCK_DEVICE].raw_bd = block_info[SECONDARY_BLOCK_DEVICE].raw_bd;
} else {
BOOT_LOG_ERR("Config");
Expand Down Expand Up @@ -236,7 +236,7 @@ static void initBlockTable(void) {
BOOT_LOG_ERR("SDMMC");
#endif
} else if (block_info[SECONDARY_BLOCK_DEVICE].raw_type & QSPI_FLASH_FLAG) {
block_info[SECONDARY_BLOCK_DEVICE].raw_bd = new QSPIFBlockDevice(PD_11, PD_12, PF_7, PD_13, PF_10, PG_6, QSPIF_POLARITY_MODE_1, 40000000);
block_info[SECONDARY_BLOCK_DEVICE].raw_bd = mbed::BlockDevice::get_default_instance();
} else {
BOOT_LOG_ERR("U config");
}
Expand All @@ -250,7 +250,7 @@ static void initBlockTable(void) {
BOOT_LOG_ERR("SDMMC");
#endif
} else if (block_info[SCRATCH_BLOCK_DEVICE].raw_type & QSPI_FLASH_FLAG) {
block_info[SCRATCH_BLOCK_DEVICE].raw_bd = new QSPIFBlockDevice(PD_11, PD_12, PF_7, PD_13, PF_10, PG_6, QSPIF_POLARITY_MODE_1, 40000000);
block_info[SCRATCH_BLOCK_DEVICE].raw_bd = mbed::BlockDevice::get_default_instance();
} else {
BOOT_LOG_ERR("S config");
}
Expand Down Expand Up @@ -395,11 +395,13 @@ mbed::BlockDevice* get_scratch_bd(void) {
return nullptr;
}

#if !defined(BOOTUTIL_LIBARY_BUILD)
mbed::BlockDevice* BlockDevice::get_default_instance()
{
static QSPIFBlockDevice default_bd(BOARD_QSPI_SO0, BOARD_QSPI_SO1, BOARD_QSPI_SO2, BOARD_QSPI_SO3, BOARD_QSPI_SCK, BOARD_QSPI_CS, QSPIF_POLARITY_MODE_1, 40000000);
return &default_bd;
}
#endif

FlashIAP flash;

Expand Down
4 changes: 4 additions & 0 deletions app/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,11 @@ USBD_HandleTypeDef USBD_Device;
DigitalOut red(BOARD_RED_LED, 1);
DigitalOut green(BOARD_GREEN_LED, 1);
DigitalOut blue(BOARD_BLUE_LED, 1);
#if defined(TARGET_NICLA_VISION)
bool boot_sel = false;
#else
DigitalIn boot_sel(BOARD_BOOT_SEL,PullDown);
#endif

Ticker swap_ticker;
bool debug_enabled = false;
Expand Down
41 changes: 40 additions & 1 deletion app/power/power.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
#include "board.h"
#include "mbed.h"

#if defined TARGET_PORTENTA_H7_M7
static void portenta_power_init() {
I2C i2c(BOARD_I2C_SDA, BOARD_I2C_SCL);

Expand Down Expand Up @@ -85,8 +86,46 @@ static void portenta_power_init() {
data[1]=0xF;
i2c.write(8 << 1, data, sizeof(data));
}
#endif

#if defined TARGET_NICLA_VISION
static void nicla_vision_power_init() {
I2C i2c(BOARD_I2C_SDA, BOARD_I2C_SCL);

char data[2];

data[0]=0x9C;
data[1]=(1 << 7);
i2c.write(8 << 1, data, sizeof(data));

// Disable charger led
data[0]=0x9E;
data[1]=(1 << 5);
i2c.write(8 << 1, data, sizeof(data));

HAL_Delay(10);

// SW3: set 2A as current limit
// Helps keeping the rail up at wifi startup
data[0]=0x42;
data[1]=(2);
i2c.write(8 << 1, data, sizeof(data));

HAL_Delay(10);

// Change VBUS INPUT CURRENT LIMIT to 1.5A
data[0]=0x94;
data[1]=(20 << 3);
i2c.write(8 << 1, data, sizeof(data));
}
#endif

void power_init() {
#if defined TARGET_PORTENTA_H7_M7
portenta_power_init();
}
#elif defined TARGET_NICLA_VISION
nicla_vision_power_init();
#else

#endif
}
2 changes: 1 addition & 1 deletion app/power/power.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,4 +21,4 @@

void power_init();

#endif //__POWER_H
#endif //__POWER_H
2 changes: 1 addition & 1 deletion app/sdcard/BSP.c
Original file line number Diff line number Diff line change
Expand Up @@ -454,7 +454,7 @@ __weak void BSP_SD_ReadCpltCallback(void)

}

void SDMMC2_IRQHandler(void)
__weak void SDMMC2_IRQHandler(void)
{
BSP_SD_IRQHandler();
}
Expand Down
8 changes: 0 additions & 8 deletions generate_lib.sh

This file was deleted.

Loading