diff --git a/Makefile b/Makefile
index f89361dbb..9fc7f3d0a 100644
--- a/Makefile
+++ b/Makefile
@@ -682,6 +682,7 @@ COMMON_SRC = \
config/config_streamer.c \
drivers/adc.c \
drivers/buf_writer.c \
+ drivers/bus.c \
drivers/bus_i2c_busdev.c \
drivers/bus_i2c_config.c \
drivers/bus_i2c_soft.c \
@@ -849,6 +850,7 @@ SPEED_OPTIMISED_SRC := $(SPEED_OPTIMISED_SRC) \
common/typeconversion.c \
drivers/adc.c \
drivers/buf_writer.c \
+ drivers/bus.c \
drivers/bus_i2c_busdev.c \
drivers/bus_spi.c \
drivers/exti.c \
diff --git a/src/main/drivers/accgyro/accgyro_mpu.c b/src/main/drivers/accgyro/accgyro_mpu.c
index e91829a53..a9d3f0631 100644
--- a/src/main/drivers/accgyro/accgyro_mpu.c
+++ b/src/main/drivers/accgyro/accgyro_mpu.c
@@ -80,7 +80,7 @@ static void mpu6050FindRevision(gyroDev_t *gyro)
// See https://android.googlesource.com/kernel/msm.git/+/eaf36994a3992b8f918c18e4f7411e8b2320a35f/drivers/misc/mpu6050/mldl_cfg.c
// determine product ID and accel revision
- ack = gyro->mpuConfiguration.readFn(&gyro->bus, MPU_RA_XA_OFFS_H, 6, readBuffer);
+ ack = gyro->mpuConfiguration.readFn(&gyro->bus, MPU_RA_XA_OFFS_H, readBuffer, 6);
revision = ((readBuffer[5] & 0x01) << 2) | ((readBuffer[3] & 0x01) << 1) | (readBuffer[1] & 0x01);
if (revision) {
/* Congrats, these parts are better. */
@@ -94,7 +94,7 @@ static void mpu6050FindRevision(gyroDev_t *gyro)
failureMode(FAILURE_ACC_INCOMPATIBLE);
}
} else {
- ack = gyro->mpuConfiguration.readFn(&gyro->bus, MPU_RA_PRODUCT_ID, 1, &productId);
+ ack = gyro->mpuConfiguration.readFn(&gyro->bus, MPU_RA_PRODUCT_ID, &productId, 1);
revision = productId & 0x0F;
if (!revision) {
failureMode(FAILURE_ACC_INCOMPATIBLE);
@@ -165,14 +165,14 @@ static void mpuIntExtiInit(gyroDev_t *gyro)
#endif
}
-bool mpuReadRegisterI2C(const busDevice_t *bus, uint8_t reg, uint8_t length, uint8_t* data)
+static bool mpuReadRegisterI2C(const busDevice_t *bus, uint8_t reg, uint8_t* data, uint8_t length)
{
UNUSED(bus);
const bool ack = i2cRead(MPU_I2C_INSTANCE, MPU_ADDRESS, reg, length, data);
return ack;
}
-bool mpuWriteRegisterI2C(const busDevice_t *bus, uint8_t reg, uint8_t data)
+static bool mpuWriteRegisterI2C(const busDevice_t *bus, uint8_t reg, uint8_t data)
{
UNUSED(bus);
const bool ack = i2cWrite(MPU_I2C_INSTANCE, MPU_ADDRESS, reg, data);
@@ -183,7 +183,7 @@ bool mpuAccRead(accDev_t *acc)
{
uint8_t data[6];
- const bool ack = acc->mpuConfiguration.readFn(&acc->bus, MPU_RA_ACCEL_XOUT_H, 6, data);
+ const bool ack = acc->mpuConfiguration.readFn(&acc->bus, MPU_RA_ACCEL_XOUT_H, data, 6);
if (!ack) {
return false;
}
@@ -206,7 +206,7 @@ bool mpuGyroRead(gyroDev_t *gyro)
{
uint8_t data[6];
- const bool ack = gyro->mpuConfiguration.readFn(&gyro->bus, MPU_RA_GYRO_XOUT_H, 6, data);
+ const bool ack = gyro->mpuConfiguration.readFn(&gyro->bus, MPU_RA_GYRO_XOUT_H, data, 6);
if (!ack) {
return false;
}
@@ -223,7 +223,7 @@ bool mpuGyroReadSPI(gyroDev_t *gyro)
static const uint8_t dataToSend[7] = {MPU_RA_GYRO_XOUT_H | 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
uint8_t data[7];
- const bool ack = spiBusTransfer(&gyro->bus, data, dataToSend, 7);
+ const bool ack = spiBusTransfer(&gyro->bus, dataToSend, data, 7);
if (!ack) {
return false;
}
@@ -253,8 +253,8 @@ static bool detectSPISensorsAndUpdateDetectionResult(gyroDev_t *gyro)
sensor = mpu6000SpiDetect(&gyro->bus);
if (sensor != MPU_NONE) {
gyro->mpuDetectionResult.sensor = sensor;
- gyro->mpuConfiguration.readFn = spiReadRegisterBuffer;
- gyro->mpuConfiguration.writeFn = spiWriteRegister;
+ gyro->mpuConfiguration.readFn = spiBusReadRegisterBuffer;
+ gyro->mpuConfiguration.writeFn = spiBusWriteRegister;
return true;
}
#endif
@@ -270,8 +270,8 @@ static bool detectSPISensorsAndUpdateDetectionResult(gyroDev_t *gyro)
// some targets using MPU_9250_SPI, ICM_20608_SPI or ICM_20602_SPI state sensor is MPU_65xx_SPI
if (sensor != MPU_NONE) {
gyro->mpuDetectionResult.sensor = sensor;
- gyro->mpuConfiguration.readFn = spiReadRegisterBuffer;
- gyro->mpuConfiguration.writeFn = spiWriteRegister;
+ gyro->mpuConfiguration.readFn = spiBusReadRegisterBuffer;
+ gyro->mpuConfiguration.writeFn = spiBusWriteRegister;
return true;
}
#endif
@@ -286,8 +286,8 @@ static bool detectSPISensorsAndUpdateDetectionResult(gyroDev_t *gyro)
sensor = mpu9250SpiDetect(&gyro->bus);
if (sensor != MPU_NONE) {
gyro->mpuDetectionResult.sensor = sensor;
- gyro->mpuConfiguration.readFn = spiReadRegisterBuffer;
- gyro->mpuConfiguration.writeFn = spiWriteRegister;
+ gyro->mpuConfiguration.readFn = spiBusReadRegisterBuffer;
+ gyro->mpuConfiguration.writeFn = spiBusWriteRegister;
gyro->mpuConfiguration.resetFn = mpu9250SpiResetGyro;
return true;
}
@@ -303,8 +303,8 @@ static bool detectSPISensorsAndUpdateDetectionResult(gyroDev_t *gyro)
sensor = icm20689SpiDetect(&gyro->bus);
if (sensor != MPU_NONE) {
gyro->mpuDetectionResult.sensor = sensor;
- gyro->mpuConfiguration.readFn = spiReadRegisterBuffer;
- gyro->mpuConfiguration.writeFn = spiWriteRegister;
+ gyro->mpuConfiguration.readFn = spiBusReadRegisterBuffer;
+ gyro->mpuConfiguration.writeFn = spiBusWriteRegister;
return true;
}
#endif
@@ -319,8 +319,8 @@ static bool detectSPISensorsAndUpdateDetectionResult(gyroDev_t *gyro)
sensor = bmi160Detect(&gyro->bus);
if (sensor != MPU_NONE) {
gyro->mpuDetectionResult.sensor = sensor;
- gyro->mpuConfiguration.readFn = spiReadRegisterBuffer;
- gyro->mpuConfiguration.writeFn = spiWriteRegister;
+ gyro->mpuConfiguration.readFn = spiBusReadRegisterBuffer;
+ gyro->mpuConfiguration.writeFn = spiBusWriteRegister;
return true;
}
#endif
@@ -336,7 +336,9 @@ void mpuDetect(gyroDev_t *gyro)
uint8_t sig = 0;
#ifdef USE_I2C
- bool ack = mpuReadRegisterI2C(&gyro->bus, MPU_RA_WHO_AM_I, 1, &sig);
+ gyro->bus.busdev_u.i2c.device = MPU_I2C_INSTANCE;
+ gyro->bus.busdev_u.i2c.address = MPU_ADDRESS;
+ bool ack = mpuReadRegisterI2C(&gyro->bus, MPU_RA_WHO_AM_I, &sig, 1);
#else
bool ack = false;
#endif
@@ -352,7 +354,7 @@ void mpuDetect(gyroDev_t *gyro)
// If an MPU3050 is connected sig will contain 0.
uint8_t inquiryResult;
- ack = mpuReadRegisterI2C(&gyro->bus, MPU_RA_WHO_AM_I_LEGACY, 1, &inquiryResult);
+ ack = mpuReadRegisterI2C(&gyro->bus, MPU_RA_WHO_AM_I_LEGACY, &inquiryResult, 1);
inquiryResult &= MPU_INQUIRY_MASK;
if (ack && inquiryResult == MPUx0x0_WHO_AM_I_CONST) {
gyro->mpuDetectionResult.sensor = MPU_3050;
diff --git a/src/main/drivers/accgyro/accgyro_mpu.h b/src/main/drivers/accgyro/accgyro_mpu.h
index 2825120e6..1cd9f5500 100644
--- a/src/main/drivers/accgyro/accgyro_mpu.h
+++ b/src/main/drivers/accgyro/accgyro_mpu.h
@@ -125,7 +125,7 @@
// RF = Register Flag
#define MPU_RF_DATA_RDY_EN (1 << 0)
-typedef bool (*mpuReadRegisterFnPtr)(const busDevice_t *bus, uint8_t reg, uint8_t length, uint8_t* data);
+typedef bool (*mpuReadRegisterFnPtr)(const busDevice_t *bus, uint8_t reg, uint8_t* data, uint8_t length);
typedef bool (*mpuWriteRegisterFnPtr)(const busDevice_t *bus, uint8_t reg, uint8_t data);
typedef void (*mpuResetFnPtr)(void);
@@ -190,9 +190,6 @@ typedef struct mpuDetectionResult_s {
mpu6050Resolution_e resolution;
} mpuDetectionResult_t;
-bool mpuReadRegisterI2C(const busDevice_t *bus, uint8_t reg, uint8_t length, uint8_t* data);
-bool mpuWriteRegisterI2C(const busDevice_t *bus, uint8_t reg, uint8_t data);
-
struct gyroDev_s;
void mpuGyroInit(struct gyroDev_s *gyro);
struct accDev_s;
diff --git a/src/main/drivers/accgyro/accgyro_mpu3050.c b/src/main/drivers/accgyro/accgyro_mpu3050.c
index 10d1f0e68..74a684c35 100644
--- a/src/main/drivers/accgyro/accgyro_mpu3050.c
+++ b/src/main/drivers/accgyro/accgyro_mpu3050.c
@@ -68,7 +68,7 @@ static bool mpu3050GyroRead(gyroDev_t *gyro)
{
uint8_t data[6];
- const bool ack = gyro->mpuConfiguration.readFn(&gyro->bus, MPU3050_GYRO_OUT, 6, data);
+ const bool ack = gyro->mpuConfiguration.readFn(&gyro->bus, MPU3050_GYRO_OUT, data, 6);
if (!ack) {
return false;
}
@@ -83,7 +83,7 @@ static bool mpu3050GyroRead(gyroDev_t *gyro)
static bool mpu3050ReadTemperature(gyroDev_t *gyro, int16_t *tempData)
{
uint8_t buf[2];
- if (!gyro->mpuConfiguration.readFn(&gyro->bus, MPU3050_TEMP_OUT, 2, buf)) {
+ if (!gyro->mpuConfiguration.readFn(&gyro->bus, MPU3050_TEMP_OUT, buf, 2)) {
return false;
}
diff --git a/src/main/drivers/accgyro/accgyro_spi_bmi160.c b/src/main/drivers/accgyro/accgyro_spi_bmi160.c
index 5dc9d0290..1c7152afe 100644
--- a/src/main/drivers/accgyro/accgyro_spi_bmi160.c
+++ b/src/main/drivers/accgyro/accgyro_spi_bmi160.c
@@ -104,12 +104,12 @@ uint8_t bmi160Detect(const busDevice_t *bus)
spiSetDivisor(bus->busdev_u.spi.instance, BMI160_SPI_DIVISOR);
- /* Read this address to acticate SPI (see p. 84) */
- spiReadRegister(bus, 0x7F);
+ /* Read this address to activate SPI (see p. 84) */
+ spiBusReadRegister(bus, 0x7F);
delay(10); // Give SPI some time to start up
/* Check the chip ID */
- if (spiReadRegister(bus, BMI160_REG_CHIPID) != 0xd1) {
+ if (spiBusReadRegister(bus, BMI160_REG_CHIPID) != 0xd1) {
return MPU_NONE;
}
@@ -162,7 +162,7 @@ static int32_t BMI160_Config(const busDevice_t *bus)
delay(5); // can take up to 3.8ms
// Verify that normal power mode was entered
- uint8_t pmu_status = spiReadRegister(bus, BMI160_REG_PMU_STAT);
+ uint8_t pmu_status = spiBusReadRegister(bus, BMI160_REG_PMU_STAT);
if ((pmu_status & 0x3C) != 0x14){
return -3;
}
@@ -191,7 +191,7 @@ static int32_t BMI160_Config(const busDevice_t *bus)
delay(1);
// Enable offset compensation
- uint8_t val = spiReadRegister(bus, BMI160_REG_OFFSET_0);
+ uint8_t val = spiBusReadRegister(bus, BMI160_REG_OFFSET_0);
if (BMI160_WriteReg(bus, BMI160_REG_OFFSET_0, val | 0xC0) != 0) {
return -7;
}
@@ -232,7 +232,7 @@ static int32_t BMI160_do_foc(const busDevice_t *bus)
// Wait for FOC to complete
for (int i=0; i<50; i++) {
- val = spiReadRegister(bus, BMI160_REG_STATUS);
+ val = spiBusReadRegister(bus, BMI160_REG_STATUS);
if (val & BMI160_REG_STATUS_FOC_RDY) {
break;
}
@@ -243,7 +243,7 @@ static int32_t BMI160_do_foc(const busDevice_t *bus)
}
// Program NVM
- val = spiReadRegister(bus, BMI160_REG_CONF);
+ val = spiBusReadRegister(bus, BMI160_REG_CONF);
if (BMI160_WriteReg(bus, BMI160_REG_CONF, val | BMI160_REG_CONF_NVM_PROG_EN) != 0) {
return -4;
}
@@ -254,7 +254,7 @@ static int32_t BMI160_do_foc(const busDevice_t *bus)
// Wait for NVM programming to complete
for (int i=0; i<50; i++) {
- val = spiReadRegister(bus, BMI160_REG_STATUS);
+ val = spiBusReadRegister(bus, BMI160_REG_STATUS);
if (val & BMI160_REG_STATUS_NVM_RDY) {
break;
}
@@ -321,16 +321,16 @@ bool bmi160AccRead(accDev_t *acc)
BUFFER_SIZE,
};
- uint8_t bmi160_rec_buf[BUFFER_SIZE];
- uint8_t bmi160_tx_buf[BUFFER_SIZE] = {BMI160_REG_ACC_DATA_X_LSB | 0x80, 0, 0, 0, 0, 0, 0};
+ uint8_t bmi160_rx_buf[BUFFER_SIZE];
+ static const uint8_t bmi160_tx_buf[BUFFER_SIZE] = {BMI160_REG_ACC_DATA_X_LSB | 0x80, 0, 0, 0, 0, 0, 0};
IOLo(acc->bus.busdev_u.spi.csnPin);
- spiTransfer(acc->bus.busdev_u.spi.instance, bmi160_rec_buf, bmi160_tx_buf, BUFFER_SIZE); // receive response
+ spiTransfer(acc->bus.busdev_u.spi.instance, bmi160_tx_buf, bmi160_rx_buf, BUFFER_SIZE); // receive response
IOHi(acc->bus.busdev_u.spi.csnPin);
- acc->ADCRaw[X] = (int16_t)((bmi160_rec_buf[IDX_ACCEL_XOUT_H] << 8) | bmi160_rec_buf[IDX_ACCEL_XOUT_L]);
- acc->ADCRaw[Y] = (int16_t)((bmi160_rec_buf[IDX_ACCEL_YOUT_H] << 8) | bmi160_rec_buf[IDX_ACCEL_YOUT_L]);
- acc->ADCRaw[Z] = (int16_t)((bmi160_rec_buf[IDX_ACCEL_ZOUT_H] << 8) | bmi160_rec_buf[IDX_ACCEL_ZOUT_L]);
+ acc->ADCRaw[X] = (int16_t)((bmi160_rx_buf[IDX_ACCEL_XOUT_H] << 8) | bmi160_rx_buf[IDX_ACCEL_XOUT_L]);
+ acc->ADCRaw[Y] = (int16_t)((bmi160_rx_buf[IDX_ACCEL_YOUT_H] << 8) | bmi160_rx_buf[IDX_ACCEL_YOUT_L]);
+ acc->ADCRaw[Z] = (int16_t)((bmi160_rx_buf[IDX_ACCEL_ZOUT_H] << 8) | bmi160_rx_buf[IDX_ACCEL_ZOUT_L]);
return true;
}
@@ -349,16 +349,16 @@ bool bmi160GyroRead(gyroDev_t *gyro)
BUFFER_SIZE,
};
- uint8_t bmi160_rec_buf[BUFFER_SIZE];
+ uint8_t bmi160_rx_buf[BUFFER_SIZE];
static const uint8_t bmi160_tx_buf[BUFFER_SIZE] = {BMI160_REG_GYR_DATA_X_LSB | 0x80, 0, 0, 0, 0, 0, 0};
IOLo(gyro->bus.busdev_u.spi.csnPin);
- spiTransfer(gyro->bus.busdev_u.spi.instance, bmi160_rec_buf, bmi160_tx_buf, BUFFER_SIZE); // receive response
+ spiTransfer(gyro->bus.busdev_u.spi.instance, bmi160_tx_buf, bmi160_rx_buf, BUFFER_SIZE); // receive response
IOHi(gyro->bus.busdev_u.spi.csnPin);
- gyro->gyroADCRaw[X] = (int16_t)((bmi160_rec_buf[IDX_GYRO_XOUT_H] << 8) | bmi160_rec_buf[IDX_GYRO_XOUT_L]);
- gyro->gyroADCRaw[Y] = (int16_t)((bmi160_rec_buf[IDX_GYRO_YOUT_H] << 8) | bmi160_rec_buf[IDX_GYRO_YOUT_L]);
- gyro->gyroADCRaw[Z] = (int16_t)((bmi160_rec_buf[IDX_GYRO_ZOUT_H] << 8) | bmi160_rec_buf[IDX_GYRO_ZOUT_L]);
+ gyro->gyroADCRaw[X] = (int16_t)((bmi160_rx_buf[IDX_GYRO_XOUT_H] << 8) | bmi160_rx_buf[IDX_GYRO_XOUT_L]);
+ gyro->gyroADCRaw[Y] = (int16_t)((bmi160_rx_buf[IDX_GYRO_YOUT_H] << 8) | bmi160_rx_buf[IDX_GYRO_YOUT_L]);
+ gyro->gyroADCRaw[Z] = (int16_t)((bmi160_rx_buf[IDX_GYRO_ZOUT_H] << 8) | bmi160_rx_buf[IDX_GYRO_ZOUT_L]);
return true;
}
diff --git a/src/main/drivers/accgyro/accgyro_spi_icm20689.c b/src/main/drivers/accgyro/accgyro_spi_icm20689.c
index 452924714..0426923d4 100644
--- a/src/main/drivers/accgyro/accgyro_spi_icm20689.c
+++ b/src/main/drivers/accgyro/accgyro_spi_icm20689.c
@@ -59,12 +59,12 @@ uint8_t icm20689SpiDetect(const busDevice_t *bus)
spiSetDivisor(bus->busdev_u.spi.instance, SPI_CLOCK_INITIALIZATON); //low speed
- spiWriteRegister(bus, MPU_RA_PWR_MGMT_1, ICM20689_BIT_RESET);
+ spiBusWriteRegister(bus, MPU_RA_PWR_MGMT_1, ICM20689_BIT_RESET);
uint8_t attemptsRemaining = 20;
do {
delay(150);
- const uint8_t whoAmI = spiReadRegister(bus, MPU_RA_WHO_AM_I);
+ const uint8_t whoAmI = spiBusReadRegister(bus, MPU_RA_WHO_AM_I);
if (whoAmI == ICM20689_WHO_AM_I_CONST) {
break;
}
diff --git a/src/main/drivers/accgyro/accgyro_spi_mpu6000.c b/src/main/drivers/accgyro/accgyro_spi_mpu6000.c
index 07f5fc909..9ccac7e48 100644
--- a/src/main/drivers/accgyro/accgyro_spi_mpu6000.c
+++ b/src/main/drivers/accgyro/accgyro_spi_mpu6000.c
@@ -108,7 +108,7 @@ void mpu6000SpiGyroInit(gyroDev_t *gyro)
spiSetDivisor(gyro->bus.busdev_u.spi.instance, SPI_CLOCK_INITIALIZATON);
// Accel and Gyro DLPF Setting
- spiWriteRegister(&gyro->bus, MPU6000_CONFIG, gyro->lpf);
+ spiBusWriteRegister(&gyro->bus, MPU6000_CONFIG, gyro->lpf);
delayMicroseconds(1);
spiSetDivisor(gyro->bus.busdev_u.spi.instance, SPI_CLOCK_FAST); // 18 MHz SPI clock
@@ -133,13 +133,13 @@ uint8_t mpu6000SpiDetect(const busDevice_t *bus)
spiSetDivisor(bus->busdev_u.spi.instance, SPI_CLOCK_INITIALIZATON);
- spiWriteRegister(bus, MPU_RA_PWR_MGMT_1, BIT_H_RESET);
+ spiBusWriteRegister(bus, MPU_RA_PWR_MGMT_1, BIT_H_RESET);
uint8_t attemptsRemaining = 5;
do {
delay(150);
- const uint8_t whoAmI = spiReadRegister(bus, MPU_RA_WHO_AM_I);
+ const uint8_t whoAmI = spiBusReadRegister(bus, MPU_RA_WHO_AM_I);
if (whoAmI == MPU6000_WHO_AM_I_CONST) {
break;
}
@@ -148,7 +148,7 @@ uint8_t mpu6000SpiDetect(const busDevice_t *bus)
}
} while (attemptsRemaining--);
- const uint8_t productID = spiReadRegister(bus, MPU_RA_PRODUCT_ID);
+ const uint8_t productID = spiBusReadRegister(bus, MPU_RA_PRODUCT_ID);
/* look for a product ID we recognise */
@@ -181,41 +181,41 @@ static void mpu6000AccAndGyroInit(gyroDev_t *gyro)
spiSetDivisor(gyro->bus.busdev_u.spi.instance, SPI_CLOCK_INITIALIZATON);
// Device Reset
- spiWriteRegister(&gyro->bus, MPU_RA_PWR_MGMT_1, BIT_H_RESET);
+ spiBusWriteRegister(&gyro->bus, MPU_RA_PWR_MGMT_1, BIT_H_RESET);
delay(150);
- spiWriteRegister(&gyro->bus, MPU_RA_SIGNAL_PATH_RESET, BIT_GYRO | BIT_ACC | BIT_TEMP);
+ spiBusWriteRegister(&gyro->bus, MPU_RA_SIGNAL_PATH_RESET, BIT_GYRO | BIT_ACC | BIT_TEMP);
delay(150);
// Clock Source PPL with Z axis gyro reference
- spiWriteRegister(&gyro->bus, MPU_RA_PWR_MGMT_1, MPU_CLK_SEL_PLLGYROZ);
+ spiBusWriteRegister(&gyro->bus, MPU_RA_PWR_MGMT_1, MPU_CLK_SEL_PLLGYROZ);
delayMicroseconds(15);
// Disable Primary I2C Interface
- spiWriteRegister(&gyro->bus, MPU_RA_USER_CTRL, BIT_I2C_IF_DIS);
+ spiBusWriteRegister(&gyro->bus, MPU_RA_USER_CTRL, BIT_I2C_IF_DIS);
delayMicroseconds(15);
- spiWriteRegister(&gyro->bus, MPU_RA_PWR_MGMT_2, 0x00);
+ spiBusWriteRegister(&gyro->bus, MPU_RA_PWR_MGMT_2, 0x00);
delayMicroseconds(15);
// Accel Sample Rate 1kHz
// Gyroscope Output Rate = 1kHz when the DLPF is enabled
- spiWriteRegister(&gyro->bus, MPU_RA_SMPLRT_DIV, gyroMPU6xxxGetDividerDrops(gyro));
+ spiBusWriteRegister(&gyro->bus, MPU_RA_SMPLRT_DIV, gyroMPU6xxxGetDividerDrops(gyro));
delayMicroseconds(15);
// Gyro +/- 1000 DPS Full Scale
- spiWriteRegister(&gyro->bus, MPU_RA_GYRO_CONFIG, INV_FSR_2000DPS << 3);
+ spiBusWriteRegister(&gyro->bus, MPU_RA_GYRO_CONFIG, INV_FSR_2000DPS << 3);
delayMicroseconds(15);
// Accel +/- 8 G Full Scale
- spiWriteRegister(&gyro->bus, MPU_RA_ACCEL_CONFIG, INV_FSR_8G << 3);
+ spiBusWriteRegister(&gyro->bus, MPU_RA_ACCEL_CONFIG, INV_FSR_8G << 3);
delayMicroseconds(15);
- spiWriteRegister(&gyro->bus, MPU_RA_INT_PIN_CFG, 0 << 7 | 0 << 6 | 0 << 5 | 1 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0); // INT_ANYRD_2CLEAR
+ spiBusWriteRegister(&gyro->bus, MPU_RA_INT_PIN_CFG, 0 << 7 | 0 << 6 | 0 << 5 | 1 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0); // INT_ANYRD_2CLEAR
delayMicroseconds(15);
#ifdef USE_MPU_DATA_READY_SIGNAL
- spiWriteRegister(&gyro->bus, MPU_RA_INT_ENABLE, MPU_RF_DATA_RDY_EN);
+ spiBusWriteRegister(&gyro->bus, MPU_RA_INT_ENABLE, MPU_RF_DATA_RDY_EN);
delayMicroseconds(15);
#endif
diff --git a/src/main/drivers/accgyro/accgyro_spi_mpu6500.c b/src/main/drivers/accgyro/accgyro_spi_mpu6500.c
index 5b942b8d7..8d2918ddd 100755
--- a/src/main/drivers/accgyro/accgyro_spi_mpu6500.c
+++ b/src/main/drivers/accgyro/accgyro_spi_mpu6500.c
@@ -57,7 +57,7 @@ uint8_t mpu6500SpiDetect(const busDevice_t *bus)
{
mpu6500SpiInit(bus);
- const uint8_t whoAmI = spiReadRegister(bus, MPU_RA_WHO_AM_I);
+ const uint8_t whoAmI = spiBusReadRegister(bus, MPU_RA_WHO_AM_I);
uint8_t mpuDetected = MPU_NONE;
switch (whoAmI) {
@@ -96,7 +96,7 @@ void mpu6500SpiGyroInit(gyroDev_t *gyro)
mpu6500GyroInit(gyro);
// Disable Primary I2C Interface
- spiWriteRegister(&gyro->bus, MPU_RA_USER_CTRL, MPU6500_BIT_I2C_IF_DIS);
+ spiBusWriteRegister(&gyro->bus, MPU_RA_USER_CTRL, MPU6500_BIT_I2C_IF_DIS);
delay(100);
spiSetDivisor(gyro->bus.busdev_u.spi.instance, SPI_CLOCK_FAST);
diff --git a/src/main/drivers/accgyro/accgyro_spi_mpu9250.c b/src/main/drivers/accgyro/accgyro_spi_mpu9250.c
index dfa9d5a11..ba846b138 100644
--- a/src/main/drivers/accgyro/accgyro_spi_mpu9250.c
+++ b/src/main/drivers/accgyro/accgyro_spi_mpu9250.c
@@ -62,12 +62,12 @@ bool mpu9250SpiWriteRegister(const busDevice_t *bus, uint8_t reg, uint8_t data)
return true;
}
-static bool mpu9250SpiSlowReadRegisterBuffer(const busDevice_t *bus, uint8_t reg, uint8_t length, uint8_t *data)
+static bool mpu9250SpiSlowReadRegisterBuffer(const busDevice_t *bus, uint8_t reg, uint8_t *data, uint8_t length)
{
IOLo(bus->busdev_u.spi.csnPin);
delayMicroseconds(1);
spiTransferByte(bus->busdev_u.spi.instance, reg | 0x80); // read transaction
- spiTransfer(bus->busdev_u.spi.instance, data, NULL, length);
+ spiTransfer(bus->busdev_u.spi.instance, NULL, data, length);
IOHi(bus->busdev_u.spi.csnPin);
delayMicroseconds(1);
@@ -118,7 +118,7 @@ bool mpu9250SpiWriteRegisterVerify(const busDevice_t *bus, uint8_t reg, uint8_t
uint8_t attemptsRemaining = 20;
do {
uint8_t in;
- mpu9250SpiSlowReadRegisterBuffer(bus, reg, 1, &in);
+ mpu9250SpiSlowReadRegisterBuffer(bus, reg, &in, 1);
if (in == data) {
return true;
} else {
@@ -180,7 +180,7 @@ uint8_t mpu9250SpiDetect(const busDevice_t *bus)
uint8_t attemptsRemaining = 20;
do {
delay(150);
- const uint8_t in = spiReadRegister(bus, MPU_RA_WHO_AM_I);
+ const uint8_t in = spiBusReadRegister(bus, MPU_RA_WHO_AM_I);
if (in == MPU9250_WHO_AM_I_CONST || in == MPU9255_WHO_AM_I_CONST) {
break;
}
diff --git a/src/main/drivers/barometer/barometer_bmp085.c b/src/main/drivers/barometer/barometer_bmp085.c
index 9cc973205..ebfbede64 100644
--- a/src/main/drivers/barometer/barometer_bmp085.c
+++ b/src/main/drivers/barometer/barometer_bmp085.c
@@ -158,12 +158,12 @@ void bmp085Disable(const bmp085Config_t *config)
bool bmp085ReadRegister(busDevice_t *busdev, uint8_t cmd, uint8_t len, uint8_t *data)
{
- return i2cReadRegisterBuffer(busdev, cmd, len, data);
+ return i2cBusReadRegisterBuffer(busdev, cmd, data, len);
}
bool bmp085WriteRegister(busDevice_t *busdev, uint8_t cmd, uint8_t byte)
{
- return i2cWriteRegister(busdev, cmd, byte);
+ return i2cBusWriteRegister(busdev, cmd, byte);
}
bool bmp085Detect(const bmp085Config_t *config, baroDev_t *baro)
diff --git a/src/main/drivers/barometer/barometer_bmp280.c b/src/main/drivers/barometer/barometer_bmp280.c
index 794ec7f03..d55cac9b3 100644
--- a/src/main/drivers/barometer/barometer_bmp280.c
+++ b/src/main/drivers/barometer/barometer_bmp280.c
@@ -70,11 +70,11 @@ bool bmp280ReadRegister(busDevice_t *busdev, uint8_t reg, uint8_t length, uint8_
switch (busdev->bustype) {
#ifdef USE_BARO_SPI_BMP280
case BUSTYPE_SPI:
- return spiReadRegisterBuffer(busdev, reg | 0x80, length, data);
+ return spiBusReadRegisterBuffer(busdev, reg | 0x80, data, length);
#endif
#ifdef USE_BARO_BMP280
case BUSTYPE_I2C:
- return i2cReadRegisterBuffer(busdev, reg, length, data);
+ return i2cBusReadRegisterBuffer(busdev, reg, data, length);
#endif
}
return false;
@@ -85,11 +85,11 @@ bool bmp280WriteRegister(busDevice_t *busdev, uint8_t reg, uint8_t data)
switch (busdev->bustype) {
#ifdef USE_BARO_SPI_BMP280
case BUSTYPE_SPI:
- return spiWriteRegister(busdev, reg & 0x7f, data);
+ return spiBusWriteRegister(busdev, reg & 0x7f, data);
#endif
#ifdef USE_BARO_BMP280
case BUSTYPE_I2C:
- return i2cWriteRegister(busdev, reg, data);
+ return i2cBusWriteRegister(busdev, reg, data);
#endif
}
return false;
diff --git a/src/main/drivers/barometer/barometer_ms5611.c b/src/main/drivers/barometer/barometer_ms5611.c
index 50cb628e8..c97e53550 100644
--- a/src/main/drivers/barometer/barometer_ms5611.c
+++ b/src/main/drivers/barometer/barometer_ms5611.c
@@ -66,11 +66,11 @@ bool ms5611ReadCommand(busDevice_t *busdev, uint8_t cmd, uint8_t len, uint8_t *d
switch (busdev->bustype) {
#ifdef USE_BARO_SPI_MS5611
case BUSTYPE_SPI:
- return spiReadRegisterBuffer(busdev, cmd | 0x80, len, data);
+ return spiBusReadRegisterBuffer(busdev, cmd | 0x80, data, len);
#endif
#ifdef USE_BARO_MS5611
case BUSTYPE_I2C:
- return i2cReadRegisterBuffer(busdev, cmd, len, data);
+ return i2cBusReadRegisterBuffer(busdev, cmd, data, len);
#endif
}
return false;
@@ -81,11 +81,11 @@ bool ms5611WriteCommand(busDevice_t *busdev, uint8_t cmd, uint8_t byte)
switch (busdev->bustype) {
#ifdef USE_BARO_SPI_MS5611
case BUSTYPE_SPI:
- return spiWriteRegister(busdev, cmd & 0x7f, byte);
+ return spiBusWriteRegister(busdev, cmd & 0x7f, byte);
#endif
#ifdef USE_BARO_MS5611
case BUSTYPE_I2C:
- return i2cWriteRegister(busdev, cmd, byte);
+ return i2cBusWriteRegister(busdev, cmd, byte);
#endif
}
return false;
diff --git a/src/main/drivers/bus.c b/src/main/drivers/bus.c
new file mode 100644
index 000000000..2bda17e65
--- /dev/null
+++ b/src/main/drivers/bus.c
@@ -0,0 +1,58 @@
+/*
+ * This file is part of Cleanflight.
+ *
+ * Cleanflight is free software: you can redistribute it 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.
+ *
+ * Cleanflight 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 Cleanflight. If not, see .
+ */
+
+#include
+#include
+
+#include "platform.h"
+
+#include "drivers/bus.h"
+#include "drivers/bus_i2c_busdev.h"
+#include "drivers/bus_spi.h"
+
+bool busWriteRegister(const busDevice_t *busdev, uint8_t reg, uint8_t data)
+{
+ switch (busdev->bustype) {
+ case BUSTYPE_SPI:
+ return spiBusWriteRegister(busdev, reg & 0x7f, data);
+ case BUSTYPE_I2C:
+ return i2cBusWriteRegister(busdev, reg, data);
+ }
+ return false;
+}
+
+bool busReadRegisterBuffer(const busDevice_t *busdev, uint8_t reg, uint8_t *data, uint8_t length)
+{
+ switch (busdev->bustype) {
+ case BUSTYPE_SPI:
+ return spiBusReadRegisterBuffer(busdev, reg | 0x80, data, length);
+ case BUSTYPE_I2C:
+ return i2cBusReadRegisterBuffer(busdev, reg, data, length);
+ }
+ return false;
+}
+
+uint8_t busReadRegister(const busDevice_t *busdev, uint8_t reg)
+{
+ switch (busdev->bustype) {
+ case BUSTYPE_SPI:
+ return spiBusReadRegister(busdev, reg & 0x7f);
+ case BUSTYPE_I2C:
+ return i2cBusReadRegister(busdev, reg);
+ }
+ return false;
+}
diff --git a/src/main/drivers/bus.h b/src/main/drivers/bus.h
index 1736c2d87..448e5b53f 100644
--- a/src/main/drivers/bus.h
+++ b/src/main/drivers/bus.h
@@ -46,3 +46,8 @@ typedef struct busDevice_s {
#ifdef TARGET_BUS_INIT
void targetBusInit(void);
#endif
+
+bool busWriteRegister(const busDevice_t *bus, uint8_t reg, uint8_t data);
+bool busReadRegisterBuffer(const busDevice_t *bus, uint8_t reg, uint8_t *data, uint8_t length);
+uint8_t busReadRegister(const busDevice_t *bus, uint8_t reg);
+
diff --git a/src/main/drivers/bus_i2c_busdev.c b/src/main/drivers/bus_i2c_busdev.c
index 2381890b4..7d835c69a 100644
--- a/src/main/drivers/bus_i2c_busdev.c
+++ b/src/main/drivers/bus_i2c_busdev.c
@@ -23,17 +23,23 @@
#if defined(USE_I2C)
-#include "drivers/bus_i2c.h"
#include "drivers/bus.h"
+#include "drivers/bus_i2c.h"
-bool i2cReadRegisterBuffer(busDevice_t *busdev, uint8_t reg, uint8_t len, uint8_t *buffer)
-{
- return i2cRead(busdev->busdev_u.i2c.device, busdev->busdev_u.i2c.address, reg, len, buffer);
-}
-
-bool i2cWriteRegister(busDevice_t *busdev, uint8_t reg, uint8_t data)
+bool i2cBusWriteRegister(const busDevice_t *busdev, uint8_t reg, uint8_t data)
{
return i2cWrite(busdev->busdev_u.i2c.device, busdev->busdev_u.i2c.address, reg, data);
}
+bool i2cBusReadRegisterBuffer(const busDevice_t *busdev, uint8_t reg, uint8_t *data, uint8_t length)
+{
+ return i2cRead(busdev->busdev_u.i2c.device, busdev->busdev_u.i2c.address, reg, length, data);
+}
+
+uint8_t i2cBusReadRegister(const busDevice_t *busdev, uint8_t reg)
+{
+ uint8_t data;
+ i2cRead(busdev->busdev_u.i2c.device, busdev->busdev_u.i2c.address, reg, 1, &data);
+ return data;
+}
#endif
diff --git a/src/main/drivers/bus_i2c_busdev.h b/src/main/drivers/bus_i2c_busdev.h
index 352ff3b65..93b81cb10 100644
--- a/src/main/drivers/bus_i2c_busdev.h
+++ b/src/main/drivers/bus_i2c_busdev.h
@@ -17,5 +17,6 @@
#pragma once
-bool i2cReadRegisterBuffer(busDevice_t *busdev, uint8_t reg, uint8_t len, uint8_t *buffer);
-bool i2cWriteRegister(busDevice_t *busdev, uint8_t reg, uint8_t data);
+bool i2cBusWriteRegister(const busDevice_t *busdev, uint8_t reg, uint8_t data);
+bool i2cBusReadRegisterBuffer(const busDevice_t *busdev, uint8_t reg, uint8_t *data, uint8_t length);
+uint8_t i2cBusReadRegister(const busDevice_t *bus, uint8_t reg);
diff --git a/src/main/drivers/bus_spi.c b/src/main/drivers/bus_spi.c
index 325fab354..61f441ac7 100644
--- a/src/main/drivers/bus_spi.c
+++ b/src/main/drivers/bus_spi.c
@@ -131,8 +131,7 @@ void spiInitDevice(SPIDevice device)
bool spiInit(SPIDevice device)
{
- switch (device)
- {
+ switch (device) {
case SPIINVALID:
return false;
case SPIDEV_1:
@@ -170,8 +169,9 @@ bool spiInit(SPIDevice device)
uint32_t spiTimeoutUserCallback(SPI_TypeDef *instance)
{
SPIDevice device = spiDeviceByInstance(instance);
- if (device == SPIINVALID)
+ if (device == SPIINVALID) {
return -1;
+ }
spiDevice[device].errorCount++;
return spiDevice[device].errorCount;
}
@@ -215,7 +215,7 @@ bool spiIsBusBusy(SPI_TypeDef *instance)
}
-bool spiTransfer(SPI_TypeDef *instance, uint8_t *rxData, const uint8_t *txData, int len)
+bool spiTransfer(SPI_TypeDef *instance, const uint8_t *txData, uint8_t *rxData, int len)
{
uint16_t spiTimeout = 1000;
@@ -249,10 +249,10 @@ bool spiTransfer(SPI_TypeDef *instance, uint8_t *rxData, const uint8_t *txData,
return true;
}
-bool spiBusTransfer(const busDevice_t *bus, uint8_t *rxData, const uint8_t *txData, int length)
+bool spiBusTransfer(const busDevice_t *bus, const uint8_t *txData, uint8_t *rxData, int length)
{
IOLo(bus->busdev_u.spi.csnPin);
- spiTransfer(bus->busdev_u.spi.instance, rxData, txData, length);
+ spiTransfer(bus->busdev_u.spi.instance, txData, rxData, length);
IOHi(bus->busdev_u.spi.csnPin);
return true;
}
@@ -260,11 +260,9 @@ bool spiBusTransfer(const busDevice_t *bus, uint8_t *rxData, const uint8_t *txDa
void spiSetDivisor(SPI_TypeDef *instance, uint16_t divisor)
{
#define BR_CLEAR_MASK 0xFFC7
- uint16_t tempRegister;
-
SPI_Cmd(instance, DISABLE);
- tempRegister = (instance->CR1 & BR_CLEAR_MASK);
+ const uint16_t tempRegister = (instance->CR1 & BR_CLEAR_MASK);
instance->CR1 = (tempRegister | ((ffs(divisor | 0x100) - 2) << 3));
SPI_Cmd(instance, ENABLE);
@@ -273,19 +271,21 @@ void spiSetDivisor(SPI_TypeDef *instance, uint16_t divisor)
uint16_t spiGetErrorCounter(SPI_TypeDef *instance)
{
SPIDevice device = spiDeviceByInstance(instance);
- if (device == SPIINVALID)
+ if (device == SPIINVALID) {
return 0;
+ }
return spiDevice[device].errorCount;
}
void spiResetErrorCounter(SPI_TypeDef *instance)
{
SPIDevice device = spiDeviceByInstance(instance);
- if (device != SPIINVALID)
+ if (device != SPIINVALID) {
spiDevice[device].errorCount = 0;
+ }
}
-bool spiWriteRegister(const busDevice_t *bus, uint8_t reg, uint8_t data)
+bool spiBusWriteRegister(const busDevice_t *bus, uint8_t reg, uint8_t data)
{
IOLo(bus->busdev_u.spi.csnPin);
spiTransferByte(bus->busdev_u.spi.instance, reg);
@@ -295,22 +295,22 @@ bool spiWriteRegister(const busDevice_t *bus, uint8_t reg, uint8_t data)
return true;
}
-bool spiReadRegisterBuffer(const busDevice_t *bus, uint8_t reg, uint8_t length, uint8_t *data)
+bool spiBusReadRegisterBuffer(const busDevice_t *bus, uint8_t reg, uint8_t *data, uint8_t length)
{
IOLo(bus->busdev_u.spi.csnPin);
spiTransferByte(bus->busdev_u.spi.instance, reg | 0x80); // read transaction
- spiTransfer(bus->busdev_u.spi.instance, data, NULL, length);
+ spiTransfer(bus->busdev_u.spi.instance, NULL, data, length);
IOHi(bus->busdev_u.spi.csnPin);
return true;
}
-uint8_t spiReadRegister(const busDevice_t *bus, uint8_t reg)
+uint8_t spiBusReadRegister(const busDevice_t *bus, uint8_t reg)
{
uint8_t data;
IOLo(bus->busdev_u.spi.csnPin);
spiTransferByte(bus->busdev_u.spi.instance, reg | 0x80); // read transaction
- spiTransfer(bus->busdev_u.spi.instance, &data, NULL, 1);
+ spiTransfer(bus->busdev_u.spi.instance, NULL, &data, 1);
IOHi(bus->busdev_u.spi.csnPin);
return data;
diff --git a/src/main/drivers/bus_spi.h b/src/main/drivers/bus_spi.h
index d12497f8b..351d19c6b 100644
--- a/src/main/drivers/bus_spi.h
+++ b/src/main/drivers/bus_spi.h
@@ -92,23 +92,23 @@ void spiSetDivisor(SPI_TypeDef *instance, uint16_t divisor);
uint8_t spiTransferByte(SPI_TypeDef *instance, uint8_t data);
bool spiIsBusBusy(SPI_TypeDef *instance);
-bool spiTransfer(SPI_TypeDef *instance, uint8_t *rxData, const uint8_t *txData, int len);
+bool spiTransfer(SPI_TypeDef *instance, const uint8_t *txData, uint8_t *rxData, int len);
uint16_t spiGetErrorCounter(SPI_TypeDef *instance);
void spiResetErrorCounter(SPI_TypeDef *instance);
SPIDevice spiDeviceByInstance(SPI_TypeDef *instance);
SPI_TypeDef *spiInstanceByDevice(SPIDevice device);
-bool spiBusTransfer(const busDevice_t *bus, uint8_t *rxData, const uint8_t *txData, int length);
+bool spiBusTransfer(const busDevice_t *bus, const uint8_t *txData, uint8_t *rxData, int length);
#if defined(USE_HAL_DRIVER)
SPI_HandleTypeDef* spiHandleByInstance(SPI_TypeDef *instance);
-DMA_HandleTypeDef* spiSetDMATransmit(DMA_Stream_TypeDef *Stream, uint32_t Channel, SPI_TypeDef *Instance, uint8_t *pData, uint16_t Size);
+DMA_HandleTypeDef* spiSetDMATransmit(DMA_Stream_TypeDef *Stream, uint32_t Channel, SPI_TypeDef *Instance, const uint8_t *pData, uint16_t Size);
#endif
-bool spiWriteRegister(const busDevice_t *bus, uint8_t reg, uint8_t data);
-bool spiReadRegisterBuffer(const busDevice_t *bus, uint8_t reg, uint8_t length, uint8_t *data);
-uint8_t spiReadRegister(const busDevice_t *bus, uint8_t reg);
+bool spiBusWriteRegister(const busDevice_t *bus, uint8_t reg, uint8_t data);
+bool spiBusReadRegisterBuffer(const busDevice_t *bus, uint8_t reg, uint8_t *data, uint8_t length);
+uint8_t spiBusReadRegister(const busDevice_t *bus, uint8_t reg);
void spiBusSetInstance(busDevice_t *bus, SPI_TypeDef *instance);
typedef struct spiPinConfig_s {
diff --git a/src/main/drivers/bus_spi_hal.c b/src/main/drivers/bus_spi_hal.c
index 680f37221..6199ee03e 100644
--- a/src/main/drivers/bus_spi_hal.c
+++ b/src/main/drivers/bus_spi_hal.c
@@ -23,6 +23,8 @@
#ifdef USE_SPI
+#include "common/utils.h"
+
#include "drivers/bus.h"
#include "drivers/bus_spi.h"
#include "drivers/bus_spi_impl.h"
@@ -213,8 +215,7 @@ void spiInitDevice(SPIDevice device)
bool spiInit(SPIDevice device)
{
- switch (device)
- {
+ switch (device) {
case SPIINVALID:
return false;
case SPIDEV_1:
@@ -252,8 +253,9 @@ bool spiInit(SPIDevice device)
uint32_t spiTimeoutUserCallback(SPI_TypeDef *instance)
{
SPIDevice device = spiDeviceByInstance(instance);
- if (device == SPIINVALID)
+ if (device == SPIINVALID) {
return -1;
+ }
spiDevice[device].errorCount++;
return spiDevice[device].errorCount;
}
@@ -270,27 +272,21 @@ bool spiIsBusBusy(SPI_TypeDef *instance)
return false;
}
-bool spiTransfer(SPI_TypeDef *instance, uint8_t *rxData, const uint8_t *txData, int len)
+bool spiTransfer(SPI_TypeDef *instance, const uint8_t *txData, uint8_t *rxData, int len)
{
SPIDevice device = spiDeviceByInstance(instance);
HAL_StatusTypeDef status;
- if (!rxData) // Tx only
- {
- status = HAL_SPI_Transmit(&spiDevice[device].hspi, (uint8_t *)txData, len, SPI_DEFAULT_TIMEOUT);
- }
- else if (!txData) // Rx only
- {
+ if (!rxData) { // Tx only
+ status = HAL_SPI_Transmit(&spiDevice[device].hspi, txData, len, SPI_DEFAULT_TIMEOUT);
+ } else if (!txData) { // Rx only
status = HAL_SPI_Receive(&spiDevice[device].hspi, rxData, len, SPI_DEFAULT_TIMEOUT);
- }
- else // Tx and Rx
- {
+ } else { // Tx and Rx
status = HAL_SPI_TransmitReceive(&spiDevice[device].hspi, txData, rxData, len, SPI_DEFAULT_TIMEOUT);
}
-
- if ( status != HAL_OK)
+ if (status != HAL_OK) {
spiTimeoutUserCallback(instance);
-
+ }
return true;
}
@@ -303,16 +299,14 @@ static bool spiBusReadBuffer(const busDevice_t *bus, uint8_t *out, int len)
return true;
}
-// return uint8_t value or -1 when failure
uint8_t spiTransferByte(SPI_TypeDef *instance, uint8_t txByte)
{
uint8_t rxByte;
- spiTransfer(instance, &rxByte, &txByte, 1);
+ spiTransfer(instance, &txByte, &rxByte, 1);
return rxByte;
}
-// return uint8_t value or -1 when failure
static uint8_t spiBusTransferByte(const busDevice_t *bus, uint8_t in)
{
const HAL_StatusTypeDef status = HAL_SPI_TransmitReceive(bus->busdev_u.spi.handle, &in, &in, 1, SPI_DEFAULT_TIMEOUT);
@@ -322,7 +316,7 @@ static uint8_t spiBusTransferByte(const busDevice_t *bus, uint8_t in)
return in;
}
-bool spiBusTransfer(const busDevice_t *bus, uint8_t *rxData, const uint8_t *txData, int len)
+bool spiBusTransfer(const busDevice_t *bus, const uint8_t *txData, uint8_t *rxData, int len)
{
IOLo(bus->busdev_u.spi.csnPin);
const HAL_StatusTypeDef status = HAL_SPI_TransmitReceive(bus->busdev_u.spi.handle, txData, rxData, len, SPI_DEFAULT_TIMEOUT);
@@ -356,19 +350,21 @@ void spiSetDivisor(SPI_TypeDef *instance, uint16_t divisor)
uint16_t spiGetErrorCounter(SPI_TypeDef *instance)
{
SPIDevice device = spiDeviceByInstance(instance);
- if (device == SPIINVALID)
+ if (device == SPIINVALID) {
return 0;
+ }
return spiDevice[device].errorCount;
}
void spiResetErrorCounter(SPI_TypeDef *instance)
{
SPIDevice device = spiDeviceByInstance(instance);
- if (device != SPIINVALID)
+ if (device != SPIINVALID) {
spiDevice[device].errorCount = 0;
+ }
}
-bool spiWriteRegister(const busDevice_t *bus, uint8_t reg, uint8_t data)
+bool spiBusWriteRegister(const busDevice_t *bus, uint8_t reg, uint8_t data)
{
IOLo(bus->busdev_u.spi.csnPin);
spiBusTransferByte(bus, reg);
@@ -378,7 +374,7 @@ bool spiWriteRegister(const busDevice_t *bus, uint8_t reg, uint8_t data)
return true;
}
-bool spiReadRegisterBuffer(const busDevice_t *bus, uint8_t reg, uint8_t length, uint8_t *data)
+bool spiBusReadRegisterBuffer(const busDevice_t *bus, uint8_t reg, uint8_t *data, uint8_t length)
{
IOLo(bus->busdev_u.spi.csnPin);
spiBusTransferByte(bus, reg | 0x80); // read transaction
@@ -388,7 +384,7 @@ bool spiReadRegisterBuffer(const busDevice_t *bus, uint8_t reg, uint8_t length,
return true;
}
-uint8_t spiReadRegister(const busDevice_t *bus, uint8_t reg)
+uint8_t spiBusReadRegister(const busDevice_t *bus, uint8_t reg)
{
uint8_t data;
IOLo(bus->busdev_u.spi.csnPin);
@@ -408,12 +404,13 @@ void spiBusSetInstance(busDevice_t *bus, SPI_TypeDef *instance)
void dmaSPIIRQHandler(dmaChannelDescriptor_t* descriptor)
{
SPIDevice device = descriptor->userParam;
- if (device != SPIINVALID)
+ if (device != SPIINVALID) {
HAL_DMA_IRQHandler(&spiDevice[device].hdma);
+ }
}
-DMA_HandleTypeDef* spiSetDMATransmit(DMA_Stream_TypeDef *Stream, uint32_t Channel, SPI_TypeDef *Instance, uint8_t *pData, uint16_t Size)
+DMA_HandleTypeDef* spiSetDMATransmit(DMA_Stream_TypeDef *Stream, uint32_t Channel, SPI_TypeDef *Instance, const uint8_t *pData, uint16_t Size)
{
SPIDevice device = spiDeviceByInstance(Instance);
@@ -445,7 +442,7 @@ DMA_HandleTypeDef* spiSetDMATransmit(DMA_Stream_TypeDef *Stream, uint32_t Channe
//HAL_CLEANCACHE(pData,Size);
// And Transmit
- HAL_SPI_Transmit_DMA(&spiDevice[device].hspi, pData, Size);
+ HAL_SPI_Transmit_DMA(&spiDevice[device].hspi, CONST_CAST(uint8_t*, pData), Size);
return &spiDevice[device].hdma;
}
diff --git a/src/main/drivers/compass/compass_ak8963.c b/src/main/drivers/compass/compass_ak8963.c
index 924c3f582..b34656fa8 100644
--- a/src/main/drivers/compass/compass_ak8963.c
+++ b/src/main/drivers/compass/compass_ak8963.c
@@ -92,7 +92,7 @@ static busDevice_t *bus = NULL;
static bool spiWriteRegisterDelay(const busDevice_t *bus, uint8_t reg, uint8_t data)
{
- spiWriteRegister(bus, reg, data);
+ spiBusWriteRegister(bus, reg, data);
delayMicroseconds(10);
return true;
}
@@ -118,7 +118,7 @@ static bool ak8963SensorRead(uint8_t addr_, uint8_t reg_, uint8_t len_, uint8_t
spiWriteRegisterDelay(bus, MPU_RA_I2C_SLV0_CTRL, len_ | 0x80); // read number of bytes
delay(4);
__disable_irq();
- bool ack = spiReadRegisterBuffer(bus, MPU_RA_EXT_SENS_DATA_00, len_, buf); // read I2C
+ bool ack = spiBusReadRegisterBuffer(bus, MPU_RA_EXT_SENS_DATA_00, buf, len_); // read I2C
__enable_irq();
return ack;
}
@@ -177,7 +177,7 @@ static bool ak8963SensorCompleteRead(uint8_t *buf)
queuedRead.waiting = false;
- spiReadRegisterBuffer(bus, MPU_RA_EXT_SENS_DATA_00, queuedRead.len, buf); // read I2C buffer
+ spiBusReadRegisterBuffer(bus, MPU_RA_EXT_SENS_DATA_00, buf, queuedRead.len); // read I2C buffer
return true;
}
#else
diff --git a/src/main/drivers/compass/compass_spi_hmc5883l.c b/src/main/drivers/compass/compass_spi_hmc5883l.c
index dcb650275..e014d4f22 100755
--- a/src/main/drivers/compass/compass_spi_hmc5883l.c
+++ b/src/main/drivers/compass/compass_spi_hmc5883l.c
@@ -44,7 +44,7 @@ bool hmc5883SpiWriteCommand(uint8_t reg, uint8_t data)
//spiTransferByte(HMC5883_SPI_INSTANCE, reg & 0x7F);
//spiTransferByte(HMC5883_SPI_INSTANCE, data);
- spiTransfer(HMC5883_SPI_INSTANCE, NULL, buf, 2);
+ spiTransfer(HMC5883_SPI_INSTANCE, buf, NULL, 2);
DISABLE_HMC5883;
return true;
diff --git a/src/main/drivers/flash_m25p16.c b/src/main/drivers/flash_m25p16.c
index d816fddba..4a43f361f 100644
--- a/src/main/drivers/flash_m25p16.c
+++ b/src/main/drivers/flash_m25p16.c
@@ -98,12 +98,12 @@ static void m25p16_writeEnable(void)
static uint8_t m25p16_readStatus(void)
{
- uint8_t command[2] = { M25P16_INSTRUCTION_READ_STATUS_REG, 0 };
+ const uint8_t command[2] = { M25P16_INSTRUCTION_READ_STATUS_REG, 0 };
uint8_t in[2];
ENABLE_M25P16;
- spiTransfer(M25P16_SPI_INSTANCE, in, command, sizeof(command));
+ spiTransfer(M25P16_SPI_INSTANCE, command, in, sizeof(command));
DISABLE_M25P16;
@@ -137,26 +137,25 @@ bool m25p16_waitForReady(uint32_t timeoutMillis)
*/
static bool m25p16_readIdentification(void)
{
- uint8_t out[] = { M25P16_INSTRUCTION_RDID, 0, 0, 0 };
- uint8_t in[4];
- uint32_t chipID;
+ const uint8_t out[] = { M25P16_INSTRUCTION_RDID, 0, 0, 0 };
delay(50); // short delay required after initialisation of SPI device instance.
/* Just in case transfer fails and writes nothing, so we don't try to verify the ID against random garbage
* from the stack:
*/
+ uint8_t in[4];
in[1] = 0;
ENABLE_M25P16;
- spiTransfer(M25P16_SPI_INSTANCE, in, out, sizeof(out));
+ spiTransfer(M25P16_SPI_INSTANCE, out, in, sizeof(out));
// Clearing the CS bit terminates the command early so we don't have to read the chip UID:
DISABLE_M25P16;
// Manufacturer, memory type, and capacity
- chipID = (in[1] << 16) | (in[2] << 8) | (in[3]);
+ const uint32_t chipID = (in[1] << 16) | (in[2] << 8) | (in[3]);
// All supported chips use the same pagesize of 256 bytes
@@ -241,7 +240,7 @@ bool m25p16_init(const flashConfig_t *flashConfig)
*/
void m25p16_eraseSector(uint32_t address)
{
- uint8_t out[] = { M25P16_INSTRUCTION_SECTOR_ERASE, (address >> 16) & 0xFF, (address >> 8) & 0xFF, address & 0xFF};
+ const uint8_t out[] = { M25P16_INSTRUCTION_SECTOR_ERASE, (address >> 16) & 0xFF, (address >> 8) & 0xFF, address & 0xFF};
m25p16_waitForReady(SECTOR_ERASE_TIMEOUT_MILLIS);
@@ -249,7 +248,7 @@ void m25p16_eraseSector(uint32_t address)
ENABLE_M25P16;
- spiTransfer(M25P16_SPI_INSTANCE, NULL, out, sizeof(out));
+ spiTransfer(M25P16_SPI_INSTANCE, out, NULL, sizeof(out));
DISABLE_M25P16;
}
@@ -265,7 +264,7 @@ void m25p16_eraseCompletely(void)
void m25p16_pageProgramBegin(uint32_t address)
{
- uint8_t command[] = { M25P16_INSTRUCTION_PAGE_PROGRAM, (address >> 16) & 0xFF, (address >> 8) & 0xFF, address & 0xFF};
+ const uint8_t command[] = { M25P16_INSTRUCTION_PAGE_PROGRAM, (address >> 16) & 0xFF, (address >> 8) & 0xFF, address & 0xFF};
m25p16_waitForReady(DEFAULT_TIMEOUT_MILLIS);
@@ -273,12 +272,12 @@ void m25p16_pageProgramBegin(uint32_t address)
ENABLE_M25P16;
- spiTransfer(M25P16_SPI_INSTANCE, NULL, command, sizeof(command));
+ spiTransfer(M25P16_SPI_INSTANCE, command, NULL, sizeof(command));
}
void m25p16_pageProgramContinue(const uint8_t *data, int length)
{
- spiTransfer(M25P16_SPI_INSTANCE, NULL, data, length);
+ spiTransfer(M25P16_SPI_INSTANCE, data, NULL, length);
}
void m25p16_pageProgramFinish(void)
@@ -320,7 +319,7 @@ void m25p16_pageProgram(uint32_t address, const uint8_t *data, int length)
*/
int m25p16_readBytes(uint32_t address, uint8_t *buffer, int length)
{
- uint8_t command[] = { M25P16_INSTRUCTION_READ_BYTES, (address >> 16) & 0xFF, (address >> 8) & 0xFF, address & 0xFF};
+ const uint8_t command[] = { M25P16_INSTRUCTION_READ_BYTES, (address >> 16) & 0xFF, (address >> 8) & 0xFF, address & 0xFF};
if (!m25p16_waitForReady(DEFAULT_TIMEOUT_MILLIS)) {
return 0;
@@ -328,8 +327,8 @@ int m25p16_readBytes(uint32_t address, uint8_t *buffer, int length)
ENABLE_M25P16;
- spiTransfer(M25P16_SPI_INSTANCE, NULL, command, sizeof(command));
- spiTransfer(M25P16_SPI_INSTANCE, buffer, NULL, length);
+ spiTransfer(M25P16_SPI_INSTANCE, command, NULL, sizeof(command));
+ spiTransfer(M25P16_SPI_INSTANCE, NULL, buffer, length);
DISABLE_M25P16;
diff --git a/src/main/drivers/sdcard.c b/src/main/drivers/sdcard.c
index 5a90fbef0..f5f20e63a 100644
--- a/src/main/drivers/sdcard.c
+++ b/src/main/drivers/sdcard.c
@@ -258,7 +258,7 @@ static uint8_t sdcard_waitForNonIdleByte(int maxDelay)
*/
static uint8_t sdcard_sendCommand(uint8_t commandCode, uint32_t commandArgument)
{
- uint8_t command[6] = {
+ const uint8_t command[6] = {
0x40 | commandCode,
commandArgument >> 24,
commandArgument >> 16,
@@ -272,7 +272,7 @@ static uint8_t sdcard_sendCommand(uint8_t commandCode, uint32_t commandArgument)
if (!sdcard_waitForIdle(SDCARD_MAXIMUM_BYTE_DELAY_FOR_CMD_REPLY) && commandCode != SDCARD_COMMAND_GO_IDLE_STATE)
return 0xFF;
- spiTransfer(SDCARD_SPI_INSTANCE, NULL, command, sizeof(command));
+ spiTransfer(SDCARD_SPI_INSTANCE, command, NULL, sizeof(command));
/*
* The card can take up to SDCARD_MAXIMUM_BYTE_DELAY_FOR_CMD_REPLY bytes to send the response, in the meantime
@@ -308,7 +308,7 @@ static bool sdcard_validateInterfaceCondition(void)
// V1 cards don't support this command
sdcard.version = 1;
} else if (status == SDCARD_R1_STATUS_BIT_IDLE) {
- spiTransfer(SDCARD_SPI_INSTANCE, ifCondReply, NULL, sizeof(ifCondReply));
+ spiTransfer(SDCARD_SPI_INSTANCE, NULL, ifCondReply, sizeof(ifCondReply));
/*
* We don't bother to validate the SDCard's operating voltage range since the spec requires it to accept our
@@ -332,7 +332,7 @@ static bool sdcard_readOCRRegister(uint32_t *result)
uint8_t response[4];
- spiTransfer(SDCARD_SPI_INSTANCE, response, NULL, sizeof(response));
+ spiTransfer(SDCARD_SPI_INSTANCE, NULL, response, sizeof(response));
if (status == 0) {
sdcard_deselect();
@@ -370,7 +370,7 @@ static sdcardReceiveBlockStatus_e sdcard_receiveDataBlock(uint8_t *buffer, int c
return SDCARD_RECEIVE_ERROR;
}
- spiTransfer(SDCARD_SPI_INSTANCE, buffer, NULL, count);
+ spiTransfer(SDCARD_SPI_INSTANCE, NULL, buffer, count);
// Discard trailing CRC, we don't care
spiTransferByte(SDCARD_SPI_INSTANCE, 0xFF);
@@ -405,7 +405,7 @@ static bool sdcard_sendDataBlockFinish(void)
/**
* Begin sending a buffer of SDCARD_BLOCK_SIZE bytes to the SD card.
*/
-static void sdcard_sendDataBlockBegin(uint8_t *buffer, bool multiBlockWrite)
+static void sdcard_sendDataBlockBegin(const uint8_t *buffer, bool multiBlockWrite)
{
// Card wants 8 dummy clock cycles between the write command's response and a data block beginning:
spiTransferByte(SDCARD_SPI_INSTANCE, 0xFF);
@@ -455,7 +455,7 @@ static void sdcard_sendDataBlockBegin(uint8_t *buffer, bool multiBlockWrite)
}
else {
// Send the first chunk now
- spiTransfer(SDCARD_SPI_INSTANCE, NULL, buffer, SDCARD_NON_DMA_CHUNK_SIZE);
+ spiTransfer(SDCARD_SPI_INSTANCE, buffer, NULL, SDCARD_NON_DMA_CHUNK_SIZE);
}
}
@@ -786,7 +786,7 @@ bool sdcard_poll(void)
#endif
if (!useDMAForTx) {
// Send another chunk
- spiTransfer(SDCARD_SPI_INSTANCE, NULL, sdcard.pendingOperation.buffer + SDCARD_NON_DMA_CHUNK_SIZE * sdcard.pendingOperation.chunkIndex, SDCARD_NON_DMA_CHUNK_SIZE);
+ spiTransfer(SDCARD_SPI_INSTANCE, sdcard.pendingOperation.buffer + SDCARD_NON_DMA_CHUNK_SIZE * sdcard.pendingOperation.chunkIndex, NULL, SDCARD_NON_DMA_CHUNK_SIZE);
sdcard.pendingOperation.chunkIndex++;
diff --git a/src/main/target/NAZE/hardware_revision.c b/src/main/target/NAZE/hardware_revision.c
index 68d406229..75c0b2776 100755
--- a/src/main/target/NAZE/hardware_revision.c
+++ b/src/main/target/NAZE/hardware_revision.c
@@ -63,14 +63,14 @@ uint8_t detectSpiDevice(void)
nazeSpiCsPin = IOGetByTag(IO_TAG(NAZE_SPI_CS_PIN));
#endif
- uint8_t out[] = { M25P16_INSTRUCTION_RDID, 0, 0, 0 };
+ const uint8_t out[] = { M25P16_INSTRUCTION_RDID, 0, 0, 0 };
uint8_t in[4];
uint32_t flash_id;
// try autodetect flash chip
delay(50); // short delay required after initialisation of SPI device instance.
ENABLE_SPI_CS;
- spiTransfer(NAZE_SPI_INSTANCE, in, out, sizeof(out));
+ spiTransfer(NAZE_SPI_INSTANCE, out, in, sizeof(out));
DISABLE_SPI_CS;
flash_id = in[1] << 16 | in[2] << 8 | in[3];
diff --git a/src/test/unit/baro_bmp280_unittest.cc b/src/test/unit/baro_bmp280_unittest.cc
index 2fa0fdb6a..6cfdf1718 100644
--- a/src/test/unit/baro_bmp280_unittest.cc
+++ b/src/test/unit/baro_bmp280_unittest.cc
@@ -18,6 +18,11 @@
extern "C" {
+#include "platform.h"
+#include "target.h"
+#include "drivers/barometer/barometer.h"
+#include "drivers/bus.h"
+
void bmp280_calculate(int32_t *pressure, int32_t *temperature);
extern uint32_t bmp280_up;
@@ -139,22 +144,11 @@ TEST(baroBmp280Test, TestBmp280CalculateZeroP)
extern "C" {
void delay(uint32_t) {}
+bool i2cBusReadRegisterBuffer(busDevice_t*, uint8_t, uint8_t*, uint8_t) {return true;}
+bool i2cBusWriteRegister(busDevice_t*, uint8_t, uint8_t) {return true;}
+bool spiBusReadRegisterBuffer(busDevice_t*, uint8_t, uint8_t*, uint8_t) {return true;}
+bool spiBusWriteRegister(busDevice_t*, uint8_t, uint8_t) {return true;}
-bool i2cWriteRegister(uint8_t, uint8_t, uint8_t) {
- return true;
-}
-
-bool i2cReadRegisterBuffer(uint8_t, uint8_t, uint8_t, uint8_t) {
- return true;
-}
-
-bool spiWriteRegister(uint8_t, uint8_t, uint8_t) {
- return true;
-}
-
-bool spiReadRegisterBuffer(uint8_t, uint8_t, uint8_t, uint8_t) {
- return true;
-}
void spiSetDivisor() {
}
diff --git a/src/test/unit/baro_ms5611_unittest.cc b/src/test/unit/baro_ms5611_unittest.cc
index 26152b7f7..05a52eb4f 100644
--- a/src/test/unit/baro_ms5611_unittest.cc
+++ b/src/test/unit/baro_ms5611_unittest.cc
@@ -18,6 +18,11 @@
extern "C" {
+#include "platform.h"
+#include "target.h"
+#include "drivers/barometer/barometer.h"
+#include "drivers/bus.h"
+
int8_t ms5611_crc(uint16_t *prom);
void ms5611_calculate(int32_t *pressure, int32_t *temperature);
@@ -141,21 +146,10 @@ extern "C" {
void delay(uint32_t) {}
void delayMicroseconds(uint32_t) {}
-bool i2cWriteRegister(uint8_t, uint8_t, uint8_t) {
- return true;
-}
-
-bool i2cReadRegisterBuffer(uint8_t, uint8_t, uint8_t, uint8_t) {
- return true;
-}
-
-bool spiWriteRegister(uint8_t, uint8_t, uint8_t) {
- return true;
-}
-
-bool spiReadRegisterBuffer(uint8_t, uint8_t, uint8_t, uint8_t) {
- return true;
-}
+bool i2cBusReadRegisterBuffer(busDevice_t*, uint8_t, uint8_t*, uint8_t) {return true;}
+bool i2cBusWriteRegister(busDevice_t*, uint8_t, uint8_t) {return true;}
+bool spiBusReadRegisterBuffer(busDevice_t*, uint8_t, uint8_t*, uint8_t) {return true;}
+bool spiBusWriteRegister(busDevice_t*, uint8_t, uint8_t) {return true;}
void spiSetDivisor() {
}