diff --git a/application.c b/application.c index 499ec8b..95a76ec 100644 --- a/application.c +++ b/application.c @@ -193,54 +193,125 @@ static void command_version(void* argument) { (void)argument; // we won't use the argument printf("firmware date: %04u-%02u-%02u\n", BUILD_YEAR, BUILD_MONTH, BUILD_DAY); // show firmware build date - puts("device family: "); + puts("chip family: "); switch (DBGMCU_IDCODE & DBGMCU_IDCODE_DEV_ID_MASK) { case 0: // DBGMCU_IDCODE is only accessible in debug mode (this is a known issue documented in STM32F10xxC/D/E Errata sheet, without workaround) if ((*(uint32_t*)0x1FFFF000 & 0xFFFE0000) == 0x20000000) { // non-connectivity system memory start detected (MSP address pointing to SRAM switch (DESIG_FLASH_SIZE) { case 16: case 32: - puts("low-density\n"); + puts("low-density"); break; case 64: case 128: - puts("medium-density\n"); + puts("medium-density"); break; case 256: case 512: - puts("high-density\n"); + puts("high-density"); break; case 768: case 1024: - puts("XL-density\n"); + puts("XL-density"); break; default: - printf("unknown\n"); + printf("unknown"); break; } } else { // connectivity system memory start is at 0x1FFFB000 - puts("connectivity\n"); + puts("connectivity"); } break; case 0x412: - puts("low-density\n"); + puts("low-density"); break; case 0x410: - puts("medium-density\n"); + puts("medium-density"); break; case 0x414: - puts("high-density\n"); + puts("high-density"); break; case 0x430: - puts("XL-density\n"); + puts("XL-density"); break; case 0x418: - puts("connectivity\n"); + puts("connectivity"); + break; + case 0x444: + puts("STM32F03x"); + break; + case 0x445: + puts("STM32F04x"); + break; + case 0x440: + puts("STM32F05x"); + break; + case 0x448: + puts("STM32F07x"); + break; + case 0x442: + puts("STM32F09x"); break; default: - printf("unknown (0x%04x)\n", DBGMCU_IDCODE & DBGMCU_IDCODE_DEV_ID_MASK); + puts("unknown"); break; } + printf(" (DEV_ID=0x%04x)\n", DBGMCU_IDCODE & DBGMCU_IDCODE_DEV_ID_MASK); + puts("chip revision: "); + const uint16_t rev_id = DBGMCU_IDCODE >> 16; + switch (DBGMCU_IDCODE & DBGMCU_IDCODE_DEV_ID_MASK) { + case 0x412: + if (0x1000 == rev_id) { + putc('A'); + } else { + puts("unknown"); + } + break; + case 0x410: + if (0x0000 == rev_id) { + putc('A'); + } else if (0x2000 == rev_id) { + putc('B'); + } else if (0x2001 == rev_id) { + putc('Z'); + } else if (0x2003 == rev_id) { + puts("1/2/3/X/Y"); + } else { + puts("unknown"); + } + break; + case 0x414: + if (0x1000 == rev_id) { + puts("A/1"); + } else if (0x1001 == rev_id) { + putc('Z'); + } else if (0x1003 == rev_id) { + puts("1/2/3/X/Y"); + } else { + puts("unknown"); + } + break; + case 0x430: + if (0x1003 == rev_id) { + puts("A/1"); + } else { + puts("unknown"); + } + break; + case 0x418: + if (0x1000 == rev_id) { + putc('A'); + } else if (0x1001 == rev_id) { + putc('Z'); + } else { + puts("unknown"); + } + break; + default: + printf("unknown"); + break; + } + printf(" (REV_ID=0x%04x)\n", rev_id); // show flash size puts("flash size: "); if (0xffff == DESIG_FLASH_SIZE) { @@ -249,7 +320,11 @@ static void command_version(void* argument) printf("%u KB\n", DESIG_FLASH_SIZE); } // display device identity - printf("device id: %08x%08x%08x\n", DESIG_UNIQUE_ID0, DESIG_UNIQUE_ID1, DESIG_UNIQUE_ID2); + printf("device id: %08x%08x%04x%04x\n", DESIG_UNIQUE_ID2, DESIG_UNIQUE_ID1, DESIG_UNIQUE_ID0 & 0xffff, DESIG_UNIQUE_ID0 >> 16); + // from RM0091 STM32F0x8 reference manual + printf("- X,Y wafer coordinate: %08x\n", DESIG_UNIQUE_ID0); + printf("- lot number: %c%c%c%c%c%c%c\n", DESIG_UNIQUE_ID2 >> 24, DESIG_UNIQUE_ID2 >> 16, DESIG_UNIQUE_ID2 >> 8, DESIG_UNIQUE_ID2 >> 0, DESIG_UNIQUE_ID1 >> 24, DESIG_UNIQUE_ID1 >> 16, DESIG_UNIQUE_ID1 >> 8); + printf("- wafer number: %u\n", DESIG_UNIQUE_ID1 & 0xff); } static void command_uptime(void* argument)