mirror of
https://gitee.com/mirrors_PX4/PX4-Autopilot.git
synced 2026-10-29 02:03:34 +08:00
batt_smbus: add search
This commit is contained in:
@@ -77,6 +77,9 @@
|
|||||||
#include <drivers/drv_batt_smbus.h>
|
#include <drivers/drv_batt_smbus.h>
|
||||||
#include <drivers/device/ringbuffer.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_I2C_BUS PX4_I2C_BUS_EXPANSION
|
||||||
#define BATT_SMBUS_ADDR 0x0B /* I2C address */
|
#define BATT_SMBUS_ADDR 0x0B /* I2C address */
|
||||||
#define BATT_SMBUS_TEMP 0x08 /* temperature register */
|
#define BATT_SMBUS_TEMP 0x08 /* temperature register */
|
||||||
@@ -103,6 +106,7 @@ public:
|
|||||||
|
|
||||||
virtual int init();
|
virtual int init();
|
||||||
virtual int test();
|
virtual int test();
|
||||||
|
int search(); /* search all possible slave addresses for a smart battery */
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual int probe(); // check if the device can be contacted
|
virtual int probe(); // check if the device can be contacted
|
||||||
@@ -226,6 +230,34 @@ BATT_SMBUS::test()
|
|||||||
return OK;
|
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
|
int
|
||||||
BATT_SMBUS::probe()
|
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);
|
uint8_t pec = get_PEC(reg, true, buff, 2);
|
||||||
if (pec == buff[2]) {
|
if (pec == buff[2]) {
|
||||||
val = (uint16_t)buff[1] << 8 | (uint16_t)buff[0];
|
val = (uint16_t)buff[1] << 8 | (uint16_t)buff[0];
|
||||||
warnx("PEC ok: %x",(int)pec);
|
|
||||||
} else {
|
} else {
|
||||||
ret = ENOTTY;
|
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
|
void
|
||||||
batt_smbus_usage()
|
batt_smbus_usage()
|
||||||
{
|
{
|
||||||
warnx("missing command: try 'start', 'test', 'stop'");
|
warnx("missing command: try 'start', 'test', 'stop', 'search'");
|
||||||
warnx("options:");
|
warnx("options:");
|
||||||
warnx(" -b i2cbus (%d)", BATT_SMBUS_I2C_BUS);
|
warnx(" -b i2cbus (%d)", BATT_SMBUS_I2C_BUS);
|
||||||
warnx(" -a addr (0x%x)", BATT_SMBUS_ADDR);
|
warnx(" -a addr (0x%x)", BATT_SMBUS_ADDR);
|
||||||
@@ -500,6 +530,11 @@ batt_smbus_main(int argc, char *argv[])
|
|||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!strcmp(verb, "search")) {
|
||||||
|
g_batt_smbus->search();
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
batt_smbus_usage();
|
batt_smbus_usage();
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user