]> jspc29.x-matter.uni-frankfurt.de Git - trbnettools.git/commitdiff
trb_i2c rc mode added, i.e. read number of registers in a row
authorLudwig Maier <lmaier@crius.e12.ph.tum.de>
Sun, 16 Feb 2014 01:05:53 +0000 (02:05 +0100)
committerLudwig Maier <lmaier@crius.e12.ph.tum.de>
Sun, 16 Feb 2014 01:05:53 +0000 (02:05 +0100)
trbrich/trb_i2c.c

index ed45386a881b5224f383a623fd9142bc194483cf..fc6648521f6a2b78f7f162545363d8cab432b2d0 100644 (file)
@@ -37,11 +37,15 @@ void usage(const char *progName)
   printf("  -d    turn on Debugging Information\n");
   printf("  -V    Version number\n");
   printf("\nCommands:\n");
-  printf("   w <trb_address> <chip> <register> <value> -> "
+  printf("   w  <trb_address> <chip> <register> <value>  -> "
          "write <value> to <register>\n"); 
-  printf("   r <trb_address <chip> <register>          -> "
-         "read <value> from <register>\n");
-  printf("   c <trb_address>                           -> "
+  printf("   r  <trb_address> <chip> <register>          -> "
+         "read  <value> from <register>\n");
+  printf("   rc <trb_address> <chip> <register> <counts> -> "
+         "read  <counts> <values>\n"
+         "                                                  "
+         "starting at <register>\n");
+  printf("   c  <trb_address>                            -> "
          "clear I2C-Bus on <trb_address>\n");
 }
 
@@ -258,8 +262,8 @@ int main(int argc, char** argv)
     }
     
     free(buffer);
+  
   } else if (strcmp(argv[optind], "r") == 0) {
-    
     /*************************************************/
     /* I2C read                                      */
     /*************************************************/
@@ -338,7 +342,107 @@ int main(int argc, char** argv)
       }
     }
   
-    free(buffer);
+    free(buffer);  
+
+  } else if (strcmp(argv[optind], "rc") == 0) {
+    
+    /*************************************************/
+    /* I2C read continuous                           */
+    /*************************************************/
+    
+    uint32_t *buffer = NULL;
+    unsigned int reg_counter = 0;
+    int status = 0;
+    uint16_t trb_address = 0;
+    uint32_t value = 0;
+    uint8_t i2c_chip = 0;
+    uint16_t i2c_register = 0;
+    uint16_t i2c_num_regs = 1;
+    
+    int i;
+    
+    if (argc - optind != 5) {
+      usage(argv[0]);
+      exit(EXIT_FAILURE);
+    }   
+   
+    trb_address = (uint16_t)strtoul(argv[optind + 1], NULL, 0);
+    i2c_chip = spi_mode == 0 ? (uint8_t)strtoul(argv[optind + 2], NULL, 0) : 0;
+    i2c_register = spi_mode == 0 
+      ? (uint8_t)strtoul(argv[optind + 3], NULL, 0) 
+      : (uint16_t)strtoul(argv[optind + 3], NULL, 0) & 0x1fff;
+    i2c_num_regs = (uint16_t)strtoul(argv[optind + 4], NULL, 0); 
+
+    
+
+    for (reg_counter = 0; reg_counter < i2c_num_regs; reg_counter++) { 
+   
+      buffer = (uint32_t*)malloc(sizeof(uint32_t) * BUFFER_SIZE);
+      if (buffer == NULL) abort();
+       
+      /* Check whether I2C is ready */
+      if (readI2CRegister(trb_address, 0, buffer, BUFFER_SIZE) == -1) {
+        trb_error("I2C not ready");
+        free(buffer);
+        exit(EXIT_FAILURE);
+      }
+      
+      /* Read Value */
+      if (spi_mode == 0) {
+        value = multBytes == 0 
+          ? (0xff000000 | (i2c_chip << 16) | 
+             ((i2c_register + reg_counter) << 8)) 
+          : (0xc0000000 | (num_bytes << 24) | 
+             (i2c_chip << 16) | ((i2c_register + reg_counter) << 8));
+      } else {
+        value = (0xff000000 | (i2c_register << 8));
+      }
+
+      if (trb_register_write(trb_address, trb_i2c_register, value) == -1) {
+        trb_error("Error reading value");
+        clearI2C(trb_address);
+        free(buffer);
+        exit(EXIT_FAILURE);
+      }
+         
+      /* Wait for ACK */
+      if ((status = readI2CRegister(trb_address, 1, buffer, BUFFER_SIZE)) 
+          == -1) {
+        clearI2C(trb_address);
+        free(buffer);
+        exit(EXIT_FAILURE);
+      }
+  
+      /* Clear IC2 bus */
+      if (clearI2C(trb_address) == -1) {
+        free(buffer);
+        exit(EXIT_FAILURE);
+      }
+    
+      /* Print results */
+      for (i = 0; i < status; i += 2) {
+        if (multBytes == 0) {
+          fprintf(stdout, 
+                  (decMode == 0 ? 
+                   "0x%04x  0x%02x  0x%02x\n" : 
+                   "0x%04x  %u      %u\n"), 
+                  buffer[i], 
+                  (i2c_register + reg_counter), 
+                  buffer[i + 1] & 0xff);
+        } else {
+          fprintf(stdout, 
+                  (decMode == 0 ? 
+                   "0x%04x  0x%02x  0x%08x\n" : 
+                   "0x%04x  %u      %u\n"), 
+                  buffer[i], 
+                  (i2c_register + reg_counter), 
+                  buffer[i + 1]);
+        }
+      }
+  
+      free(buffer);
+    }
+
   } else if (strcmp(argv[optind], "c") == 0) {
     
     /*************************************************/