Index: mx25l.c =================================================================== --- mx25l.c (revision 210201) +++ mx25l.c (working copy) @@ -50,6 +50,7 @@ const char *name; uint8_t manufacturer_id; uint16_t device_id; + uint16_t ext_id; unsigned int sectorsize; unsigned int sectorcount; }; @@ -83,10 +84,13 @@ static void mx25l_task(void *arg); struct mx25l_flash_ident flash_devices[] = { - { "mx25ll32", 0xc2, 0x2016, 64 * 1024, 64 }, - { "mx25ll64", 0xc2, 0x2017, 64 * 1024, 128 }, - { "mx25ll128", 0xc2, 0x2018, 64 * 1024, 256 }, - { "s25fl128", 0x01, 0x2018, 64 * 1024, 256 }, + { "mx25ll32", 0xc2, 0x2016, 0x0000, 64 * 1024, 64 }, + { "mx25ll64", 0xc2, 0x2017, 0x0000, 64 * 1024, 128 }, + { "mx25ll128", 0xc2, 0x2018, 0x0000, 64 * 1024, 256 }, + { "s25sl12800", 0x01, 0x2018, 0x0300, 256 * 1024, 64 }, + { "s25sl12801", 0x01, 0x2018, 0x0301, 64 * 1024, 256 }, + { "s25fl129p0", 0x01, 0x2018, 0x4d00, 256 * 1024, 64 }, + { "s25fl129p1", 0x01, 0x2018, 0x4d01, 64 * 1024, 256 }, }; static uint8_t @@ -123,7 +127,7 @@ uint8_t txBuf[8], rxBuf[8]; struct spi_command cmd; uint8_t manufacturer_id; - uint16_t dev_id; + uint16_t dev_id, ext_id; int err, i; memset(&cmd, 0, sizeof(cmd)); @@ -137,24 +141,33 @@ * Some compatible devices has extended two-bytes ID * We'll use only manufacturer/deviceid atm */ - cmd.tx_cmd_sz = 4; - cmd.rx_cmd_sz = 4; + cmd.tx_cmd_sz = 6; + cmd.rx_cmd_sz = 6; err = SPIBUS_TRANSFER(device_get_parent(dev), dev, &cmd); if (err) return (NULL); manufacturer_id = rxBuf[1]; dev_id = (rxBuf[2] << 8) | (rxBuf[3]); + ext_id = (rxBuf[4] << 8) | (rxBuf[5]); + printf("[mx25l]: [probe]: manufacturer: %02x; device %04x; ext %04x\n", + (int) manufacturer_id, dev_id, ext_id); + for (i = 0; i < sizeof(flash_devices)/sizeof(struct mx25l_flash_ident); i++) { if ((flash_devices[i].manufacturer_id == manufacturer_id) && - (flash_devices[i].device_id == dev_id)) + (flash_devices[i].device_id == dev_id)) { + /* Check ext_id only if the ident has it set to non-zero */ + if (flash_devices[i].ext_id != 0 && flash_devices[i].ext_id != ext_id) + continue; + printf("[mx25l]: found device %s\n", flash_devices[i].name); return &flash_devices[i]; + } } - printf("Unknown SPI flash device. Vendor: %02x, device id: %04x\n", - manufacturer_id, dev_id); + printf("Unknown SPI flash device. Vendor: %02x, device id: %04x, extended id %04x\n", + manufacturer_id, dev_id, ext_id); return (NULL); }