diff --git a/src/target/efm32.c b/src/target/efm32.c index f821878..6ad4f32 100644 --- a/src/target/efm32.c +++ b/src/target/efm32.c @@ -584,7 +584,10 @@ static efm32_device_t const * efm32_get_device(size_t index) /** * Probe */ -static char efm32_variant_string[60]; +struct efm32_priv_s { + char efm32_variant_string[60]; +}; + bool efm32_probe(target *t) { uint8_t di_version = 1; @@ -636,13 +639,17 @@ bool efm32_probe(target *t) uint32_t ram_size = ram_kib * 0x400; uint32_t flash_page_size = device->flash_page_size; - snprintf(efm32_variant_string, sizeof(efm32_variant_string), "%c\b%c\b%s %d F%d %s", + struct efm32_priv_s *priv_storage = calloc(1, sizeof(*priv_storage)); + t->target_storage = (void*)priv_storage; + + snprintf(priv_storage->efm32_variant_string, + sizeof(priv_storage->efm32_variant_string), "%c\b%c\b%s %d F%d %s", di_version + 48, (uint8_t)device_index + 32, device->name, part_number, flash_kib, device->description); /* Setup Target */ t->target_options |= CORTEXM_TOPT_INHIBIT_SRST; - t->driver = efm32_variant_string; + t->driver = priv_storage->efm32_variant_string; tc_printf(t, "flash size %d page size %d\n", flash_size, flash_page_size); target_add_ram (t, SRAM_BASE, ram_size); efm32_add_flash(t, 0x00000000, flash_size, flash_page_size); @@ -980,7 +987,10 @@ static bool nop_function(void) /** * AAP Probe */ -char aap_driver_string[42]; +struct efm32_aap_priv_s { + char aap_driver_string[42]; +}; + void efm32_aap_probe(ADIv5_AP_t *ap) { if ((ap->idr & EFM32_APP_IDR_MASK) == EFM32_AAP_IDR) { @@ -1004,10 +1014,11 @@ void efm32_aap_probe(ADIv5_AP_t *ap) /* Read status */ DEBUG_INFO("EFM32: AAP STATUS=%08"PRIx32"\n", adiv5_ap_read(ap, AAP_STATUS)); - sprintf(aap_driver_string, + struct efm32_aap_priv_s *priv_storage = calloc(1, sizeof(*priv_storage)); + sprintf(priv_storage->aap_driver_string, "EFM32 Authentication Access Port rev.%d", aap_revision); - t->driver = aap_driver_string; + t->driver = priv_storage->aap_driver_string; t->attach = (void*)nop_function; t->detach = (void*)nop_function; t->check_error = (void*)nop_function; diff --git a/src/target/samd.c b/src/target/samd.c index 525a43b..02879fb 100644 --- a/src/target/samd.c +++ b/src/target/samd.c @@ -441,7 +441,10 @@ static void samd_add_flash(target *t, uint32_t addr, size_t length) target_add_flash(t, f); } -static char samd_variant_string[60]; +struct samd_priv_s { + char samd_variant_string[60]; +}; + bool samd_probe(target *t) { ADIv5_AP_t *ap = cortexm_ap(t); @@ -460,6 +463,9 @@ bool samd_probe(target *t) if ((did & SAMD_DID_MASK) != SAMD_DID_CONST_VALUE) return false; + struct samd_priv_s *priv_storage = calloc(1, sizeof(*priv_storage)); + t->target_storage = (void*)priv_storage; + uint32_t ctrlstat = target_mem_read32(t, SAMD_DSU_CTRLSTAT); struct samd_descr samd = samd_parse_device_id(did); @@ -468,14 +474,14 @@ bool samd_probe(target *t) /* Part String */ if (protected) { - sprintf(samd_variant_string, + sprintf(priv_storage->samd_variant_string, "Atmel SAM%c%d%c%d%c%s (rev %c) (PROT=1)", samd.family, samd.series, samd.pin, samd.mem, samd.variant, samd.package, samd.revision); } else { - sprintf(samd_variant_string, + sprintf(priv_storage->samd_variant_string, "Atmel SAM%c%d%c%d%c%s (rev %c)", samd.family, samd.series, samd.pin, samd.mem, @@ -484,7 +490,7 @@ bool samd_probe(target *t) } /* Setup Target */ - t->driver = samd_variant_string; + t->driver = priv_storage->samd_variant_string; t->reset = samd_reset; if (samd.series == 20 && samd.revision == 'B') { diff --git a/src/target/samx5x.c b/src/target/samx5x.c index 4569ae4..d0abff6 100644 --- a/src/target/samx5x.c +++ b/src/target/samx5x.c @@ -344,7 +344,10 @@ static void samx5x_add_flash(target *t, uint32_t addr, size_t length, target_add_flash(t, f); } -static char samx5x_variant_string[60]; +struct samx5x_priv_s { + char samx5x_variant_string[60]; +}; + bool samx5x_probe(target *t) { ADIv5_AP_t *ap = cortexm_ap(t); @@ -370,20 +373,25 @@ bool samx5x_probe(target *t) bool protected = (ctrlstat & SAMX5X_STATUSB_PROT); /* Part String */ + struct samx5x_priv_s *priv_storage = calloc(1, sizeof(*priv_storage)); + t->target_storage = (void*)priv_storage; + if (protected) { - snprintf(samx5x_variant_string, sizeof(samx5x_variant_string), + snprintf(priv_storage->samx5x_variant_string, + sizeof(priv_storage->samx5x_variant_string), "Microchip SAM%c%d%c%dA (rev %c) (PROT=1)", samx5x.series_letter, samx5x.series_number, samx5x.pin, samx5x.mem, samx5x.revision); } else { - snprintf(samx5x_variant_string, sizeof(samx5x_variant_string), + snprintf(priv_storage->samx5x_variant_string, + sizeof(priv_storage->samx5x_variant_string), "Microchip SAM%c%d%c%dA (rev %c)", samx5x.series_letter, samx5x.series_number, samx5x.pin, samx5x.mem, samx5x.revision); } /* Setup Target */ - t->driver = samx5x_variant_string; + t->driver = priv_storage->samx5x_variant_string; t->reset = samx5x_reset; if (protected) {