diff options
Diffstat (limited to 'apps/system/i2c/i2c_set.c')
-rw-r--r-- | apps/system/i2c/i2c_set.c | 132 |
1 files changed, 88 insertions, 44 deletions
diff --git a/apps/system/i2c/i2c_set.c b/apps/system/i2c/i2c_set.c index 22706ff08..66fd8c85a 100644 --- a/apps/system/i2c/i2c_set.c +++ b/apps/system/i2c/i2c_set.c @@ -74,24 +74,20 @@ ****************************************************************************/ /**************************************************************************** - * Name: cmd_set + * Name: i2ccmd_set ****************************************************************************/ -int cmd_set(FAR struct i2ctool_s *i2ctool, int argc, FAR char **argv) +int i2ccmd_set(FAR struct i2ctool_s *i2ctool, int argc, FAR char **argv) { FAR struct i2c_dev_s *dev; - struct i2c_msg_s msg[2]; FAR char *ptr; - union - { - uint16_t data16; - uint8_t data8; - } u; - + uint8_t regaddr; long value; + long repititions; int nargs; int argndx; int ret; + int i; /* Parse any command line arguments */ @@ -115,7 +111,7 @@ int cmd_set(FAR struct i2ctool_s *i2ctool, int argc, FAR char **argv) argndx += nargs; } - /* There should be exactly one more thing on the command line: The value + /* There must be at least one more thing on the command line: The value * to be written. */ @@ -144,6 +140,23 @@ int cmd_set(FAR struct i2ctool_s *i2ctool, int argc, FAR char **argv) return ERROR; } + /* There may be one more thing on the command line: The repitition + * count. + */ + + repititions = 1; + if (argndx < argc) + { + repititions = strtol(argv[argndx], NULL, 16); + if (repititions < 1) + { + i2ctool_printf(i2ctool, g_i2cargrange, argv[0]); + return ERROR; + } + + argndx++; + } + if (argndx != argc) { i2ctool_printf(i2ctool, g_i2ctoomanyargs, argv[0]); @@ -159,23 +172,82 @@ int cmd_set(FAR struct i2ctool_s *i2ctool, int argc, FAR char **argv) return ERROR; } - /* Set the frequency and address (NOTE: Only 7-bit address supported now) */ + /* Set the frequency and the address (NOTE: Only 7-bit address supported now) */ I2C_SETFREQUENCY(dev, i2ctool->freq); I2C_SETADDRESS(dev, i2ctool->addr, 7); + /* Loop for the requested number of repititions */ + + regaddr = i2ctool->regaddr; + ret = OK; + + for (i = 0; i < repititions; i++) + { + /* Write to the I2C bus */ + + ret = i2ctool_set(i2ctool, dev, regaddr, (uint16_t)value); + + /* Display the result */ + + if (ret == OK) + { + i2ctool_printf(i2ctool, "WROTE Bus: %d Addr: %02x Subaddr: %02x Value: ", + i2ctool->bus, i2ctool->addr, i2ctool->regaddr); + if (i2ctool->width == 8) + { + i2ctool_printf(i2ctool, "%02x\n", (int)value); + } + else + { + i2ctool_printf(i2ctool, "%04x\n", (int)value); + } + } + else + { + i2ctool_printf(i2ctool, g_i2cxfrerror, argv[0], -ret); + break; + } + + /* Auto-increment the address if so configured */ + + if (i2ctool->autoincr) + { + regaddr++; + } + } + + (void)up_i2cuninitialize(dev); + return ret; +} + +/**************************************************************************** + * Name: i2ctool_set + ****************************************************************************/ + +int i2ctool_set(FAR struct i2ctool_s *i2ctool, FAR struct i2c_dev_s *dev, + uint8_t regaddr, uint16_t value) +{ + struct i2c_msg_s msg[2]; + union + { + uint16_t data16; + uint8_t data8; + } u; + int ret; + /* Set up data structures */ msg[0].addr = i2ctool->addr; msg[0].flags = 0; - msg[0].buffer = &i2ctool->regaddr; + msg[0].buffer = ®addr; msg[0].length = 1; msg[1].addr = i2ctool->addr; msg[1].flags = 0; if (i2ctool->width == 8) { - u.data8 = value; + u.data8 = (uint8_t)value; msg[1].buffer = &u.data8; msg[1].length = 1; } @@ -189,43 +261,15 @@ int cmd_set(FAR struct i2ctool_s *i2ctool, int argc, FAR char **argv) if (i2ctool->start) { ret = I2C_TRANSFER(dev, &msg[0], 1); - if (ret < 0) + if (ret == OK) { - i2ctool_printf(i2ctool, g_i2cxfrerror, argv[0], -ret); - goto errout; - } - ret = I2C_TRANSFER(dev, &msg[1], 1); - if (ret < 0) - { - i2ctool_printf(i2ctool, g_i2cxfrerror, argv[0], -ret); - goto errout; + ret = I2C_TRANSFER(dev, &msg[1], 1); } } else { ret = I2C_TRANSFER(dev, msg, 2); - if (ret < 0) - { - goto errout; - } - } - - i2ctool_printf(i2ctool, "WROTE Bus: %d Addr: %02x Subaddr: %02x Value: ", - i2ctool->bus, i2ctool->addr, i2ctool->regaddr); - if (i2ctool->width == 8) - { - i2ctool_printf(i2ctool, "%02x\n", u.data8); } - else - { - i2ctool_printf(i2ctool, "%04x\n", u.data16); - } - - (void)up_i2cuninitialize(dev); - return OK; -errout: - i2ctool_printf(i2ctool, g_i2cxfrerror, argv[0], -ret); - (void)up_i2cuninitialize(dev); - return ERROR; + return ret; } |