int nand_write(unsigned int nand_start, unsigned char * buf, unsigned int len) { unsigned long count = 0; unsigned long addr = nand_start; int i = nand_start % 2048; nand_select(); while (count < len) { nand_cmd(0x80); nand_send_addr(addr); for (; i < 2048 && count < len; i++) { nand_send_data(buf[count++]); addr++; } nand_cmd(0x10); wait_ready(); i = 0; } nand_deselect(); }
static void nand_reset(){ int i; nand_select(); NFCMD=NAND_CMD_RESET; for(i=0;i<10;i++); nand_wait(); nand_deselect(); }
static void nand_reset(void) { /* 选中 */ nand_select(); /* 发出0xff命令 */ nand_cmd(0xff); /* 等待就绪 */ wait_ready(); /* 取消选中 */ nand_deselect(); }
int nand_erase_block(unsigned long addr) { int page = addr / 2048; nand_select(); nand_cmd(0x60); nand_addr(page & 0xff); nand_addr((page >> 8) & 0xff); nand_addr((page >> 16) & 0xff); nand_cmd(0xd0); wait_ready(); nand_deselect(); }
int nand_read(unsigned int nand_start, unsigned int ddr_start, unsigned int len) { unsigned int addr = nand_start; int i, count = 0; unsigned char *dest = (unsigned char *)ddr_start; /* 选中芯片 */ nand_select(); while (count < len) { /* 发出命令0x00 */ nand_cmd(0x00); /* 发出地址 */ nand_send_addr(addr); /* 发出命令0x30 */ nand_cmd(0x30); /* 等待就绪 */ wait_ready(); /* 读数据 */ for (i = 0; i < 2048 && count < len; i++) { dest[count++] = nand_get_data(); } addr += 2048; } /* 取消片选 */ nand_deselect(); return 0; }