diff --git a/.gitignore b/.gitignore index 74bc2e93a..7a10a8edf 100644 --- a/.gitignore +++ b/.gitignore @@ -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 @@ -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 diff --git a/AVR_Code/USB_BULK_TEST/Makefile b/AVR_Code/USB_BULK_TEST/Makefile old mode 100755 new mode 100644 index d14e3a548..83d14cd40 --- a/AVR_Code/USB_BULK_TEST/Makefile +++ b/AVR_Code/USB_BULK_TEST/Makefile @@ -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 @@ -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) diff --git a/AVR_Code/USB_BULK_TEST/src/globals.h b/AVR_Code/USB_BULK_TEST/src/globals.h index e85cc0b87..ac89780d2 100644 --- a/AVR_Code/USB_BULK_TEST/src/globals.h +++ b/AVR_Code/USB_BULK_TEST/src/globals.h @@ -13,7 +13,7 @@ //#define VERO #define OVERCLOCK 48 -#define FIRMWARE_VERSION_ID 0x0007 +//#define FIRMWARE_VERSION_ID 0x0007 #define ATMEL_DFU_OFFSET 0x01fc #define TC_SPISLAVE TCD0 @@ -71,4 +71,4 @@ extern const unsigned char variant; #include "unified_debug_structure.h" extern unified_debug uds; -#endif /* GLOBALS_H_ */ \ No newline at end of file +#endif /* GLOBALS_H_ */ diff --git a/README.md b/README.md index c99ded66a..798faa5bf 100644 --- a/README.md +++ b/README.md @@ -39,7 +39,7 @@ echo 'export PATH="/opt/homebrew/opt/qt@5/bin:$PATH"' >> ~/.zshrc ``` -To build the AVR software, I use Atmel Studio 7. Just load up the .atsln located in the `/AVR_Code` directory and push F7. You can alternatively use open-source command-line AVR tools from GNU if you don't want to install a full IDE. Instructions for doing so are given in the [Building the firmware](https://github.com/espotek-org/Labrador/wiki/Building-from-source/#building-the-desktop-interface) section of the wiki. If you already have the GNU AVR tools installed, you can jump straight to the [firmware Makefile](https://github.com/espotek-org/Labrador/blob/master/AVR_Code/USB_BULK_TEST/Makefile), set `AVRDIR` in it appropriately, and start building. The wiki includes troubleshooting tips in case you run into issues. +To build the AVR software, I use Atmel Studio 7. Just load up the .atsln located in the `/AVR_Code` directory and push F7. You can alternatively use open-source command-line AVR tools from GNU if you don't want to install a full IDE. Instructions for doing so are given in the [Building the firmware](https://github.com/espotek-org/Labrador/wiki/Building-from-source#building-the-firmware) section of the wiki. If you already have the GNU AVR tools installed, you can jump straight to the [firmware Makefile](https://github.com/espotek-org/Labrador/blob/master/AVR_Code/USB_BULK_TEST/Makefile) and start building. The wiki includes troubleshooting tips in case you run into issues. The PCB files can be edited in KiCAD 5.0 or later.