Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Elf sections size check before flashing #47

Merged
merged 4 commits into from
Nov 27, 2020
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
8 changes: 8 additions & 0 deletions Firmware/Chameleon-Mini/Configuration.c
Original file line number Diff line number Diff line change
Expand Up @@ -505,10 +505,14 @@ void ConfigurationSetById(ConfigurationEnum Configuration) {
&ConfigurationTable[Configuration], sizeof(ConfigurationType));

// Configure antenna load as appropriate
#ifdef CONFIG_ISO14443A_READER_SUPPORT
if (Configuration == CONFIG_ISO14443A_READER)
PORTC.OUTCLR = PIN7_bm;
else
PORTC.OUTSET = PIN7_bm;
#else
PORTC.OUTSET = PIN7_bm;
#endif

CodecInit();
ApplicationInit();
Expand All @@ -523,7 +527,11 @@ bool ConfigurationSetByName(const char *Configuration) {

if (MapTextToId(ConfigurationMap, ARRAY_COUNT(ConfigurationMap), Configuration, &Id)) {
// The last configuration can only be configured as a reader
#ifdef CONFIG_ISO14443A_READER_SUPPORT
if (GlobalSettings.ActiveSettingIdx >= SETTINGS_COUNT && Id != CONFIG_ISO14443A_READER) {
#else
if (GlobalSettings.ActiveSettingIdx >= SETTINGS_COUNT) {
#endif
return false;
}
ConfigurationSetById(Id);
Expand Down
37 changes: 26 additions & 11 deletions Firmware/Chameleon-Mini/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -15,13 +15,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_VICINITY_SUPPORT
SETTINGS += -DCONFIG_SL2S2002_SUPPORT
SETTINGS += -DCONFIG_TITAGITSTANDARD_SUPPORT
SETTINGS += -DCONFIG_ISO15693_SNIFF_SUPPORT
SETTINGS += -DCONFIG_EM4233_SUPPORT
# SETTINGS += -DCONFIG_ISO14443A_SNIFF_SUPPORT
# SETTINGS += -DCONFIG_ISO14443A_READER_SUPPORT
SETTINGS += -DCONFIG_VICINITY_SUPPORT
SETTINGS += -DCONFIG_SL2S2002_SUPPORT
SETTINGS += -DCONFIG_TITAGITSTANDARD_SUPPORT
# SETTINGS += -DCONFIG_ISO15693_SNIFF_SUPPORT
SETTINGS += -DCONFIG_EM4233_SUPPORT

#Support magic mode on mifare classic configuration
SETTINGS += -DSUPPORT_MF_CLASSIC_MAGIC_MODE
Expand Down Expand Up @@ -134,6 +134,7 @@ AVRDUDE_FLAGS = -p $(AVRDUDE_MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER)
AVRDUDE_WRITE_APP_LATEST = -U application:w:Latest/Chameleon-RevG.hex
AVRDUDE_WRITE_EEPROM_LATEST = -U eeprom:w:Latest/Chameleon-RevG.eep

.PHONY: program program-latest dfu-flip dfu-prog check_size style

# Default target
all:
Expand Down Expand Up @@ -165,27 +166,41 @@ 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:
@{ \
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; \
}

style:
# Make sure astyle is installed
@which astyle >/dev/null || ( echo "Please install 'astyle' package first" ; exit 1 )
Expand Down
9 changes: 8 additions & 1 deletion Firmware/Chameleon-Mini/Memory.c
Original file line number Diff line number Diff line change
Expand Up @@ -172,10 +172,15 @@ INLINE void FRAMWrite(const void *Buffer, uint16_t Address, uint16_t ByteCount)
SPIWriteBlock(Buffer, ByteCount);

FRAM_PORT.OUTSET = FRAM_CS;

#ifdef CONFIG_ISO14443A_READER_SUPPORT
if (0 == Address && GlobalSettings.ActiveSettingPtr->Configuration != CONFIG_ISO14443A_READER) {
ConfigurationSetById(GlobalSettings.ActiveSettingPtr->Configuration);
}
#else
if (0 == Address) {
ConfigurationSetById(GlobalSettings.ActiveSettingPtr->Configuration);
}
#endif
}

INLINE void FlashRead(void *Buffer, uint32_t Address, uint16_t ByteCount) {
Expand Down Expand Up @@ -421,8 +426,10 @@ void MemoryRecall(void) {
if (GlobalSettings.ActiveSettingIdx < SETTINGS_COUNT)
FlashToFRAM((uint32_t) GlobalSettings.ActiveSettingIdx * MEMORY_SIZE_PER_SETTING, ActiveConfiguration.MemorySize);

#ifdef CONFIG_ISO14443A_READER_SUPPORT
if (GlobalSettings.ActiveSettingPtr->Configuration != CONFIG_ISO14443A_READER)
ActiveConfiguration.ApplicationInitFunc();
#endif

SystemTickClearFlag();
}
Expand Down
7 changes: 6 additions & 1 deletion Firmware/Chameleon-Mini/Settings.c
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,9 @@ SettingsType EEMEM StoredSettings = {
.PendingTaskTimeout = DEFAULT_PENDING_TASK_TIMEOUT,
.ReaderThreshold = DEFAULT_READER_THRESHOLD,
.bSakMode = 0,
},
}
#ifdef CONFIG_ISO14443A_READER_SUPPORT
,
// In the last configuration, there is no storage space. This is used as the card reader mode only
[SETTINGS_COUNT] =
{
Expand All @@ -55,6 +57,7 @@ SettingsType EEMEM StoredSettings = {
.ReaderThreshold = DEFAULT_READER_THRESHOLD,
.bSakMode = 0,
}
#endif
}
};

Expand All @@ -77,7 +80,9 @@ void SettingsLoad(void) {
GlobalSettings.Settings[i].PendingTaskTimeout = DEFAULT_PENDING_TASK_TIMEOUT;
GlobalSettings.Settings[i].ReaderThreshold = DEFAULT_READER_THRESHOLD;
}
#ifdef CONFIG_ISO14443A_READER_SUPPORT
GlobalSettings.Settings[SETTINGS_COUNT].Configuration = CONFIG_ISO14443A_READER;
#endif

SettingsSave();
}
Expand Down
4 changes: 4 additions & 0 deletions Firmware/Chameleon-Mini/Terminal/CommandLine.c
Original file line number Diff line number Diff line change
Expand Up @@ -260,6 +260,7 @@ const PROGMEM CommandEntryType CommandTable[] = {
.SetFunc = NO_FUNCTION,
.GetFunc = CommandGetSysTick
},
#ifdef CONFIG_ISO14443A_READER_SUPPORT
{
.Command = COMMAND_SEND_RAW,
.ExecFunc = NO_FUNCTION,
Expand Down Expand Up @@ -302,6 +303,7 @@ const PROGMEM CommandEntryType CommandTable[] = {
.SetFunc = NO_FUNCTION,
.GetFunc = NO_FUNCTION
},
#endif
{
.Command = COMMAND_TIMEOUT,
.ExecFunc = NO_FUNCTION,
Expand Down Expand Up @@ -330,13 +332,15 @@ const PROGMEM CommandEntryType CommandTable[] = {
.SetFunc = CommandSetField,
.GetFunc = CommandGetField
},
#ifdef CONFIG_ISO14443A_READER_SUPPORT
{
.Command = COMMAND_CLONE,
.ExecFunc = CommandExecClone,
.ExecParamFunc = NO_FUNCTION,
.SetFunc = NO_FUNCTION,
.GetFunc = NO_FUNCTION
},
#endif
{
.Command = COMMAND_SETUIDMODE,
.ExecFunc = NO_FUNCTION,
Expand Down
15 changes: 11 additions & 4 deletions Firmware/Chameleon-Mini/Terminal/Commands.c
Original file line number Diff line number Diff line change
Expand Up @@ -458,6 +458,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;
Expand Down Expand Up @@ -583,6 +584,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);
Expand Down Expand Up @@ -647,6 +649,7 @@ CommandStatusIdType CommandGetField(char *OutMessage) {


CommandStatusIdType CommandExecAutocalibrate(char *OutMessage) {
#ifdef CONFIG_ISO14443A_READER_SUPPORT
if (GlobalSettings.ActiveSettingPtr->Configuration == CONFIG_ISO14443A_READER) {
ApplicationReset();

Expand All @@ -655,19 +658,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);

Expand All @@ -680,6 +686,7 @@ CommandStatusIdType CommandExecClone(char *OutMessage) {

return TIMEOUT_COMMAND;
}
#endif

extern uint32_t dwBaudRate;
CommandStatusIdType CommandGetBaudrate(char *OutParam) {
Expand Down