From 2e99e9ca5a0cea2e638626bb3bd224f08b9c5884 Mon Sep 17 00:00:00 2001 From: hadaq Date: Fri, 28 Aug 2009 19:17:54 +0000 Subject: [PATCH] update --- trbrich/trbflashrich.c | 97 +++++++++++++++++++++++++++++++++++++----- 1 file changed, 86 insertions(+), 11 deletions(-) diff --git a/trbrich/trbflashrich.c b/trbrich/trbflashrich.c index 51166db..6364635 100644 --- a/trbrich/trbflashrich.c +++ b/trbrich/trbflashrich.c @@ -243,7 +243,7 @@ static int checkStatus(uint16_t trb_address) } for (i = 0; i < status; i += 2) { - fprintf(stderr, "Status: 0x%02x\n", trbBuffer[i + 1] & 0xff); + /* fprintf(stderr, "Status: 0x%02x\n", trbBuffer[i + 1] & 0xff);*/ if (((trbBuffer[i + 1] >> 5) & 0x01) == 1) { fprintf(stderr, "Erase or program error on EndPoint 0x%04x\n", trbBuffer[i] & 0xffff); @@ -335,7 +335,7 @@ static int writePage(uint16_t trb_address, uint32_t pageNumber, for (c = 0; c < numBytes; c++) { if ((c % 4) == 0) { temp++; - temp = 0; + *temp = 0; } *temp |= (pageBuffer[c] << ((c % 4) * 8)); } @@ -348,7 +348,7 @@ static int writePage(uint16_t trb_address, uint32_t pageNumber, trb_error("Error > writePage: tranfer trbBuffer"); exit(EXIT_FAILURE); } - + /* Enable writing */ if (sendCommand(trb_address, 0x06 << 24, 0) == -1) { fprintf(stderr, "Error > writePage: write enable\n"); @@ -362,6 +362,16 @@ static int writePage(uint16_t trb_address, uint32_t pageNumber, return -1; } + /* Wait for not busy and check status */ + while ((status = checkStatus(trb_address) == -2)) { + /* fprintf(stderr, "Wait pageProgram ...\n"); */ + } + + if (status != 0) { + fprintf(stderr, "Error > pageWrite: invalid status\n"); + return -1; + } + return 0; } @@ -544,12 +554,12 @@ int main(int argc, char ** argv) trb_address, imageFileName); for (page = 0; page < NUM_PAGES; page++) { if (readPage(trb_address, page, 256) == -1) { - fprintf(stderr, "Error reading Page# %d, aborting..\n", page); + fprintf(stderr, "Error reading Page #%d, aborting..\n", page); fclose(imageFile); exit(EXIT_FAILURE); } if (fwrite((void*)pageBuffer[0], PAGE_SIZE, 1, imageFile) != 1) { - fprintf(stderr, "Error writing Page# %d to file, aborting..\n", page); + fprintf(stderr, "Error writing Page #%d to file, aborting..\n", page); fclose(imageFile); exit(EXIT_FAILURE); } @@ -604,9 +614,18 @@ int main(int argc, char ** argv) fclose(imageFile); /* Check ImageBuffer ??? */ + for (i = 0; i < PAGE_SIZE * NUM_PAGES; i++) { + imageBuffer[i] = i % 256; + } + + fprintf(stderr, "Block: 0 1 2 3 4 5 6 7 8 9 A B C D E F"); + - page = 0; for (block = 0; block < NUM_BLOCKS; block++) { + if (block % 16 == 0) { + fprintf(stderr, "\n%x ", block / 16); + } + fprintf(stderr, ".\b"); /* Enable writing */ if (sendCommand(trb_address, 0x06 << 24, 0) == -1) { fprintf(stderr, "Error > restore: write enable, aborting\n"); @@ -628,6 +647,7 @@ int main(int argc, char ** argv) } /* Erase block */ + fprintf(stderr, "E\b"); if (sendCommand(trb_address, 0xd8 << 24 | (BLOCK_SIZE * block), 3) == -1) { fprintf(stderr, "Error > restore: erase block #%d, aborting\n", @@ -637,7 +657,7 @@ int main(int argc, char ** argv) /* Wait for not busy and check status */ while ((status = checkStatus(trb_address) == -2)) { - fprintf(stderr, "Wait..\n"); + /* fprintf(stderr, "Wait erase..\n");*/ } if (status != 0) { @@ -646,17 +666,72 @@ int main(int argc, char ** argv) } /* Now write pages */ - for (i = 0; i < (BLOCK_SIZE / PAGE_SIZE); i++) { + fprintf(stderr, "P\b"); + page = (block * BLOCK_SIZE) / PAGE_SIZE; + for (i = 0, page = (block * BLOCK_SIZE) / PAGE_SIZE; + i < (BLOCK_SIZE / PAGE_SIZE); + i++, page++) { + status = writePage(trb_address, page, imageBuffer + page * PAGE_SIZE, PAGE_SIZE); if (status == -1) { - fprintf(stderr, "Error > restore: writePage, aborting\n"); + fprintf(stderr, "Error > restore: pageProgram page #%d, aborting\n", + page); + exit(EXIT_FAILURE); + } + } + + /* Enable writing */ + if (sendCommand(trb_address, 0x06 << 24, 0) == -1) { + fprintf(stderr, "Error > restore: write enable, aborting\n"); + exit(EXIT_FAILURE); + } + + /* Protect sector */ + if (sendCommand(trb_address, 0x36 << 24 | (BLOCK_SIZE * block), 3) + == -1) { + fprintf(stderr, "Error > restore: unprotect sector #%d, aborting\n", + block); + exit(EXIT_FAILURE); + } + + /* Verify pages */ + fprintf(stderr, "V\b"); + page = (block * BLOCK_SIZE) / PAGE_SIZE; + for (i = 0, page = (block * BLOCK_SIZE) / PAGE_SIZE; + i < (BLOCK_SIZE / PAGE_SIZE); + i++, page++) { + unsigned int endPoint; + unsigned int c; + + if ((status = readPage(trb_address, page, 256)) == -1) { + fprintf(stderr, "Error > restore: reading Page #%d, aborting\n", + page); exit(EXIT_FAILURE); } - page++; + + for (endPoint = 0; endPoint < status; endPoint++) { + int verifyOK = 0; + for (c = 0; c < PAGE_SIZE; c++) { + if (pageBuffer[endPoint][c] != + *(imageBuffer + page * PAGE_SIZE + c)) { + verifyOK = -1; + } + } + if (verifyOK == -1) { + fprintf(stderr, + "Error > restore: verify failed for page #%d, " + "of EndPoint 0x%04x\n", + page, pageBufferAddress[endPoint]); + } + } } + + fprintf(stderr, "@ "); } - + + fprintf(stderr, "\n\nDone\n"); + } else if (strcmp(argv[optind], "test") == 0) { uint16_t trb_address; uint32_t pageNumber; -- 2.43.0