use hex print in id1, id2
[coreboot.git] / util / flash_and_burn / 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  * $Id$
26  */
27
28 #include <stdio.h>
29 #include "flash.h"
30 #include "jedec.h"
31 #include "mx29f002.h"
32
33 int probe_29f002(struct flashchip *flash)
34 {
35         volatile char *bios = flash->virt_addr;
36         unsigned char id1, id2;
37
38         *(bios + 0x5555) = 0xAA;
39         *(bios + 0x2AAA) = 0x55;
40         *(bios + 0x5555) = 0x90;
41
42         id1 = *(volatile unsigned char *) bios;
43         id2 = *(volatile unsigned char *) (bios + 0x01);
44
45         *bios = 0xF0;
46
47         myusec_delay(10);
48
49         printf("%s: id1 0x%x, id2 0x%x\n", __FUNCTION__, id1, id2);
50         if (id1 == flash->manufacture_id && id2 == flash->model_id)
51                 return 1;
52
53         return 0;
54 }
55
56 int erase_29f002(struct flashchip *flash)
57 {
58         volatile char *bios = flash->virt_addr;
59
60         *(bios + 0x555) = 0xF0;
61         *(bios + 0x555) = 0xAA;
62         *(bios + 0x2AA) = 0x55;
63         *(bios + 0x555) = 0x80;
64         *(bios + 0x555) = 0xAA;
65         *(bios + 0x2AA) = 0x55;
66         *(bios + 0x555) = 0x10;
67
68         myusec_delay(100);
69         toggle_ready_jedec(bios);
70
71         //   while ((*bios & 0x40) != 0x40)
72         //;
73
74 #if 0
75         toggle_ready_jedec(bios);
76         *(bios + 0x0ffff) = 0x30;
77         *(bios + 0x1ffff) = 0x30;
78         *(bios + 0x2ffff) = 0x30;
79         *(bios + 0x37fff) = 0x30;
80         *(bios + 0x39fff) = 0x30;
81         *(bios + 0x3bfff) = 0x30;
82 #endif
83
84         return (0);
85 }
86
87 int write_29f002(struct flashchip *flash, unsigned char *buf)
88 {
89         int i;
90         int total_size = flash->total_size * 1024;
91         volatile char *bios = flash->virt_addr;
92         volatile char *dst = bios;
93
94         *bios = 0xF0;
95         myusec_delay(10);
96         erase_29f002(flash);
97         //*bios = 0xF0;
98 #if 1
99         printf("Programming Page: ");
100         for (i = 0; i < total_size; i++) {
101                 /* write to the sector */
102                 if ((i & 0xfff) == 0)
103                         printf("address: 0x%08lx", (unsigned long) i);
104                 *(bios + 0x5555) = 0xAA;
105                 *(bios + 0x2AAA) = 0x55;
106                 *(bios + 0x5555) = 0xA0;
107                 *dst++ = *buf++;
108
109                 /* wait for Toggle bit ready */
110                 toggle_ready_jedec(dst);
111
112                 if ((i & 0xfff) == 0)
113                         printf("\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b");
114         }
115 #endif
116         printf("\n");
117
118         return (0);
119 }