Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -557,6 +557,9 @@ COMMON_SRC = \
config/parameter_group.c \
drivers/adc.c \
drivers/buf_writer.c \
drivers/bus.c \
drivers/bus_busdev_i2c.c \
drivers/bus_busdev_spi.c \
drivers/bus_i2c_soft.c \
drivers/bus_spi.c \
drivers/bus_spi_soft.c \
Expand Down
10 changes: 5 additions & 5 deletions src/main/drivers/accgyro/accgyro_mpu.c
Original file line number Diff line number Diff line change
Expand Up @@ -232,7 +232,7 @@ static bool detectSPISensorsAndUpdateDetectionResult(gyroDev_t *gyro)

#ifdef USE_GYRO_SPI_MPU6000
#ifdef MPU6000_CS_PIN
gyro->bus.spi.csnPin = gyro->bus.spi.csnPin == IO_NONE ? IOGetByTag(IO_TAG(MPU6000_CS_PIN)) : gyro->bus.spi.csnPin;
gyro->bus.busdev.spi.csnPin = gyro->bus.busdev.spi.csnPin == IO_NONE ? IOGetByTag(IO_TAG(MPU6000_CS_PIN)) : gyro->bus.busdev.spi.csnPin;
#endif
sensor = mpu6000SpiDetect(&gyro->bus);
if (sensor != MPU_NONE) {
Expand All @@ -246,7 +246,7 @@ static bool detectSPISensorsAndUpdateDetectionResult(gyroDev_t *gyro)

#ifdef USE_GYRO_SPI_MPU6500
#ifdef MPU6500_CS_PIN
gyro->bus.spi.csnPin = gyro->bus.spi.csnPin == IO_NONE ? IOGetByTag(IO_TAG(MPU6500_CS_PIN)) : gyro->bus.spi.csnPin;
gyro->bus.busdev.spi.csnPin = gyro->bus.busdev.spi.csnPin == IO_NONE ? IOGetByTag(IO_TAG(MPU6500_CS_PIN)) : gyro->bus.busdev.spi.csnPin;
#endif
sensor = mpu6500SpiDetect(&gyro->bus);
// some targets using MPU_9250_SPI, ICM_20608_SPI or ICM_20602_SPI state sensor is MPU_65xx_SPI
Expand All @@ -261,7 +261,7 @@ static bool detectSPISensorsAndUpdateDetectionResult(gyroDev_t *gyro)

#ifdef USE_GYRO_SPI_MPU9250
#ifdef MPU9250_CS_PIN
gyro->bus.spi.csnPin = gyro->bus.spi.csnPin == IO_NONE ? IOGetByTag(IO_TAG(MPU9250_CS_PIN)) : gyro->bus.spi.csnPin;
gyro->bus.busdev.spi.csnPin = gyro->bus.busdev.spi.csnPin == IO_NONE ? IOGetByTag(IO_TAG(MPU9250_CS_PIN)) : gyro->bus.busdev.spi.csnPin;
#endif
sensor = mpu9250SpiDetect(&gyro->bus);
if (sensor != MPU_NONE) {
Expand All @@ -276,7 +276,7 @@ static bool detectSPISensorsAndUpdateDetectionResult(gyroDev_t *gyro)

#ifdef USE_GYRO_SPI_ICM20608
#ifdef ICM20608_CS_PIN
gyro->bus.spi.csnPin = gyro->bus.spi.csnPin == IO_NONE ? IOGetByTag(IO_TAG(ICM20608_CS_PIN)) : gyro->bus.spi.csnPin;
gyro->bus.busdev.spi.csnPin = gyro->bus.busdev.spi.csnPin == IO_NONE ? IOGetByTag(IO_TAG(ICM20608_CS_PIN)) : gyro->bus.busdev.spi.csnPin;
#endif
sensor = icm20608SpiDetect(&gyro->bus);
if (sensor != MPU_NONE) {
Expand All @@ -290,7 +290,7 @@ static bool detectSPISensorsAndUpdateDetectionResult(gyroDev_t *gyro)

#ifdef USE_GYRO_SPI_ICM20689
#ifdef ICM20689_CS_PIN
gyro->bus.spi.csnPin = gyro->bus.spi.csnPin == IO_NONE ? IOGetByTag(IO_TAG(ICM20689_CS_PIN)) : gyro->bus.spi.csnPin;
gyro->bus.busdev.spi.csnPin = gyro->bus.busdev.spi.csnPin == IO_NONE ? IOGetByTag(IO_TAG(ICM20689_CS_PIN)) : gyro->bus.busdev.spi.csnPin;
#endif
sensor = icm20689SpiDetect(&gyro->bus);
if (sensor != MPU_NONE) {
Expand Down
12 changes: 6 additions & 6 deletions src/main/drivers/accgyro/accgyro_spi_mpu6000.c
Original file line number Diff line number Diff line change
Expand Up @@ -105,22 +105,22 @@ static bool mpuSpi6000InitDone = false;

bool mpu6000SpiWriteRegister(const busDevice_t *bus, uint8_t reg, uint8_t data)
{
ENABLE_MPU6000(bus->spi.csnPin);
ENABLE_MPU6000(bus->busdev.spi.csnPin);
delayMicroseconds(1);
spiTransferByte(MPU6000_SPI_INSTANCE, reg);
spiTransferByte(MPU6000_SPI_INSTANCE, data);
DISABLE_MPU6000(bus->spi.csnPin);
DISABLE_MPU6000(bus->busdev.spi.csnPin);
delayMicroseconds(1);

return true;
}

bool mpu6000SpiReadRegister(const busDevice_t *bus, uint8_t reg, uint8_t length, uint8_t *data)
{
ENABLE_MPU6000(bus->spi.csnPin);
ENABLE_MPU6000(bus->busdev.spi.csnPin);
spiTransferByte(MPU6000_SPI_INSTANCE, reg | 0x80); // read transaction
spiTransfer(MPU6000_SPI_INSTANCE, data, NULL, length);
DISABLE_MPU6000(bus->spi.csnPin);
DISABLE_MPU6000(bus->busdev.spi.csnPin);

return true;
}
Expand Down Expand Up @@ -156,8 +156,8 @@ bool mpu6000SpiDetect(const busDevice_t *bus)
uint8_t in;
uint8_t attemptsRemaining = 5;

IOInit(bus->spi.csnPin, OWNER_MPU, RESOURCE_SPI_CS, 0);
IOConfigGPIO(bus->spi.csnPin, SPI_IO_CS_CFG);
IOInit(bus->busdev.spi.csnPin, OWNER_MPU, RESOURCE_SPI_CS, 0);
IOConfigGPIO(bus->busdev.spi.csnPin, SPI_IO_CS_CFG);

spiSetSpeed(MPU6000_SPI_INSTANCE, SPI_CLOCK_INITIALIZATON);

Expand Down
12 changes: 6 additions & 6 deletions src/main/drivers/accgyro/accgyro_spi_mpu6500.c
Original file line number Diff line number Diff line change
Expand Up @@ -44,22 +44,22 @@

bool mpu6500SpiWriteRegister(const busDevice_t *bus, uint8_t reg, uint8_t data)
{
ENABLE_MPU6500(bus->spi.csnPin);
ENABLE_MPU6500(bus->busdev.spi.csnPin);
delayMicroseconds(1);
spiTransferByte(MPU6500_SPI_INSTANCE, reg);
spiTransferByte(MPU6500_SPI_INSTANCE, data);
DISABLE_MPU6500(bus->spi.csnPin);
DISABLE_MPU6500(bus->busdev.spi.csnPin);
delayMicroseconds(1);

return true;
}

bool mpu6500SpiReadRegister(const busDevice_t *bus, uint8_t reg, uint8_t length, uint8_t *data)
{
ENABLE_MPU6500(bus->spi.csnPin);
ENABLE_MPU6500(bus->busdev.spi.csnPin);
spiTransferByte(MPU6500_SPI_INSTANCE, reg | 0x80); // read transaction
spiTransfer(MPU6500_SPI_INSTANCE, data, NULL, length);
DISABLE_MPU6500(bus->spi.csnPin);
DISABLE_MPU6500(bus->busdev.spi.csnPin);

return true;
}
Expand All @@ -72,8 +72,8 @@ static void mpu6500SpiInit(const busDevice_t *bus)
return;
}

IOInit(bus->spi.csnPin, OWNER_MPU, RESOURCE_SPI_CS, 0);
IOConfigGPIO(bus->spi.csnPin, SPI_IO_CS_CFG);
IOInit(bus->busdev.spi.csnPin, OWNER_MPU, RESOURCE_SPI_CS, 0);
IOConfigGPIO(bus->busdev.spi.csnPin, SPI_IO_CS_CFG);

spiSetSpeed(MPU6500_SPI_INSTANCE, SPI_CLOCK_FAST);

Expand Down
16 changes: 8 additions & 8 deletions src/main/drivers/accgyro/accgyro_spi_mpu9250.c
Original file line number Diff line number Diff line change
Expand Up @@ -54,33 +54,33 @@ static bool mpuSpi9250InitDone = false;

bool mpu9250SpiReadRegister(const busDevice_t *bus, uint8_t reg, uint8_t length, uint8_t *data)
{
ENABLE_MPU9250(bus->spi.csnPin);
ENABLE_MPU9250(bus->busdev.spi.csnPin);
spiTransferByte(MPU9250_SPI_INSTANCE, reg | 0x80); // read transaction
spiTransfer(MPU9250_SPI_INSTANCE, data, NULL, length);
DISABLE_MPU9250(bus->spi.csnPin);
DISABLE_MPU9250(bus->busdev.spi.csnPin);

return true;
}

bool mpu9250SpiSlowReadRegister(const busDevice_t *bus, uint8_t reg, uint8_t length, uint8_t *data)
{
ENABLE_MPU9250(bus->spi.csnPin);
ENABLE_MPU9250(bus->busdev.spi.csnPin);
delayMicroseconds(1);
spiTransferByte(MPU9250_SPI_INSTANCE, reg | 0x80); // read transaction
spiTransfer(MPU9250_SPI_INSTANCE, data, NULL, length);
DISABLE_MPU9250(bus->spi.csnPin);
DISABLE_MPU9250(bus->busdev.spi.csnPin);
delayMicroseconds(1);

return true;
}

bool mpu9250SpiWriteRegister(const busDevice_t *bus, uint8_t reg, uint8_t data)
{
ENABLE_MPU9250(bus->spi.csnPin);
ENABLE_MPU9250(bus->busdev.spi.csnPin);
delayMicroseconds(1);
spiTransferByte(MPU9250_SPI_INSTANCE, reg);
spiTransferByte(MPU9250_SPI_INSTANCE, data);
DISABLE_MPU9250(bus->spi.csnPin);
DISABLE_MPU9250(bus->busdev.spi.csnPin);
delayMicroseconds(1);

return true;
Expand Down Expand Up @@ -158,8 +158,8 @@ static void mpu9250AccAndGyroInit(gyroDev_t *gyro)
bool mpu9250SpiDetect(const busDevice_t *bus)
{
/* not the best place for this - should really have an init method */
IOInit(bus->spi.csnPin, OWNER_MPU, RESOURCE_SPI_CS, 0);
IOConfigGPIO(bus->spi.csnPin, SPI_IO_CS_CFG);
IOInit(bus->busdev.spi.csnPin, OWNER_MPU, RESOURCE_SPI_CS, 0);
IOConfigGPIO(bus->busdev.spi.csnPin, SPI_IO_CS_CFG);

spiSetSpeed(MPU9250_SPI_INSTANCE, SPI_CLOCK_INITIALIZATON); //low speed
mpu9250SpiWriteRegister(bus, MPU_RA_PWR_MGMT_1, MPU9250_BIT_RESET);
Expand Down
4 changes: 3 additions & 1 deletion src/main/drivers/barometer/barometer_spi_bmp280.c
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
#include <platform.h>

#include "drivers/io.h"
#include "drivers/bus_spi.h"
#include "drivers/bus.h"

#include "drivers/barometer/barometer.h"
#include "drivers/barometer/barometer_bmp280.h"
Expand All @@ -35,6 +35,8 @@ extern int32_t bmp280_ut;

static IO_t bmp280CsPin = IO_NONE;

BUSDEV_REGISTER_SPI(bmp280_busdev, DEVHW_BMP280, 0, BMP280_CS_PIN);

bool bmp280WriteRegister(uint8_t reg, uint8_t data)
{
ENABLE_BMP280;
Expand Down
158 changes: 158 additions & 0 deletions src/main/drivers/bus.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,158 @@
/*
* This file is part of INAV.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/.
*
* Alternatively, the contents of this file may be used under the terms
* of the GNU General Public License Version 3, as described below:
*
* This file is free software: you may copy, redistribute and/or modify
* it under the terms of the GNU General Public License as published by the
* Free Software Foundation, either version 3 of the License, or (at your
* option) any later version.
*
* This file is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
* Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see http://www.gnu.org/licenses/.
*/

#include "platform.h"

#include "drivers/bus.h"
#include "drivers/io.h"

static void busDevPreInit_SPI(const busDeviceDescriptor_t * descriptor)
{
// Pre-initialize SPI device chip-select line to input with weak pull-up
IO_t io = IOGetByTag(descriptor->busdev.spi.csnPin);
if (io) {
IOInit(io, OWNER_SPI_PREINIT, RESOURCE_SPI_CS, 0);
IOConfigGPIO(io, IOCFG_IPU);
}
}

void busInit(void)
{
/* Pre-initialize bus devices */
for (const busDeviceDescriptor_t * descriptor = __busdev_registry_start; (descriptor) < __busdev_registry_end; descriptor++) {
switch (descriptor->busType) {
case BUSTYPE_NONE:
break;

case BUSTYPE_I2C:
break;

case BUSTYPE_SPI:
busDevPreInit_SPI(descriptor);
break;
}
}
}

static bool busDevInit_I2C(busDevice_t * dev, const busDeviceDescriptor_t * descriptor)
{
dev->busType = descriptor->busType;
dev->busdev.i2c.i2cBus = descriptor->busdev.i2c.i2cBus;
dev->busdev.i2c.address = descriptor->busdev.i2c.address;
return true;
}

static bool busDevInit_SPI(busDevice_t * dev, const busDeviceDescriptor_t * descriptor, resourceOwner_e owner)
{
dev->busType = descriptor->busType;
dev->busdev.spi.spiBus = descriptor->busdev.spi.spiBus;
dev->busdev.spi.csnPin = IOGetByTag(descriptor->busdev.spi.csnPin);

if (dev->busdev.spi.csnPin) {
IOInit(dev->busdev.spi.csnPin, owner, RESOURCE_SPI_CS, 0);
IOConfigGPIO(dev->busdev.spi.csnPin, SPI_IO_CS_CFG);
IOHi(dev->busdev.spi.csnPin);
return true;
}

return false;
}

bool busDeviceInit(busDevice_t * dev, busType_e bus, devHardwareType_e hw, resourceOwner_e owner)
{
for (const busDeviceDescriptor_t * descriptor = __busdev_registry_start; (descriptor) < __busdev_registry_end; descriptor++) {
if (hw == descriptor->devHwType && (bus == descriptor->busType || bus == BUSTYPE_ANY)) {
switch (descriptor->busType) {
case BUSTYPE_NONE:
dev->busType = BUSTYPE_NONE;
return false;

case BUSTYPE_I2C:
return busDevInit_I2C(dev, descriptor);

case BUSTYPE_SPI:
return busDevInit_SPI(dev, descriptor, owner);
break;
}
}
}

return false;
}

/*
bool busWriteBuf(const busDevice_t * dev, uint8_t reg, uint8_t * data, uint8_t length)
{
switch (dev->busType) {
case BUSTYPE_NONE:
return false;
case BUSTYPE_SPI:
return spiBusWriteBuffer(dev, reg & 0x7f, data, length);
case BUSTYPE_I2C:
return i2cBusWriteBuffer(dev, reg, data);
}
}
*/

bool busWrite(const busDevice_t * dev, uint8_t reg, uint8_t data)
{
switch (dev->busType) {
case BUSTYPE_NONE:
return false;
case BUSTYPE_SPI:
return spiBusWriteRegister(dev, reg & 0x7f, data);
case BUSTYPE_I2C:
return i2cBusWriteRegister(dev, reg, data);
}

return false;
}

bool busReadBuf(const busDevice_t * dev, uint8_t reg, uint8_t * data, uint8_t length)
{
switch (dev->busType) {
case BUSTYPE_NONE:
return false;
case BUSTYPE_SPI:
return spiBusReadBuffer(dev, reg | 0x80, data, length);
case BUSTYPE_I2C:
return i2cBusReadBuffer(dev, reg, data, length);
}

return false;
}

bool busRead(const busDevice_t * dev, uint8_t reg, uint8_t * data)
{
switch (dev->busType) {
case BUSTYPE_SPI:
return spiBusReadRegister(dev, reg | 0x80, data);
case BUSTYPE_I2C:
return i2cBusReadRegister(dev, reg, data);
case BUSTYPE_NONE:
return false;
}

return false;
}
Loading