[FL-2052] New build system based on scons (#1269)

This commit is contained in:
hedger
2022-06-26 15:00:03 +03:00
committed by GitHub
parent c79fb61909
commit f3b1475ede
179 changed files with 3986 additions and 5196 deletions

View File

@@ -1,27 +0,0 @@
MAKEFILE_DIR := $(dir $(abspath $(firstword $(MAKEFILE_LIST))))
PROJECT_ROOT := $(abspath $(MAKEFILE_DIR)/..)
include $(PROJECT_ROOT)/make/base.mk
include $(PROJECT_ROOT)/make/freertos-heap.mk
include $(PROJECT_ROOT)/assets/assets.mk
include $(PROJECT_ROOT)/core/core.mk
include $(PROJECT_ROOT)/applications/applications.mk
include $(PROJECT_ROOT)/lib/lib.mk
CFLAGS += -I$(PROJECT_ROOT) -Itargets/furi_hal_include
CFLAGS += -Werror -Wno-address-of-packed-member
CPPFLAGS += -Werror
include $(PROJECT_ROOT)/make/defaults.mk
TARGET_DIR = targets/$(TARGET)
include $(TARGET_DIR)/target.mk
ifeq ($(RAM_EXEC), 0)
PROJECT := firmware
else
PROJECT := updater
endif
include $(PROJECT_ROOT)/make/git.mk
include $(PROJECT_ROOT)/make/toolchain.mk
include $(PROJECT_ROOT)/make/rules.mk

View File

@@ -19,37 +19,4 @@ Target independent code and headers in `target/include` folders. More details in
# Building
## With dev docker image:
`docker-compose exec dev make -C firmware`
## With toolchain installed in path:
`make -C firmware`
## Build Options
- `DEBUG` - 0/1 - enable or disable debug build. Default is 1.
- `COMPACT` - 0/1 - enable or disable compiler optimizations. Significantly reduces binary size. Default is 0.
- `TARGET` - string - target to build. Default is `f7`.
- `RAM_EXEC` - 0/1 - whether to build full firmware or RAM-based stage for firmware update. 0 is default, builds firmware.
# Building self-update package
`make DEBUG=0 COMPACT=1 updater_package`
# Flashing
Using SWD (STLink):
`make -C firmware flash`
Or use DFU (USB):
`make -C firmware upload`
# Debug
Using SWD (STLink):
`make -C firmware debug`
Check out `documentation/fbt.md` on how to build and flash firmware.

14
firmware/SConscript Normal file
View File

@@ -0,0 +1,14 @@
Import("env")
env.Append(LINT_SOURCES=["firmware"])
libenv = env.Clone(FW_LIB_NAME="flipper${TARGET_HW}")
libenv.ApplyLibFlags()
sources = ["targets/f${TARGET_HW}/startup_stm32wb55xx_cm4.s"]
sources += libenv.GlobRecursive("*.c")
lib = libenv.StaticLibrary("${FW_LIB_NAME}", sources)
libenv.Install("${LIB_DIST_DIR}", lib)
Return("lib")

View File

@@ -0,0 +1,37 @@
SECTIONS
{
.text 0x00000000 :
{
*(.text)
*(.text.*)
}
.rodata :
{
*(.rodata)
*(.rodata1)
*(.rodata.*)
}
.data :
{
*(.data)
*(.data1)
*(.data.*)
}
.bss :
{
*(.bss)
*(.bss.*)
*(.sbss)
*(.sbss.*)
*(COMMON)
}
/DISCARD/ :
{
*(.comment)
*(.comment.*)
}
}

View File

@@ -113,13 +113,34 @@ BleGlueStatus ble_glue_get_c2_status() {
return ble_glue->status;
}
static const char* ble_glue_get_reltype_str(const uint8_t reltype) {
static char relcode[3] = {0};
switch(reltype) {
case INFO_STACK_TYPE_BLE_FULL:
return "F";
case INFO_STACK_TYPE_BLE_HCI:
return "H";
case INFO_STACK_TYPE_BLE_LIGHT:
return "L";
case INFO_STACK_TYPE_BLE_BEACON:
return "Be";
case INFO_STACK_TYPE_BLE_BASIC:
return "Ba";
case INFO_STACK_TYPE_BLE_FULL_EXT_ADV:
return "F+";
case INFO_STACK_TYPE_BLE_HCI_EXT_ADV:
return "H+";
default:
snprintf(relcode, sizeof(relcode), "%X", reltype);
return relcode;
}
}
static void ble_glue_update_c2_fw_info() {
WirelessFwInfo_t wireless_info;
SHCI_GetWirelessFwInfo(&wireless_info);
BleGlueC2Info* local_info = &ble_glue->c2_info;
local_info->VersionMajor = wireless_info.VersionMajor;
local_info->VersionMinor = wireless_info.VersionMinor;
local_info->VersionMajor = wireless_info.VersionMajor;
local_info->VersionMinor = wireless_info.VersionMinor;
local_info->VersionSub = wireless_info.VersionSub;
@@ -132,6 +153,14 @@ static void ble_glue_update_c2_fw_info() {
local_info->MemorySizeFlash = wireless_info.MemorySizeFlash;
local_info->StackType = wireless_info.StackType;
snprintf(
local_info->StackTypeString,
BLE_GLUE_MAX_VERSION_STRING_LEN,
"%d.%d.%d.%s",
local_info->VersionMajor,
local_info->VersionMinor,
local_info->VersionSub,
ble_glue_get_reltype_str(local_info->StackType));
local_info->FusVersionMajor = wireless_info.FusVersionMajor;
local_info->FusVersionMinor = wireless_info.FusVersionMinor;

View File

@@ -13,6 +13,7 @@ typedef enum {
BleGlueC2ModeStack,
} BleGlueC2Mode;
#define BLE_GLUE_MAX_VERSION_STRING_LEN 20
typedef struct {
BleGlueC2Mode mode;
/**
@@ -28,6 +29,7 @@ typedef struct {
uint8_t MemorySizeSram1; /*< Multiple of 1K */
uint8_t MemorySizeFlash; /*< Multiple of 4K */
uint8_t StackType;
char StackTypeString[BLE_GLUE_MAX_VERSION_STRING_LEN];
/**
* Fus Info
*/

View File

@@ -5,6 +5,7 @@
#include <furi.h>
#include <m-string.h>
#include <protobuf_version.h>
#include <lib/toolbox/version.h>
#define TAG "BtDevInfoSvc"
@@ -15,15 +16,14 @@ typedef struct {
uint16_t firmware_rev_char_handle;
uint16_t software_rev_char_handle;
uint16_t rpc_version_char_handle;
string_t version_string;
char hardware_revision[4];
} DevInfoSvc;
static DevInfoSvc* dev_info_svc = NULL;
static const char dev_info_man_name[] = "Flipper Devices Inc.";
static const char dev_info_serial_num[] = "1.0";
static const char dev_info_firmware_rev_num[] = TOSTRING(TARGET);
static const char dev_info_software_rev_num[] = GIT_COMMIT " " GIT_BRANCH " " GIT_BRANCH_NUM
" " BUILD_DATE;
static const char dev_info_rpc_version[] = TOSTRING(PROTOBUF_MAJOR_VERSION.PROTOBUF_MINOR_VERSION);
static const uint8_t dev_info_rpc_version_uuid[] =
@@ -31,6 +31,18 @@ static const uint8_t dev_info_rpc_version_uuid[] =
void dev_info_svc_start() {
dev_info_svc = malloc(sizeof(DevInfoSvc));
string_init_printf(
dev_info_svc->version_string,
"%s %s %s %s",
version_get_githash(NULL),
version_get_gitbranch(NULL),
version_get_gitbranchnum(NULL),
version_get_builddate(NULL));
snprintf(
dev_info_svc->hardware_revision,
sizeof(dev_info_svc->hardware_revision),
"%d",
version_get_target(NULL));
tBleStatus status;
// Add Device Information Service
@@ -77,7 +89,7 @@ void dev_info_svc_start() {
dev_info_svc->service_handle,
UUID_TYPE_16,
(Char_UUID_t*)&uuid,
strlen(dev_info_firmware_rev_num),
strlen(dev_info_svc->hardware_revision),
CHAR_PROP_READ,
ATTR_PERMISSION_AUTHEN_READ,
GATT_DONT_NOTIFY_EVENTS,
@@ -92,7 +104,7 @@ void dev_info_svc_start() {
dev_info_svc->service_handle,
UUID_TYPE_16,
(Char_UUID_t*)&uuid,
strlen(dev_info_software_rev_num),
string_size(dev_info_svc->version_string),
CHAR_PROP_READ,
ATTR_PERMISSION_AUTHEN_READ,
GATT_DONT_NOTIFY_EVENTS,
@@ -140,8 +152,8 @@ void dev_info_svc_start() {
dev_info_svc->service_handle,
dev_info_svc->firmware_rev_char_handle,
0,
strlen(dev_info_firmware_rev_num),
(uint8_t*)dev_info_firmware_rev_num);
strlen(dev_info_svc->hardware_revision),
(uint8_t*)dev_info_svc->hardware_revision);
if(status) {
FURI_LOG_E(TAG, "Failed to update firmware revision char: %d", status);
}
@@ -149,8 +161,8 @@ void dev_info_svc_start() {
dev_info_svc->service_handle,
dev_info_svc->software_rev_char_handle,
0,
strlen(dev_info_software_rev_num),
(uint8_t*)dev_info_software_rev_num);
string_size(dev_info_svc->version_string),
(uint8_t*)string_get_cstr(dev_info_svc->version_string));
if(status) {
FURI_LOG_E(TAG, "Failed to update software revision char: %d", status);
}
@@ -168,6 +180,7 @@ void dev_info_svc_start() {
void dev_info_svc_stop() {
tBleStatus status;
if(dev_info_svc) {
string_clear(dev_info_svc->version_string);
// Delete service characteristics
status =
aci_gatt_del_char(dev_info_svc->service_handle, dev_info_svc->man_name_char_handle);

View File

@@ -7,12 +7,6 @@
extern "C" {
#endif
#define DEV_INFO_MANUFACTURER_NAME "Flipper Devices Inc."
#define DEV_INFO_SERIAL_NUMBER "1.0"
#define DEV_INFO_FIRMWARE_REVISION_NUMBER TARGET
#define DEV_INFO_SOFTWARE_REVISION_NUMBER \
GIT_COMMIT " " GIT_BRANCH " " GIT_BRANCH_NUM " " BUILD_DATE
void dev_info_svc_start();
void dev_info_svc_stop();

View File

@@ -33,7 +33,6 @@ extern "C" {
#include "app_conf.h" /* required as some configuration used in dbg_trace.h are set there */
#include "dbg_trace.h"
#include "hw_if.h"
#include <furi_hal.h>
/**
* Enable or Disable traces

View File

@@ -1,162 +0,0 @@
TOOLCHAIN = arm
FLASH_ADDRESS = 0x08000000
RAM_EXEC ?= 0
ifeq ($(RAM_EXEC), 1)
CFLAGS += -DFURI_RAM_EXEC -DVECT_TAB_SRAM -DFLIPPER_STREAM_LITE
else
LDFLAGS += -u _printf_float
endif
DEBUG_RTOS_THREADS ?= 1
ifeq ($(DEBUG_RTOS_THREADS), 1)
OPENOCD_OPTS = -f interface/stlink.cfg -c "transport select hla_swd" -f ../debug/stm32wbx.cfg -c "stm32wbx.cpu configure -rtos auto" -c "init"
else
OPENOCD_OPTS = -f interface/stlink.cfg -c "transport select hla_swd" -f ../debug/stm32wbx.cfg -c "init"
endif
MCU_FLAGS = -mcpu=cortex-m4 -mthumb -mfpu=fpv4-sp-d16 -mfloat-abi=hard
# Warnings configuration
CFLAGS += -Wall -Wextra -Wredundant-decls -Wdouble-promotion
CFLAGS += $(MCU_FLAGS) -DSTM32WB55xx -fdata-sections -ffunction-sections -fsingle-precision-constant
LDFLAGS += $(MCU_FLAGS) -specs=nosys.specs -specs=nano.specs
CPPFLAGS += -fno-rtti -fno-use-cxa-atexit -fno-exceptions
LDFLAGS += -Wl,--start-group -lstdc++ -lsupc++ -Wl,--end-group
HARDWARE_TARGET = 7
MXPROJECT_DIR = $(TARGET_DIR)
# Entry Point
ASM_SOURCES += $(MXPROJECT_DIR)/startup_stm32wb55xx_cm4.s
# STM32WB HAL
CUBE_DIR = ../lib/STM32CubeWB
CFLAGS += \
-DUSE_FULL_LL_DRIVER \
-DUSE_FULL_ASSERT \
-DHAVE_FREERTOS
CFLAGS += \
-I$(CUBE_DIR)/Drivers/STM32WBxx_HAL_Driver/Inc \
-I$(CUBE_DIR)/Drivers/CMSIS/Device/ST \
-I$(CUBE_DIR)/Drivers/CMSIS/Device/ST/STM32WBxx/Include \
-I$(CUBE_DIR)/Drivers/CMSIS/Include
C_SOURCES += \
$(CUBE_DIR)/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_ll_adc.c \
$(CUBE_DIR)/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_ll_comp.c \
$(CUBE_DIR)/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_ll_dma.c \
$(CUBE_DIR)/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_ll_gpio.c \
$(CUBE_DIR)/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_ll_i2c.c \
$(CUBE_DIR)/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_ll_lptim.c \
$(CUBE_DIR)/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_ll_rcc.c \
$(CUBE_DIR)/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_ll_rtc.c \
$(CUBE_DIR)/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_ll_spi.c \
$(CUBE_DIR)/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_ll_tim.c \
$(CUBE_DIR)/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_ll_usart.c \
$(CUBE_DIR)/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_ll_lpuart.c \
$(CUBE_DIR)/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_ll_utils.c \
$(CUBE_DIR)/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_ll_rng.c
# FreeRTOS
CFLAGS += \
-I$(LIB_DIR)/FreeRTOS-Kernel/include \
-I$(LIB_DIR)/FreeRTOS-Kernel/portable/GCC/ARM_CM4F \
-I$(LIB_DIR)/FreeRTOS-glue/
C_SOURCES += \
$(LIB_DIR)/FreeRTOS-Kernel/event_groups.c \
$(LIB_DIR)/FreeRTOS-Kernel/list.c \
$(LIB_DIR)/FreeRTOS-Kernel/queue.c \
$(LIB_DIR)/FreeRTOS-Kernel/stream_buffer.c \
$(LIB_DIR)/FreeRTOS-Kernel/tasks.c \
$(LIB_DIR)/FreeRTOS-Kernel/timers.c \
$(LIB_DIR)/FreeRTOS-Kernel/portable/GCC/ARM_CM4F/port.c \
$(LIB_DIR)/FreeRTOS-glue/cmsis_os2.c \
# BLE glue
CFLAGS += \
-I$(TARGET_DIR)/ble_glue \
-I$(CUBE_DIR)/Middlewares/ST/STM32_WPAN \
-I$(CUBE_DIR)/Middlewares/ST/STM32_WPAN/ble \
-I$(CUBE_DIR)/Middlewares/ST/STM32_WPAN/ble/core \
-I$(CUBE_DIR)/Middlewares/ST/STM32_WPAN/ble/core/template \
-I$(CUBE_DIR)/Middlewares/ST/STM32_WPAN/utilities \
-I$(CUBE_DIR)/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread \
-I$(CUBE_DIR)/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl \
-I$(CUBE_DIR)/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/shci
C_SOURCES += \
$(wildcard $(TARGET_DIR)/ble_glue/*.c) \
$(CUBE_DIR)/Middlewares/ST/STM32_WPAN/utilities/otp.c \
$(CUBE_DIR)/Middlewares/ST/STM32_WPAN/utilities/stm_list.c \
$(CUBE_DIR)/Middlewares/ST/STM32_WPAN/utilities/dbg_trace.c \
$(CUBE_DIR)/Middlewares/ST/STM32_WPAN/ble/svc/Src/svc_ctl.c \
$(CUBE_DIR)/Middlewares/ST/STM32_WPAN/ble/core/template/osal.c \
$(CUBE_DIR)/Middlewares/ST/STM32_WPAN/ble/core/auto/ble_hci_le.c \
$(CUBE_DIR)/Middlewares/ST/STM32_WPAN/ble/core/auto/ble_gap_aci.c \
$(CUBE_DIR)/Middlewares/ST/STM32_WPAN/ble/core/auto/ble_gatt_aci.c \
$(CUBE_DIR)/Middlewares/ST/STM32_WPAN/ble/core/auto/ble_hal_aci.c \
$(CUBE_DIR)/Middlewares/ST/STM32_WPAN/ble/core/auto/ble_l2cap_aci.c \
$(CUBE_DIR)/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/tl_mbox.c \
$(CUBE_DIR)/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/hci_tl.c \
$(CUBE_DIR)/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/hci_tl_if.c \
$(CUBE_DIR)/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/shci_tl.c \
$(CUBE_DIR)/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/shci_tl_if.c \
$(CUBE_DIR)/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/shci/shci.c
# USB stack
CFLAGS += \
-DSTM32WB \
-DUSB_PMASIZE=0x400
# Furi HAL
FURI_HAL_OS_DEBUG ?= 0
ifeq ($(FURI_HAL_OS_DEBUG), 1)
CFLAGS += -DFURI_HAL_OS_DEBUG
endif
FURI_HAL_USB_VCP_DEBUG ?= 0
ifeq ($(FURI_HAL_USB_VCP_DEBUG), 1)
CFLAGS += -DFURI_HAL_USB_VCP_DEBUG
endif
ifeq ($(FURI_HAL_POWER_DEEP_SLEEP_ENABLED), 1)
CFLAGS += -DFURI_HAL_POWER_DEEP_SLEEP_ENABLED
endif
FURI_HAL_SUBGHZ_TX_GPIO ?= 0
ifneq ($(FURI_HAL_SUBGHZ_TX_GPIO), 0)
CFLAGS += -DFURI_HAL_SUBGHZ_TX_GPIO=$(FURI_HAL_SUBGHZ_TX_GPIO)
endif
ifeq ($(INVERT_RFID_IN), 1)
CFLAGS += -DINVERT_RFID_IN
endif
ifeq ($(BLE_GLUE_DEBUG), 1)
CFLAGS += -DBLE_GLUE_DEBUG
endif
FURI_HAL_DIR = $(TARGET_DIR)/furi_hal
CFLAGS += -I$(FURI_HAL_DIR)
C_SOURCES += $(wildcard $(FURI_HAL_DIR)/*.c)
# Other
CFLAGS += \
-I$(MXPROJECT_DIR)/Inc \
-I$(MXPROJECT_DIR)/fatfs
C_SOURCES += \
$(wildcard $(MXPROJECT_DIR)/Src/*.c) \
$(wildcard $(MXPROJECT_DIR)/fatfs/*.c)
ifeq ($(RAM_EXEC), 1)
LDFLAGS += -T$(MXPROJECT_DIR)/stm32wb55xx_ram_fw.ld
else # RAM_EXEC
# Linker options
LDFLAGS += -T$(MXPROJECT_DIR)/stm32wb55xx_flash.ld
endif # RAM_EXEC
SVD_FILE = ../debug/STM32WB55_CM4.svd