STATIC_PREFIX int nf_sp_read(unsigned dest,unsigned size) { unsigned page_base,cnt,cur; int ret; nf_cntl_init(romboot_info); page_base= 0; for(cnt=0,cur=READ_SIZE/512;cnt<size&&(page_base+cur)<1024;cnt+=512,cur++) { do{ nf_send_read_cmd(page_base+cur,1);//small Page mode ret=nf_read_dma((unsigned*)(dest+cnt),(unsigned*)CONFIG_NAND_INFO_DMA_ADDR, 512, NAND_ECC_BCH8); if(ret!=-1) break; else{ page_base+=CONFIG_NAND_SP_BLOCK_SIZE; if((page_base+cur)>=CONFIG_NAND_PAGES) return -1; } } while(ret==-1); } return 0; }
void nf_erase(void) { int i; nf_cntl_init(romboot_info); for(i=0;i<4;i++) { NFC_SEND_CMD_CLE(CE0,0x60); NFC_SEND_CMD_ALE(CE0,0); NFC_SEND_CMD_ALE(CE0,i); NFC_SEND_CMD_ALE(CE0,0); NFC_SEND_CMD_CLE(CE0,0xd0); NFC_SEND_CMD_RB(CE0,0); } NFC_SEND_CMD_IDLE(CE0,0); // FIFO cleanup NFC_SEND_CMD_IDLE(CE0,0); // FIFO cleanup while(NFC_CMDFIFO_SIZE()>0); // wait until all command is finished }
STATIC_PREFIX int nf_lp_read(volatile unsigned dest, volatile unsigned size) { volatile unsigned page_base,cnt,cur; volatile int ret=0; unsigned char lp=0; nf_cntl_init(romboot_info); cnt=0; cur=READ_SIZE/(3*512); page_base= 0; // romboot_info->nand_addr<<8; for(;cnt<size&&cur<256;cnt+=3*512,cur++) { do{ nf_send_read_cmd(page_base+cur,1);//Large Page mode ret=nf_read_dma((unsigned*)(dest+cnt), ( volatile unsigned*)CONFIG_NAND_INFO_DMA_ADDR,3*512, NAND_ECC_BCH16); if(ret==0) break; else { if(ret==-1) serial_puts(" ecc err\n"); if(ret==-2) serial_puts("not 55aa\n"); page_base+=256; if(page_base==1024) { serial_puts("lp 1024\n"); goto bad; // while(1);//dead , booting fail } } } while(ret!=0); } return 0; bad: return 1; }