From c78aaeb0f7efd286ab67872a8093f485a1a60334 Mon Sep 17 00:00:00 2001
From: Julian Oes <julian@oes.ch>
Date: Wed, 17 Apr 2019 13:53:59 +0200
Subject: [PATCH] ak09916: fail if device is not found

This should fix the case where the driver initializes even though the
device is not found. The change changes the behavior to return ERROR
if the whoami call fails several times instead of returning OK.

Also, the reset() and thus probe() calls are moved before initializing
the ringbuffer and device name.
---
 src/drivers/magnetometer/ak09916/ak09916.cpp | 19 ++++++++++++-------
 src/drivers/magnetometer/ak09916/ak09916.hpp |  1 +
 2 files changed, 13 insertions(+), 7 deletions(-)

diff --git a/src/drivers/magnetometer/ak09916/ak09916.cpp b/src/drivers/magnetometer/ak09916/ak09916.cpp
index 09b7fb485e..955f6c2858 100644
--- a/src/drivers/magnetometer/ak09916/ak09916.cpp
+++ b/src/drivers/magnetometer/ak09916/ak09916.cpp
@@ -311,6 +311,8 @@ AK09916::init()
 		return ret;
 	}
 
+	reset();
+
 	_mag_reports = new ringbuffer::RingBuffer(2, sizeof(mag_report));
 
 	if (_mag_reports == nullptr) {
@@ -319,8 +321,6 @@ AK09916::init()
 
 	_mag_class_instance = register_class_devname(MAG_BASE_DEVICE_PATH);
 
-	reset();
-
 	/* advertise sensor topic, measure manually to initialize valid report */
 	struct mag_report mrp;
 	_mag_reports->get(&mrp);
@@ -583,8 +583,7 @@ AK09916::write_reg(uint8_t reg, uint8_t value)
 int
 AK09916::reset(void)
 {
-	// First initialize it to use the bus
-	int rv = setup();
+	int rv = probe();
 
 	if (rv == OK) {
 		// Now reset the mag
@@ -598,7 +597,7 @@ AK09916::reset(void)
 }
 
 int
-AK09916::setup(void)
+AK09916::probe(void)
 {
 	int retries = 10;
 
@@ -608,12 +607,18 @@ AK09916::setup(void)
 		uint8_t id = 0;
 
 		if (check_id(id)) {
-			break;
+			return OK;
 		}
 
 		retries--;
 	} while (retries > 0);
 
+	return PX4_ERROR;
+}
+
+int
+AK09916::setup(void)
+{
 	write_reg(AK09916REG_CNTL2, AK09916_CNTL2_CONTINOUS_MODE_100HZ);
 
 	return OK;
@@ -732,4 +737,4 @@ ak09916_main(int argc, char *argv[])
 
 	ak09916::usage();
 	return -1;
-}
\ No newline at end of file
+}
diff --git a/src/drivers/magnetometer/ak09916/ak09916.hpp b/src/drivers/magnetometer/ak09916/ak09916.hpp
index de15aac728..c02b59f4a5 100644
--- a/src/drivers/magnetometer/ak09916/ak09916.hpp
+++ b/src/drivers/magnetometer/ak09916/ak09916.hpp
@@ -139,6 +139,7 @@ public:
 	void read_block(uint8_t reg, uint8_t *val, uint8_t count);
 
 	int reset(void);
+	int probe(void);
 	int setup(void);
 	void print_info(void);
 	int setup_master_i2c(void);
-- 
GitLab