aboutsummaryrefslogtreecommitdiff
path: root/src/drivers/batt_smbus/batt_smbus.cpp
diff options
context:
space:
mode:
authorRandy Mackay <rmackay9@yahoo.com>2014-12-30 12:14:54 +0900
committerRandy Mackay <rmackay9@yahoo.com>2014-12-30 13:43:23 +0900
commitc4e357747690e77c4867bfc35083cab174a8d026 (patch)
tree557ae21ce4bffb4db20a230185c72c2c53446f21 /src/drivers/batt_smbus/batt_smbus.cpp
parenta952a18b42d486e6f3ba1d52506fbd2ba2fc3425 (diff)
downloadpx4-firmware-c4e357747690e77c4867bfc35083cab174a8d026.tar.gz
px4-firmware-c4e357747690e77c4867bfc35083cab174a8d026.tar.bz2
px4-firmware-c4e357747690e77c4867bfc35083cab174a8d026.zip
batt_smbus: add search
Diffstat (limited to 'src/drivers/batt_smbus/batt_smbus.cpp')
-rw-r--r--src/drivers/batt_smbus/batt_smbus.cpp41
1 files changed, 38 insertions, 3 deletions
diff --git a/src/drivers/batt_smbus/batt_smbus.cpp b/src/drivers/batt_smbus/batt_smbus.cpp
index 4d4a84049..dd83dacaf 100644
--- a/src/drivers/batt_smbus/batt_smbus.cpp
+++ b/src/drivers/batt_smbus/batt_smbus.cpp
@@ -77,6 +77,9 @@
#include <drivers/drv_batt_smbus.h>
#include <drivers/device/ringbuffer.h>
+#define BATT_SMBUS_ADDR_MIN 0x08 /* lowest possible address */
+#define BATT_SMBUS_ADDR_MAX 0x7F /* highest possible address */
+
#define BATT_SMBUS_I2C_BUS PX4_I2C_BUS_EXPANSION
#define BATT_SMBUS_ADDR 0x0B /* I2C address */
#define BATT_SMBUS_TEMP 0x08 /* temperature register */
@@ -103,6 +106,7 @@ public:
virtual int init();
virtual int test();
+ int search(); /* search all possible slave addresses for a smart battery */
protected:
virtual int probe(); // check if the device can be contacted
@@ -226,6 +230,34 @@ BATT_SMBUS::test()
return OK;
}
+/* search all possible slave addresses for a smart battery */
+int
+BATT_SMBUS::search()
+{
+ bool found_slave = false;
+ uint16_t tmp;
+
+ // search through all valid SMBus addresses
+ for (uint8_t i=BATT_SMBUS_ADDR_MIN; i<=BATT_SMBUS_ADDR_MAX; i++) {
+ set_address(i);
+ if (read_reg(BATT_SMBUS_VOLTAGE, tmp) == OK) {
+ warnx("battery found at 0x%x",(int)i);
+ found_slave = true;
+ }
+ // short sleep
+ usleep(1);
+ }
+
+ // display completion message
+ if (found_slave) {
+ warnx("Done.");
+ } else {
+ warnx("No smart batteries found.");
+ }
+
+ return OK;
+}
+
int
BATT_SMBUS::probe()
{
@@ -322,10 +354,8 @@ BATT_SMBUS::read_reg(uint8_t reg, uint16_t &val)
uint8_t pec = get_PEC(reg, true, buff, 2);
if (pec == buff[2]) {
val = (uint16_t)buff[1] << 8 | (uint16_t)buff[0];
- warnx("PEC ok: %x",(int)pec);
} else {
ret = ENOTTY;
- warnx("PEC:%x vs MyPec:%x",(int)buff[2],(int)pec);
}
}
@@ -423,7 +453,7 @@ uint8_t BATT_SMBUS::get_PEC(uint8_t cmd, bool reading, const uint8_t buff[], uin
void
batt_smbus_usage()
{
- warnx("missing command: try 'start', 'test', 'stop'");
+ warnx("missing command: try 'start', 'test', 'stop', 'search'");
warnx("options:");
warnx(" -b i2cbus (%d)", BATT_SMBUS_I2C_BUS);
warnx(" -a addr (0x%x)", BATT_SMBUS_ADDR);
@@ -500,6 +530,11 @@ batt_smbus_main(int argc, char *argv[])
exit(0);
}
+ if (!strcmp(verb, "search")) {
+ g_batt_smbus->search();
+ exit(0);
+ }
+
batt_smbus_usage();
exit(0);
}