diff --git a/common_arm/flashmem.c b/common_arm/flashmem.c index a81576c5f..eae8f3bef 100644 --- a/common_arm/flashmem.c +++ b/common_arm/flashmem.c @@ -49,9 +49,9 @@ void FlashmemSetSpiBaudrate(uint32_t baudrate) { } // read ID out -uint8_t Flash_ReadID(void) { +bool Flash_ReadID_90(flash_device_type_90_t* result) { - if (Flash_CheckBusy(BUSY_TIMEOUT)) return 0; + if (Flash_CheckBusy(BUSY_TIMEOUT)) return false; // Manufacture ID / device ID FlashSendByte(ID); @@ -59,15 +59,10 @@ uint8_t Flash_ReadID(void) { FlashSendByte(0x00); FlashSendByte(0x00); - uint8_t man_id = FlashSendByte(0xFF); - uint8_t dev_id = FlashSendLastByte(0xFF); + result->manufacturer_id = FlashSendByte(0xFF); + result->device_id = FlashSendLastByte(0xFF); - if (g_dbglevel > 3) Dbprintf("Flash ReadID | Man ID %02x | Device ID %02x", man_id, dev_id); - - if ((man_id == WINBOND_MANID) && (dev_id == WINBOND_DEVID)) - return dev_id; - - return 0; + return true; } uint16_t Flash_ReadData(uint32_t address, uint8_t *out, uint16_t len) { @@ -349,29 +344,32 @@ void Flashmem_print_status(void) { } DbpString(" Init.................... " _GREEN_("OK")); - uint8_t dev_id = Flash_ReadID(); - switch (dev_id) { - case 0x11 : - DbpString(" Memory size............. " _YELLOW_("2 mbits / 256 kb")); - break; - case 0x10 : - DbpString(" Memory size..... ....... " _YELLOW_("1 mbits / 128 kb")); - break; - case 0x05 : - DbpString(" Memory size............. " _YELLOW_("512 kbits / 64 kb")); - break; - default : - DbpString(" Device ID............... " _YELLOW_(" --> Unknown <--")); - break; + // NOTE: It would likely be more useful to use JDEC ID command 9F, + // as it provides a third byte indicative of capacity. + flash_device_type_90_t device_type = {0}; + if (!Flash_ReadID_90(&device_type)) { + DbpString(" Device ID............... " _RED_(" --> Not Found <--")); + } else { + if ((device_type.manufacturer_id == WINBOND_MANID) && (device_type.device_id == WINBOND_DEVID)) { + DbpString(" Memory size............. " _GREEN_("2 mbits / 256 kb")); + } else { + Dbprintf(" Device ID............... " _YELLOW_("%02X / %02X (unknown)"), + device_type.manufacturer_id, device_type.device_id ); + } } uint8_t uid[8] = {0, 0, 0, 0, 0, 0, 0, 0}; Flash_UniqueID(uid); - Dbprintf(" Unique ID............... " _YELLOW_("0x%02X%02X%02X%02X%02X%02X%02X%02X"), - uid[7], uid[6], uid[5], uid[4], - uid[3], uid[2], uid[1], uid[0] + Dbprintf(" Unique ID (be).......... " _YELLOW_("0x%02X%02X%02X%02X%02X%02X%02X%02X" ), + uid[0], uid[1], uid[2], uid[3], + uid[4], uid[5], uid[6], uid[7] ); - + if (g_dbglevel > 3) { + Dbprintf(" Unique ID (le).......... " _YELLOW_("0x%02X%02X%02X%02X%02X%02X%02X%02X" ), + uid[7], uid[6], uid[5], uid[4], + uid[3], uid[2], uid[1], uid[0] + ); + } FlashStop(); } diff --git a/common_arm/flashmem.h b/common_arm/flashmem.h index b2456ac76..72cc3e8b7 100644 --- a/common_arm/flashmem.h +++ b/common_arm/flashmem.h @@ -123,7 +123,12 @@ bool Flash_Erase4k(uint8_t block, uint8_t sector); //bool Flash_Erase32k(uint32_t address); bool Flash_Erase64k(uint8_t block); -uint8_t Flash_ReadID(void); +typedef struct { + uint8_t manufacturer_id; + uint8_t device_id; +} flash_device_type_90_t; // to differentiate from JDEC ID via cmd 9F +bool Flash_ReadID_90(flash_device_type_90_t* result); + uint16_t Flash_ReadData(uint32_t address, uint8_t *out, uint16_t len); uint16_t Flash_ReadDataCont(uint32_t address, uint8_t *out, uint16_t len); uint16_t Flash_Write(uint32_t address, uint8_t *in, uint16_t len); diff --git a/common_arm/usb_cdc.c b/common_arm/usb_cdc.c index 8a17c4f89..6e758c8aa 100644 --- a/common_arm/usb_cdc.c +++ b/common_arm/usb_cdc.c @@ -413,8 +413,8 @@ void usb_update_serial(uint64_t newSerialNumber) { uint8_t nibble2 = (newSerialNumber >> ((8 * i) + 0)) & 0xFu; // bitmasks [0x0F, 0x0F00, 0x0F0000, ... 0x0F00000000000000] char c1 = nibble1 < 10 ? '0' + nibble1 : 'A' + (nibble1 - 10); char c2 = nibble2 < 10 ? '0' + nibble2 : 'A' + (nibble2 - 10); - StrSerialNumber[46 - (4 * i)] = c1; // [ 46, 42, .., 22, 18 ] - StrSerialNumber[48 - (4 * i)] = c2; // [ 48, 44, .., 24, 20 ] + StrSerialNumber[18 + (4*i) + 0] = c1; // [ 18, 22, .., 42, 46 ] + StrSerialNumber[18 + (4*i) + 2] = c2; // [ 20, 24, .., 44, 48 ] } StrSerialNumber[0] = USB_STRING_DESCRIPTOR_SERIAL_NUMBER_LENGTH; }