1
0
mirror of https://review.coreboot.org/flashrom.git synced 2025-04-27 15:12:36 +02:00
flashrom/sst49lfxxxc.c
Sean Nelson 69e5811e79 Sst49lfxxxc chips are functionally the same as 82802ab chips
Sst49lfxxxc software status register is functionally the same as the 
82802ab status register, "Block Protect Status"(49lfxxxc) can be treated 
the same as "Device Protect Status"(82802ab).
Erase_block_49lfxxxc is the same command sequence as erase_block_82802ab.
Add unlock_49lfxxxc to chips definitions.
Write_sector_49lfxxxc is the same as write_page_82802ab.

Corresponding to flashrom svn r972.

Signed-off-by: Sean Nelson <audiohacked@gmail.com>
Acked-by: Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006@gmx.net>
2010-03-23 17:10:28 +00:00

123 lines
3.7 KiB
C

/*
* This file is part of the flashrom project.
*
* Copyright (C) 2000 Silicon Integrated System Corporation
* Copyright (C) 2005-2007 coresystems GmbH
* Copyright (C) 2009 Sean Nelson <audiohacked@gmail.com>
*
* 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.
*
* 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 <stdlib.h>
#include "flash.h"
#include "chipdrivers.h"
int unlock_block_49lfxxxc(struct flashchip *flash, unsigned long address, unsigned char bits)
{
unsigned long lock = flash->virtual_registers + address + 2;
printf_debug("lockbits at address=0x%08lx is 0x%01x\n", lock, chip_readb(lock));
chip_writeb(bits, lock);
return 0;
}
static int write_lockbits_49lfxxxc(struct flashchip *flash, unsigned char bits)
{
chipaddr registers = flash->virtual_registers;
int i, left = flash->total_size * 1024;
unsigned long address;
printf_debug("\nbios=0x%08lx\n", registers);
for (i = 0; left > 65536; i++, left -= 65536) {
printf_debug("lockbits at address=0x%08lx is 0x%01x\n",
registers + (i * 65536) + 2,
chip_readb(registers + (i * 65536) + 2));
chip_writeb(bits, registers + (i * 65536) + 2);
}
address = i * 65536;
printf_debug("lockbits at address=0x%08lx is 0x%01x\n",
registers + address + 2,
chip_readb(registers + address + 2));
chip_writeb(bits, registers + address + 2);
address += 32768;
printf_debug("lockbits at address=0x%08lx is 0x%01x\n",
registers + address + 2,
chip_readb(registers + address + 2));
chip_writeb(bits, registers + address + 2);
address += 8192;
printf_debug("lockbits at address=0x%08lx is 0x%01x\n",
registers + address + 2,
chip_readb(registers + address + 2));
chip_writeb(bits, registers + address + 2);
address += 8192;
printf_debug("lockbits at address=0x%08lx is 0x%01x\n",
registers + address + 2,
chip_readb(registers + address + 2));
chip_writeb(bits, registers + address + 2);
return 0;
}
int unlock_49lfxxxc(struct flashchip *flash)
{
return write_lockbits_49lfxxxc(flash, 0);
}
int erase_sector_49lfxxxc(struct flashchip *flash, unsigned int address, unsigned int sector_size)
{
uint8_t status;
chipaddr bios = flash->virtual_memory;
chip_writeb(0x30, bios);
chip_writeb(0xD0, bios + address);
status = wait_82802ab(bios);
if (check_erased_range(flash, address, sector_size)) {
fprintf(stderr, "ERASE FAILED!\n");
return -1;
}
return 0;
}
int write_49lfxxxc(struct flashchip *flash, uint8_t *buf)
{
int i;
int total_size = flash->total_size * 1024;
int page_size = flash->page_size;
chipaddr bios = flash->virtual_memory;
write_lockbits_49lfxxxc(flash, 0);
printf("Programming page: ");
for (i = 0; i < total_size / page_size; i++) {
/* erase the page before programming */
if (erase_sector_49lfxxxc(flash, i * page_size, flash->page_size)) {
fprintf(stderr, "ERASE FAILED!\n");
return -1;
}
/* write to the sector */
printf("%04d at address: 0x%08x", i, i * page_size);
write_page_82802ab(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("\n");
chip_writeb(0xFF, bios);
return 0;
}