2 * This file is part of the flashrom project.
4 * Copyright (C) 2000 Silicon Integrated System Corporation
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.
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.
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
25 static __inline__ int erase_sector_29f040b(volatile uint8_t *bios,
26 unsigned long address)
28 *(bios + 0x555) = 0xAA;
29 *(bios + 0x2AA) = 0x55;
30 *(bios + 0x555) = 0x80;
31 *(bios + 0x555) = 0xAA;
32 *(bios + 0x2AA) = 0x55;
33 *(bios + address) = 0x30;
37 /* wait for Toggle bit ready */
38 toggle_ready_jedec(bios + address);
43 static __inline__ int write_sector_29f040b(volatile uint8_t *bios,
45 volatile uint8_t *dst,
46 unsigned int page_size)
50 for (i = 0; i < page_size; i++) {
51 if ((i & 0xfff) == 0xfff)
52 printf("0x%08lx", (unsigned long)dst -
55 *(bios + 0x555) = 0xAA;
56 *(bios + 0x2AA) = 0x55;
57 *(bios + 0x555) = 0xA0;
60 /* wait for Toggle bit ready */
61 toggle_ready_jedec(bios);
63 if ((i & 0xfff) == 0xfff)
64 printf("\b\b\b\b\b\b\b\b\b\b");
70 int probe_29f040b(struct flashchip *flash)
72 volatile uint8_t *bios = flash->virtual_memory;
75 *(bios + 0x555) = 0xAA;
76 *(bios + 0x2AA) = 0x55;
77 *(bios + 0x555) = 0x90;
86 printf_debug("%s: id1 0x%x, id2 0x%x\n", __FUNCTION__, id1, id2);
87 if (id1 == flash->manufacture_id && id2 == flash->model_id)
93 int erase_29f040b(struct flashchip *flash)
95 volatile uint8_t *bios = flash->virtual_memory;
97 *(bios + 0x555) = 0xAA;
98 *(bios + 0x2AA) = 0x55;
99 *(bios + 0x555) = 0x80;
100 *(bios + 0x555) = 0xAA;
101 *(bios + 0x2AA) = 0x55;
102 *(bios + 0x555) = 0x10;
105 toggle_ready_jedec(bios);
110 int write_29f040b(struct flashchip *flash, uint8_t *buf)
113 int total_size = flash->total_size * 1024;
114 int page_size = flash->page_size;
115 volatile uint8_t *bios = flash->virtual_memory;
117 printf("Programming page ");
118 for (i = 0; i < total_size / page_size; i++) {
119 /* erase the page before programming */
120 erase_sector_29f040b(bios, i * page_size);
122 /* write to the sector */
123 printf("%04d at address: ", i);
124 write_sector_29f040b(bios, buf + i * page_size,
125 bios + i * page_size, page_size);
126 printf("\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b");