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@amd.com
On Mon, 1 Nov 2004, Donald Zoch wrote:
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 did a part like that already, the sst 49lf008a.
Look in flash_rom. It works fine.
ron
On Wed, 2004-11-03 at 09:53, Ronald G. Minnich wrote:
On Mon, 1 Nov 2004, Donald Zoch wrote:
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 did a part like that already, the sst 49lf008a.
Look in flash_rom. It works fine.
BTW, there is some unknown proble to flash some SST flash in 64-bit mode. I have no idea why. It works perfectly in 32-bit mode.
Ollie
ron
Greetings,
I'm not familiar with that part, but I know that some flash parts that support block locking can also 'lock down' a block so that it can only be unlocked by power cycling. Any chance that's happening?
G'day, sjames
On Mon, 1 Nov 2004, Donald Zoch wrote:
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@amd.com
||||| |||| ||||||||||||| ||| by Linux Labs International, Inc. Steven James, CTO
55 Marietta Street Suite 1830 Atlanta, Ga 30303 866 824 9737 support