Код
#define WRITE_NAND_COMMAND(d) do{ *(volatile unsigned char *)((unsigned long)base_addressCLE) = (unsigned char)(d); } while(0)
#define WRITE_NAND_ADDRESS(d) do{ *(volatile unsigned char *)((unsigned long)base_addressALE) = (unsigned char)(d); } while(0)
#define WRITE_NAND(d) do{ *(volatile unsigned char *)((unsigned long)base_address) = (unsigned char)d; } while(0)
#define READ_NAND() ((unsigned char)(*(volatile unsigned char *)(unsigned long)base_address))
int nand_wait_busy(struct chipio *cio, uint32_t usec) {
uint32_t a=0;
for(a=0;a<5;a++)nanospin_ns(1000);
for(usec = MAX_ERASE_USEC; usec; --usec) {
if( (((AT91PS_PIO)base_PIO_C)->PIO_PDSR & AT91C_PIO_PC13) != 0){
return(0);
}
nanospin_ns(1000);
}
// We will exit from the log and never reach here.
return(-1);
}
//================================================================================
===================
int nand_erase_blk(struct chipio * cio, unsigned blk){
unsigned char status;
#ifdef debug
fprintf(stderr, "nand_erase_page: block %X\n", blk);
#endif
//set NAND CE
((AT91PS_PIO)base_PIO_C)->PIO_CODR = AT91C_PC14_NCS3_NANDCS;
WRITE_NAND_COMMAND(NANDCMD_ERASE);
/* Push sector address in three cycles */
WRITE_NAND_ADDRESS((blk >> 0) & 0xFF);
WRITE_NAND_ADDRESS((blk >> 8) & 0xFF);
WRITE_NAND_ADDRESS((blk >> 16) & 0xFF);
WRITE_NAND_COMMAND(NANDCMD_ERASECONFIRM);
if(nand_wait_busy(cio, MAX_ERASE_USEC) != 0) {
fprintf(stderr, "nand_erase_blk: nand_wait_busy - error...\n");
return(-1);
}
if(nand_wait_busy(cio, MAX_ERASE_USEC) != 0) {
fprintf(stderr, "nand_erase_blk: nand_wait_busy - error...\n");
return(-1);
}
WRITE_NAND_COMMAND(NANDCMD_STATUSREAD);
if(nand_wait_busy(cio, MAX_READ_USEC) != 0) {
fprintf(stderr, "nand_erase_blk: nand_wait_busy - error...\n");
return(-1);
}else{
status = READ_NAND();
if(status & NAND_PROGRAM_ERASE_ERROR){
fprintf(stderr, "nand_erase_blk: ERROR ERASING BLOCK\n");
return(-1);
}
}
//clear NAND CE
// ((AT91PS_PIO)base_PIO_C)->PIO_SODR = AT91C_PC14_NCS3_NANDCS;
return 0;
}
облома при стирании не происходит. тем не менее при чтении страницы из стертого блока обнаруживается, что страница не чистая. куда рыть уже не знаю. времянки вроде выдержаны.