flashrom: Use helper functions to access flash chips.
[coreboot.git] / util / flashrom / w29ee011.c
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.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
19  */
20
21 #include <string.h>
22 #include "flash.h"
23
24 int probe_w29ee011(struct flashchip *flash)
25 {
26         volatile uint8_t *bios = flash->virtual_memory;
27         uint8_t id1, id2;
28         extern char *chip_to_probe;
29
30         if (!chip_to_probe || strcmp(chip_to_probe, "W29EE011")) {
31                 printf_debug("\n===\n");
32                 printf_debug("  Probing disabled for Winbond W29EE011 because the probing sequence puts the\n");
33                 printf_debug("  AMIC A49LF040A in a funky state.\n");
34                 printf_debug("  Use 'flashrom -c W29EE011' if you have a board with this chip.");
35                 printf_debug("\n===\n");
36                 return 0;
37         }
38
39         /* Issue JEDEC Product ID Entry command */
40         writeb(0xAA, bios + 0x5555);
41         myusec_delay(10);
42         writeb(0x55, bios + 0x2AAA);
43         myusec_delay(10);
44         writeb(0x80, bios + 0x5555);
45         myusec_delay(10);
46         writeb(0xAA, bios + 0x5555);
47         myusec_delay(10);
48         writeb(0x55, bios + 0x2AAA);
49         myusec_delay(10);
50         writeb(0x60, bios + 0x5555);
51         myusec_delay(10);
52
53         /* Read product ID */
54         id1 = readb(bios);
55         id2 = readb(bios + 0x01);
56
57         /* Issue JEDEC Product ID Exit command */
58         writeb(0xAA, bios + 0x5555);
59         myusec_delay(10);
60         writeb(0x55, bios + 0x2AAA);
61         myusec_delay(10);
62         writeb(0xF0, bios + 0x5555);
63         myusec_delay(10);
64
65         printf_debug("%s: id1 0x%02x, id2 0x%02x\n", __FUNCTION__, id1, id2);
66
67         if (id1 == flash->manufacture_id && id2 == flash->model_id)
68                 return 1;
69
70         return 0;
71 }