From 8d93a3edf14f80989651231854658f2e120452d7 Mon Sep 17 00:00:00 2001 From: Juha Sunnari Date: Mon, 11 Nov 2024 10:50:46 +0200 Subject: [PATCH] logging: frontends: stmesp: alternate message output option Add an alternate message output option in which messages are ended with an additional zero data byte with marker and timestamp. Can be used to maintain compatibility with certain decoders. Signed-off-by: Juha Sunnari --- subsys/logging/frontends/Kconfig | 8 +++++ .../logging/frontends/log_frontend_stmesp.c | 32 +++++++++++++++---- 2 files changed, 34 insertions(+), 6 deletions(-) diff --git a/subsys/logging/frontends/Kconfig b/subsys/logging/frontends/Kconfig index 4d6d85e3e8834..ec3945fa1ffd4 100644 --- a/subsys/logging/frontends/Kconfig +++ b/subsys/logging/frontends/Kconfig @@ -74,6 +74,14 @@ config LOG_FRONTEND_STMESP_GUARANTEED_ACCESS When enabled, accessing STMESP registers will stall if write cannot be performed (e.g. ETR buffer is full). +config LOG_FRONTEND_STMESP_MSG_END_TIMESTAMP + bool "Generate timestamp and marker at message end" + help + Generate a zero data byte with timestamp and marker at message end, + instead of generating a timestamp and marker at message start and + a flag at end. This can be used to maintain compatibility with + certain decoders. + endif # LOG_FRONTEND_STMESP config LOG_FRONTEND_STMESP_DEMUX diff --git a/subsys/logging/frontends/log_frontend_stmesp.c b/subsys/logging/frontends/log_frontend_stmesp.c index 9ba444bcd1d99..288d557a0db78 100644 --- a/subsys/logging/frontends/log_frontend_stmesp.c +++ b/subsys/logging/frontends/log_frontend_stmesp.c @@ -312,7 +312,11 @@ static inline int16_t get_source_id(const void *source) static void packet_end(STMESP_Type *stm_esp) { - STM_FLAG(stm_esp); + if (IS_ENABLED(CONFIG_LOG_FRONTEND_STMESP_MSG_END_TIMESTAMP)) { + STM_D8(stm_esp, 0, true, true); + } else { + STM_FLAG(stm_esp); + } atomic_set(&new_data, 1); } @@ -363,7 +367,11 @@ void log_frontend_msg(const void *source, const struct log_msg_desc desc, uint8_ return; } - STM_D32(stm_esp, hdr.raw, use_timestamp, true); + if (IS_ENABLED(CONFIG_LOG_FRONTEND_STMESP_MSG_END_TIMESTAMP)) { + STM_D32(stm_esp, hdr.raw, false, false); + } else { + STM_D32(stm_esp, hdr.raw, use_timestamp, true); + } (void)cbprintf_package_convert(package, desc.package_len, package_cb, stm_esp, flags, strl, ARRAY_SIZE(strl)); write_data(sname, sname_len, stm_esp); @@ -412,7 +420,11 @@ void log_frontend_msg(const void *source, const struct log_msg_desc desc, uint8_ return; } - STM_D32(stm_esp, dict_desc.raw, true, true); + if (IS_ENABLED(CONFIG_LOG_FRONTEND_STMESP_MSG_END_TIMESTAMP)) { + STM_D32(stm_esp, dict_desc.raw, false, false); + } else { + STM_D32(stm_esp, dict_desc.raw, true, true); + } (void)cbprintf_package_convert(package, desc.package_len, package_cb, stm_esp, flags, NULL, 0); if (data) { @@ -460,7 +472,11 @@ static inline void msg_start(STMESP_Type *stm_esp, uint32_t level, const void *s { union stm_log_dict_hdr dict_desc = DICT_HDR_INITIALIZER(level, get_source_id(source), 0); - STM_D32(stm_esp, dict_desc.raw, true, true); + if (IS_ENABLED(CONFIG_LOG_FRONTEND_STMESP_MSG_END_TIMESTAMP)) { + STM_D32(stm_esp, dict_desc.raw, false, false); + } else { + STM_D32(stm_esp, dict_desc.raw, true, true); + } STM_D32(stm_esp, package_hdr, false, false); STM_D32(stm_esp, (uint32_t)fmt, false, false); } @@ -609,8 +625,12 @@ int log_frontend_stmesp_etr_ready(void) early_buf_read_mode(); while ((len = early_buf_get_data((void **)&buf)) > 0) { - /* Write first word with Marked and timestamp. */ - STM_D32(stm_esp, *buf, true, true); + if (IS_ENABLED(CONFIG_LOG_FRONTEND_STMESP_MSG_END_TIMESTAMP)) { + STM_D32(stm_esp, *buf, false, false); + } else { + /* Write first word with Marked and timestamp. */ + STM_D32(stm_esp, *buf, true, true); + } buf++; len -= sizeof(uint32_t);