Пытаюсь читать 2*512Mb OneNAND флэшку. Вот таким образом:
Код
void ONLD_Read(unsigned long nDev,
unsigned long LogicalSector, //Physical block number
unsigned long nScts,
unsigned char * pMBuf,
unsigned char * pSBuf,
unsigned long nFlag)
{
unsigned long * pONLDMBuf;
unsigned long BlockAddress=LogicalSector>>8;
/* INT Stat Reg Clear */
ONLD_REG_INT(ONENAND_BASE) = (unsigned short)INT_CLEAR;
//Disable ECC
ONLD_REG_ECC_STAT(ONENAND_BASE) = (unsigned short)0;
/* Block Number Set 9 bits with Flash Block Address */
ONLD_REG_START_ADDR1(ONENAND_BASE) = (unsigned short)((BlockAddress & 0x1FF) | ((BlockAddress << 6) & 0x8000));
ONLD_REG_START_ADDR2(ONENAND_BASE) = (unsigned short)0x8000;
/* Sector Number Set 0-1 bits for Flash Sector Address, 2-7 for Flash Page Address */
ONLD_REG_START_ADDR8(ONENAND_BASE) = (unsigned short)(LogicalSector & 0xFF);
/* Start Buffer Selection */
ONLD_REG_START_BUF(ONENAND_BASE) = 0x800 | 0x01; //one sector without buffer switching
// Select buffer for operation
ONLD_REG_START_ADDR2(ONENAND_BASE) = ((BlockAddress << 6) & 0x8000); //always 0 to use only first buffer
//Disable ECC
ONLD_REG_SYS_CONF1(ONENAND_BASE) |= CONF1_ECC_OFF;
//Start Reading
ONLD_REG_CMD(ONENAND_BASE) = (unsigned short)ONLD_CMD_READ_PAGE;
//Wait for Read to complete
while (GET_ONLD_INT_STAT(ONENAND_BASE, PEND_READ) != (unsigned short)PEND_READ)
{
OAM_Idle();
}
//Read Data
pONLDMBuf = (unsigned long*)ONLD_DT_MB00_ADDR(ONENAND_BASE);
_ReadMain(pMBuf, pONLDMBuf, nScts);
}
Оно вроде как и читатет информацию, но читает только половину: если читаю сектора с 20000 по 40000 на самом деле вычитываются сектора 0 - 20000. Не могу добраться до вторых 512 Мб. Кто-нить имел дело с OneNand?