Change all flashrom license headers to use our standard format.
[coreboot.git] / util / flashrom / mx29f002.c
1 /*
2  * This file is part of the flashrom project.
3  *
4  * Copyright 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         *(bios + 0x5555) = 0xAA;
31         *(bios + 0x2AAA) = 0x55;
32         *(bios + 0x5555) = 0x90;
33
34         id1 = *(volatile uint8_t *)bios;
35         id2 = *(volatile uint8_t *)(bios + 0x01);
36
37         *bios = 0xF0;
38
39         myusec_delay(10);
40
41         printf_debug("%s: id1 0x%x, id2 0x%x\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         *(bios + 0x555) = 0xF0;
53         *(bios + 0x555) = 0xAA;
54         *(bios + 0x2AA) = 0x55;
55         *(bios + 0x555) = 0x80;
56         *(bios + 0x555) = 0xAA;
57         *(bios + 0x2AA) = 0x55;
58         *(bios + 0x555) = 0x10;
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         *(bios + 0x0ffff) = 0x30;
69         *(bios + 0x1ffff) = 0x30;
70         *(bios + 0x2ffff) = 0x30;
71         *(bios + 0x37fff) = 0x30;
72         *(bios + 0x39fff) = 0x30;
73         *(bios + 0x3bfff) = 0x30;
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         *bios = 0xF0;
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                 *(bios + 0x5555) = 0xAA;
97                 *(bios + 0x2AAA) = 0x55;
98                 *(bios + 0x5555) = 0xA0;
99                 *dst++ = *buf++;
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 }