Description
Source
Call Graph
Start Line: 595
unsigned char RawNandFlash_ReadPage(const struct RawNandFlash *raw, unsigned short block, unsigned short page, void *data, void *spare)
{
unsigned char hasSmallBlocks = NandFlashModel_HasSmallBlocks(MODEL(raw));
unsigned int pageDataSize = NandFlashModel_GetPageDataSize(MODEL(raw));
unsigned int pageSpareSize = NandFlashModel_GetPageSpareSize(MODEL(raw));
unsigned int colAddress;
unsigned int rowAddress;
ASSERT(data || spare, "RawNandFlash_ReadPage: At least one area must be read\n\r");
TRACE_DEBUG("RawNandFlash_ReadPage(B#%d:P#%d)\r\n", block, page);
// Calculate actual address of the page
rowAddress = block * NandFlashModel_GetBlockSizeInPages(MODEL(raw)) + page;
// Start operation
ENABLE_CE(raw);
if (data) {
colAddress = 0;
}
else {
// to read spare area in sequential access
colAddress = pageDataSize;
}
// Use either small blocks or large blocks data area read
if (hasSmallBlocks) {
WRITE_COMMAND(raw, COMMAND_READ_A);
WriteColumnAddress(raw, colAddress);
WriteRowAddress(raw, rowAddress);
}
else {
WRITE_COMMAND(raw, COMMAND_READ_1);
WriteColumnAddress(raw, colAddress);
WriteRowAddress(raw, rowAddress);
WRITE_COMMAND(raw, COMMAND_READ_2);
}
// Wait for the nand to be ready
WaitReady(raw);
// Read data area if needed
if (data) {
WRITE_COMMAND(raw, COMMAND_READ_1);
ReadData(raw, (unsigned char *) data, pageDataSize);
if (spare) {
ReadData(raw, (unsigned char *) spare, pageSpareSize);
}
}
else {
// Read spare area only
WRITE_COMMAND(raw, COMMAND_READ_1);
ReadData(raw, (unsigned char *) spare, pageSpareSize);
}
// Disable CE
DISABLE_CE(raw);
return 0;
}