From 7cc332c6cd1dfa97f9380dd2e4a56aa0a37d7a2f Mon Sep 17 00:00:00 2001 From: aprochazka Date: Tue, 28 Feb 2023 20:33:38 +0100 Subject: [PATCH] buildable with cmake --- Firmware/.vscode/settings.json | 23 +- Firmware/Core/Src/main.c | 4 +- Firmware/Core/Src/stm32l4xx_it.c | 56 ++-- Firmware/Core/tinyusb/src/device/usbd.h | 1 + Firmware/Makefile | 368 +++++++++--------------- 5 files changed, 179 insertions(+), 273 deletions(-) diff --git a/Firmware/.vscode/settings.json b/Firmware/.vscode/settings.json index e3a07cc..287f42f 100644 --- a/Firmware/.vscode/settings.json +++ b/Firmware/.vscode/settings.json @@ -1,9 +1,16 @@ { - "files.associations": { - "cdc_device.h": "c", - "tusb_option.h": "c", - "tusb.h": "c", - "stdbool.h": "c" - }, - "C_Cpp.errorSquiggles": "disabled" -} \ No newline at end of file + "files.associations": { + "cdc_device.h": "c", + "tusb_option.h": "c", + "tusb.h": "c", + "stdbool.h": "c", + "usbh_classdriver.h": "c", + "tusb_common.h": "c", + "tusb_types.h": "c", + "tusb_compiler.h": "c", + "tusb_verify.h": "c", + "tusb_debug.h": "c", + "tusb_timeout.h": "c" + }, + "C_Cpp.errorSquiggles": "disabled" +} diff --git a/Firmware/Core/Src/main.c b/Firmware/Core/Src/main.c index 31da6a9..3b39e09 100755 --- a/Firmware/Core/Src/main.c +++ b/Firmware/Core/Src/main.c @@ -86,7 +86,7 @@ int main(void) HAL_Init(); /* USER CODE BEGIN Init */ - tusb_init(); + // tusb_init(); /* USER CODE END Init */ @@ -119,7 +119,7 @@ int main(void) /* USER CODE BEGIN WHILE */ while (1) { - tud_task(); + // tud_task(); /* Cam_Capture(&hspi1); diff --git a/Firmware/Core/Src/stm32l4xx_it.c b/Firmware/Core/Src/stm32l4xx_it.c index bed7e08..8399542 100644 --- a/Firmware/Core/Src/stm32l4xx_it.c +++ b/Firmware/Core/Src/stm32l4xx_it.c @@ -67,8 +67,8 @@ extern PCD_HandleTypeDef hpcd_USB_FS; /* Cortex-M4 Processor Interruption and Exception Handlers */ /******************************************************************************/ /** - * @brief This function handles Non maskable interrupt. - */ + * @brief This function handles Non maskable interrupt. + */ void NMI_Handler(void) { /* USER CODE BEGIN NonMaskableInt_IRQn 0 */ @@ -82,8 +82,8 @@ void NMI_Handler(void) } /** - * @brief This function handles Hard fault interrupt. - */ + * @brief This function handles Hard fault interrupt. + */ void HardFault_Handler(void) { /* USER CODE BEGIN HardFault_IRQn 0 */ @@ -97,8 +97,8 @@ void HardFault_Handler(void) } /** - * @brief This function handles Memory management fault. - */ + * @brief This function handles Memory management fault. + */ void MemManage_Handler(void) { /* USER CODE BEGIN MemoryManagement_IRQn 0 */ @@ -112,8 +112,8 @@ void MemManage_Handler(void) } /** - * @brief This function handles Prefetch fault, memory access fault. - */ + * @brief This function handles Prefetch fault, memory access fault. + */ void BusFault_Handler(void) { /* USER CODE BEGIN BusFault_IRQn 0 */ @@ -127,8 +127,8 @@ void BusFault_Handler(void) } /** - * @brief This function handles Undefined instruction or illegal state. - */ + * @brief This function handles Undefined instruction or illegal state. + */ void UsageFault_Handler(void) { /* USER CODE BEGIN UsageFault_IRQn 0 */ @@ -142,8 +142,8 @@ void UsageFault_Handler(void) } /** - * @brief This function handles System service call via SWI instruction. - */ + * @brief This function handles System service call via SWI instruction. + */ void SVC_Handler(void) { /* USER CODE BEGIN SVCall_IRQn 0 */ @@ -155,8 +155,8 @@ void SVC_Handler(void) } /** - * @brief This function handles Debug monitor. - */ + * @brief This function handles Debug monitor. + */ void DebugMon_Handler(void) { /* USER CODE BEGIN DebugMonitor_IRQn 0 */ @@ -168,8 +168,8 @@ void DebugMon_Handler(void) } /** - * @brief This function handles Pendable request for system service. - */ + * @brief This function handles Pendable request for system service. + */ void PendSV_Handler(void) { /* USER CODE BEGIN PendSV_IRQn 0 */ @@ -181,8 +181,8 @@ void PendSV_Handler(void) } /** - * @brief This function handles System tick timer. - */ + * @brief This function handles System tick timer. + */ void SysTick_Handler(void) { /* USER CODE BEGIN SysTick_IRQn 0 */ @@ -202,8 +202,8 @@ void SysTick_Handler(void) /******************************************************************************/ /** - * @brief This function handles DMA1 channel2 global interrupt. - */ + * @brief This function handles DMA1 channel2 global interrupt. + */ void DMA1_Channel2_IRQHandler(void) { /* USER CODE BEGIN DMA1_Channel2_IRQn 0 */ @@ -216,8 +216,8 @@ void DMA1_Channel2_IRQHandler(void) } /** - * @brief This function handles DMA1 channel3 global interrupt. - */ + * @brief This function handles DMA1 channel3 global interrupt. + */ void DMA1_Channel3_IRQHandler(void) { /* USER CODE BEGIN DMA1_Channel3_IRQn 0 */ @@ -230,8 +230,8 @@ void DMA1_Channel3_IRQHandler(void) } /** - * @brief This function handles USART2 global interrupt. - */ + * @brief This function handles USART2 global interrupt. + */ void USART2_IRQHandler(void) { /* USER CODE BEGIN USART2_IRQn 0 */ @@ -244,14 +244,14 @@ void USART2_IRQHandler(void) } /** - * @brief This function handles USB event interrupt through EXTI line 17. - */ + * @brief This function handles USB event interrupt through EXTI line 17. + */ void USB_IRQHandler(void) { /* USER CODE BEGIN USB_IRQn 0 */ - tud_int_handler(0); - return; + // tud_int_handler(0); + // return; /* USER CODE END USB_IRQn 0 */ HAL_PCD_IRQHandler(&hpcd_USB_FS); /* USER CODE BEGIN USB_IRQn 1 */ diff --git a/Firmware/Core/tinyusb/src/device/usbd.h b/Firmware/Core/tinyusb/src/device/usbd.h index f7fa2ac..8dd6246 100644 --- a/Firmware/Core/tinyusb/src/device/usbd.h +++ b/Firmware/Core/tinyusb/src/device/usbd.h @@ -28,6 +28,7 @@ #define _TUSB_USBD_H_ #include "common/tusb_common.h" +#include "msc.h" #ifdef __cplusplus extern "C" diff --git a/Firmware/Makefile b/Firmware/Makefile index 11b8361..a92b9fd 100644 --- a/Firmware/Makefile +++ b/Firmware/Makefile @@ -1,235 +1,133 @@ -########################################################################################################################## -# File automatically-generated by tool: [projectgenerator] version: [3.18.0-B7] date: [Thu Feb 23 10:07:32 CET 2023] -########################################################################################################################## - -# ------------------------------------------------ -# Generic Makefile (based on gcc) -# -# ChangeLog : -# 2017-02-10 - Several enhancements + project update mode -# 2015-07-22 - first version -# ------------------------------------------------ - -###################################### -# target -###################################### -TARGET = Probe - - -###################################### -# building variables -###################################### -# debug build? -DEBUG = 1 -# optimization -OPT = -Og - - -####################################### -# paths -####################################### -# Build path -BUILD_DIR = build - -###################################### -# source -###################################### -# C sources -C_SOURCES = \ -Core/Src/main.c \ -Core/Src/stm32l4xx_it.c \ -Core/Src/stm32l4xx_hal_msp.c \ -Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_i2c.c \ -Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_i2c_ex.c \ -Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal.c \ -Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_rcc.c \ -Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_rcc_ex.c \ -Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash.c \ -Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash_ex.c \ -Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash_ramfunc.c \ -Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_gpio.c \ -Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_dma.c \ -Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_dma_ex.c \ -Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pwr.c \ -Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pwr_ex.c \ -Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_cortex.c \ -Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_exti.c \ -Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_spi.c \ -Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_spi_ex.c \ -Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_tim.c \ -Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_tim_ex.c \ -Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_uart.c \ -Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_uart_ex.c \ -Core/Src/system_stm32l4xx.c \ -Core/Cam/Cam.c \ -Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pcd.c \ -Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pcd_ex.c \ -Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_ll_usb.c \ -Core/src/tusb.c \ -Core/src/common/tusb_fifo.c \ -Core/src/device/usbd.c \ -Core/src/device/usbd_control.c \ -Core/src/class/audio/audio_device.c \ -Core/src/class/cdc/cdc_device.c \ -Core/src/class/dfu/dfu_device.c \ -Core/src/class/dfu/dfu_rt_device.c \ -Core/src/class/hid/hid_device.c \ -Core/src/class/midi/midi_device.c \ -Core/src/class/msc/msc_device.c \ -Core/src/class/net/ecm_rndis_device.c \ -Core/src/class/net/ncm_device.c \ -Core/src/class/usbtmc/usbtmc_device.c \ -Core/src/class/video/video_device.c \ -Core/src/class/vendor/vendor_device.c - -# ASM sources -ASM_SOURCES = \ -startup_stm32l432xx.s - - -####################################### -# binaries -####################################### -PREFIX = arm-none-eabi- -# The gcc compiler bin path can be either defined in make command via GCC_PATH variable (> make GCC_PATH=xxx) -# either it can be added to the PATH environment variable. -ifdef GCC_PATH -CC = $(GCC_PATH)/$(PREFIX)gcc -AS = $(GCC_PATH)/$(PREFIX)gcc -x assembler-with-cpp -CP = $(GCC_PATH)/$(PREFIX)objcopy -SZ = $(GCC_PATH)/$(PREFIX)size -else -CC = $(PREFIX)gcc -AS = $(PREFIX)gcc -x assembler-with-cpp -CP = $(PREFIX)objcopy -SZ = $(PREFIX)size -endif -HEX = $(CP) -O ihex -BIN = $(CP) -O binary -S - -####################################### -# CFLAGS -####################################### -# cpu -CPU = -mcpu=cortex-m4 - -# fpu -FPU = -mfpu=fpv4-sp-d16 - -# float-abi -FLOAT-ABI = -mfloat-abi=hard - -# mcu -MCU = $(CPU) -mthumb $(FPU) $(FLOAT-ABI) - -# macros for gcc -# AS defines -AS_DEFS = - -# C defines -C_DEFS = \ --DUSE_HAL_DRIVER \ --DSTM32L432xx - - -# AS includes -AS_INCLUDES = - -# C includes -C_INCLUDES = \ --ICore/Inc \ --IDrivers/STM32L4xx_HAL_Driver/Inc \ --IDrivers/STM32L4xx_HAL_Driver/Inc/Legacy \ --IDrivers/CMSIS/Device/ST/STM32L4xx/Include \ --IDrivers/CMSIS/Include \ --ICore/Cam \ --ICore/tinyusb \ --ICore/tinyusb/src \ --ICore/tinyusb/src/common \ --ICore/tinyusb/src/class \ --ICore/tinyusb/src/device - -# compile gcc flags -ASFLAGS = $(MCU) $(AS_DEFS) $(AS_INCLUDES) $(OPT) -Wall -fdata-sections -ffunction-sections -ggdb -fsingle-precision-constant -fno-strict-aliasing - -CFLAGS += $(MCU) $(C_DEFS) $(C_INCLUDES) $(OPT) -Wall -fdata-sections -ffunction-sections -ggdb -fsingle-precision-constant -fno-strict-aliasing - -ifeq ($(DEBUG), 1) -CFLAGS += -g -gdwarf-2 -endif - - -# Generate dependency information -CFLAGS += -MMD -MP -MF"$(@:%.o=%.d)" - - -####################################### -# LDFLAGS -####################################### -# link script -LDSCRIPT = STM32L432KCUx_FLASH.ld - -# libraries -LIBS = -lc -lm -lnosys -LIBDIR = -LDFLAGS = $(MCU) -specs=nano.specs -T$(LDSCRIPT) $(LIBDIR) $(LIBS) -Wl,-Map=$(BUILD_DIR)/$(TARGET).map,--cref -Wl,--gc-sections - -# default action: build all -all: $(BUILD_DIR)/$(TARGET).elf $(BUILD_DIR)/$(TARGET).hex $(BUILD_DIR)/$(TARGET).bin - -flash_build: $(BUILD_DIR)/$(TARGET).elf $(BUILD_DIR)/$(TARGET).hex $(BUILD_DIR)/$(TARGET).bin - -####################################### -# build the application -####################################### -# list of objects -OBJECTS = $(addprefix $(BUILD_DIR)/,$(notdir $(C_SOURCES:.c=.o))) -vpath %.c $(sort $(dir $(C_SOURCES))) -# list of ASM program objects -OBJECTS += $(addprefix $(BUILD_DIR)/,$(notdir $(ASM_SOURCES:.s=.o))) -vpath %.s $(sort $(dir $(ASM_SOURCES))) - -$(BUILD_DIR)/%.o: %.c Makefile | $(BUILD_DIR) - $(CC) -c $(CFLAGS) -Wa,-a,-ad,-alms=$(BUILD_DIR)/$(notdir $(<:.c=.lst)) $< -o $@ - -$(BUILD_DIR)/%.o: %.s Makefile | $(BUILD_DIR) - $(AS) -c $(CFLAGS) $< -o $@ - -$(BUILD_DIR)/$(TARGET).elf: $(OBJECTS) Makefile - $(CC) $(OBJECTS) $(LDFLAGS) -o $@ - $(SZ) $@ - -$(BUILD_DIR)/%.hex: $(BUILD_DIR)/%.elf | $(BUILD_DIR) - $(HEX) $< $@ - -$(BUILD_DIR)/%.bin: $(BUILD_DIR)/%.elf | $(BUILD_DIR) - $(BIN) $< $@ - -$(BUILD_DIR): - mkdir $@ - -####################################### -# clean up -####################################### -clean: - -rm -fR $(BUILD_DIR) - -####################################### -# dependencies -####################################### --include $(wildcard $(BUILD_DIR)/*.d) -DEPENDENCIES := $(OBJECTS:.o=.d) - --include $(shell mkdir .dep 2>/dev/null) $(wildcard .dep/*) --include $(DEPENDENCIES) - -# Flash -flash: flash_build - openocd -f interface/stlink.cfg -f target/stm32l4x.cfg -c "program build/$(TARGET).bin verify reset exit 0x08000000" - -reset: - openocd -f interface/stlink.cfg -f target/stm32l4x.cfg -c init -c "reset halt" - - - -# *** EOF *** +.PHONY: all build build-container cmake format format-linux flash-stlink flash-jlink format-container shell image build-container clean clean-image clean-all +############################### Native Makefile ############################### + +PROJECT_NAME ?= Probe +BUILD_DIR ?= build +FIRMWARE := $(BUILD_DIR)/$(PROJECT_NAME).bin +BUILD_TYPE ?= Debug +PLATFORM = $(if $(OS),$(OS),$(shell uname -s)) + +ifeq ($(PLATFORM),Windows_NT) + BUILD_SYSTEM ?= MinGW Makefiles +else + ifeq ($(PLATFORM),Linux) + BUILD_SYSTEM ?= Unix Makefiles + else + @echo "Unsuported platform" + exit 1 + endif +endif + +all: build + +build: cmake + $(MAKE) -C $(BUILD_DIR) --no-print-directory + +cmake: $(BUILD_DIR)/Makefile + +$(BUILD_DIR)/Makefile: CMakeLists.txt + cmake \ + -G "$(BUILD_SYSTEM)" \ + -B$(BUILD_DIR) \ + -DPROJECT_NAME=$(PROJECT_NAME) \ + -DCMAKE_BUILD_TYPE=$(BUILD_TYPE) \ + -DDUMP_ASM=OFF + +# Formats all user modified source files (add ones that are missing) +SRCS := $(shell find Project -name '*.[ch]' -or -name '*.[ch]pp') Core/Src/main.c +format: $(addsuffix .format,$(SRCS)) +%.format: % + clang-format -i $< + +# Formats all CubeMX generated sources to unix style - removes \r from line endings +# Add any new directories, like Middlewares and hidden files +HIDDEN_FILES := .mxproject .project .cproject +FOUND_HIDDEN_FILES := $(shell for f in $(HIDDEN_FILES);do if [[ -e $$f ]]; then echo $$f;fi; done) +FORMAT_LINUX := $(shell find Core Drivers -name '*' -type f; find . -name '*.ioc') $(FOUND_HIDDEN_FILES) + +format-linux: $(addsuffix .format-linux,$(FORMAT_LINUX)) +%.format-linux: % + $(if $(filter $(PLATFORM),Linux),dos2unix -q $<,) + +# Device specific! +DEVICE ?= STM32F407VG + +flash-st: build + st-flash --reset write $(FIRMWARE) 0x08000000 + +$(BUILD_DIR)/jlink-script: + touch $@ + @echo device $(DEVICE) > $@ + @echo si 1 >> $@ + @echo speed 4000 >> $@ + @echo loadfile $(FIRMWARE),0x08000000 >> $@ + @echo -e "r\ng\nqc" >> $@ + +flash-jlink: build | $(BUILD_DIR)/jlink-script + JLinkExe -commanderScript $(BUILD_DIR)/jlink-script + +clean: + rm -rf $(BUILD_DIR) + +################################## Container ################################## + +UID ?= $(shell id -u) +GID ?= $(shell id -g) +USER ?= $(shell id -un) +GROUP ?= $(if $(filter $(PLATFORM), Windows_NT),$(shell id -un),$(shell id -gn)) + +ifeq ($(PLATFORM),Windows_NT) + WIN_PREFIX = winpty + WORKDIR_PATH = "//workdir" + WORKDIR_VOLUME = "/$$(pwd -W):/workdir" +else + WORKDIR_PATH = /workdir + WORKDIR_VOLUME = "$$(pwd):/workdir" +endif + +CONTAINER_TOOL ?= docker +CONTAINER_FILE := Dockerfile +IMAGE_NAME := fedora-arm-embedded-dev +CONTAINER_NAME := fedora-arm-embedded-dev + +NEED_IMAGE = $(shell $(CONTAINER_TOOL) image inspect $(IMAGE_NAME) 2> /dev/null > /dev/null || echo image) +# usefull if you have a always running container in the background: NEED_CONTAINER = $(shell $(CONTAINER_TOOL) container inspect $(CONTAINER_NAME) 2> /dev/null > /dev/null || echo container) +PODMAN_ARG = $(if $(filter $(CONTAINER_TOOL), podman),--userns=keep-id,) +CONTAINER_RUN = $(WIN_PREFIX) $(CONTAINER_TOOL) run \ + --name $(CONTAINER_NAME) \ + --rm \ + -it \ + $(PODMAN_ARG) \ + -v $(WORKDIR_VOLUME) \ + -w $(WORKDIR_PATH) \ + --security-opt label=disable \ + --hostname $(CONTAINER_NAME) \ + $(IMAGE_NAME) + +build-container: $(NEED_IMAGE) + $(CONTAINER_RUN) bash -lc 'make -j$(shell nproc)' + +format-container: + $(CONTAINER_RUN) bash -lc 'make format -j$(shell nproc)' + +format-linux-container: + $(CONTAINER_RUN) bash -lc 'make format-linux' + +shell: + $(CONTAINER_RUN) bash -l + +image: $(CONTAINER_FILE) + $(CONTAINER_TOOL) build \ + -t $(IMAGE_NAME) \ + -f=$(CONTAINER_FILE) \ + --build-arg UID=$(UID) \ + --build-arg GID=$(GID) \ + --build-arg USERNAME=$(USER) \ + --build-arg GROUPNAME=$(GROUP) \ + . + +clean-image: + $(CONTAINER_TOOL) container rm -f $(CONTAINER_NAME) 2> /dev/null > /dev/null || true + $(CONTAINER_TOOL) image rmi -f $(IMAGE_NAME) 2> /dev/null > /dev/null || true + +clean-all: clean clean-image