X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=util%2Fflashrom%2Fm29f400bt.c;h=bc70449993426b1456f21212551367f578fa57e6;hb=7e6ff8bfc0e5c9a5238f046892dc19bcbec55780;hp=aff4cd5458218af4ec32dcb3c27cde889d95e751;hpb=1a4f0707bb33836953ffe90f6216ee20210cd1fa;p=coreboot.git diff --git a/util/flashrom/m29f400bt.c b/util/flashrom/m29f400bt.c index aff4cd545..bc7044999 100644 --- a/util/flashrom/m29f400bt.c +++ b/util/flashrom/m29f400bt.c @@ -1,56 +1,82 @@ /* - * m29f400bt.c: driver for programming JEDEC standard flash parts + * This file is part of the flashrom project. * + * Copyright (C) 2000 Silicon Integrated System Corporation * - * Copyright 2000 Silicon Integrated System Corporation + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - * - * Reference: - * - * $Id$ + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #include "flash.h" -#include "m29f400bt.h" -#include "debug.h" + +void protect_m29f400bt(volatile uint8_t *bios) +{ + *(volatile uint8_t *)(bios + 0xAAA) = 0xAA; + *(volatile uint8_t *)(bios + 0x555) = 0x55; + *(volatile uint8_t *)(bios + 0xAAA) = 0xA0; + + usleep(200); +} + +void write_page_m29f400bt(volatile uint8_t *bios, uint8_t *src, + volatile uint8_t *dst, int page_size) +{ + int i; + + for (i = 0; i < page_size; i++) { + *(volatile uint8_t *)(bios + 0xAAA) = 0xAA; + *(volatile uint8_t *)(bios + 0x555) = 0x55; + *(volatile uint8_t *)(bios + 0xAAA) = 0xA0; + + /* transfer data from source to destination */ + *dst = *src; + //*(volatile char *) (bios) = 0xF0; + //usleep(5); + toggle_ready_jedec(dst); + printf + ("Value in the flash at address %p = %#x, want %#x\n", + (uint8_t *) (dst - bios), *dst, *src); + dst++; + src++; + } +} int probe_m29f400bt(struct flashchip *flash) { - volatile uint8_t *bios = flash->virt_addr; + volatile uint8_t *bios = flash->virtual_memory; uint8_t id1, id2; - *(volatile uint8_t *) (bios + 0xAAA) = 0xAA; - *(volatile uint8_t *) (bios + 0x555) = 0x55; - *(volatile uint8_t *) (bios + 0xAAA) = 0x90; + *(volatile uint8_t *)(bios + 0xAAA) = 0xAA; + *(volatile uint8_t *)(bios + 0x555) = 0x55; + *(volatile uint8_t *)(bios + 0xAAA) = 0x90; myusec_delay(10); - id1 = *(volatile uint8_t *) bios; - id2 = *(volatile uint8_t *) (bios + 0x02); + id1 = *(volatile uint8_t *)bios; + /* The data sheet says id2 is at (bios + 0x01) and id2 listed in + * flash.h does not match. It should be possible to use JEDEC probe. + */ + id2 = *(volatile uint8_t *)(bios + 0x02); - *(volatile uint8_t *) (bios + 0xAAA) = 0xAA; - *(volatile uint8_t *) (bios + 0x555) = 0x55; - *(volatile uint8_t *) (bios + 0xAAA) = 0xF0; + *(volatile uint8_t *)(bios + 0xAAA) = 0xAA; + *(volatile uint8_t *)(bios + 0x555) = 0x55; + *(volatile uint8_t *)(bios + 0xAAA) = 0xF0; myusec_delay(10); printf_debug("%s: id1 0x%x, id2 0x%x\n", __FUNCTION__, id1, id2); - if (id1 == flash->manufacture_id && id2 == flash->model_id) return 1; @@ -59,49 +85,49 @@ int probe_m29f400bt(struct flashchip *flash) int erase_m29f400bt(struct flashchip *flash) { - volatile uint8_t *bios = flash->virt_addr; + volatile uint8_t *bios = flash->virtual_memory; - *(volatile uint8_t *) (bios + 0xAAA) = 0xAA; - *(volatile uint8_t *) (bios + 0x555) = 0x55; - *(volatile uint8_t *) (bios + 0xAAA) = 0x80; + *(volatile uint8_t *)(bios + 0xAAA) = 0xAA; + *(volatile uint8_t *)(bios + 0x555) = 0x55; + *(volatile uint8_t *)(bios + 0xAAA) = 0x80; - *(volatile uint8_t *) (bios + 0xAAA) = 0xAA; - *(volatile uint8_t *) (bios + 0x555) = 0x55; - *(volatile uint8_t *) (bios + 0xAAA) = 0x10; + *(volatile uint8_t *)(bios + 0xAAA) = 0xAA; + *(volatile uint8_t *)(bios + 0x555) = 0x55; + *(volatile uint8_t *)(bios + 0xAAA) = 0x10; myusec_delay(10); - toggle_ready_m29f400bt(bios); + toggle_ready_jedec(bios); - return (0); + return 0; } int block_erase_m29f400bt(volatile uint8_t *bios, volatile uint8_t *dst) { - *(volatile uint8_t *) (bios + 0xAAA) = 0xAA; - *(volatile uint8_t *) (bios + 0x555) = 0x55; - *(volatile uint8_t *) (bios + 0xAAA) = 0x80; + *(volatile uint8_t *)(bios + 0xAAA) = 0xAA; + *(volatile uint8_t *)(bios + 0x555) = 0x55; + *(volatile uint8_t *)(bios + 0xAAA) = 0x80; - *(volatile uint8_t *) (bios + 0xAAA) = 0xAA; - *(volatile uint8_t *) (bios + 0x555) = 0x55; + *(volatile uint8_t *)(bios + 0xAAA) = 0xAA; + *(volatile uint8_t *)(bios + 0x555) = 0x55; //*(volatile uint8_t *) (bios + 0xAAA) = 0x10; *dst = 0x30; myusec_delay(10); - toggle_ready_m29f400bt(bios); + toggle_ready_jedec(bios); - return (0); + return 0; } int write_m29f400bt(struct flashchip *flash, uint8_t *buf) { int i; - int total_size = flash->total_size * 1024, page_size = - flash->page_size; - volatile uint8_t *bios = flash->virt_addr; + int total_size = flash->total_size * 1024; + int page_size = flash->page_size; + volatile uint8_t *bios = flash->virtual_memory; //erase_m29f400bt (flash); - printf("Programming Page:\n "); + printf("Programming page:\n "); /********************************* *Pages for M29F400BT: * 16 0x7c000 0x7ffff TOP @@ -123,41 +149,36 @@ int write_m29f400bt(struct flashchip *flash, uint8_t *buf) block_erase_m29f400bt(bios, bios + i * page_size); write_page_m29f400bt(bios, buf + i * page_size, bios + i * page_size, page_size); - 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\b\b\b"); + 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\b\b\b"); } printf("%04d at address: 0x%08x\n", 7, 0x70000); block_erase_m29f400bt(bios, bios + 0x70000); - write_page_m29f400bt(bios, buf + 0x70000, bios + 0x70000, - 32 * 1024); + write_page_m29f400bt(bios, buf + 0x70000, bios + 0x70000, 32 * 1024); printf("%04d at address: 0x%08x\n", 8, 0x78000); block_erase_m29f400bt(bios, bios + 0x78000); - write_page_m29f400bt(bios, buf + 0x78000, bios + 0x78000, - 8 * 1024); + write_page_m29f400bt(bios, buf + 0x78000, bios + 0x78000, 8 * 1024); printf("%04d at address: 0x%08x\n", 9, 0x7a000); block_erase_m29f400bt(bios, bios + 0x7a000); - write_page_m29f400bt(bios, buf + 0x7a000, bios + 0x7a000, - 8 * 1024); + write_page_m29f400bt(bios, buf + 0x7a000, bios + 0x7a000, 8 * 1024); printf("%04d at address: 0x%08x\n", 10, 0x7c000); block_erase_m29f400bt(bios, bios + 0x7c000); - write_page_m29f400bt(bios, buf + 0x7c000, bios + 0x7c000, - 16 * 1024); + write_page_m29f400bt(bios, buf + 0x7c000, bios + 0x7c000, 16 * 1024); printf("\n"); //protect_m29f400bt (bios); - return (0); + return 0; } -int write_linuxbios_m29f400bt(struct flashchip *flash, uint8_t *buf) +int write_coreboot_m29f400bt(struct flashchip *flash, uint8_t *buf) { - volatile uint8_t *bios = flash->virt_addr; + volatile uint8_t *bios = flash->virtual_memory; - printf("Programming Page:\n "); + printf("Programming page:\n "); /********************************* *Pages for M29F400BT: * 16 0x7c000 0x7ffff TOP @@ -175,26 +196,22 @@ int write_linuxbios_m29f400bt(struct flashchip *flash, uint8_t *buf) *********************************/ printf("%04d at address: 0x%08x\n", 7, 0x00000); block_erase_m29f400bt(bios, bios + 0x00000); - write_page_m29f400bt(bios, buf + 0x00000, bios + 0x00000, - 64 * 1024); + write_page_m29f400bt(bios, buf + 0x00000, bios + 0x00000, 64 * 1024); printf("%04d at address: 0x%08x\n", 7, 0x10000); block_erase_m29f400bt(bios, bios + 0x10000); - write_page_m29f400bt(bios, buf + 0x10000, bios + 0x10000, - 64 * 1024); + write_page_m29f400bt(bios, buf + 0x10000, bios + 0x10000, 64 * 1024); printf("%04d at address: 0x%08x\n", 7, 0x20000); block_erase_m29f400bt(bios, bios + 0x20000); - write_page_m29f400bt(bios, buf + 0x20000, bios + 0x20000, - 64 * 1024); + write_page_m29f400bt(bios, buf + 0x20000, bios + 0x20000, 64 * 1024); printf("%04d at address: 0x%08x\n", 7, 0x30000); block_erase_m29f400bt(bios, bios + 0x30000); - write_page_m29f400bt(bios, buf + 0x30000, bios + 0x30000, - 64 * 1024); + write_page_m29f400bt(bios, buf + 0x30000, bios + 0x30000, 64 * 1024); printf("\n"); //protect_m29f400bt (bios); - return (0); + return 0; }