diff --git a/lib/swd.c b/lib/swd.c index e227be0..fe16e7b 100644 --- a/lib/swd.c +++ b/lib/swd.c @@ -340,33 +340,81 @@ const char *swd_jep106_manufacturer(uint8_t bank, uint8_t id) static const struct swd_partno_s { uint16_t designer; - uint8_t partno; + uint16_t partno; + uint16_t partno_mask; const char* name; } swd_partno[] = { // based on https://developer.arm.com/docs/103489943/latest/what-is-the-id-code-of-a-cortex-m0-dap-or-cortex-m0-dap { .designer = 0x23B, // ARM - .partno = 0xBA, + .partno = 0xBA00, + .partno_mask = 0xFF00, .name = "CM3DAP", // used in Cortex-M3 and Cortex-M4 }, { .designer = 0x23B, // ARM - .partno = 0xBB, + .partno = 0xBB00, + .partno_mask = 0xFF00, .name = "CM0DAP", // used in Cortex-M0 }, { .designer = 0x23B, // ARM - .partno = 0xBC, + .partno = 0xBC00, + .partno_mask = 0xFF00, .name = "CM0PDAP", // used in Cortex-M0+ }, + // based on RM0008 Reference manual, STM32F101xx, STM32F102xx, STM32F103xx, STM32F105xx and STM32F107xx advanced ArmĀ®-based 32-bit MCUs + { + .designer = 0x020, // ST + .partno = 0x6412, + .partno_mask = 0xFFFF, + .name = "STM32F10xxx low-density", + }, + { + .designer = 0x020, // ST + .partno = 0x6410, + .partno_mask = 0xFFFF, + .name = "STM32F10xxx medium-density", + }, + { + .designer = 0x020, // ST + .partno = 0x6414, + .partno_mask = 0xFFFF, + .name = "STM32F10xxx high-density", + }, + { + .designer = 0x020, // ST + .partno = 0x6430, + .partno_mask = 0xFFFF, + .name = "STM32F10xxx XL-density", + }, + { + .designer = 0x020, // ST + .partno = 0x6418, + .partno_mask = 0xFFFF, + .name = "STM32F10xxx connectivity line", + }, + // based on RM0368 Reference manual, STM32F401xB/C and STM32F401xD/E advanced ArmĀ®-based 32-bit MCUs + { + .designer = 0x020, // ST + .partno = 0x6423, + .partno_mask = 0xFFFF, + .name = "STM32F401xB/C", + }, + { + .designer = 0x020, // ST + .partno = 0x6433, + .partno_mask = 0xFFFF, + .name = "STM32F401xD/E", + }, }; -const char* swd_dpidr_partno(uint16_t designer, uint8_t partno) +const char* swd_dpidr_partno(uint16_t designer, uint16_t partno) { uint32_t i = 0; // swd_partno index // find matching part number for (i = 0; i < LENGTH(swd_partno); i++) { - if (designer == swd_partno[i].designer && partno == swd_partno[i].partno) { + if (designer == swd_partno[i].designer && ((partno & swd_partno[i].partno_mask) == swd_partno[i].partno)) { break; } } diff --git a/lib/swd.h b/lib/swd.h index e306582..097dfcd 100644 --- a/lib/swd.h +++ b/lib/swd.h @@ -199,9 +199,9 @@ uint64_t swd_transaction(uint64_t output, uint8_t bit_count, bool write); const char* swd_jep106_manufacturer(uint8_t bank, uint8_t id); /** get DAP name corresponding to the DPIDR part number - * @param[in] designer DESIGNER value - * @param[in] partno DPIDR part number + * @param[in] designer DESIGNER value (bits 1-11 in DPIDR/IDCODE) + * @param[in] partno PARTNO part number bits 12-27 in DPIDR/IDCODE) * @return DAP name */ -const char* swd_dpidr_partno(uint16_t designer, uint8_t partno); +const char* swd_dpidr_partno(uint16_t designer, uint16_t partno);