From 4b42025d1751e04632c0b04160e0d29dbbb222a5 Mon Sep 17 00:00:00 2001 From: Michael Coracin Date: Thu, 22 Apr 2021 14:34:46 +0200 Subject: [PATCH] > #### Updates This release only targets USB Corecell (no change for SPI connexion type). The USB-SPI bridge firmware, which runs on the STM32 MCU of the USB Corecell, has been updated for API clean-up and robustness improvements. > #### Changes * MCU: USB-SPI bridge firmware binary v1.0.0. * Removed obsolete commands (ORDER_ID__REQ_SPI, ORDER_ID__ACK_SPI) * Command index shifted after obsolete commands removal (ORDER_ID__REQ_MULTIPLE_SPI, ORDER_ID__ACK_MULTIPLE_SPI) * Command parser sends ORDER_ID__UNKNOW_CMD in case of wrong command size. * Code clean-up (typo fixed, comments added...) * Implemented Error_Handler() function to reset the MCU in case of fatal error. * Fixed a potential roll-over issue in read_write_spi() function. * Increased delay tolerance for host feedback on USB transfers. * HAL: Command interface updated for MCU firmware v1.0.0. * Removed obsolete commands from enum order_id_e * Shifted commands enum index according to USB-SPI bridge update. * Removed decode_ack_spi_access() unused function. * HAL: Added timing debug information under DEBUG_MCU. --- VERSION | 2 +- libloragw/inc/loragw_mcu.h | 10 ++-- libloragw/src/loragw_mcu.c | 48 ++++++++---------- ...ll_USB.bin => rlz_010000_CoreCell_USB.bin} | Bin 35672 -> 35724 bytes readme.md | 24 +++++++++ 5 files changed, 49 insertions(+), 35 deletions(-) rename mcu_bin/{rlz_000206_CoreCell_USB.bin => rlz_010000_CoreCell_USB.bin} (62%) diff --git a/VERSION b/VERSION index e9307ca..7ec1d6d 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2.0.2 +2.1.0 diff --git a/libloragw/inc/loragw_mcu.h b/libloragw/inc/loragw_mcu.h index b238894..0d0588f 100644 --- a/libloragw/inc/loragw_mcu.h +++ b/libloragw/inc/loragw_mcu.h @@ -28,7 +28,7 @@ License: Revised BSD License, see LICENSE.TXT file include in the project /* -------------------------------------------------------------------------- */ /* --- PUBLIC CONSTANTS ----------------------------------------------------- */ -static const char mcu_version_string[] = "00.02.06"; +static const char mcu_version_string[] = "01.00.00"; #define MAX_SIZE_COMMAND ( 4200 ) #define MAX_SPI_COMMAND ( MAX_SIZE_COMMAND - CMD_OFFSET__DATA - 1 ) @@ -45,18 +45,16 @@ typedef enum order_id_e ORDER_ID__REQ_BOOTLOADER_MODE = 0x02, ORDER_ID__REQ_RESET = 0x03, ORDER_ID__REQ_WRITE_GPIO = 0x04, - ORDER_ID__REQ_SPI = 0x05, /* deprecated */ - ORDER_ID__REQ_MULTIPLE_SPI = 0x06, + ORDER_ID__REQ_MULTIPLE_SPI = 0x05, ORDER_ID__ACK_PING = 0x40, ORDER_ID__ACK_GET_STATUS = 0x41, ORDER_ID__ACK_BOOTLOADER_MODE = 0x42, ORDER_ID__ACK_RESET = 0x43, ORDER_ID__ACK_WRITE_GPIO = 0x44, - ORDER_ID__ACK_SPI = 0x45, /* deprecated */ - ORDER_ID__ACK_MULTIPLE_SPI = 0x46, + ORDER_ID__ACK_MULTIPLE_SPI = 0x45, - ORDER_ID__UNKNOW_CMD = 0xFF + ORDER_ID__CMD_ERROR = 0xFF } order_id_t; typedef enum diff --git a/libloragw/src/loragw_mcu.c b/libloragw/src/loragw_mcu.c index 658e2a3..4644df8 100644 --- a/libloragw/src/loragw_mcu.c +++ b/libloragw/src/loragw_mcu.c @@ -146,8 +146,6 @@ const char * cmd_get_str(const uint8_t cmd) { return "REQ_RESET"; case ORDER_ID__REQ_WRITE_GPIO: return "REQ_WRITE_GPIO"; - case ORDER_ID__REQ_SPI: - return "REQ_SPI"; case ORDER_ID__REQ_MULTIPLE_SPI: return "REQ_MULTIPLE_SPI"; default: @@ -197,6 +195,10 @@ int write_req(int fd, order_id_t cmd, const uint8_t * payload, uint16_t payload_ int n; /* performances variables */ struct timeval tm; + /* debug variables */ +#if DEBUG_MCU == 1 + struct timeval write_tv; +#endif /* Record function start time */ _meas_time_start(&tm); @@ -231,7 +233,10 @@ int write_req(int fd, order_id_t cmd, const uint8_t * payload, uint16_t payload_ } } - DEBUG_PRINTF("\nINFO: write_req 0x%02X (%s) done, id:0x%02X\n", cmd, cmd_get_str(cmd), buf_w[0]); +#if DEBUG_MCU == 1 + gettimeofday(&write_tv, NULL); +#endif + DEBUG_PRINTF("\nINFO: %ld.%ld: write_req 0x%02X (%s) done, id:0x%02X, size:%u\n", write_tv.tv_sec, write_tv.tv_usec, cmd, cmd_get_str(cmd), buf_w[0], payload_size); #if DEBUG_VERBOSE int i; @@ -261,6 +266,10 @@ int read_ack(int fd, uint8_t * hdr, uint8_t * buf, size_t buf_size) { int nb_read = 0; /* performances variables */ struct timeval tm; + /* debug variables */ +#if DEBUG_MCU == 1 + struct timeval read_tv; +#endif /* Record function start time */ _meas_time_start(&tm); @@ -274,7 +283,10 @@ int read_ack(int fd, uint8_t * hdr, uint8_t * buf, size_t buf_size) { perror("ERROR: Unable to read /dev/ttyACMx - "); return -1; } else { - DEBUG_PRINTF("INFO: read %d bytes for header from gateway\n", n); +#if DEBUG_MCU == 1 + gettimeofday(&read_tv, NULL); +#endif + DEBUG_PRINTF("INFO: %ld.%ld: read %d bytes for header from gateway\n", read_tv.tv_sec, read_tv.tv_usec, n); } /* Compute time spent in this function */ @@ -317,7 +329,10 @@ int read_ack(int fd, uint8_t * hdr, uint8_t * buf, size_t buf_size) { perror("ERROR: Unable to read /dev/ttyACMx - "); return -1; } else { - DEBUG_PRINTF("INFO: read %d bytes from gateway\n", n); +#if DEBUG_MCU == 1 + gettimeofday(&read_tv, NULL); +#endif + DEBUG_PRINTF("INFO: %ld.%ld: read %d bytes from gateway\n", read_tv.tv_sec, read_tv.tv_usec, n); nb_read += n; } } while (nb_read < (int)size); /* we want to read only the expected payload, not more */ @@ -457,29 +472,6 @@ int decode_ack_gpio_access(const uint8_t * hdr, const uint8_t * payload, uint8_t /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ -int decode_ack_spi_access(const uint8_t * hdr, const uint8_t * payload) { - /* sanity checks */ - if ((hdr == NULL) || (payload == NULL)) { - printf("ERROR: invalid parameter\n"); - return -1; - } - - if (cmd_get_type(hdr) != ORDER_ID__ACK_SPI) { - printf("ERROR: wrong ACK type for ACK_SPI (expected:0x%02X, got 0x%02X)\n", ORDER_ID__ACK_SPI, cmd_get_type(hdr)); - return -1; - } - -#if DEBUG_VERBOSE - DEBUG_MSG ("## ACK_SPI_ACCESS\n"); - DEBUG_PRINTF(" id: 0x%02X\n", cmd_get_id(hdr)); - DEBUG_PRINTF(" size: %u\n", cmd_get_size(hdr)); -#endif - - return 0; -} - -/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ - int decode_ack_spi_bulk(const uint8_t * hdr, const uint8_t * payload) { uint8_t req_id, req_type, req_status; uint16_t frame_size; diff --git a/mcu_bin/rlz_000206_CoreCell_USB.bin b/mcu_bin/rlz_010000_CoreCell_USB.bin similarity index 62% rename from mcu_bin/rlz_000206_CoreCell_USB.bin rename to mcu_bin/rlz_010000_CoreCell_USB.bin index da4bd99984f7067a5010b8de36935ee6d43af267..3179a80a2fe9edd19c7ee0b42282b72fb583b86a 100644 GIT binary patch delta 5159 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 G6#Ng1XynTP delta 4956 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 diff --git a/readme.md b/readme.md index f1f5e59..ce5b052 100644 --- a/readme.md +++ b/readme.md @@ -191,6 +191,30 @@ found in the `libtools` directory. ## 7. Changelog +### v2.1.0 ### + +> #### Updates + +This release only targets USB Corecell (no change for SPI connexion type). +The USB-SPI bridge firmware, which runs on the STM32 MCU of the USB Corecell, has +been updated for API clean-up and robustness improvements. + +> #### Changes + +* MCU: USB-SPI bridge firmware binary v1.0.0. + * Removed obsolete commands (ORDER_ID__REQ_SPI, ORDER_ID__ACK_SPI) + * Command index shifted after obsolete commands removal (ORDER_ID__REQ_MULTIPLE_SPI, ORDER_ID__ACK_MULTIPLE_SPI) + * Command parser sends ORDER_ID__UNKNOW_CMD in case of wrong command size. + * Code clean-up (typo fixed, comments added...) + * Implemented Error_Handler() function to reset the MCU in case of fatal error. + * Fixed a potential roll-over issue in read_write_spi() function. + * Increased delay tolerance for host feedback on USB transfers. +* HAL: Command interface updated for MCU firmware v1.0.0. + * Removed obsolete commands from enum order_id_e + * Shifted commands enum index according to USB-SPI bridge update. + * Removed decode_ack_spi_access() unused function. +* HAL: Added timing debug information under DEBUG_MCU. + ### v2.0.2 ### > #### Updates