drivers/sx127x: refactor error management

This commit is contained in:
Alexandre Abadie 2018-04-12 09:59:51 +02:00
parent 0a8590c78b
commit 1bee32c75f
4 changed files with 54 additions and 38 deletions

View File

@ -100,8 +100,8 @@ extern "C" {
enum { enum {
SX127X_INIT_OK = 0, /**< Initialization was successful */ SX127X_INIT_OK = 0, /**< Initialization was successful */
SX127X_ERR_SPI, /**< Failed to initialize SPI bus or CS line */ SX127X_ERR_SPI, /**< Failed to initialize SPI bus or CS line */
SX127X_ERR_TEST_FAILED, /**< SX127X testing failed during initialization (check chip) */ SX127X_ERR_GPIOS, /**< Failed to initialize GPIOs */
SX127X_ERR_THREAD /**< Unable to create DIO handling thread (check amount of free memory) */ SX127X_ERR_NODEV /**< No valid device version found */
}; };
/** /**

View File

@ -42,12 +42,14 @@ extern "C" {
/** @} */ /** @} */
/** /**
* @brief Tests the transceiver version type. * @brief Check the transceiver version
* *
* @param[in] dev The sx127x device descriptor * @param[in] dev The sx127x device descriptor
* @return true if test passed, false otherwise *
* @return 0 when a valid device version is found
* @return -1 when no valid device version is found
*/ */
bool sx127x_test(const sx127x_t *dev); int sx127x_check_version(const sx127x_t *dev);
/** /**
* @brief Writes the radio register at specified address. * @brief Writes the radio register at specified address.

View File

@ -41,9 +41,9 @@
#include "debug.h" #include "debug.h"
/* Internal functions */ /* Internal functions */
static void _init_isrs(sx127x_t *dev); static int _init_spi(sx127x_t *dev);
static int _init_gpios(sx127x_t *dev);
static void _init_timers(sx127x_t *dev); static void _init_timers(sx127x_t *dev);
static int _init_peripherals(sx127x_t *dev);
static void _on_tx_timeout(void *arg); static void _on_tx_timeout(void *arg);
static void _on_rx_timeout(void *arg); static void _on_rx_timeout(void *arg);
@ -90,14 +90,15 @@ void sx127x_reset(const sx127x_t *dev)
int sx127x_init(sx127x_t *dev) int sx127x_init(sx127x_t *dev)
{ {
/* Do internal initialization routines */ /* Do internal initialization routines */
if (!_init_peripherals(dev)) { if (_init_spi(dev) < 0) {
DEBUG("[sx127x] error: failed to initialize SPI\n");
return -SX127X_ERR_SPI; return -SX127X_ERR_SPI;
} }
/* Check presence of SX127X */ /* Check presence of SX127X */
if (!sx127x_test(dev)) { if (sx127x_check_version(dev) < 0) {
DEBUG("[sx127x] init: sx127x test failed\n"); DEBUG("[sx127x] error: no valid device found\n");
return -SX127X_ERR_TEST_FAILED; return -SX127X_ERR_NODEV;
} }
_init_timers(dev); _init_timers(dev);
@ -110,14 +111,17 @@ int sx127x_init(sx127x_t *dev)
#endif #endif
sx127x_set_op_mode(dev, SX127X_RF_OPMODE_SLEEP); sx127x_set_op_mode(dev, SX127X_RF_OPMODE_SLEEP);
_init_isrs(dev); if (_init_gpios(dev) < 0) {
DEBUG("[sx127x] error: failed to initialize GPIOs\n");
return -SX127X_ERR_GPIOS;
}
return SX127X_INIT_OK; return SX127X_INIT_OK;
} }
void sx127x_init_radio_settings(sx127x_t *dev) void sx127x_init_radio_settings(sx127x_t *dev)
{ {
DEBUG("[sx127x] initialize radio settings\n"); DEBUG("[sx127x] initializing radio settings\n");
sx127x_set_channel(dev, SX127X_CHANNEL_DEFAULT); sx127x_set_channel(dev, SX127X_CHANNEL_DEFAULT);
sx127x_set_modem(dev, SX127X_MODEM_DEFAULT); sx127x_set_modem(dev, SX127X_MODEM_DEFAULT);
sx127x_set_tx_power(dev, SX127X_RADIO_TX_POWER); sx127x_set_tx_power(dev, SX127X_RADIO_TX_POWER);
@ -204,27 +208,37 @@ static void sx127x_on_dio3_isr(void *arg)
} }
/* Internal event handlers */ /* Internal event handlers */
static void _init_isrs(sx127x_t *dev) static int _init_gpios(sx127x_t *dev)
{ {
if (gpio_init_int(dev->params.dio0_pin, GPIO_IN, GPIO_RISING, int res = gpio_init_int(dev->params.dio0_pin, GPIO_IN, GPIO_RISING,
sx127x_on_dio0_isr, dev) < 0) { sx127x_on_dio0_isr, dev);
DEBUG("[sx127x] error: cannot initialize DIO0 pin\n"); if (res < 0) {
DEBUG("[sx127x] error: failed to initialize DIO0 pin\n");
return res;
} }
if (gpio_init_int(dev->params.dio1_pin, GPIO_IN, GPIO_RISING, res = gpio_init_int(dev->params.dio1_pin, GPIO_IN, GPIO_RISING,
sx127x_on_dio1_isr, dev) < 0) { sx127x_on_dio1_isr, dev);
DEBUG("[sx127x] error: cannot initialize DIO1 pin\n"); if (res < 0) {
DEBUG("[sx127x] error: failed to initialize DIO1 pin\n");
return res;
} }
if (gpio_init_int(dev->params.dio2_pin, GPIO_IN, GPIO_RISING, res = gpio_init_int(dev->params.dio2_pin, GPIO_IN, GPIO_RISING,
sx127x_on_dio2_isr, dev) < 0) { sx127x_on_dio2_isr, dev);
DEBUG("[sx127x] error: cannot initialize DIO2 pin\n"); if (res < 0) {
DEBUG("[sx127x] error: failed to initialize DIO2 pin\n");
return res;
} }
if (gpio_init_int(dev->params.dio3_pin, GPIO_IN, GPIO_RISING, res = gpio_init_int(dev->params.dio3_pin, GPIO_IN, GPIO_RISING,
sx127x_on_dio3_isr, dev) < 0) { sx127x_on_dio3_isr, dev);
DEBUG("[sx127x] error: cannot initialize DIO3 pin\n"); if (res < 0) {
DEBUG("[sx127x] error: failed to initialize DIO3 pin\n");
return res;
} }
return res;
} }
static void _on_tx_timeout(void *arg) static void _on_tx_timeout(void *arg)
@ -250,7 +264,7 @@ static void _init_timers(sx127x_t *dev)
dev->_internal.rx_timeout_timer.callback = _on_rx_timeout; dev->_internal.rx_timeout_timer.callback = _on_rx_timeout;
} }
static int _init_peripherals(sx127x_t *dev) static int _init_spi(sx127x_t *dev)
{ {
int res; int res;
@ -258,11 +272,11 @@ static int _init_peripherals(sx127x_t *dev)
res = spi_init_cs(dev->params.spi, dev->params.nss_pin); res = spi_init_cs(dev->params.spi, dev->params.nss_pin);
if (res != SPI_OK) { if (res != SPI_OK) {
DEBUG("[sx127x] error initializing SPI_%i device (code %i)\n", DEBUG("[sx127x] error: failed to initialize SPI_%i device (code %i)\n",
dev->params.spi, res); dev->params.spi, res);
return 0; return -1;
} }
DEBUG("[sx127x] peripherals initialized with success\n"); DEBUG("[sx127x] SPI_%i initialized with success\n", dev->params.spi);
return 1; return 0;
} }

View File

@ -42,7 +42,7 @@
#define SX127X_SPI_MODE (SPI_MODE_0) #define SX127X_SPI_MODE (SPI_MODE_0)
bool sx127x_test(const sx127x_t *dev) int sx127x_check_version(const sx127x_t *dev)
{ {
/* Read version number and compare with sx127x assigned revision */ /* Read version number and compare with sx127x assigned revision */
uint8_t version = sx127x_reg_read(dev, SX127X_REG_VERSION); uint8_t version = sx127x_reg_read(dev, SX127X_REG_VERSION);
@ -51,19 +51,19 @@ bool sx127x_test(const sx127x_t *dev)
if (version != VERSION_SX1272) { if (version != VERSION_SX1272) {
DEBUG("[sx127x] sx1272 test failed, invalid version number: %d\n", DEBUG("[sx127x] sx1272 test failed, invalid version number: %d\n",
version); version);
return false; return -1;
} }
DEBUG("[sx127x] SX1272 transceiver detected.\n"); DEBUG("[sx127x] SX1272 transceiver detected\n");
#else /* MODULE_SX1276) */ #else /* MODULE_SX1276) */
if (version != VERSION_SX1276) { if (version != VERSION_SX1276) {
DEBUG("[sx127x] sx1276 test failed, invalid version number: %d\n", DEBUG("[sx127x] sx1276 test failed, invalid version number: %d\n",
version); version);
return false; return -1;
} }
DEBUG("[sx127x] SX1276 transceiver detected.\n"); DEBUG("[sx127x] SX1276 transceiver detected\n");
#endif #endif
return true; return 0;
} }
void sx127x_reg_write(const sx127x_t *dev, uint8_t addr, uint8_t data) void sx127x_reg_write(const sx127x_t *dev, uint8_t addr, uint8_t data)