Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ AVR Code/USB_BULK_TEST/Release
Desktop_Interface/debug
Desktop_Interface/release
!Desktop_Interface/resources/firmware/dfu-programmer.exe
*.d
*.o
*.a
*.so
Expand All @@ -41,6 +42,14 @@ Thumbs.db
pinout.png
*.mex

*.elf
*.map
*.lss
*.hex
*.srec
*.eep
!Desktop_Interface/resources/firmware/*.hex

libdfuprog/Makefile*

Librador_API/___librador/MATLAB_Octave/octave-workspace
Expand Down
364 changes: 134 additions & 230 deletions AVR_Code/USB_BULK_TEST/Makefile
100755 → 100644
Original file line number Diff line number Diff line change
@@ -1,15 +1,19 @@
# see https://github.com/espotek-org/Labrador/wiki/Building-from-source#building-the-firmware
# Usage :
# make 0x01
# build a version of the firmware compatible with Windows x64 OSs
# make 0x02
# build a version of the firmware compatible with all other OSs
# `make 01`
# build a variant of the firmware compatible with Windows x64 OSs
# `make 02`
# build a variant of the firmware compatible with all other OSs
# Here, OS refers to that of the machine with which the Labrador board will interface.
# After running 'make 0x01', to switch to building variant 0x02 instead, first run 'make clean'.
# The same goes for switching from building the 0x02 variant to building the 0x01 variant.
#
# Whenever switching between building the two variants, always run either
# `make clean` (to delete everything) or `make mostlyclean` (to delete the
# object files and leave the .hex that you will load to the Labrador board)
# so that all objects will be rebuilt with the correct macro definitions.
#
# Some details:
# In the build process for variant 0x01, the macro SINGLE_ENDPOINT_INTERFACE
# is undefined, while in the build process for variant 0x02,
# In the build process for variant 01, the macro SINGLE_ENDPOINT_INTERFACE
# is undefined, while in the build process for variant 02,
# SINGLE_ENDPOINT_INTERFACE is defined. In several regions of the source
# code, the undefined/defined status of this macro determines which of two
# possible code blocks are compiled into the firmware. The collective effect
Expand All @@ -18,225 +22,125 @@
# endpoints to send the scope/logic analyzer data" (from
# https://github.com/espotek-org/Labrador/issues/260)
# *NOTE* : there is a commented-out line defining SINGLE_ENDPOINT_INTERFACE in
# globals.h. If it is uncommented, both 'make 0x01' and 'make 0x02' will
# produce variant 0x02. Further, 'make 0x01' will mislabel the firmware with
# the suffix 0x01. It is recommended that this line in globals.h be left
# commented-out, which ensures that `make 0x01` and `make 0x02` work as
# expected.
EXECUTABLES :=
LIB_DEP :=
LIBS :=
USER_OBJS :=
OUTPUT_FILE_PATH :=
OUTPUT_FILE_PATH =$(NAME).elf
OUTPUT_FILE_PATH_AS_ARGS +=$(NAME).elf
AVR_APP_PATH :=$$$AVR_APP_PATH$$$

AVRDIR=
CC=$(AVRDIR)/bin/avr-gcc
INCLUDES=-I"./common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained" -I"./common/services/usb/class/vendor/device/example" -I"./src/ASF/common/services/usb/udc" -I"./src/ASF/xmega/drivers/nvm" -I"./src/ASF/common/services/sleepmgr" -I"./src/ASF/common/services/clock" -I"./src/ASF/xmega/drivers/sleep" -I"./src/ASF/xmega/drivers/usb" -I"./src/ASF/xmega/drivers/cpu" -I"./src/ASF/common/services/usb/class/vendor" -I"./src/ASF/common/services/usb/class/vendor/device" -I"./src/ASF/common/services/usb" -I"./common/applications/user_application/user_board/config" -I"./src/ASF/xmega/utils" -I"./src/config" -I"./src/ASF/common/boards" -I"./src/ASF/xmega/utils/preprocessor" -I"./src/ASF/common/utils" -I"./src" -I"./src/ASF/common/boards/user_board" -I"./src/ASF/common/services/ioport"

CFLAGS=-std=gnu99 -ffunction-sections -mmcu=atxmega32a4u -fsigned-char -funsigned-bitfields -fdata-sections -fshort-enums -fno-strict-aliasing -fno-jump-tables -fpack-struct -Wall -O2 -MD -MP -MF "$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -MT"$(@:%.o=%.o)"
NAME=labrafirm_$(SUFFIX)

OBJS += \
./src/tiny_calibration.o \
./src/tiny_dig.o \
./src/tiny_eeprom.o \
./src/ASF/common/boards/user_board/init.o \
./src/ASF/common/services/ioport/xmega/ioport_compat.o \
./src/main.o \
./src/tiny_adc.o \
./src/tiny_dac.o \
./src/tiny_dma.o \
./src/tiny_timer.o \
./src/tiny_uart.o \
./src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o \
./src/ASF/common/services/clock/xmega/sysclk.o \
./src/ASF/common/services/sleepmgr/xmega/sleepmgr.o \
./src/ASF/common/services/usb/class/vendor/device/udi_vendor.o \
./src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.o \
./src/ASF/common/services/usb/udc/udc.o \
./src/ASF/xmega/drivers/nvm/nvm.o \
./src/ASF/xmega/drivers/nvm/nvm_asm.o \
./src/ASF/xmega/drivers/cpu/ccp.o \
./src/ASF/xmega/drivers/usb/usb_device.o

C_DEPS_AS_ARGS += \
./src/tiny_calibration.d \
./src/tiny_dig.d \
./src/tiny_eeprom.d \
./src/ASF/common/boards/user_board/init.d \
./src/ASF/common/services/ioport/xmega/ioport_compat.d \
./src/main.d \
./src/tiny_adc.d \
./src/tiny_dac.d \
./src/tiny_dma.d \
./src/tiny_timer.d \
./src/tiny_uart.d \
./src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.d \
./src/ASF/common/services/clock/xmega/sysclk.d \
./src/ASF/common/services/sleepmgr/xmega/sleepmgr.d \
./src/ASF/common/services/usb/class/vendor/device/udi_vendor.d \
./src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.d \
./src/ASF/common/services/usb/udc/udc.d \
./src/ASF/xmega/drivers/nvm/nvm.d \
./src/ASF/xmega/drivers/nvm/nvm_asm.d \
./src/ASF/xmega/drivers/cpu/ccp.d \
./src/ASF/xmega/drivers/usb/usb_device.d

OBJS_AS_ARGS += \
./src/tiny_calibration.o \
./src/tiny_dig.o \
./src/tiny_eeprom.o \
./src/ASF/common/boards/user_board/init.o \
./src/ASF/common/services/ioport/xmega/ioport_compat.o \
./src/main.o \
./src/tiny_adc.o \
./src/tiny_dac.o \
./src/tiny_dma.o \
./src/tiny_timer.o \
./src/tiny_uart.o \
./src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o \
./src/ASF/common/services/clock/xmega/sysclk.o \
./src/ASF/common/services/sleepmgr/xmega/sleepmgr.o \
./src/ASF/common/services/usb/class/vendor/device/udi_vendor.o \
./src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.o \
./src/ASF/common/services/usb/udc/udc.o \
./src/ASF/xmega/drivers/nvm/nvm.o \
./src/ASF/xmega/drivers/nvm/nvm_asm.o \
./src/ASF/xmega/drivers/cpu/ccp.o \
./src/ASF/xmega/drivers/usb/usb_device.o

./src/tiny_calibration.o: ./src/tiny_calibration.c
@echo Building file: $<
@$(CC) -DNDEBUG -DBOARD=USER_BOARD $(INCLUDES) $(CFLAGS) -c -o "$@" "$<"
@echo Finished building: $<

./src/tiny_dig.o: ./src/tiny_dig.c
@echo Building file: $<
@$(CC) -DNDEBUG -DBOARD=USER_BOARD $(INCLUDES) $(CFLAGS) -c -o "$@" "$<"
@echo Finished building: $<

./src/tiny_eeprom.o: ./src/tiny_eeprom.c
@echo Building file: $<
@$(CC) -DNDEBUG -DBOARD=USER_BOARD $(INCLUDES) $(CFLAGS) -c -o "$@" "$<"
@echo Finished building: $<

./src/ASF/common/boards/user_board/init.o: ./src/ASF/common/boards/user_board/init.c
@echo Building file: $<
@$(CC) -DNDEBUG -DBOARD=USER_BOARD $(INCLUDES) $(CFLAGS) -c -o "$@" "$<"
@echo Finished building: $<

./src/ASF/common/services/ioport/xmega/ioport_compat.o: ./src/ASF/common/services/ioport/xmega/ioport_compat.c
@echo Building file: $<
@$(CC) -DNDEBUG -DBOARD=USER_BOARD $(INCLUDES) $(CFLAGS) -c -o "$@" "$<"
@echo Finished building: $<

./src/main.o: ./src/main.c
@echo Building file: $<
@$(CC) -DNDEBUG -DBOARD=USER_BOARD $(INCLUDES) $(CFLAGS) -c -o "$@" "$<"
@echo Finished building: $<

./src/tiny_adc.o: ./src/tiny_adc.c
@echo Building file: $<
@$(CC) -DNDEBUG -DBOARD=USER_BOARD $(INCLUDES) $(CFLAGS) -c -o "$@" "$<"
@echo Finished building: $<

./src/tiny_dac.o: ./src/tiny_dac.c
@echo Building file: $<
@$(CC) -DNDEBUG -DBOARD=USER_BOARD $(INCLUDES) $(CFLAGS) -c -o "$@" "$<"
@echo Finished building: $<

./src/tiny_dma.o: ./src/tiny_dma.c
@echo Building file: $<
@$(CC) -DNDEBUG -DBOARD=USER_BOARD $(INCLUDES) $(CFLAGS) -c -o "$@" "$<"
@echo Finished building: $<

./src/tiny_timer.o: ./src/tiny_timer.c
@echo Building file: $<
@$(CC) -DNDEBUG -DBOARD=USER_BOARD $(INCLUDES) $(CFLAGS) -c -o "$@" "$<"
@echo Finished building: $<

./src/tiny_uart.o: ./src/tiny_uart.c
@echo Building file: $<
@$(CC) -DNDEBUG -DBOARD=USER_BOARD $(INCLUDES) $(CFLAGS) -c -o "$@" "$<"
@echo Finished building: $<

./src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o: ./src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.c
@echo Building file: $<
@$(CC) -DNDEBUG -DBOARD=USER_BOARD $(INCLUDES) $(CFLAGS) -c -o "$@" "$<"
@echo Finished building: $<

./src/ASF/common/services/clock/xmega/sysclk.o: ./src/ASF/common/services/clock/xmega/sysclk.c
@echo Building file: $<
@$(CC) -DNDEBUG -DBOARD=USER_BOARD $(INCLUDES) $(CFLAGS) -c -o "$@" "$<"
@echo Finished building: $<

./src/ASF/common/services/sleepmgr/xmega/sleepmgr.o: ./src/ASF/common/services/sleepmgr/xmega/sleepmgr.c
@echo Building file: $<
@$(CC) -DNDEBUG -DBOARD=USER_BOARD $(INCLUDES) $(CFLAGS) -c -o "$@" "$<"
@echo Finished building: $<

./src/ASF/common/services/usb/class/vendor/device/udi_vendor.o: ./src/ASF/common/services/usb/class/vendor/device/udi_vendor.c
@echo Building file: $<
@$(CC) -DNDEBUG -DBOARD=USER_BOARD $(INCLUDES) $(CFLAGS) -c -o "$@" "$<"
@echo Finished building: $<

./src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.o: ./src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.c
@echo Building file: $<
@$(CC) -DNDEBUG -DBOARD=USER_BOARD $(INCLUDES) $(CFLAGS) -c -o "$@" "$<"
@echo Finished building: $<

./src/ASF/common/services/usb/udc/udc.o: ./src/ASF/common/services/usb/udc/udc.c
@echo Building file: $<
@$(CC) -DNDEBUG -DBOARD=USER_BOARD $(INCLUDES) $(CFLAGS) -c -o "$@" "$<"
@echo Finished building: $<

./src/ASF/xmega/drivers/cpu/ccp.o: ./src/ASF/xmega/drivers/cpu/ccp.s
@echo Building file: $<
@$(CC) -x assembler-with-cpp -DNDEBUG -DBOARD=USER_BOARD $(INCLUDES) $(CFLAGS) -c -o "$@" "$<"
@echo Finished building: $<

./src/ASF/xmega/drivers/nvm/nvm.o: ./src/ASF/xmega/drivers/nvm/nvm.c
@echo Building file: $<
@$(CC) -DNDEBUG -DBOARD=USER_BOARD $(INCLUDES) $(CFLAGS) -c -o "$@" "$<"
@echo Finished building: $<

./src/ASF/xmega/drivers/nvm/nvm_asm.o: ./src/ASF/xmega/drivers/nvm/nvm_asm.s
@echo Building file: $<
@$(CC) -x assembler-with-cpp -DNDEBUG -DBOARD=USER_BOARD $(INCLUDES) $(CFLAGS) -c -o "$@" "$<"
@echo Finished building: $<

./src/ASF/xmega/drivers/usb/usb_device.o: ./src/ASF/xmega/drivers/usb/usb_device.c
@echo Building file: $<
@$(CC) -DNDEBUG -DBOARD=USER_BOARD $(INCLUDES) $(CFLAGS) -c -o "$@" "$<"
@echo Finished building: $<

0x01: SUFFIX=0x01
0x01: $(OUTPUT_FILE_PATH)

0x02: CFLAGS+=-DSINGLE_ENDPOINT_INTERFACE
0x02: SUFFIX=0x02
0x02: $(OUTPUT_FILE_PATH)

$(OUTPUT_FILE_PATH): $(OBJS) $(USER_OBJS) $(OUTPUT_FILE_DEP) $(LIB_DEP) $(LINKER_SCRIPT_DEP)
@echo Building target: $@
$(CC) -o$(OUTPUT_FILE_PATH_AS_ARGS) $(OBJS_AS_ARGS) $(USER_OBJS) $(LIBS) -Wl,-Map=$(NAME)".map" -Wl,-lm -mmcu=atxmega32a4u -Wl,--gc-sections -Wl,--relax
$(AVRDIR)/bin/avr-objcopy -O ihex -R .eeprom -R .fuse -R .lock -R .signature $(NAME)".elf" $(NAME)".hex"
$(AVRDIR)/bin/avr-objdump -h -S $(NAME)".elf" > $(NAME)".lss"
$(AVRDIR)/bin/avr-objcopy -j .eeprom --set-section-flags=.eeprom=alloc,load --change-section-lma .eeprom=0 --no-change-warnings -O binary $(NAME)".elf" $(NAME)".eep" || exit 0
$(AVRDIR)/bin/avr-objcopy -O srec -R .eeprom -R .fuse -R .lock -R .signature $(NAME)".elf" $(NAME)".srec"
$(AVRDIR)/bin/avr-size $(NAME)".elf"
@echo Finished successfully: $(NAME)

VARIANTS = 0x01 0x02
clean :
-rm -rf $(OBJS_AS_ARGS) $(EXECUTABLES)
-rm -rf $(C_DEPS_AS_ARGS)
$(foreach SUFFIX,$(VARIANTS), \
rm -rf $(NAME).hex ; \
rm -rf $(NAME).lss ; \
rm -rf $(NAME).eep ; \
rm -rf $(NAME).srec ; \
rm -rf $(NAME).elf $(NAME).a $(NAME).map)
# globals.h. If it is uncommented, both `make 01` and `make 02` will
# produce variant 02. Further, `make 01` will mislabel the firmware with
# the suffix 01. It is recommended that this line in globals.h be left
# commented-out, which ensures that `make 01` and `make 02` work as
# expected. Similarly, FIRMWARE_VERSION_ID is commented out in globals.h
# and instead defined by this Makefile. Only uncomment either definition if
# you are using Atmel Studio or similar and are not using this Makefile to build.

CROSS_COMPILE = avr-
CC = $(CROSS_COMPILE)gcc
OBJCOPY = $(CROSS_COMPILE)objcopy
OBJDUMP = $(CROSS_COMPILE)objdump
SIZE = $(CROSS_COMPILE)size

DEFINES = \
NDEBUG \
BOARD=USER_BOARD

INCLUDES = \
common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained \
common/services/usb/class/vendor/device/example \
src/ASF/common/services/usb/udc \
src/ASF/xmega/drivers/nvm \
src/ASF/common/services/sleepmgr \
src/ASF/common/services/clock \
src/ASF/xmega/drivers/sleep \
src/ASF/xmega/drivers/usb \
src/ASF/xmega/drivers/cpu \
src/ASF/common/services/usb/class/vendor \
src/ASF/common/services/usb/class/vendor/device \
src/ASF/common/services/usb \
common/applications/user_application/user_board/config \
src/ASF/xmega/utils \
src/config \
src/ASF/common/boards \
src/ASF/xmega/utils/preprocessor \
src/ASF/common/utils \
src \
src/ASF/common/boards/user_board \
src/ASF/common/services/ioport

CPPFLAGS = $(addprefix -D,$(DEFINES)) $(addprefix -I,$(INCLUDES))

CFLAGS = \
-std=gnu99 \
-ffunction-sections \
-mmcu=atxmega32a4u \
-fsigned-char \
-funsigned-bitfields \
-fdata-sections \
-fshort-enums \
-fno-strict-aliasing \
-fno-jump-tables \
-fpack-struct \
-Wall \
-O2 \
-MD -MP -MF $(@:%.o=%.d) -MT $(@:%.o=%.d) -MT $(@:%.o=%.o)

OBJS = \
src/tiny_calibration.o \
src/tiny_dig.o \
src/tiny_eeprom.o \
src/ASF/common/boards/user_board/init.o \
src/ASF/common/services/ioport/xmega/ioport_compat.o \
src/main.o \
src/tiny_adc.o \
src/tiny_dac.o \
src/tiny_dma.o \
src/tiny_timer.o \
src/tiny_uart.o \
src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o \
src/ASF/common/services/clock/xmega/sysclk.o \
src/ASF/common/services/sleepmgr/xmega/sleepmgr.o \
src/ASF/common/services/usb/class/vendor/device/udi_vendor.o \
src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.o \
src/ASF/common/services/usb/udc/udc.o \
src/ASF/xmega/drivers/nvm/nvm.o \
src/ASF/xmega/drivers/nvm/nvm_asm.o \
src/ASF/xmega/drivers/cpu/ccp.o \
src/ASF/xmega/drivers/usb/usb_device.o

DEPS = $(OBJS:%.o=%.d)

VERSION = 0007
VARIANTS = 01 02
EXEEXTS = .elf .map .lss .hex .srec .eep
EXES = $(foreach variant,$(VARIANTS),$(foreach ext,$(EXEEXTS),labrafirm_$(VERSION)_$(variant)$(ext)))

.PHONY: $(VARIANTS)
01: labrafirm_$(VERSION)_01.hex
02: labrafirm_$(VERSION)_02.hex
labrafirm_$(VERSION)_01.elf: DEFINES += FIRMWARE_VERSION_ID=0x$(VERSION)
labrafirm_$(VERSION)_02.elf: DEFINES += FIRMWARE_VERSION_ID=0x$(VERSION) SINGLE_ENDPOINT_INTERFACE

%.o: %.c
$(CC) $(CPPFLAGS) $(CFLAGS) -c -o $@ $<

%.o: %.s
$(CC) -x assembler-with-cpp $(CPPFLAGS) $(CFLAGS) -c -o $@ $<

labrafirm_$(VERSION)_%.elf: $(OBJS)
$(CC) -o $@ $(OBJS) -Wl,-Map=$(@:%.elf=%.map) -Wl,-lm -mmcu=atxmega32a4u -Wl,--gc-sections -Wl,--relax
$(SIZE) $@
$(OBJDUMP) -h -S $@ > $(@:%.elf=%.lss)

%.hex: %.elf
$(OBJCOPY) -O ihex -R .eeprom -R .fuse -R .lock -R .signature $< $@ && sed -i 's/\r$$//' $@ && chmod -x $@

%.srec: %.elf
$(OBJCOPY) -O srec -R .eeprom -R .fuse -R .lock -R .signature $< $@ && sed -i 's/\r$$//' $@ && chmod -x $@

%.eep: %.elf
$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom=alloc,load --change-section-lma .eeprom=0 --no-change-warnings -O binary $< $@ && chmod -x $@ || exit 0

.PHONY: mostlyclean clean
mostlyclean:
-rm -f $(OBJS) $(DEPS)
clean: mostlyclean
-rm -f $(EXES)

$(OBJS) $(EXES): Makefile
-include $(DEPS)
Loading
Loading