|
samsung NAND, не пишется |
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 15)
|
Feb 9 2009, 07:52
|
Частый гость
 
Группа: Свой
Сообщений: 115
Регистрация: 23-01-07
Пользователь №: 24 688

|
Код #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; } облома при стирании не происходит. тем не менее при чтении страницы из стертого блока обнаруживается, что страница не чистая. куда рыть уже не знаю. времянки вроде выдержаны.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|