diff --git a/lib/sdk11/components/libraries/bootloader_dfu/dfu_types.h b/lib/sdk11/components/libraries/bootloader_dfu/dfu_types.h index ccf101e..40bd414 100644 --- a/lib/sdk11/components/libraries/bootloader_dfu/dfu_types.h +++ b/lib/sdk11/components/libraries/bootloader_dfu/dfu_types.h @@ -37,6 +37,7 @@ #define CODE_REGION_1_START SD_SIZE_GET(MBR_SIZE) /**< This field should correspond to the size of Code Region 0, (which is identical to Start of Code Region 1), found in UICR.CLEN0 register. This value is used for compile safety, as the linker will fail if application expands into bootloader. Runtime, the bootloader will use the value found in UICR.CLEN0. */ #define SOFTDEVICE_REGION_START MBR_SIZE /**< This field should correspond to start address of the bootloader, found in UICR.RESERVED, 0x10001014, register. This value is used for sanity check, so the bootloader will fail immediately if this value differs from runtime value. The value is used to determine max application size for updating. */ +#define CODE_PAGE_SIZE 0x1000 /**< Size of a flash codepage. Used for size of the reserved flash space in the bootloader region. Will be runtime checked against NRF_UICR->CODEPAGESIZE to ensure the region is correct. */ #if defined(NRF52832_XXAA) @@ -45,7 +46,6 @@ #define BOOTLOADER_SETTINGS_ADDRESS 0x0007F000 /**< The field specifies the page location of the bootloader settings address. */ #define BOOTLOADER_MBR_PARAMS_PAGE_ADDRESS 0x0007E000 /**< The field specifies the page location of the mbr params page address. */ -#define CODE_PAGE_SIZE 0x1000 /**< Size of a flash codepage. Used for size of the reserved flash space in the bootloader region. Will be runtime checked against NRF_UICR->CODEPAGESIZE to ensure the region is correct. */ #elif defined(NRF52840_XXAA) @@ -60,8 +60,6 @@ #define BOOTLOADER_SETTINGS_ADDRESS 0x000FF000 /**< The field specifies the page location of the bootloader settings address. */ #define BOOTLOADER_MBR_PARAMS_PAGE_ADDRESS 0x000FE000 /**< The field specifies the page location of the mbr params page address. */ -#define CODE_PAGE_SIZE 0x1000 /**< Size of a flash codepage. Used for size of the reserved flash space in the bootloader region. Will be runtime checked against NRF_UICR->CODEPAGESIZE to ensure the region is correct. */ - #else #error No target defined diff --git a/src/Makefile b/src/Makefile index 5f3991b..b02aaea 100644 --- a/src/Makefile +++ b/src/Makefile @@ -15,6 +15,7 @@ SDK11_PATH = ../lib/sdk11/components SRC_PATH = . TUSB_PATH = ../lib/tinyusb/src +NRFX_PATH = ../lib/nrfx SD_VER1 = 6 @@ -26,7 +27,7 @@ SD_VERSION_FULL = $(SD_VERSION)r$(SD_VER4) SD_PATH = ../lib/softdevice/$(SD_NAME)/$(SD_VERSION) SD_HEX = $(SD_PATH)/hex/$(SD_NAME)_nrf52_$(SD_VERSION)_softdevice.hex -LINKER_SCRIPT = $(SRC_PATH)/$(SD_NAME)_$(SD_VERSION).ld +LD_FILE = $(SRC_PATH)/linker/$(SD_NAME)_$(SD_VERSION).ld OUTPUT_FILENAME = $(BOARD)_bootloader BOOT_SD_NAME = $(OUTPUT_FILENAME)_$(SD_NAME)_$(SD_VERSION_FULL) @@ -108,10 +109,6 @@ remduplicates = $(strip $(if $1,$(firstword $1) $(call remduplicates,$(filter-ou C_SOURCE_FILES += $(SRC_PATH)/main.c C_SOURCE_FILES += $(SRC_PATH)/dfu_ble_svc.c -C_SOURCE_FILES += $(SRC_PATH)/usb/tusb_descriptors.c -C_SOURCE_FILES += $(SRC_PATH)/usb/usb.c -C_SOURCE_FILES += $(SRC_PATH)/usb/msc_uf2.c -C_SOURCE_FILES += $(SRC_PATH)/usb/uf2/ghostfat.c # SDK 11 files C_SOURCE_FILES += $(SDK11_PATH)/libraries/bootloader_dfu/bootloader.c @@ -144,6 +141,15 @@ C_SOURCE_FILES += $(SDK_PATH)/libraries/util/nrf_assert.c C_SOURCE_FILES += $(SDK_PATH)/drivers_nrf/common/nrf_drv_common.c C_SOURCE_FILES += $(SDK_PATH)/drivers_nrf/hal/nrf_nvmc.c + +ifneq ($(IS_NRF52840),) + +C_SOURCE_FILES += $(SRC_PATH)/usb/tusb_descriptors.c +C_SOURCE_FILES += $(SRC_PATH)/usb/usb.c +C_SOURCE_FILES += $(SRC_PATH)/usb/msc_uf2.c +C_SOURCE_FILES += $(SRC_PATH)/usb/uf2/ghostfat.c + + C_SOURCE_FILES += $(SDK_PATH)/toolchain/system_nrf52840.c # Tinyusb stack @@ -157,6 +163,14 @@ C_SOURCE_FILES += $(TUSB_PATH)/class/msc/msc_device.c C_SOURCE_FILES += $(TUSB_PATH)/class/custom/custom_device.c C_SOURCE_FILES += $(TUSB_PATH)/tusb.c +else + +C_SOURCE_FILES += $(NRFX_PATH)/mdk/system_nrf52.c + + +endif + + #****************************************************************************** # Assembly Files #****************************************************************************** @@ -165,44 +179,48 @@ ASM_SOURCE_FILES = $(SDK_PATH)/toolchain/gcc/gcc_startup_nrf52840.S #****************************************************************************** # INCLUDE PATH #****************************************************************************** -INC_PATHS += -I$(SRC_PATH)/ -INC_PATHS += -I$(SRC_PATH)/usb -INC_PATHS += -I$(TUSB_PATH)/ +IPATH += $(SRC_PATH)/ +IPATH += $(SRC_PATH)/usb +IPATH += $(TUSB_PATH)/ -INC_PATHS += -I$(SDK11_PATH)/libraries/bootloader_dfu/hci_transport -INC_PATHS += -I$(SDK11_PATH)/libraries/bootloader_dfu -INC_PATHS += -I$(SDK11_PATH)/drivers_nrf/pstorage -INC_PATHS += -I$(SDK11_PATH)/ble/common -INC_PATHS += -I$(SDK11_PATH)/ble/ble_services/ble_dfu -INC_PATHS += -I$(SDK11_PATH)/ble/ble_services/ble_dis -INC_PATHS += -I$(SDK11_PATH)/libraries/util +IPATH += $(NRFX_PATH)/mdk -INC_PATHS += -I$(SDK_PATH)/libraries/timer -INC_PATHS += -I$(SDK_PATH)/libraries/scheduler -INC_PATHS += -I$(SDK_PATH)/libraries/crc16 -INC_PATHS += -I$(SDK_PATH)/libraries/util -INC_PATHS += -I$(SDK_PATH)/libraries/hci/config -INC_PATHS += -I$(SDK_PATH)/libraries/uart -INC_PATHS += -I$(SDK_PATH)/libraries/hci +IPATH += $(SDK11_PATH)/libraries/bootloader_dfu/hci_transport +IPATH += $(SDK11_PATH)/libraries/bootloader_dfu +IPATH += $(SDK11_PATH)/drivers_nrf/pstorage +IPATH += $(SDK11_PATH)/ble/common +IPATH += $(SDK11_PATH)/ble/ble_services/ble_dfu +IPATH += $(SDK11_PATH)/ble/ble_services/ble_dis +IPATH += $(SDK11_PATH)/libraries/util -INC_PATHS += -I$(SDK_PATH)/drivers_nrf/common -INC_PATHS += -I$(SDK_PATH)/drivers_nrf/hal -INC_PATHS += -I$(SDK_PATH)/drivers_nrf/config -INC_PATHS += -I$(SDK_PATH)/drivers_nrf/delay -INC_PATHS += -I$(SDK_PATH)/drivers_nrf/uart -INC_PATHS += -I$(SDK_PATH)/drivers_nrf/power -INC_PATHS += -I$(SDK_PATH)/drivers_nrf/usbd +IPATH += $(SDK_PATH)/libraries/timer +IPATH += $(SDK_PATH)/libraries/scheduler +IPATH += $(SDK_PATH)/libraries/crc16 +IPATH += $(SDK_PATH)/libraries/util +IPATH += $(SDK_PATH)/libraries/hci/config +IPATH += $(SDK_PATH)/libraries/uart +IPATH += $(SDK_PATH)/libraries/hci -INC_PATHS += -I$(SDK_PATH)/device +IPATH += $(SDK_PATH)/drivers_nrf/common +IPATH += $(SDK_PATH)/drivers_nrf/hal +IPATH += $(SDK_PATH)/drivers_nrf/config +IPATH += $(SDK_PATH)/drivers_nrf/delay +IPATH += $(SDK_PATH)/drivers_nrf/uart +IPATH += $(SDK_PATH)/drivers_nrf/power +IPATH += $(SDK_PATH)/drivers_nrf/usbd -INC_PATHS += -I$(SDK_PATH)/toolchain/cmsis/include -INC_PATHS += -I$(SDK_PATH)/toolchain/gcc -INC_PATHS += -I$(SDK_PATH)/toolchain +IPATH += $(SDK_PATH)/device + +IPATH += $(SDK_PATH)/toolchain/cmsis/include +IPATH += $(SDK_PATH)/toolchain/gcc +IPATH += $(SDK_PATH)/toolchain -INC_PATHS += -I$(SD_PATH)/common -INC_PATHS += -I$(SD_PATH)/headers -INC_PATHS += -I$(SD_PATH)/headers/nrf52 +IPATH += $(SD_PATH)/headers +IPATH += $(SD_PATH)/headers/nrf52 + + +INC_PATHS = $(addprefix -I,$(IPATH)) #****************************************************************************** # Compiler Flags @@ -221,9 +239,8 @@ CFLAGS += -fno-builtin --short-enums # Defined Symbol (MACROS) CFLAGS += -DBOOTLOADER_VERSION=0x0$(SD_VER1)0$(SD_VER2)0$(SD_VER3)0$(SD_VER4)UL -CFLAGS += -DNRF52840_XXAA + CFLAGS += -D__HEAP_SIZE=0 -CFLAGS += -DS140 CFLAGS += -DCONFIG_GPIO_AS_PINRESET CFLAGS += -DBLE_STACK_SUPPORT_REQD CFLAGS += -DBSP_DEFINES_ONLY @@ -235,6 +252,18 @@ CFLAGS += -DDFU_APP_DATA_RESERVED=7*4096 CFLAGS += -DBOARD_$(shell echo $(BOARD) | tr '[:lower:]' '[:upper:]') +ifneq ($(IS_NRF52840),) + +CFLAGS += -DNRF52840_XXAA +CFLAGS += -DS140 + +else + +CFLAGS += -DNRF52 +CFLAGS += -DS132 + +endif + #****************************************************************************** # Linker Flags @@ -243,7 +272,7 @@ CFLAGS += -DBOARD_$(shell echo $(BOARD) | tr '[:lower:]' '[:upper:]') # keep every function in separate section. This will allow linker to dump unused functions LDFLAGS += -Xlinker -Map=$(BUILD)/$(OUTPUT_FILENAME).map -LDFLAGS += -mthumb -mabi=aapcs -L$(SRC_PATH)/ -T$(LINKER_SCRIPT) +LDFLAGS += -mthumb -mabi=aapcs -L$(SRC_PATH)/ -T$(LD_FILE) LDFLAGS += -mcpu=cortex-m4 LDFLAGS += -mfloat-abi=hard -mfpu=fpv4-sp-d16 diff --git a/src/s140_6.0.0.ld b/src/linker/s140_6.0.0.ld similarity index 100% rename from src/s140_6.0.0.ld rename to src/linker/s140_6.0.0.ld diff --git a/src/main.c b/src/main.c index 1630d46..db04845 100644 --- a/src/main.c +++ b/src/main.c @@ -64,7 +64,7 @@ void usb_init(void); -void usb_teardown(); +void usb_teardown(void); /* tinyusb function that handles power event (detected, ready, removed) * We must call it within SD's SOC event handler, or set it as power event handler if SD is not enabled. */ @@ -76,6 +76,12 @@ enum { NRFX_POWER_USB_EVT_REMOVED, /**< USB power removed from the connector. */ NRFX_POWER_USB_EVT_READY /**< USB power regulator ready. */ }; + +#else + +#define usb_init() +#define usb_teardown() + #endif @@ -118,7 +124,12 @@ enum { BLE_CONN_CFG_HIGH_BANDWIDTH = 1 }; // Adafruit for factory reset #define APPDATA_ADDR_START (BOOTLOADER_REGION_START-DFU_APP_DATA_RESERVED) + +#ifdef NRF52840_XXAA STATIC_ASSERT( APPDATA_ADDR_START == 0xED000); +#else +STATIC_ASSERT( APPDATA_ADDR_START == 0x6D000); +#endif void adafruit_factory_reset(void); @@ -466,7 +477,8 @@ void adafruit_factory_reset(void) //--------------------------------------------------------------------+ void app_error_fault_handler(uint32_t id, uint32_t pc, uint32_t info) { - verify_breakpoint(); + volatile uint32_t* ARM_CM_DHCSR = ((volatile uint32_t*) 0xE000EDF0UL); /* Cortex M CoreDebug->DHCSR */ + if ( (*ARM_CM_DHCSR) & 1UL ) __asm("BKPT #0\n"); /* Only halt mcu if debugger is attached */ NVIC_SystemReset(); } @@ -513,12 +525,14 @@ uint32_t proc_soc(void) { pstorage_sys_event_handler(soc_evt); +#ifdef NRF52840_XXAA /*------------- usb power event handler -------------*/ int32_t usbevt = (soc_evt == NRF_EVT_POWER_USB_DETECTED ) ? NRFX_POWER_USB_EVT_DETECTED: (soc_evt == NRF_EVT_POWER_USB_POWER_READY) ? NRFX_POWER_USB_EVT_READY : (soc_evt == NRF_EVT_POWER_USB_REMOVED ) ? NRFX_POWER_USB_EVT_REMOVED : -1; if ( usbevt >= 0) tusb_hal_nrf_power_event(usbevt); +#endif } return err;