diff --git a/drivers/include/sx127x.h b/drivers/include/sx127x.h index 4e2d5d77edd85e9feb38edabfd430e9f2abcee4b..eb9ede59ed6dc70803d02b9e921de324a4ac9f8e 100644 --- a/drivers/include/sx127x.h +++ b/drivers/include/sx127x.h @@ -100,8 +100,8 @@ extern "C" { enum { SX127X_INIT_OK = 0, /**< Initialization was successful */ SX127X_ERR_SPI, /**< Failed to initialize SPI bus or CS line */ - SX127X_ERR_TEST_FAILED, /**< SX127X testing failed during initialization (check chip) */ - SX127X_ERR_THREAD /**< Unable to create DIO handling thread (check amount of free memory) */ + SX127X_ERR_GPIOS, /**< Failed to initialize GPIOs */ + SX127X_ERR_NODEV /**< No valid device version found */ }; /** diff --git a/drivers/sx127x/include/sx127x_internal.h b/drivers/sx127x/include/sx127x_internal.h index 77e8c32bb2265af5c4f02cd6c273cb5c34f0d47d..d2f0e45a0b2e479fade8867c9decfeff70d21026 100644 --- a/drivers/sx127x/include/sx127x_internal.h +++ b/drivers/sx127x/include/sx127x_internal.h @@ -42,12 +42,14 @@ extern "C" { /** @} */ /** - * @brief Tests the transceiver version type. + * @brief Check the transceiver version * * @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. diff --git a/drivers/sx127x/sx127x.c b/drivers/sx127x/sx127x.c index 1d5191ac1855d88ebd1f78cf63e3fed5ebbef594..e7347d2d0e348eab43c24ca04cf5836dc42ca872 100644 --- a/drivers/sx127x/sx127x.c +++ b/drivers/sx127x/sx127x.c @@ -41,9 +41,9 @@ #include "debug.h" /* 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 int _init_peripherals(sx127x_t *dev); static void _on_tx_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) { /* 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; } /* Check presence of SX127X */ - if (!sx127x_test(dev)) { - DEBUG("[sx127x] init: sx127x test failed\n"); - return -SX127X_ERR_TEST_FAILED; + if (sx127x_check_version(dev) < 0) { + DEBUG("[sx127x] error: no valid device found\n"); + return -SX127X_ERR_NODEV; } _init_timers(dev); @@ -110,14 +111,17 @@ int sx127x_init(sx127x_t *dev) #endif 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; } 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_modem(dev, SX127X_MODEM_DEFAULT); sx127x_set_tx_power(dev, SX127X_RADIO_TX_POWER); @@ -204,27 +208,37 @@ static void sx127x_on_dio3_isr(void *arg) } /* 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, - sx127x_on_dio0_isr, dev) < 0) { - DEBUG("[sx127x] error: cannot initialize DIO0 pin\n"); + int res = gpio_init_int(dev->params.dio0_pin, GPIO_IN, GPIO_RISING, + sx127x_on_dio0_isr, dev); + 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, - sx127x_on_dio1_isr, dev) < 0) { - DEBUG("[sx127x] error: cannot initialize DIO1 pin\n"); + res = gpio_init_int(dev->params.dio1_pin, GPIO_IN, GPIO_RISING, + sx127x_on_dio1_isr, dev); + 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, - sx127x_on_dio2_isr, dev) < 0) { - DEBUG("[sx127x] error: cannot initialize DIO2 pin\n"); + res = gpio_init_int(dev->params.dio2_pin, GPIO_IN, GPIO_RISING, + sx127x_on_dio2_isr, dev); + 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, - sx127x_on_dio3_isr, dev) < 0) { - DEBUG("[sx127x] error: cannot initialize DIO3 pin\n"); + res = gpio_init_int(dev->params.dio3_pin, GPIO_IN, GPIO_RISING, + sx127x_on_dio3_isr, dev); + if (res < 0) { + DEBUG("[sx127x] error: failed to initialize DIO3 pin\n"); + return res; } + + return res; } 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; } -static int _init_peripherals(sx127x_t *dev) +static int _init_spi(sx127x_t *dev) { int res; @@ -258,11 +272,11 @@ static int _init_peripherals(sx127x_t *dev) res = spi_init_cs(dev->params.spi, dev->params.nss_pin); if (res != SPI_OK) { - DEBUG("[sx127x] error initializing SPI_%i device (code %i)\n", - dev->params.spi, res); - return 0; + DEBUG("[sx127x] error: failed to initialize SPI_%i device (code %i)\n", + dev->params.spi, res); + return -1; } - DEBUG("[sx127x] peripherals initialized with success\n"); - return 1; + DEBUG("[sx127x] SPI_%i initialized with success\n", dev->params.spi); + return 0; } diff --git a/drivers/sx127x/sx127x_internal.c b/drivers/sx127x/sx127x_internal.c index 6756cb1e3aaa61d2a8a493686dd76f5583974e3b..c00ad7aa73e6c3ddc043d51d31f5e1ea79e62d98 100644 --- a/drivers/sx127x/sx127x_internal.c +++ b/drivers/sx127x/sx127x_internal.c @@ -42,7 +42,7 @@ #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 */ 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) { DEBUG("[sx127x] sx1272 test failed, invalid version number: %d\n", version); - return false; + return -1; } - DEBUG("[sx127x] SX1272 transceiver detected.\n"); + DEBUG("[sx127x] SX1272 transceiver detected\n"); #else /* MODULE_SX1276) */ if (version != VERSION_SX1276) { DEBUG("[sx127x] sx1276 test failed, invalid version number: %d\n", version); - return false; + return -1; } - DEBUG("[sx127x] SX1276 transceiver detected.\n"); + DEBUG("[sx127x] SX1276 transceiver detected\n"); #endif - return true; + return 0; } void sx127x_reg_write(const sx127x_t *dev, uint8_t addr, uint8_t data)