From ab506618d7dd90e4ac47294b48a7217656f86d4b Mon Sep 17 00:00:00 2001 From: iabdalkader Date: Thu, 29 Jul 2021 21:22:32 +0200 Subject: [PATCH] Nina: Add firmware version checking. --- src/drivers/ninaw10/include/nina.h | 8 ++++++++ src/drivers/ninaw10/src/nina.c | 7 ------- src/omv/ports/rp2/modules/py_nina.c | 22 +++++++++++++++++++++- 3 files changed, 29 insertions(+), 8 deletions(-) diff --git a/src/drivers/ninaw10/include/nina.h b/src/drivers/ninaw10/include/nina.h index e351ed90f..2e3e7f64b 100644 --- a/src/drivers/ninaw10/include/nina.h +++ b/src/drivers/ninaw10/include/nina.h @@ -19,6 +19,14 @@ #define NINA_MAX_NETWORK_LIST (10) #define NINA_MAX_SOCKET (10) +#define NINA_FW_VER_MAJOR (1) +#define NINA_FW_VER_MINOR (4) +#define NINA_FW_VER_PATCH (7) + +#define NINA_FW_VER_MAJOR_OFFS (0) +#define NINA_FW_VER_MINOR_OFFS (2) +#define NINA_FW_VER_PATCH_OFFS (4) + typedef enum { NINA_SEC_INVALID = 0, NINA_SEC_OPEN, diff --git a/src/drivers/ninaw10/src/nina.c b/src/drivers/ninaw10/src/nina.c index 737949f56..fe40505f8 100644 --- a/src/drivers/ninaw10/src/nina.c +++ b/src/drivers/ninaw10/src/nina.c @@ -320,13 +320,6 @@ int nina_init() { // Initialize the BSP. nina_bsp_init(); - - // check firmware version - uint8_t fw_ver[NINA_FW_VER_LEN]; - if (nina_fw_version(fw_ver) != 0) { - return -1; - } - // TODO check fw version matches the driver. return 0; } diff --git a/src/omv/ports/rp2/modules/py_nina.c b/src/omv/ports/rp2/modules/py_nina.c index 11687088d..d4e1e1d5b 100644 --- a/src/omv/ports/rp2/modules/py_nina.c +++ b/src/omv/ports/rp2/modules/py_nina.c @@ -85,7 +85,27 @@ static mp_obj_t py_nina_active(size_t n_args, const mp_obj_t *args) int error = 0; if ((error = nina_init()) != 0) { mp_raise_msg_varg(&mp_type_OSError, - MP_ERROR_TEXT("Failed to initialize Nina-W10 module: %d\n"), error); + MP_ERROR_TEXT("Failed to initialize Nina-W10 module, error: %d\n"), error); + } + // check firmware version + uint8_t fw_ver[NINA_FW_VER_LEN]; + if (nina_fw_version(fw_ver) != 0) { + nina_deinit(); + mp_raise_msg_varg(&mp_type_OSError, + MP_ERROR_TEXT("Failed to read firmware version, error: %d\n"), error); + } + + // Check fw version matches the driver. + if ((fw_ver[NINA_FW_VER_MAJOR_OFFS] - 48) != NINA_FW_VER_MAJOR || + (fw_ver[NINA_FW_VER_MINOR_OFFS] - 48) != NINA_FW_VER_MINOR || + (fw_ver[NINA_FW_VER_PATCH_OFFS] - 48) != NINA_FW_VER_PATCH) { + nina_deinit(); + mp_raise_msg_varg(&mp_type_OSError, + MP_ERROR_TEXT("Firmware version mismatch. Expected %d.%d.%d found: %d.%d.%d\n"), + NINA_FW_VER_MAJOR, NINA_FW_VER_MINOR, NINA_FW_VER_PATCH, + fw_ver[NINA_FW_VER_MAJOR_OFFS] - 48, + fw_ver[NINA_FW_VER_MINOR_OFFS] - 48, + fw_ver[NINA_FW_VER_PATCH_OFFS] - 48); } } else { nina_deinit();