Fixed the typo should indeed be a 0x2e.
[coreboot.git] / util / flashrom / mx29f002.c
1 /*
2  * This file is part of the flashrom project.
3  *
4  * Copyright (C) 2000 Silicon Integrated System Corporation
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 <stdio.h>
22 #include <stdint.h>
23 #include "flash.h"
24
25 int probe_29f002(struct flashchip *flash)
26 {
27         volatile uint8_t *bios = flash->virtual_memory;
28         uint8_t id1, id2;
29
30         chip_writeb(0xAA, bios + 0x5555);
31         chip_writeb(0x55, bios + 0x2AAA);
32         chip_writeb(0x90, bios + 0x5555);
33
34         id1 = chip_readb(bios);
35         id2 = chip_readb(bios + 0x01);
36
37         chip_writeb(0xF0, bios);
38
39         myusec_delay(10);
40
41         printf_debug("%s: id1 0x%02x, id2 0x%02x\n", __FUNCTION__, id1, id2);
42         if (id1 == flash->manufacture_id && id2 == flash->model_id)
43                 return 1;
44
45         return 0;
46 }
47
48 int erase_29f002(struct flashchip *flash)
49 {
50         volatile uint8_t *bios = flash->virtual_memory;
51
52         chip_writeb(0xF0, bios + 0x555);
53         chip_writeb(0xAA, bios + 0x555);
54         chip_writeb(0x55, bios + 0x2AA);
55         chip_writeb(0x80, bios + 0x555);
56         chip_writeb(0xAA, bios + 0x555);
57         chip_writeb(0x55, bios + 0x2AA);
58         chip_writeb(0x10, bios + 0x555);
59
60         myusec_delay(100);
61         toggle_ready_jedec(bios);
62
63         //   while ((*bios & 0x40) != 0x40)
64         //;
65
66 #if 0
67         toggle_ready_jedec(bios);
68         chip_writeb(0x30, bios + 0x0ffff);
69         chip_writeb(0x30, bios + 0x1ffff);
70         chip_writeb(0x30, bios + 0x2ffff);
71         chip_writeb(0x30, bios + 0x37fff);
72         chip_writeb(0x30, bios + 0x39fff);
73         chip_writeb(0x30, bios + 0x3bfff);
74 #endif
75
76         return 0;
77 }
78
79 int write_29f002(struct flashchip *flash, uint8_t *buf)
80 {
81         int i;
82         int total_size = flash->total_size * 1024;
83         volatile uint8_t *bios = flash->virtual_memory;
84         volatile uint8_t *dst = bios;
85
86         chip_writeb(0xF0, bios);
87         myusec_delay(10);
88         erase_29f002(flash);
89         //*bios = 0xF0;
90 #if 1
91         printf("Programming page: ");
92         for (i = 0; i < total_size; i++) {
93                 /* write to the sector */
94                 if ((i & 0xfff) == 0)
95                         printf("address: 0x%08lx", (unsigned long)i);
96                 chip_writeb(0xAA, bios + 0x5555);
97                 chip_writeb(0x55, bios + 0x2AAA);
98                 chip_writeb(0xA0, bios + 0x5555);
99                 chip_writeb(*buf++, dst++);
100
101                 /* wait for Toggle bit ready */
102                 toggle_ready_jedec(dst);
103
104                 if ((i & 0xfff) == 0)
105                         printf("\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b");
106         }
107 #endif
108         printf("\n");
109
110         return 0;
111 }