diff options
Diffstat (limited to 'apps/system/i2c/i2c_get.c')
-rw-r--r-- | apps/system/i2c/i2c_get.c | 163 |
1 files changed, 120 insertions, 43 deletions
diff --git a/apps/system/i2c/i2c_get.c b/apps/system/i2c/i2c_get.c index 6c2083dd5..773f2c963 100644 --- a/apps/system/i2c/i2c_get.c +++ b/apps/system/i2c/i2c_get.c @@ -39,6 +39,8 @@ #include <nuttx/config.h> +#include <stdlib.h> + #include <nuttx/i2c.h> #include "i2ctool.h" @@ -72,33 +74,64 @@ ****************************************************************************/ /**************************************************************************** - * Name: cmd_get + * Name: i2ccmd_get ****************************************************************************/ -int cmd_get(FAR struct i2ctool_s *i2ctool, int argc, FAR char **argv) +int i2ccmd_get(FAR struct i2ctool_s *i2ctool, int argc, FAR char **argv) { FAR struct i2c_dev_s *dev; - struct i2c_msg_s msg[2]; - union - { - uint16_t data16; - uint8_t data8; - } u; - + FAR char *ptr; + uint16_t result; + uint8_t regaddr; + long repititions; int nargs; + int argndx; int ret; int i; /* Parse any command line arguments */ - for (i = 1; i < argc; ) + for (argndx = 1; argndx < argc; ) { - nargs = common_args(i2ctool, &argv[i]); + /* Break out of the look when the last option has been parsed */ + + ptr = argv[argndx]; + if (*ptr != '-') + { + break; + } + + /* Otherwise, check for common options */ + + nargs = common_args(i2ctool, &argv[argndx]); if (nargs < 0) { return ERROR; } - i += nargs; + argndx += nargs; + } + + /* 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]); + return ERROR; } /* Get a handle to the I2C bus */ @@ -110,16 +143,75 @@ int cmd_get(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++) + { + /* Read from the I2C bus */ + + ret = i2ctool_get(i2ctool, dev, regaddr, &result); + + /* Display the result */ + + if (ret == OK) + { + i2ctool_printf(i2ctool, "READ Bus: %d Addr: %02x Subaddr: %02x Value: ", + i2ctool->bus, i2ctool->addr, i2ctool->regaddr); + if (i2ctool->width == 8) + { + i2ctool_printf(i2ctool, "%02x\n", result); + } + else + { + i2ctool_printf(i2ctool, "%04x\n", result); + } + } + 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_get + ****************************************************************************/ + +int i2ctool_get(FAR struct i2ctool_s *i2ctool, FAR struct i2c_dev_s *dev, + uint8_t regaddr, uint16_t *result) +{ + 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; @@ -138,43 +230,28 @@ int cmd_get(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, "READ 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 + /* Return the result of the read operation */ + + if (ret == OK) { - i2ctool_printf(i2ctool, "%04x\n", u.data16); + if (i2ctool->width == 8) + { + *result = (uint16_t)u.data8; + } + else + { + *result = 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; } |