From e95258fe13ddcd75af982e30e70b3e503d332cdf Mon Sep 17 00:00:00 2001 From: Federico Cerutti Date: Wed, 14 Oct 2020 19:47:38 +0200 Subject: [PATCH 1/3] Elf sections check before flash Due to the addition of new codecs and applications, code size grew to overwrite the part of FRAM currently used to store card slots (settings). This simple (although hacky) makefile command verifies if such an issue will occur before flashing the firmware. --- Firmware/Chameleon-Mini/Makefile | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/Firmware/Chameleon-Mini/Makefile b/Firmware/Chameleon-Mini/Makefile index 4555d517..942946f1 100644 --- a/Firmware/Chameleon-Mini/Makefile +++ b/Firmware/Chameleon-Mini/Makefile @@ -125,6 +125,7 @@ AVRDUDE_FLAGS = -p $(AVRDUDE_MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER) AVRDUDE_WRITE_APP_LATEST = -U application:w:Latest/Chameleon-Mini.hex AVRDUDE_WRITE_EEPROM_LATEST = -U eeprom:w:Latest/Chameleon-Mini.eep +.PHONY: program program-latest dfu-flip dfu-prog check_size style # Default target all: @@ -155,27 +156,46 @@ spmhelper: $(TARGET).elf $(CROSS)-objcopy -O ihex -j .spmhelper $(SPM_HELPER_OBJCOPY) $(TARGET).elf $(TARGET).hex # Program the device using avrdude -program: $(TARGET).hex $(TARGET).eep +program: $(TARGET).hex $(TARGET).eep check_size avrdude $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_APP) $(AVRDUDE_WRITE_EEPROM) # Program the device using avrdude with the latest official firmware -program-latest: +program-latest: check_size avrdude $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_APP_LATEST) $(AVRDUDE_WRITE_EEPROM_LATEST) # Program the device using batchisp and the DFU bootloader # Note that the device has to be in bootloader mode already -dfu-flip: $(TARGET).hex $(TARGET).eep +dfu-flip: $(TARGET).hex $(TARGET).eep check_size cp $(TARGET).eep EEPROM.hex batchisp -hardware usb -device $(MCU) -operation erase f memory FLASH loadbuffer $(TARGET).hex program verify memory EEPROM loadbuffer EEPROM.hex program verify start reset 0 rm EEPROM.hex # Program the device using dfu-programmer -dfu-prog: $(TARGET).hex $(TARGET).eep +dfu-prog: $(TARGET).hex $(TARGET).eep check_size dfu-programmer $(MCU) erase dfu-programmer $(MCU) flash-eeprom $(TARGET).eep dfu-programmer $(MCU) flash $(TARGET).hex dfu-programmer $(MCU) reset +check_size: +ifeq ($(OS),Windows_NT) +# TODO Windows version of this check + @PROGMEM_SIZE = 0 +else + @{ \ + set -e; \ + if [ ! -f $(TARGET).elf ]; then \ + exit 0; \ + fi; \ + PROGMEM_SIZE=$$(avr-size $(TARGET).elf | grep -oP "\d+" | sed -n 4p); \ + MAX_PRGMEM_SIZE=$$(printf "%d\n" $(FLASH_DATA_ADDR)); \ + if [ $$PROGMEM_SIZE -gt $$MAX_PRGMEM_SIZE ]; then \ + echo "make: *** $(TARGET).elf Application Section size $$PROGMEM_SIZE excedes maximum allowed $$MAX_PRGMEM_SIZE. Please disable some features in Makefile"; \ + exit 1; \ + fi; \ + } +endif + style: # Make sure astyle is installed @which astyle >/dev/null || ( echo "Please install 'astyle' package first" ; exit 1 ) From d81c63408f87ed039083590ab622a0e315e9966b Mon Sep 17 00:00:00 2001 From: Federico Cerutti Date: Wed, 14 Oct 2020 20:22:46 +0200 Subject: [PATCH 2/3] Disabled sniff/reader codecs compilation Had to make some minor changes to Commands.c and CommandLine.c to allow building without these codecs --- Firmware/Chameleon-Mini/Makefile | 6 +++--- Firmware/Chameleon-Mini/Terminal/CommandLine.c | 4 ++++ Firmware/Chameleon-Mini/Terminal/Commands.c | 15 +++++++++++---- 3 files changed, 18 insertions(+), 7 deletions(-) diff --git a/Firmware/Chameleon-Mini/Makefile b/Firmware/Chameleon-Mini/Makefile index 942946f1..14d598d1 100644 --- a/Firmware/Chameleon-Mini/Makefile +++ b/Firmware/Chameleon-Mini/Makefile @@ -11,13 +11,13 @@ SETTINGS += -DCONFIG_MF_CLASSIC_1K_7B_SUPPORT SETTINGS += -DCONFIG_MF_CLASSIC_4K_SUPPORT SETTINGS += -DCONFIG_MF_CLASSIC_4K_7B_SUPPORT SETTINGS += -DCONFIG_MF_ULTRALIGHT_SUPPORT -SETTINGS += -DCONFIG_ISO14443A_SNIFF_SUPPORT -SETTINGS += -DCONFIG_ISO14443A_READER_SUPPORT +# SETTINGS += -DCONFIG_ISO14443A_SNIFF_SUPPORT +# SETTINGS += -DCONFIG_ISO14443A_READER_SUPPORT SETTINGS += -DCONFIG_NTAG215_SUPPORT SETTINGS += -DCONFIG_VICINITY_SUPPORT SETTINGS += -DCONFIG_SL2S2002_SUPPORT SETTINGS += -DCONFIG_TITAGITSTANDARD_SUPPORT -SETTINGS += -DCONFIG_ISO15693_SNIFF_SUPPORT +# SETTINGS += -DCONFIG_ISO15693_SNIFF_SUPPORT SETTINGS += -DCONFIG_EM4233_SUPPORT #Support magic mode on mifare classic configuration diff --git a/Firmware/Chameleon-Mini/Terminal/CommandLine.c b/Firmware/Chameleon-Mini/Terminal/CommandLine.c index 286e04d2..5c17f130 100644 --- a/Firmware/Chameleon-Mini/Terminal/CommandLine.c +++ b/Firmware/Chameleon-Mini/Terminal/CommandLine.c @@ -253,6 +253,7 @@ const PROGMEM CommandEntryType CommandTable[] = { .SetFunc = NO_FUNCTION, .GetFunc = CommandGetSysTick }, +#ifdef CONFIG_ISO14443A_READER_SUPPORT { .Command = COMMAND_SEND_RAW, .ExecFunc = NO_FUNCTION, @@ -295,6 +296,7 @@ const PROGMEM CommandEntryType CommandTable[] = { .SetFunc = NO_FUNCTION, .GetFunc = NO_FUNCTION }, +#endif { .Command = COMMAND_TIMEOUT, .ExecFunc = NO_FUNCTION, @@ -323,6 +325,7 @@ const PROGMEM CommandEntryType CommandTable[] = { .SetFunc = CommandSetField, .GetFunc = CommandGetField }, +#ifdef CONFIG_ISO14443A_READER_SUPPORT { .Command = COMMAND_CLONE, .ExecFunc = CommandExecClone, @@ -330,6 +333,7 @@ const PROGMEM CommandEntryType CommandTable[] = { .SetFunc = NO_FUNCTION, .GetFunc = NO_FUNCTION }, +#endif { /* This has to be last element */ .Command = COMMAND_LIST_END, diff --git a/Firmware/Chameleon-Mini/Terminal/Commands.c b/Firmware/Chameleon-Mini/Terminal/Commands.c index 41bca316..958a9adb 100644 --- a/Firmware/Chameleon-Mini/Terminal/Commands.c +++ b/Firmware/Chameleon-Mini/Terminal/Commands.c @@ -415,6 +415,7 @@ CommandStatusIdType CommandGetSysTick(char *OutParam) { return COMMAND_INFO_OK_WITH_TEXT_ID; } +#ifdef CONFIG_ISO14443A_READER_SUPPORT CommandStatusIdType CommandExecParamSend(char *OutMessage, const char *InParams) { if (GlobalSettings.ActiveSettingPtr->Configuration != CONFIG_ISO14443A_READER) return COMMAND_ERR_INVALID_USAGE_ID; @@ -540,6 +541,7 @@ CommandStatusIdType CommandExecIdentifyCard(char *OutMessage) { CommandLinePendingTaskTimeout = &Reader14443AAppTimeout; return TIMEOUT_COMMAND; } +#endif CommandStatusIdType CommandGetTimeout(char *OutParam) { snprintf_P(OutParam, TERMINAL_BUFFER_SIZE, PSTR("%u ms"), GlobalSettings.ActiveSettingPtr->PendingTaskTimeout * 100); @@ -604,6 +606,7 @@ CommandStatusIdType CommandGetField(char *OutMessage) { CommandStatusIdType CommandExecAutocalibrate(char *OutMessage) { +#ifdef CONFIG_ISO14443A_READER_SUPPORT if (GlobalSettings.ActiveSettingPtr->Configuration == CONFIG_ISO14443A_READER) { ApplicationReset(); @@ -612,19 +615,22 @@ CommandStatusIdType CommandExecAutocalibrate(char *OutMessage) { Reader14443ACodecStart(); CommandLinePendingTaskTimeout = &Reader14443AAppTimeout; return TIMEOUT_COMMAND; - } else if (GlobalSettings.ActiveSettingPtr->Configuration == CONFIG_ISO14443A_SNIFF) { + } +#endif +#ifdef CONFIG_ISO14443A_SNIFF_SUPPORT + if (GlobalSettings.ActiveSettingPtr->Configuration == CONFIG_ISO14443A_SNIFF) { ApplicationReset(); Sniff14443CurrentCommand = Sniff14443_Autocalibrate; Sniff14443AAppInit(); CommandLinePendingTaskTimeout = &Sniff14443AAppTimeout; return TIMEOUT_COMMAND; - } else { - return COMMAND_ERR_INVALID_USAGE_ID; } - +#endif + return COMMAND_ERR_INVALID_USAGE_ID; } +#ifdef CONFIG_ISO14443A_READER_SUPPORT CommandStatusIdType CommandExecClone(char *OutMessage) { ConfigurationSetById(CONFIG_ISO14443A_READER); @@ -637,3 +643,4 @@ CommandStatusIdType CommandExecClone(char *OutMessage) { return TIMEOUT_COMMAND; } +#endif From b13d52d2805c6f2c7d1880bc0f2c8d57c6639738 Mon Sep 17 00:00:00 2001 From: Federico Cerutti Date: Thu, 15 Oct 2020 00:06:16 +0200 Subject: [PATCH 3/3] Working in windows under cygwin --- Firmware/Chameleon-Mini/Makefile | 5 ----- 1 file changed, 5 deletions(-) diff --git a/Firmware/Chameleon-Mini/Makefile b/Firmware/Chameleon-Mini/Makefile index 14d598d1..5a6e5c0d 100644 --- a/Firmware/Chameleon-Mini/Makefile +++ b/Firmware/Chameleon-Mini/Makefile @@ -178,10 +178,6 @@ dfu-prog: $(TARGET).hex $(TARGET).eep check_size dfu-programmer $(MCU) reset check_size: -ifeq ($(OS),Windows_NT) -# TODO Windows version of this check - @PROGMEM_SIZE = 0 -else @{ \ set -e; \ if [ ! -f $(TARGET).elf ]; then \ @@ -194,7 +190,6 @@ else exit 1; \ fi; \ } -endif style: # Make sure astyle is installed