[flashrom] [PATCH] Support Intel 82F004BE/BV-T chip
Michael Karcher
flashrom at mkarcher.dialup.fu-berlin.de
Sun Jan 17 08:22:16 CET 2010
Am Samstag, den 16.01.2010, 21:16 -0800 schrieb Sean Nelson:
> > +int write_28f00x(struct flashchip *flash, uint8_t *buf)
> > +{
> > + int i, j, blocknum;
> > + chipaddr bios = flash->virtual_memory;
> > + int blockoffset = 0;
> > + uint8_t *tmpbuf = malloc(flash->page_size);
> > + struct eraseblock * blocks = flash->block_erasers[0].eraseblocks;
> > +
> > + if (!tmpbuf) {
> > + printf("Could not allocate memory!\n");
> > + exit(1);
> > + }
> > + printf("Programming block: \n");
> > + blocknum = 0;
> > + for (i = 0; blocks[i].size != 0; i++) {
> > + for(j = 0; j< blocks[i].count; j++) {
> > + printf("\b\b\b\b\b\b\b\b\b\b\b\b\b\b"
> > + "\b\b\b\b\b\b\b\b\b\b\b\b\b");
> > + printf("%04d at address: 0x%08x", blocknum,
> > + blockoffset);
> > +
> > + /* Auto Skip Blocks, which already contain the
> > + * desired data Faster, because we only write, what
> > + * has changed More secure, because blocks, which
> > + * are excluded (with the exclude or layout feature)
> > + * or not erased and rewritten; their data is
> > + * retained also in sudden power off situations
> > + */
> > + chip_readn(tmpbuf, bios + blockoffset, blocks[i].size);
> > + if (!memcmp((void *)(buf + blockoffset), tmpbuf,
> > + blocks[i].size)) {
> > + printf("SKIPPED\n");
> > + continue;
> > + }
> > +
> > + /* erase block by block and write block by block;
> > + this is the most secure way */
> > + if (erase_82802ab_block(flash, blockoffset,
> > + blocks[i].size)) {
> > + fprintf(stderr, "ERASE FAILED!\n");
> > + return -1;
> > + }
> > + write_page_82802ab(bios, buf + blockoffset,
> > + bios + blockoffset, blocks[i].size);
> > + blockoffset += blocks[i].size;
> > + blocknum++;
> > + }
> > + }
> > + printf("\n");
> > + free(tmpbuf);
> > +
> > + return 0;
> > +}
> >
> It's great that you used block_erasers for the chip definition, but I
> don't understand the reason for write_28f00x. It looks exactly the same
> as write_82802 except for using erase blocks segments. i28f00x.c is
> completely unnecessary and extraneous in my opinion.
write_82802ab only works if all erase blocks are of the same size,
namely the page_size specified in the chip. The 28f00x chips have erase
blocks of different sizes, the 82802A/B don't.
Regards,
Michael Karcher
More information about the flashrom
mailing list