Skip to content

Commit cba6562

Browse files
committed
bmx055: support dio waiting mechanism
1 parent 4d9b6e1 commit cba6562

2 files changed

Lines changed: 43 additions & 49 deletions

File tree

flight/PiOS/Common/pios_bmx055.c

Lines changed: 40 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -262,25 +262,38 @@ int32_t PIOS_BMX055_SPI_Init(pios_bmx055_dev_t *dev, uint32_t spi_id, uint32_t s
262262

263263
if (ret) return ret;
264264

265-
#if 0
266-
/* Set up EXTI line */
267-
PIOS_EXTI_Init(bmx_dev->cfg->exti_cfg);
268-
269-
/* Wait 20 ms for data ready interrupt and make sure it happens twice */
270-
if (!bmx_dev->cfg->skip_startup_irq_check) {
271-
for (int i=0; i<2; i++) {
272-
uint32_t ref_val = bmx_dev->interrupt_count;
273-
uint32_t raw_start = PIOS_DELAY_GetRaw();
274-
275-
while (bmx_dev->interrupt_count == ref_val) {
276-
if (PIOS_DELAY_DiffuS(raw_start) > 20000) {
277-
PIOS_EXTI_DeInit(bmx_dev->cfg->exti_cfg);
278-
return -PIOS_BMX_ERROR_NOIRQ;
265+
if (bmx_dev->cfg->int_pin) {
266+
dio_set_input(bmx_dev->cfg->int_pin, DIO_PULL_NONE);
267+
268+
ret = PIOS_BMX_WriteReg(bmx_dev->spi_slave_gyro,
269+
BMX055_REG_GYRO_INT_EN_0,
270+
128);
271+
272+
if (ret) return ret;
273+
274+
ret = PIOS_BMX_WriteReg(bmx_dev->spi_slave_gyro,
275+
BMX055_REG_GYRO_INT_EN_1,
276+
12);
277+
278+
if (ret) return ret;
279+
280+
ret = PIOS_BMX_WriteReg(bmx_dev->spi_slave_gyro,
281+
BMX055_REG_GYRO_INT_MAP_1,
282+
1);
283+
284+
if (ret) return ret;
285+
286+
/* Wait 20 ms for data ready interrupt and make sure it happens
287+
* twice */
288+
if (!bmx_dev->cfg->skip_startup_irq_check) {
289+
for (int i=0; i<2; i++) {
290+
if (!dio_wait(bmx_dev->cfg->int_pin, true, 20000)) {
291+
DEBUG_PRINTF(2, "Missing interrupt!");
292+
return -100;
279293
}
280294
}
281295
}
282296
}
283-
#endif
284297

285298
bmx_dev->task_handle = PIOS_Thread_Create(
286299
PIOS_BMX_Task, "pios_bmx", PIOS_BMX_TASK_STACK,
@@ -291,8 +304,13 @@ int32_t PIOS_BMX055_SPI_Init(pios_bmx055_dev_t *dev, uint32_t spi_id, uint32_t s
291304

292305
PIOS_SENSORS_SetMaxGyro(2000);
293306

294-
PIOS_SENSORS_SetSampleRate(PIOS_SENSOR_GYRO, 800);
295-
PIOS_SENSORS_SetSampleRate(PIOS_SENSOR_ACCEL, 800);
307+
if (bmx_dev->cfg->int_pin) {
308+
PIOS_SENSORS_SetSampleRate(PIOS_SENSOR_GYRO, 1000);
309+
PIOS_SENSORS_SetSampleRate(PIOS_SENSOR_ACCEL, 1000);
310+
} else {
311+
PIOS_SENSORS_SetSampleRate(PIOS_SENSOR_GYRO, 800);
312+
PIOS_SENSORS_SetSampleRate(PIOS_SENSOR_ACCEL, 800);
313+
}
296314

297315
PIOS_SENSORS_Register(PIOS_SENSOR_ACCEL, bmx_dev->accel_queue);
298316
PIOS_SENSORS_Register(PIOS_SENSOR_GYRO, bmx_dev->gyro_queue);
@@ -351,33 +369,16 @@ static int32_t PIOS_BMX_WriteReg(int slave, uint8_t address, uint8_t buffer)
351369
return 0;
352370
}
353371

354-
#if 0
355-
bool PIOS_BMX_IRQHandler(void)
356-
{
357-
if (PIOS_BMX_Validate(bmx_dev) != 0)
358-
return false;
359-
360-
bool woken = false;
361-
362-
bmx_dev->interrupt_count++;
363-
364-
PIOS_Semaphore_Give_FromISR(bmx_dev->data_ready_sema, &woken);
365-
366-
return woken;
367-
}
368-
#endif
369-
370372
static void PIOS_BMX_Task(void *parameters)
371373
{
372374
(void)parameters;
373375

374376
while (true) {
375-
#if 0
376-
//Wait for data ready interrupt
377-
if (PIOS_Semaphore_Take(bmx_dev->data_ready_sema, PIOS_SEMAPHORE_TIMEOUT_MAX) != true)
378-
continue;
379-
#endif
380-
PIOS_Thread_Sleep(1); /* XXX */
377+
if (!bmx_dev->cfg->int_pin) {
378+
PIOS_Thread_Sleep(1);
379+
} else {
380+
dio_wait(bmx_dev->cfg->int_pin, true, 1000000);
381+
}
381382

382383
// claim bus in high speed mode
383384
if (PIOS_SPI_ClaimBus(bmx_dev->spi_id) != 0)

flight/PiOS/inc/pios_bmx055.h

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
#define PIOS_BMX055_H
3030

3131
#include "pios.h"
32+
#include <pios_dio.h>
3233

3334
enum pios_bmx055_orientation { // clockwise rotation from board forward
3435
PIOS_BMX_TOP_0DEG = 0x00,
@@ -42,10 +43,10 @@ enum pios_bmx055_orientation { // clockwise rotation from board forward
4243
};
4344

4445
struct pios_bmx055_cfg {
45-
// const struct pios_exti_cfg *exti_cfg; /* Pointer to the EXTI configuration */
46-
4746
enum pios_bmx055_orientation orientation;
4847
bool skip_startup_irq_check;
48+
49+
dio_tag_t int_pin;
4950
};
5051

5152
typedef struct pios_bmx055_dev * pios_bmx055_dev_t;
@@ -56,14 +57,6 @@ typedef struct pios_bmx055_dev * pios_bmx055_dev_t;
5657
*/
5758
int32_t PIOS_BMX055_SPI_Init(pios_bmx055_dev_t *dev, uint32_t spi_id, uint32_t slave_gyro, uint32_t slave_accel, const struct pios_bmx055_cfg *cfg);
5859

59-
#if 0
60-
/**
61-
* @brief The IMU interrupt handler.
62-
* Fetches new data from the IMU.
63-
*/
64-
bool PIOS_BMX055_IRQHandler(void);
65-
#endif
66-
6760
#endif /* PIOS_BMX055_H */
6861

6962
/**

0 commit comments

Comments
 (0)