@@ -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-
370372static 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 )
0 commit comments