mpu9150: option to disable I2C bypass setting

The existing hardcoded logic enables i2c bypass mode for AK8975.
This can cause the accelerometer to disappear on I2C bus. We add
a new member as a switch that can be used to disable bypass.

Change-Id: I2c61f4910d46ffb5940bb3c14b58bc65984fd12e
Signed-off-by: Jianxun Zhang <jianxun.zhang@intel.com>
Signed-off-by: Mihai Tudor Panu <mihai.tudor.panu@intel.com>
This commit is contained in:
Jianxun Zhang 2015-10-19 00:41:34 -07:00 committed by Mihai Tudor Panu
parent fd509c7d79
commit ac21c9336b
2 changed files with 27 additions and 19 deletions

View File

@ -31,11 +31,12 @@
using namespace upm; using namespace upm;
using namespace std; using namespace std;
MPU9150::MPU9150 (int bus, int address, int magAddress) : MPU9150::MPU9150 (int bus, int address, int magAddress, bool enableAk8975) :
m_mag(0), MPU60X0(bus, address) m_mag(0), MPU60X0(bus, address)
{ {
m_magAddress = magAddress; m_magAddress = magAddress;
m_i2cBus = bus; m_i2cBus = bus;
m_enableAk8975 = enableAk8975;
} }
MPU9150::~MPU9150() MPU9150::~MPU9150()
@ -54,26 +55,30 @@ bool MPU9150::init()
return false; return false;
} }
// Now, we need to enable I2C bypass on the MPU60X0 component. This // Enabling I2C bypass will allow us to access the
// will allow us to access the AK8975 Magnetometer on I2C addr 0x0c. // AK8975 Magnetometer on I2C addr 0x0c.
if (!enableI2CBypass(true)) if (m_enableAk8975 == true)
{ {
throw std::runtime_error(std::string(__FUNCTION__) + if (!enableI2CBypass(true))
": Unable to enable I2C bypass"); {
return false; throw std::runtime_error(std::string(__FUNCTION__) +
} ": Unable to enable I2C bypass");
return false;
}
// Now that we've done that, create an AK8975 instance and // Now that we've done that, create an AK8975 instance and
// initialize it. // initialize it.
m_mag = new AK8975(m_i2cBus, m_magAddress);
if (!m_mag->init()) m_mag = new AK8975(m_i2cBus, m_magAddress);
{
throw std::runtime_error(std::string(__FUNCTION__) + if (!m_mag->init())
": Unable to init magnetometer"); {
delete m_mag; throw std::runtime_error(std::string(__FUNCTION__) +
m_mag = 0; ": Unable to init magnetometer");
return false; delete m_mag;
m_mag = 0;
return false;
}
} }
return true; return true;

View File

@ -66,9 +66,11 @@ namespace upm {
* @param bus I2C bus to use * @param bus I2C bus to use
* @param address The address for this device * @param address The address for this device
* @param magAddress The address of the connected magnetometer * @param magAddress The address of the connected magnetometer
* @param enableAk8975 Enables i2c bypass mode for magnetometer, default
* is true
*/ */
MPU9150 (int bus=MPU9150_I2C_BUS, int address=MPU9150_DEFAULT_I2C_ADDR, MPU9150 (int bus=MPU9150_I2C_BUS, int address=MPU9150_DEFAULT_I2C_ADDR,
int magAddress=AK8975_DEFAULT_I2C_ADDR); int magAddress=AK8975_DEFAULT_I2C_ADDR, bool enableAk8975=true);
/** /**
* MPU9150 destructor * MPU9150 destructor
@ -126,6 +128,7 @@ namespace upm {
private: private:
int m_i2cBus; int m_i2cBus;
uint8_t m_magAddress; uint8_t m_magAddress;
bool m_enableAk8975;
}; };
} }