Removing $Id$ tags as they have no meaning in SVN
[coreboot.git] / util / flashrom / mx29f002.c
1 /*
2  * mx29f002.c: driver for MXIC MX29F002 flash models
3  *
4  *
5  * Copyright 2000 Silicon Integrated System Corporation
6  *
7  *      This program is free software; you can redistribute it and/or modify
8  *      it under the terms of the GNU General Public License as published by
9  *      the Free Software Foundation; either version 2 of the License, or
10  *      (at your option) any later version.
11  *
12  *      This program is distributed in the hope that it will be useful,
13  *      but WITHOUT ANY WARRANTY; without even the implied warranty of
14  *      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  *      GNU General Public License for more details.
16  *
17  *      You should have received a copy of the GNU General Public License
18  *      along with this program; if not, write to the Free Software
19  *      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20  *
21  *
22  * Reference:
23  *      MX29F002/002N data sheet
24  *
25  */
26
27 #include <stdio.h>
28 #include <stdint.h>
29 #include "flash.h"
30 #include "jedec.h"
31 #include "mx29f002.h"
32 #include "debug.h"
33
34 int probe_29f002(struct flashchip *flash)
35 {
36         volatile uint8_t *bios = flash->virt_addr;
37         uint8_t id1, id2;
38
39         *(bios + 0x5555) = 0xAA;
40         *(bios + 0x2AAA) = 0x55;
41         *(bios + 0x5555) = 0x90;
42
43         id1 = *(volatile uint8_t *) bios;
44         id2 = *(volatile uint8_t *) (bios + 0x01);
45
46         *bios = 0xF0;
47
48         myusec_delay(10);
49
50         printf_debug("%s: id1 0x%x, id2 0x%x\n", __FUNCTION__, id1, id2);
51         if (id1 == flash->manufacture_id && id2 == flash->model_id)
52                 return 1;
53
54         return 0;
55 }
56
57 int erase_29f002(struct flashchip *flash)
58 {
59         volatile uint8_t *bios = flash->virt_addr;
60
61         *(bios + 0x555) = 0xF0;
62         *(bios + 0x555) = 0xAA;
63         *(bios + 0x2AA) = 0x55;
64         *(bios + 0x555) = 0x80;
65         *(bios + 0x555) = 0xAA;
66         *(bios + 0x2AA) = 0x55;
67         *(bios + 0x555) = 0x10;
68
69         myusec_delay(100);
70         toggle_ready_jedec(bios);
71
72         //   while ((*bios & 0x40) != 0x40)
73         //;
74
75 #if 0
76         toggle_ready_jedec(bios);
77         *(bios + 0x0ffff) = 0x30;
78         *(bios + 0x1ffff) = 0x30;
79         *(bios + 0x2ffff) = 0x30;
80         *(bios + 0x37fff) = 0x30;
81         *(bios + 0x39fff) = 0x30;
82         *(bios + 0x3bfff) = 0x30;
83 #endif
84
85         return (0);
86 }
87
88 int write_29f002(struct flashchip *flash, uint8_t *buf)
89 {
90         int i;
91         int total_size = flash->total_size * 1024;
92         volatile uint8_t *bios = flash->virt_addr;
93         volatile uint8_t *dst = bios;
94
95         *bios = 0xF0;
96         myusec_delay(10);
97         erase_29f002(flash);
98         //*bios = 0xF0;
99 #if 1
100         printf("Programming Page: ");
101         for (i = 0; i < total_size; i++) {
102                 /* write to the sector */
103                 if ((i & 0xfff) == 0)
104                         printf("address: 0x%08lx", (unsigned long) i);
105                 *(bios + 0x5555) = 0xAA;
106                 *(bios + 0x2AAA) = 0x55;
107                 *(bios + 0x5555) = 0xA0;
108                 *dst++ = *buf++;
109
110                 /* wait for Toggle bit ready */
111                 toggle_ready_jedec(dst);
112
113                 if ((i & 0xfff) == 0)
114                         printf("\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b");
115         }
116 #endif
117         printf("\n");
118
119         return (0);
120 }