summaryrefslogtreecommitdiff
path: root/bootloader
diff options
context:
space:
mode:
Diffstat (limited to 'bootloader')
-rw-r--r--bootloader/.settings/com.st.stm32cube.ide.mcu.sfrview.prefs2
-rwxr-xr-xbootloader/.settings/language.settings.xml4
-rwxr-xr-xbootloader/.settings/stm32cubeide.project.prefs6
-rwxr-xr-xbootloader/Core/Src/ghostfat.c146
-rwxr-xr-xbootloader/Core/Src/main.c3
-rwxr-xr-xbootloader/STM32L476VGTX_RAM.ld2
-rwxr-xr-xbootloader/plinkybl debug.launch33
-rwxr-xr-xbootloader/plinkybl release.launch4
8 files changed, 133 insertions, 67 deletions
diff --git a/bootloader/.settings/com.st.stm32cube.ide.mcu.sfrview.prefs b/bootloader/.settings/com.st.stm32cube.ide.mcu.sfrview.prefs
new file mode 100644
index 0000000..98a69fc
--- /dev/null
+++ b/bootloader/.settings/com.st.stm32cube.ide.mcu.sfrview.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+sfrviewstate={"fFavorites"\:{"fLists"\:{}},"fProperties"\:{"fNodeProperties"\:{}}}
diff --git a/bootloader/.settings/language.settings.xml b/bootloader/.settings/language.settings.xml
index 795ff2e..4c754c5 100755
--- a/bootloader/.settings/language.settings.xml
+++ b/bootloader/.settings/language.settings.xml
@@ -5,7 +5,7 @@
<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>
<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
- <provider class="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" console="false" env-hash="1716914187473399352" id="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" keep-relative-paths="false" name="MCU ARM GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
+ <provider class="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" console="false" env-hash="-288536475984410913" id="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" keep-relative-paths="false" name="MCU ARM GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
<language-scope id="org.eclipse.cdt.core.gcc"/>
<language-scope id="org.eclipse.cdt.core.g++"/>
</provider>
@@ -16,7 +16,7 @@
<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>
<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
- <provider class="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" console="false" env-hash="1679231874160839550" id="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" keep-relative-paths="false" name="MCU ARM GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
+ <provider class="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" console="false" env-hash="-203253394576153563" id="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" keep-relative-paths="false" name="MCU ARM GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
<language-scope id="org.eclipse.cdt.core.gcc"/>
<language-scope id="org.eclipse.cdt.core.g++"/>
</provider>
diff --git a/bootloader/.settings/stm32cubeide.project.prefs b/bootloader/.settings/stm32cubeide.project.prefs
index 93902a1..8ed9ba8 100755
--- a/bootloader/.settings/stm32cubeide.project.prefs
+++ b/bootloader/.settings/stm32cubeide.project.prefs
@@ -1,4 +1,4 @@
-2F62501ED4689FB349E356AB974DBE57=0D30F5178426EDF7CB978D9DAD379EFF
-8DF89ED150041C4CBC7CB9A9CAA90856=0D30F5178426EDF7CB978D9DAD379EFF
-DC22A860405A8BF2F2C095E5B6529F12=49746FB430C2084109BFFA3487BC8947
+2F62501ED4689FB349E356AB974DBE57=94ADD5E4909A0CFA8C7645E0FE590B85
+8DF89ED150041C4CBC7CB9A9CAA90856=94ADD5E4909A0CFA8C7645E0FE590B85
+DC22A860405A8BF2F2C095E5B6529F12=784C6BDED0B54E15528F5E4F1E9EDAE2
eclipse.preferences.version=1
diff --git a/bootloader/Core/Src/ghostfat.c b/bootloader/Core/Src/ghostfat.c
index d0ef21a..e3a94d6 100755
--- a/bootloader/Core/Src/ghostfat.c
+++ b/bootloader/Core/Src/ghostfat.c
@@ -30,13 +30,13 @@
#include "main.h"
#undef FLASH_PAGE_SIZE
-#define VOLUME_LABEL "PLINKY"
#define FLASH_PAGE_SIZE 4096 // the mcu does 2k, but the SPI does 4k. lets go with 4k
#define USER_FLASH_START 65536
#define USER_FLASH_END (512*1024)
#define UF2_FAMILY 0x00ff6919
#define VALID_FLASH_ADDR(addr, sz) (USER_FLASH_START <= (addr) && (addr) + (sz) <= USER_FLASH_END)
+
void target_flash_lock(void) {
HAL_FLASH_Lock();
}
@@ -52,29 +52,6 @@ void scb_reset_system(void) {
#include "uf2.h"
typedef struct {
- uint8_t JumpInstruction[3]; // 0
- uint8_t OEMInfo[8]; // 3
- uint16_t SectorSize; // 0xb
- uint8_t SectorsPerCluster; // 0xd
- uint16_t ReservedSectors; // 0xe
- uint8_t FATCopies; // 0x10
- uint16_t RootDirectoryEntries; // 0x11
- uint16_t TotalSectors16; // 0x13
- uint8_t MediaDescriptor; // 0x15
- uint16_t SectorsPerFAT; // 0x16
- uint16_t SectorsPerTrack; // 0x18
- uint16_t Heads; // 0x1a
- uint32_t HiddenSectors; // 0x1c
- uint32_t TotalSectors32; // 0x20
- uint8_t PhysicalDriveNum;
- uint8_t Reserved;
- uint8_t ExtendedBootSig;
- uint32_t VolumeSerialNumber;
- uint8_t VolumeLabel[11];
- uint8_t FilesystemIdentifier[8];
-} __attribute__((packed)) FAT_BootBlock;
-
-typedef struct {
char name[8];
char ext[3];
uint8_t attrs;
@@ -100,9 +77,9 @@ struct UF2File {
};
const char infoUf2File[] = //
- "UF2 Bootloader v1.0.0 Plinky\r\n"
- "Model: Plinky Synth v1.0.0\r\n"
- "Board-ID: STM32L476-Plinky-100\r\n";
+ "UF2 Bootloader v1.0.3 Plinky\r\n"
+ "Model: Plinky Synth v1.0.3\r\n"
+ "Board-ID: STM32L476-Plinky-103\r\n";
const char indexFile[] = //
"<!doctype html>\n"
@@ -117,8 +94,8 @@ const char indexFile[] = //
// ae - rewrite this part completely, I dont like the define mess
// the sizes here are as reported by FAT, so for UF2 files they are double the size on the actual flash chip
static const struct UF2File info[] = {
- { .name = "INFO_UF2TXT", .content = infoUf2File, .size = sizeof(infoUf2File) - 1 },
{ .name = "INDEX HTM", .content = indexFile, .size = sizeof(indexFile) - 1 },
+ { .name = "INFO_UF2TXT", .content = infoUf2File, .size = sizeof(infoUf2File) - 1 },
{ .name = "BOOTLOADUF2", .content = (void*) DELAY_BUF, .size = 128 * 1024 },
{ .name = "CURRENT UF2", .content = (void*) 0x08010000, .size = (1024 - 128) * 1024 },
{ .name = "PRESETS UF2", .content = (void*) 0x08080000, .size = 1024 * 1024- 4 * 1024 },
@@ -132,24 +109,71 @@ static const struct UF2File info[] = {
{ .name = "SAMPLE6 UF2", .content = (void*) 0x41800000, .size = 8 * 1024 * 1024 },
{ .name = "SAMPLE7 UF2", .content = (void*) 0x41c00000, .size = 8 * 1024 * 1024 },
};
+
+static inline uint32_t mix(uint32_t a,uint32_t b,uint32_t c) \
+{ \
+ a -= b; a -= c; a ^= (c>>13); \
+ b -= c; b -= a; b ^= (a<<8); \
+ c -= a; c -= b; c ^= (b>>13); \
+ a -= b; a -= c; a ^= (c>>12); \
+ b -= c; b -= a; b ^= (a<<16); \
+ c -= a; c -= b; c ^= (b>>5); \
+ a -= b; a -= c; a ^= (c>>3); \
+ b -= c; b -= a; b ^= (a<<10); \
+ c -= a; c -= b; c ^= (b>>15); \
+ return c;
+}
+uint32_t get_serialno(void) {
+ uint32_t uid0=HAL_GetUIDw0 ();
+ uint32_t uid1=HAL_GetUIDw1 ();
+ uint32_t uid2=HAL_GetUIDw2 ();
+ return mix(uid0,uid1,uid2);
+}
+
#define NUM_FILES 14
#define FIRST_UF2_FILE 2
+// these dont count the MBR!
#define RESERVED_SECTORS 1
-#define ROOT_DIR_SECTORS 1
-#define SECTORS_PER_FAT 191 // each fat sector has 256 cluster entries = 512k of disk,
+#define ROOT_DIR_SECTORS 32
+#define SECTORS_PER_FAT 129
+
+#define SECTORS_PER_CLUSTER 8
#define START_FAT0 RESERVED_SECTORS // 1
-#define START_FAT1 (START_FAT0 + SECTORS_PER_FAT) // 192
-#define START_ROOTDIR (START_FAT1 + SECTORS_PER_FAT) // 192+191
-#define START_CLUSTERS (START_ROOTDIR + ROOT_DIR_SECTORS) // 192+192
+#define START_FAT1 (START_FAT0 + SECTORS_PER_FAT) // 130+1
+#define START_ROOTDIR (START_FAT1 + SECTORS_PER_FAT) // 259+1
+#define START_CLUSTERS (START_ROOTDIR + ROOT_DIR_SECTORS) // 260+1
+
+const static uint8_t boot_sector[] = {
+ 0xeb, 0x3c, 0x90, // jump
+ 'M', 'S', 'W', 'I', 'N', '4', '.', '1',
+ 0x00, 0x02, // sector size 512
+ SECTORS_PER_CLUSTER, // sectors per cluster
+ 0x01, 0x00, // reserved clusters (minus the MBR!)
+
+ 0x02, // number of FATs // 16
+ 0x00, 0x02, // root directory entries - 512 (32 sectors)
+ 0x00, 0x00, // total sectors (16 bit)
+ 0xf8, // media descriptor
+ 0x81, 0x00, // sectors per FAT
+ 0x01, 0x00, // sectors per track
+ 0x01, 0x00, // number of heads
+ 0x01,0,0,0, // hidden sectors
+
+ 0xff, 0xff, 0x03, 0x00, // total sectors (32 bit) // 32
+ 0, // drive number
+ 0, // reserved
+ 0x29, // extended boot signature
+ 0, 0, 0, 0, // volume serial number // 39
+ 'P', 'L', 'I', 'N', 'K',
+
+ 'Y', ' ', ' ', ' ', ' ', ' ', // volume label
+ 'F', 'A', 'T', '1', '6', ' ', ' ', ' ', // filesystem identifier
+ 0xeb, 0xfe
+};
+static_assert(sizeof(boot_sector)==0x40,"boot sector size");
-static const FAT_BootBlock BootBlock = { .JumpInstruction = { 0xeb, 0x3c, 0x90 }, .OEMInfo = "UF2 UF2 ", .SectorSize = 512,
- .SectorsPerCluster = 4, // 2k clusters
- .ReservedSectors = RESERVED_SECTORS, .FATCopies = 2, .RootDirectoryEntries = (ROOT_DIR_SECTORS * 512 / 32),
- .TotalSectors16 = 0, //NUM_FAT_BLOCKS - 2,
- .TotalSectors32 = (95 * 1024 * 1024) / 512, .MediaDescriptor = 0xF8, .SectorsPerFAT = SECTORS_PER_FAT, .SectorsPerTrack = 1, .Heads = 1,
- .ExtendedBootSig = 0x29, .VolumeSerialNumber = 0x00420042, .VolumeLabel = VOLUME_LABEL, .FilesystemIdentifier = "FAT16 ", };
static uint32_t ms;
#ifdef FLASH_PAGE_SIZE
@@ -343,7 +367,7 @@ void flushFlash(void) {
}
int clustersize(int bytes) {
- return (bytes+2043)/2048;
+ return (bytes+SECTORS_PER_CLUSTER*512-1)/(SECTORS_PER_CLUSTER*512);
}
void flash_write(uint32_t dst, const uint8_t *src, int len) {
@@ -382,21 +406,38 @@ static void padded_memcpy(char *dst, const char *src, int len) {
}
}
+
int read_block(uint32_t block_no, uint8_t *data) {
memset(data, 0, 512);
+ if (block_no == 0) {
+ // MBR - including partition table
+ *(uint32_t*)(data+0x1b8) = get_serialno();
+ data[0x1c2] = 0xe; // FAT16
+ data[0x1c6] = 0x1;
+ data[0x1ca] = 0xff; // disk size in sectors
+ data[0x1cb] = 0xff;
+ data[0x1cc] = 0x03;
+ data[0x1fe] = 0x55;
+ data[0x1ff] = 0xaa;
+ return 0;
+ }
+ block_no--; // skip mbr
uint32_t sectionIdx = block_no;
-
if (block_no == 0) {
- memcpy(data, &BootBlock, sizeof(BootBlock));
- data[510] = 0x55;
- data[511] = 0xaa;
+ // Boot sector
+ memcpy(data, boot_sector,sizeof(boot_sector));
+ *(uint32_t*)(data+39) = get_serialno();
+ data[0x1fe] = 0x55;
+ data[0x1ff] = 0xaa;
} else if (block_no < START_ROOTDIR) {
sectionIdx -= START_FAT0;
if (sectionIdx >= SECTORS_PER_FAT)
sectionIdx -= SECTORS_PER_FAT;
if (sectionIdx == 0) {
- data[0] = 0xf0;
+ data[0] = 0xf8;
data[1] = 0xff;
+ data[2] = 0xff;
+ data[3] = 0xff;
}
int basecluster = sectionIdx * 256;
int first_cluster=2;
@@ -415,16 +456,27 @@ int read_block(uint32_t block_no, uint8_t *data) {
}
} else if (block_no < START_CLUSTERS) {
sectionIdx -= START_ROOTDIR;
+ // 19 Jul 2019 10:23:00
+#define PLINKY_TIME_FRAC 100
+#define PLINKY_TIME ((10u << 11u) | (23u << 5u) | (00u >> 1u))
+#define PLINKY_DATE ((39u << 9u) | (7u << 5u) | (19u))
if (sectionIdx == 0) {
DirEntry *d = (void*) data;
- padded_memcpy(d->name, (const char*) BootBlock.VolumeLabel, 11);
+ padded_memcpy(d->name, "PLINKY ", 11);
d->attrs = 0x28;
+ d->createTimeFine = PLINKY_TIME_FRAC;
+ d->createTime = d->updateTime = PLINKY_TIME;
+ d->createDate = d->updateDate = PLINKY_DATE;
int first_cluster=2;
for (int i = 0; i < NUM_FILES; ++i) {
d++;
const struct UF2File *inf = &info[i];
d->size = inf->size;
d->startCluster = first_cluster;
+ d->attrs = 0;
+ d->createTimeFine = PLINKY_TIME_FRAC;
+ d->createTime = d->updateTime = PLINKY_TIME;
+ d->createDate = d->updateDate = PLINKY_DATE;
first_cluster+=clustersize(d->size);
padded_memcpy(d->name, inf->name, 11);
}
@@ -433,7 +485,7 @@ int read_block(uint32_t block_no, uint8_t *data) {
sectionIdx -= START_CLUSTERS;
int first_cluster=2;
for (int f = 0; f < NUM_FILES; ++f) {
- int sector_in_file = sectionIdx - (first_cluster - 2) * 4;
+ int sector_in_file = sectionIdx - (first_cluster - 2) * SECTORS_PER_CLUSTER;
first_cluster+=clustersize(info[f].size);
if (sector_in_file < 0)
continue;
diff --git a/bootloader/Core/Src/main.c b/bootloader/Core/Src/main.c
index 0a9ebdb..2f45dc4 100755
--- a/bootloader/Core/Src/main.c
+++ b/bootloader/Core/Src/main.c
@@ -304,13 +304,11 @@ int main(void)
HAL_Delay(1);
bool encdown = !((GPIOC->IDR>>13)&1);
-
if (!encdown) { // encoder not down
jump_to_app();
}
// BOOTLOADER FLASHING MODE!!
memcpy((void*)DELAY_BUF,(void*)0x08000000,65536); // copy bootloader into RAM!:)
- memset((void*)REVERB_BUF,0,32768); // use reverbbuf as a byte mask of which bootlder pages have been written
/* USER CODE END SysInit */
@@ -339,6 +337,7 @@ int main(void)
{
/* USER CODE END WHILE */
+
/* USER CODE BEGIN 3 */
if (encstate==1)
startreset=true;
diff --git a/bootloader/STM32L476VGTX_RAM.ld b/bootloader/STM32L476VGTX_RAM.ld
index 6476844..1b7cd20 100755
--- a/bootloader/STM32L476VGTX_RAM.ld
+++ b/bootloader/STM32L476VGTX_RAM.ld
@@ -37,7 +37,7 @@ _Min_Stack_Size = 0x400; /* required amount of stack */
/* Memories definition */
MEMORY
{
- RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 96K
+ RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 32K
RAM2 (xrw) : ORIGIN = 0x10000000, LENGTH = 32K
FLASH (rx) : ORIGIN = 0x8000000, LENGTH = 1024K
}
diff --git a/bootloader/plinkybl debug.launch b/bootloader/plinkybl debug.launch
index aa82eb3..6908cb2 100755
--- a/bootloader/plinkybl debug.launch
+++ b/bootloader/plinkybl debug.launch
@@ -1,11 +1,18 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<launchConfiguration type="com.st.stm32cube.ide.mcu.debug.launch.launchConfigurationType">
<stringAttribute key="com.st.stm32cube.ide.mcu.debug.launch.access_port_id" value="0"/>
+ <stringAttribute key="com.st.stm32cube.ide.mcu.debug.launch.cubeprog_external_loaders" value="[]"/>
+ <stringAttribute key="com.st.stm32cube.ide.mcu.debug.launch.debug_auth_certif_path" value=""/>
+ <booleanAttribute key="com.st.stm32cube.ide.mcu.debug.launch.debug_auth_check_enable" value="false"/>
+ <stringAttribute key="com.st.stm32cube.ide.mcu.debug.launch.debug_auth_key_path" value=""/>
+ <stringAttribute key="com.st.stm32cube.ide.mcu.debug.launch.debug_auth_permission" value="debug_non_secure_L3"/>
<booleanAttribute key="com.st.stm32cube.ide.mcu.debug.launch.enable_live_expr" value="true"/>
<booleanAttribute key="com.st.stm32cube.ide.mcu.debug.launch.enable_swv" value="false"/>
<intAttribute key="com.st.stm32cube.ide.mcu.debug.launch.formatVersion" value="2"/>
<stringAttribute key="com.st.stm32cube.ide.mcu.debug.launch.ip_address_local" value="localhost"/>
- <stringAttribute key="com.st.stm32cube.ide.mcu.debug.launch.loadList" value="{&quot;fItems&quot;:[{&quot;fIsFromMainTab&quot;:true,&quot;fPath&quot;:&quot;Debug\\plinkybl.elf&quot;,&quot;fProjectName&quot;:&quot;plinkybl&quot;,&quot;fPerformBuild&quot;:true,&quot;fDownload&quot;:true,&quot;fLoadSymbols&quot;:true}]}"/>
+ <booleanAttribute key="com.st.stm32cube.ide.mcu.debug.launch.limit_swo_clock.enabled" value="false"/>
+ <stringAttribute key="com.st.stm32cube.ide.mcu.debug.launch.limit_swo_clock.value" value=""/>
+ <stringAttribute key="com.st.stm32cube.ide.mcu.debug.launch.loadList" value="{&quot;fItems&quot;:[{&quot;fIsFromMainTab&quot;:true,&quot;fPath&quot;:&quot;Debug/plinkybl.elf&quot;,&quot;fProjectName&quot;:&quot;plinkybl&quot;,&quot;fPerformBuild&quot;:true,&quot;fDownload&quot;:true,&quot;fLoadSymbols&quot;:true}]}"/>
<stringAttribute key="com.st.stm32cube.ide.mcu.debug.launch.override_start_address_mode" value="default"/>
<stringAttribute key="com.st.stm32cube.ide.mcu.debug.launch.remoteCommand" value="target remote"/>
<booleanAttribute key="com.st.stm32cube.ide.mcu.debug.launch.startServer" value="true"/>
@@ -21,12 +28,9 @@
<booleanAttribute key="com.st.stm32cube.ide.mcu.debug.launch.verify_flash_download" value="true"/>
<booleanAttribute key="com.st.stm32cube.ide.mcu.debug.stlink.cti_allow_halt" value="false"/>
<booleanAttribute key="com.st.stm32cube.ide.mcu.debug.stlink.cti_signal_halt" value="false"/>
- <booleanAttribute key="com.st.stm32cube.ide.mcu.debug.stlink.enable_external_loader" value="false"/>
<booleanAttribute key="com.st.stm32cube.ide.mcu.debug.stlink.enable_logging" value="false"/>
<booleanAttribute key="com.st.stm32cube.ide.mcu.debug.stlink.enable_max_halt_delay" value="false"/>
<booleanAttribute key="com.st.stm32cube.ide.mcu.debug.stlink.enable_shared_stlink" value="false"/>
- <stringAttribute key="com.st.stm32cube.ide.mcu.debug.stlink.external_loader" value=""/>
- <booleanAttribute key="com.st.stm32cube.ide.mcu.debug.stlink.external_loader_init" value="false"/>
<stringAttribute key="com.st.stm32cube.ide.mcu.debug.stlink.frequency" value="0"/>
<booleanAttribute key="com.st.stm32cube.ide.mcu.debug.stlink.halt_all_on_reset" value="false"/>
<stringAttribute key="com.st.stm32cube.ide.mcu.debug.stlink.log_file" value="C:\Users\blues\STM32CubeIDE\workspace_1.4.0\plinkybl\Debug\st-link_gdbserver_log.txt"/>
@@ -36,13 +40,21 @@
<booleanAttribute key="com.st.stm32cube.ide.mcu.debug.stlink.stlink_check_serial_number" value="false"/>
<stringAttribute key="com.st.stm32cube.ide.mcu.debug.stlink.stlink_txt_serial_number" value=""/>
<stringAttribute key="com.st.stm32cube.ide.mcu.debug.stlink.watchdog_config" value="none"/>
- <stringAttribute key="com.st.stm32cube.ide.mcu.debug.stlinkrestart_configurations" value="{&quot;fItems&quot;:[{&quot;fDisplayName&quot;:&quot;Reset&quot;,&quot;fIsSuppressible&quot;:false,&quot;fResetAttribute&quot;:&quot;Reset&quot;,&quot;fResetStrategies&quot;:[{&quot;fDisplayName&quot;:&quot;Reset&quot;,&quot;fLaunchAttribute&quot;:&quot;monitor reset&quot;,&quot;fGdbCommands&quot;:[&quot;monitor reset&quot;],&quot;fCmdOptions&quot;:[]},{&quot;fDisplayName&quot;:&quot;None&quot;,&quot;fLaunchAttribute&quot;:&quot;no_reset&quot;,&quot;fGdbCommands&quot;:[],&quot;fCmdOptions&quot;:[]}],&quot;fGdbCommandGroup&quot;:{&quot;name&quot;:&quot;Additional commands&quot;,&quot;commands&quot;:[]}}]}"/>
+ <booleanAttribute key="com.st.stm32cube.ide.mcu.debug.stlinkenable_rtos" value="false"/>
+ <stringAttribute key="com.st.stm32cube.ide.mcu.debug.stlinkrestart_configurations" value="{&quot;fVersion&quot;:1,&quot;fItems&quot;:[{&quot;fDisplayName&quot;:&quot;Reset&quot;,&quot;fIsSuppressible&quot;:false,&quot;fResetAttribute&quot;:&quot;Software system reset&quot;,&quot;fResetStrategies&quot;:[{&quot;fDisplayName&quot;:&quot;Software system reset&quot;,&quot;fLaunchAttribute&quot;:&quot;system_reset&quot;,&quot;fGdbCommands&quot;:[&quot;monitor reset\n&quot;],&quot;fCmdOptions&quot;:[&quot;-g&quot;]},{&quot;fDisplayName&quot;:&quot;Hardware reset&quot;,&quot;fLaunchAttribute&quot;:&quot;hardware_reset&quot;,&quot;fGdbCommands&quot;:[&quot;monitor reset hardware\n&quot;],&quot;fCmdOptions&quot;:[&quot;-g&quot;]},{&quot;fDisplayName&quot;:&quot;Core reset&quot;,&quot;fLaunchAttribute&quot;:&quot;core_reset&quot;,&quot;fGdbCommands&quot;:[&quot;monitor reset core\n&quot;],&quot;fCmdOptions&quot;:[&quot;-g&quot;]},{&quot;fDisplayName&quot;:&quot;None&quot;,&quot;fLaunchAttribute&quot;:&quot;no_reset&quot;,&quot;fGdbCommands&quot;:[],&quot;fCmdOptions&quot;:[&quot;-g&quot;]}],&quot;fGdbCommandGroup&quot;:{&quot;name&quot;:&quot;Additional commands&quot;,&quot;commands&quot;:[]},&quot;fStartApplication&quot;:true}]}"/>
<booleanAttribute key="com.st.stm32cube.ide.mcu.debug.swv.swv_wait_for_sync" value="true"/>
+ <booleanAttribute key="com.st.stm32cube.ide.mcu.rtosproxy.enableRtosProxy" value="false"/>
+ <stringAttribute key="com.st.stm32cube.ide.mcu.rtosproxy.rtosProxyCustomProperties" value=""/>
+ <stringAttribute key="com.st.stm32cube.ide.mcu.rtosproxy.rtosProxyDriver" value="threadx"/>
+ <booleanAttribute key="com.st.stm32cube.ide.mcu.rtosproxy.rtosProxyDriverAuto" value="false"/>
+ <stringAttribute key="com.st.stm32cube.ide.mcu.rtosproxy.rtosProxyDriverPort" value="cortex_m0"/>
+ <intAttribute key="com.st.stm32cube.ide.mcu.rtosproxy.rtosProxyPort" value="60000"/>
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.doHalt" value="false"/>
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.doReset" value="false"/>
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.initCommands" value=""/>
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.ipAddress" value="localhost"/>
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.jtagDevice" value="ST-LINK (ST-LINK GDB server)"/>
+ <stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.jtagDeviceId" value="com.st.stm32cube.ide.mcu.debug.stlink"/>
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.pcRegister" value=""/>
<intAttribute key="org.eclipse.cdt.debug.gdbjtag.core.portNumber" value="61234"/>
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.runCommands" value=""/>
@@ -51,23 +63,24 @@
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.setStopAt" value="true"/>
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.stopAt" value="main"/>
<stringAttribute key="org.eclipse.cdt.dsf.gdb.DEBUG_NAME" value="arm-none-eabi-gdb"/>
- <booleanAttribute key="org.eclipse.cdt.dsf.gdb.NON_STOP" value="true"/>
+ <booleanAttribute key="org.eclipse.cdt.dsf.gdb.NON_STOP" value="false"/>
<booleanAttribute key="org.eclipse.cdt.dsf.gdb.UPDATE_THREADLIST_ON_SUSPEND" value="false"/>
<intAttribute key="org.eclipse.cdt.launch.ATTR_BUILD_BEFORE_LAUNCH_ATTR" value="2"/>
<stringAttribute key="org.eclipse.cdt.launch.COREFILE_PATH" value=""/>
<stringAttribute key="org.eclipse.cdt.launch.DEBUGGER_START_MODE" value="remote"/>
<booleanAttribute key="org.eclipse.cdt.launch.DEBUGGER_STOP_AT_MAIN" value="true"/>
<stringAttribute key="org.eclipse.cdt.launch.DEBUGGER_STOP_AT_MAIN_SYMBOL" value="main"/>
- <stringAttribute key="org.eclipse.cdt.launch.PROGRAM_NAME" value="Debug\plinkybl.elf"/>
+ <stringAttribute key="org.eclipse.cdt.launch.PROGRAM_NAME" value="Debug/plinkybl.elf"/>
<stringAttribute key="org.eclipse.cdt.launch.PROJECT_ATTR" value="plinkybl"/>
<booleanAttribute key="org.eclipse.cdt.launch.PROJECT_BUILD_CONFIG_AUTO_ATTR" value="true"/>
- <stringAttribute key="org.eclipse.cdt.launch.PROJECT_BUILD_CONFIG_ID_ATTR" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.config.exe.debug.384220978"/>
+ <stringAttribute key="org.eclipse.cdt.launch.PROJECT_BUILD_CONFIG_ID_ATTR" value=""/>
+ <booleanAttribute key="org.eclipse.debug.core.ATTR_FORCE_SYSTEM_CONSOLE_ENCODING" value="false"/>
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
<listEntry value="/plinkybl"/>
</listAttribute>
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
<listEntry value="4"/>
</listAttribute>
- <stringAttribute key="org.eclipse.dsf.launch.MEMORY_BLOCKS" value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;memoryBlockExpressionList context=&quot;reserved-for-future-use&quot;&gt;&#13;&#10; &lt;gdbmemoryBlockExpression address=&quot;536903680&quot; label=&quot;addr&quot;/&gt;&#13;&#10; &lt;gdbmemoryBlockExpression address=&quot;134217728&quot; label=&quot;0x08000000&quot;/&gt;&#13;&#10;&lt;/memoryBlockExpressionList&gt;&#13;&#10;"/>
- <stringAttribute key="process_factory_id" value="org.eclipse.cdt.dsf.gdb.GdbProcessFactory"/>
+ <stringAttribute key="org.eclipse.dsf.launch.MEMORY_BLOCKS" value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&lt;memoryBlockExpressionList context=&quot;reserved-for-future-use&quot;&gt;&lt;gdbmemoryBlockExpression address=&quot;536903680&quot; label=&quot;addr&quot;/&gt;&lt;gdbmemoryBlockExpression address=&quot;134217728&quot; label=&quot;0x08000000&quot;/&gt;&lt;/memoryBlockExpressionList&gt;"/>
+ <stringAttribute key="process_factory_id" value="com.st.stm32cube.ide.mcu.debug.launch.HardwareDebugProcessFactory"/>
</launchConfiguration>
diff --git a/bootloader/plinkybl release.launch b/bootloader/plinkybl release.launch
index 0754c08..a64d408 100755
--- a/bootloader/plinkybl release.launch
+++ b/bootloader/plinkybl release.launch
@@ -5,7 +5,7 @@
<booleanAttribute key="com.st.stm32cube.ide.mcu.debug.launch.enable_swv" value="false"/>
<intAttribute key="com.st.stm32cube.ide.mcu.debug.launch.formatVersion" value="2"/>
<stringAttribute key="com.st.stm32cube.ide.mcu.debug.launch.ip_address_local" value="localhost"/>
-<stringAttribute key="com.st.stm32cube.ide.mcu.debug.launch.loadList" value="{&quot;fItems&quot;:[{&quot;fIsFromMainTab&quot;:true,&quot;fPath&quot;:&quot;Release\\plinkybl.elf&quot;,&quot;fProjectName&quot;:&quot;plinkybl&quot;,&quot;fPerformBuild&quot;:true,&quot;fDownload&quot;:true,&quot;fLoadSymbols&quot;:true}]}"/>
+<stringAttribute key="com.st.stm32cube.ide.mcu.debug.launch.loadList" value="{&quot;fItems&quot;:[{&quot;fIsFromMainTab&quot;:true,&quot;fPath&quot;:&quot;Release/plinkybl.elf&quot;,&quot;fProjectName&quot;:&quot;plinkybl&quot;,&quot;fPerformBuild&quot;:true,&quot;fDownload&quot;:true,&quot;fLoadSymbols&quot;:true}]}"/>
<stringAttribute key="com.st.stm32cube.ide.mcu.debug.launch.override_start_address_mode" value="default"/>
<stringAttribute key="com.st.stm32cube.ide.mcu.debug.launch.remoteCommand" value="target remote"/>
<booleanAttribute key="com.st.stm32cube.ide.mcu.debug.launch.startServer" value="true"/>
@@ -58,7 +58,7 @@
<stringAttribute key="org.eclipse.cdt.launch.DEBUGGER_START_MODE" value="remote"/>
<booleanAttribute key="org.eclipse.cdt.launch.DEBUGGER_STOP_AT_MAIN" value="true"/>
<stringAttribute key="org.eclipse.cdt.launch.DEBUGGER_STOP_AT_MAIN_SYMBOL" value="main"/>
-<stringAttribute key="org.eclipse.cdt.launch.PROGRAM_NAME" value="Release\plinkybl.elf"/>
+<stringAttribute key="org.eclipse.cdt.launch.PROGRAM_NAME" value="Release/plinkybl.elf"/>
<stringAttribute key="org.eclipse.cdt.launch.PROJECT_ATTR" value="plinkybl"/>
<booleanAttribute key="org.eclipse.cdt.launch.PROJECT_BUILD_CONFIG_AUTO_ATTR" value="true"/>
<stringAttribute key="org.eclipse.cdt.launch.PROJECT_BUILD_CONFIG_ID_ATTR" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.config.exe.release.1995653609"/>