i2c: Implement read function
Implement I2CDevice::read() by invoking i2c_smbus_read_xxx() APIs.
The code is referenced from i2c-tools' i2cget.c:
https://github.com/ev3dev/i2c-tools/blob/ev3dev-stretch/tools/i2cget.c
Tested: Verify on Witherspoon that it reads the PSU ppgrade mode status
register (1 byte) and CRC16 register (2 bytes) correctly.
Signed-off-by: Lei YU <mine260309@gmail.com>
Change-Id: I8759b6a35229f81120acf77f08429f7f79458b8b
diff --git a/tools/power-utils/meson.build b/tools/power-utils/meson.build
index 2e6adad..142683b 100644
--- a/tools/power-utils/meson.build
+++ b/tools/power-utils/meson.build
@@ -6,12 +6,12 @@
dependencies: [
phosphor_dbus_interfaces,
phosphor_logging,
+ libi2c_dep,
],
include_directories: [libpower_inc, libi2c_inc],
install: true,
link_with: [
libpower,
- libi2c_dev,
]
)
diff --git a/tools/power-utils/test/test_updater.cpp b/tools/power-utils/test/test_updater.cpp
index 4d051f7..d2dfd11 100644
--- a/tools/power-utils/test/test_updater.cpp
+++ b/tools/power-utils/test/test_updater.cpp
@@ -95,7 +95,10 @@
updater = std::make_unique<Updater>(psuInventoryPath, devPath, imageDir);
updater->createI2CDevice();
auto& i2c = getMockedI2c();
+ EXPECT_CALL(i2c, read(An<uint8_t&>()));
EXPECT_CALL(i2c, read(_, An<uint8_t&>()));
+ EXPECT_CALL(i2c, read(_, An<uint16_t&>()));
+ EXPECT_CALL(i2c, read(_, An<uint8_t&>(), _));
updater->doUpdate();
}
diff --git a/tools/power-utils/updater.cpp b/tools/power-utils/updater.cpp
index 749b5dd..2668030 100644
--- a/tools/power-utils/updater.cpp
+++ b/tools/power-utils/updater.cpp
@@ -244,7 +244,21 @@
{
// TODO
uint8_t data;
- i2c->read(0x00, data);
+ uint8_t size;
+ uint16_t word;
+ std::vector<uint8_t> blockData(32);
+
+ i2c->read(data);
+ printf("Read byte 0x%02x\n", data);
+
+ i2c->read(0xf1, data);
+ printf("First read of 0x%02x, 0x%02x\n", 0xf1, data);
+
+ i2c->read(0xbd, word);
+ printf("Read word of 0x%02x, 0x%04x\n", 0xbd, word);
+
+ i2c->read(0x00, size, blockData.data()); // This throws on the device
+ printf("Read block data, size: %d\n", size);
return 0;
}