target/efm32: code cleanup

Signed-off-by: Rafael Silva <perigoso@riseup.net>
This commit is contained in:
Rafael Silva 2022-07-07 18:44:08 +01:00 committed by Rachel Mant
parent 42d36d9d10
commit 00dd7f145f
1 changed files with 38 additions and 37 deletions

View File

@ -46,8 +46,7 @@
#define STUB_BUFFER_BASE ALIGN(SRAM_BASE + sizeof(efm32_flash_write_stub), 4) #define STUB_BUFFER_BASE ALIGN(SRAM_BASE + sizeof(efm32_flash_write_stub), 4)
static int efm32_flash_erase(struct target_flash *t, target_addr addr, size_t len); static int efm32_flash_erase(struct target_flash *t, target_addr addr, size_t len);
static int efm32_flash_write(struct target_flash *f, static int efm32_flash_write(struct target_flash *f, target_addr dest, const void *src, size_t len);
target_addr dest, const void *src, size_t len);
static bool efm32_mass_erase(target *t); static bool efm32_mass_erase(target *t);
static const uint16_t efm32_flash_write_stub[] = { static const uint16_t efm32_flash_write_stub[] = {
@ -108,10 +107,10 @@ const struct command_s efm32_cmd_list[] = {
/* Lock Bits (LB) */ /* Lock Bits (LB) */
/* -------------------------------------------------------------------------- */ /* -------------------------------------------------------------------------- */
#define EFM32_LOCK_BITS_DLW (EFM32_LOCK_BITS + (4 * 127)) #define EFM32_LOCK_BITS_DLW (EFM32_LOCK_BITS + (4U * 127U))
#define EFM32_LOCK_BITS_ULW (EFM32_LOCK_BITS + (4 * 126)) #define EFM32_LOCK_BITS_ULW (EFM32_LOCK_BITS + (4U * 126U))
#define EFM32_LOCK_BITS_MLW (EFM32_LOCK_BITS + (4 * 125)) #define EFM32_LOCK_BITS_MLW (EFM32_LOCK_BITS + (4U * 125U))
#define EFM32_LOCK_BITS_CLW0 (EFM32_LOCK_BITS + (4 * 122)) #define EFM32_LOCK_BITS_CLW0 (EFM32_LOCK_BITS + (4U * 122U))
#define EFM32_CLW0_BOOTLOADER_ENABLE (1 << 1) #define EFM32_CLW0_BOOTLOADER_ENABLE (1 << 1)
#define EFM32_CLW0_PINRESETSOFT (1 << 2) #define EFM32_CLW0_PINRESETSOFT (1 << 2)
@ -373,26 +372,16 @@ efm32_v2_di_tempgrade_t const efm32_v2_di_tempgrades[] = {
/* Reads the EFM32 Extended Unique Identifier EUI64 (V1) */ /* Reads the EFM32 Extended Unique Identifier EUI64 (V1) */
static uint64_t efm32_v1_read_eui64(target *t) static uint64_t efm32_v1_read_eui64(target *t)
{ {
uint64_t eui; return ((uint64_t)target_mem_read32(t, EFM32_V1_DI_EUI64_1) << 32) | target_mem_read32(t, EFM32_V1_DI_EUI64_0);
eui = (uint64_t)target_mem_read32(t, EFM32_V1_DI_EUI64_1) << 32;
eui |= (uint64_t)target_mem_read32(t, EFM32_V1_DI_EUI64_0) << 0;
return eui;
} }
/* Reads the Unique Number (DI V2 only) */ /* Reads the Unique Number (DI V2 only) */
static uint64_t efm32_v2_read_unique(target *t, uint8_t di_version) static uint64_t efm32_v2_read_unique(target *t, uint8_t di_version)
{ {
uint64_t unique; if (di_version != 2)
switch (di_version) {
case 2:
unique = (uint64_t)target_mem_read32(t, EFM32_V2_DI_UNIQUEH) << 32;
unique |= (uint64_t)target_mem_read32(t, EFM32_V2_DI_UNIQUEL) << 0;
return unique;
default:
return 0; return 0;
}
return ((uint64_t)target_mem_read32(t, EFM32_V2_DI_UNIQUEH) << 32) | target_mem_read32(t, EFM32_V2_DI_UNIQUEL);
} }
/* Reads the EFM32 flash size in kiB */ /* Reads the EFM32 flash size in kiB */
@ -442,7 +431,7 @@ static uint32_t efm32_flash_page_size(target *t, uint8_t di_version)
return 0; return 0;
} }
return (1 << (mem_info_page_size + 10)); /* uint8_t ovf here */ return 1 << (mem_info_page_size + 10); /* uint8_t ovf here */
} }
/* Reads the EFM32 Part Number */ /* Reads the EFM32 Part Number */
@ -583,7 +572,7 @@ bool efm32_probe(target *t)
/* Read the part family, and reject if unknown */ /* Read the part family, and reject if unknown */
size_t device_index = efm32_lookup_device_index(t, di_version); size_t device_index = efm32_lookup_device_index(t, di_version);
if (device_index > (127 - 32)) { if (device_index >= (sizeof(efm32_devices) / sizeof(efm32_device_t))) {
/* unknown device family */ /* unknown device family */
return false; return false;
} }
@ -597,21 +586,21 @@ bool efm32_probe(target *t)
/* Read memory sizes, convert to bytes */ /* Read memory sizes, convert to bytes */
uint16_t flash_kib = efm32_read_flash_size(t, di_version); uint16_t flash_kib = efm32_read_flash_size(t, di_version);
uint32_t flash_size = flash_kib * 0x400; uint32_t flash_size = flash_kib * 0x400U;
uint16_t ram_kib = efm32_read_ram_size(t, di_version); uint16_t ram_kib = efm32_read_ram_size(t, di_version);
uint32_t ram_size = ram_kib * 0x400; uint32_t ram_size = ram_kib * 0x400U;
uint32_t flash_page_size = device->flash_page_size; uint32_t flash_page_size = device->flash_page_size;
struct efm32_priv_s *priv_storage = calloc(1, sizeof(*priv_storage)); struct efm32_priv_s *priv_storage = calloc(1, sizeof(*priv_storage));
t->target_storage = (void *)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", snprintf(priv_storage->efm32_variant_string, sizeof(priv_storage->efm32_variant_string), "%c\b%c\b%s %hu F%hu %s",
di_version + 48, (uint8_t)device_index + 32, device->name, part_number, flash_kib, device->description); di_version + 48, (uint8_t)device_index + 32, device->name, part_number, flash_kib, device->description);
/* Setup Target */ /* Setup Target */
t->target_options |= CORTEXM_TOPT_INHIBIT_NRST; t->target_options |= CORTEXM_TOPT_INHIBIT_NRST;
t->driver = priv_storage->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); tc_printf(t, "flash size %u page size %u\n", flash_size, flash_page_size);
target_add_ram(t, SRAM_BASE, ram_size); target_add_ram(t, SRAM_BASE, ram_size);
efm32_add_flash(t, 0x00000000, flash_size, flash_page_size); efm32_add_flash(t, 0x00000000, flash_size, flash_page_size);
@ -695,7 +684,7 @@ static int efm32_flash_write(struct target_flash *f, target_addr dest, const voi
/* Uses the MSC ERASEMAIN0/1 command to erase the entire flash */ /* Uses the MSC ERASEMAIN0/1 command to erase the entire flash */
static bool efm32_mass_erase(target *t) static bool efm32_mass_erase(target *t)
{ {
efm32_device_t const* device = efm32_get_device(t->driver[2] - 32); efm32_device_t const *device = efm32_get_device(t->driver[2] - 32);
if (device == NULL) { if (device == NULL) {
return true; return true;
} }
@ -738,10 +727,15 @@ static bool efm32_cmd_serial(target *t, int argc, const char **argv)
/* Read the eui */ /* Read the eui */
unique = efm32_v1_read_eui64(t); unique = efm32_v1_read_eui64(t);
break; break;
case 2: case 2:
/* Read unique number */ /* Read unique number */
unique = efm32_v2_read_unique(t, di_version); unique = efm32_v2_read_unique(t, di_version);
break; break;
default:
tc_printf(t, "Bad DI version %hhu! This driver doesn't know about this DI version\n", di_version);
return false;
} }
tc_printf(t, "Unique Number: 0x%016llx\n", unique); tc_printf(t, "Unique Number: 0x%016llx\n", unique);
@ -758,14 +752,16 @@ static bool efm32_cmd_efm_info(target *t, int argc, const char **argv)
switch (di_version) { switch (di_version) {
case 1: case 1:
tc_printf(t, "DI version 1 (silabs remix?) base 0x%08x\n\n", EFM32_V1_DI); tc_printf(t, "DI version 1 (silabs remix?) base 0x%08" PRIx32 "\n\n", EFM32_V1_DI);
break; break;
case 2: case 2:
tc_printf(t, "DI version 2 (energy micro remix?) base 0x%08x\n\n", EFM32_V2_DI); tc_printf(t, "DI version 2 (energy micro remix?) base 0x%08" PRIx32 "\n\n", EFM32_V2_DI);
break; break;
default: default:
tc_printf(t, "Bad DI version %d! This driver doesn't know about this DI version\n", di_version); tc_printf(t, "Bad DI version %hhu! This driver doesn't know about this DI version\n", di_version);
return true; /* finish */ return false;
} }
/* lookup device and part number */ /* lookup device and part number */
@ -781,9 +777,9 @@ static bool efm32_cmd_efm_info(target *t, int argc, const char **argv)
uint32_t flash_page_size_reported = efm32_flash_page_size(t, di_version); uint32_t flash_page_size_reported = efm32_flash_page_size(t, di_version);
uint32_t flash_page_size = device->flash_page_size; uint32_t flash_page_size = device->flash_page_size;
tc_printf(t, "%s %d F%d = %s %dkiB flash, %dkiB ram\n", device->name, part_number, flash_kib, device->description, tc_printf(t, "%s %hu F%hu = %s %hukiB flash, %hukiB ram\n", device->name, part_number, flash_kib,
flash_kib, ram_kib); device->description, flash_kib, ram_kib);
tc_printf(t, "Device says flash page size is %d bytes, we're using %d bytes\n", flash_page_size_reported, tc_printf(t, "Device says flash page size is %u bytes, we're using %u bytes\n", flash_page_size_reported,
flash_page_size); flash_page_size);
if (flash_page_size_reported < flash_page_size) { if (flash_page_size_reported < flash_page_size) {
tc_printf(t, "This is bad, flash writes may be corrupted\n"); tc_printf(t, "This is bad, flash writes may be corrupted\n");
@ -806,14 +802,14 @@ static bool efm32_cmd_efm_info(target *t, int argc, const char **argv)
} }
} }
tc_printf(t, "Package %s %d pins\n", pkgtype->name, miscchip.pincount); tc_printf(t, "Package %s %hhu pins\n", pkgtype->name, miscchip.pincount);
tc_printf(t, "Temperature grade %s\n", tempgrade->name); tc_printf(t, "Temperature grade %s\n", tempgrade->name);
tc_printf(t, "\n"); tc_printf(t, "\n");
} }
if (di_version == 1 && device->has_radio) { if (di_version == 1 && device->has_radio) {
uint16_t radio_number = efm32_read_radio_part_number(t, di_version); /* on-chip radio */ uint16_t radio_number = efm32_read_radio_part_number(t, di_version); /* on-chip radio */
tc_printf(t, "Radio si%d\n", radio_number); tc_printf(t, "Radio si%hu\n", radio_number);
tc_printf(t, "\n"); tc_printf(t, "\n");
} }
@ -937,7 +933,12 @@ void efm32_aap_probe(ADIv5_AP_t *ap)
/* New target */ /* New target */
target *t = target_new(); target *t = target_new();
if (!t) {
return;
}
t->mass_erase = efm32_aap_mass_erase; t->mass_erase = efm32_aap_mass_erase;
adiv5_ap_ref(ap); adiv5_ap_ref(ap);
t->priv = ap; t->priv = ap;
t->priv_free = (void *)adiv5_ap_unref; t->priv_free = (void *)adiv5_ap_unref;
@ -946,7 +947,7 @@ void efm32_aap_probe(ADIv5_AP_t *ap)
DEBUG_INFO("EFM32: AAP STATUS=%08" PRIx32 "\n", adiv5_ap_read(ap, AAP_STATUS)); DEBUG_INFO("EFM32: AAP STATUS=%08" PRIx32 "\n", adiv5_ap_read(ap, AAP_STATUS));
struct efm32_aap_priv_s *priv_storage = calloc(1, sizeof(*priv_storage)); 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); sprintf(priv_storage->aap_driver_string, "EFM32 Authentication Access Port rev.%hu", aap_revision);
t->driver = priv_storage->aap_driver_string; t->driver = priv_storage->aap_driver_string;
t->regs_size = 4; t->regs_size = 4;
} }