- Use NAND extended geometry information (thanks to Ben Dooks for this patch)

git-svn-id: svn://svn.berlios.de/openocd/trunk@323 b42882b7-edfa-0310-969c-e2dbd0fdcd60
__archive__
drath 2008-02-23 13:39:06 +00:00
parent 8603019609
commit 88b767e3ec
1 changed files with 42 additions and 4 deletions

View File

@ -3,7 +3,7 @@
* Dominic.Rath@gmx.de * * Dominic.Rath@gmx.de *
* * * *
* partially based on * * partially based on *
* drivers/mtd/nand_ids.c * * drivers/mtd/nand_ids.c *
* * * *
* Copyright (C) 2002 Thomas Gleixner (tglx@linutronix.de) * * Copyright (C) 2002 Thomas Gleixner (tglx@linutronix.de) *
* * * *
@ -377,6 +377,7 @@ int nand_read_status(struct nand_device_s *device, u8 *status)
int nand_probe(struct nand_device_s *device) int nand_probe(struct nand_device_s *device)
{ {
u8 manufacturer_id, device_id; u8 manufacturer_id, device_id;
u8 id_buff[5];
int retval; int retval;
int i; int i;
@ -467,12 +468,36 @@ int nand_probe(struct nand_device_s *device)
device->bus_width = 16; device->bus_width = 16;
else else
device->bus_width = 8; device->bus_width = 8;
/* Do we need extended device probe information? */
if (device->device->page_size == 0 ||
device->device->erase_size == 0)
{
if (device->bus_width == 8)
{
device->controller->read_data(device, id_buff+3);
device->controller->read_data(device, id_buff+4);
device->controller->read_data(device, id_buff+5);
}
else
{
u16 data_buf;
device->controller->read_data(device, &data_buf);
id_buff[3] = data_buf;
device->controller->read_data(device, &data_buf);
id_buff[4] = data_buf;
device->controller->read_data(device, &data_buf);
id_buff[5] = data_buf >> 8;
}
}
/* page size */ /* page size */
if (device->device->page_size == 0) if (device->device->page_size == 0)
{ {
/* TODO: support reading extended chip id to determine page size */ device->page_size = 1 << (10 + (id_buff[4] & 3));
return ERROR_NAND_OPERATION_FAILED;
} }
else if (device->device->page_size == 256) else if (device->device->page_size == 256)
{ {
@ -515,7 +540,20 @@ int nand_probe(struct nand_device_s *device)
/* erase size */ /* erase size */
if (device->device->erase_size == 0) if (device->device->erase_size == 0)
{ {
/* TODO: support reading extended chip id to determine erase size */ switch ((id_buff[4] >> 4) & 3) {
case 0:
device->erase_size = 64 << 10;
break;
case 1:
device->erase_size = 128 << 10;
break;
case 2:
device->erase_size = 256 << 10;
break;
case 3:
device->erase_size =512 << 10;
break;
}
} }
else else
{ {