#define BUFFER_SIZE (6 * 4096)
-static const char trb_i2c_version[] = "$Revision: 1.8 $";
+static const char trb_i2c_version[] = "$Revision: 1.9 $";
-static const uint16_t trb_i2c_register = 0x8040;
+static uint16_t trb_i2c_register = 0x8040;
static const unsigned int timeout = 1000;
void usage(const char *progName)
{
- printf("Usage: %s [-h] [-d level] [-V] <COMMAND>\n", progName);
+ printf("Usage: %s [-h] [-d] [-d level] [-V] <COMMAND>\n", progName);
printf("Options:\n");
printf(" -h give this help\n");
+ printf(" -s SPI Mode\n");
printf(" -d turn on Debugging Information\n");
printf(" -V Version number\n");
printf("\nCommands:\n");
"write <value> to <register>\n");
printf(" r <trb_address <chip> <register> -> "
"read <value> from <register>\n");
- printf(" c <trb_address -> "
+ printf(" c <trb_address> -> "
"clear I2C-Bus on <trb_address>\n");
}
int main(int argc, char** argv)
{
- static const uint16_t trb_i2c_register = 0x8040;
-
int i;
-
+ int spi_mode = 0;
trb_debug = 0;
/* Parse Arguments */
- while ((i = getopt(argc, argv, "+hd:V")) != -1) {
+ while ((i = getopt(argc, argv, "+hsd:V")) != -1) {
switch (i) {
case '?':
usage(basename(argv[0]));
case 'h':
usage(basename(argv[0]));
exit(EXIT_SUCCESS);
+ case 's':
+ spi_mode = 1;
+ trb_i2c_register = 0x8060;
+ break;
case 'd':
trb_debug = strtoul(optarg, NULL, 0);
break;
uint32_t value = 0;
uint16_t trb_address = 0;
uint8_t i2c_chip = 0;
- uint8_t i2c_register = 0;
+ uint16_t i2c_register = 0;
uint8_t i2c_value = 0;
int status = 0;
if (buffer == NULL) abort();
trb_address = (uint16_t)strtoul(argv[optind + 1], NULL, 0);
- i2c_chip = (uint8_t)strtoul(argv[optind + 2], NULL, 0);
- i2c_register = (uint8_t)strtoul(argv[optind + 3], 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_value = (uint8_t)strtoul(argv[optind + 4], NULL, 0);
/* Check whether I2C is ready */
}
/* Write value */
- value = 0xbf000000 | (i2c_chip << 16) | (i2c_register << 8) | i2c_value;
+ value = spi_mode == 0
+ ? 0xbf000000 | (i2c_chip << 16) | (i2c_register << 8) | i2c_value
+ : 0xbf000000 | (i2c_register << 8) | i2c_value;
+
if (trb_register_write(trb_address, trb_i2c_register, value) == -1) {
trb_error("Error writing value");
clearI2C(trb_address);
uint16_t trb_address = 0;
uint32_t value = 0;
uint8_t i2c_chip = 0;
- uint8_t i2c_register = 0;
+ uint16_t i2c_register = 0;
int i;
if (buffer == NULL) abort();
trb_address = (uint16_t)strtoul(argv[optind + 1], NULL, 0);
- i2c_chip = (uint8_t)strtoul(argv[optind + 2], NULL, 0);
- i2c_register = (uint8_t)strtoul(argv[optind + 3], 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;
+
/* Check whether I2C is ready */
if (readI2CRegister(trb_address, 0, buffer, BUFFER_SIZE) == -1) {
trb_error("I2C not ready");
}
/* Read Value */
- value = 0xff000000 | (i2c_chip << 16) | (i2c_register << 8);
+ value = spi_mode == 0
+ ? 0xff000000 | (i2c_chip << 16) | (i2c_register << 8)
+ : 0xff000000 | (i2c_register << 8);
+
if (trb_register_write(trb_address, trb_i2c_register, value) == -1) {
trb_error("Error reading value");
clearI2C(trb_address);