mirror of
https://bitbucket.org/librepilot/librepilot.git
synced 2025-01-17 02:52:12 +01:00
OP-911: Use SPI_ReleaseBusISR within isr, changed a malloc with pvPortMalloc for coherence with the rest of PiOS
+review OPReview-44
This commit is contained in:
parent
ae62517600
commit
a825772389
@ -227,6 +227,7 @@ int32_t PIOS_MPU6000_ConfigureRanges(
|
||||
/**
|
||||
* @brief Claim the SPI bus for the accel communications and select this chip
|
||||
* @return 0 if successful, -1 for invalid device, -2 if unable to claim bus
|
||||
* @param fromIsr[in] Tells if the function is being called from a ISR or not
|
||||
*/
|
||||
static int32_t PIOS_MPU6000_ClaimBus(bool fromIsr)
|
||||
{
|
||||
@ -246,15 +247,19 @@ static int32_t PIOS_MPU6000_ClaimBus(bool fromIsr)
|
||||
/**
|
||||
* @brief Release the SPI bus for the accel communications and end the transaction
|
||||
* @return 0 if successful
|
||||
* @param fromIsr[in] Tells if the function is being called from a ISR or not
|
||||
*/
|
||||
int32_t PIOS_MPU6000_ReleaseBus()
|
||||
int32_t PIOS_MPU6000_ReleaseBus(bool fromIsr)
|
||||
{
|
||||
if(PIOS_MPU6000_Validate(dev) != 0)
|
||||
return -1;
|
||||
|
||||
PIOS_SPI_RC_PinSet(dev->spi_id,dev->slave_num,1);
|
||||
|
||||
return PIOS_SPI_ReleaseBus(dev->spi_id);
|
||||
if(fromIsr){
|
||||
return PIOS_SPI_ReleaseBusISR(dev->spi_id);
|
||||
} else {
|
||||
return PIOS_SPI_ReleaseBus(dev->spi_id);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@ -272,7 +277,7 @@ static int32_t PIOS_MPU6000_GetReg(uint8_t reg)
|
||||
PIOS_SPI_TransferByte(dev->spi_id,(0x80 | reg) ); // request byte
|
||||
data = PIOS_SPI_TransferByte(dev->spi_id,0 ); // receive response
|
||||
|
||||
PIOS_MPU6000_ReleaseBus();
|
||||
PIOS_MPU6000_ReleaseBus(false);
|
||||
return data;
|
||||
}
|
||||
|
||||
@ -290,16 +295,16 @@ static int32_t PIOS_MPU6000_SetReg(uint8_t reg, uint8_t data)
|
||||
return -1;
|
||||
|
||||
if(PIOS_SPI_TransferByte(dev->spi_id, 0x7f & reg) != 0) {
|
||||
PIOS_MPU6000_ReleaseBus();
|
||||
PIOS_MPU6000_ReleaseBus(false);
|
||||
return -2;
|
||||
}
|
||||
|
||||
if(PIOS_SPI_TransferByte(dev->spi_id, data) != 0) {
|
||||
PIOS_MPU6000_ReleaseBus();
|
||||
PIOS_MPU6000_ReleaseBus(false);
|
||||
return -3;
|
||||
}
|
||||
|
||||
PIOS_MPU6000_ReleaseBus();
|
||||
PIOS_MPU6000_ReleaseBus(false);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -321,7 +326,7 @@ int32_t PIOS_MPU6000_ReadGyros(struct pios_mpu6000_data * data)
|
||||
if(PIOS_SPI_TransferBlock(dev->spi_id, &buf[0], &rec[0], sizeof(buf), NULL) < 0)
|
||||
return -2;
|
||||
|
||||
PIOS_MPU6000_ReleaseBus();
|
||||
PIOS_MPU6000_ReleaseBus(false);
|
||||
|
||||
data->gyro_x = rec[1] << 8 | rec[2];
|
||||
data->gyro_y = rec[3] << 8 | rec[4];
|
||||
@ -407,6 +412,7 @@ int32_t PIOS_MPU6000_Test(void)
|
||||
* @brief Run self-test operation.
|
||||
* \return 0 if test succeeded
|
||||
* \return non-zero value if test succeeded
|
||||
* @param fromIsr[in] Tells if the function is being called from a ISR or not
|
||||
*/
|
||||
static int32_t PIOS_MPU6000_FifoDepth(bool fromIsr)
|
||||
{
|
||||
@ -417,11 +423,11 @@ static int32_t PIOS_MPU6000_FifoDepth(bool fromIsr)
|
||||
return -1;
|
||||
|
||||
if(PIOS_SPI_TransferBlock(dev->spi_id, &mpu6000_send_buf[0], &mpu6000_rec_buf[0], sizeof(mpu6000_send_buf), NULL) < 0) {
|
||||
PIOS_MPU6000_ReleaseBus();
|
||||
PIOS_MPU6000_ReleaseBus(fromIsr);
|
||||
return -1;
|
||||
}
|
||||
|
||||
PIOS_MPU6000_ReleaseBus();
|
||||
PIOS_MPU6000_ReleaseBus(fromIsr);
|
||||
|
||||
return (mpu6000_rec_buf[1] << 8) | mpu6000_rec_buf[2];
|
||||
}
|
||||
@ -456,18 +462,18 @@ bool PIOS_MPU6000_IRQHandler(void)
|
||||
if (PIOS_MPU6000_ClaimBus(true) != 0)
|
||||
return false;
|
||||
|
||||
uint8_t mpu6000_send_buf[1 + sizeof(struct pios_mpu6000_data) ] = {PIOS_MPU6000_FIFO_REG | 0x80, 0, 0, 0, 0, 0, 0, 0, 0};
|
||||
uint8_t mpu6000_rec_buf[1 + sizeof(struct pios_mpu6000_data) ];
|
||||
static uint8_t mpu6000_send_buf[1 + sizeof(struct pios_mpu6000_data) ] = {PIOS_MPU6000_FIFO_REG | 0x80, 0, 0, 0, 0, 0, 0, 0, 0};
|
||||
static uint8_t mpu6000_rec_buf[1 + sizeof(struct pios_mpu6000_data) ];
|
||||
|
||||
if (PIOS_SPI_TransferBlock(dev->spi_id, &mpu6000_send_buf[0], &mpu6000_rec_buf[0], sizeof(mpu6000_send_buf), NULL) < 0) {
|
||||
PIOS_MPU6000_ReleaseBus();
|
||||
PIOS_MPU6000_ReleaseBus(true);
|
||||
mpu6000_fails++;
|
||||
return false;
|
||||
}
|
||||
|
||||
PIOS_MPU6000_ReleaseBus();
|
||||
PIOS_MPU6000_ReleaseBus(true);
|
||||
|
||||
struct pios_mpu6000_data data;
|
||||
static struct pios_mpu6000_data data;
|
||||
|
||||
// In the case where extras samples backed up grabbed an extra
|
||||
if (mpu6000_count >= (sizeof(data) * 2)) {
|
||||
@ -476,12 +482,12 @@ bool PIOS_MPU6000_IRQHandler(void)
|
||||
return false;
|
||||
|
||||
if (PIOS_SPI_TransferBlock(dev->spi_id, &mpu6000_send_buf[0], &mpu6000_rec_buf[0], sizeof(mpu6000_send_buf), NULL) < 0) {
|
||||
PIOS_MPU6000_ReleaseBus();
|
||||
PIOS_MPU6000_ReleaseBus(true);
|
||||
mpu6000_fails++;
|
||||
return false;
|
||||
}
|
||||
|
||||
PIOS_MPU6000_ReleaseBus();
|
||||
PIOS_MPU6000_ReleaseBus(true);
|
||||
}
|
||||
|
||||
// Rotate the sensor to OP convention. The datasheet defines X as towards the right
|
||||
|
Loading…
x
Reference in New Issue
Block a user