blob: 01a7a509b504e8ce592da17dee1671dfd401098f [file] [log] [blame]
Peter Stugeaf8ffac2009-01-26 06:42:02 +00001/*
Uwe Hermann7b2969b2009-04-15 10:52:49 +00002 * This file is part of the flashrom project.
Peter Stugeaf8ffac2009-01-26 06:42:02 +00003 *
4 * Copyright (C) 2009 Peter Stuge <peter@stuge.se>
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 "flash.h"
22
Uwe Hermann7b2969b2009-04-15 10:52:49 +000023int erase_m29f002(struct flashchip *flash)
24{
Carl-Daniel Hailfinger5820f422009-05-16 21:22:56 +000025 chipaddr bios = flash->virtual_memory;
Carl-Daniel Hailfinger0472f3d2009-03-06 22:26:00 +000026 chip_writeb(0xaa, bios + 0x555);
27 chip_writeb(0x55, bios + 0xaaa);
28 chip_writeb(0x80, bios + 0x555);
29 chip_writeb(0xaa, bios + 0x555);
30 chip_writeb(0x55, bios + 0xaaa);
31 chip_writeb(0x10, bios + 0x555);
Carl-Daniel Hailfingerca8bfc62009-06-05 17:48:08 +000032 programmer_delay(10);
Peter Stugeaf8ffac2009-01-26 06:42:02 +000033 toggle_ready_jedec(bios);
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +000034 if (check_erased_range(flash, 0, flash->total_size * 1024)) {
35 fprintf(stderr, "ERASE FAILED!\n");
36 return -1;
37 }
Peter Stugeaf8ffac2009-01-26 06:42:02 +000038 return 0;
39}
40
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +000041static int rewrite_block(struct flashchip *flash, uint8_t *src,
42 unsigned long start, int size)
Uwe Hermann7b2969b2009-04-15 10:52:49 +000043{
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +000044 chipaddr bios = flash->virtual_memory;
45 chipaddr dst = bios + start;
46
Peter Stugeaf8ffac2009-01-26 06:42:02 +000047 /* erase */
Michael Karcher1c296ca2009-11-27 17:49:42 +000048 /* FIXME: use erase_sector_jedec? */
Carl-Daniel Hailfinger0472f3d2009-03-06 22:26:00 +000049 chip_writeb(0xaa, bios + 0x555);
50 chip_writeb(0x55, bios + 0xaaa);
51 chip_writeb(0x80, bios + 0x555);
52 chip_writeb(0xaa, bios + 0x555);
53 chip_writeb(0x55, bios + 0xaaa);
54 chip_writeb(0x30, dst);
Carl-Daniel Hailfingerca8bfc62009-06-05 17:48:08 +000055 programmer_delay(10);
Peter Stugeaf8ffac2009-01-26 06:42:02 +000056 toggle_ready_jedec(bios);
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +000057 if (check_erased_range(flash, start, size)) {
58 fprintf(stderr, "ERASE FAILED!\n");
59 return -1;
60 }
Peter Stugeaf8ffac2009-01-26 06:42:02 +000061
62 /* program */
Michael Karcher1c296ca2009-11-27 17:49:42 +000063 /* FIXME: use write_sector_jedec? */
Peter Stugeaf8ffac2009-01-26 06:42:02 +000064 while (size--) {
Carl-Daniel Hailfinger0472f3d2009-03-06 22:26:00 +000065 chip_writeb(0xaa, bios + 0x555);
66 chip_writeb(0x55, bios + 0xaaa);
67 chip_writeb(0xa0, bios + 0x555);
68 chip_writeb(*src, dst);
Peter Stugeaf8ffac2009-01-26 06:42:02 +000069 toggle_ready_jedec(dst);
70 dst++;
71 src++;
72 }
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +000073 return 0;
Peter Stugeaf8ffac2009-01-26 06:42:02 +000074}
75
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +000076static int do_block(struct flashchip *flash, uint8_t *src, int i,
Uwe Hermann7b2969b2009-04-15 10:52:49 +000077 unsigned long start, int size)
78{
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +000079 int ret;
Peter Stugeaf8ffac2009-01-26 06:42:02 +000080 printf("%d at address: 0x%08lx", i, start);
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +000081 ret = rewrite_block(flash, src + start, start, size);
82 if (ret)
83 return ret;
Peter Stugeaf8ffac2009-01-26 06:42:02 +000084 printf("\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b");
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +000085 return 0;
Peter Stugeaf8ffac2009-01-26 06:42:02 +000086}
87
Uwe Hermann7b2969b2009-04-15 10:52:49 +000088int write_m29f002t(struct flashchip *flash, uint8_t *buf)
89{
Peter Stugeaf8ffac2009-01-26 06:42:02 +000090 int i, page_size = flash->page_size;
Peter Stugeaf8ffac2009-01-26 06:42:02 +000091
92 /* M29F002(N)T has 7 blocks. From bottom to top their sizes are:
93 * 64k 64k 64k 32k 8k 8k 16k
94 * flash->page_size is set to 64k in flashchips.c
95 */
96
97 printf("Programming block: ");
98 for (i = 0; i < 3; i++)
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +000099 do_block(flash, buf, i, i * page_size, page_size);
100 do_block(flash, buf, i++, 0x30000, 32 * 1024);
101 do_block(flash, buf, i++, 0x38000, 8 * 1024);
102 do_block(flash, buf, i++, 0x3a000, 8 * 1024);
103 do_block(flash, buf, i, 0x3c000, 16 * 1024);
Peter Stugeaf8ffac2009-01-26 06:42:02 +0000104
105 printf("\n");
106 return 0;
107}
108
Uwe Hermann7b2969b2009-04-15 10:52:49 +0000109int write_m29f002b(struct flashchip *flash, uint8_t *buf)
110{
Peter Stugeaf8ffac2009-01-26 06:42:02 +0000111 int i = 0, page_size = flash->page_size;
Peter Stugeaf8ffac2009-01-26 06:42:02 +0000112
113 /* M29F002B has 7 blocks. From bottom to top their sizes are:
114 * 16k 8k 8k 32k 64k 64k 64k
115 * flash->page_size is set to 64k in flashchips.c
116 */
117
118 printf("Programming block: ");
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000119 do_block(flash, buf, i++, 0x00000, 16 * 1024);
120 do_block(flash, buf, i++, 0x04000, 8 * 1024);
121 do_block(flash, buf, i++, 0x06000, 8 * 1024);
122 do_block(flash, buf, i++, 0x08000, 32 * 1024);
Peter Stugeaf8ffac2009-01-26 06:42:02 +0000123 for (; i < 7; i++)
Carl-Daniel Hailfinger30f7cb22009-06-15 17:23:36 +0000124 do_block(flash, buf, i, (i - 3) * page_size, page_size);
Peter Stugeaf8ffac2009-01-26 06:42:02 +0000125
126 printf("\n");
127 return 0;
128}