diff --git a/firmware/hw_layer/adc/adc_inputs.h b/firmware/hw_layer/adc/adc_inputs.h index 5ae46e4f9f..99af2c05f0 100644 --- a/firmware/hw_layer/adc/adc_inputs.h +++ b/firmware/hw_layer/adc/adc_inputs.h @@ -54,15 +54,6 @@ typedef enum { adc_channel_mode_e getAdcMode(adc_channel_e hwChannel); void initAdcInputs(); -// deprecated - migrate to 'getAdcChannelBrainPin' -int getAdcChannelPin(adc_channel_e hwChannel); - -// deprecated - migrate to 'getAdcChannelBrainPin' -ioportid_t getAdcChannelPort(const char *msg, adc_channel_e hwChannel); - -adc_channel_e getAdcChannel(brain_pin_e pin); -brain_pin_e getAdcChannelBrainPin(const char *msg, adc_channel_e hwChannel); - // wait until at least 1 slowADC sampling is complete void waitForSlowAdc(uint32_t lastAdcCounter = 0); // get a number of completed slowADC samples diff --git a/firmware/hw_layer/ports/at32/at32_common.cpp b/firmware/hw_layer/ports/at32/at32_common.cpp index 5aa1d8d9d7..a6083a2373 100644 --- a/firmware/hw_layer/ports/at32/at32_common.cpp +++ b/firmware/hw_layer/ports/at32/at32_common.cpp @@ -50,7 +50,7 @@ int at32GetMcuType(uint32_t id, const char **pn, const char **package, uint32_t { 0x70083257, "AT32F437RCT7", 256, "LQFP64" }, }; - for (int i = 0; i < efi::size(at32f43x_types); i++) { + for (size_t i = 0; i < efi::size(at32f43x_types); i++) { if (id == at32f43x_types[i].uid) { if (pn) *pn = at32f43x_types[i].pn; @@ -93,3 +93,78 @@ int at32GetRamSizeKb(void) } return 0; } + +#if EFI_PROD_CODE + +static void reset_and_jump(void) { + // and now reboot + NVIC_SystemReset(); +} + +void jump_to_bootloader() { + // leave DFU breadcrumb which assembly startup code would check, see [rusefi][DFU] section in assembly code + + *((unsigned long *)0x2001FFF0) = 0xDEADBEEF; // End of RAM + + reset_and_jump(); +} + +void jump_to_openblt() { +#if EFI_USE_OPENBLT + /* safe to call on already inited shares area */ + SharedParamsInit(); + /* Store sing to stay in OpenBLT */ + SharedParamsWriteByIndex(0, 0x01); + + reset_and_jump(); +#endif +} + +BOR_Level_t BOR_Get(void) { + /* TODO: Artery */ + /* Fake */ + return BOR_Level_None; +} + +BOR_Result_t BOR_Set(BOR_Level_t BORValue) { + /* NOP */ + return BOR_Result_Ok; +} + +void baseMCUInit(void) { + // looks like this holds a random value on start? Let's set a nice clean zero + DWT->CYCCNT = 0; + + BOR_Set(BOR_Level_1); // one step above default value +} + +extern uint32_t __main_stack_base__; + +typedef struct port_intctx intctx_t; + +EXTERNC int getRemainingStack(thread_t *otp) { +#if CH_DBG_ENABLE_STACK_CHECK + // this would dismiss coverity warning - see http://rusefi.com/forum/viewtopic.php?f=5&t=655 + // coverity[uninit_use] + register intctx_t *r13 asm ("r13"); + otp->activeStack = r13; + + int remainingStack; + if (ch.dbg.isr_cnt > 0) { + // ISR context + remainingStack = (int)(r13 - 1) - (int)&__main_stack_base__; + } else { + remainingStack = (int)(r13 - 1) - (int)otp->wabase; + } + otp->remainingStack = remainingStack; + return remainingStack; +#else + UNUSED(otp); + return 99999; +#endif /* CH_DBG_ENABLE_STACK_CHECK */ +} + +__attribute__((weak)) void boardPrepareForStandby() { +} + +#endif /* EFI_PROD_CODE */ diff --git a/firmware/hw_layer/ports/at32/at32_common.mk b/firmware/hw_layer/ports/at32/at32_common.mk index 6cd7050c30..dc409575aa 100644 --- a/firmware/hw_layer/ports/at32/at32_common.mk +++ b/firmware/hw_layer/ports/at32/at32_common.mk @@ -3,3 +3,33 @@ HW_AT32_PORT_DIR = $(PROJECT_DIR)/hw_layer/ports/at32 HW_LAYER_PORT_CPP += \ $(HW_AT32_PORT_DIR)/at32_common.cpp \ $(HW_AT32_PORT_DIR)/at32f4/mpu_util.cpp + +HW_INC += \ + $(HW_AT32_PORT_DIR) + +# +# Use some stuff from STM32 +# + +HW_STM32_PORT_DIR = $(PROJECT_DIR)/hw_layer/ports/stm32 + +HW_LAYER_PORT_CPP += \ + $(HW_STM32_PORT_DIR)/serial_over_usb/usbconsole.cpp \ + $(HW_STM32_PORT_DIR)/serial_over_usb/usbcfg.cpp \ + $(HW_STM32_PORT_DIR)/stm32_pins.cpp \ + $(HW_STM32_PORT_DIR)/stm32_adc.cpp \ + $(HW_STM32_PORT_DIR)/stm32_can.cpp \ + $(HW_STM32_PORT_DIR)/stm32_pwm.cpp \ + $(HW_STM32_PORT_DIR)/stm32_serial.cpp \ + $(HW_STM32_PORT_DIR)/stm32_spi.cpp \ + $(HW_STM32_PORT_DIR)/stm32_icu.cpp \ + $(HW_STM32_PORT_DIR)/microsecond_timer_stm32.cpp + +#RUSEFIASM = \ +# $(HW_STM32_PORT_DIR)/rusEfiStartup.S + +HW_STM32_PORT_DIR = $(PROJECT_DIR)/hw_layer/ports/stm32 + +HW_INC += \ + $(HW_STM32_PORT_DIR) \ + $(HW_STM32_PORT_DIR)/serial_over_usb diff --git a/firmware/hw_layer/ports/mpu_util.h b/firmware/hw_layer/ports/mpu_util.h index 0f2582303e..306ab747cd 100644 --- a/firmware/hw_layer/ports/mpu_util.h +++ b/firmware/hw_layer/ports/mpu_util.h @@ -21,6 +21,15 @@ bool isStm32F42x(); // ADC #if HAL_USE_ADC + +adc_channel_e getAdcChannel(brain_pin_e pin); +brain_pin_e getAdcChannelBrainPin(const char *msg, adc_channel_e hwChannel); + +// deprecated - migrate to 'getAdcChannelBrainPin' +ioportid_t getAdcChannelPort(const char *msg, adc_channel_e hwChannel); +// deprecated - migrate to 'getAdcChannelBrainPin' +int getAdcChannelPin(adc_channel_e hwChannel); + void portInitAdc(); float getMcuTemperature(); // Convert all slow ADC inputs. Returns true if the conversion succeeded, false if a failure occured. @@ -34,8 +43,11 @@ bool isValidCanRxPin(brain_pin_e pin); CANDriver* detectCanDevice(brain_pin_e pinRx, brain_pin_e pinTx); #endif // HAL_USE_CAN +// Serial +#if EFI_AUX_SERIAL bool isValidSerialTxPin(brain_pin_e pin); bool isValidSerialRxPin(brain_pin_e pin); +#endif //EFI_AUX_SERIAL // SPI #if HAL_USE_SPI diff --git a/firmware/hw_layer/ports/stm32/stm32_common_adc.cpp b/firmware/hw_layer/ports/stm32/stm32_adc.cpp similarity index 100% rename from firmware/hw_layer/ports/stm32/stm32_common_adc.cpp rename to firmware/hw_layer/ports/stm32/stm32_adc.cpp diff --git a/firmware/hw_layer/ports/stm32/stm32_common_can.cpp b/firmware/hw_layer/ports/stm32/stm32_can.cpp similarity index 100% rename from firmware/hw_layer/ports/stm32/stm32_common_can.cpp rename to firmware/hw_layer/ports/stm32/stm32_can.cpp diff --git a/firmware/hw_layer/ports/stm32/stm32_common.cpp b/firmware/hw_layer/ports/stm32/stm32_common.cpp index cf44ab1a21..b1338af677 100644 --- a/firmware/hw_layer/ports/stm32/stm32_common.cpp +++ b/firmware/hw_layer/ports/stm32/stm32_common.cpp @@ -67,18 +67,6 @@ void jump_to_openblt() { #if EFI_PROD_CODE -#ifdef AT32F4XX -BOR_Level_t BOR_Get(void) { - /* TODO: Artery */ - /* Fake */ - return BOR_Level_None; -} - -BOR_Result_t BOR_Set(BOR_Level_t BORValue) { - /* NOP */ - return BOR_Result_Ok; -} -#else BOR_Level_t BOR_Get(void) { FLASH_OBProgramInitTypeDef FLASH_Handle; @@ -114,7 +102,6 @@ BOR_Result_t BOR_Set(BOR_Level_t BORValue) { return BOR_Result_Ok; } -#endif void baseMCUInit(void) { // looks like this holds a random value on start? Let's set a nice clean zero diff --git a/firmware/hw_layer/ports/stm32/stm32_common.mk b/firmware/hw_layer/ports/stm32/stm32_common.mk index f951d3d12d..92f460d64f 100644 --- a/firmware/hw_layer/ports/stm32/stm32_common.mk +++ b/firmware/hw_layer/ports/stm32/stm32_common.mk @@ -4,11 +4,11 @@ HW_LAYER_PORT_CPP += \ $(HW_STM32_PORT_DIR)/serial_over_usb/usbconsole.cpp \ $(HW_STM32_PORT_DIR)/stm32_pins.cpp \ $(HW_STM32_PORT_DIR)/stm32_common.cpp \ - $(HW_STM32_PORT_DIR)/stm32_common_adc.cpp \ - $(HW_STM32_PORT_DIR)/stm32_common_can.cpp \ - $(HW_STM32_PORT_DIR)/stm32_common_pwm.cpp \ - $(HW_STM32_PORT_DIR)/stm32_common_serial.cpp \ - $(HW_STM32_PORT_DIR)/stm32_common_spi.cpp \ + $(HW_STM32_PORT_DIR)/stm32_adc.cpp \ + $(HW_STM32_PORT_DIR)/stm32_can.cpp \ + $(HW_STM32_PORT_DIR)/stm32_pwm.cpp \ + $(HW_STM32_PORT_DIR)/stm32_serial.cpp \ + $(HW_STM32_PORT_DIR)/stm32_spi.cpp \ $(HW_STM32_PORT_DIR)/stm32_icu.cpp \ $(HW_STM32_PORT_DIR)/backup_ram.cpp \ $(HW_STM32_PORT_DIR)/microsecond_timer_stm32.cpp \ diff --git a/firmware/hw_layer/ports/stm32/stm32_common_pwm.cpp b/firmware/hw_layer/ports/stm32/stm32_pwm.cpp similarity index 100% rename from firmware/hw_layer/ports/stm32/stm32_common_pwm.cpp rename to firmware/hw_layer/ports/stm32/stm32_pwm.cpp diff --git a/firmware/hw_layer/ports/stm32/stm32_common_serial.cpp b/firmware/hw_layer/ports/stm32/stm32_serial.cpp similarity index 100% rename from firmware/hw_layer/ports/stm32/stm32_common_serial.cpp rename to firmware/hw_layer/ports/stm32/stm32_serial.cpp diff --git a/firmware/hw_layer/ports/stm32/stm32_common_spi.cpp b/firmware/hw_layer/ports/stm32/stm32_spi.cpp similarity index 100% rename from firmware/hw_layer/ports/stm32/stm32_common_spi.cpp rename to firmware/hw_layer/ports/stm32/stm32_spi.cpp diff --git a/firmware/hw_layer/ports/stm32/stm32f4/hw_ports.mk b/firmware/hw_layer/ports/stm32/stm32f4/hw_ports.mk index ee2e0a4dd1..abc0a92b08 100644 --- a/firmware/hw_layer/ports/stm32/stm32f4/hw_ports.mk +++ b/firmware/hw_layer/ports/stm32/stm32f4/hw_ports.mk @@ -33,12 +33,12 @@ else DDEFS += -DSTM32F407xx endif -# Now add common stm32 stuff -include $(PROJECT_DIR)/hw_layer/ports/stm32/stm32_common.mk - -# Add Artery AT32 common stuff ifeq ($(IS_AT32F435),yes) + # Add Artery AT32 common stuff include $(PROJECT_DIR)/hw_layer/ports/at32/at32_common.mk +else + # Or STM32 common stuff + include $(PROJECT_DIR)/hw_layer/ports/stm32/stm32_common.mk endif # TODO: remove, for efifeatures.h