From 7df819dfee0f285fe85c8fe4a596963b148a8c16 Mon Sep 17 00:00:00 2001 From: Ajit Ananthadevan Date: Sun, 3 Aug 2025 01:39:20 +1000 Subject: [PATCH] initial commit --- .gitignore | 6 + myapps/blinky-old-32mg/Makefile | 375 ++++++++++++++++++ myapps/blinky-old-32mg/emlib.mk | 44 ++ .../linker_script/efr32mg21.ld | 292 ++++++++++++++ myapps/blinky-old-32mg/main.mk | 76 ++++ myapps/blinky-old-32mg/src/main.c | 17 + myapps/blinky-old/Makefile | 375 ++++++++++++++++++ myapps/blinky-old/emlib.mk | 44 ++ myapps/blinky-old/main.mk | 76 ++++ myapps/blinky-old/src/main.c | 17 + myapps/blinky/Makefile | 175 ++++++++ myapps/blinky/emlib.mk | 44 ++ myapps/blinky/src/main.c | 17 + 13 files changed, 1558 insertions(+) create mode 100644 .gitignore create mode 100644 myapps/blinky-old-32mg/Makefile create mode 100644 myapps/blinky-old-32mg/emlib.mk create mode 100644 myapps/blinky-old-32mg/linker_script/efr32mg21.ld create mode 100644 myapps/blinky-old-32mg/main.mk create mode 100644 myapps/blinky-old-32mg/src/main.c create mode 100644 myapps/blinky-old/Makefile create mode 100644 myapps/blinky-old/emlib.mk create mode 100644 myapps/blinky-old/main.mk create mode 100644 myapps/blinky-old/src/main.c create mode 100644 myapps/blinky/Makefile create mode 100644 myapps/blinky/emlib.mk create mode 100644 myapps/blinky/src/main.c diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b534153 --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +/platform/ +/protocol/ +build/ +.cache/ +compile_commands.json + diff --git a/myapps/blinky-old-32mg/Makefile b/myapps/blinky-old-32mg/Makefile new file mode 100644 index 0000000..d119d54 --- /dev/null +++ b/myapps/blinky-old-32mg/Makefile @@ -0,0 +1,375 @@ +# boilermake: A reusable, but flexible, boilerplate Makefile. +# +# Copyright 2008, 2009, 2010 Dan Moulding, Alan T. DeKok +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# Caution: Don't edit this Makefile! Create your own main.mk and other +# submakefiles, which will be included by this Makefile. +# Only edit this if you need to modify boilermake's behavior (fix +# bugs, add features, etc). + +# Note: Parameterized "functions" in this makefile that are marked with +# "USE WITH EVAL" are only useful in conjuction with eval. This is +# because those functions result in a block of Makefile syntax that must +# be evaluated after expansion. Since they must be used with eval, most +# instances of "$" within them need to be escaped with a second "$" to +# accomodate the double expansion that occurs when eval is invoked. + +# ADD_CLEAN_RULE - Parameterized "function" that adds a new rule and phony +# target for cleaning the specified target (removing its build-generated +# files). +# +# USE WITH EVAL +# +define ADD_CLEAN_RULE + clean: clean_${1} + .PHONY: clean_${1} + clean_${1}: + $$(strip rm -f ${TARGET_DIR}/${1} $${${1}_OBJS:%.o=%.[doP]}) + $${${1}_POSTCLEAN} +endef + +# ADD_OBJECT_RULE - Parameterized "function" that adds a pattern rule for +# building object files from source files with the filename extension +# specified in the second argument. The first argument must be the name of the +# base directory where the object files should reside (such that the portion +# of the path after the base directory will match the path to corresponding +# source files). The third argument must contain the rules used to compile the +# source files into object code form. +# +# USE WITH EVAL +# +define ADD_OBJECT_RULE +${1}/%.o: ${2} + ${3} +endef + +# ADD_TARGET_RULE - Parameterized "function" that adds a new target to the +# Makefile. The target may be an executable or a library. The two allowable +# types of targets are distinguished based on the name: library targets must +# end with the traditional ".a" extension. +# +# USE WITH EVAL +# +define ADD_TARGET_RULE + ifeq "$$(suffix ${1})" ".a" + # Add a target for creating a static library. + $${TARGET_DIR}/${1}: $${${1}_OBJS} + @mkdir -p $$(dir $$@) + $$(strip $${AR} $${ARFLAGS} $$@ $${${1}_OBJS}) + $${${1}_POSTMAKE} + else + # Add a target for linking an executable. First, attempt to select the + # appropriate front-end to use for linking. This might not choose the + # right one (e.g. if linking with a C++ static library, but all other + # sources are C sources), so the user makefile is allowed to specify a + # linker to be used for each target. + ifeq "$$(strip $${${1}_LINKER})" "" + # No linker was explicitly specified to be used for this target. If + # there are any C++ sources for this target, use the C++ compiler. + # For all other targets, default to using the C compiler. + ifneq "$$(strip $$(filter $${CXX_SRC_EXTS},$${${1}_SOURCES}))" "" + ${1}_LINKER = $${CXX} + else + ${1}_LINKER = $${CC} + endif + endif + + $${TARGET_DIR}/${1}: $${${1}_OBJS} $${${1}_PREREQS} + @mkdir -p $$(dir $$@) + $$(strip $${${1}_LINKER} -o $$@ $${LDFLAGS} $${${1}_LDFLAGS} \ + $${${1}_OBJS} $${LDLIBS} $${${1}_LDLIBS}) + $${${1}_POSTMAKE} + endif +endef + +# CANONICAL_PATH - Given one or more paths, converts the paths to the canonical +# form. The canonical form is the path, relative to the project's top-level +# directory (the directory from which "make" is run), and without +# any "./" or "../" sequences. For paths that are not located below the +# top-level directory, the canonical form is the absolute path (i.e. from +# the root of the filesystem) also without "./" or "../" sequences. +define CANONICAL_PATH +$(patsubst ${CURDIR}/%,%,$(abspath ${1})) +endef + +# COMPILE_C_CMDS - Commands for compiling C source code. +define COMPILE_C_CMDS + @mkdir -p $(dir $@) + $(strip ${CC} -o $@ -c -MD ${CFLAGS} ${SRC_CFLAGS} ${INCDIRS} \ + ${SRC_INCDIRS} ${SRC_DEFS} ${DEFS} $<) + @cp ${@:%$(suffix $@)=%.d} ${@:%$(suffix $@)=%.P}; \ + sed -e 's/#.*//' -e 's/^[^:]*: *//' -e 's/ *\\$$//' \ + -e '/^$$/ d' -e 's/$$/ :/' < ${@:%$(suffix $@)=%.d} \ + >> ${@:%$(suffix $@)=%.P}; \ + rm -f ${@:%$(suffix $@)=%.d} +endef + +# COMPILE_CXX_CMDS - Commands for compiling C++ source code. +define COMPILE_CXX_CMDS + @mkdir -p $(dir $@) + $(strip ${CXX} -o $@ -c -MD ${CXXFLAGS} ${SRC_CXXFLAGS} ${INCDIRS} \ + ${SRC_INCDIRS} ${SRC_DEFS} ${DEFS} $<) + @cp ${@:%$(suffix $@)=%.d} ${@:%$(suffix $@)=%.P}; \ + sed -e 's/#.*//' -e 's/^[^:]*: *//' -e 's/ *\\$$//' \ + -e '/^$$/ d' -e 's/$$/ :/' < ${@:%$(suffix $@)=%.d} \ + >> ${@:%$(suffix $@)=%.P}; \ + rm -f ${@:%$(suffix $@)=%.d} +endef + +# INCLUDE_SUBMAKEFILE - Parameterized "function" that includes a new +# "submakefile" fragment into the overall Makefile. It also recursively +# includes all submakefiles of the specified submakefile fragment. +# +# USE WITH EVAL +# +define INCLUDE_SUBMAKEFILE + # Initialize all variables that can be defined by a makefile fragment, then + # include the specified makefile fragment. + TARGET := + TGT_CFLAGS := + TGT_CXXFLAGS := + TGT_DEFS := + TGT_INCDIRS := + TGT_LDFLAGS := + TGT_LDLIBS := + TGT_LINKER := + TGT_POSTCLEAN := + TGT_POSTMAKE := + TGT_PREREQS := + + SOURCES := + SRC_CFLAGS := + SRC_CXXFLAGS := + SRC_DEFS := + SRC_INCDIRS := + + SUBMAKEFILES := + + # A directory stack is maintained so that the correct paths are used as we + # recursively include all submakefiles. Get the makefile's directory and + # push it onto the stack. + DIR := $(call CANONICAL_PATH,$(dir ${1})) + DIR_STACK := $$(call PUSH,$${DIR_STACK},$${DIR}) + + include ${1} + + # Initialize internal local variables. + OBJS := + + # Ensure that valid values are set for BUILD_DIR and TARGET_DIR. + ifeq "$$(strip $${BUILD_DIR})" "" + BUILD_DIR := build + endif + ifeq "$$(strip $${TARGET_DIR})" "" + TARGET_DIR := . + endif + + # Determine which target this makefile's variables apply to. A stack is + # used to keep track of which target is the "current" target as we + # recursively include other submakefiles. + ifneq "$$(strip $${TARGET})" "" + # This makefile defined a new target. Target variables defined by this + # makefile apply to this new target. Initialize the target's variables. + TGT := $$(strip $${TARGET}) + ALL_TGTS += $${TGT} + $${TGT}_CFLAGS := $${TGT_CFLAGS} + $${TGT}_CXXFLAGS := $${TGT_CXXFLAGS} + $${TGT}_DEFS := $${TGT_DEFS} + $${TGT}_DEPS := + TGT_INCDIRS := $$(call QUALIFY_PATH,$${DIR},$${TGT_INCDIRS}) + TGT_INCDIRS := $$(call CANONICAL_PATH,$${TGT_INCDIRS}) + $${TGT}_INCDIRS := $${TGT_INCDIRS} + $${TGT}_LDFLAGS := $${TGT_LDFLAGS} + $${TGT}_LDLIBS := $${TGT_LDLIBS} + $${TGT}_LINKER := $${TGT_LINKER} + $${TGT}_OBJS := + $${TGT}_POSTCLEAN := $${TGT_POSTCLEAN} + $${TGT}_POSTMAKE := $${TGT_POSTMAKE} + $${TGT}_PREREQS := $$(addprefix $${TARGET_DIR}/,$${TGT_PREREQS}) + $${TGT}_SOURCES := + else + # The values defined by this makefile apply to the the "current" target + # as determined by which target is at the top of the stack. + TGT := $$(strip $$(call PEEK,$${TGT_STACK})) + $${TGT}_CFLAGS += $${TGT_CFLAGS} + $${TGT}_CXXFLAGS += $${TGT_CXXFLAGS} + $${TGT}_DEFS += $${TGT_DEFS} + TGT_INCDIRS := $$(call QUALIFY_PATH,$${DIR},$${TGT_INCDIRS}) + TGT_INCDIRS := $$(call CANONICAL_PATH,$${TGT_INCDIRS}) + $${TGT}_INCDIRS += $${TGT_INCDIRS} + $${TGT}_LDFLAGS += $${TGT_LDFLAGS} + $${TGT}_LDLIBS += $${TGT_LDLIBS} + $${TGT}_POSTCLEAN += $${TGT_POSTCLEAN} + $${TGT}_POSTMAKE += $${TGT_POSTMAKE} + $${TGT}_PREREQS += $${TGT_PREREQS} + endif + + # Push the current target onto the target stack. + TGT_STACK := $$(call PUSH,$${TGT_STACK},$${TGT}) + + ifneq "$$(strip $${SOURCES})" "" + # This makefile builds one or more objects from source. Validate the + # specified sources against the supported source file types. + BAD_SRCS := $$(strip $$(filter-out $${ALL_SRC_EXTS},$${SOURCES})) + ifneq "$${BAD_SRCS}" "" + $$(error Unsupported source file(s) found in ${1} [$${BAD_SRCS}]) + endif + + # Qualify and canonicalize paths. + SOURCES := $$(call QUALIFY_PATH,$${DIR},$${SOURCES}) + SOURCES := $$(call CANONICAL_PATH,$${SOURCES}) + SRC_INCDIRS := $$(call QUALIFY_PATH,$${DIR},$${SRC_INCDIRS}) + SRC_INCDIRS := $$(call CANONICAL_PATH,$${SRC_INCDIRS}) + + # Save the list of source files for this target. + $${TGT}_SOURCES += $${SOURCES} + + # Convert the source file names to their corresponding object file + # names. + OBJS := $$(addprefix $${BUILD_DIR}/$$(call CANONICAL_PATH,$${TGT})/,\ + $$(addsuffix .o,$$(basename $${SOURCES}))) + + # Add the objects to the current target's list of objects, and create + # target-specific variables for the objects based on any source + # variables that were defined. + $${TGT}_OBJS += $${OBJS} + $${TGT}_DEPS += $${OBJS:%.o=%.P} + $${OBJS}: SRC_CFLAGS := $${$${TGT}_CFLAGS} $${SRC_CFLAGS} + $${OBJS}: SRC_CXXFLAGS := $${$${TGT}_CXXFLAGS} $${SRC_CXXFLAGS} + $${OBJS}: SRC_DEFS := $$(addprefix -D,$${$${TGT}_DEFS} $${SRC_DEFS}) + $${OBJS}: SRC_INCDIRS := $$(addprefix -I,\ + $${$${TGT}_INCDIRS} $${SRC_INCDIRS}) + endif + + ifneq "$$(strip $${SUBMAKEFILES})" "" + # This makefile has submakefiles. Recursively include them. + $$(foreach MK,$${SUBMAKEFILES},\ + $$(eval $$(call INCLUDE_SUBMAKEFILE,\ + $$(call CANONICAL_PATH,\ + $$(call QUALIFY_PATH,$${DIR},$${MK}))))) + endif + + # Reset the "current" target to it's previous value. + TGT_STACK := $$(call POP,$${TGT_STACK}) + TGT := $$(call PEEK,$${TGT_STACK}) + + # Reset the "current" directory to it's previous value. + DIR_STACK := $$(call POP,$${DIR_STACK}) + DIR := $$(call PEEK,$${DIR_STACK}) +endef + +# MIN - Parameterized "function" that results in the minimum lexical value of +# the two values given. +define MIN +$(firstword $(sort ${1} ${2})) +endef + +# PEEK - Parameterized "function" that results in the value at the top of the +# specified colon-delimited stack. +define PEEK +$(lastword $(subst :, ,${1})) +endef + +# POP - Parameterized "function" that pops the top value off of the specified +# colon-delimited stack, and results in the new value of the stack. Note that +# the popped value cannot be obtained using this function; use peek for that. +define POP +${1:%:$(lastword $(subst :, ,${1}))=%} +endef + +# PUSH - Parameterized "function" that pushes a value onto the specified colon- +# delimited stack, and results in the new value of the stack. +define PUSH +${2:%=${1}:%} +endef + +# QUALIFY_PATH - Given a "root" directory and one or more paths, qualifies the +# paths using the "root" directory (i.e. appends the root directory name to +# the paths) except for paths that are absolute. +define QUALIFY_PATH +$(addprefix ${1}/,$(filter-out /%,${2})) $(filter /%,${2}) +endef + +############################################################################### +# +# Start of Makefile Evaluation +# +############################################################################### + +# Older versions of GNU Make lack capabilities needed by boilermake. +# With older versions, "make" may simply output "nothing to do", likely leading +# to confusion. To avoid this, check the version of GNU make up-front and +# inform the user if their version of make doesn't meet the minimum required. +MIN_MAKE_VERSION := 3.81 +MIN_MAKE_VER_MSG := boilermake requires GNU Make ${MIN_MAKE_VERSION} or greater +ifeq "${MAKE_VERSION}" "" + $(info GNU Make not detected) + $(error ${MIN_MAKE_VER_MSG}) +endif +ifneq "${MIN_MAKE_VERSION}" "$(call MIN,${MIN_MAKE_VERSION},${MAKE_VERSION})" + $(info This is GNU Make version ${MAKE_VERSION}) + $(error ${MIN_MAKE_VER_MSG}) +endif + +# Define the source file extensions that we know how to handle. +C_SRC_EXTS := %.c %.S +CXX_SRC_EXTS := %.C %.cc %.cp %.cpp %.CPP %.cxx %.c++ +ALL_SRC_EXTS := ${C_SRC_EXTS} ${CXX_SRC_EXTS} + +# Initialize global variables. +ALL_TGTS := +DEFS := +DIR_STACK := +INCDIRS := +TGT_STACK := + +# Include the main user-supplied submakefile. This also recursively includes +# all other user-supplied submakefiles. +$(eval $(call INCLUDE_SUBMAKEFILE,main.mk)) + +# Perform post-processing on global variables as needed. +DEFS := $(addprefix -D,${DEFS}) +INCDIRS := $(addprefix -I,$(call CANONICAL_PATH,${INCDIRS})) + +# Define the "all" target (which simply builds all user-defined targets) as the +# default goal. +.PHONY: all +all: $(addprefix ${TARGET_DIR}/,${ALL_TGTS}) + +# Add a new target rule for each user-defined target. +$(foreach TGT,${ALL_TGTS},\ + $(eval $(call ADD_TARGET_RULE,${TGT}))) + +# Add pattern rule(s) for creating compiled object code from C source. +$(foreach TGT,${ALL_TGTS},\ + $(foreach EXT,${C_SRC_EXTS},\ + $(eval $(call ADD_OBJECT_RULE,${BUILD_DIR}/$(call CANONICAL_PATH,${TGT}),\ + ${EXT},$${COMPILE_C_CMDS})))) + +# Add pattern rule(s) for creating compiled object code from C++ source. +$(foreach TGT,${ALL_TGTS},\ + $(foreach EXT,${CXX_SRC_EXTS},\ + $(eval $(call ADD_OBJECT_RULE,${BUILD_DIR}/$(call CANONICAL_PATH,${TGT}),\ + ${EXT},$${COMPILE_CXX_CMDS})))) + +# Add "clean" rules to remove all build-generated files. +.PHONY: clean +$(foreach TGT,${ALL_TGTS},\ + $(eval $(call ADD_CLEAN_RULE,${TGT}))) + +# Include generated rules that define additional (header) dependencies. +$(foreach TGT,${ALL_TGTS},\ + $(eval -include ${${TGT}_DEPS})) diff --git a/myapps/blinky-old-32mg/emlib.mk b/myapps/blinky-old-32mg/emlib.mk new file mode 100644 index 0000000..7c39930 --- /dev/null +++ b/myapps/blinky-old-32mg/emlib.mk @@ -0,0 +1,44 @@ +SOURCES := ../../platform/emlib/src/em_cmu_fpga.c \ +../../platform/emlib/src/em_dma.c \ +../../platform/emlib/src/em_csen.c \ +../../platform/emlib/src/em_msc.c \ +../../platform/emlib/src/em_lcd.c \ +../../platform/emlib/src/em_rtcc.c \ +../../platform/emlib/src/em_can.c \ +../../platform/emlib/src/em_wdog.c \ +../../platform/emlib/src/em_system.c \ +../../platform/emlib/src/em_prs.c \ +../../platform/emlib/src/em_se.c \ +../../platform/emlib/src/em_eusart.c \ +../../platform/emlib/src/em_dbg.c \ +../../platform/emlib/src/em_cmu.c \ +../../platform/emlib/src/em_rmu.c \ +../../platform/emlib/src/em_vcmp.c \ +../../platform/emlib/src/em_gpio.c \ +../../platform/emlib/src/em_aes.c \ +../../platform/emlib/src/em_burtc.c \ +../../platform/emlib/src/em_usart.c \ +../../platform/emlib/src/em_qspi.c \ +../../platform/emlib/src/em_lesense.c \ +../../platform/emlib/src/em_adc.c \ +../../platform/emlib/src/em_core.c \ +../../platform/emlib/src/em_letimer.c \ +../../platform/emlib/src/em_idac.c \ +../../platform/emlib/src/em_ldma.c \ +../../platform/emlib/src/em_vdac.c \ +../../platform/emlib/src/em_rtc.c \ +../../platform/emlib/src/em_dac.c \ +../../platform/emlib/src/em_pcnt.c \ +../../platform/emlib/src/em_pdm.c \ +../../platform/emlib/src/em_cryotimer.c \ +../../platform/emlib/src/em_iadc.c \ +../../platform/emlib/src/em_acmp.c \ +../../platform/emlib/src/em_opamp.c \ +../../platform/emlib/src/em_timer.c \ +../../platform/emlib/src/em_i2c.c \ +../../platform/emlib/src/em_gpcrc.c \ +../../platform/emlib/src/em_crypto.c \ +../../platform/emlib/src/em_emu.c \ +../../platform/emlib/src/em_ebi.c \ +../../platform/emlib/src/em_leuart.c + diff --git a/myapps/blinky-old-32mg/linker_script/efr32mg21.ld b/myapps/blinky-old-32mg/linker_script/efr32mg21.ld new file mode 100644 index 0000000..961e309 --- /dev/null +++ b/myapps/blinky-old-32mg/linker_script/efr32mg21.ld @@ -0,0 +1,292 @@ +/***************************************************************************//** + * @file gcc_EFR32MG21.ld + * @brief GNU Linker Script for Cortex-M based device + * @version V2.2.0 + * @date 16. December 2020 + * Linker script for Silicon Labs EFR32MG21 devices + ******************************************************************************* + * # License + * Copyright 2024 Silicon Laboratories, Inc. www.silabs.com + ******************************************************************************* + * + * SPDX-License-Identifier: Zlib + * + * The licensor of this software is Silicon Laboratories Inc. + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. + * + ******************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 1024K + RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 96K +} + +/* Linker script to place sections and symbol values. Should be used together + * with other linker script that defines memory regions FLASH and RAM. + * It references following symbols, which must be defined in code: + * Reset_Handler : Entry of reset handler + * + * It defines following symbols, which code can use without definition: + * __exidx_start + * __exidx_end + * __copy_table_start__ + * __copy_table_end__ + * __zero_table_start__ + * __zero_table_end__ + * __etext + * __data_start__ + * __preinit_array_start + * __preinit_array_end + * __init_array_start + * __init_array_end + * __fini_array_start + * __fini_array_end + * __data_end__ + * __bss_start__ + * __bss_end__ + * __end__ + * end + * __HeapLimit + * __StackLimit + * __StackTop + * __stack + * __StackSeal (only if ARMv8-M stack sealing is used) + */ + +ENTRY(Reset_Handler) + +SECTIONS +{ + .text : + { + KEEP(*(.vectors)) + *(.text*) + + KEEP(*(.init)) + KEEP(*(.fini)) + + /* .ctors */ + *crtbegin.o(.ctors) + *crtbegin?.o(.ctors) + *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors) + *(SORT(.ctors.*)) + *(.ctors) + + /* .dtors */ + *crtbegin.o(.dtors) + *crtbegin?.o(.dtors) + *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors) + *(SORT(.dtors.*)) + *(.dtors) + + *(.rodata*) + + KEEP(*(.eh_frame*)) + } > FLASH + /* + * SG veneers: + * All SG veneers are placed in the special output section .gnu.sgstubs. Its start address + * must be set, either with the command line option ‘--section-start’ or in a linker script, + * to indicate where to place these veneers in memory. + */ +/* + .gnu.sgstubs : ALIGN(32) + { + . = ALIGN(32); + linker_sg_begin = .; + KEEP(*(.gnu.sgstubs*)) + . = ALIGN(32); + } > FLASH + linker_sg_end = linker_sg_begin + SIZEOF(.gnu.sgstubs); +*/ + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > FLASH + + __exidx_start = .; + .ARM.exidx : + { + *(.ARM.exidx* .gnu.linkonce.armexidx.*) + } > FLASH + __exidx_end = .; + + .copy.table : + { + . = ALIGN(4); + __copy_table_start__ = .; + + LONG (__etext) + LONG (__data_start__) + LONG ((__data_end__ - __data_start__) / 4) + + /* Add each additional data section here */ +/* + LONG (__etext2) + LONG (__data2_start__) + LONG ((__data2_end__ - __data2_start__) / 4) +*/ + __copy_table_end__ = .; + } > FLASH + + .zero.table : + { + . = ALIGN(4); + __zero_table_start__ = .; + /* Add each additional bss section here */ +/* + LONG (__bss2_start__) + LONG ((__bss2_end__ - __bss2_start__) / 4) +*/ + __zero_table_end__ = .; + __etext = ALIGN(4); + } > FLASH + + .data : AT (__etext) + { + __data_start__ = .; + *(vtable) + *(.data*) + . = ALIGN (4); + PROVIDE (__ram_func_section_start = .); + *(.ram) + PROVIDE (__ram_func_section_end = .); + + . = ALIGN(4); + /* preinit data */ + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP(*(.preinit_array)) + PROVIDE_HIDDEN (__preinit_array_end = .); + + . = ALIGN(4); + /* init data */ + PROVIDE_HIDDEN (__init_array_start = .); + KEEP(*(SORT(.init_array.*))) + KEEP(*(.init_array)) + PROVIDE_HIDDEN (__init_array_end = .); + + . = ALIGN(4); + /* finit data */ + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP(*(SORT(.fini_array.*))) + KEEP(*(.fini_array)) + PROVIDE_HIDDEN (__fini_array_end = .); + + KEEP(*(.jcr*)) + . = ALIGN(4); + /* All data end */ + __data_end__ = .; + + } > RAM + + /* + * Secondary data section, optional + * + * Remember to add each additional data section + * to the .copy.table above to asure proper + * initialization during startup. + */ +/* + __etext2 = ALIGN (4); + + .data2 : AT (__etext2) + { + . = ALIGN(4); + __data2_start__ = .; + *(.data2) + *(.data2.*) + . = ALIGN(4); + __data2_end__ = .; + + } > RAM2 +*/ + .bss : + { + . = ALIGN(4); + __bss_start__ = .; + *(.bss) + *(.bss.*) + *(COMMON) + . = ALIGN(4); + __bss_end__ = .; + } > RAM AT > RAM + + /* + * Secondary bss section, optional + * + * Remember to add each additional bss section + * to the .zero.table above to asure proper + * initialization during startup. + */ +/* + .bss2 : + { + . = ALIGN(4); + __bss2_start__ = .; + *(.bss2) + *(.bss2.*) + . = ALIGN(4); + __bss2_end__ = .; + } > RAM2 AT > RAM2 +*/ + + .heap (COPY): + { + __HeapBase = .; + __end__ = .; + end = __end__; + _end = __end__; + KEEP(*(.heap*)) + __HeapLimit = .; + } > RAM + /* ARMv8-M stack sealing: + to use ARMv8-M stack sealing uncomment '.stackseal' section and KEEP(*(.stackseal*)) + in .stack_dummy section + */ +/* + .stackseal (COPY) : + { + . = ALIGN(8); + __StackSeal = .; + . = . + 8; + . = ALIGN(8); + } > RAM +*/ + + /* .stack_dummy section doesn't contains any symbols. It is only + * used for linker to calculate size of stack sections, and assign + * values to stack symbols later */ + .stack_dummy (COPY): + { + KEEP(*(.stack*)) + /* KEEP(*(.stackseal*))*/ + } > RAM + + /* Set stack top to end of RAM, and stack limit move down by + * size of stack_dummy section */ + __StackTop = ORIGIN(RAM) + LENGTH(RAM); + __StackLimit = __StackTop - SIZEOF(.stack_dummy); + PROVIDE(__stack = __StackTop); + + /* Check if data + heap + stack exceeds RAM limit */ + ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack") + + /* Check if FLASH usage exceeds FLASH size */ + ASSERT( LENGTH(FLASH) >= (__etext + SIZEOF(.data)), "FLASH memory overflowed !") +} diff --git a/myapps/blinky-old-32mg/main.mk b/myapps/blinky-old-32mg/main.mk new file mode 100644 index 0000000..68cdb18 --- /dev/null +++ b/myapps/blinky-old-32mg/main.mk @@ -0,0 +1,76 @@ +CC = arm-none-eabi-gcc +SIZE = arm-none-eabi-size +OBJCOPY = arm-none-eabi-objcopy + +COMMON_FLAGS = \ + -mcpu=cortex-m33 \ + -mthumb \ + -mfpu=fpv5-sp-d16 \ + -mfloat-abi=hard \ + -std=c99 \ + -Wall \ + -Wextra \ + -Os \ + -fdata-sections \ + -ffunction-sections \ + -fomit-frame-pointer \ + -imacros sl_gcc_preinclude.h \ + -mcmse \ + -g + +DEFINES = -DEFR32MG21A020F768IM32 + +INCLUDE += -I include -I../../platform/CMSIS/Core/Include \ + -I../../platform/Device/SiliconLabs/EFR32MG21/Include \ + -I../../platform/common/inc \ + -I ../../platform/common/toolchain/inc \ + -I ../../platform/emlib/inc + + +CFLAGS := $(COMMON_FLAGS) $(INCLUDE) $(DEFINES) + +SUBMAKEFILES := emlib.mk +SOURCES := ../../platform/Device/SiliconLabs/EFR32MG21/Source/system_efr32mg21.c \ +src/main.c + + +BUILD_DIR := build +TARGET_DIR := build_output + +#nosys.specs are required for printf +LDFLAGS = \ + -mcpu=cortex-m33 \ + -mthumb \ + -mfpu=fpv5-sp-d16 \ + -mfloat-abi=hard \ + -T"linker_script/efr32mg21.ld" \ + --specs=nano.specs \ + --specs=nosys.specs \ + -Xlinker -Map=$(TARGET_DIR)/main.map \ + -Wl,--gc-sections + +# Startup file +LDLIBS := ../../platform/Device/SiliconLabs/EFR32MG21/Source/GCC/startup_efr32mg21.S + +########### + +GROUP_START =-Wl,--start-group +GROUP_END =-Wl,--end-group + +PROJECT_LIBS = \ + -lgcc \ + -lc \ + -lm \ + -lnosys + +LIBS += $(GROUP_START) $(PROJECT_LIBS) $(GROUP_END) + +TGT_LDFLAGS += $(LIBS) +########## + +TARGET := main.elf + +size: $(TARGET_DIR)/main.elf + $(SIZE) $(TARGET_DIR)/main.elf + + diff --git a/myapps/blinky-old-32mg/src/main.c b/myapps/blinky-old-32mg/src/main.c new file mode 100644 index 0000000..638ed17 --- /dev/null +++ b/myapps/blinky-old-32mg/src/main.c @@ -0,0 +1,17 @@ +#include "em_cmu.h" +#include "em_gpio.h" + +int main (void) +{ + CMU_ClockEnable(cmuClock_GPIO, true); + GPIO_PinModeSet(gpioPortA, 0/*pin 0*/, gpioModePushPull /*push-pull output*/, 1/*output level*/); + + while(1) { + GPIO_PinOutToggle(gpioPortA, 0/*pin 0*/); + for (volatile uint32_t i = 0; i < 100000; i++) { } // busy delay + } + + return 0; +} + + diff --git a/myapps/blinky-old/Makefile b/myapps/blinky-old/Makefile new file mode 100644 index 0000000..d119d54 --- /dev/null +++ b/myapps/blinky-old/Makefile @@ -0,0 +1,375 @@ +# boilermake: A reusable, but flexible, boilerplate Makefile. +# +# Copyright 2008, 2009, 2010 Dan Moulding, Alan T. DeKok +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# Caution: Don't edit this Makefile! Create your own main.mk and other +# submakefiles, which will be included by this Makefile. +# Only edit this if you need to modify boilermake's behavior (fix +# bugs, add features, etc). + +# Note: Parameterized "functions" in this makefile that are marked with +# "USE WITH EVAL" are only useful in conjuction with eval. This is +# because those functions result in a block of Makefile syntax that must +# be evaluated after expansion. Since they must be used with eval, most +# instances of "$" within them need to be escaped with a second "$" to +# accomodate the double expansion that occurs when eval is invoked. + +# ADD_CLEAN_RULE - Parameterized "function" that adds a new rule and phony +# target for cleaning the specified target (removing its build-generated +# files). +# +# USE WITH EVAL +# +define ADD_CLEAN_RULE + clean: clean_${1} + .PHONY: clean_${1} + clean_${1}: + $$(strip rm -f ${TARGET_DIR}/${1} $${${1}_OBJS:%.o=%.[doP]}) + $${${1}_POSTCLEAN} +endef + +# ADD_OBJECT_RULE - Parameterized "function" that adds a pattern rule for +# building object files from source files with the filename extension +# specified in the second argument. The first argument must be the name of the +# base directory where the object files should reside (such that the portion +# of the path after the base directory will match the path to corresponding +# source files). The third argument must contain the rules used to compile the +# source files into object code form. +# +# USE WITH EVAL +# +define ADD_OBJECT_RULE +${1}/%.o: ${2} + ${3} +endef + +# ADD_TARGET_RULE - Parameterized "function" that adds a new target to the +# Makefile. The target may be an executable or a library. The two allowable +# types of targets are distinguished based on the name: library targets must +# end with the traditional ".a" extension. +# +# USE WITH EVAL +# +define ADD_TARGET_RULE + ifeq "$$(suffix ${1})" ".a" + # Add a target for creating a static library. + $${TARGET_DIR}/${1}: $${${1}_OBJS} + @mkdir -p $$(dir $$@) + $$(strip $${AR} $${ARFLAGS} $$@ $${${1}_OBJS}) + $${${1}_POSTMAKE} + else + # Add a target for linking an executable. First, attempt to select the + # appropriate front-end to use for linking. This might not choose the + # right one (e.g. if linking with a C++ static library, but all other + # sources are C sources), so the user makefile is allowed to specify a + # linker to be used for each target. + ifeq "$$(strip $${${1}_LINKER})" "" + # No linker was explicitly specified to be used for this target. If + # there are any C++ sources for this target, use the C++ compiler. + # For all other targets, default to using the C compiler. + ifneq "$$(strip $$(filter $${CXX_SRC_EXTS},$${${1}_SOURCES}))" "" + ${1}_LINKER = $${CXX} + else + ${1}_LINKER = $${CC} + endif + endif + + $${TARGET_DIR}/${1}: $${${1}_OBJS} $${${1}_PREREQS} + @mkdir -p $$(dir $$@) + $$(strip $${${1}_LINKER} -o $$@ $${LDFLAGS} $${${1}_LDFLAGS} \ + $${${1}_OBJS} $${LDLIBS} $${${1}_LDLIBS}) + $${${1}_POSTMAKE} + endif +endef + +# CANONICAL_PATH - Given one or more paths, converts the paths to the canonical +# form. The canonical form is the path, relative to the project's top-level +# directory (the directory from which "make" is run), and without +# any "./" or "../" sequences. For paths that are not located below the +# top-level directory, the canonical form is the absolute path (i.e. from +# the root of the filesystem) also without "./" or "../" sequences. +define CANONICAL_PATH +$(patsubst ${CURDIR}/%,%,$(abspath ${1})) +endef + +# COMPILE_C_CMDS - Commands for compiling C source code. +define COMPILE_C_CMDS + @mkdir -p $(dir $@) + $(strip ${CC} -o $@ -c -MD ${CFLAGS} ${SRC_CFLAGS} ${INCDIRS} \ + ${SRC_INCDIRS} ${SRC_DEFS} ${DEFS} $<) + @cp ${@:%$(suffix $@)=%.d} ${@:%$(suffix $@)=%.P}; \ + sed -e 's/#.*//' -e 's/^[^:]*: *//' -e 's/ *\\$$//' \ + -e '/^$$/ d' -e 's/$$/ :/' < ${@:%$(suffix $@)=%.d} \ + >> ${@:%$(suffix $@)=%.P}; \ + rm -f ${@:%$(suffix $@)=%.d} +endef + +# COMPILE_CXX_CMDS - Commands for compiling C++ source code. +define COMPILE_CXX_CMDS + @mkdir -p $(dir $@) + $(strip ${CXX} -o $@ -c -MD ${CXXFLAGS} ${SRC_CXXFLAGS} ${INCDIRS} \ + ${SRC_INCDIRS} ${SRC_DEFS} ${DEFS} $<) + @cp ${@:%$(suffix $@)=%.d} ${@:%$(suffix $@)=%.P}; \ + sed -e 's/#.*//' -e 's/^[^:]*: *//' -e 's/ *\\$$//' \ + -e '/^$$/ d' -e 's/$$/ :/' < ${@:%$(suffix $@)=%.d} \ + >> ${@:%$(suffix $@)=%.P}; \ + rm -f ${@:%$(suffix $@)=%.d} +endef + +# INCLUDE_SUBMAKEFILE - Parameterized "function" that includes a new +# "submakefile" fragment into the overall Makefile. It also recursively +# includes all submakefiles of the specified submakefile fragment. +# +# USE WITH EVAL +# +define INCLUDE_SUBMAKEFILE + # Initialize all variables that can be defined by a makefile fragment, then + # include the specified makefile fragment. + TARGET := + TGT_CFLAGS := + TGT_CXXFLAGS := + TGT_DEFS := + TGT_INCDIRS := + TGT_LDFLAGS := + TGT_LDLIBS := + TGT_LINKER := + TGT_POSTCLEAN := + TGT_POSTMAKE := + TGT_PREREQS := + + SOURCES := + SRC_CFLAGS := + SRC_CXXFLAGS := + SRC_DEFS := + SRC_INCDIRS := + + SUBMAKEFILES := + + # A directory stack is maintained so that the correct paths are used as we + # recursively include all submakefiles. Get the makefile's directory and + # push it onto the stack. + DIR := $(call CANONICAL_PATH,$(dir ${1})) + DIR_STACK := $$(call PUSH,$${DIR_STACK},$${DIR}) + + include ${1} + + # Initialize internal local variables. + OBJS := + + # Ensure that valid values are set for BUILD_DIR and TARGET_DIR. + ifeq "$$(strip $${BUILD_DIR})" "" + BUILD_DIR := build + endif + ifeq "$$(strip $${TARGET_DIR})" "" + TARGET_DIR := . + endif + + # Determine which target this makefile's variables apply to. A stack is + # used to keep track of which target is the "current" target as we + # recursively include other submakefiles. + ifneq "$$(strip $${TARGET})" "" + # This makefile defined a new target. Target variables defined by this + # makefile apply to this new target. Initialize the target's variables. + TGT := $$(strip $${TARGET}) + ALL_TGTS += $${TGT} + $${TGT}_CFLAGS := $${TGT_CFLAGS} + $${TGT}_CXXFLAGS := $${TGT_CXXFLAGS} + $${TGT}_DEFS := $${TGT_DEFS} + $${TGT}_DEPS := + TGT_INCDIRS := $$(call QUALIFY_PATH,$${DIR},$${TGT_INCDIRS}) + TGT_INCDIRS := $$(call CANONICAL_PATH,$${TGT_INCDIRS}) + $${TGT}_INCDIRS := $${TGT_INCDIRS} + $${TGT}_LDFLAGS := $${TGT_LDFLAGS} + $${TGT}_LDLIBS := $${TGT_LDLIBS} + $${TGT}_LINKER := $${TGT_LINKER} + $${TGT}_OBJS := + $${TGT}_POSTCLEAN := $${TGT_POSTCLEAN} + $${TGT}_POSTMAKE := $${TGT_POSTMAKE} + $${TGT}_PREREQS := $$(addprefix $${TARGET_DIR}/,$${TGT_PREREQS}) + $${TGT}_SOURCES := + else + # The values defined by this makefile apply to the the "current" target + # as determined by which target is at the top of the stack. + TGT := $$(strip $$(call PEEK,$${TGT_STACK})) + $${TGT}_CFLAGS += $${TGT_CFLAGS} + $${TGT}_CXXFLAGS += $${TGT_CXXFLAGS} + $${TGT}_DEFS += $${TGT_DEFS} + TGT_INCDIRS := $$(call QUALIFY_PATH,$${DIR},$${TGT_INCDIRS}) + TGT_INCDIRS := $$(call CANONICAL_PATH,$${TGT_INCDIRS}) + $${TGT}_INCDIRS += $${TGT_INCDIRS} + $${TGT}_LDFLAGS += $${TGT_LDFLAGS} + $${TGT}_LDLIBS += $${TGT_LDLIBS} + $${TGT}_POSTCLEAN += $${TGT_POSTCLEAN} + $${TGT}_POSTMAKE += $${TGT_POSTMAKE} + $${TGT}_PREREQS += $${TGT_PREREQS} + endif + + # Push the current target onto the target stack. + TGT_STACK := $$(call PUSH,$${TGT_STACK},$${TGT}) + + ifneq "$$(strip $${SOURCES})" "" + # This makefile builds one or more objects from source. Validate the + # specified sources against the supported source file types. + BAD_SRCS := $$(strip $$(filter-out $${ALL_SRC_EXTS},$${SOURCES})) + ifneq "$${BAD_SRCS}" "" + $$(error Unsupported source file(s) found in ${1} [$${BAD_SRCS}]) + endif + + # Qualify and canonicalize paths. + SOURCES := $$(call QUALIFY_PATH,$${DIR},$${SOURCES}) + SOURCES := $$(call CANONICAL_PATH,$${SOURCES}) + SRC_INCDIRS := $$(call QUALIFY_PATH,$${DIR},$${SRC_INCDIRS}) + SRC_INCDIRS := $$(call CANONICAL_PATH,$${SRC_INCDIRS}) + + # Save the list of source files for this target. + $${TGT}_SOURCES += $${SOURCES} + + # Convert the source file names to their corresponding object file + # names. + OBJS := $$(addprefix $${BUILD_DIR}/$$(call CANONICAL_PATH,$${TGT})/,\ + $$(addsuffix .o,$$(basename $${SOURCES}))) + + # Add the objects to the current target's list of objects, and create + # target-specific variables for the objects based on any source + # variables that were defined. + $${TGT}_OBJS += $${OBJS} + $${TGT}_DEPS += $${OBJS:%.o=%.P} + $${OBJS}: SRC_CFLAGS := $${$${TGT}_CFLAGS} $${SRC_CFLAGS} + $${OBJS}: SRC_CXXFLAGS := $${$${TGT}_CXXFLAGS} $${SRC_CXXFLAGS} + $${OBJS}: SRC_DEFS := $$(addprefix -D,$${$${TGT}_DEFS} $${SRC_DEFS}) + $${OBJS}: SRC_INCDIRS := $$(addprefix -I,\ + $${$${TGT}_INCDIRS} $${SRC_INCDIRS}) + endif + + ifneq "$$(strip $${SUBMAKEFILES})" "" + # This makefile has submakefiles. Recursively include them. + $$(foreach MK,$${SUBMAKEFILES},\ + $$(eval $$(call INCLUDE_SUBMAKEFILE,\ + $$(call CANONICAL_PATH,\ + $$(call QUALIFY_PATH,$${DIR},$${MK}))))) + endif + + # Reset the "current" target to it's previous value. + TGT_STACK := $$(call POP,$${TGT_STACK}) + TGT := $$(call PEEK,$${TGT_STACK}) + + # Reset the "current" directory to it's previous value. + DIR_STACK := $$(call POP,$${DIR_STACK}) + DIR := $$(call PEEK,$${DIR_STACK}) +endef + +# MIN - Parameterized "function" that results in the minimum lexical value of +# the two values given. +define MIN +$(firstword $(sort ${1} ${2})) +endef + +# PEEK - Parameterized "function" that results in the value at the top of the +# specified colon-delimited stack. +define PEEK +$(lastword $(subst :, ,${1})) +endef + +# POP - Parameterized "function" that pops the top value off of the specified +# colon-delimited stack, and results in the new value of the stack. Note that +# the popped value cannot be obtained using this function; use peek for that. +define POP +${1:%:$(lastword $(subst :, ,${1}))=%} +endef + +# PUSH - Parameterized "function" that pushes a value onto the specified colon- +# delimited stack, and results in the new value of the stack. +define PUSH +${2:%=${1}:%} +endef + +# QUALIFY_PATH - Given a "root" directory and one or more paths, qualifies the +# paths using the "root" directory (i.e. appends the root directory name to +# the paths) except for paths that are absolute. +define QUALIFY_PATH +$(addprefix ${1}/,$(filter-out /%,${2})) $(filter /%,${2}) +endef + +############################################################################### +# +# Start of Makefile Evaluation +# +############################################################################### + +# Older versions of GNU Make lack capabilities needed by boilermake. +# With older versions, "make" may simply output "nothing to do", likely leading +# to confusion. To avoid this, check the version of GNU make up-front and +# inform the user if their version of make doesn't meet the minimum required. +MIN_MAKE_VERSION := 3.81 +MIN_MAKE_VER_MSG := boilermake requires GNU Make ${MIN_MAKE_VERSION} or greater +ifeq "${MAKE_VERSION}" "" + $(info GNU Make not detected) + $(error ${MIN_MAKE_VER_MSG}) +endif +ifneq "${MIN_MAKE_VERSION}" "$(call MIN,${MIN_MAKE_VERSION},${MAKE_VERSION})" + $(info This is GNU Make version ${MAKE_VERSION}) + $(error ${MIN_MAKE_VER_MSG}) +endif + +# Define the source file extensions that we know how to handle. +C_SRC_EXTS := %.c %.S +CXX_SRC_EXTS := %.C %.cc %.cp %.cpp %.CPP %.cxx %.c++ +ALL_SRC_EXTS := ${C_SRC_EXTS} ${CXX_SRC_EXTS} + +# Initialize global variables. +ALL_TGTS := +DEFS := +DIR_STACK := +INCDIRS := +TGT_STACK := + +# Include the main user-supplied submakefile. This also recursively includes +# all other user-supplied submakefiles. +$(eval $(call INCLUDE_SUBMAKEFILE,main.mk)) + +# Perform post-processing on global variables as needed. +DEFS := $(addprefix -D,${DEFS}) +INCDIRS := $(addprefix -I,$(call CANONICAL_PATH,${INCDIRS})) + +# Define the "all" target (which simply builds all user-defined targets) as the +# default goal. +.PHONY: all +all: $(addprefix ${TARGET_DIR}/,${ALL_TGTS}) + +# Add a new target rule for each user-defined target. +$(foreach TGT,${ALL_TGTS},\ + $(eval $(call ADD_TARGET_RULE,${TGT}))) + +# Add pattern rule(s) for creating compiled object code from C source. +$(foreach TGT,${ALL_TGTS},\ + $(foreach EXT,${C_SRC_EXTS},\ + $(eval $(call ADD_OBJECT_RULE,${BUILD_DIR}/$(call CANONICAL_PATH,${TGT}),\ + ${EXT},$${COMPILE_C_CMDS})))) + +# Add pattern rule(s) for creating compiled object code from C++ source. +$(foreach TGT,${ALL_TGTS},\ + $(foreach EXT,${CXX_SRC_EXTS},\ + $(eval $(call ADD_OBJECT_RULE,${BUILD_DIR}/$(call CANONICAL_PATH,${TGT}),\ + ${EXT},$${COMPILE_CXX_CMDS})))) + +# Add "clean" rules to remove all build-generated files. +.PHONY: clean +$(foreach TGT,${ALL_TGTS},\ + $(eval $(call ADD_CLEAN_RULE,${TGT}))) + +# Include generated rules that define additional (header) dependencies. +$(foreach TGT,${ALL_TGTS},\ + $(eval -include ${${TGT}_DEPS})) diff --git a/myapps/blinky-old/emlib.mk b/myapps/blinky-old/emlib.mk new file mode 100644 index 0000000..7c39930 --- /dev/null +++ b/myapps/blinky-old/emlib.mk @@ -0,0 +1,44 @@ +SOURCES := ../../platform/emlib/src/em_cmu_fpga.c \ +../../platform/emlib/src/em_dma.c \ +../../platform/emlib/src/em_csen.c \ +../../platform/emlib/src/em_msc.c \ +../../platform/emlib/src/em_lcd.c \ +../../platform/emlib/src/em_rtcc.c \ +../../platform/emlib/src/em_can.c \ +../../platform/emlib/src/em_wdog.c \ +../../platform/emlib/src/em_system.c \ +../../platform/emlib/src/em_prs.c \ +../../platform/emlib/src/em_se.c \ +../../platform/emlib/src/em_eusart.c \ +../../platform/emlib/src/em_dbg.c \ +../../platform/emlib/src/em_cmu.c \ +../../platform/emlib/src/em_rmu.c \ +../../platform/emlib/src/em_vcmp.c \ +../../platform/emlib/src/em_gpio.c \ +../../platform/emlib/src/em_aes.c \ +../../platform/emlib/src/em_burtc.c \ +../../platform/emlib/src/em_usart.c \ +../../platform/emlib/src/em_qspi.c \ +../../platform/emlib/src/em_lesense.c \ +../../platform/emlib/src/em_adc.c \ +../../platform/emlib/src/em_core.c \ +../../platform/emlib/src/em_letimer.c \ +../../platform/emlib/src/em_idac.c \ +../../platform/emlib/src/em_ldma.c \ +../../platform/emlib/src/em_vdac.c \ +../../platform/emlib/src/em_rtc.c \ +../../platform/emlib/src/em_dac.c \ +../../platform/emlib/src/em_pcnt.c \ +../../platform/emlib/src/em_pdm.c \ +../../platform/emlib/src/em_cryotimer.c \ +../../platform/emlib/src/em_iadc.c \ +../../platform/emlib/src/em_acmp.c \ +../../platform/emlib/src/em_opamp.c \ +../../platform/emlib/src/em_timer.c \ +../../platform/emlib/src/em_i2c.c \ +../../platform/emlib/src/em_gpcrc.c \ +../../platform/emlib/src/em_crypto.c \ +../../platform/emlib/src/em_emu.c \ +../../platform/emlib/src/em_ebi.c \ +../../platform/emlib/src/em_leuart.c + diff --git a/myapps/blinky-old/main.mk b/myapps/blinky-old/main.mk new file mode 100644 index 0000000..f37779a --- /dev/null +++ b/myapps/blinky-old/main.mk @@ -0,0 +1,76 @@ +CC = arm-none-eabi-gcc +SIZE = arm-none-eabi-size +OBJCOPY = arm-none-eabi-objcopy + +COMMON_FLAGS = \ + -mcpu=cortex-m33 \ + -mthumb \ + -mfpu=fpv5-sp-d16 \ + -mfloat-abi=hard \ + -std=c99 \ + -Wall \ + -Wextra \ + -Os \ + -fdata-sections \ + -ffunction-sections \ + -fomit-frame-pointer \ + -imacros sl_gcc_preinclude.h \ + -mcmse \ + -g + +DEFINES = -DEFR32BG22C224F512GM32 + +INCLUDE += -I include -I../../platform/CMSIS/Core/Include \ + -I../../platform/Device/SiliconLabs/EFR32BG22/Include \ + -I../../platform/common/inc \ + -I ../../platform/common/toolchain/inc \ + -I ../../platform/emlib/inc + + +CFLAGS := $(COMMON_FLAGS) $(INCLUDE) $(DEFINES) + +SUBMAKEFILES := emlib.mk +SOURCES := ../../platform/Device/SiliconLabs/EFR32BG22/Source/system_efr32bg22.c \ +src/main.c + + +BUILD_DIR := build +TARGET_DIR := build_output + +#nosys.specs are required for printf +LDFLAGS = \ + -mcpu=cortex-m33 \ + -mthumb \ + -mfpu=fpv5-sp-d16 \ + -mfloat-abi=hard \ + -T"../../platform/Device/SiliconLabs/EFR32BG22/Source/GCC/efr32bg22.ld" \ + --specs=nano.specs \ + --specs=nosys.specs \ + -Xlinker -Map=$(TARGET_DIR)/main.map \ + -Wl,--gc-sections + +# Startup file +LDLIBS := ../../platform/Device/SiliconLabs/EFR32BG22/Source/GCC/startup_efr32bg22.S + +########### + +GROUP_START =-Wl,--start-group +GROUP_END =-Wl,--end-group + +PROJECT_LIBS = \ + -lgcc \ + -lc \ + -lm \ + -lnosys + +LIBS += $(GROUP_START) $(PROJECT_LIBS) $(GROUP_END) + +TGT_LDFLAGS += $(LIBS) +########## + +TARGET := main.elf + +size: $(TARGET_DIR)/main.elf + $(SIZE) $(TARGET_DIR)/main.elf + + diff --git a/myapps/blinky-old/src/main.c b/myapps/blinky-old/src/main.c new file mode 100644 index 0000000..638ed17 --- /dev/null +++ b/myapps/blinky-old/src/main.c @@ -0,0 +1,17 @@ +#include "em_cmu.h" +#include "em_gpio.h" + +int main (void) +{ + CMU_ClockEnable(cmuClock_GPIO, true); + GPIO_PinModeSet(gpioPortA, 0/*pin 0*/, gpioModePushPull /*push-pull output*/, 1/*output level*/); + + while(1) { + GPIO_PinOutToggle(gpioPortA, 0/*pin 0*/); + for (volatile uint32_t i = 0; i < 100000; i++) { } // busy delay + } + + return 0; +} + + diff --git a/myapps/blinky/Makefile b/myapps/blinky/Makefile new file mode 100644 index 0000000..4bc2ef3 --- /dev/null +++ b/myapps/blinky/Makefile @@ -0,0 +1,175 @@ +###################################### +# target +###################################### +TARGET = blinky + + +###################################### +# building variables +###################################### +# debug build? +DEBUG = 1 +# optimization for size +OPT = -Os + + +####################################### +# paths +####################################### +# Build path +BUILD_DIR = build + +###################################### +# source +###################################### +# C sources +include emlib.mk +C_SOURCES += \ +../../platform/Device/SiliconLabs/EFR32BG22/Source/system_efr32bg22.c \ +src/main.c + + +# ASM sources +LDLIBS1 = \ +../../platform/Device/SiliconLabs/EFR32BG22/Source/GCC/startup_efr32bg22.S + +####################################### +# binaries +####################################### +PREFIX = arm-none-eabi- + +CC = $(PREFIX)gcc +CP = $(PREFIX)objcopy +SZ = $(PREFIX)size + +HEX = $(CP) -O ihex +BIN = $(CP) -O binary -S + +####################################### +# CFLAGS +####################################### +# cpu +CPU = \ + -mcpu=cortex-m33 \ + -mthumb \ + -mfpu=fpv5-sp-d16 \ + -mfloat-abi=hard \ + -std=c99 \ + -Wall \ + -Wextra \ + -fdata-sections \ + -ffunction-sections \ + -fomit-frame-pointer \ + -imacros sl_gcc_preinclude.h \ + -mcmse + +DEFINES = -DEFR32BG22C224F512GM32 + +# fpu +FPU = + +# float-abi +FLOAT-ABI = + +# mcu +MCU = $(CPU) $(FPU) $(FLOAT-ABI) + +# C includes +C_INCLUDES = \ + -I include -I../../platform/CMSIS/Core/Include \ + -I../../platform/Device/SiliconLabs/EFR32BG22/Include \ + -I../../platform/common/inc \ + -I ../../platform/common/toolchain/inc \ + -I ../../platform/emlib/inc + +# compile gcc flags +CFLAGS = $(MCU) $(C_INCLUDES) $(OPT) $(DEFINES) + +ifeq ($(DEBUG), 1) +CFLAGS += -g +endif + + +# Generate dependency information <<<<<<<<<<<<<<<<<<<<<<< check +CFLAGS += -MMD -MP -MF"$(@:%.o=%.d)" + + +####################################### +# LDFLAGS +####################################### +# link script +LDSCRIPT = ../../platform/Device/SiliconLabs/EFR32BG22/Source/GCC/efr32bg22.ld + +# libraries +GROUP_START =-Wl,--start-group +GROUP_END =-Wl,--end-group + +PROJECT_LIBS = \ + -lgcc \ + -lc \ + -lm \ + -lnosys + + +LIBS = $(GROUP_START) $(PROJECT_LIBS) $(GROUP_END) +LIBDIR = +LDFLAGS = \ + -mcpu=cortex-m33 \ + -mthumb \ + -mfpu=fpv5-sp-d16 \ + -mfloat-abi=hard \ + -T $(LDSCRIPT) \ + --specs=nano.specs \ + --specs=nosys.specs \ + -Xlinker -Map=$(BUILD_DIR)/$(TARGET).map \ + -Wl,--gc-sections \ + $(LIBS) + +# default action: build all +all: $(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 $@ + +#$(LUAOBJECTS) $(OBJECTS) +$(BUILD_DIR)/$(TARGET).elf: $(OBJECTS) Makefile + $(CC) $(OBJECTS) $(LDFLAGS) $(LDLIBS1) -o $@ + $(SZ) $@ + +$(BUILD_DIR)/%.hex: $(BUILD_DIR)/%.elf | $(BUILD_DIR) + $(HEX) $< $@ + +$(BUILD_DIR)/%.bin: $(BUILD_DIR)/%.elf | $(BUILD_DIR) + $(BIN) $< $@ + +$(BUILD_DIR): + mkdir $@ + +####################################### +# Program +####################################### + +####################################### +# clean up +####################################### +clean: + -rm -fR $(BUILD_DIR) + +####################################### +# dependencies +####################################### +-include $(wildcard $(BUILD_DIR)/*.d) + +# *** EOF *** diff --git a/myapps/blinky/emlib.mk b/myapps/blinky/emlib.mk new file mode 100644 index 0000000..726068f --- /dev/null +++ b/myapps/blinky/emlib.mk @@ -0,0 +1,44 @@ +C_SOURCES = ../../platform/emlib/src/em_cmu_fpga.c \ +../../platform/emlib/src/em_dma.c \ +../../platform/emlib/src/em_csen.c \ +../../platform/emlib/src/em_msc.c \ +../../platform/emlib/src/em_lcd.c \ +../../platform/emlib/src/em_rtcc.c \ +../../platform/emlib/src/em_can.c \ +../../platform/emlib/src/em_wdog.c \ +../../platform/emlib/src/em_system.c \ +../../platform/emlib/src/em_prs.c \ +../../platform/emlib/src/em_se.c \ +../../platform/emlib/src/em_eusart.c \ +../../platform/emlib/src/em_dbg.c \ +../../platform/emlib/src/em_cmu.c \ +../../platform/emlib/src/em_rmu.c \ +../../platform/emlib/src/em_vcmp.c \ +../../platform/emlib/src/em_gpio.c \ +../../platform/emlib/src/em_aes.c \ +../../platform/emlib/src/em_burtc.c \ +../../platform/emlib/src/em_usart.c \ +../../platform/emlib/src/em_qspi.c \ +../../platform/emlib/src/em_lesense.c \ +../../platform/emlib/src/em_adc.c \ +../../platform/emlib/src/em_core.c \ +../../platform/emlib/src/em_letimer.c \ +../../platform/emlib/src/em_idac.c \ +../../platform/emlib/src/em_ldma.c \ +../../platform/emlib/src/em_vdac.c \ +../../platform/emlib/src/em_rtc.c \ +../../platform/emlib/src/em_dac.c \ +../../platform/emlib/src/em_pcnt.c \ +../../platform/emlib/src/em_pdm.c \ +../../platform/emlib/src/em_cryotimer.c \ +../../platform/emlib/src/em_iadc.c \ +../../platform/emlib/src/em_acmp.c \ +../../platform/emlib/src/em_opamp.c \ +../../platform/emlib/src/em_timer.c \ +../../platform/emlib/src/em_i2c.c \ +../../platform/emlib/src/em_gpcrc.c \ +../../platform/emlib/src/em_crypto.c \ +../../platform/emlib/src/em_emu.c \ +../../platform/emlib/src/em_ebi.c \ +../../platform/emlib/src/em_leuart.c + diff --git a/myapps/blinky/src/main.c b/myapps/blinky/src/main.c new file mode 100644 index 0000000..638ed17 --- /dev/null +++ b/myapps/blinky/src/main.c @@ -0,0 +1,17 @@ +#include "em_cmu.h" +#include "em_gpio.h" + +int main (void) +{ + CMU_ClockEnable(cmuClock_GPIO, true); + GPIO_PinModeSet(gpioPortA, 0/*pin 0*/, gpioModePushPull /*push-pull output*/, 1/*output level*/); + + while(1) { + GPIO_PinOutToggle(gpioPortA, 0/*pin 0*/); + for (volatile uint32_t i = 0; i < 100000; i++) { } // busy delay + } + + return 0; +} + +