]> jspc29.x-matter.uni-frankfurt.de Git - trbnettools.git/commitdiff
update
authorhadaq <hadaq>
Fri, 28 Aug 2009 19:17:54 +0000 (19:17 +0000)
committerhadaq <hadaq>
Fri, 28 Aug 2009 19:17:54 +0000 (19:17 +0000)
trbrich/trbflashrich.c

index 51166dbaab16c0b7734b3eab4fb95910381e8afc..63646351f2568c34950839c069bd220cf2fae71b 100644 (file)
@@ -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;