I'm trying to get the flash_rom program working on the SST49LF004B.
This is the part that is coming in our newer Arima HDAMA boards that
replaces the SST49LF040. It has the same id as the SST49LF004A,
but is different in that when we first started trying to flash it, the
flash looked like it worked but would never verify. I took a look
at the data sheet and from the looks of it there are these block locking
registers that the zero bit must be cleared in in order to write to
certain parts of the flash. At least that's why I think it's not
flashing.
I'm trying to zero out the registers, but it appears as if the first
4 cannot be cleared out. The last 4 look like they're being set to
zero. I have tried to calculate the register locations by looking
at the probe jedec code and seeing that the jedec ID registers are
at bios and bios + 0x01. I then looked in the data sheet at where those
registers appear in the memory map and then calculated the register
memory locations as offsets to bios, some negative offsets and some
positive.
I've also tried anding that value with 0xFE just to zero out the bit
that I need, but that doesn't seem to work. I can never seem
to change the values in the first four registers.
Do either of you have any pointers on how to get this to work?
I will attach the data sheet for the flash part. It's
the 49lf004b that I'm interested in.
void unprotect_49lf004b(volatile unsigned char *bios)
{
*(volatile unsigned char *) (bios + 0x30002) = 0x00;
printf("REGISTER HAS VALUE 0x%x AFTER\n",*(volatile unsigned char *)(bios + 0x30002));
*(volatile unsigned char *) (bios + 0x20002) = 0x00;
printf("REGISTER HAS VALUE 0x%x AFTER\n",*(volatile unsigned char *)(bios + 0x20002));
*(volatile unsigned char *) (bios + 0x10002) = 0x00;
printf("REGISTER HAS VALUE 0x%x AFTER\n",*(volatile unsigned char *)(bios + 0x10002));
*(volatile unsigned char *) (bios + 0x00002) = 0x00;
printf("REGISTER HAS VALUE 0x%x AFTER\n",*(volatile unsigned char *)(bios + 0x00002));
*(volatile unsigned char *) (bios - 0xFFFE) = 0x00;
printf("REGISTER HAS VALUE 0x%x AFTER\n",*(volatile unsigned char *)(bios - 0xFFFE));
*(volatile unsigned char *) (bios - 0x1FFFE) = 0x00;
printf("REGISTER HAS VALUE 0x%x AFTER\n",*(volatile unsigned char *)(bios - 0x1FFFE));
*(volatile unsigned char *) (bios - 0x2FFFE) = 0x00;
printf("REGISTER HAS VALUE 0x%x AFTER\n",*(volatile unsigned char *)(bios - 0x2FFFE));
*(volatile unsigned char *) (bios - 0x3FFFE) = 0x00;
printf("REGISTER HAS VALUE 0x%x AFTER\n",*(volatile unsigned char *)(bios - 0x3FFFE));
}
Donald
----
Donald Zoch
Phone: (512) 602-7945
Pager: (512) 604-5401
donald.zoch(a)amd.com