From 64f79348c800da9f12e9b7fab5672e86de1accdc Mon Sep 17 00:00:00 2001 From: Piotr Lewandowski Date: Sat, 24 Jun 2023 17:40:31 +0200 Subject: [PATCH] orgina-fw-in-linkerscript-cmake-decomposer --- src/par_runner/CMakeLists.txt | 10 +- src/par_runner/dp32g030.s | 250 ++++++++++++++++++ src/par_runner/memory.ld | 14 +- src/par_runner/orginal_fw/CMakeLists.txt | 40 +++ src/par_runner/orginal_fw/fw_decomposer.py | 23 ++ .../orginal_fw/output_00000_10000.bin | Bin 0 -> 65536 bytes src/par_runner/system/system.cpp | 9 + src/par_runner/system/system.hpp | 20 ++ 8 files changed, 361 insertions(+), 5 deletions(-) create mode 100644 src/par_runner/dp32g030.s create mode 100644 src/par_runner/orginal_fw/CMakeLists.txt create mode 100644 src/par_runner/orginal_fw/fw_decomposer.py create mode 100644 src/par_runner/orginal_fw/output_00000_10000.bin create mode 100644 src/par_runner/system/system.cpp create mode 100644 src/par_runner/system/system.hpp diff --git a/src/par_runner/CMakeLists.txt b/src/par_runner/CMakeLists.txt index bfe534f..c2fcc7e 100644 --- a/src/par_runner/CMakeLists.txt +++ b/src/par_runner/CMakeLists.txt @@ -1,14 +1,16 @@ set(NAME par_runner) set(MCU_TARGET_FILES_DIR ../mcu_target_common) +add_subdirectory(orginal_fw) + add_executable(${NAME} - ${MCU_TARGET_FILES_DIR}/system_stm32f0xx.c - ${MCU_TARGET_FILES_DIR}/stm32f030xc.s - main.cpp +${MCU_TARGET_FILES_DIR}/stm32f030xc.s +main.cpp ) target_link_libraries(${NAME} f030_drivers + orginal_fw ) target_include_directories(${NAME} PUBLIC @@ -33,7 +35,7 @@ target_link_options(${NAME} PRIVATE -mcpu=cortex-m0 -mthumb -mfpu=auto - -mfloat-abi=soft #lets go fpu + -mfloat-abi=soft -specs=nosys.specs -specs=nano.specs -lc diff --git a/src/par_runner/dp32g030.s b/src/par_runner/dp32g030.s new file mode 100644 index 0000000..0b33d28 --- /dev/null +++ b/src/par_runner/dp32g030.s @@ -0,0 +1,250 @@ + .syntax unified + .cpu cortex-m0 + .fpu softvfp + .thumb + +.global g_pfnVectors +.global Default_Handler + +/* start address for the initialization values of the .data section. +defined in linker script */ +.word _sidata +/* start address for the .data section. defined in linker script */ +.word _sdata +/* end address for the .data section. defined in linker script */ +.word _edata +/* start address for the .bss section. defined in linker script */ +.word _sbss +/* end address for the .bss section. defined in linker script */ +.word _ebss + + .section .text.Reset_Handler + .weak Reset_Handler + .type Reset_Handler, %function +Reset_Handler: + ldr r0, =_estack + mov sp, r0 /* set stack pointer */ + +/* Copy the data segment initializers from flash to SRAM */ + ldr r0, =_sdata + ldr r1, =_edata + ldr r2, =_sidata + movs r3, #0 + b LoopCopyDataInit + +CopyDataInit: + ldr r4, [r2, r3] + str r4, [r0, r3] + adds r3, r3, #4 + +LoopCopyDataInit: + adds r4, r0, r3 + cmp r4, r1 + bcc CopyDataInit + +/* Zero fill the bss segment. */ + ldr r2, =_sbss + ldr r4, =_ebss + movs r3, #0 + b LoopFillZerobss + +FillZerobss: + str r3, [r2] + adds r2, r2, #4 + +LoopFillZerobss: + cmp r2, r4 + bcc FillZerobss + +/* Call the clock system intitialization function.*/ +/* bl SystemInit */ +/* Call static constructors */ + @bl __libc_init_array +/* Call the application's entry point.*/ + bl main + +LoopForever: + b LoopForever + + +.size Reset_Handler, .-Reset_Handler + +/** + * @brief This is the code that gets called when the processor receives an + * unexpected interrupt. This simply enters an infinite loop, preserving + * the system state for examination by a debugger. + * + * @param None + * @retval : None +*/ + .section .text.Default_Handler,"ax",%progbits +Default_Handler: +Infinite_Loop: + b Infinite_Loop + .size Default_Handler, .-Default_Handler +/****************************************************************************** +* +* The minimal vector table for a Cortex M0. Note that the proper constructs +* must be placed on this to ensure that it ends up at physical address +* 0x0000.0000. +* +******************************************************************************/ + .section .isr_vector,"a",%progbits + .type g_pfnVectors, %object + .size g_pfnVectors, .-g_pfnVectors + + +g_pfnVectors: + .word _estack + .word Reset_Handler + .word NMI_Handler + .word HardFault_Handler + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word SVC_Handler + .word 0 + .word 0 + .word PendSV_Handler + .word SysTick_Handler + .word WWDG_IRQHandler /* Window WatchDog */ + .word 0 /* Reserved */ + .word RTC_IRQHandler /* RTC through the EXTI line */ + .word FLASH_IRQHandler /* FLASH */ + .word RCC_IRQHandler /* RCC */ + .word EXTI0_1_IRQHandler /* EXTI Line 0 and 1 */ + .word EXTI2_3_IRQHandler /* EXTI Line 2 and 3 */ + .word EXTI4_15_IRQHandler /* EXTI Line 4 to 15 */ + .word 0 /* Reserved */ + .word DMA1_Channel1_IRQHandler /* DMA1 Channel 1 */ + .word DMA1_Channel2_3_IRQHandler /* DMA1 Channel 2 and Channel 3 */ + .word DMA1_Channel4_5_IRQHandler /* DMA1 Channel 4 and Channel 5 */ + .word ADC1_IRQHandler /* ADC1 */ + .word TIM1_BRK_UP_TRG_COM_IRQHandler /* TIM1 Break, Update, Trigger and Commutation */ + .word TIM1_CC_IRQHandler /* TIM1 Capture Compare */ + .word 0 /* Reserved */ + .word TIM3_IRQHandler /* TIM3 */ + .word TIM6_IRQHandler /* TIM6 */ + .word TIM7_IRQHandler /* TIM7 */ + .word TIM14_IRQHandler /* TIM14 */ + .word TIM15_IRQHandler /* TIM15 */ + .word TIM16_IRQHandler /* TIM16 */ + .word TIM17_IRQHandler /* TIM17 */ + .word I2C1_IRQHandler /* I2C1 */ + .word I2C2_IRQHandler /* I2C2 */ + .word SPI1_IRQHandler /* SPI1 */ + .word SPI2_IRQHandler /* SPI2 */ + .word USART1_IRQHandler /* USART1 */ + .word USART2_IRQHandler /* USART2 */ + .word USART3_6_IRQHandler /* USART3, USART4, USART5, USART6 */ + .word 0 /* Reserved */ + +/******************************************************************************* +* +* Provide weak aliases for each Exception handler to the Default_Handler. +* As they are weak aliases, any function with the same name will override +* this definition. +* +*******************************************************************************/ + + .weak NMI_Handler + .thumb_set NMI_Handler,Default_Handler + + .weak HardFault_Handler + .thumb_set HardFault_Handler,Default_Handler + + .weak SVC_Handler + .thumb_set SVC_Handler,Default_Handler + + .weak PendSV_Handler + .thumb_set PendSV_Handler,Default_Handler + + .weak SysTick_Handler + .thumb_set SysTick_Handler,Default_Handler + + .weak WWDG_IRQHandler + .thumb_set WWDG_IRQHandler,Default_Handler + + .weak RTC_IRQHandler + .thumb_set RTC_IRQHandler,Default_Handler + + .weak FLASH_IRQHandler + .thumb_set FLASH_IRQHandler,Default_Handler + + .weak RCC_IRQHandler + .thumb_set RCC_IRQHandler,Default_Handler + + .weak EXTI0_1_IRQHandler + .thumb_set EXTI0_1_IRQHandler,Default_Handler + + .weak EXTI2_3_IRQHandler + .thumb_set EXTI2_3_IRQHandler,Default_Handler + + .weak EXTI4_15_IRQHandler + .thumb_set EXTI4_15_IRQHandler,Default_Handler + + .weak DMA1_Channel1_IRQHandler + .thumb_set DMA1_Channel1_IRQHandler,Default_Handler + + .weak DMA1_Channel2_3_IRQHandler + .thumb_set DMA1_Channel2_3_IRQHandler,Default_Handler + + .weak DMA1_Channel4_5_IRQHandler + .thumb_set DMA1_Channel4_5_IRQHandler,Default_Handler + + .weak ADC1_IRQHandler + .thumb_set ADC1_IRQHandler,Default_Handler + + .weak TIM1_BRK_UP_TRG_COM_IRQHandler + .thumb_set TIM1_BRK_UP_TRG_COM_IRQHandler,Default_Handler + + .weak TIM1_CC_IRQHandler + .thumb_set TIM1_CC_IRQHandler,Default_Handler + + .weak TIM3_IRQHandler + .thumb_set TIM3_IRQHandler,Default_Handler + + .weak TIM6_IRQHandler + .thumb_set TIM6_IRQHandler,Default_Handler + + .weak TIM7_IRQHandler + .thumb_set TIM7_IRQHandler,Default_Handler + + .weak TIM14_IRQHandler + .thumb_set TIM14_IRQHandler,Default_Handler + + .weak TIM15_IRQHandler + .thumb_set TIM15_IRQHandler,Default_Handler + + .weak TIM16_IRQHandler + .thumb_set TIM16_IRQHandler,Default_Handler + + .weak TIM17_IRQHandler + .thumb_set TIM17_IRQHandler,Default_Handler + + .weak I2C1_IRQHandler + .thumb_set I2C1_IRQHandler,Default_Handler + + .weak I2C2_IRQHandler + .thumb_set I2C2_IRQHandler,Default_Handler + + .weak SPI1_IRQHandler + .thumb_set SPI1_IRQHandler,Default_Handler + + .weak SPI2_IRQHandler + .thumb_set SPI2_IRQHandler,Default_Handler + + .weak USART1_IRQHandler + .thumb_set USART1_IRQHandler,Default_Handler + + .weak USART2_IRQHandler + .thumb_set USART2_IRQHandler,Default_Handler + + .weak USART3_6_IRQHandler + .thumb_set USART3_6_IRQHandler,Default_Handler + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/src/par_runner/memory.ld b/src/par_runner/memory.ld index 6ad1269..03efb3e 100644 --- a/src/par_runner/memory.ld +++ b/src/par_runner/memory.ld @@ -17,7 +17,19 @@ SECTIONS KEEP(*(.isr_vectors)) . = ALIGN(4); } >FLASH - + + .org_fw : + { + . = ALIGN(4); + KEEP(*(.org_fw)) + } > FLASH + + .org_vectors : + { + . = ALIGN(4); + *(.org_vectors) + } > FLASH + .text : { *(.text) diff --git a/src/par_runner/orginal_fw/CMakeLists.txt b/src/par_runner/orginal_fw/CMakeLists.txt new file mode 100644 index 0000000..bb40cb9 --- /dev/null +++ b/src/par_runner/orginal_fw/CMakeLists.txt @@ -0,0 +1,40 @@ +set(LIB_NAME orginal_fw) + +set(ORGINAL_FW_BIN output_00000_10000.bin) + +set(ORGINAL_FW_VECTORS_BIN org_vectors.bin) +set(ORGINAL_FW_VECTORS_OBJ org_vectors.o) + +set(ORGINAL_FW_REST_BIN org_rest.bin) +set(ORGINAL_FW_REST_OBJ org_rest.o) + +add_custom_command(OUTPUT ${ORGINAL_FW_VECTORS_BIN} ${ORGINAL_FW_REST_BIN} + COMMAND python ${CMAKE_CURRENT_SOURCE_DIR}/fw_decomposer.py 48 ${CMAKE_CURRENT_SOURCE_DIR}/${ORGINAL_FW_BIN} ${ORGINAL_FW_VECTORS_BIN} ${ORGINAL_FW_REST_BIN} + DEPENDS ${ORGINAL_FW_BIN} + COMMENT "parsing orginal fw ${ORGINAL_FW_BIN}" +) + +add_custom_command(OUTPUT ${ORGINAL_FW_VECTORS_OBJ} ${ORGINAL_FW_REST_OBJ} + COMMAND arm-none-eabi-objcopy -I binary -O elf32-littlearm -B arm --rename-section .data=.org_vectors ${ORGINAL_FW_VECTORS_BIN} ${ORGINAL_FW_VECTORS_OBJ} + COMMAND arm-none-eabi-objcopy -I binary -O elf32-littlearm -B arm --rename-section .data=.org_fw ${ORGINAL_FW_REST_BIN} ${ORGINAL_FW_REST_OBJ} + DEPENDS ${ORGINAL_FW_VECTORS_BIN} ${ORGINAL_FW_REST_BIN} + COMMENT "generating vector table and fw object files" +) + +add_custom_target(generate_obj_files + DEPENDS ${ORGINAL_FW_VECTORS_OBJ} ${ORGINAL_FW_REST_OBJ} +) + +add_library(${LIB_NAME} OBJECT) +set_target_properties(${LIB_NAME} PROPERTIES LINKER_LANGUAGE C) +add_dependencies(${LIB_NAME} generate_obj_files) + +target_sources(${LIB_NAME} PRIVATE + ${ORGINAL_FW_VECTORS_OBJ} + ${ORGINAL_FW_REST_OBJ} +) + +target_link_libraries(${LIB_NAME} + ${CMAKE_CURRENT_BINARY_DIR}/${ORGINAL_FW_VECTORS_OBJ} + ${CMAKE_CURRENT_BINARY_DIR}/${ORGINAL_FW_REST_OBJ} +) \ No newline at end of file diff --git a/src/par_runner/orginal_fw/fw_decomposer.py b/src/par_runner/orginal_fw/fw_decomposer.py new file mode 100644 index 0000000..74b8475 --- /dev/null +++ b/src/par_runner/orginal_fw/fw_decomposer.py @@ -0,0 +1,23 @@ +import sys +class FwDecompozer: + def __init__(self, vector_table_size, file): + self.vector_table_size = vector_table_size * 4 + self.file = open(file, 'rb') + + def save_vector_table(self, filename): + output = open(filename, 'wb') + self.file.seek(0) + output.write(self.file.read(self.vector_table_size)) + output.close() + + def save_stripped_fw(self, filename): + output = open(filename, 'wb') + self.file.seek(self.vector_table_size, 0) + output.write(self.file.read()) + output.close() + +if __name__ == '__main__': + args = sys.argv + fw = FwDecompozer(int(args[1]), args[2]) + fw.save_vector_table(args[3]) + fw.save_stripped_fw(args[4]) \ No newline at end of file diff --git a/src/par_runner/orginal_fw/output_00000_10000.bin b/src/par_runner/orginal_fw/output_00000_10000.bin new file mode 100644 index 0000000000000000000000000000000000000000..fc446b2940f0ad1770c74590724f693e56089286 GIT binary patch literal 65536 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 literal 0 HcmV?d00001 diff --git a/src/par_runner/system/system.cpp b/src/par_runner/system/system.cpp new file mode 100644 index 0000000..447a024 --- /dev/null +++ b/src/par_runner/system/system.cpp @@ -0,0 +1,9 @@ +#include "system.hpp" +using namespace System; + +extern "C" void Reset_Handler(); +TVectorTable VectorTable = +{ + &Reset_Handler, + &CommonIrqWrapper<1>, +}; \ No newline at end of file diff --git a/src/par_runner/system/system.hpp b/src/par_runner/system/system.hpp new file mode 100644 index 0000000..3000b29 --- /dev/null +++ b/src/par_runner/system/system.hpp @@ -0,0 +1,20 @@ +namespace System +{ + using VoidFxPointer = void(*)(void); + static constexpr auto CortexM0VectorsCnt = 16+32; + + struct TVectorTable + { + VoidFxPointer Vectors[CortexM0VectorsCnt]; + }; + + template + inline void CommonIrqWrapper() + { + extern TVectorTable OrginalFwVevtorTable; + if (OrginalFwVevtorTable.Vectors[VectorNr]) + { + OrginalFwVevtorTable.Vectors[VectorNr](); + } + } +} \ No newline at end of file