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 13, 2024
1 parent 568a7d4 commit a0bd0b8
Show file tree
Hide file tree
Showing 13 changed files with 761 additions and 0 deletions.
34 changes: 34 additions & 0 deletions include/sdfw/sdfw_services/device_info_service.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
/*
* 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 <errno.h>

#include <sdfw/sdfw_services/ssf_errno.h>

#define UUID_BYTES_LENGTH 16UL

/** .. include_startingpoint_device_info_header_rst */
/**
* @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.
*/
int ssf_device_info_get_uuid(uint8_t *uuid_buff);

/** .. include_endpoint_device_info_header_rst */

#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"
136 changes: 136 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,136 @@
/*
* 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 <errno.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 "ssf_client_os.h"

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

SSF_CLIENT_LOG_REGISTER(device_info_service, CONFIG_SSF_DEVICE_INFO_SERVICE_LOG_LEVEL);

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 = -ENODATA;

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

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

struct read_resp response_message = {0};

struct device_info_resp device_info_response = {
.device_info_resp_msg = response_message,
};

ret = ssf_client_send_request(&device_info_srvc, &device_info_request,
&device_info_response, &rsp_pkt);
if (ret != 0) {
/* return ssf error value */
return ret;
}

if (device_info_response.device_info_resp_msg.read_resp_action.operation_choice ==
operation_READ_DEVICE_INFO_c) {
ret = device_info_response.device_info_resp_msg.read_resp_status
.stat_choice;
if (ret == 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;

} else {
/* operation failed on server side */
ssf_client_decode_done(rsp_pkt);
return -EPROTO;
}
} else {
/* the received response message is not a read device info response */
ssf_client_decode_done(rsp_pkt);
return -EBADMSG;
}

ssf_client_decode_done(rsp_pkt);
}

return ret;
}

int ssf_device_info_get_uuid(uint8_t *uuid_buff)
{
int err = -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);
}

return err;
}

/** .. include_endpoint_device_info_source_rst */
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 a0bd0b8

Please sign in to comment.