diff options
Diffstat (limited to 'apps/system/i2c/i2c_get.c')
-rw-r--r-- | apps/system/i2c/i2c_get.c | 75 |
1 files changed, 73 insertions, 2 deletions
diff --git a/apps/system/i2c/i2c_get.c b/apps/system/i2c/i2c_get.c index 4f07ab630..6c2083dd5 100644 --- a/apps/system/i2c/i2c_get.c +++ b/apps/system/i2c/i2c_get.c @@ -75,10 +75,18 @@ * Name: cmd_get ****************************************************************************/ -int cmd_get(FAR struct i2ctool_s *i2ctool, int argc, char **argv) +int cmd_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; + int nargs; + int ret; int i; /* Parse any command line arguments */ @@ -102,8 +110,71 @@ int cmd_get(FAR struct i2ctool_s *i2ctool, int argc, char **argv) return ERROR; } -#warning "missing logic" + /* Set the frequency and address (NOTE: Only 7-bit address supported now) */ + + I2C_SETFREQUENCY(dev, i2ctool->freq); + I2C_SETADDRESS(dev, i2ctool->addr, 7); + + /* Set up data structures */ + + msg[0].addr = i2ctool->addr; + msg[0].flags = 0; + msg[0].buffer = &i2ctool->regaddr; + msg[0].length = 1; + + msg[1].addr = i2ctool->addr; + msg[1].flags = I2C_M_READ; + if (i2ctool->width == 8) + { + msg[1].buffer = &u.data8; + msg[1].length = 1; + } + else + { + msg[1].buffer = (uint8_t*)&u.data16; + msg[1].length = 2; + } + + if (i2ctool->start) + { + ret = I2C_TRANSFER(dev, &msg[0], 1); + if (ret < 0) + { + 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; + } + } + 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 + { + 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; } |