Description
Source
Call Graph
Start Line: 110
unsigned char NandFlashModel_Find(const struct NandFlashModel *modelList, unsigned int size, unsigned int id, struct NandFlashModel *model)
{
unsigned char found = 0, id2, id4;
unsigned int i;
id2 = (unsigned char)(chipId>>8);
id4 = (unsigned char)(chipId>>24);
TRACE_INFO("Nandflash ID is 0x%08X\n\r", chipId);
for(i=0; i<size; i++) {
if(modelList[i].deviceId == id2) {
found = 1;
if(model) {
memcpy(model, &modelList[i], sizeof(struct NandFlashModel));
if(model->blockSizeInKBytes == 0 || model->pageSizeInBytes == 0) {
TRACE_DEBUG("Fetch from ID4(0x%.2x):\r\n", id4);
#if !defined(OP_BOOTSTRAP_on)
switch(id4 & 0x03) {
case 0x00: model->pageSizeInBytes = 1024; break;
case 0x01: model->pageSizeInBytes = 2048; break;
case 0x02: model->pageSizeInBytes = 4096; break;
case 0x03: model->pageSizeInBytes = 8192; break;
}
switch(id4 & 0x30) {
case 0x00: model->blockSizeInKBytes = 64; break;
case 0x10: model->blockSizeInKBytes = 128; break;
case 0x20: model->blockSizeInKBytes = 256; break;
case 0x30: model->blockSizeInKBytes = 512; break;
}
#else
model->pageSizeInBytes = 1024 << (id4 & 0x03);
model->blockSizeInKBytes = (64) << ((id4 & 0x30) >>4);
#endif
}
}
TRACE_DEBUG("NAND Model found:\r\n");
TRACE_DEBUG(" * deviceId = 0x%02X\r\n", model->deviceId);
TRACE_DEBUG(" * deviceSizeInMegaBytes = %d\r\n", model->deviceSizeInMegaBytes);
TRACE_DEBUG(" * blockSizeInkBytes = %d\r\n", model->blockSizeInKBytes);
TRACE_DEBUG(" * pageSizeInBytes = %d\r\n", model->pageSizeInBytes);
TRACE_DEBUG(" * options = 0x%02X\r\n", model->options);
break;
}
}
// Check if chip has been detected
if (found) {
return 0;
}
else {
return NandCommon_ERROR_UNKNOWNMODEL;
}
}