parent
							
								
									b590350df0
								
							
						
					
					
						commit
						09b6c80555
					
				| @ -1 +0,0 @@ | |||||||
| Subproject commit 7dfe3cf63ab428690112b79ce5d5261945a9118c |  | ||||||
| @ -0,0 +1,39 @@ | |||||||
|  | /*
 | ||||||
|  |              DMBS Build System | ||||||
|  |       Released into the public domain. | ||||||
|  | 
 | ||||||
|  |    dean [at] fourwalledcubicle [dot] com | ||||||
|  |          www.fourwalledcubicle.com | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | /** \file
 | ||||||
|  |  * | ||||||
|  |  *  Special application to extract an EEPROM image stored in FLASH memory, and | ||||||
|  |  *  copy it to the device EEPROM. This application is designed to be used with | ||||||
|  |  *  the HID build system module of DMBS to program the EEPROM of a target device | ||||||
|  |  *  that uses the HID bootloader protocol, which does not have native EEPROM | ||||||
|  |  *  programming support. | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #include <avr/io.h> | ||||||
|  | #include <avr/eeprom.h> | ||||||
|  | #include <avr/pgmspace.h> | ||||||
|  | 
 | ||||||
|  | /* References to the binary EEPROM data linked in the AVR's FLASH memory space */ | ||||||
|  | extern const char _binary_InputEEData_bin_start[]; | ||||||
|  | extern const char _binary_InputEEData_bin_end[]; | ||||||
|  | extern const char _binary_InputEEData_bin_size[]; | ||||||
|  | 
 | ||||||
|  | /* Friendly names for the embedded binary data stored in FLASH memory space */ | ||||||
|  | #define InputEEData       _binary_InputEEData_bin_start | ||||||
|  | #define InputEEData_size  ((int)_binary_InputEEData_bin_size) | ||||||
|  | 
 | ||||||
|  | int main(void) | ||||||
|  | { | ||||||
|  | 	/* Copy out the embedded EEPROM data from FLASH to EEPROM memory space */ | ||||||
|  | 	for (uint16_t i = 0; i < InputEEData_size; i++) | ||||||
|  | 	  eeprom_update_byte((uint8_t*)i, pgm_read_byte(&InputEEData[i])); | ||||||
|  | 
 | ||||||
|  | 	/* Infinite loop once complete */ | ||||||
|  | 	for (;;); | ||||||
|  | } | ||||||
| @ -0,0 +1,35 @@ | |||||||
|  | #
 | ||||||
|  | #            DMBS Build System
 | ||||||
|  | #     Released into the public domain.
 | ||||||
|  | #
 | ||||||
|  | #  dean [at] fourwalledcubicle [dot] com
 | ||||||
|  | #        www.fourwalledcubicle.com
 | ||||||
|  | #
 | ||||||
|  | 
 | ||||||
|  | # Run "make help" for target help.
 | ||||||
|  | 
 | ||||||
|  | MCU          = atmega128 | ||||||
|  | ARCH         = AVR8 | ||||||
|  | F_CPU        = 1000000 | ||||||
|  | OPTIMIZATION = s | ||||||
|  | TARGET       = HID_EEPROM_Loader | ||||||
|  | SRC          = $(TARGET).c | ||||||
|  | CC_FLAGS     = | ||||||
|  | LD_FLAGS     = | ||||||
|  | OBJECT_FILES = InputEEData.o | ||||||
|  | 
 | ||||||
|  | # Default target
 | ||||||
|  | all: | ||||||
|  | 
 | ||||||
|  | # Determine the AVR sub-architecture of the build main application object file
 | ||||||
|  | FIND_AVR_SUBARCH = avr$(shell avr-objdump -f $(TARGET).o | grep architecture | cut -d':' -f3 | cut -d',' -f1) | ||||||
|  | 
 | ||||||
|  | # Create a linkable object file with the input binary EEPROM data stored in the FLASH section
 | ||||||
|  | InputEEData.o: InputEEData.bin $(TARGET).o $(MAKEFILE_LIST) | ||||||
|  | 	@echo $(MSG_OBJCPY_CMD) Converting \"$<\" to a object file \"$@\" | ||||||
|  | 	avr-objcopy -I binary -O elf32-avr -B $(call FIND_AVR_SUBARCH) --rename-section .data=.progmem.data,contents,alloc,readonly,data $< $@ | ||||||
|  | 
 | ||||||
|  | # Include LUFA build script makefiles
 | ||||||
|  | include ../core.mk | ||||||
|  | include ../gcc.mk | ||||||
|  | include ../hid.mk | ||||||
| @ -0,0 +1,32 @@ | |||||||
|  |              DMBS Build System | ||||||
|  |       Released into the public domain. | ||||||
|  | 
 | ||||||
|  |    dean [at] fourwalledcubicle [dot] com | ||||||
|  |          www.fourwalledcubicle.com | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | This is free and unencumbered software released into the public domain. | ||||||
|  | 
 | ||||||
|  | Anyone is free to copy, modify, publish, use, compile, sell, or | ||||||
|  | distribute this software, either in source code form or as a compiled | ||||||
|  | binary, for any purpose, commercial or non-commercial, and by any | ||||||
|  | means. | ||||||
|  | 
 | ||||||
|  | In jurisdictions that recognize copyright laws, the author or authors | ||||||
|  | of this software dedicate any and all copyright interest in the | ||||||
|  | software to the public domain. We make this dedication for the benefit | ||||||
|  | of the public at large and to the detriment of our heirs and | ||||||
|  | successors. We intend this dedication to be an overt act of | ||||||
|  | relinquishment in perpetuity of all present and future rights to this | ||||||
|  | software under copyright law. | ||||||
|  | 
 | ||||||
|  | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | ||||||
|  | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | ||||||
|  | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. | ||||||
|  | IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR | ||||||
|  | OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, | ||||||
|  | ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR | ||||||
|  | OTHER DEALINGS IN THE SOFTWARE. | ||||||
|  | 
 | ||||||
|  | For more information, please refer to <http://unlicense.org/> | ||||||
| @ -0,0 +1,103 @@ | |||||||
|  | #
 | ||||||
|  | #            DMBS Build System
 | ||||||
|  | #     Released into the public domain.
 | ||||||
|  | #
 | ||||||
|  | #  dean [at] fourwalledcubicle [dot] com
 | ||||||
|  | #        www.fourwalledcubicle.com
 | ||||||
|  | #
 | ||||||
|  | 
 | ||||||
|  | DMBS_BUILD_MODULES         += ATPROGRAM | ||||||
|  | DMBS_BUILD_TARGETS         += atprogram atprogram-ee | ||||||
|  | DMBS_BUILD_MANDATORY_VARS  += MCU TARGET | ||||||
|  | DMBS_BUILD_OPTIONAL_VARS   += ATPROGRAM_PROGRAMMER ATPROGRAM_INTERFACE ATPROGRAM_PORT | ||||||
|  | DMBS_BUILD_PROVIDED_VARS   += | ||||||
|  | DMBS_BUILD_PROVIDED_MACROS += | ||||||
|  | 
 | ||||||
|  | # -----------------------------------------------------------------------------
 | ||||||
|  | #             DMBS ATPROGRAM Programmer Buildsystem Makefile Module.
 | ||||||
|  | # -----------------------------------------------------------------------------
 | ||||||
|  | # DESCRIPTION:
 | ||||||
|  | #   Provides a set of targets to re-program a device using the Atmel atprogram
 | ||||||
|  | #   utility in AVR Studio 5.x and Atmel Studio 6.0 onwards.
 | ||||||
|  | # -----------------------------------------------------------------------------
 | ||||||
|  | # TARGETS:
 | ||||||
|  | #
 | ||||||
|  | #    atprogram                 - Program target FLASH with application using
 | ||||||
|  | #                                atprogram
 | ||||||
|  | #    atprogram-ee              - Program target EEPROM with application data
 | ||||||
|  | #                                using atprogram
 | ||||||
|  | #
 | ||||||
|  | # MANDATORY PARAMETERS:
 | ||||||
|  | #
 | ||||||
|  | #    MCU                       - Microcontroller device model name
 | ||||||
|  | #    TARGET                    - Application name
 | ||||||
|  | #
 | ||||||
|  | # OPTIONAL PARAMETERS:
 | ||||||
|  | #
 | ||||||
|  | #    ATPROGRAM_PROGRAMMER      - Name of programming hardware to use
 | ||||||
|  | #    ATPROGRAM_INTERFACE       - Name of programming interface to use
 | ||||||
|  | #    ATPROGRAM_PORT            - Name of communication port to use
 | ||||||
|  | #
 | ||||||
|  | # PROVIDED VARIABLES:
 | ||||||
|  | #
 | ||||||
|  | #    (None)
 | ||||||
|  | #
 | ||||||
|  | # PROVIDED MACROS:
 | ||||||
|  | #
 | ||||||
|  | #    (None)
 | ||||||
|  | #
 | ||||||
|  | # -----------------------------------------------------------------------------
 | ||||||
|  | 
 | ||||||
|  | SHELL = /bin/sh | ||||||
|  | 
 | ||||||
|  | ERROR_IF_UNSET   ?= $(if $(filter undefined, $(origin $(strip $(1)))), $(error Makefile $(strip $(1)) value not set)) | ||||||
|  | ERROR_IF_EMPTY   ?= $(if $(strip $($(strip $(1)))), , $(error Makefile $(strip $(1)) option cannot be blank)) | ||||||
|  | ERROR_IF_NONBOOL ?= $(if $(filter Y N, $($(strip $(1)))), , $(error Makefile $(strip $(1)) option must be Y or N)) | ||||||
|  | 
 | ||||||
|  | # Default values of optionally user-supplied variables
 | ||||||
|  | ATPROGRAM_PROGRAMMER ?= jtagice3 | ||||||
|  | ATPROGRAM_INTERFACE  ?= jtag | ||||||
|  | ATPROGRAM_PORT       ?= | ||||||
|  | 
 | ||||||
|  | # Sanity check user supplied values
 | ||||||
|  | $(foreach MANDATORY_VAR, $(DMBS_BUILD_MANDATORY_VARS), $(call ERROR_IF_UNSET, $(MANDATORY_VAR))) | ||||||
|  | $(call ERROR_IF_EMPTY, MCU) | ||||||
|  | $(call ERROR_IF_EMPTY, TARGET) | ||||||
|  | $(call ERROR_IF_EMPTY, ATPROGRAM_PROGRAMMER) | ||||||
|  | $(call ERROR_IF_EMPTY, ATPROGRAM_INTERFACE) | ||||||
|  | 
 | ||||||
|  | # Output Messages
 | ||||||
|  | MSG_ATPROGRAM_CMD    := ' [ATPRGRM] :' | ||||||
|  | 
 | ||||||
|  | # Construct base atprogram command flags
 | ||||||
|  | BASE_ATPROGRAM_FLAGS := --tool $(ATPROGRAM_PROGRAMMER) --interface $(ATPROGRAM_INTERFACE) --device $(MCU) | ||||||
|  | ifneq ($(ATPROGRAM_PORT),) | ||||||
|  |    BASE_ATPROGRAM_FLAGS += --port $(ATPROGRAM_PORT) | ||||||
|  | endif | ||||||
|  | 
 | ||||||
|  | # Construct the flags to use for the various memory spaces
 | ||||||
|  | ifeq ($(ARCH), AVR8) | ||||||
|  |    ATPROGRAM_FLASH_FLAGS  := --chiperase --flash | ||||||
|  |    ATPROGRAM_EEPROM_FLAGS := --eeprom | ||||||
|  | else ifeq ($(ARCH), XMEGA) | ||||||
|  |    ATPROGRAM_FLASH_FLAGS  := --erase --flash | ||||||
|  |    ATPROGRAM_EEPROM_FLAGS := --eeprom | ||||||
|  | else ifeq ($(ARCH), UC3) | ||||||
|  |    ATPROGRAM_FLASH_FLAGS  := --erase | ||||||
|  |    ATPROGRAM_EEPROM_FLAGS := --eeprom | ||||||
|  | else | ||||||
|  |    $(error Unsupported architecture "$(ARCH)") | ||||||
|  | endif | ||||||
|  | 
 | ||||||
|  | # Programs in the target FLASH memory using ATPROGRAM
 | ||||||
|  | atprogram: $(TARGET).elf $(MAKEFILE_LIST) | ||||||
|  | 	@echo $(MSG_ATPROGRAM_CMD) Programming device \"$(MCU)\" FLASH using \"$(ATPROGRAM_PROGRAMMER)\" | ||||||
|  | 	atprogram $(BASE_ATPROGRAM_FLAGS) program $(ATPROGRAM_FLASH_FLAGS) --file $< | ||||||
|  | 
 | ||||||
|  | # Programs in the target EEPROM memory using ATPROGRAM
 | ||||||
|  | atprogram-ee: $(TARGET).elf $(MAKEFILE_LIST) | ||||||
|  | 	@echo $(MSG_ATPROGRAM_CMD) Programming device \"$(MCU)\" EEPROM using \"$(ATPROGRAM_PROGRAMMER)\" | ||||||
|  | 	atprogram $(BASE_ATPROGRAM_FLAGS) program $(ATPROGRAM_EEPROM_FLAGS) --file $< | ||||||
|  | 
 | ||||||
|  | # Phony build targets for this module
 | ||||||
|  | .PHONY: $(DMBS_BUILD_TARGETS) | ||||||
| @ -0,0 +1,86 @@ | |||||||
|  | #
 | ||||||
|  | #            DMBS Build System
 | ||||||
|  | #     Released into the public domain.
 | ||||||
|  | #
 | ||||||
|  | #  dean [at] fourwalledcubicle [dot] com
 | ||||||
|  | #        www.fourwalledcubicle.com
 | ||||||
|  | #
 | ||||||
|  | 
 | ||||||
|  | DMBS_BUILD_MODULES         += AVRDUDE | ||||||
|  | DMBS_BUILD_TARGETS         += avrdude avrdude-ee | ||||||
|  | DMBS_BUILD_MANDATORY_VARS  += MCU TARGET | ||||||
|  | DMBS_BUILD_OPTIONAL_VARS   += AVRDUDE_PROGRAMMER AVRDUDE_PORT AVRDUDE_FLAGS | ||||||
|  | DMBS_BUILD_PROVIDED_VARS   += | ||||||
|  | DMBS_BUILD_PROVIDED_MACROS += | ||||||
|  | 
 | ||||||
|  | # -----------------------------------------------------------------------------
 | ||||||
|  | #             DMBS AVRDUDE Programmer Buildsystem Makefile Module.
 | ||||||
|  | # -----------------------------------------------------------------------------
 | ||||||
|  | # DESCRIPTION:
 | ||||||
|  | #   Provides a set of targets to re-program a device using the open source
 | ||||||
|  | #   avr-dude utility.
 | ||||||
|  | # -----------------------------------------------------------------------------
 | ||||||
|  | # TARGETS:
 | ||||||
|  | #
 | ||||||
|  | #    avrdude                   - Program target FLASH with application using
 | ||||||
|  | #                                avrdude
 | ||||||
|  | #    avrdude-ee                - Program target EEPROM with application data
 | ||||||
|  | #                                using avrdude
 | ||||||
|  | #
 | ||||||
|  | # MANDATORY PARAMETERS:
 | ||||||
|  | #
 | ||||||
|  | #    MCU                       - Microcontroller device model name
 | ||||||
|  | #    TARGET                    - Application name
 | ||||||
|  | #
 | ||||||
|  | # OPTIONAL PARAMETERS:
 | ||||||
|  | #
 | ||||||
|  | #    AVRDUDE_PROGRAMMER        - Name of programming hardware to use
 | ||||||
|  | #    AVRDUDE_PORT              - Name of communication port to use
 | ||||||
|  | #    AVRDUDE_FLAGS             - Flags to pass to avr-dude
 | ||||||
|  | #
 | ||||||
|  | # PROVIDED VARIABLES:
 | ||||||
|  | #
 | ||||||
|  | #    (None)
 | ||||||
|  | #
 | ||||||
|  | # PROVIDED MACROS:
 | ||||||
|  | #
 | ||||||
|  | #    (None)
 | ||||||
|  | #
 | ||||||
|  | # -----------------------------------------------------------------------------
 | ||||||
|  | 
 | ||||||
|  | SHELL = /bin/sh | ||||||
|  | 
 | ||||||
|  | ERROR_IF_UNSET   ?= $(if $(filter undefined, $(origin $(strip $(1)))), $(error Makefile $(strip $(1)) value not set)) | ||||||
|  | ERROR_IF_EMPTY   ?= $(if $(strip $($(strip $(1)))), , $(error Makefile $(strip $(1)) option cannot be blank)) | ||||||
|  | ERROR_IF_NONBOOL ?= $(if $(filter Y N, $($(strip $(1)))), , $(error Makefile $(strip $(1)) option must be Y or N)) | ||||||
|  | 
 | ||||||
|  | # Default values of optionally user-supplied variables
 | ||||||
|  | AVRDUDE_PROGRAMMER ?= jtagicemkii | ||||||
|  | AVRDUDE_PORT       ?= usb | ||||||
|  | AVRDUDE_FLAGS      ?= | ||||||
|  | 
 | ||||||
|  | # Sanity check user supplied values
 | ||||||
|  | $(foreach MANDATORY_VAR, $(DMBS_BUILD_MANDATORY_VARS), $(call ERROR_IF_UNSET, $(MANDATORY_VAR))) | ||||||
|  | $(call ERROR_IF_EMPTY, MCU) | ||||||
|  | $(call ERROR_IF_EMPTY, TARGET) | ||||||
|  | $(call ERROR_IF_EMPTY, AVRDUDE_PROGRAMMER) | ||||||
|  | $(call ERROR_IF_EMPTY, AVRDUDE_PORT) | ||||||
|  | 
 | ||||||
|  | # Output Messages
 | ||||||
|  | MSG_AVRDUDE_CMD    := ' [AVRDUDE] :' | ||||||
|  | 
 | ||||||
|  | # Construct base avrdude command flags
 | ||||||
|  | BASE_AVRDUDE_FLAGS := -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER) | ||||||
|  | 
 | ||||||
|  | # Programs in the target FLASH memory using AVRDUDE
 | ||||||
|  | avrdude: $(TARGET).hex $(MAKEFILE_LIST) | ||||||
|  | 	@echo $(MSG_AVRDUDE_CMD) Programming device \"$(MCU)\" FLASH using \"$(AVRDUDE_PROGRAMMER)\" on port \"$(AVRDUDE_PORT)\" | ||||||
|  | 	avrdude $(BASE_AVRDUDE_FLAGS) -U flash:w:$< $(AVRDUDE_FLAGS) | ||||||
|  | 
 | ||||||
|  | # Programs in the target EEPROM memory using AVRDUDE
 | ||||||
|  | avrdude-ee: $(TARGET).eep $(MAKEFILE_LIST) | ||||||
|  | 	@echo $(MSG_AVRDUDE_CMD) Programming device \"$(MCU)\" EEPROM using \"$(AVRDUDE_PROGRAMMER)\" on port \"$(AVRDUDE_PORT)\" | ||||||
|  | 	avrdude $(BASE_AVRDUDE_FLAGS) -U eeprom:w:$< $(AVRDUDE_FLAGS) | ||||||
|  | 
 | ||||||
|  | # Phony build targets for this module
 | ||||||
|  | .PHONY: $(DMBS_BUILD_TARGETS) | ||||||
| @ -0,0 +1,180 @@ | |||||||
|  | #
 | ||||||
|  | #            DMBS Build System
 | ||||||
|  | #     Released into the public domain.
 | ||||||
|  | #
 | ||||||
|  | #  dean [at] fourwalledcubicle [dot] com
 | ||||||
|  | #        www.fourwalledcubicle.com
 | ||||||
|  | #
 | ||||||
|  | 
 | ||||||
|  | DMBS_BUILD_MODULES         += CORE | ||||||
|  | DMBS_BUILD_TARGETS         += help list_targets list_modules list_mandatory list_optional list_provided list_macros | ||||||
|  | DMBS_BUILD_MANDATORY_VARS  += | ||||||
|  | DMBS_BUILD_OPTIONAL_VARS   += | ||||||
|  | DMBS_BUILD_PROVIDED_VARS   += DMBS_VERSION | ||||||
|  | DMBS_BUILD_PROVIDED_MACROS += | ||||||
|  | 
 | ||||||
|  | # -----------------------------------------------------------------------------
 | ||||||
|  | #               DMBS Core Build System Makefile Module.
 | ||||||
|  | # -----------------------------------------------------------------------------
 | ||||||
|  | # DESCRIPTION:
 | ||||||
|  | #   Provides a set of core build targets for the DMBS build system
 | ||||||
|  | # -----------------------------------------------------------------------------
 | ||||||
|  | # TARGETS:
 | ||||||
|  | #
 | ||||||
|  | #    help                      - Build system help
 | ||||||
|  | #    list_targets              - List all build targets
 | ||||||
|  | #    list_modules              - List all build modules
 | ||||||
|  | #    list_mandatory            - List all mandatory make variables required by
 | ||||||
|  | #                                the included build modules of the application
 | ||||||
|  | #    list_optional             - List all optional make variables required by
 | ||||||
|  | #                                the included build modules of the application
 | ||||||
|  | #    list_provided             - List all provided make variables from the
 | ||||||
|  | #                                included build modules of the application
 | ||||||
|  | #    list_macros               - List all provided make macros from the
 | ||||||
|  | #                                included build modules of the application
 | ||||||
|  | #
 | ||||||
|  | # MANDATORY PARAMETERS:
 | ||||||
|  | #
 | ||||||
|  | #    (None)
 | ||||||
|  | #
 | ||||||
|  | # OPTIONAL PARAMETERS:
 | ||||||
|  | #
 | ||||||
|  | #    (None)
 | ||||||
|  | #
 | ||||||
|  | # PROVIDED VARIABLES:
 | ||||||
|  | #
 | ||||||
|  | #    DMBS_VERSION
 | ||||||
|  | #
 | ||||||
|  | # PROVIDED MACROS:
 | ||||||
|  | #
 | ||||||
|  | #    (None)
 | ||||||
|  | #
 | ||||||
|  | # -----------------------------------------------------------------------------
 | ||||||
|  | 
 | ||||||
|  | SHELL = /bin/sh | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | # Current DMBS release version
 | ||||||
|  | DMBS_VERSION = 0.3 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | # Converts a given input to a printable output using "(None)" if no items are in the list
 | ||||||
|  | CONVERT_TO_PRINTABLE           = $(if $(strip $(1)), $(1), (None)) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | # Build sorted and filtered lists of the included build module data
 | ||||||
|  | SORTED_DMBS_BUILD_MODULES      = $(sort $(DMBS_BUILD_MODULES)) | ||||||
|  | SORTED_DMBS_BUILD_TARGETS      = $(sort $(DMBS_BUILD_TARGETS)) | ||||||
|  | SORTED_DMBS_MANDATORY_VARS     = $(sort $(DMBS_BUILD_MANDATORY_VARS)) | ||||||
|  | SORTED_DMBS_OPTIONAL_VARS      = $(filter-out $(SORTED_DMBS_MANDATORY_VARS), $(sort $(DMBS_BUILD_OPTIONAL_VARS))) | ||||||
|  | SORTED_DMBS_PROVIDED_VARS      = $(sort $(DMBS_BUILD_PROVIDED_VARS)) | ||||||
|  | SORTED_DMBS_PROVIDED_MACROS    = $(sort $(DMBS_BUILD_PROVIDED_MACROS)) | ||||||
|  | 
 | ||||||
|  | # Create printable versions of the sorted build module data (use "(None)" when no data is available)
 | ||||||
|  | PRINTABLE_DMBS_BUILD_MODULES   = $(call CONVERT_TO_PRINTABLE, $(SORTED_DMBS_BUILD_MODULES)) | ||||||
|  | PRINTABLE_DMBS_BUILD_TARGETS   = $(call CONVERT_TO_PRINTABLE, $(SORTED_DMBS_BUILD_TARGETS)) | ||||||
|  | PRINTABLE_DMBS_MANDATORY_VARS  = $(call CONVERT_TO_PRINTABLE, $(SORTED_DMBS_MANDATORY_VARS)) | ||||||
|  | PRINTABLE_DMBS_OPTIONAL_VARS   = $(call CONVERT_TO_PRINTABLE, $(SORTED_DMBS_OPTIONAL_VARS)) | ||||||
|  | PRINTABLE_DMBS_PROVIDED_VARS   = $(call CONVERT_TO_PRINTABLE, $(SORTED_DMBS_PROVIDED_VARS)) | ||||||
|  | PRINTABLE_DMBS_PROVIDED_MACROS = $(call CONVERT_TO_PRINTABLE, $(SORTED_DMBS_PROVIDED_MACROS)) | ||||||
|  | 
 | ||||||
|  | help: | ||||||
|  | 	@echo "===================================================================" | ||||||
|  | 	@echo "                       The DMBS Build System                       " | ||||||
|  | 	@echo "         By Dean Camera { dean @ fourwalledcubicle . com }         " | ||||||
|  | 	@echo "===================================================================" | ||||||
|  | 	@echo "DESCRIPTION:                                                       " | ||||||
|  | 	@echo " This build system is a set of makefile modules for (GNU) Make, to " | ||||||
|  | 	@echo " provide a simple system for building DMBS powered applications.   " | ||||||
|  | 	@echo " Each makefile module can be included from within a user makefile, " | ||||||
|  | 	@echo " to expose the build rules documented in the comments at the top of" | ||||||
|  | 	@echo " each build module.                                                " | ||||||
|  | 	@echo "                                                                   " | ||||||
|  | 	@echo "USAGE:                                                             " | ||||||
|  | 	@echo " To execute a rule, define all variables indicated in the desired  " | ||||||
|  | 	@echo " module as a required parameter before including the build module  " | ||||||
|  | 	@echo " in your project makefile. Parameters marked as optional will      " | ||||||
|  | 	@echo " assume a default value in the modules if not user-assigned.       " | ||||||
|  | 	@echo "                                                                   " | ||||||
|  | 	@echo " By default the target output shows both a friendly summary, as    " | ||||||
|  | 	@echo " well as the actual invoked command. To suppress the output of the " | ||||||
|  | 	@echo " invoked commands and show only the friendly command output, run   " | ||||||
|  | 	@echo " make with the \"-s\" switch added before the target(s).           " | ||||||
|  | 	@echo "===================================================================" | ||||||
|  | 	@echo "                                                                   " | ||||||
|  | 	@echo "  Currently used build system modules in this application:         " | ||||||
|  | 	@echo "                                                                   " | ||||||
|  | 	@printf " %b" "$(PRINTABLE_DMBS_BUILD_MODULES:%=   - %\n)" | ||||||
|  | 	@echo "                                                                   " | ||||||
|  | 	@echo "                                                                   " | ||||||
|  | 	@echo "  Currently available build targets in this application:           " | ||||||
|  | 	@echo "                                                                   " | ||||||
|  | 	@printf " %b" "$(PRINTABLE_DMBS_BUILD_TARGETS:%=   - %\n)" | ||||||
|  | 	@echo "                                                                   " | ||||||
|  | 	@echo "                                                                   " | ||||||
|  | 	@echo "  Mandatory variables required by the selected build Modules:      " | ||||||
|  | 	@echo "                                                                   " | ||||||
|  | 	@printf " %b" "$(PRINTABLE_DMBS_MANDATORY_VARS:%=   - %\n)" | ||||||
|  | 	@echo "                                                                   " | ||||||
|  | 	@echo "                                                                   " | ||||||
|  | 	@echo "  Optional variables required by the selected build Modules:       " | ||||||
|  | 	@echo "                                                                   " | ||||||
|  | 	@printf " %b" "$(PRINTABLE_DMBS_OPTIONAL_VARS:%=   - %\n)" | ||||||
|  | 	@echo "                                                                   " | ||||||
|  | 	@echo "                                                                   " | ||||||
|  | 	@echo "  Variables provided by the selected build Modules:                " | ||||||
|  | 	@echo "                                                                   " | ||||||
|  | 	@printf " %b" "$(PRINTABLE_DMBS_PROVIDED_VARS:%=   - %\n)" | ||||||
|  | 	@echo "                                                                   " | ||||||
|  | 	@echo "                                                                   " | ||||||
|  | 	@echo "  Macros provided by the selected build Modules:                   " | ||||||
|  | 	@echo "                                                                   " | ||||||
|  | 	@printf " %b" "$(PRINTABLE_DMBS_PROVIDED_MACROS:%=   - %\n)" | ||||||
|  | 	@echo "                                                                   " | ||||||
|  | 	@echo "===================================================================" | ||||||
|  | 	@echo "          The DMBS Build System $(DMBS_VERSION) - Making MAKE easier." | ||||||
|  | 	@echo "===================================================================" | ||||||
|  | 
 | ||||||
|  | # Lists build modules included by the project makefile, in alphabetical order
 | ||||||
|  | list_modules: | ||||||
|  | 	@echo Currently Used Build System Modules: | ||||||
|  | 	@printf " %b" "$(PRINTABLE_DMBS_BUILD_MODULES:%=   - %\n)" | ||||||
|  | 
 | ||||||
|  | # Lists build targets included by the project makefile, in alphabetical order
 | ||||||
|  | list_targets: | ||||||
|  | 	@echo Currently Available Build Targets: | ||||||
|  | 	@printf " %b" "$(PRINTABLE_DMBS_BUILD_TARGETS:%=   - %\n)" | ||||||
|  | 
 | ||||||
|  | # Lists mandatory variables that must be set by the project makefile, in alphabetical order
 | ||||||
|  | list_mandatory: | ||||||
|  | 	@echo Mandatory Variables for Included Modules: | ||||||
|  | 	@printf " %b" "$(PRINTABLE_DMBS_MANDATORY_VARS:%=   - %\n)" | ||||||
|  | 
 | ||||||
|  | # Lists optional variables that must be set by the project makefile, in alphabetical order
 | ||||||
|  | list_optional: | ||||||
|  | 	@echo Optional Variables for Included Modules: | ||||||
|  | 	@printf " %b" "$(PRINTABLE_DMBS_OPTIONAL_VARS:%=   - %\n)" | ||||||
|  | 
 | ||||||
|  | # Lists variables provided by the included build modules, in alphabetical order
 | ||||||
|  | list_provided: | ||||||
|  | 	@echo Variables Provided by the Included Modules: | ||||||
|  | 	@printf " %b" "$(PRINTABLE_DMBS_PROVIDED_VARS:%=   - %\n)" | ||||||
|  | 
 | ||||||
|  | # Lists macros provided by the included build modules, in alphabetical order
 | ||||||
|  | list_macros: | ||||||
|  | 	@echo Macros Provided by the Included Modules: | ||||||
|  | 	@printf " %b" "$(PRINTABLE_DMBS_PROVIDED_MACROS:%=   - %\n)" | ||||||
|  | 
 | ||||||
|  | # Debugging; "make print-VARNAME" will output the variable VARNAME's value
 | ||||||
|  | print-%: | ||||||
|  | 	@printf "%s = %s" $(@:print-%=%) $($(@:print-%=%)) | ||||||
|  | 
 | ||||||
|  | # Disable default in-built make rules (those that are needed are explicitly
 | ||||||
|  | # defined, and doing so has performance benefits when recursively building)
 | ||||||
|  | ifeq ($(filter -r,$(MAKEFLAGS)),) | ||||||
|  |   MAKEFLAGS += -r | ||||||
|  | endif | ||||||
|  | .SUFFIXES: | ||||||
|  | 
 | ||||||
|  | # Phony build targets for this module
 | ||||||
|  | .PHONY: $(DMBS_BUILD_TARGETS) | ||||||
| @ -0,0 +1,107 @@ | |||||||
|  | #
 | ||||||
|  | #            DMBS Build System
 | ||||||
|  | #     Released into the public domain.
 | ||||||
|  | #
 | ||||||
|  | #  dean [at] fourwalledcubicle [dot] com
 | ||||||
|  | #        www.fourwalledcubicle.com
 | ||||||
|  | #
 | ||||||
|  | 
 | ||||||
|  | DMBS_BUILD_MODULES         += CPPCHECK | ||||||
|  | DMBS_BUILD_TARGETS         += cppcheck cppcheck-config | ||||||
|  | DMBS_BUILD_MANDATORY_VARS  += SRC | ||||||
|  | DMBS_BUILD_OPTIONAL_VARS   += CPPCHECK_INCLUDES CPPCHECK_EXCLUDES CPPCHECK_MSG_TEMPLATE CPPCHECK_ENABLE \
 | ||||||
|  |                               CPPCHECK_SUPPRESS CPPCHECK_FAIL_ON_WARNING CPPCHECK_QUIET CPPCHECK_FLAGS | ||||||
|  | DMBS_BUILD_PROVIDED_VARS   += | ||||||
|  | DMBS_BUILD_PROVIDED_MACROS += | ||||||
|  | 
 | ||||||
|  | # -----------------------------------------------------------------------------
 | ||||||
|  | #                DMBS CPPCheck Buildsystem Makefile Module.
 | ||||||
|  | # -----------------------------------------------------------------------------
 | ||||||
|  | # DESCRIPTION:
 | ||||||
|  | #   Provides a set of targets to scan a project with the free "cppcheck" static
 | ||||||
|  | #   analysis tool, to check for code errors at runtime
 | ||||||
|  | #   (see http://cppcheck.sourceforge.net).
 | ||||||
|  | # -----------------------------------------------------------------------------
 | ||||||
|  | # TARGETS:
 | ||||||
|  | #
 | ||||||
|  | #    cppcheck                  - Scan the project with CPPCheck
 | ||||||
|  | #    cppcheck-config           - Use CPPCheck to look for missing include files
 | ||||||
|  | #
 | ||||||
|  | # MANDATORY PARAMETERS:
 | ||||||
|  | #
 | ||||||
|  | #    SRC                       - List of source files to statically analyze
 | ||||||
|  | #
 | ||||||
|  | # OPTIONAL PARAMETERS:
 | ||||||
|  | #
 | ||||||
|  | #    CPPCHECK_INCLUDES         - Extra include paths to search for missing
 | ||||||
|  | #                                header files
 | ||||||
|  | #    CPPCHECK_EXCLUDES         - Source file paths to exclude checking (can be
 | ||||||
|  | #                                a path fragment if desired)
 | ||||||
|  | #    CPPCHECK_MSG_TEMPLATE     - Template for cppcheck error and warning output
 | ||||||
|  | #    CPPCHECK_ENABLE           - General cppcheck category checks to enable
 | ||||||
|  | #    CPPCHECK_SUPPRESS         - Specific cppcheck warnings to disable by ID
 | ||||||
|  | #    CPPCHECK_FAIL_ON_WARNING  - Set to Y to fail the build on cppcheck
 | ||||||
|  | #                                warnings, N to continue even if warnings occur
 | ||||||
|  | #    CPPCHECK_QUIET            - Enable cppcheck verbose or quiet output mode
 | ||||||
|  | #    CPPCHECK_FLAGS            - Additional flags to pass to cppcheck
 | ||||||
|  | #
 | ||||||
|  | # PROVIDED VARIABLES:
 | ||||||
|  | #
 | ||||||
|  | #    (None)
 | ||||||
|  | #
 | ||||||
|  | # PROVIDED MACROS:
 | ||||||
|  | #
 | ||||||
|  | #    (None)
 | ||||||
|  | #
 | ||||||
|  | # -----------------------------------------------------------------------------
 | ||||||
|  | 
 | ||||||
|  | SHELL = /bin/sh | ||||||
|  | 
 | ||||||
|  | ERROR_IF_UNSET   ?= $(if $(filter undefined, $(origin $(strip $(1)))), $(error Makefile $(strip $(1)) value not set)) | ||||||
|  | ERROR_IF_EMPTY   ?= $(if $(strip $($(strip $(1)))), , $(error Makefile $(strip $(1)) option cannot be blank)) | ||||||
|  | ERROR_IF_NONBOOL ?= $(if $(filter Y N, $($(strip $(1)))), , $(error Makefile $(strip $(1)) option must be Y or N)) | ||||||
|  | 
 | ||||||
|  | # Default values of optionally user-supplied variables
 | ||||||
|  | CPPCHECK_INCLUDES            ?= | ||||||
|  | CPPCHECK_EXCLUDES            ?= | ||||||
|  | CPPCHECK_MSG_TEMPLATE        ?= {file}:{line}: {severity} ({id}): {message} | ||||||
|  | CPPCHECK_ENABLE              ?= all | ||||||
|  | CPPCHECK_SUPPRESS            ?= variableScope missingInclude | ||||||
|  | CPPCHECK_FAIL_ON_WARNING     ?= Y | ||||||
|  | CPPCHECK_QUIET               ?= Y | ||||||
|  | CPPCHECK_FLAGS               ?= | ||||||
|  | 
 | ||||||
|  | # Sanity check user supplied values
 | ||||||
|  | $(foreach MANDATORY_VAR, $(DMBS_BUILD_MANDATORY_VARS), $(call ERROR_IF_UNSET, $(MANDATORY_VAR))) | ||||||
|  | $(call ERROR_IF_EMPTY, SRC) | ||||||
|  | $(call ERROR_IF_EMPTY, CPPCHECK_MSG_TEMPLATE) | ||||||
|  | $(call ERROR_IF_EMPTY, CPPCHECK_ENABLE) | ||||||
|  | $(call ERROR_IF_NONBOOL, CPPCHECK_FAIL_ON_WARNING) | ||||||
|  | $(call ERROR_IF_NONBOOL, CPPCHECK_QUIET) | ||||||
|  | 
 | ||||||
|  | # Build a default argument list for cppcheck
 | ||||||
|  | BASE_CPPCHECK_FLAGS := --template="$(CPPCHECK_MSG_TEMPLATE)" $(CPPCHECK_INCLUDES:%=-I%) $(CPPCHECK_EXCLUDES:%=-i%) --inline-suppr --force --std=c99 | ||||||
|  | 
 | ||||||
|  | # Sanity check parameters and construct additional command line arguments to cppcheck
 | ||||||
|  | ifeq ($(CPPCHECK_FAIL_ON_WARNING), Y) | ||||||
|  |    BASE_CPPCHECK_FLAGS += --error-exitcode=1 | ||||||
|  | endif | ||||||
|  | ifeq ($(CPPCHECK_QUIET), Y) | ||||||
|  |    BASE_CPPCHECK_FLAGS += --quiet | ||||||
|  | endif | ||||||
|  | 
 | ||||||
|  | # Output Messages
 | ||||||
|  | MSG_CPPCHECK_CMD         := ' [CPPCHECK]:' | ||||||
|  | 
 | ||||||
|  | # Checks the CPPCheck configuration as used in the user project, to determine if any paths are missing or invalid
 | ||||||
|  | cppcheck-config: $(MAKEFILE_LIST) | ||||||
|  | 	@echo $(MSG_CPPCHECK_CMD) Checking cppcheck configuration check on source files | ||||||
|  | 	cppcheck $(BASE_CPPCHECK_FLAGS) --check-config $(CPPCHECK_FLAGS) $(SRC) | ||||||
|  | 
 | ||||||
|  | # Runs a static analysis using CPPCheck to determine if there are any issues
 | ||||||
|  | cppcheck: $(MAKEFILE_LIST) | ||||||
|  | 	@echo $(MSG_CPPCHECK_CMD) Performing static analysis on source files | ||||||
|  | 	cppcheck $(BASE_CPPCHECK_FLAGS) --enable=$(CPPCHECK_ENABLE) $(CPPCHECK_SUPPRESS:%=--suppress=%) $(CPPCHECK_FLAGS) $(SRC) | ||||||
|  | 
 | ||||||
|  | # Phony build targets for this module
 | ||||||
|  | .PHONY: $(DMBS_BUILD_TARGETS) | ||||||
| @ -0,0 +1,95 @@ | |||||||
|  | #
 | ||||||
|  | #            DMBS Build System
 | ||||||
|  | #     Released into the public domain.
 | ||||||
|  | #
 | ||||||
|  | #  dean [at] fourwalledcubicle [dot] com
 | ||||||
|  | #        www.fourwalledcubicle.com
 | ||||||
|  | #
 | ||||||
|  | 
 | ||||||
|  | DMBS_BUILD_MODULES         += DFU | ||||||
|  | DMBS_BUILD_TARGETS         += flip flip-ee dfu dfu-ee | ||||||
|  | DMBS_BUILD_MANDATORY_VARS  += MCU TARGET | ||||||
|  | DMBS_BUILD_OPTIONAL_VARS   += | ||||||
|  | DMBS_BUILD_PROVIDED_VARS   += | ||||||
|  | DMBS_BUILD_PROVIDED_MACROS += | ||||||
|  | 
 | ||||||
|  | # -----------------------------------------------------------------------------
 | ||||||
|  | #               DMBS DFU Bootloader Buildsystem Makefile Module.
 | ||||||
|  | # -----------------------------------------------------------------------------
 | ||||||
|  | # DESCRIPTION:
 | ||||||
|  | #   Provides a set of targets to re-program a device currently running a DFU
 | ||||||
|  | #   class bootloader with a project's FLASH and EEPROM files.
 | ||||||
|  | # -----------------------------------------------------------------------------
 | ||||||
|  | # TARGETS:
 | ||||||
|  | #
 | ||||||
|  | #    flip                      - Program FLASH into target via Atmel FLIP
 | ||||||
|  | #    flip-ee                   - Program EEPROM into target via Atmel FLIP
 | ||||||
|  | #    dfu                       - Program FLASH into target via dfu-programmer
 | ||||||
|  | #    dfu-ee                    - Program EEPROM into target via dfu-programmer
 | ||||||
|  | #
 | ||||||
|  | # MANDATORY PARAMETERS:
 | ||||||
|  | #
 | ||||||
|  | #    MCU                       - Microcontroller device model name
 | ||||||
|  | #    TARGET                    - Application name
 | ||||||
|  | #
 | ||||||
|  | # OPTIONAL PARAMETERS:
 | ||||||
|  | #
 | ||||||
|  | #    (None)
 | ||||||
|  | #
 | ||||||
|  | # PROVIDED VARIABLES:
 | ||||||
|  | #
 | ||||||
|  | #    (None)
 | ||||||
|  | #
 | ||||||
|  | # PROVIDED MACROS:
 | ||||||
|  | #
 | ||||||
|  | #    (None)
 | ||||||
|  | #
 | ||||||
|  | # -----------------------------------------------------------------------------
 | ||||||
|  | 
 | ||||||
|  | SHELL = /bin/sh | ||||||
|  | 
 | ||||||
|  | ERROR_IF_UNSET   ?= $(if $(filter undefined, $(origin $(strip $(1)))), $(error Makefile $(strip $(1)) value not set)) | ||||||
|  | ERROR_IF_EMPTY   ?= $(if $(strip $($(strip $(1)))), , $(error Makefile $(strip $(1)) option cannot be blank)) | ||||||
|  | ERROR_IF_NONBOOL ?= $(if $(filter Y N, $($(strip $(1)))), , $(error Makefile $(strip $(1)) option must be Y or N)) | ||||||
|  | 
 | ||||||
|  | # Sanity-check values of mandatory user-supplied variables
 | ||||||
|  | $(foreach MANDATORY_VAR, $(DMBS_BUILD_MANDATORY_VARS), $(call ERROR_IF_UNSET, $(MANDATORY_VAR))) | ||||||
|  | $(call ERROR_IF_EMPTY, MCU) | ||||||
|  | $(call ERROR_IF_EMPTY, TARGET) | ||||||
|  | 
 | ||||||
|  | # Output Messages
 | ||||||
|  | MSG_COPY_CMD   := ' [CP]      :' | ||||||
|  | MSG_REMOVE_CMD := ' [RM]      :' | ||||||
|  | MSG_DFU_CMD    := ' [DFU]     :' | ||||||
|  | 
 | ||||||
|  | # Programs in the target FLASH memory using BATCHISP, the command line tool used by FLIP
 | ||||||
|  | flip: $(TARGET).hex $(MAKEFILE_LIST) | ||||||
|  | 	@echo $(MSG_DFU_CMD) Programming FLASH with batchisp using \"$<\" | ||||||
|  | 	batchisp -hardware usb -device $(MCU) -operation erase f loadbuffer $< program | ||||||
|  | 	batchisp -hardware usb -device $(MCU) -operation start reset 0 | ||||||
|  | 
 | ||||||
|  | # Programs in the target EEPROM memory using BATCHISP, the command line tool used by FLIP
 | ||||||
|  | flip-ee: $(TARGET).eep $(MAKEFILE_LIST) | ||||||
|  | 	@echo $(MSG_COPY_CMD) Copying EEP file to temporary file \"$<.hex\" | ||||||
|  | 	cp $< $<.hex | ||||||
|  | 	@echo $(MSG_DFU_CMD) Programming EEPROM with batchisp using \"$<.hex\" | ||||||
|  | 	batchisp -hardware usb -device $(MCU) -operation memory EEPROM loadbuffer $<.hex program | ||||||
|  | 	batchisp -hardware usb -device $(MCU) -operation start reset 0 | ||||||
|  | 	@echo $(MSG_REMOVE_CMD) Removing temporary file \"$<.hex\" | ||||||
|  | 	rm $<.hex | ||||||
|  | 
 | ||||||
|  | # Programs in the target FLASH memory using DFU-PROGRAMMER
 | ||||||
|  | dfu: $(TARGET).hex $(MAKEFILE_LIST) | ||||||
|  | 	@echo $(MSG_DFU_CMD) Programming FLASH with dfu-programmer using \"$<\" | ||||||
|  | 	dfu-programmer $(MCU) erase | ||||||
|  | 	dfu-programmer $(MCU) flash $< | ||||||
|  | 	dfu-programmer $(MCU) reset | ||||||
|  | 
 | ||||||
|  | # Programs in the target EEPROM memory using DFU-PROGRAMMER
 | ||||||
|  | dfu-ee: $(TARGET).eep $(MAKEFILE_LIST) | ||||||
|  | 	@echo $(MSG_DFU_CMD) Programming EEPROM with dfu-programmer using \"$<\" | ||||||
|  | 	dfu-programmer $(MCU) flash --eeprom $< | ||||||
|  | 	dfu-programmer $(MCU) reset | ||||||
|  | 
 | ||||||
|  | # Phony build targets for this module
 | ||||||
|  | .PHONY: $(DMBS_BUILD_TARGETS) | ||||||
| @ -0,0 +1,99 @@ | |||||||
|  | #
 | ||||||
|  | #            DMBS Build System
 | ||||||
|  | #     Released into the public domain.
 | ||||||
|  | #
 | ||||||
|  | #  dean [at] fourwalledcubicle [dot] com
 | ||||||
|  | #        www.fourwalledcubicle.com
 | ||||||
|  | #
 | ||||||
|  | 
 | ||||||
|  | DMBS_BUILD_MODULES         += DOXYGEN | ||||||
|  | DMBS_BUILD_TARGETS         += doxygen doxygen_upgrade doxygen_create | ||||||
|  | DMBS_BUILD_MANDATORY_VARS  += | ||||||
|  | DMBS_BUILD_OPTIONAL_VARS   += DOXYGEN_CONF DOXYGEN_FAIL_ON_WARNING DOXYGEN_OVERRIDE_PARAMS | ||||||
|  | DMBS_BUILD_PROVIDED_VARS   += | ||||||
|  | DMBS_BUILD_PROVIDED_MACROS += | ||||||
|  | 
 | ||||||
|  | # -----------------------------------------------------------------------------
 | ||||||
|  | #                 DMBS Doxygen Buildsystem Makefile Module.
 | ||||||
|  | # -----------------------------------------------------------------------------
 | ||||||
|  | # DESCRIPTION:
 | ||||||
|  | #   Provides a set of targets to automatically build Doxygen documentation for
 | ||||||
|  | #   a project (see www.doxygen.org).
 | ||||||
|  | # -----------------------------------------------------------------------------
 | ||||||
|  | # TARGETS:
 | ||||||
|  | #
 | ||||||
|  | #    doxygen                   - Build Doxygen Documentation
 | ||||||
|  | #    doxygen_create            - Create a new Doxygen configuration file using
 | ||||||
|  | #                                the latest template
 | ||||||
|  | #    doxygen_upgrade           - Upgrade an existing Doxygen configuration file
 | ||||||
|  | #                                to the latest template
 | ||||||
|  | #
 | ||||||
|  | # MANDATORY PARAMETERS:
 | ||||||
|  | #
 | ||||||
|  | #    (None)
 | ||||||
|  | #
 | ||||||
|  | # OPTIONAL PARAMETERS:
 | ||||||
|  | #
 | ||||||
|  | #    DOXYGEN_CONF              - Doxygen configuration filename
 | ||||||
|  | #    DOXYGEN_FAIL_ON_WARNING   - Set to Y to fail the build on Doxygen warnings,
 | ||||||
|  | #                                N to continue even if warnings occur
 | ||||||
|  | #    DOXYGEN_OVERRIDE_PARAMS   - Parameters to override in the doxygen
 | ||||||
|  | #                                configuration file
 | ||||||
|  | # PROVIDED VARIABLES:
 | ||||||
|  | #
 | ||||||
|  | #    (None)
 | ||||||
|  | #
 | ||||||
|  | # PROVIDED MACROS:
 | ||||||
|  | #
 | ||||||
|  | #    (None)
 | ||||||
|  | #
 | ||||||
|  | # -----------------------------------------------------------------------------
 | ||||||
|  | 
 | ||||||
|  | SHELL = /bin/sh | ||||||
|  | 
 | ||||||
|  | ERROR_IF_UNSET   ?= $(if $(filter undefined, $(origin $(strip $(1)))), $(error Makefile $(strip $(1)) value not set)) | ||||||
|  | ERROR_IF_EMPTY   ?= $(if $(strip $($(strip $(1)))), , $(error Makefile $(strip $(1)) option cannot be blank)) | ||||||
|  | ERROR_IF_NONBOOL ?= $(if $(filter Y N, $($(strip $(1)))), , $(error Makefile $(strip $(1)) option must be Y or N)) | ||||||
|  | 
 | ||||||
|  | # Default values of optionally user-supplied variables
 | ||||||
|  | DOXYGEN_CONF            ?= doxyfile | ||||||
|  | DOXYGEN_FAIL_ON_WARNING ?= Y | ||||||
|  | DOXYGEN_OVERRIDE_PARAMS ?= QUIET=YES | ||||||
|  | 
 | ||||||
|  | # Sanity check user supplied values
 | ||||||
|  | $(foreach MANDATORY_VAR, $(DMBS_BUILD_MANDATORY_VARS), $(call ERROR_IF_UNSET, $(MANDATORY_VAR))) | ||||||
|  | $(call ERROR_IF_EMPTY, DOXYGEN_CONF) | ||||||
|  | $(call ERROR_IF_NONBOOL, DOXYGEN_FAIL_ON_WARNING) | ||||||
|  | 
 | ||||||
|  | # Output Messages
 | ||||||
|  | MSG_DOXYGEN_CMD         := ' [DOXYGEN] :' | ||||||
|  | 
 | ||||||
|  | # Determine Doxygen invocation command
 | ||||||
|  | BASE_DOXYGEN_CMD := ( cat $(DOXYGEN_CONF) $(DOXYGEN_OVERRIDE_PARAMS:%=; echo "%") ) | doxygen - | ||||||
|  | ifeq ($(DOXYGEN_FAIL_ON_WARNING), Y) | ||||||
|  |    DOXYGEN_CMD := if ( $(BASE_DOXYGEN_CMD) 2>&1 | grep -v "warning: ignoring unsupported tag" ;); then exit 1; fi; | ||||||
|  | else | ||||||
|  |    DOXYGEN_CMD := $(BASE_DOXYGEN_CMD) | ||||||
|  | endif | ||||||
|  | 
 | ||||||
|  | # Error if the specified Doxygen configuration file does not exist
 | ||||||
|  | $(DOXYGEN_CONF): | ||||||
|  | 	$(error Doxygen configuration file $@ does not exist) | ||||||
|  | 
 | ||||||
|  | # Builds the project documentation using the specified configuration file and the DOXYGEN tool
 | ||||||
|  | doxygen: $(DOXYGEN_CONF) $(MAKEFILE_LIST) | ||||||
|  | 	@echo $(MSG_DOXYGEN_CMD) Configuration file \"$(DOXYGEN_CONF)\" with parameters \"$(DOXYGEN_OVERRIDE_PARAMS)\" | ||||||
|  | 	$(DOXYGEN_CMD) | ||||||
|  | 
 | ||||||
|  | # Upgrades an existing Doxygen configuration file to the latest Doxygen template, preserving settings
 | ||||||
|  | doxygen_upgrade: $(DOXYGEN_CONF) $(MAKEFILE_LIST) | ||||||
|  | 	@echo $(MSG_DOXYGEN_CMD) Upgrading configuration file \"$(DOXYGEN_CONF)\" with latest template | ||||||
|  | 	doxygen -u $(DOXYGEN_CONF) > /dev/null | ||||||
|  | 
 | ||||||
|  | # Creates a new Doxygen configuration file with the set file name
 | ||||||
|  | doxygen_create: $(MAKEFILE_LIST) | ||||||
|  | 	@echo $(MSG_DOXYGEN_CMD) Creating new configuration file \"$(DOXYGEN_CONF)\" with latest template | ||||||
|  | 	doxygen -g $(DOXYGEN_CONF) > /dev/null | ||||||
|  | 
 | ||||||
|  | # Phony build targets for this module
 | ||||||
|  | .PHONY: $(DMBS_BUILD_TARGETS) | ||||||
| @ -0,0 +1,331 @@ | |||||||
|  | #
 | ||||||
|  | #            DMBS Build System
 | ||||||
|  | #     Released into the public domain.
 | ||||||
|  | #
 | ||||||
|  | #  dean [at] fourwalledcubicle [dot] com
 | ||||||
|  | #        www.fourwalledcubicle.com
 | ||||||
|  | #
 | ||||||
|  | 
 | ||||||
|  | DMBS_BUILD_MODULES         += GCC | ||||||
|  | DMBS_BUILD_TARGETS         += size symbol-sizes all lib elf bin hex lss clean mostlyclean | ||||||
|  | DMBS_BUILD_MANDATORY_VARS  += TARGET ARCH MCU SRC | ||||||
|  | DMBS_BUILD_OPTIONAL_VARS   += BOARD OPTIMIZATION C_STANDARD CPP_STANDARD F_CPU C_FLAGS CPP_FLAGS ASM_FLAGS CC_FLAGS LD_FLAGS OBJDIR OBJECT_FILES DEBUG_TYPE DEBUG_LEVEL LINKER_RELAXATIONS COMPILER_PATH | ||||||
|  | DMBS_BUILD_PROVIDED_VARS   += | ||||||
|  | DMBS_BUILD_PROVIDED_MACROS += | ||||||
|  | 
 | ||||||
|  | # -----------------------------------------------------------------------------
 | ||||||
|  | #               DMBS GCC Compiler Buildsystem Makefile Module.
 | ||||||
|  | # -----------------------------------------------------------------------------
 | ||||||
|  | # DESCRIPTION:
 | ||||||
|  | #   Provides a set of targets to build a C, C++ and/or Assembly application
 | ||||||
|  | #   via the AVR-GCC compiler.
 | ||||||
|  | # -----------------------------------------------------------------------------
 | ||||||
|  | # TARGETS:
 | ||||||
|  | #
 | ||||||
|  | #    size                      - List built application size
 | ||||||
|  | #    symbol-sizes              - Print application symbols from the binary ELF
 | ||||||
|  | #                                file as a list sorted by size in bytes
 | ||||||
|  | #    all                       - Build application and list size
 | ||||||
|  | #    lib                       - Build and archive source files into a library
 | ||||||
|  | #    elf                       - Build application ELF debug object file
 | ||||||
|  | #    bin                       - Build application BIN binary object file
 | ||||||
|  | #    hex                       - Build application HEX object file
 | ||||||
|  | #    lss                       - Build application LSS assembly listing file
 | ||||||
|  | #    clean                     - Remove all project intermediary and binary
 | ||||||
|  | #                                output files
 | ||||||
|  | #    mostlyclean               - Remove intermediary output files, but
 | ||||||
|  | #                                preserve binaries
 | ||||||
|  | #    <filename>.s              - Compile C/C++ source file into an assembly file
 | ||||||
|  | #                                for manual code inspection
 | ||||||
|  | #
 | ||||||
|  | # MANDATORY PARAMETERS:
 | ||||||
|  | #
 | ||||||
|  | #    TARGET                    - Application name
 | ||||||
|  | #    ARCH                      - Device architecture name
 | ||||||
|  | #    MCU                       - Microcontroller device model name
 | ||||||
|  | #    SRC                       - List of input source files (*.c, *.cpp, *.S)
 | ||||||
|  | #
 | ||||||
|  | # OPTIONAL PARAMETERS:
 | ||||||
|  | #
 | ||||||
|  | #    OPTIMIZATION              - Optimization level
 | ||||||
|  | #    C_STANDARD                - C Language Standard to use
 | ||||||
|  | #    CPP_STANDARD              - C++ Language Standard to use
 | ||||||
|  | #    F_CPU                     - Speed of the CPU, in Hz
 | ||||||
|  | #    C_FLAGS                   - Flags to pass to the C compiler only
 | ||||||
|  | #    CPP_FLAGS                 - Flags to pass to the C++ compiler only
 | ||||||
|  | #    ASM_FLAGS                 - Flags to pass to the assembler only
 | ||||||
|  | #    CC_FLAGS                  - Common flags to pass to the C/C++ compiler and
 | ||||||
|  | #                                assembler
 | ||||||
|  | #    LD_FLAGS                  - Flags to pass to the linker
 | ||||||
|  | #    LINKER_RELAXATIONS        - Enable or disable linker relaxations to
 | ||||||
|  | #                                decrease binary size (note: can cause link
 | ||||||
|  | #                                failures on systems with an unpatched binutils)
 | ||||||
|  | #    OBJDIR                    - Directory for the output object and dependency
 | ||||||
|  | #                                files; if equal to ".", the output files will
 | ||||||
|  | #                                be generated in the same folder as the sources
 | ||||||
|  | #    OBJECT_FILES              - Extra object files to link in to the binaries
 | ||||||
|  | #    DEBUG_FORMAT              - Format of the debugging information to
 | ||||||
|  | #                                generate in the compiled object files
 | ||||||
|  | #    DEBUG_LEVEL               - Level the debugging information to generate in
 | ||||||
|  | #                                the compiled object files
 | ||||||
|  | #    COMPILER_PATH             - Location of the GCC toolchain to use
 | ||||||
|  | #
 | ||||||
|  | # PROVIDED VARIABLES:
 | ||||||
|  | #
 | ||||||
|  | #    (None)
 | ||||||
|  | #
 | ||||||
|  | # PROVIDED MACROS:
 | ||||||
|  | #
 | ||||||
|  | #    (None)
 | ||||||
|  | #
 | ||||||
|  | # -----------------------------------------------------------------------------
 | ||||||
|  | 
 | ||||||
|  | SHELL = /bin/sh | ||||||
|  | 
 | ||||||
|  | ERROR_IF_UNSET   ?= $(if $(filter undefined, $(origin $(strip $(1)))), $(error Makefile $(strip $(1)) value not set)) | ||||||
|  | ERROR_IF_EMPTY   ?= $(if $(strip $($(strip $(1)))), , $(error Makefile $(strip $(1)) option cannot be blank)) | ||||||
|  | ERROR_IF_NONBOOL ?= $(if $(filter Y N, $($(strip $(1)))), , $(error Makefile $(strip $(1)) option must be Y or N)) | ||||||
|  | 
 | ||||||
|  | # Default values of optionally user-supplied variables
 | ||||||
|  | COMPILER_PATH      ?= | ||||||
|  | OPTIMIZATION       ?= s | ||||||
|  | F_CPU              ?= | ||||||
|  | C_STANDARD         ?= gnu99 | ||||||
|  | CPP_STANDARD       ?= gnu++98 | ||||||
|  | C_FLAGS            ?= | ||||||
|  | CPP_FLAGS          ?= | ||||||
|  | ASM_FLAGS          ?= | ||||||
|  | CC_FLAGS           ?= | ||||||
|  | OBJDIR             ?= obj | ||||||
|  | OBJECT_FILES       ?= | ||||||
|  | DEBUG_FORMAT       ?= dwarf-2 | ||||||
|  | DEBUG_LEVEL        ?= 2 | ||||||
|  | LINKER_RELAXATIONS ?= Y | ||||||
|  | 
 | ||||||
|  | # Sanity check user supplied values
 | ||||||
|  | $(foreach MANDATORY_VAR, $(DMBS_BUILD_MANDATORY_VARS), $(call ERROR_IF_UNSET, $(MANDATORY_VAR))) | ||||||
|  | $(call ERROR_IF_EMPTY, MCU) | ||||||
|  | $(call ERROR_IF_EMPTY, TARGET) | ||||||
|  | $(call ERROR_IF_EMPTY, ARCH) | ||||||
|  | $(call ERROR_IF_EMPTY, OPTIMIZATION) | ||||||
|  | $(call ERROR_IF_EMPTY, C_STANDARD) | ||||||
|  | $(call ERROR_IF_EMPTY, CPP_STANDARD) | ||||||
|  | $(call ERROR_IF_EMPTY, OBJDIR) | ||||||
|  | $(call ERROR_IF_EMPTY, DEBUG_FORMAT) | ||||||
|  | $(call ERROR_IF_EMPTY, DEBUG_LEVEL) | ||||||
|  | $(call ERROR_IF_NONBOOL, LINKER_RELAXATIONS) | ||||||
|  | 
 | ||||||
|  | # Determine the utility prefix to use for the selected architecture
 | ||||||
|  | ifeq ($(ARCH), AVR8) | ||||||
|  |    CROSS        := $(COMPILER_PATH)avr | ||||||
|  | else ifeq ($(ARCH), XMEGA) | ||||||
|  |    CROSS        := $(COMPILER_PATH)avr | ||||||
|  | else ifeq ($(ARCH), UC3) | ||||||
|  |    CROSS        := $(COMPILER_PATH)avr32 | ||||||
|  | else | ||||||
|  |    $(error Unsupported architecture "$(ARCH)") | ||||||
|  | endif | ||||||
|  | 
 | ||||||
|  | # Output Messages
 | ||||||
|  | MSG_INFO_MESSAGE := ' [INFO]    :' | ||||||
|  | MSG_COMPILE_CMD  := ' [GCC]     :' | ||||||
|  | MSG_ASSEMBLE_CMD := ' [GAS]     :' | ||||||
|  | MSG_NM_CMD       := ' [NM]      :' | ||||||
|  | MSG_REMOVE_CMD   := ' [RM]      :' | ||||||
|  | MSG_LINK_CMD     := ' [LNK]     :' | ||||||
|  | MSG_ARCHIVE_CMD  := ' [AR]      :' | ||||||
|  | MSG_SIZE_CMD     := ' [SIZE]    :' | ||||||
|  | MSG_OBJCPY_CMD   := ' [OBJCPY]  :' | ||||||
|  | MSG_OBJDMP_CMD   := ' [OBJDMP]  :' | ||||||
|  | 
 | ||||||
|  | # Convert input source file list to differentiate them by type
 | ||||||
|  | C_SOURCE   := $(filter %.c, $(SRC)) | ||||||
|  | CPP_SOURCE := $(filter %.cpp, $(SRC)) | ||||||
|  | ASM_SOURCE := $(filter %.S, $(SRC)) | ||||||
|  | 
 | ||||||
|  | # Create a list of unknown source file types, if any are found throw an error
 | ||||||
|  | UNKNOWN_SOURCE := $(filter-out $(C_SOURCE) $(CPP_SOURCE) $(ASM_SOURCE), $(SRC)) | ||||||
|  | ifneq ($(UNKNOWN_SOURCE),) | ||||||
|  |    $(error Unknown input source file formats: $(UNKNOWN_SOURCE)) | ||||||
|  | endif | ||||||
|  | 
 | ||||||
|  | # Convert input source filenames into a list of required output object files
 | ||||||
|  | OBJECT_FILES += $(addsuffix .o, $(basename $(SRC))) | ||||||
|  | 
 | ||||||
|  | # Check if an output object file directory was specified instead of the input file location
 | ||||||
|  | ifneq ($(OBJDIR),.) | ||||||
|  |    # Prefix all the object filenames with the output object file directory path | ||||||
|  |    OBJECT_FILES    := $(addprefix $(patsubst %/,%,$(OBJDIR))/, $(notdir $(OBJECT_FILES))) | ||||||
|  | 
 | ||||||
|  |    # Check if any object file (without path) appears more than once in the object file list | ||||||
|  |    ifneq ($(words $(sort $(OBJECT_FILES))), $(words $(OBJECT_FILES))) | ||||||
|  |        $(error Cannot build with OBJDIR parameter set - one or more object file name is not unique) | ||||||
|  |    endif | ||||||
|  | 
 | ||||||
|  |    # Create the output object file directory if it does not exist and add it to the virtual path list | ||||||
|  |    $(shell mkdir $(OBJDIR) 2> /dev/null) | ||||||
|  |    VPATH           += $(dir $(SRC)) | ||||||
|  | endif | ||||||
|  | 
 | ||||||
|  | # Create a list of dependency files from the list of object files
 | ||||||
|  | DEPENDENCY_FILES := $(OBJECT_FILES:%.o=%.d) | ||||||
|  | 
 | ||||||
|  | # Create a list of common flags to pass to the compiler/linker/assembler
 | ||||||
|  | BASE_CC_FLAGS    := -pipe -g$(DEBUG_FORMAT) -g$(DEBUG_LEVEL) | ||||||
|  | ifneq ($(findstring $(ARCH), AVR8 XMEGA),) | ||||||
|  |    BASE_CC_FLAGS += -mmcu=$(MCU) -fshort-enums -fno-inline-small-functions -fpack-struct | ||||||
|  | else ifneq ($(findstring $(ARCH), UC3),) | ||||||
|  |    BASE_CC_FLAGS += -mpart=$(MCU:at32%=%) -masm-addr-pseudos | ||||||
|  | endif | ||||||
|  | BASE_CC_FLAGS += -Wall -fno-strict-aliasing -funsigned-char -funsigned-bitfields -ffunction-sections | ||||||
|  | BASE_CC_FLAGS += -I. | ||||||
|  | BASE_CC_FLAGS += -DARCH=ARCH_$(ARCH) | ||||||
|  | ifneq ($(F_CPU),) | ||||||
|  |    BASE_CC_FLAGS += -DF_CPU=$(F_CPU)UL | ||||||
|  | endif | ||||||
|  | ifeq ($(LINKER_RELAXATIONS), Y) | ||||||
|  | BASE_CC_FLAGS += -mrelax | ||||||
|  | endif | ||||||
|  | 
 | ||||||
|  | # Additional language specific compiler flags
 | ||||||
|  | BASE_C_FLAGS   := -x c -O$(OPTIMIZATION) -std=$(C_STANDARD) -Wstrict-prototypes | ||||||
|  | BASE_CPP_FLAGS := -x c++ -O$(OPTIMIZATION) -std=$(CPP_STANDARD) | ||||||
|  | BASE_ASM_FLAGS := -x assembler-with-cpp | ||||||
|  | 
 | ||||||
|  | # Create a list of flags to pass to the linker
 | ||||||
|  | BASE_LD_FLAGS := -lm -Wl,-Map=$(TARGET).map,--cref -Wl,--gc-sections | ||||||
|  | ifeq ($(LINKER_RELAXATIONS), Y) | ||||||
|  |    BASE_LD_FLAGS += -Wl,--relax | ||||||
|  | endif | ||||||
|  | ifneq ($(findstring $(ARCH), AVR8 XMEGA),) | ||||||
|  |    BASE_LD_FLAGS += -mmcu=$(MCU) | ||||||
|  | else ifneq ($(findstring $(ARCH), UC3),) | ||||||
|  |    BASE_LD_FLAGS += -mpart=$(MCU:at32%=%) --rodata-writable --direct-data | ||||||
|  | endif | ||||||
|  | 
 | ||||||
|  | # Determine flags to pass to the size utility based on its reported features (only invoke if size target required)
 | ||||||
|  | # and on an architecture where this non-standard patch is available
 | ||||||
|  | ifneq ($(ARCH), UC3) | ||||||
|  | size: SIZE_MCU_FLAG    := $(shell $(CROSS)-size --help | grep -- --mcu > /dev/null && echo --mcu=$(MCU) ) | ||||||
|  | size: SIZE_FORMAT_FLAG := $(shell $(CROSS)-size --help | grep -- --format=.*avr > /dev/null && echo --format=avr ) | ||||||
|  | endif | ||||||
|  | 
 | ||||||
|  | # Pre-build informational target, to give compiler and project name information when building
 | ||||||
|  | build_begin: | ||||||
|  | 	@echo $(MSG_INFO_MESSAGE) Begin compilation of project \"$(TARGET)\"... | ||||||
|  | 	@echo "" | ||||||
|  | 	@$(CROSS)-gcc --version | ||||||
|  | 
 | ||||||
|  | # Post-build informational target, to project name information when building has completed
 | ||||||
|  | build_end: | ||||||
|  | 	@echo $(MSG_INFO_MESSAGE) Finished building project \"$(TARGET)\". | ||||||
|  | 
 | ||||||
|  | # Prints size information of a compiled application (FLASH, RAM and EEPROM usages)
 | ||||||
|  | size: $(TARGET).elf | ||||||
|  | 	@echo $(MSG_SIZE_CMD) Determining size of \"$<\" | ||||||
|  | 	@echo "" | ||||||
|  | 	$(CROSS)-size $(SIZE_MCU_FLAG) $(SIZE_FORMAT_FLAG) $< | ||||||
|  | 
 | ||||||
|  | # Prints size information on the symbols within a compiled application in decimal bytes
 | ||||||
|  | symbol-sizes: $(TARGET).elf | ||||||
|  | 	@echo $(MSG_NM_CMD) Extracting \"$<\" symbols with decimal byte sizes | ||||||
|  | 	$(CROSS)-nm --size-sort --demangle --radix=d $< | ||||||
|  | 
 | ||||||
|  | # Cleans intermediary build files, leaving only the compiled application files
 | ||||||
|  | mostlyclean: | ||||||
|  | 	@echo $(MSG_REMOVE_CMD) Removing object files of \"$(TARGET)\" | ||||||
|  | 	rm -f $(OBJECT_FILES) | ||||||
|  | 	@echo $(MSG_REMOVE_CMD) Removing dependency files of \"$(TARGET)\" | ||||||
|  | 	rm -f $(DEPENDENCY_FILES) | ||||||
|  | 
 | ||||||
|  | # Cleans all build files, leaving only the original source code
 | ||||||
|  | clean: mostlyclean | ||||||
|  | 	@echo $(MSG_REMOVE_CMD) Removing output files of \"$(TARGET)\" | ||||||
|  | 	rm -f $(TARGET).elf $(TARGET).hex $(TARGET).bin $(TARGET).eep $(TARGET).map $(TARGET).lss $(TARGET).sym lib$(TARGET).a | ||||||
|  | 
 | ||||||
|  | # Performs a complete build of the user application and prints size information afterwards
 | ||||||
|  | all: build_begin elf hex bin lss sym size build_end | ||||||
|  | 
 | ||||||
|  | # Helper targets, to build a specific type of output file without having to know the project target name
 | ||||||
|  | lib: lib$(TARGET).a | ||||||
|  | elf: $(TARGET).elf | ||||||
|  | hex: $(TARGET).hex $(TARGET).eep | ||||||
|  | bin: $(TARGET).bin | ||||||
|  | lss: $(TARGET).lss | ||||||
|  | sym: $(TARGET).sym | ||||||
|  | 
 | ||||||
|  | # Default target to *create* the user application's specified source files; if this rule is executed by
 | ||||||
|  | # make, the input source file doesn't exist and an error needs to be presented to the user
 | ||||||
|  | $(SRC): | ||||||
|  | 	$(error Source file does not exist: $@) | ||||||
|  | 
 | ||||||
|  | # Compiles an input C source file and generates an assembly listing for it
 | ||||||
|  | %.s: %.c $(MAKEFILE_LIST) | ||||||
|  | 	@echo $(MSG_COMPILE_CMD) Generating assembly from C file \"$(notdir $<)\" | ||||||
|  | 	$(CROSS)-gcc -S $(BASE_CC_FLAGS) $(BASE_C_FLAGS) $(CC_FLAGS) $(C_FLAGS) $< -o $@ | ||||||
|  | 
 | ||||||
|  | # Compiles an input C++ source file and generates an assembly listing for it
 | ||||||
|  | %.s: %.cpp $(MAKEFILE_LIST) | ||||||
|  | 	@echo $(MSG_COMPILE_CMD) Generating assembly from C++ file \"$(notdir $<)\" | ||||||
|  | 	$(CROSS)-gcc -S $(BASE_CC_FLAGS) $(BASE_CPP_FLAGS) $(CC_FLAGS) $(CPP_FLAGS) $< -o $@ | ||||||
|  | 
 | ||||||
|  | # Compiles an input C source file and generates a linkable object file for it
 | ||||||
|  | $(OBJDIR)/%.o: %.c $(MAKEFILE_LIST) | ||||||
|  | 	@echo $(MSG_COMPILE_CMD) Compiling C file \"$(notdir $<)\" | ||||||
|  | 	$(CROSS)-gcc -c $(BASE_CC_FLAGS) $(BASE_C_FLAGS) $(CC_FLAGS) $(C_FLAGS) -MMD -MP -MF $(@:%.o=%.d) $< -o $@ | ||||||
|  | 
 | ||||||
|  | # Compiles an input C++ source file and generates a linkable object file for it
 | ||||||
|  | $(OBJDIR)/%.o: %.cpp $(MAKEFILE_LIST) | ||||||
|  | 	@echo $(MSG_COMPILE_CMD) Compiling C++ file \"$(notdir $<)\" | ||||||
|  | 	$(CROSS)-gcc -c $(BASE_CC_FLAGS) $(BASE_CPP_FLAGS) $(CC_FLAGS) $(CPP_FLAGS) -MMD -MP -MF $(@:%.o=%.d) $< -o $@ | ||||||
|  | 
 | ||||||
|  | # Assembles an input ASM source file and generates a linkable object file for it
 | ||||||
|  | $(OBJDIR)/%.o: %.S $(MAKEFILE_LIST) | ||||||
|  | 	@echo $(MSG_ASSEMBLE_CMD) Assembling \"$(notdir $<)\" | ||||||
|  | 	$(CROSS)-gcc -c $(BASE_CC_FLAGS) $(BASE_ASM_FLAGS) $(CC_FLAGS) $(ASM_FLAGS) -MMD -MP -MF $(@:%.o=%.d) $< -o $@ | ||||||
|  | 
 | ||||||
|  | # Generates a library archive file from the user application, which can be linked into other applications
 | ||||||
|  | .PRECIOUS  : $(OBJECT_FILES) | ||||||
|  | .SECONDARY : %.a | ||||||
|  | %.a: $(OBJECT_FILES) | ||||||
|  | 	@echo $(MSG_ARCHIVE_CMD) Archiving object files into \"$@\" | ||||||
|  | 	$(CROSS)-ar rcs $@ $(OBJECT_FILES) | ||||||
|  | 
 | ||||||
|  | # Generates an ELF debug file from the user application, which can be further processed for FLASH and EEPROM data
 | ||||||
|  | # files, or used for programming and debugging directly
 | ||||||
|  | .PRECIOUS  : $(OBJECT_FILES) | ||||||
|  | .SECONDARY : %.elf | ||||||
|  | %.elf: $(OBJECT_FILES) | ||||||
|  | 	@echo $(MSG_LINK_CMD) Linking object files into \"$@\" | ||||||
|  | 	$(CROSS)-gcc $^ -o $@ $(BASE_LD_FLAGS) $(LD_FLAGS) | ||||||
|  | 
 | ||||||
|  | # Extracts out the loadable FLASH memory data from the project ELF file, and creates an Intel HEX format file of it
 | ||||||
|  | %.hex: %.elf | ||||||
|  | 	@echo $(MSG_OBJCPY_CMD) Extracting HEX file data from \"$<\" | ||||||
|  | 	$(CROSS)-objcopy -O ihex -R .eeprom -R .fuse -R .lock -R .signature $< $@ | ||||||
|  | 
 | ||||||
|  | # Extracts out the loadable FLASH memory data from the project ELF file, and creates an Binary format file of it
 | ||||||
|  | %.bin: %.elf | ||||||
|  | 	@echo $(MSG_OBJCPY_CMD) Extracting BIN file data from \"$<\" | ||||||
|  | 	$(CROSS)-objcopy -O binary -R .eeprom -R .fuse -R .lock -R .signature $< $@ | ||||||
|  | 
 | ||||||
|  | # Extracts out the loadable EEPROM memory data from the project ELF file, and creates an Intel HEX format file of it
 | ||||||
|  | %.eep: %.elf | ||||||
|  | 	@echo $(MSG_OBJCPY_CMD) Extracting EEP file data from \"$<\" | ||||||
|  | 	$(CROSS)-objcopy -O ihex -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 --no-change-warnings $< $@ || exit 0 | ||||||
|  | 
 | ||||||
|  | # Creates an assembly listing file from an input project ELF file, containing interleaved assembly and source data
 | ||||||
|  | %.lss: %.elf | ||||||
|  | 	@echo $(MSG_OBJDMP_CMD) Extracting LSS file data from \"$<\" | ||||||
|  | 	$(CROSS)-objdump -h -d -S -z $< > $@ | ||||||
|  | 
 | ||||||
|  | # Creates a symbol file listing the loadable and discarded symbols from an input project ELF file
 | ||||||
|  | %.sym: %.elf | ||||||
|  | 	@echo $(MSG_NM_CMD) Extracting SYM file data from \"$<\" | ||||||
|  | 	$(CROSS)-nm -n $< > $@ | ||||||
|  | 
 | ||||||
|  | # Include build dependency files
 | ||||||
|  | -include $(DEPENDENCY_FILES) | ||||||
|  | 
 | ||||||
|  | # Phony build targets for this module
 | ||||||
|  | .PHONY: build_begin build_end $(DMBS_BUILD_TARGETS) | ||||||
| @ -0,0 +1,96 @@ | |||||||
|  | #
 | ||||||
|  | #            DMBS Build System
 | ||||||
|  | #     Released into the public domain.
 | ||||||
|  | #
 | ||||||
|  | #  dean [at] fourwalledcubicle [dot] com
 | ||||||
|  | #        www.fourwalledcubicle.com
 | ||||||
|  | #
 | ||||||
|  | 
 | ||||||
|  | DMBS_BUILD_MODULES         += HID | ||||||
|  | DMBS_BUILD_TARGETS         += hid hid-ee teensy teensy-ee | ||||||
|  | DMBS_BUILD_MANDATORY_VARS  += MCU TARGET | ||||||
|  | DMBS_BUILD_OPTIONAL_VARS   += | ||||||
|  | DMBS_BUILD_PROVIDED_VARS   += | ||||||
|  | DMBS_BUILD_PROVIDED_MACROS += | ||||||
|  | 
 | ||||||
|  | # -----------------------------------------------------------------------------
 | ||||||
|  | #               DMBS HID Bootloader Buildsystem Makefile Module.
 | ||||||
|  | # -----------------------------------------------------------------------------
 | ||||||
|  | # DESCRIPTION:
 | ||||||
|  | #   Provides a set of targets to re-program a device currently running a HID
 | ||||||
|  | #   class bootloader with a project's FLASH files.
 | ||||||
|  | # -----------------------------------------------------------------------------
 | ||||||
|  | # TARGETS:
 | ||||||
|  | #
 | ||||||
|  | #    hid                       - Program FLASH into target via
 | ||||||
|  | #                                hid_bootloader_cli
 | ||||||
|  | #    hid-ee                    - Program EEPROM into target via a temporary
 | ||||||
|  | #                                AVR application and hid_bootloader_cli
 | ||||||
|  | #    teensy                    - Program FLASH into target via
 | ||||||
|  | #                                teensy_loader_cli
 | ||||||
|  | #    teensy-ee                 - Program EEPROM into target via a temporary
 | ||||||
|  | #                                AVR application and teensy_loader_cli
 | ||||||
|  | #
 | ||||||
|  | # MANDATORY PARAMETERS:
 | ||||||
|  | #
 | ||||||
|  | #    MCU                       - Microcontroller device model name
 | ||||||
|  | #    TARGET                    - Application name
 | ||||||
|  | #
 | ||||||
|  | # OPTIONAL PARAMETERS:
 | ||||||
|  | #
 | ||||||
|  | #    (None)
 | ||||||
|  | #
 | ||||||
|  | # PROVIDED VARIABLES:
 | ||||||
|  | #
 | ||||||
|  | #    (None)
 | ||||||
|  | #
 | ||||||
|  | # PROVIDED MACROS:
 | ||||||
|  | #
 | ||||||
|  | #    (None)
 | ||||||
|  | #
 | ||||||
|  | # -----------------------------------------------------------------------------
 | ||||||
|  | 
 | ||||||
|  | SHELL = /bin/sh | ||||||
|  | 
 | ||||||
|  | DMBS_MODULE_PATH := $(patsubst %/,%,$(dir $(lastword $(MAKEFILE_LIST)))) | ||||||
|  | 
 | ||||||
|  | ERROR_IF_UNSET   ?= $(if $(filter undefined, $(origin $(strip $(1)))), $(error Makefile $(strip $(1)) value not set)) | ||||||
|  | ERROR_IF_EMPTY   ?= $(if $(strip $($(strip $(1)))), , $(error Makefile $(strip $(1)) option cannot be blank)) | ||||||
|  | ERROR_IF_NONBOOL ?= $(if $(filter Y N, $($(strip $(1)))), , $(error Makefile $(strip $(1)) option must be Y or N)) | ||||||
|  | 
 | ||||||
|  | # Sanity-check values of mandatory user-supplied variables
 | ||||||
|  | $(foreach MANDATORY_VAR, $(DMBS_BUILD_MANDATORY_VARS), $(call ERROR_IF_UNSET, $(MANDATORY_VAR))) | ||||||
|  | $(call ERROR_IF_EMPTY, MCU) | ||||||
|  | $(call ERROR_IF_EMPTY, TARGET) | ||||||
|  | 
 | ||||||
|  | # Output Messages
 | ||||||
|  | MSG_HID_BOOTLOADER_CMD := ' [HID]     :' | ||||||
|  | MSG_OBJCPY_CMD         := ' [OBJCPY]  :' | ||||||
|  | MSG_MAKE_CMD           := ' [MAKE]    :' | ||||||
|  | 
 | ||||||
|  | # Programs in the target FLASH memory using the HID_BOOTLOADER_CLI tool
 | ||||||
|  | hid: $(TARGET).hex $(MAKEFILE_LIST) | ||||||
|  | 	@echo $(MSG_HID_BOOTLOADER_CMD) Programming FLASH with hid_bootloader_cli using \"$<\" | ||||||
|  | 	hid_bootloader_cli -mmcu=$(MCU) -v $< | ||||||
|  | 
 | ||||||
|  | # Programs in the target EEPROM memory using the HID_BOOTLOADER_CLI tool (note: clears target FLASH memory)
 | ||||||
|  | hid-ee: $(TARGET).eep $(MAKEFILE_LIST) | ||||||
|  | 	@echo $(MSG_OBJCPY_CMD) Converting \"$<\" to a binary file \"InputEEData.bin\" | ||||||
|  | 	avr-objcopy -I ihex -O binary $< $(DMBS_MODULE_PATH)/HID_EEPROM_Loader/InputEEData.bin | ||||||
|  | 	@echo $(MSG_MAKE_CMD) Making EEPROM loader application for \"$<\" | ||||||
|  | 	$(MAKE) -C $(DMBS_MODULE_PATH)/HID_EEPROM_Loader/ MCU=$(MCU) clean hid | ||||||
|  | 
 | ||||||
|  | # Programs in the target FLASH memory using the TEENSY_BOOTLOADER_CLI tool
 | ||||||
|  | teensy: $(TARGET).hex $(MAKEFILE_LIST) | ||||||
|  | 	@echo $(MSG_HID_BOOTLOADER_CMD) Programming FLASH with teensy_loader_cli using \"$<\" | ||||||
|  | 	teensy_loader_cli -mmcu=$(MCU) -v $< | ||||||
|  | 
 | ||||||
|  | # Programs in the target EEPROM memory using the TEENSY_BOOTLOADER_CLI tool (note: clears target FLASH memory)
 | ||||||
|  | teensy-ee: $(TARGET).hex $(MAKEFILE_LIST) | ||||||
|  | 	@echo $(MSG_OBJCPY_CMD) Converting \"$<\" to a binary file \"InputEEData.bin\" | ||||||
|  | 	avr-objcopy -I ihex -O binary $< $(DMBS_MODULE_PATH)/HID_EEPROM_Loader/InputEEData.bin | ||||||
|  | 	@echo $(MSG_MAKE_CMD) Making EEPROM loader application for \"$<\" | ||||||
|  | 	$(MAKE) -s -C $(DMBS_MODULE_PATH)/HID_EEPROM_Loader/ MCU=$(MCU) clean teensy | ||||||
|  | 
 | ||||||
|  | # Phony build targets for this module
 | ||||||
|  | .PHONY: $(DMBS_BUILD_TARGETS) | ||||||
| @ -0,0 +1,105 @@ | |||||||
|  | DMBS - Dean's Makefile Build System | ||||||
|  | =================================== | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | Project Overview | ||||||
|  | ---------------- | ||||||
|  | 
 | ||||||
|  | GNU Make is scary, and it's tough to get the rules right sometimes. Many | ||||||
|  | projects get by via simple copy-pasting of old makefiles, resulting in many | ||||||
|  | redundant copies of the same old rules. DMBS aims to solve this by providing a | ||||||
|  | simple modular set of makefiles which can be included by your project to quickly | ||||||
|  | add various build functionality. | ||||||
|  | 
 | ||||||
|  | This aims to replace the old WinAVR "mfile" makefile template, giving better | ||||||
|  | functionality and much simpler user makefiles. | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | Benefits: | ||||||
|  | ---------------- | ||||||
|  | 
 | ||||||
|  | Apart from much simpler, cleaner makefiles DMBS carries the aim of making the | ||||||
|  | process of troubleshooting build issues a little easier. Lots can go wrong, so | ||||||
|  | DMBS tries to sanity check its inputs wherever possible, and produce | ||||||
|  | human-readable error messages. Forgotten to set a variable? Get a | ||||||
|  | `Makefile {X} value not set.` message, rather than a possibly unrelated message. | ||||||
|  | Have the wrong filename? See `Source file does not exist: {X}` rather than the | ||||||
|  | infamous `No rule to make target {X}` message. | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | Use: | ||||||
|  | ---------------- | ||||||
|  | 
 | ||||||
|  | A template user makefile is provided in the `Template` directory. DMBS modules | ||||||
|  | are included via a GNU Make `include` directive. While the DMBS `core` module is | ||||||
|  | always required, you can pick and choose what other modules you wish to add to | ||||||
|  | your user project. | ||||||
|  | 
 | ||||||
|  | Here's an example user makefile: | ||||||
|  | 
 | ||||||
|  | 	MCU          = atmega128 | ||||||
|  | 	ARCH         = AVR8 | ||||||
|  | 	F_CPU        = 8000000 | ||||||
|  | 	OPTIMIZATION = s | ||||||
|  | 	TARGET       = Template | ||||||
|  | 	SRC          = $(TARGET).c | ||||||
|  | 	CC_FLAGS     = | ||||||
|  | 	LD_FLAGS     = | ||||||
|  | 
 | ||||||
|  | 	# Default target | ||||||
|  | 	all: | ||||||
|  | 
 | ||||||
|  | 	# Include DMBS build script makefiles | ||||||
|  | 	DMBS_PATH   ?= ../DMBS | ||||||
|  | 	include $(DMBS_PATH)/core.mk | ||||||
|  | 	include $(DMBS_PATH)/gcc.mk | ||||||
|  | 	include $(DMBS_PATH)/cppcheck.mk | ||||||
|  | 	include $(DMBS_PATH)/doxygen.mk | ||||||
|  | 	include $(DMBS_PATH)/dfu.mk | ||||||
|  | 	include $(DMBS_PATH)/hid.mk | ||||||
|  | 	include $(DMBS_PATH)/avrdude.mk | ||||||
|  | 	include $(DMBS_PATH)/atprogram.mk | ||||||
|  | 
 | ||||||
|  | Each DMBS module can optionally supply one or more Make variables and macros, | ||||||
|  | which you can reference in your user makefile. Additionally, modules can require | ||||||
|  | one or more variables to be set by the user makefile, with (in some cases) sane | ||||||
|  | defaults used if left out. | ||||||
|  | 
 | ||||||
|  | As modules are added, you can get a list of available targets by simply typing | ||||||
|  | `make help` from the command line. This will produce a formatted list of targets | ||||||
|  | as well as mandatory and optional variables and exposed variables and macros. | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | License | ||||||
|  | ---------------- | ||||||
|  | 
 | ||||||
|  | DMBS is released into the public domain, making is suitable for use everywhere, | ||||||
|  | by everyone. Contributions are greatly appreciated however, in order to make | ||||||
|  | DMBS better for everyone. | ||||||
|  | 
 | ||||||
|  | The actual license text is as follows: | ||||||
|  | 
 | ||||||
|  | 	This is free and unencumbered software released into the public domain. | ||||||
|  | 
 | ||||||
|  | 	Anyone is free to copy, modify, publish, use, compile, sell, or | ||||||
|  | 	distribute this software, either in source code form or as a compiled | ||||||
|  | 	binary, for any purpose, commercial or non-commercial, and by any | ||||||
|  | 	means. | ||||||
|  | 
 | ||||||
|  | 	In jurisdictions that recognize copyright laws, the author or authors | ||||||
|  | 	of this software dedicate any and all copyright interest in the | ||||||
|  | 	software to the public domain. We make this dedication for the benefit | ||||||
|  | 	of the public at large and to the detriment of our heirs and | ||||||
|  | 	successors. We intend this dedication to be an overt act of | ||||||
|  | 	relinquishment in perpetuity of all present and future rights to this | ||||||
|  | 	software under copyright law. | ||||||
|  | 
 | ||||||
|  | 	THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | ||||||
|  | 	EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | ||||||
|  | 	MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. | ||||||
|  | 	IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR | ||||||
|  | 	OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, | ||||||
|  | 	ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR | ||||||
|  | 	OTHER DEALINGS IN THE SOFTWARE. | ||||||
|  | 
 | ||||||
|  | 	For more information, please refer to <http://unlicense.org/> | ||||||
| @ -0,0 +1,12 @@ | |||||||
|  | /*
 | ||||||
|  |              DMBS Build System | ||||||
|  |       Released into the public domain. | ||||||
|  | 
 | ||||||
|  |    dean [at] fourwalledcubicle [dot] com | ||||||
|  |          www.fourwalledcubicle.com | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | int main(void) | ||||||
|  | { | ||||||
|  | 	// Application code here.
 | ||||||
|  | } | ||||||
| @ -0,0 +1,32 @@ | |||||||
|  | #
 | ||||||
|  | #            DMBS Build System
 | ||||||
|  | #     Released into the public domain.
 | ||||||
|  | #
 | ||||||
|  | #  dean [at] fourwalledcubicle [dot] com
 | ||||||
|  | #        www.fourwalledcubicle.com
 | ||||||
|  | #
 | ||||||
|  | 
 | ||||||
|  | # Run "make help" for target help.
 | ||||||
|  | 
 | ||||||
|  | MCU          = atmega128 | ||||||
|  | ARCH         = AVR8 | ||||||
|  | F_CPU        = 8000000 | ||||||
|  | OPTIMIZATION = s | ||||||
|  | TARGET       = Template | ||||||
|  | SRC          = $(TARGET).c | ||||||
|  | CC_FLAGS     = | ||||||
|  | LD_FLAGS     = | ||||||
|  | 
 | ||||||
|  | # Default target
 | ||||||
|  | all: | ||||||
|  | 
 | ||||||
|  | # Include DMBS build script makefiles
 | ||||||
|  | DMBS_PATH   ?= ../DMBS | ||||||
|  | include $(DMBS_PATH)/core.mk | ||||||
|  | include $(DMBS_PATH)/gcc.mk | ||||||
|  | include $(DMBS_PATH)/cppcheck.mk | ||||||
|  | include $(DMBS_PATH)/doxygen.mk | ||||||
|  | include $(DMBS_PATH)/dfu.mk | ||||||
|  | include $(DMBS_PATH)/hid.mk | ||||||
|  | include $(DMBS_PATH)/avrdude.mk | ||||||
|  | include $(DMBS_PATH)/atprogram.mk | ||||||
					Loading…
					
					
				
		Reference in new issue
	
	 Dean Camera
						Dean Camera