- 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__
parent
8603019609
commit
88b767e3ec
|
@ -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;
|
||||||
|
|
||||||
|
@ -468,11 +469,35 @@ int nand_probe(struct nand_device_s *device)
|
||||||
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
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue