From b10a65dd740c774c9238959212acfb0a21dbd05c Mon Sep 17 00:00:00 2001 From: "Ben V. Brown" Date: Tue, 4 May 2021 18:54:09 +1000 Subject: [PATCH] Fix bootloader size --- source/Core/BSP/MHP30/BSP.cpp | 12 +- source/Core/BSP/MHP30/preRTOS.cpp | 1 - source/Core/BSP/MHP30/system_stm32f1xx.c | 9 +- source/Core/Drivers/WS2812.h | 196 +++++++++++------------ source/Makefile | 2 +- 5 files changed, 104 insertions(+), 116 deletions(-) diff --git a/source/Core/BSP/MHP30/BSP.cpp b/source/Core/BSP/MHP30/BSP.cpp index 1722c1c3..8619c9c9 100644 --- a/source/Core/BSP/MHP30/BSP.cpp +++ b/source/Core/BSP/MHP30/BSP.cpp @@ -13,11 +13,11 @@ #include "main.hpp" #include -WS2812 ws2812; -volatile uint16_t PWMSafetyTimer = 0; -volatile uint8_t pendingPWM = 0; -uint16_t totalPWM = 255; -const uint16_t powerPWM = 255; +WS2812 ws2812; +volatile uint16_t PWMSafetyTimer = 0; +volatile uint8_t pendingPWM = 0; +uint16_t totalPWM = 255; +const uint16_t powerPWM = 255; history rawTempFilter = {{0}, 0, 0}; void resetWatchdog() { HAL_IWDG_Refresh(&hiwdg); } @@ -427,7 +427,7 @@ void setStatusLED(const enum StatusLED state) { break; case LED_HEATING: { ws2812.led_set_color(0, ((HAL_GetTick() / 10) % 192) + 64, 0, - 0); // Red fade + 0); // Red fade } break; case LED_HOT: ws2812.led_set_color(0, 0xFF, 0, 0); // red diff --git a/source/Core/BSP/MHP30/preRTOS.cpp b/source/Core/BSP/MHP30/preRTOS.cpp index 77cf9bcf..44ac337f 100644 --- a/source/Core/BSP/MHP30/preRTOS.cpp +++ b/source/Core/BSP/MHP30/preRTOS.cpp @@ -15,7 +15,6 @@ void preRToSInit() { /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ - SCB->VTOR = FLASH_BASE; // Set vector table offset HAL_Init(); Setup_HAL(); // Setup all the HAL objects BSPInit(); diff --git a/source/Core/BSP/MHP30/system_stm32f1xx.c b/source/Core/BSP/MHP30/system_stm32f1xx.c index 19a323e4..e950ea24 100644 --- a/source/Core/BSP/MHP30/system_stm32f1xx.c +++ b/source/Core/BSP/MHP30/system_stm32f1xx.c @@ -13,13 +13,6 @@ /* #define DATA_IN_ExtSRAM */ #endif /* STM32F100xE || STM32F101xE || STM32F101xG || STM32F103xE || STM32F103xG */ -#ifndef VECT_TAB_OFFSET -#define VECT_TAB_OFFSET \ - 0x00004000U /*!< Vector Table base offset field. \ - This value must be a multiple of 0x200. */ -// We offset this by 0x4000 to because of the bootloader -#endif - /******************************************************************************* * Clock Definitions *******************************************************************************/ @@ -90,7 +83,7 @@ void SystemInit(void) { #ifdef VECT_TAB_SRAM SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM. */ #else - SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH. */ + SCB->VTOR = FLASH_BASE | 0x8000; /* Vector Table Relocation in Internal FLASH. */ #endif } diff --git a/source/Core/Drivers/WS2812.h b/source/Core/Drivers/WS2812.h index c40b9d8b..d7eb4254 100644 --- a/source/Core/Drivers/WS2812.h +++ b/source/Core/Drivers/WS2812.h @@ -4,11 +4,11 @@ * Created on: 2 May 2021 * Author: Ralim */ +#include "Pins.h" #include "Setup.h" #include -#include #include -#include "Pins.h" +#include #ifndef CORE_DRIVERS_WS2812_H_ #define CORE_DRIVERS_WS2812_H_ @@ -19,110 +19,106 @@ #define WS2812_RAW_BYTES_PER_LED (WS2812_LED_CHANNEL_COUNT * 8) -template class WS2812 { +template class WS2812 { private: - uint8_t leds_colors[WS2812_LED_CHANNEL_COUNT * LED_COUNT]; + uint8_t leds_colors[WS2812_LED_CHANNEL_COUNT * LED_COUNT]; + public: + void led_update() { + __disable_irq(); + // Bitbang it out as our cpu irq latency is too high + for (unsigned int i = 0; i < sizeof(leds_colors); i++) { + // Shove out MSB first + for (int x = 0; x < 8; x++) { + ((GPIO_TypeDef *)WS2812_GPIO_Port)->BSRR = WS2812_Pin; + if ((leds_colors[i] & (1 << (7 - x))) == (1 << (7 - x))) { + __asm__ __volatile__("nop"); + __asm__ __volatile__("nop"); + __asm__ __volatile__("nop"); + __asm__ __volatile__("nop"); + __asm__ __volatile__("nop"); + __asm__ __volatile__("nop"); + __asm__ __volatile__("nop"); + __asm__ __volatile__("nop"); + __asm__ __volatile__("nop"); + __asm__ __volatile__("nop"); + __asm__ __volatile__("nop"); + __asm__ __volatile__("nop"); + __asm__ __volatile__("nop"); + __asm__ __volatile__("nop"); + __asm__ __volatile__("nop"); + __asm__ __volatile__("nop"); + __asm__ __volatile__("nop"); + __asm__ __volatile__("nop"); + __asm__ __volatile__("nop"); + __asm__ __volatile__("nop"); + __asm__ __volatile__("nop"); + __asm__ __volatile__("nop"); + __asm__ __volatile__("nop"); + __asm__ __volatile__("nop"); + __asm__ __volatile__("nop"); + __asm__ __volatile__("nop"); + __asm__ __volatile__("nop"); + __asm__ __volatile__("nop"); + __asm__ __volatile__("nop"); + __asm__ __volatile__("nop"); + } else { - void led_update() { - __disable_irq(); - // Bitbang it out as our cpu irq latency is too high - for (unsigned int i = 0; i < sizeof(leds_colors); i++) { - // Shove out MSB first - for (int x = 0; x < 8; x++) { - ((GPIO_TypeDef*) WS2812_GPIO_Port)->BSRR = WS2812_Pin; - if ((leds_colors[i] & (1 << (7 - x))) == (1 << (7 - x))) { - __asm__ __volatile__("nop"); - __asm__ __volatile__("nop"); - __asm__ __volatile__("nop"); - __asm__ __volatile__("nop"); - __asm__ __volatile__("nop"); - __asm__ __volatile__("nop"); - __asm__ __volatile__("nop"); - __asm__ __volatile__("nop"); - __asm__ __volatile__("nop"); - __asm__ __volatile__("nop"); - __asm__ __volatile__("nop"); - __asm__ __volatile__("nop"); - __asm__ __volatile__("nop"); - __asm__ __volatile__("nop"); - __asm__ __volatile__("nop"); - __asm__ __volatile__("nop"); - __asm__ __volatile__("nop"); - __asm__ __volatile__("nop"); - __asm__ __volatile__("nop"); - __asm__ __volatile__("nop"); - __asm__ __volatile__("nop"); - __asm__ __volatile__("nop"); - __asm__ __volatile__("nop"); - __asm__ __volatile__("nop"); - __asm__ __volatile__("nop"); - __asm__ __volatile__("nop"); - __asm__ __volatile__("nop"); - __asm__ __volatile__("nop"); - __asm__ __volatile__("nop"); - __asm__ __volatile__("nop"); - } else { + __asm__ __volatile__("nop"); + __asm__ __volatile__("nop"); + __asm__ __volatile__("nop"); + __asm__ __volatile__("nop"); + __asm__ __volatile__("nop"); + __asm__ __volatile__("nop"); + } + ((GPIO_TypeDef *)WS2812_GPIO_Port)->BSRR = (uint32_t)WS2812_Pin << 16u; + __asm__ __volatile__("nop"); + __asm__ __volatile__("nop"); + __asm__ __volatile__("nop"); + __asm__ __volatile__("nop"); + __asm__ __volatile__("nop"); + __asm__ __volatile__("nop"); + __asm__ __volatile__("nop"); + __asm__ __volatile__("nop"); + __asm__ __volatile__("nop"); + __asm__ __volatile__("nop"); + __asm__ __volatile__("nop"); + __asm__ __volatile__("nop"); + __asm__ __volatile__("nop"); + __asm__ __volatile__("nop"); + __asm__ __volatile__("nop"); + __asm__ __volatile__("nop"); + __asm__ __volatile__("nop"); + __asm__ __volatile__("nop"); + __asm__ __volatile__("nop"); + __asm__ __volatile__("nop"); + __asm__ __volatile__("nop"); + __asm__ __volatile__("nop"); + __asm__ __volatile__("nop"); + __asm__ __volatile__("nop"); + __asm__ __volatile__("nop"); + __asm__ __volatile__("nop"); + __asm__ __volatile__("nop"); + } + } + __enable_irq(); + } - __asm__ __volatile__("nop"); - __asm__ __volatile__("nop"); - __asm__ __volatile__("nop"); - __asm__ __volatile__("nop"); - __asm__ __volatile__("nop"); - __asm__ __volatile__("nop"); - } - ((GPIO_TypeDef*) WS2812_GPIO_Port)->BSRR = (uint32_t) WS2812_Pin - << 16u; - __asm__ __volatile__("nop"); - __asm__ __volatile__("nop"); - __asm__ __volatile__("nop"); - __asm__ __volatile__("nop"); - __asm__ __volatile__("nop"); - __asm__ __volatile__("nop"); - __asm__ __volatile__("nop"); - __asm__ __volatile__("nop"); - __asm__ __volatile__("nop"); - __asm__ __volatile__("nop"); - __asm__ __volatile__("nop"); - __asm__ __volatile__("nop"); - __asm__ __volatile__("nop"); - __asm__ __volatile__("nop"); - __asm__ __volatile__("nop"); - __asm__ __volatile__("nop"); - __asm__ __volatile__("nop"); - __asm__ __volatile__("nop"); - __asm__ __volatile__("nop"); - __asm__ __volatile__("nop"); - __asm__ __volatile__("nop"); - __asm__ __volatile__("nop"); - __asm__ __volatile__("nop"); - __asm__ __volatile__("nop"); - __asm__ __volatile__("nop"); - __asm__ __volatile__("nop"); - __asm__ __volatile__("nop"); - } - } - __enable_irq(); - } + void init(void) { memset(leds_colors, 0, sizeof(leds_colors)); } - void init(void) { - memset(leds_colors, 0, sizeof(leds_colors)); - } - - void led_set_color(size_t index, uint8_t r, uint8_t g, uint8_t b) { - leds_colors[index * WS2812_LED_CHANNEL_COUNT + 0] = g; - leds_colors[index * WS2812_LED_CHANNEL_COUNT + 1] = r; - leds_colors[index * WS2812_LED_CHANNEL_COUNT + 2] = b; - } - - void led_set_color_all(uint8_t r, uint8_t g, uint8_t b) { - for (int index = 0; index < LED_COUNT; index++) { - leds_colors[index * WS2812_LED_CHANNEL_COUNT + 0] = g; - leds_colors[index * WS2812_LED_CHANNEL_COUNT + 1] = r; - leds_colors[index * WS2812_LED_CHANNEL_COUNT + 2] = b; - } - } + void led_set_color(size_t index, uint8_t r, uint8_t g, uint8_t b) { + leds_colors[index * WS2812_LED_CHANNEL_COUNT + 0] = g; + leds_colors[index * WS2812_LED_CHANNEL_COUNT + 1] = r; + leds_colors[index * WS2812_LED_CHANNEL_COUNT + 2] = b; + } + void led_set_color_all(uint8_t r, uint8_t g, uint8_t b) { + for (int index = 0; index < LED_COUNT; index++) { + leds_colors[index * WS2812_LED_CHANNEL_COUNT + 0] = g; + leds_colors[index * WS2812_LED_CHANNEL_COUNT + 1] = r; + leds_colors[index * WS2812_LED_CHANNEL_COUNT + 2] = b; + } + } }; #endif /* CORE_DRIVERS_WS2812_H_ */ diff --git a/source/Makefile b/source/Makefile index 4c436f3c..6ecd4881 100644 --- a/source/Makefile +++ b/source/Makefile @@ -127,7 +127,7 @@ CPUFLAGS= -mcpu=cortex-m3 \ -mthumb \ -mfloat-abi=soft flash_size=128k -bootldr_size=0x8000 +bootldr_size=32k endif ifeq ($(model),$(ALL_PINE_MODELS)) $(info Building for Pine64 )