diff options
author | Lorenz Meier <lm@inf.ethz.ch> | 2013-09-11 22:14:56 +0200 |
---|---|---|
committer | Lorenz Meier <lm@inf.ethz.ch> | 2013-09-11 22:16:29 +0200 |
commit | 3a326cb467e9ba4892c5fbea978b5146677c9876 (patch) | |
tree | fd1e7b4dda623eb83b64412af36d99665309393f /src/drivers/l3gd20 | |
parent | 8755d76d1bdc2c9b2fa5a1366217498e24ad1e67 (diff) | |
download | px4-firmware-3a326cb467e9ba4892c5fbea978b5146677c9876.tar.gz px4-firmware-3a326cb467e9ba4892c5fbea978b5146677c9876.tar.bz2 px4-firmware-3a326cb467e9ba4892c5fbea978b5146677c9876.zip |
Guard probe / reset against other SPI drivers
Diffstat (limited to 'src/drivers/l3gd20')
-rw-r--r-- | src/drivers/l3gd20/l3gd20.cpp | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/src/drivers/l3gd20/l3gd20.cpp b/src/drivers/l3gd20/l3gd20.cpp index e6d765e13..970e8cf4b 100644 --- a/src/drivers/l3gd20/l3gd20.cpp +++ b/src/drivers/l3gd20/l3gd20.cpp @@ -377,9 +377,12 @@ out: int L3GD20::probe() { + irqstate_t flags = irqsave(); /* read dummy value to void to clear SPI statemachine on sensor */ (void)read_reg(ADDR_WHO_AM_I); + bool success = false; + /* verify that the device is attached and functioning, accept L3GD20 and L3GD20H */ if (read_reg(ADDR_WHO_AM_I) == WHO_I_AM) { @@ -390,15 +393,21 @@ L3GD20::probe() #else #error This driver needs a board selection, either CONFIG_ARCH_BOARD_PX4FMU_V1 or CONFIG_ARCH_BOARD_PX4FMU_V2 #endif - return OK; + + success = true; } if (read_reg(ADDR_WHO_AM_I) == WHO_I_AM_H) { _orientation = SENSOR_BOARD_ROTATION_180_DEG; - return OK; + success = true; } + irqrestore(flags); + + if (success) + return OK; + return -EIO; } |