/* chunksize is 1 */ int write_m29f400bt(struct flashctx *flash, uint8_t *src, unsigned int start, unsigned int len) { int i; chipaddr bios = flash->virtual_memory; chipaddr dst = flash->virtual_memory + start; for (i = 0; i < len; i++) { chip_writeb(flash, 0xAA, bios + 0xAAA); chip_writeb(flash, 0x55, bios + 0x555); chip_writeb(flash, 0xA0, bios + 0xAAA); /* transfer data from source to destination */ chip_writeb(flash, *src, dst); toggle_ready_jedec(flash, dst); #if 0 /* We only want to print something in the error case. */ msg_cerr("Value in the flash at address 0x%lx = %#x, want %#x\n", (dst - bios), chip_readb(flash, dst), *src); #endif dst++; src++; } /* FIXME: Ignore errors for now. */ return 0; }
int erase_sst_fwhub_block(struct flashchip *flash, int offset) { volatile uint8_t *wrprotect = flash->virtual_registers + offset + 2; // clear write protect *(wrprotect) = 0; erase_block_jedec(flash->virtual_memory, offset); toggle_ready_jedec(flash->virtual_memory); return (0); }
static int erase_28sf040(struct flashchip *flash) { chipaddr bios = flash->virtual_memory; chip_writeb(CHIP_ERASE, bios); chip_writeb(CHIP_ERASE, bios); programmer_delay(10); toggle_ready_jedec(bios); if (check_erased_range(flash, 0, flash->total_size * 1024)) { msg_cerr("ERASE FAILED!\n"); return -1; } return 0; }
int erase_sector_28sf040(struct flashchip *flash, unsigned int address, unsigned int sector_size) { chipaddr bios = flash->virtual_memory; /* This command sequence is very similar to erase_block_82802ab. */ chip_writeb(AUTO_PG_ERASE1, bios); chip_writeb(AUTO_PG_ERASE2, bios + address); /* wait for Toggle bit ready */ toggle_ready_jedec(bios); if (check_erased_range(flash, address, sector_size)) { msg_cerr("ERASE FAILED!\n"); return -1; } return 0; }
int erase_jedec (struct flashchip * flash) { volatile char * bios = flash->virt_addr; *(volatile char *) (bios + 0x5555) = 0xAA; *(volatile char *) (bios + 0x2AAA) = 0x55; *(volatile char *) (bios + 0x5555) = 0x80; *(volatile char *) (bios + 0x5555) = 0xAA; *(volatile char *) (bios + 0x2AAA) = 0x55; *(volatile char *) (bios + 0x5555) = 0x10; myusec_delay(10); toggle_ready_jedec(bios); return(0); }
int erase_m29f400bt(struct flashctx *flash) { chipaddr bios = flash->virtual_memory; chip_writeb(flash, 0xAA, bios + 0xAAA); chip_writeb(flash, 0x55, bios + 0x555); chip_writeb(flash, 0x80, bios + 0xAAA); chip_writeb(flash, 0xAA, bios + 0xAAA); chip_writeb(flash, 0x55, bios + 0x555); chip_writeb(flash, 0x10, bios + 0xAAA); programmer_delay(10); toggle_ready_jedec(flash, bios); /* FIXME: Check the status register for errors. */ return 0; }
int block_erase_m29f400bt(struct flashctx *flash, unsigned int start, unsigned int len) { chipaddr bios = flash->virtual_memory; chipaddr dst = bios + start; chip_writeb(flash, 0xAA, bios + 0xAAA); chip_writeb(flash, 0x55, bios + 0x555); chip_writeb(flash, 0x80, bios + 0xAAA); chip_writeb(flash, 0xAA, bios + 0xAAA); chip_writeb(flash, 0x55, bios + 0x555); chip_writeb(flash, 0x30, dst); programmer_delay(10); toggle_ready_jedec(flash, bios); /* FIXME: Check the status register for errors. */ return 0; }
/* chunksize is 1 */ int write_28sf040(struct flashchip *flash, uint8_t *src, int start, int len) { int i; chipaddr bios = flash->virtual_memory; chipaddr dst = flash->virtual_memory + start; for (i = 0; i < len; i++) { /* transfer data from source to destination */ if (*src == 0xFF) { dst++, src++; /* If the data is 0xFF, don't program it */ continue; } /*issue AUTO PROGRAM command */ chip_writeb(AUTO_PGRM, dst); chip_writeb(*src++, dst++); /* wait for Toggle bit ready */ toggle_ready_jedec(bios); } return 0; }