atsamd: Update code to use armcm_boot mechanism
Replace the custom linker scripts with the src/generic/armcm_boot.c mechanism. Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
This commit is contained in:
parent
4990fe814d
commit
6338f6a5f0
|
@ -68,6 +68,10 @@ config FLASH_SIZE
|
||||||
default 0x80000 if MACH_SAMD51G19 || MACH_SAMD51J19 || MACH_SAMD51N19
|
default 0x80000 if MACH_SAMD51G19 || MACH_SAMD51J19 || MACH_SAMD51N19
|
||||||
default 0x100000 if MACH_SAMD51P20
|
default 0x100000 if MACH_SAMD51P20
|
||||||
|
|
||||||
|
config RAM_START
|
||||||
|
hex
|
||||||
|
default 0x20000000
|
||||||
|
|
||||||
config RAM_SIZE
|
config RAM_SIZE
|
||||||
hex
|
hex
|
||||||
default 0x1000 if MACH_SAMD21E15
|
default 0x1000 if MACH_SAMD21E15
|
||||||
|
|
|
@ -4,8 +4,8 @@
|
||||||
CROSS_PREFIX=arm-none-eabi-
|
CROSS_PREFIX=arm-none-eabi-
|
||||||
|
|
||||||
dirs-y += src/atsamd src/generic
|
dirs-y += src/atsamd src/generic
|
||||||
dirs-$(CONFIG_MACH_SAMD21) += lib/samd21/samd21a/gcc/gcc/
|
dirs-$(CONFIG_MACH_SAMD21) += lib/samd21/samd21a/gcc
|
||||||
dirs-$(CONFIG_MACH_SAMD51) += lib/samd51/samd51a/gcc/gcc/
|
dirs-$(CONFIG_MACH_SAMD51) += lib/samd51/samd51a/gcc
|
||||||
|
|
||||||
MCU := $(shell echo $(CONFIG_MCU) | tr a-z A-Z)
|
MCU := $(shell echo $(CONFIG_MCU) | tr a-z A-Z)
|
||||||
|
|
||||||
|
@ -15,11 +15,12 @@ CFLAGS-$(CONFIG_MACH_SAMD51) += -mfpu=fpv4-sp-d16 -mfloat-abi=hard
|
||||||
CFLAGS += $(CFLAGS-y) -D__$(MCU)__ -mthumb -Ilib/cmsis-core
|
CFLAGS += $(CFLAGS-y) -D__$(MCU)__ -mthumb -Ilib/cmsis-core
|
||||||
|
|
||||||
CFLAGS_klipper.elf += --specs=nano.specs --specs=nosys.specs
|
CFLAGS_klipper.elf += --specs=nano.specs --specs=nosys.specs
|
||||||
CFLAGS_klipper.elf += -T $(OUT)src/atsamd/samd.ld
|
CFLAGS_klipper.elf += -T $(OUT)src/generic/armcm_boot.ld
|
||||||
$(OUT)klipper.elf: $(OUT)src/atsamd/samd.ld
|
$(OUT)klipper.elf: $(OUT)src/generic/armcm_boot.ld
|
||||||
|
|
||||||
# Add source files
|
# Add source files
|
||||||
src-y += atsamd/main.c atsamd/gpio.c generic/crc16_ccitt.c generic/armcm_irq.c
|
src-y += atsamd/main.c atsamd/gpio.c
|
||||||
|
src-y += generic/armcm_boot.c generic/armcm_irq.c generic/crc16_ccitt.c
|
||||||
src-$(CONFIG_USBSERIAL) += atsamd/usbserial.c generic/usb_cdc.c
|
src-$(CONFIG_USBSERIAL) += atsamd/usbserial.c generic/usb_cdc.c
|
||||||
src-$(CONFIG_SERIAL) += atsamd/serial.c generic/serial_irq.c
|
src-$(CONFIG_SERIAL) += atsamd/serial.c generic/serial_irq.c
|
||||||
src-$(CONFIG_HAVE_GPIO_ADC) += atsamd/adc.c
|
src-$(CONFIG_HAVE_GPIO_ADC) += atsamd/adc.c
|
||||||
|
@ -29,10 +30,8 @@ src-$(CONFIG_HAVE_SERCOM) += atsamd/sercom.c
|
||||||
src-$(CONFIG_HAVE_GPIO_HARD_PWM) += atsamd/hard_pwm.c
|
src-$(CONFIG_HAVE_GPIO_HARD_PWM) += atsamd/hard_pwm.c
|
||||||
src-$(CONFIG_MACH_SAMD21) += atsamd/watchdog.c
|
src-$(CONFIG_MACH_SAMD21) += atsamd/watchdog.c
|
||||||
src-$(CONFIG_MACH_SAMD21) += atsamd/clock.c atsamd/timer.c generic/timer_irq.c
|
src-$(CONFIG_MACH_SAMD21) += atsamd/clock.c atsamd/timer.c generic/timer_irq.c
|
||||||
src-$(CONFIG_MACH_SAMD21) += ../lib/samd21/samd21a/gcc/gcc/startup_samd21.c
|
|
||||||
src-$(CONFIG_MACH_SAMD51) += atsamd/samd51_watchdog.c
|
src-$(CONFIG_MACH_SAMD51) += atsamd/samd51_watchdog.c
|
||||||
src-$(CONFIG_MACH_SAMD51) += atsamd/samd51_clock.c generic/armcm_timer.c
|
src-$(CONFIG_MACH_SAMD51) += atsamd/samd51_clock.c generic/armcm_timer.c
|
||||||
src-$(CONFIG_MACH_SAMD51) += ../lib/samd51/samd51a/gcc/gcc/startup_samd51.c
|
|
||||||
|
|
||||||
# Build the additional hex and bin output files
|
# Build the additional hex and bin output files
|
||||||
target-y += $(OUT)klipper.bin $(OUT)klipper.elf.hex
|
target-y += $(OUT)klipper.bin $(OUT)klipper.elf.hex
|
||||||
|
|
|
@ -4,28 +4,12 @@
|
||||||
//
|
//
|
||||||
// This file may be distributed under the terms of the GNU GPLv3 license.
|
// This file may be distributed under the terms of the GNU GPLv3 license.
|
||||||
|
|
||||||
#include "command.h" // DECL_CONSTANT
|
#include "command.h" // DECL_CONSTANT_STR
|
||||||
#include "internal.h" // NVIC_SystemReset
|
#include "internal.h" // NVIC_SystemReset
|
||||||
#include "sched.h" // sched_main
|
#include "sched.h" // sched_main
|
||||||
|
|
||||||
DECL_CONSTANT_STR("MCU", CONFIG_MCU);
|
DECL_CONSTANT_STR("MCU", CONFIG_MCU);
|
||||||
|
|
||||||
// Return the start of memory available for dynamic allocations
|
|
||||||
void *
|
|
||||||
dynmem_start(void)
|
|
||||||
{
|
|
||||||
extern uint32_t _ezero;
|
|
||||||
return &_ezero;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Return the end of memory available for dynamic allocations
|
|
||||||
void *
|
|
||||||
dynmem_end(void)
|
|
||||||
{
|
|
||||||
extern uint32_t _sstack;
|
|
||||||
return &_sstack;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
command_reset(uint32_t *args)
|
command_reset(uint32_t *args)
|
||||||
{
|
{
|
||||||
|
@ -37,7 +21,6 @@ DECL_COMMAND_FLAGS(command_reset, HF_IN_SHUTDOWN, "reset");
|
||||||
int
|
int
|
||||||
main(void)
|
main(void)
|
||||||
{
|
{
|
||||||
SystemInit();
|
|
||||||
sched_main();
|
sched_main();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,63 +0,0 @@
|
||||||
/* Linker script for atsamd chips
|
|
||||||
*
|
|
||||||
* Copyright (C) 2019 Kevin O'Connor <kevin@koconnor.net>
|
|
||||||
*
|
|
||||||
* This file may be distributed under the terms of the GNU GPLv3 license.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "autoconf.h"
|
|
||||||
|
|
||||||
OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
|
|
||||||
OUTPUT_ARCH(arm)
|
|
||||||
|
|
||||||
MEMORY
|
|
||||||
{
|
|
||||||
rom (rx) : ORIGIN = CONFIG_FLASH_START , LENGTH = CONFIG_FLASH_SIZE
|
|
||||||
ram (rwx) : ORIGIN = 0x20000000, LENGTH = CONFIG_RAM_SIZE
|
|
||||||
}
|
|
||||||
|
|
||||||
SECTIONS
|
|
||||||
{
|
|
||||||
.text : {
|
|
||||||
. = ALIGN(4);
|
|
||||||
_sfixed = .;
|
|
||||||
KEEP(*(.vectors .vectors.*))
|
|
||||||
*(.text .text.*)
|
|
||||||
*(.rodata .rodata*)
|
|
||||||
|
|
||||||
. = ALIGN(4);
|
|
||||||
KEEP(*(.init))
|
|
||||||
. = ALIGN(4);
|
|
||||||
KEEP(*(.fini))
|
|
||||||
} > rom
|
|
||||||
|
|
||||||
. = ALIGN(4);
|
|
||||||
_etext = .;
|
|
||||||
|
|
||||||
.relocate : AT (_etext)
|
|
||||||
{
|
|
||||||
. = ALIGN(4);
|
|
||||||
_srelocate = .;
|
|
||||||
*(.ramfunc .ramfunc.*);
|
|
||||||
*(.data .data.*);
|
|
||||||
. = ALIGN(4);
|
|
||||||
_erelocate = .;
|
|
||||||
} > ram
|
|
||||||
|
|
||||||
.bss (NOLOAD) :
|
|
||||||
{
|
|
||||||
. = ALIGN(4);
|
|
||||||
_szero = .;
|
|
||||||
*(.bss .bss.*)
|
|
||||||
*(COMMON)
|
|
||||||
. = ALIGN(4);
|
|
||||||
_ezero = .;
|
|
||||||
} > ram
|
|
||||||
|
|
||||||
_sstack = 0x20000000 + CONFIG_RAM_SIZE - CONFIG_STACK_SIZE ;
|
|
||||||
.stack _sstack (NOLOAD) :
|
|
||||||
{
|
|
||||||
. = . + CONFIG_STACK_SIZE;
|
|
||||||
_estack = .;
|
|
||||||
} > ram
|
|
||||||
}
|
|
|
@ -4,6 +4,7 @@
|
||||||
//
|
//
|
||||||
// This file may be distributed under the terms of the GNU GPLv3 license.
|
// This file may be distributed under the terms of the GNU GPLv3 license.
|
||||||
|
|
||||||
|
#include "board/armcm_boot.h" // armcm_enable_irq
|
||||||
#include "board/serial_irq.h" // serial_rx_data
|
#include "board/serial_irq.h" // serial_rx_data
|
||||||
#include "command.h" // DECL_CONSTANT_STR
|
#include "command.h" // DECL_CONSTANT_STR
|
||||||
#include "internal.h" // enable_pclock
|
#include "internal.h" // enable_pclock
|
||||||
|
@ -15,7 +16,7 @@ serial_enable_tx_irq(void)
|
||||||
SERCOM0->USART.INTENSET.reg = SERCOM_USART_INTENSET_DRE;
|
SERCOM0->USART.INTENSET.reg = SERCOM_USART_INTENSET_DRE;
|
||||||
}
|
}
|
||||||
|
|
||||||
void __visible
|
void
|
||||||
SERCOM0_Handler(void)
|
SERCOM0_Handler(void)
|
||||||
{
|
{
|
||||||
uint32_t status = SERCOM0->USART.INTFLAG.reg;
|
uint32_t status = SERCOM0->USART.INTFLAG.reg;
|
||||||
|
@ -31,16 +32,6 @@ SERCOM0_Handler(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Aliases for irq handler on SAMD51
|
|
||||||
void SERCOM0_0_Handler(void)
|
|
||||||
__visible __attribute__((alias("SERCOM0_Handler")));
|
|
||||||
void SERCOM0_1_Handler(void)
|
|
||||||
__visible __attribute__((alias("SERCOM0_Handler")));
|
|
||||||
void SERCOM0_2_Handler(void)
|
|
||||||
__visible __attribute__((alias("SERCOM0_Handler")));
|
|
||||||
void SERCOM0_3_Handler(void)
|
|
||||||
__visible __attribute__((alias("SERCOM0_Handler")));
|
|
||||||
|
|
||||||
DECL_CONSTANT_STR("RESERVE_PINS_serial", "PA11,PA10");
|
DECL_CONSTANT_STR("RESERVE_PINS_serial", "PA11,PA10");
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -69,17 +60,12 @@ serial_init(void)
|
||||||
su->INTENSET.reg = SERCOM_USART_INTENSET_RXC;
|
su->INTENSET.reg = SERCOM_USART_INTENSET_RXC;
|
||||||
su->CTRLA.reg = areg | SERCOM_USART_CTRLA_ENABLE;
|
su->CTRLA.reg = areg | SERCOM_USART_CTRLA_ENABLE;
|
||||||
#if CONFIG_MACH_SAMD21
|
#if CONFIG_MACH_SAMD21
|
||||||
NVIC_SetPriority(SERCOM0_IRQn, 0);
|
armcm_enable_irq(SERCOM0_Handler, SERCOM0_IRQn, 0);
|
||||||
NVIC_EnableIRQ(SERCOM0_IRQn);
|
|
||||||
#elif CONFIG_MACH_SAMD51
|
#elif CONFIG_MACH_SAMD51
|
||||||
NVIC_SetPriority(SERCOM0_0_IRQn, 0);
|
armcm_enable_irq(SERCOM0_Handler, SERCOM0_0_IRQn, 0);
|
||||||
NVIC_SetPriority(SERCOM0_1_IRQn, 0);
|
armcm_enable_irq(SERCOM0_Handler, SERCOM0_1_IRQn, 0);
|
||||||
NVIC_SetPriority(SERCOM0_2_IRQn, 0);
|
armcm_enable_irq(SERCOM0_Handler, SERCOM0_2_IRQn, 0);
|
||||||
NVIC_SetPriority(SERCOM0_3_IRQn, 0);
|
armcm_enable_irq(SERCOM0_Handler, SERCOM0_3_IRQn, 0);
|
||||||
NVIC_EnableIRQ(SERCOM0_0_IRQn);
|
|
||||||
NVIC_EnableIRQ(SERCOM0_1_IRQn);
|
|
||||||
NVIC_EnableIRQ(SERCOM0_2_IRQn);
|
|
||||||
NVIC_EnableIRQ(SERCOM0_3_IRQn);
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
DECL_INIT(serial_init);
|
DECL_INIT(serial_init);
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
//
|
//
|
||||||
// This file may be distributed under the terms of the GNU GPLv3 license.
|
// This file may be distributed under the terms of the GNU GPLv3 license.
|
||||||
|
|
||||||
|
#include "board/armcm_boot.h" // armcm_enable_irq
|
||||||
#include "board/irq.h" // irq_disable
|
#include "board/irq.h" // irq_disable
|
||||||
#include "board/misc.h" // timer_read_time
|
#include "board/misc.h" // timer_read_time
|
||||||
#include "board/timer_irq.h" // timer_dispatch_many
|
#include "board/timer_irq.h" // timer_dispatch_many
|
||||||
|
@ -33,7 +34,7 @@ timer_kick(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
// IRQ handler
|
// IRQ handler
|
||||||
void __visible __aligned(16) // aligning helps stabilize perf benchmarks
|
void __aligned(16) // aligning helps stabilize perf benchmarks
|
||||||
TC4_Handler(void)
|
TC4_Handler(void)
|
||||||
{
|
{
|
||||||
irq_disable();
|
irq_disable();
|
||||||
|
@ -54,8 +55,7 @@ timer_init(void)
|
||||||
irqstatus_t flag = irq_save();
|
irqstatus_t flag = irq_save();
|
||||||
tc->CTRLA.reg = 0;
|
tc->CTRLA.reg = 0;
|
||||||
tc->CTRLA.reg = TC_CTRLA_MODE_COUNT32;
|
tc->CTRLA.reg = TC_CTRLA_MODE_COUNT32;
|
||||||
NVIC_SetPriority(TC4_IRQn, 2);
|
armcm_enable_irq(TC4_Handler, TC4_IRQn, 2);
|
||||||
NVIC_EnableIRQ(TC4_IRQn);
|
|
||||||
tc->INTENSET.reg = TC_INTENSET_MC0;
|
tc->INTENSET.reg = TC_INTENSET_MC0;
|
||||||
tc->COUNT.reg = 0;
|
tc->COUNT.reg = 0;
|
||||||
timer_kick();
|
timer_kick();
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
|
|
||||||
#include <string.h> // memcpy
|
#include <string.h> // memcpy
|
||||||
#include "autoconf.h" // CONFIG_FLASH_START
|
#include "autoconf.h" // CONFIG_FLASH_START
|
||||||
|
#include "board/armcm_boot.h" // armcm_enable_irq
|
||||||
#include "board/io.h" // readl
|
#include "board/io.h" // readl
|
||||||
#include "board/irq.h" // irq_disable
|
#include "board/irq.h" // irq_disable
|
||||||
#include "board/usb_cdc.h" // usb_notify_ep0
|
#include "board/usb_cdc.h" // usb_notify_ep0
|
||||||
|
@ -190,7 +191,7 @@ usb_request_bootloader(void)
|
||||||
* Setup and interrupts
|
* Setup and interrupts
|
||||||
****************************************************************/
|
****************************************************************/
|
||||||
|
|
||||||
void __visible
|
void
|
||||||
USB_Handler(void)
|
USB_Handler(void)
|
||||||
{
|
{
|
||||||
uint8_t s = USB->DEVICE.INTFLAG.reg;
|
uint8_t s = USB->DEVICE.INTFLAG.reg;
|
||||||
|
@ -225,12 +226,6 @@ USB_Handler(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Aliases for irq handeler on SAMD51
|
|
||||||
void USB_0_Handler(void) __visible __attribute__((alias("USB_Handler")));
|
|
||||||
void USB_1_Handler(void) __visible __attribute__((alias("USB_Handler")));
|
|
||||||
void USB_2_Handler(void) __visible __attribute__((alias("USB_Handler")));
|
|
||||||
void USB_3_Handler(void) __visible __attribute__((alias("USB_Handler")));
|
|
||||||
|
|
||||||
DECL_CONSTANT_STR("RESERVE_PINS_USB", "PA24,PA25");
|
DECL_CONSTANT_STR("RESERVE_PINS_USB", "PA24,PA25");
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -256,17 +251,12 @@ usbserial_init(void)
|
||||||
// enable irqs
|
// enable irqs
|
||||||
USB->DEVICE.INTENSET.reg = USB_DEVICE_INTENSET_EORST;
|
USB->DEVICE.INTENSET.reg = USB_DEVICE_INTENSET_EORST;
|
||||||
#if CONFIG_MACH_SAMD21
|
#if CONFIG_MACH_SAMD21
|
||||||
NVIC_SetPriority(USB_IRQn, 1);
|
armcm_enable_irq(USB_Handler, USB_IRQn, 1);
|
||||||
NVIC_EnableIRQ(USB_IRQn);
|
|
||||||
#elif CONFIG_MACH_SAMD51
|
#elif CONFIG_MACH_SAMD51
|
||||||
NVIC_SetPriority(USB_0_IRQn, 1);
|
armcm_enable_irq(USB_Handler, USB_0_IRQn, 1);
|
||||||
NVIC_SetPriority(USB_1_IRQn, 1);
|
armcm_enable_irq(USB_Handler, USB_1_IRQn, 1);
|
||||||
NVIC_SetPriority(USB_2_IRQn, 1);
|
armcm_enable_irq(USB_Handler, USB_2_IRQn, 1);
|
||||||
NVIC_SetPriority(USB_3_IRQn, 1);
|
armcm_enable_irq(USB_Handler, USB_3_IRQn, 1);
|
||||||
NVIC_EnableIRQ(USB_0_IRQn);
|
|
||||||
NVIC_EnableIRQ(USB_1_IRQn);
|
|
||||||
NVIC_EnableIRQ(USB_2_IRQn);
|
|
||||||
NVIC_EnableIRQ(USB_3_IRQn);
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
DECL_INIT(usbserial_init);
|
DECL_INIT(usbserial_init);
|
||||||
|
|
Loading…
Reference in New Issue