Skip to content

Commit

Permalink
subsys, sdfw_services: add device information service handler
Browse files Browse the repository at this point in the history
Ref: NRFX-6558

Signed-off-by: Aymen LAOUINI <[email protected]>
  • Loading branch information
ayla-nordicsemi committed Dec 18, 2024
1 parent 4692441 commit 809e4a6
Show file tree
Hide file tree
Showing 13 changed files with 767 additions and 0 deletions.
33 changes: 33 additions & 0 deletions include/sdfw/sdfw_services/device_info_service.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
/*
* Copyright (c) 2024 Nordic Semiconductor ASA
*
* SPDX-License-Identifier: LicenseRef-Nordic-5-Clause
*/

#ifndef DEVICE_INFO_SERVICE_H__
#define DEVICE_INFO_SERVICE_H__

#include <stddef.h>
#include <stdint.h>

#include <sdfw/sdfw_services/ssf_errno.h>

#define UUID_BYTES_LENGTH 16UL

/**
* @brief Read UUID value.
*
* @note UUID byte order is the same as read from the memory
* and no endianness swapping is performed.
*
* @param[out] uuid_buff Local buffer for copying the UUID into.
* use defined UUID_BYTES_LENGTH to specify its size.
*
* @return 0 on success, otherwise a negative errno defined in ssf_errno.h.
* -SSF_ENOBUFS if invalid buffer.
* -SSF_EPROTO if server code resulted in an error.
* -SSF_EBADMSG if client received a bad response.
*/
int ssf_device_info_get_uuid(uint8_t *uuid_buff);

#endif /* DEVICE_INFO_SERVICE_H__ */
1 change: 1 addition & 0 deletions subsys/sdfw_services/services/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
#

# Services
add_subdirectory_ifdef(CONFIG_SSF_DEVICE_INFO_SERVICE_ENABLED device_info)
add_subdirectory_ifdef(CONFIG_SSF_ECHO_SERVICE_ENABLED echo)
add_subdirectory_ifdef(CONFIG_SSF_ENC_FW_SERVICE_ENABLED enc_fw)
add_subdirectory_ifdef(CONFIG_SSF_EXTMEM_SERVICE_ENABLED extmem)
Expand Down
1 change: 1 addition & 0 deletions subsys/sdfw_services/services/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
#

# Services
rsource "device_info/Kconfig"
rsource "echo/Kconfig"
rsource "enc_fw/Kconfig"
rsource "extmem/Kconfig"
Expand Down
12 changes: 12 additions & 0 deletions subsys/sdfw_services/services/device_info/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
#
# Copyright (c) 2024 Nordic Semiconductor ASA
#
# SPDX-License-Identifier: LicenseRef-Nordic-5-Clause
#

zephyr_sources(device_info_service.c)

generate_and_add_cbor_files(device_info_service.cddl zcbor_generated
device_info_service_req
device_info_service_rsp
)
13 changes: 13 additions & 0 deletions subsys/sdfw_services/services/device_info/Kconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
#
# Copyright (c) 2024 Nordic Semiconductor ASA
#
# SPDX-License-Identifier: LicenseRef-Nordic-5-Clause
#

service_name = DEVICE_INFO
service_default_enabled = y
service_id = 0x78
service_version = 1
service_buffer_size = 128
service_name_str = Device Info
rsource "../Kconfig.template.service"
143 changes: 143 additions & 0 deletions subsys/sdfw_services/services/device_info/device_info_service.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,143 @@
/*
* Copyright (c) 2024 Nordic Semiconductor ASA
*
* SPDX-License-Identifier: LicenseRef-Nordic-5-Clause
*/

/** .. include_startingpoint_device_info_source_rst */
#include <stddef.h>
#include <stdint.h>
#include <string.h>

#include <sdfw/sdfw_services/device_info_service.h>

#include "device_info_service_decode.h"
#include "device_info_service_encode.h"
#include "device_info_service_types.h"
#include <sdfw/sdfw_services/ssf_client.h>
#include <sdfw/sdfw_services/ssf_errno.h>
#include "ssf_client_os.h"

/* Not exposed in header because not used by interface */
#define TESTIMPRINT_BYTES_LENGTH 32UL

SSF_CLIENT_SERVICE_DEFINE(device_info_srvc, DEVICE_INFO, cbor_encode_device_info_req,
cbor_decode_device_info_resp);

static int get_device_info_data(struct device_info *device_info_data)
{
int ret = -SSF_ENODATA;

if (device_info_data != NULL) {
const uint8_t *rsp_pkt;

int stat = stat_INTERNAL_ERROR_c;

struct device_info_req device_info_request = {
.device_info_req_msg.read_req_action.operation_choice =
operation_READ_DEVICE_INFO_c,
};

struct device_info_resp device_info_response;

ret = ssf_client_send_request(&device_info_srvc, &device_info_request,
&device_info_response, &rsp_pkt);
if (ret == 0) {
if (device_info_response.device_info_resp_msg.read_resp_action
.operation_choice == operation_READ_DEVICE_INFO_c) {
stat = device_info_response.device_info_resp_msg.read_resp_status
.stat_choice;
if (stat == stat_SUCCESS_c) {

/* copy device info data to provided struction */
device_info_data->device_info_partno =
device_info_response.device_info_resp_msg
.read_resp_data.device_info_partno;

device_info_data->device_info_type =
device_info_response.device_info_resp_msg
.read_resp_data.device_info_type;

device_info_data->device_info_hwrevision =
device_info_response.device_info_resp_msg
.read_resp_data.device_info_hwrevision;

device_info_data->device_info_productionrevision =
device_info_response.device_info_resp_msg
.read_resp_data
.device_info_productionrevision;

memcpy((uint8_t *)(device_info_data->device_info_testimprint
.value),
(uint8_t *)(device_info_response.device_info_resp_msg
.read_resp_data
.device_info_testimprint.value),
device_info_response.device_info_resp_msg
.read_resp_data.device_info_testimprint.len);

device_info_data->device_info_testimprint.len =
device_info_response.device_info_resp_msg
.read_resp_data.device_info_testimprint.len;

memcpy((uint8_t *)(device_info_data->device_info_uuid
.value),
(uint8_t *)(device_info_response.device_info_resp_msg
.read_resp_data.device_info_uuid
.value),
device_info_response.device_info_resp_msg
.read_resp_data.device_info_uuid.len);

device_info_data->device_info_uuid.len =
device_info_response.device_info_resp_msg
.read_resp_data.device_info_uuid.len;

/* operation is successful */
ret = 0;
} else {
/* operation failed on server side */
ret = -SSF_EPROTO;
}
} else {
/* the received response message is not a read device info response
*/
ret = -SSF_EBADMSG;
}

/* at least a response message was received, free response packet buffer */
ssf_client_decode_done(rsp_pkt);
} else {
/* ssf error, no response received, no need to free response packet */
/* return value will be returned by ssf_client_send_request call */
}
}

return ret;
}

int ssf_device_info_get_uuid(uint8_t *uuid_buff)
{
int err = -SSF_ENODATA;

if (NULL != uuid_buff) {

uint8_t testimprint_bytes[TESTIMPRINT_BYTES_LENGTH] = {0};

struct device_info device_info_data = {
.device_info_partno = 0,
.device_info_type = 0,
.device_info_hwrevision = 0,
.device_info_productionrevision = 0,
.device_info_testimprint.value = testimprint_bytes,
.device_info_testimprint.len = TESTIMPRINT_BYTES_LENGTH,
/* caller provided buffer for UUID value */
.device_info_uuid.value = uuid_buff,
.device_info_uuid.len = UUID_BYTES_LENGTH,
};

err = get_device_info_data(&device_info_data);
} else {
err = -SSF_ENOBUFS;
}

return err;
}
52 changes: 52 additions & 0 deletions subsys/sdfw_services/services/device_info/device_info_service.cddl
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
;
; Copyright (c) 2024 Nordic Semiconductor ASA
;
; SPDX-License-Identifier: LicenseRef-Nordic-5-Clause
;

; .. include_startingpoint_device_info_cddl_rst

stat = (SUCCESS: 0) /
(INTERNAL_ERROR: 16781313) /
(UNPROGRAMMED: 16781314)

operation = (READ_DEVICE_INFO: 0) /
(UNSUPPORTED: 1)

device_info = [
uuid: bstr .size 16,
type: uint,
testimprint: bstr .size 32,
partno: uint,
hwrevision: uint,
productionrevision: uint,
]

read_req = (
1,
action: operation,
)

; Device Info service response to read data.
read_resp = (
1,
action: operation,
status: stat,
data: device_info,
)

device_info_req = [
2,
msg: (
read_req
),
]

device_info_resp = [
2,
msg: (
read_resp
),
]

; .. include_endingpoint_device_info_cddl_rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
#
# Copyright (c) 2024 Nordic Semiconductor ASA
#
# SPDX-License-Identifier: LicenseRef-Nordic-5-Clause
#

#
# Generated using cmake macro generate_and_add_cbor_files.
#

zephyr_sources(
device_info_service_decode.c
device_info_service_encode.c
)

zephyr_include_directories(.)
Loading

0 comments on commit 809e4a6

Please sign in to comment.