Skip to content

Commit f99fe41

Browse files
author
smtc-bot
committed
Release v2.7.0
1 parent 340a370 commit f99fe41

13 files changed

Lines changed: 307 additions & 44 deletions

CHANGELOG.md

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,38 @@ All notable changes to this project will be documented in this file.
44

55
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
66

7-
## [v2.5.2] - v2.5.2
7+
## [v2.7.0] - 2025-04-14
8+
9+
### Added
10+
11+
- CMake support
12+
- GFSK workarounds for specific modulation configurations:
13+
- `lr11xx_workaround_gfsk_1_2_kbps`
14+
- `lr11xx_workaround_gfsk_0_6_kbps_sub_ghz`
15+
- `lr11xx_workaround_gfsk_0_6_kbps_ghz`
16+
- `lr11xx_workaround_gfsk_reset`
17+
18+
### Changed
19+
20+
- `lr11xx_crypto_process_join_accept` returns an error if the data is longer than the maximum of 32 bytes
21+
- `lr11xx_crypto_process_join_accept` now returns an error if the provided *lorawan_version* is invalid
22+
23+
### Fixed
24+
25+
- Fixed incorrect pointer conversion that may generate incorrect results on `lr11xx_hal_read` calls
26+
- Compile warnings in `lr11xx_workaround_gfsk_reset` and `lr11xx_workaround_gfsk_1_2_kbps`
27+
28+
## [v2.6.0] - 2025-01-28
29+
30+
### Added
31+
32+
- `lr11xx_bootloader_get_hash` to get the flash code hash value
33+
34+
### Fixed
35+
36+
- Fix Wi-Fi MAC address endianness parsing when reading country code results
37+
38+
## [v2.5.2] - 2024-11-19
839

940
### Fixed
1041

Lines changed: 20 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
# @file lr11xx_driver_module.cmake
1+
# @file
22
#
3-
# @brief Defines CMake source files and include directories for this module
3+
# @brief CMake library project
44
#
55
# --- The Clear BSD License ---
66
# Copyright Semtech Corporation 2021. All rights reserved.
@@ -30,20 +30,22 @@
3030
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
3131
# POSSIBILITY OF SUCH DAMAGE.
3232

33-
set(LR11XX_DRIVER_MODULE_C_SOURCES
34-
${CMAKE_CURRENT_LIST_DIR}/lr11xx_bootloader.c
35-
${CMAKE_CURRENT_LIST_DIR}/lr11xx_crypto_engine.c
36-
${CMAKE_CURRENT_LIST_DIR}/lr11xx_driver_version.c
37-
${CMAKE_CURRENT_LIST_DIR}/lr11xx_gnss.c
38-
${CMAKE_CURRENT_LIST_DIR}/lr11xx_lr_fhss.c
39-
${CMAKE_CURRENT_LIST_DIR}/lr11xx_radio.c
40-
${CMAKE_CURRENT_LIST_DIR}/lr11xx_radio_timings.c
41-
${CMAKE_CURRENT_LIST_DIR}/lr11xx_rttof.c
42-
${CMAKE_CURRENT_LIST_DIR}/lr11xx_regmem.c
43-
${CMAKE_CURRENT_LIST_DIR}/lr11xx_system.c
44-
${CMAKE_CURRENT_LIST_DIR}/lr11xx_wifi.c
45-
)
33+
cmake_minimum_required(VERSION 3.25)
4634

47-
set(LR11XX_DRIVER_MODULE_C_INCLUDES
48-
${CMAKE_CURRENT_LIST_DIR}/.
49-
)
35+
project(
36+
lr11xx_driver
37+
DESCRIPTION "LR11xx driver library"
38+
LANGUAGES C
39+
)
40+
41+
option(LR11XX_DRIVER_GEOLOCATION "Provide LR11xx geolocation APIs for LR1110 and LR1120" ON)
42+
43+
add_subdirectory(src)
44+
45+
install(EXPORT Lr11xxDriverTargets
46+
FILE Lr11xxDriverConfig.cmake
47+
NAMESPACE lr11xx_driver::
48+
DESTINATION lib/cmake/MyLib
49+
)
50+
51+
export(TARGETS lr11xx_driver NAMESPACE lr11xx_driver:: FILE Lr11xxDriverTargets.cmake)

src/CMakeLists.txt

Lines changed: 29 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -30,14 +30,36 @@
3030
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
3131
# POSSIBILITY OF SUCH DAMAGE.
3232

33-
include(lr11xx_driver_module.cmake)
33+
add_library(lr11xx_driver STATIC
34+
lr11xx_bootloader.c
35+
lr11xx_crypto_engine.c
36+
lr11xx_driver_version.c
37+
lr11xx_lr_fhss.c
38+
lr11xx_radio_timings.c
39+
lr11xx_radio.c
40+
lr11xx_regmem.c
41+
lr11xx_rttof.c
42+
lr11xx_system.c
43+
)
44+
45+
if(LR11XX_DRIVER_GEOLOCATION)
46+
target_sources(lr11xx_driver PRIVATE
47+
lr11xx_gnss.c
48+
lr11xx_wifi.c
49+
)
50+
endif()
3451

35-
target_sources(${LR11XX_DRIVER_MODULE_TARGET}
36-
PRIVATE
37-
${LR11XX_DRIVER_MODULE_C_SOURCES}
52+
add_library(lr11xx_driver::lr11xx_driver ALIAS lr11xx_driver)
53+
54+
target_include_directories(lr11xx_driver PUBLIC
55+
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
56+
$<INSTALL_INTERFACE:>
3857
)
3958

40-
target_include_directories(${LR11XX_DRIVER_MODULE_TARGET}
41-
PUBLIC
42-
${LR11XX_DRIVER_MODULE_C_INCLUDES}
59+
install(TARGETS lr11xx_driver
60+
EXPORT Lr11xxDriverTargets
61+
LIBRARY DESTINATION lib
62+
ARCHIVE DESTINATION lib
63+
RUNTIME DESTINATION bin
64+
INCLUDES DESTINATION include
4365
)

src/lr11xx_bootloader.c

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@
5454
#define LR11XX_FLASH_DATA_MAX_LENGTH_UINT8 ( LR11XX_FLASH_DATA_MAX_LENGTH_UINT32 * 4 )
5555

5656
#define LR11XX_BL_CMD_NO_PARAM_LENGTH ( 2 )
57+
#define LR11XX_BL_GET_HASH_CMD_LENGTH ( LR11XX_BL_CMD_NO_PARAM_LENGTH )
5758
#define LR11XX_BL_GET_STATUS_CMD_LENGTH ( 2 + 4 )
5859
#define LR11XX_BL_VERSION_CMD_LENGTH LR11XX_BL_CMD_NO_PARAM_LENGTH
5960
#define LR11XX_BL_ERASE_FLASH_CMD_LENGTH LR11XX_BL_CMD_NO_PARAM_LENGTH
@@ -77,6 +78,7 @@ enum
7778
LR11XX_BL_GET_VERSION_OC = 0x0101,
7879
LR11XX_BL_ERASE_FLASH_OC = 0x8000,
7980
LR11XX_BL_WRITE_FLASH_ENCRYPTED_OC = 0x8003,
81+
LR11XX_BL_GET_HASH_OC = 0x8004,
8082
LR11XX_BL_REBOOT_OC = 0x8005,
8183
LR11XX_BL_GET_PIN_OC = 0x800B,
8284
LR11XX_BL_READ_CHIP_EUI_OC = 0x800C,
@@ -107,6 +109,17 @@ static uint8_t lr11xx_bootloader_get_min_from_operand_and_max_block_size( uint32
107109
* --- PUBLIC FUNCTIONS DEFINITION ---------------------------------------------
108110
*/
109111

112+
lr11xx_status_t lr11xx_bootloader_get_hash( const void* context, lr11xx_bootloader_hash_t hash )
113+
{
114+
uint8_t cbuffer[LR11XX_BL_GET_HASH_CMD_LENGTH];
115+
116+
cbuffer[0] = ( uint8_t ) ( LR11XX_BL_GET_HASH_OC >> 8 );
117+
cbuffer[1] = ( uint8_t ) ( LR11XX_BL_GET_HASH_OC >> 0 );
118+
119+
return ( lr11xx_status_t ) lr11xx_hal_read( context, cbuffer, LR11XX_BL_GET_HASH_CMD_LENGTH, hash,
120+
LR11XX_BL_HASH_LENGTH );
121+
}
122+
110123
lr11xx_status_t lr11xx_bootloader_get_status( const void* context, lr11xx_bootloader_stat1_t* stat1,
111124
lr11xx_bootloader_stat2_t* stat2,
112125
lr11xx_bootloader_irq_mask_t* irq_status )

src/lr11xx_bootloader.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,17 @@ typedef uint32_t lr11xx_bootloader_irq_mask_t;
6969
* --- PUBLIC FUNCTIONS PROTOTYPES ---------------------------------------------
7070
*/
7171

72+
/*!
73+
* @brief Get calculated hash of flash content.
74+
*
75+
* This method should be used to get the hash of flash content.
76+
*
77+
* @param [in] context Chip implementation context
78+
*
79+
* @param [out] hash Pointer to the hash array to be populated with hash value
80+
*/
81+
lr11xx_status_t lr11xx_bootloader_get_hash( const void* context, lr11xx_bootloader_hash_t hash );
82+
7283
/*!
7384
* @brief Return the status registers and interrupt flags
7485
*

src/lr11xx_bootloader_types.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,11 @@ extern "C" {
5757
* --- PUBLIC CONSTANTS --------------------------------------------------------
5858
*/
5959

60+
/*!
61+
* @brief Length in bytes of a hash value
62+
*/
63+
#define LR11XX_BL_HASH_LENGTH 0x10
64+
6065
/*!
6166
* @brief Length in byte of the LR11XX version blob
6267
*/
@@ -82,6 +87,11 @@ extern "C" {
8287
* --- PUBLIC TYPES ------------------------------------------------------------
8388
*/
8489

90+
/*!
91+
* @brief Fixed-length array to store hash value
92+
*/
93+
typedef uint8_t lr11xx_bootloader_hash_t[LR11XX_BL_HASH_LENGTH];
94+
8595
/*!
8696
* @brief Fixed-length array to store a PIN
8797
*/

src/lr11xx_crypto_engine.c

Lines changed: 30 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -52,11 +52,12 @@
5252

5353
#define LR11XX_CRYPTO_FW_IMAGE_DATA_MAX_LENGTH_UINT32 ( 64 )
5454
#define LR11XX_CRYPTO_FW_IMAGE_DATA_MAX_LENGTH_UINT8 ( LR11XX_CRYPTO_FW_IMAGE_DATA_MAX_LENGTH_UINT32 * 4 )
55+
#define LR11XX_CRYPTO_MAX_JOIN_ACCEPT_DATA_SIZE ( 32 )
5556

5657
#define LR11XX_CRYPTO_SELECT_CMD_LENGTH ( 2 + 1 )
5758
#define LR11XX_CRYPTO_SET_KEY_CMD_LENGTH ( 2 + 17 )
5859
#define LR11XX_CRYPTO_DERIVE_KEY_CMD_LENGTH ( 2 + 18 )
59-
#define LR11XX_CRYPTO_PROCESS_JOIN_ACCEPT_CMD_LENGTH ( 2 + 3 + 12 + 32 )
60+
#define LR11XX_CRYPTO_PROCESS_JOIN_ACCEPT_CMD_LENGTH ( 2 + 3 + 12 + LR11XX_CRYPTO_MAX_JOIN_ACCEPT_DATA_SIZE )
6061
#define LR11XX_CRYPTO_COMPUTE_AES_CMAC_CMD_LENGTH ( 2 + 1 + 272 )
6162
#define LR11XX_CRYPTO_VERIFY_AES_CMAC_CMD_LENGTH ( 2 + 1 + 4 + 256 )
6263
#define LR11XX_CRYPTO_AES_ENCRYPT_CMD_LENGTH ( 2 + 1 + 256 )
@@ -209,7 +210,24 @@ lr11xx_status_t lr11xx_crypto_process_join_accept( const void* context, lr11xx_c
209210
{
210211
uint8_t cbuffer[LR11XX_CRYPTO_PROCESS_JOIN_ACCEPT_CMD_LENGTH] = { 0x00 };
211212
uint8_t rbuffer[LR11XX_CRYPTO_STATUS_LENGTH + 32] = { 0x00 };
212-
uint8_t header_length = ( lorawan_version == 0 ) ? 1 : 12;
213+
uint8_t header_length;
214+
215+
switch( lorawan_version )
216+
{
217+
case LR11XX_CRYPTO_LORAWAN_VERSION_1_0_X:
218+
header_length = 1;
219+
break;
220+
case LR11XX_CRYPTO_LORAWAN_VERSION_1_1_X:
221+
header_length = 12;
222+
break;
223+
default:
224+
return LR11XX_STATUS_ERROR;
225+
}
226+
227+
if( length > LR11XX_CRYPTO_MAX_JOIN_ACCEPT_DATA_SIZE )
228+
{
229+
return LR11XX_STATUS_ERROR;
230+
}
213231

214232
cbuffer[0] = ( uint8_t ) ( LR11XX_CRYPTO_PROCESS_JOIN_ACCEPT_OC >> 8 );
215233
cbuffer[1] = ( uint8_t ) ( LR11XX_CRYPTO_PROCESS_JOIN_ACCEPT_OC >> 0 );
@@ -550,9 +568,16 @@ lr11xx_status_t lr11xx_crypto_get_check_encrypted_firmware_image_result( const v
550568
( uint8_t ) ( LR11XX_CRYPTO_GET_CHECK_ENCRYPTED_FW_IMAGE_RESULT_OC >> 0 ),
551569
};
552570

553-
return ( lr11xx_status_t ) lr11xx_hal_read( context, cbuffer,
554-
LR11XX_CRYPTO_GET_CHECK_ENCRYPTED_FW_IMAGE_RESULT_CMD_LENGTH,
555-
( uint8_t* ) is_encrypted_fw_image_ok, 1 );
571+
uint8_t is_encrypted_fw_image_ok_raw = 0;
572+
const lr11xx_status_t status = ( lr11xx_status_t ) lr11xx_hal_read(
573+
context, cbuffer, LR11XX_CRYPTO_GET_CHECK_ENCRYPTED_FW_IMAGE_RESULT_CMD_LENGTH, &is_encrypted_fw_image_ok_raw,
574+
1 );
575+
576+
if( status == LR11XX_STATUS_OK )
577+
{
578+
*is_encrypted_fw_image_ok = ( bool ) is_encrypted_fw_image_ok_raw;
579+
}
580+
return status;
556581
}
557582

558583
/*

src/lr11xx_crypto_engine.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ lr11xx_status_t lr11xx_crypto_derive_key( const void* context, lr11xx_crypto_sta
123123
* @param [in] lorawan_version LoRaWAN version to know the size of the header
124124
* @param [in] header The header to compute (length linked to lorawan_version)
125125
* @param [in] data The data to compute
126-
* @param [in] length The length in bytes of the data to compute
126+
* @param [in] length The length in bytes of the data to compute, must be less than 32 bytes
127127
* @param [out] data_out Placeholder for the decrypted data
128128
*
129129
* @returns Operation status

src/lr11xx_driver_version.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ extern "C" {
5454
* --- PUBLIC CONSTANTS --------------------------------------------------------
5555
*/
5656

57-
#define LR11XX_DRIVER_VERSION "v2.5.2"
57+
#define LR11XX_DRIVER_VERSION "v2.7.0"
5858

5959
/*
6060
* -----------------------------------------------------------------------------

src/lr11xx_gnss.c

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -474,8 +474,14 @@ lr11xx_status_t lr11xx_gnss_read_freq_search_space( const void*
474474
( uint8_t )( LR11XX_GNSS_READ_FREQ_SEARCH_SPACE_OC >> 0 ),
475475
};
476476

477-
return ( lr11xx_status_t ) lr11xx_hal_read( radio, cbuffer, LR11XX_GNSS_READ_FREQ_SEARCH_SPACE_CMD_LENGTH,
478-
( uint8_t* ) freq_search_space, sizeof( uint8_t ) );
477+
uint8_t freq_search_space_raw = 0;
478+
const lr11xx_status_t status = ( lr11xx_status_t ) lr11xx_hal_read(
479+
radio, cbuffer, LR11XX_GNSS_READ_FREQ_SEARCH_SPACE_CMD_LENGTH, &freq_search_space_raw, 1 );
480+
if( status == LR11XX_STATUS_OK )
481+
{
482+
*freq_search_space = ( lr11xx_gnss_freq_search_space_t ) freq_search_space_raw;
483+
}
484+
return status;
479485
}
480486

481487
lr11xx_status_t lr11xx_gnss_read_firmware_version( const void* context, lr11xx_gnss_version_t* version )

0 commit comments

Comments
 (0)