swd: improve part number decoding

This commit is contained in:
King Kévin 2021-03-16 12:15:35 +01:00
parent 66521e1981
commit 99d66f4e4e
2 changed files with 57 additions and 9 deletions

View File

@ -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;
}
}

View File

@ -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);