| Markus Boas | d2ac6fc | 2007-08-30 10:17:50 +0000 | [diff] [blame] | 1 | /* |
| 2 | * This file is part of the flashrom project. |
| 3 | * |
| 4 | * Copyright (C) 2007 Markus Boas <ryven@ryven.de> |
| 5 | * |
| 6 | * This program is free software; you can redistribute it and/or modify |
| 7 | * it under the terms of the GNU General Public License as published by |
| 8 | * the Free Software Foundation; either version 2 of the License, or |
| 9 | * (at your option) any later version. |
| 10 | * |
| 11 | * This program is distributed in the hope that it will be useful, |
| 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| 14 | * GNU General Public License for more details. |
| Markus Boas | d2ac6fc | 2007-08-30 10:17:50 +0000 | [diff] [blame] | 15 | */ |
| 16 | |
| Nico Huber | 2cadbe3 | 2026-03-05 18:34:57 +0100 | [diff] [blame] | 17 | #include <stdint.h> |
| 18 | |
| 19 | #include "programmer.h" |
| Nico Huber | 10337f7 | 2026-03-04 19:57:27 +0100 | [diff] [blame] | 20 | #include "chipdrivers/memory_bus.h" |
| Markus Boas | d2ac6fc | 2007-08-30 10:17:50 +0000 | [diff] [blame] | 21 | |
| Carl-Daniel Hailfinger | 2e88a9f | 2011-07-26 14:18:52 +0000 | [diff] [blame] | 22 | /* According to the Winbond W29EE011, W29EE012, W29C010M, W29C011A |
| 23 | * datasheets this is the only valid probe function for those chips. |
| 24 | */ |
| Nico Huber | 2cadbe3 | 2026-03-05 18:34:57 +0100 | [diff] [blame] | 25 | struct found_id *probe_w29ee011(const struct bus_probe *probe, |
| 26 | const struct master_common *mst, |
| 27 | const struct flashchip *chip) |
| Markus Boas | d2ac6fc | 2007-08-30 10:17:50 +0000 | [diff] [blame] | 28 | { |
| Nico Huber | 2cadbe3 | 2026-03-05 18:34:57 +0100 | [diff] [blame] | 29 | const struct par_master *const par = (const struct par_master *)mst; |
| 30 | const chipsize_t chip_size = chip ? chip->total_size * KiB : 128*KiB; |
| 31 | uint8_t raw[2]; |
| Jens Kuehnel | b9f6174 | 2008-06-18 13:36:34 +0000 | [diff] [blame] | 32 | |
| Nico Huber | 2cadbe3 | 2026-03-05 18:34:57 +0100 | [diff] [blame] | 33 | const chipaddr bios = (chipaddr)programmer_map_flash_data(par, chip_size, ""); |
| 34 | if (bios == (chipaddr)ERROR_PTR) |
| 35 | return NULL; |
| Markus Boas | d2ac6fc | 2007-08-30 10:17:50 +0000 | [diff] [blame] | 36 | |
| 37 | /* Issue JEDEC Product ID Entry command */ |
| Nico Huber | 2cadbe3 | 2026-03-05 18:34:57 +0100 | [diff] [blame] | 38 | par->chip_writeb(par, 0xAA, bios + 0x5555); |
| Carl-Daniel Hailfinger | ca8bfc6 | 2009-06-05 17:48:08 +0000 | [diff] [blame] | 39 | programmer_delay(10); |
| Nico Huber | 2cadbe3 | 2026-03-05 18:34:57 +0100 | [diff] [blame] | 40 | par->chip_writeb(par, 0x55, bios + 0x2AAA); |
| Carl-Daniel Hailfinger | ca8bfc6 | 2009-06-05 17:48:08 +0000 | [diff] [blame] | 41 | programmer_delay(10); |
| Nico Huber | 2cadbe3 | 2026-03-05 18:34:57 +0100 | [diff] [blame] | 42 | par->chip_writeb(par, 0x80, bios + 0x5555); |
| Carl-Daniel Hailfinger | ca8bfc6 | 2009-06-05 17:48:08 +0000 | [diff] [blame] | 43 | programmer_delay(10); |
| Nico Huber | 2cadbe3 | 2026-03-05 18:34:57 +0100 | [diff] [blame] | 44 | par->chip_writeb(par, 0xAA, bios + 0x5555); |
| Carl-Daniel Hailfinger | ca8bfc6 | 2009-06-05 17:48:08 +0000 | [diff] [blame] | 45 | programmer_delay(10); |
| Nico Huber | 2cadbe3 | 2026-03-05 18:34:57 +0100 | [diff] [blame] | 46 | par->chip_writeb(par, 0x55, bios + 0x2AAA); |
| Carl-Daniel Hailfinger | ca8bfc6 | 2009-06-05 17:48:08 +0000 | [diff] [blame] | 47 | programmer_delay(10); |
| Nico Huber | 2cadbe3 | 2026-03-05 18:34:57 +0100 | [diff] [blame] | 48 | par->chip_writeb(par, 0x60, bios + 0x5555); |
| Carl-Daniel Hailfinger | ca8bfc6 | 2009-06-05 17:48:08 +0000 | [diff] [blame] | 49 | programmer_delay(10); |
| Markus Boas | d2ac6fc | 2007-08-30 10:17:50 +0000 | [diff] [blame] | 50 | |
| 51 | /* Read product ID */ |
| Nico Huber | 2cadbe3 | 2026-03-05 18:34:57 +0100 | [diff] [blame] | 52 | raw[0] = par->chip_readb(par, bios); |
| 53 | raw[1] = par->chip_readb(par, bios + 0x01); |
| Markus Boas | d2ac6fc | 2007-08-30 10:17:50 +0000 | [diff] [blame] | 54 | |
| 55 | /* Issue JEDEC Product ID Exit command */ |
| Nico Huber | 2cadbe3 | 2026-03-05 18:34:57 +0100 | [diff] [blame] | 56 | par->chip_writeb(par, 0xAA, bios + 0x5555); |
| Carl-Daniel Hailfinger | ca8bfc6 | 2009-06-05 17:48:08 +0000 | [diff] [blame] | 57 | programmer_delay(10); |
| Nico Huber | 2cadbe3 | 2026-03-05 18:34:57 +0100 | [diff] [blame] | 58 | par->chip_writeb(par, 0x55, bios + 0x2AAA); |
| Carl-Daniel Hailfinger | ca8bfc6 | 2009-06-05 17:48:08 +0000 | [diff] [blame] | 59 | programmer_delay(10); |
| Nico Huber | 2cadbe3 | 2026-03-05 18:34:57 +0100 | [diff] [blame] | 60 | par->chip_writeb(par, 0xF0, bios + 0x5555); |
| Carl-Daniel Hailfinger | ca8bfc6 | 2009-06-05 17:48:08 +0000 | [diff] [blame] | 61 | programmer_delay(10); |
| Markus Boas | d2ac6fc | 2007-08-30 10:17:50 +0000 | [diff] [blame] | 62 | |
| Nico Huber | 2cadbe3 | 2026-03-05 18:34:57 +0100 | [diff] [blame] | 63 | programmer_unmap_flash_region(par, (void *)bios, chip_size); |
| Markus Boas | d2ac6fc | 2007-08-30 10:17:50 +0000 | [diff] [blame] | 64 | |
| Nico Huber | 2cadbe3 | 2026-03-05 18:34:57 +0100 | [diff] [blame] | 65 | if (flashprog_no_data(raw, sizeof(raw))) |
| 66 | return NULL; |
| Markus Boas | d2ac6fc | 2007-08-30 10:17:50 +0000 | [diff] [blame] | 67 | |
| Nico Huber | 2cadbe3 | 2026-03-05 18:34:57 +0100 | [diff] [blame] | 68 | msg_cdbg("%s (%uKiB): id1 0x%02x, id2 0x%02x\n", |
| 69 | __func__, chip_size / KiB, raw[0], raw[1]); |
| 70 | |
| 71 | struct memory_found_id *const found = alloc_memory_found_id(); |
| 72 | if (!found) { |
| 73 | msg_cerr("Out of memory!\n"); |
| 74 | return NULL; |
| 75 | } |
| 76 | |
| 77 | found->generic.info.id.manufacture = raw[0]; |
| 78 | found->generic.info.id.model = raw[1]; |
| 79 | found->generic.info.id.type = ID_W29EE011; |
| 80 | found->memory_info.chip_size = chip_size; |
| 81 | found->memory_info.chip_features = 0; |
| 82 | |
| 83 | return &found->generic; |
| Markus Boas | d2ac6fc | 2007-08-30 10:17:50 +0000 | [diff] [blame] | 84 | } |