AP_HAL: add the possibility to have more than 1 i2c

Bebop drone has 3 i2c
This commit is contained in:
Julien BERAUD 2015-06-15 19:46:31 +02:00 committed by Andrew Tridgell
parent b33ed8ce39
commit 7275e33e79
10 changed files with 53 additions and 11 deletions

View File

@ -19,7 +19,9 @@ public:
AP_HAL::UARTDriver* _uartC, // telem1
AP_HAL::UARTDriver* _uartD, // telem2
AP_HAL::UARTDriver* _uartE, // 2nd GPS
AP_HAL::I2CDriver* _i2c,
AP_HAL::I2CDriver* _i2c0,
AP_HAL::I2CDriver* _i2c1,
AP_HAL::I2CDriver* _i2c2,
AP_HAL::SPIDeviceManager* _spi,
AP_HAL::AnalogIn* _analogin,
AP_HAL::Storage* _storage,
@ -35,7 +37,9 @@ public:
uartC(_uartC),
uartD(_uartD),
uartE(_uartE),
i2c(_i2c),
i2c(_i2c0),
i2c1(_i2c1),
i2c2(_i2c2),
spi(_spi),
analogin(_analogin),
storage(_storage),
@ -55,6 +59,8 @@ public:
AP_HAL::UARTDriver* uartD;
AP_HAL::UARTDriver* uartE;
AP_HAL::I2CDriver* i2c;
AP_HAL::I2CDriver* i2c1;
AP_HAL::I2CDriver* i2c2;
AP_HAL::SPIDeviceManager* spi;
AP_HAL::AnalogIn* analogin;
AP_HAL::Storage* storage;

View File

@ -43,6 +43,8 @@ HAL_AVR_APM1::HAL_AVR_APM1() :
NULL, /* no uartD */
NULL, /* no uartE */
&avrI2CDriver,
NULL, /* only 1 i2c */
NULL, /* only 1 i2c */
&apm1SPIDriver,
&avrAnalogIn,
&avrEEPROMStorage,

View File

@ -42,6 +42,8 @@ HAL_AVR_APM2::HAL_AVR_APM2() :
NULL, /* no uartD */
NULL, /* no uartE */
&avrI2CDriver,
NULL, /* only one i2c */
NULL, /* only one i2c */
&apm2SPIDriver,
&avrAnalogIn,
&avrEEPROMStorage,

View File

@ -29,6 +29,8 @@ HAL_Empty::HAL_Empty() :
NULL, /* no uartD */
NULL, /* no uartE */
&i2cDriver,
NULL, /* only one i2c */
NULL, /* only one i2c */
&spiDeviceManager,
&analogIn,
&storageDriver,

View File

@ -50,6 +50,8 @@ HAL_FLYMAPLE::HAL_FLYMAPLE() :
NULL, /* no uartD */
NULL, /* no uartE */
&i2cDriver,
NULL, /* only 1 i2c */
NULL, /* only 1 i2c */
&spiDeviceManager,
&analogIn,
&storageDriver,

View File

@ -24,11 +24,19 @@ static LinuxUARTDriver uartBDriver(false);
static LinuxUARTDriver uartCDriver(false);
static LinuxUARTDriver uartEDriver(false);
static LinuxSemaphore i2cSemaphore;
#if CONFIG_HAL_BOARD_SUBTYPE == HAL_BOARD_SUBTYPE_LINUX_BBBMINI
static LinuxI2CDriver i2cDriver(&i2cSemaphore, "/dev/i2c-2");
#if CONFIG_HAL_BOARD_SUBTYPE == HAL_BOARD_SUBTYPE_LINUX_BEBOP
static LinuxSemaphore i2cSemaphore0;
static LinuxI2CDriver i2cDriver0(&i2cSemaphore0, "/dev/i2c-0");
static LinuxSemaphore i2cSemaphore1;
static LinuxI2CDriver i2cDriver1(&i2cSemaphore1, "/dev/i2c-1");
static LinuxSemaphore i2cSemaphore2;
static LinuxI2CDriver i2cDriver2(&i2cSemaphore2, "/dev/i2c-2");
#elif CONFIG_HAL_BOARD_SUBTYPE == HAL_BOARD_SUBTYPE_LINUX_BBBMINI
static LinuxSemaphore i2cSemaphore0;
static LinuxI2CDriver i2cDriver0(&i2cSemaphore0, "/dev/i2c-2");
#else
static LinuxI2CDriver i2cDriver(&i2cSemaphore, "/dev/i2c-1");
static LinuxSemaphore i2cSemaphore0;
static LinuxI2CDriver i2cDriver0(&i2cSemaphore0, "/dev/i2c-1");
#endif
static LinuxSPIDeviceManager spiDeviceManager;
#if CONFIG_HAL_BOARD_SUBTYPE == HAL_BOARD_SUBTYPE_LINUX_NAVIO
@ -103,7 +111,15 @@ HAL_Linux::HAL_Linux() :
&uartCDriver,
NULL, /* no uartD */
&uartEDriver,
&i2cDriver,
#if CONFIG_HAL_BOARD_SUBTYPE == HAL_BOARD_SUBTYPE_LINUX_BEBOP
&i2cDriver0,
&i2cDriver1,
&i2cDriver2,
#else
&i2cDriver0,
NULL,
NULL,
#endif
&spiDeviceManager,
&analogIn,
&storageDriver,
@ -183,7 +199,13 @@ void HAL_Linux::init(int argc,char* const argv[]) const
scheduler->init(NULL);
gpio->init();
i2c->begin();
#if CONFIG_HAL_BOARD_SUBTYPE == HAL_BOARD_SUBTYPE_LINUX_BEBOP
i2c0->begin();
i2c1->begin();
i2c2->begin();
#else
i2c0->begin();
#endif
rcout->init(NULL);
rcin->init(NULL);
uartA->begin(115200);

View File

@ -124,11 +124,11 @@ void LinuxRCOutput_Navio::set_freq(uint32_t chmask, uint16_t freq_hz)
hal.i2c->writeRegister(PCA9685_ADDRESS, PCA9685_RA_PRE_SCALE, prescale);
/* Enable external clocking */
hal.i2c->writeRegister(PCA9685_ADDRESS, PCA9685_RA_MODE1,
hal.i2c->writeRegister(PCA9685_ADDRESS, PCA9685_RA_MODE1,
PCA9685_MODE1_SLEEP_BIT | PCA9685_MODE1_EXTCLK_BIT);
/* Restart the device to apply new settings and enable auto-incremented write */
hal.i2c->writeRegister(PCA9685_ADDRESS, PCA9685_RA_MODE1,
hal.i2c->writeRegister(PCA9685_ADDRESS, PCA9685_RA_MODE1,
PCA9685_MODE1_RESTART_BIT | PCA9685_MODE1_AI_BIT);
_frequency = freq_hz;

View File

@ -72,6 +72,8 @@ HAL_PX4::HAL_PX4() :
&uartDDriver, /* uartD */
&uartEDriver, /* uartE */
&i2cDriver, /* i2c */
NULL, /* only one i2c */
NULL, /* only one i2c */
&spiDeviceManager, /* spi */
&analogIn, /* analogin */
&storageDriver, /* storage */

View File

@ -50,6 +50,8 @@ HAL_SITL::HAL_SITL() :
&sitlUart3Driver, /* uartD */
&sitlUart4Driver, /* uartE */
&emptyI2C, /* i2c */
&emptyI2C, /* i2c */
&emptyI2C, /* i2c */
&emptySPI, /* spi */
&sitlAnalogIn, /* analogin */
&sitlEEPROMStorage, /* storage */

View File

@ -103,7 +103,9 @@ HAL_VRBRAIN::HAL_VRBRAIN() :
&uartCDriver, /* uartC */
&uartDDriver, /* uartD */
&uartEDriver, /* uartE */
&i2cDriver, /* i2c */
&i2cDriver, /* Empty i2c */
&i2cDriver, /* Empty i2c */
&i2cDriver, /* Empty i2c */
&spiDeviceManager, /* spi */
&analogIn, /* analogin */
&storageDriver, /* storage */