From 683a6af1f6506d6424eb0525cc3f65e67ee22beb Mon Sep 17 00:00:00 2001 From: Vladimir Umek Date: Mon, 26 Jan 2026 09:31:59 +0100 Subject: [PATCH 1/2] Change source directory structure --- ARM.CMSIS-Compiler.pdsc | 36 +++++++++---------- source/{ => core}/armcc/retarget_io.c | 0 source/{ => core}/clang/retarget_syscalls.c | 0 source/{ => core}/gcc/retarget_syscalls.c | 0 source/{ => core}/iar/retarget_io.c | 0 .../{ => file_interface}/retarget_fs_bkpt.c | 0 .../armcc/retarget_os_rtos2.c | 0 .../gcc/retarget_lock_rtos2.c | 0 .../iar/retarget_os_rtos2.c | 0 source/{ => stderr}/stderr_bkpt.c | 0 source/{ => stderr}/stderr_evr.c | 0 source/{ => stderr}/stderr_itm.c | 0 source/{ => stdin}/stdin_bkpt.c | 0 source/{ => stdin}/stdin_itm.c | 0 source/{ => stdout}/stdout_bkpt.c | 0 source/{ => stdout}/stdout_evr.c | 0 source/{ => stdout}/stdout_itm.c | 0 source/{ => tty}/tty_bkpt.c | 0 source/{ => tty}/tty_itm.c | 0 19 files changed, 18 insertions(+), 18 deletions(-) rename source/{ => core}/armcc/retarget_io.c (100%) rename source/{ => core}/clang/retarget_syscalls.c (100%) rename source/{ => core}/gcc/retarget_syscalls.c (100%) rename source/{ => core}/iar/retarget_io.c (100%) rename source/{ => file_interface}/retarget_fs_bkpt.c (100%) rename source/{ => os_interface}/armcc/retarget_os_rtos2.c (100%) rename source/{ => os_interface}/gcc/retarget_lock_rtos2.c (100%) rename source/{ => os_interface}/iar/retarget_os_rtos2.c (100%) rename source/{ => stderr}/stderr_bkpt.c (100%) rename source/{ => stderr}/stderr_evr.c (100%) rename source/{ => stderr}/stderr_itm.c (100%) rename source/{ => stdin}/stdin_bkpt.c (100%) rename source/{ => stdin}/stdin_itm.c (100%) rename source/{ => stdout}/stdout_bkpt.c (100%) rename source/{ => stdout}/stdout_evr.c (100%) rename source/{ => stdout}/stdout_itm.c (100%) rename source/{ => tty}/tty_bkpt.c (100%) rename source/{ => tty}/tty_itm.c (100%) diff --git a/ARM.CMSIS-Compiler.pdsc b/ARM.CMSIS-Compiler.pdsc index c1346f8..45bea35 100644 --- a/ARM.CMSIS-Compiler.pdsc +++ b/ARM.CMSIS-Compiler.pdsc @@ -218,25 +218,25 @@ Standard C Library Retarget Core - + Standard C Library Retarget Core - + Standard C Library Retarget Core - + Standard C Library Retarget Core - + @@ -259,7 +259,7 @@ #define RTE_CMSIS_Compiler_File_Interface_Breakpoint /* Compiler File Interface: Breakpoint */ - + @@ -281,7 +281,7 @@ #define RTE_CMSIS_Compiler_STDERR_Breakpoint /* CMSIS-Compiler STDERR: Breakpoint */ - + @@ -291,7 +291,7 @@ #define RTE_CMSIS_Compiler_STDERR_Event_Recorder /* CMSIS-Compiler STDERR: Event Recorder */ - + @@ -301,7 +301,7 @@ #define RTE_CMSIS_Compiler_STDERR_ITM /* CMSIS-Compiler STDERR: ITM */ - + @@ -323,7 +323,7 @@ #define RTE_CMSIS_Compiler_STDIN_Breakpoint /* CMSIS-Compiler STDIN: Breakpoint */ - + @@ -333,7 +333,7 @@ #define RTE_CMSIS_Compiler_STDIN_ITM /* CMSIS-Compiler STDIN: ITM */ - + @@ -355,7 +355,7 @@ #define RTE_CMSIS_Compiler_STDOUT_Breakpoint /* CMSIS-Compiler STDOUT: Breakpoint */ - + @@ -365,7 +365,7 @@ #define RTE_CMSIS_Compiler_STDOUT_Event_Recorder /* CMSIS-Compiler STDOUT: Event Recorder */ - + @@ -375,7 +375,7 @@ #define RTE_CMSIS_Compiler_STDOUT_ITM /* CMSIS-Compiler STDOUT: ITM */ - + @@ -397,7 +397,7 @@ #define RTE_CMSIS_Compiler_TTY_Breakpoint /* CMSIS-Compiler TTY: Breakpoint */ - + @@ -407,7 +407,7 @@ #define RTE_CMSIS_Compiler_TTY_ITM /* CMSIS-Compiler TTY: ITM */ - + @@ -443,7 +443,7 @@ #define RTE_CMSIS_Compiler_OS_Interface_RTOS2_LIBSPACE /* Implements per-thread static data management */ - + @@ -455,7 +455,7 @@ #define RTE_CMSIS_Compiler_OS_Interface_RTOS2_LOCKS /* Implements locking routines */ - + @@ -467,7 +467,7 @@ #define RTE_CMSIS_Compiler_OS_Interface_RTOS2_LOCKS /* Implements locking routines */ - + diff --git a/source/armcc/retarget_io.c b/source/core/armcc/retarget_io.c similarity index 100% rename from source/armcc/retarget_io.c rename to source/core/armcc/retarget_io.c diff --git a/source/clang/retarget_syscalls.c b/source/core/clang/retarget_syscalls.c similarity index 100% rename from source/clang/retarget_syscalls.c rename to source/core/clang/retarget_syscalls.c diff --git a/source/gcc/retarget_syscalls.c b/source/core/gcc/retarget_syscalls.c similarity index 100% rename from source/gcc/retarget_syscalls.c rename to source/core/gcc/retarget_syscalls.c diff --git a/source/iar/retarget_io.c b/source/core/iar/retarget_io.c similarity index 100% rename from source/iar/retarget_io.c rename to source/core/iar/retarget_io.c diff --git a/source/retarget_fs_bkpt.c b/source/file_interface/retarget_fs_bkpt.c similarity index 100% rename from source/retarget_fs_bkpt.c rename to source/file_interface/retarget_fs_bkpt.c diff --git a/source/armcc/retarget_os_rtos2.c b/source/os_interface/armcc/retarget_os_rtos2.c similarity index 100% rename from source/armcc/retarget_os_rtos2.c rename to source/os_interface/armcc/retarget_os_rtos2.c diff --git a/source/gcc/retarget_lock_rtos2.c b/source/os_interface/gcc/retarget_lock_rtos2.c similarity index 100% rename from source/gcc/retarget_lock_rtos2.c rename to source/os_interface/gcc/retarget_lock_rtos2.c diff --git a/source/iar/retarget_os_rtos2.c b/source/os_interface/iar/retarget_os_rtos2.c similarity index 100% rename from source/iar/retarget_os_rtos2.c rename to source/os_interface/iar/retarget_os_rtos2.c diff --git a/source/stderr_bkpt.c b/source/stderr/stderr_bkpt.c similarity index 100% rename from source/stderr_bkpt.c rename to source/stderr/stderr_bkpt.c diff --git a/source/stderr_evr.c b/source/stderr/stderr_evr.c similarity index 100% rename from source/stderr_evr.c rename to source/stderr/stderr_evr.c diff --git a/source/stderr_itm.c b/source/stderr/stderr_itm.c similarity index 100% rename from source/stderr_itm.c rename to source/stderr/stderr_itm.c diff --git a/source/stdin_bkpt.c b/source/stdin/stdin_bkpt.c similarity index 100% rename from source/stdin_bkpt.c rename to source/stdin/stdin_bkpt.c diff --git a/source/stdin_itm.c b/source/stdin/stdin_itm.c similarity index 100% rename from source/stdin_itm.c rename to source/stdin/stdin_itm.c diff --git a/source/stdout_bkpt.c b/source/stdout/stdout_bkpt.c similarity index 100% rename from source/stdout_bkpt.c rename to source/stdout/stdout_bkpt.c diff --git a/source/stdout_evr.c b/source/stdout/stdout_evr.c similarity index 100% rename from source/stdout_evr.c rename to source/stdout/stdout_evr.c diff --git a/source/stdout_itm.c b/source/stdout/stdout_itm.c similarity index 100% rename from source/stdout_itm.c rename to source/stdout/stdout_itm.c diff --git a/source/tty_bkpt.c b/source/tty/tty_bkpt.c similarity index 100% rename from source/tty_bkpt.c rename to source/tty/tty_bkpt.c diff --git a/source/tty_itm.c b/source/tty/tty_itm.c similarity index 100% rename from source/tty_itm.c rename to source/tty/tty_itm.c From f370dcff317d9fecb8beb39c733a52f515a464e0 Mon Sep 17 00:00:00 2001 From: Vladimir Umek Date: Mon, 26 Jan 2026 09:51:27 +0100 Subject: [PATCH 2/2] Add standard stream to CMSIS-Driver USART retarget implementation --- ARM.CMSIS-Compiler.pdsc | 59 +++- config/stderr_cmsis_uart_config.h | 59 ++++ config/stdin_cmsis_uart_config.h | 59 ++++ config/stdio_cmsis_uart_config.h | 52 +++ config/stdout_cmsis_uart_config.h | 59 ++++ documentation/doxygen/src/images/blocks.pptx | Bin 50993 -> 51033 bytes .../doxygen/src/images/retarget_io_std.png | Bin 15861 -> 18210 bytes documentation/doxygen/src/rt_io.md | 3 +- gen_pack.sh | 1 + source/core/armcc/retarget_io.c | 11 +- source/core/gcc/retarget_syscalls.c | 11 +- source/core/stdio_cmsis_uart.c | 313 ++++++++++++++++++ 12 files changed, 620 insertions(+), 7 deletions(-) create mode 100644 config/stderr_cmsis_uart_config.h create mode 100644 config/stdin_cmsis_uart_config.h create mode 100644 config/stdio_cmsis_uart_config.h create mode 100644 config/stdout_cmsis_uart_config.h create mode 100644 source/core/stdio_cmsis_uart.c diff --git a/ARM.CMSIS-Compiler.pdsc b/ARM.CMSIS-Compiler.pdsc index 45bea35..04f78c6 100644 --- a/ARM.CMSIS-Compiler.pdsc +++ b/ARM.CMSIS-Compiler.pdsc @@ -15,6 +15,7 @@ Active Development ... + Add components that enable stdio retarget to UART AC6: - Corrected _sys_read return value when rt_fs_read returns with error (#62) IAR: @@ -108,6 +109,11 @@ + + CMSIS-Compiler CORE component and CMSIS-Driver USART + + + ARMCC and CORE component @@ -155,6 +161,13 @@ + + + STDIO retarget to CMSIS Driver UART + + + + Compiler Specific Interfaces @@ -215,28 +228,36 @@ - + Standard C Library Retarget Core + + - + Standard C Library Retarget Core + + - + Standard C Library Retarget Core + + - + Standard C Library Retarget Core + + @@ -304,6 +325,16 @@ + + Redirect STDERR to a CMSIS-Driver USART + + #define RTE_CMSIS_Compiler_STDERR /* CMSIS-Compiler STDERR */ + #define RTE_CMSIS_Compiler_STDERR_UART_CMSIS /* CMSIS-Compiler STDERR: UART: CMSIS */ + + + + + @@ -336,6 +367,16 @@ + + Retrieve STDIN from a CMSIS-Driver USART + + #define RTE_CMSIS_Compiler_STDIN /* CMSIS-Compiler STDIN */ + #define RTE_CMSIS_Compiler_STDIN_UART_CMSIS /* CMSIS-Compiler STDIN: UART: CMSIS */ + + + + + @@ -378,6 +419,16 @@ + + Redirect STDOUT to a CMSIS-Driver USART + + #define RTE_CMSIS_Compiler_STDOUT /* CMSIS-Compiler STDOUT */ + #define RTE_CMSIS_Compiler_STDOUT_UART_CMSIS /* CMSIS-Compiler STDOUT: UART: CMSIS */ + + + + + diff --git a/config/stderr_cmsis_uart_config.h b/config/stderr_cmsis_uart_config.h new file mode 100644 index 0000000..192648e --- /dev/null +++ b/config/stderr_cmsis_uart_config.h @@ -0,0 +1,59 @@ +/*--------------------------------------------------------------------------- + * Copyright (c) 2026 Arm Limited (or its affiliates). + * All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * -------------------------------------------------------------------------- + * + * Purpose: Configure STDERR to CMSIS-Driver USART retarget implementation + * Revision: V1.0.0 + * + * --------------------------------------------------------------------------*/ + +#ifndef STDERR_CMSIS_UART_CONFIG_H_ +#define STDERR_CMSIS_UART_CONFIG_H_ + +//-------- <<< Use Configuration Wizard in Context Menu >>> -------------------- +//------ With VS Code: Open Preview for Configuration Wizard ------------------- + +// UART STDERR Buffer Size +// UART STDERR buffer is used to store STDERR data before sending it via UART +// Default: 0 (unbuffered) +#ifndef STDERR_UART_BUFFER_SIZE +#define STDERR_UART_BUFFER_SIZE 0 +#endif + +// UART STDERR Buffer Section Name +// Specify the memory section name for UART STDERR buffer +// Default: .stderr_uart_buf +#ifndef STDERR_UART_BUFFER_SECTION +#define STDERR_UART_BUFFER_SECTION ".stderr_uart_buf" +#endif + +// UART STDERR Buffer Alignment +// Define the STDERR buffer alignment in bytes +// Default: 32 +#ifndef STDERR_UART_BUFFER_ALIGNMENT +#define STDERR_UART_BUFFER_ALIGNMENT 32 +#endif + +// Convert LF to CRLF +// If enabled, LF characters are preceded by CR characters on output +// Default: 0 +#ifndef STDERR_CR_LF +#define STDERR_CR_LF 0 +#endif + +#endif /* STDERR_CMSIS_UART_CONFIG_H_ */ diff --git a/config/stdin_cmsis_uart_config.h b/config/stdin_cmsis_uart_config.h new file mode 100644 index 0000000..bce0ba2 --- /dev/null +++ b/config/stdin_cmsis_uart_config.h @@ -0,0 +1,59 @@ +/*--------------------------------------------------------------------------- + * Copyright (c) 2026 Arm Limited (or its affiliates). + * All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * -------------------------------------------------------------------------- + * + * Purpose: Configure STDIN to CMSIS-Driver USART retarget implementation + * Revision: V1.0.0 + * + * --------------------------------------------------------------------------*/ + +#ifndef STDIN_CMSIS_UART_CONFIG_H_ +#define STDIN_CMSIS_UART_CONFIG_H_ + +//-------- <<< Use Configuration Wizard in Context Menu >>> -------------------- +//------ With VS Code: Open Preview for Configuration Wizard ------------------- + +// UART STDIN Buffer Size +// UART STDIN buffer is used to store STDIN data received via UART +// Default: 64 +#ifndef STDIN_UART_BUFFER_SIZE +#define STDIN_UART_BUFFER_SIZE 64 +#endif + +// UART STDIN Buffer Section Name +// Specify the memory section name for UART STDIN buffer +// Default: .stdin_uart_buf +#ifndef STDIN_UART_BUFFER_SECTION +#define STDIN_UART_BUFFER_SECTION ".stdin_uart_buf" +#endif + +// UART STDIN Buffer Alignment +// Define the STDIN buffer alignment in bytes +// Default: 32 +#ifndef STDIN_UART_BUFFER_ALIGNMENT +#define STDIN_UART_BUFFER_ALIGNMENT 32 +#endif + +// Echo Input Characters +// If enabled, received characters are echoed to STDOUT +// Default: 0 +#ifndef STDIN_ECHO +#define STDIN_ECHO 0 +#endif + +#endif /* STDIN_CMSIS_UART_CONFIG_H_ */ diff --git a/config/stdio_cmsis_uart_config.h b/config/stdio_cmsis_uart_config.h new file mode 100644 index 0000000..aeeca61 --- /dev/null +++ b/config/stdio_cmsis_uart_config.h @@ -0,0 +1,52 @@ +/*--------------------------------------------------------------------------- + * Copyright (c) 2026 Arm Limited (or its affiliates). + * All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * -------------------------------------------------------------------------- + * + * Purpose: STDIO to CMSIS Driver USART Retarget Configuration + * Revision: V1.0.0 + * + * --------------------------------------------------------------------------*/ + +#ifndef STDIO_CMSIS_UART_CONFIG_H_ +#define STDIO_CMSIS_UART_CONFIG_H_ + +#ifdef CMSIS_target_header +#include CMSIS_target_header +#else +#define RETARGET_STDIO_UART 0 +#endif + +//-------- <<< Use Configuration Wizard in Context Menu >>> -------------------- +//------ With VS Code: Open Preview for Configuration Wizard ------------------- + +// Connect to hardware via Driver_USART# +// Select driver control block for hardware interface +// Default: 0 +#ifndef STDIO_UART_DRIVER +#define STDIO_UART_DRIVER RETARGET_STDIO_UART +#endif + +// UART baudrate +// Specifies the baudrate for UART communication +// Common values: 9600, 19200, 38400, 57600, 115200, 230400, 460800, 921600 +// Default: 115200 +#ifndef STDIO_UART_BAUDRATE +#define STDIO_UART_BAUDRATE 115200 +#endif + +#endif /* STDIO_CMSIS_UART_CONFIG_H_ */ diff --git a/config/stdout_cmsis_uart_config.h b/config/stdout_cmsis_uart_config.h new file mode 100644 index 0000000..323d217 --- /dev/null +++ b/config/stdout_cmsis_uart_config.h @@ -0,0 +1,59 @@ +/*--------------------------------------------------------------------------- + * Copyright (c) 2026 Arm Limited (or its affiliates). + * All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * -------------------------------------------------------------------------- + * + * Purpose: Configure STDOUT to CMSIS-Driver USART retarget implementation + * Revision: V1.0.0 + * + * --------------------------------------------------------------------------*/ + +#ifndef STDOUT_CMSIS_UART_CONFIG_H_ +#define STDOUT_CMSIS_UART_CONFIG_H_ + +//-------- <<< Use Configuration Wizard in Context Menu >>> -------------------- +//------ With VS Code: Open Preview for Configuration Wizard ------------------- + +// UART STDOUT Buffer Size +// UART STDOUT buffer is used to store STDOUT data before sending it via UART +// Default: 0 (unbuffered) +#ifndef STDOUT_UART_BUFFER_SIZE +#define STDOUT_UART_BUFFER_SIZE 0 +#endif + +// UART STDOUT Buffer Section Name +// Specify the memory section name for UART STDOUT buffer +// Default: .stdout_uart_buf +#ifndef STDOUT_UART_BUFFER_SECTION +#define STDOUT_UART_BUFFER_SECTION ".stdout_uart_buf" +#endif + +// UART STDOUT Buffer Alignment +// Define the buffer alignment in bytes +// Default: 32 +#ifndef STDOUT_UART_BUFFER_ALIGNMENT +#define STDOUT_UART_BUFFER_ALIGNMENT 32 +#endif + +// Convert LF to CRLF +// If enabled, LF characters are preceded by CR characters on output +// Default: 0 +#ifndef STDOUT_CR_LF +#define STDOUT_CR_LF 0 +#endif + +#endif /* STDOUT_CMSIS_UART_CONFIG_H_ */ diff --git a/documentation/doxygen/src/images/blocks.pptx b/documentation/doxygen/src/images/blocks.pptx index d1a36fa873bd465065fe7dbef6248c22a659e923..c005bd3dd213001833de68357e1018269038d231 100644 GIT binary patch delta 13436 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 G(EkG_Qb_aw diff --git a/documentation/doxygen/src/images/retarget_io_std.png b/documentation/doxygen/src/images/retarget_io_std.png index 9e8a0715257cbb8d466d1ba9b7ba30d342519421..13282456d3b63e951938d90f26811931c740bd20 100644 GIT binary patch literal 18210 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 diff --git a/documentation/doxygen/src/rt_io.md b/documentation/doxygen/src/rt_io.md index 841cc61..8d62328 100644 --- a/documentation/doxygen/src/rt_io.md +++ b/documentation/doxygen/src/rt_io.md @@ -39,7 +39,8 @@ The following subcomponents are available: **Breakpoint** | When the I/O stream is used, the application stops with [BKPT](https://developer.arm.com/documentation/100073/latest/The-Arm-C-and-C---Libraries/Support-for-building-an-application-with-the-C-library/Using-the-C-and-C---libraries-with-an-application-in-a-semihosting-environment?lang=en) instruction. No additional code is required. **Event Recorder** | STDOUT and STDERR can be redirected using the [Event Recorder](https://arm-software.github.io/CMSIS-View/main/evr.html) (especially interesting for targets without ITM (such as Cortex-M0/M0+/M23)). **ITM** | Use [Instrumentation Trace Macrocell (ITM)](https://developer.arm.com/documentation/ddi0314/h/Instrumentation-Trace-Macrocell?lang=en) for I/O communication via the debugger (only available for Cortex-M3/M4/M7/M33/M55/M85 processors).
Usually, data is shown in a dedicated window.
No additional code is required to output or input data through the ITM channel. However, you have to configure the ITM channel for tracing. -**Custom** | Retarget I/O stream to a user defined interface (such as UART or other application specific interface).
See \subpage custom_subcomponent for further details. +**UART** | Retarget I/O streams to UART. Default implementation variant uses CMSIS-Driver USART. +**Custom** | Retarget I/O stream to a user defined interface (such as custom UART implementation or other application specific interface).
See \subpage custom_subcomponent for further details. > **Note** diff --git a/gen_pack.sh b/gen_pack.sh index 97bf999..5edf691 100755 --- a/gen_pack.sh +++ b/gen_pack.sh @@ -29,6 +29,7 @@ DEFAULT_ARGS=(-c "v") # Default: empty (all folders) # PACK_DIRS=" + config documentation example include diff --git a/source/core/armcc/retarget_io.c b/source/core/armcc/retarget_io.c index 0332232..75db9af 100644 --- a/source/core/armcc/retarget_io.c +++ b/source/core/armcc/retarget_io.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2023-2025 ARM Limited or its affiliates. All rights reserved. + * Copyright (C) 2023-2026 ARM Limited or its affiliates. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -32,14 +32,23 @@ #ifdef RTE_CMSIS_Compiler_STDERR #include "retarget_stderr.h" +#ifdef RTE_CMSIS_Compiler_STDERR_UART_CMSIS +#include "stderr_cmsis_uart_config.h" +#endif #endif #ifdef RTE_CMSIS_Compiler_STDIN #include "retarget_stdin.h" +#ifdef RTE_CMSIS_Compiler_STDIN_UART_CMSIS +#include "stdin_cmsis_uart_config.h" +#endif #endif #ifdef RTE_CMSIS_Compiler_STDOUT #include "retarget_stdout.h" +#ifdef RTE_CMSIS_Compiler_STDOUT_UART_CMSIS +#include "stdout_cmsis_uart_config.h" +#endif #endif #ifdef RTE_CMSIS_Compiler_TTY diff --git a/source/core/gcc/retarget_syscalls.c b/source/core/gcc/retarget_syscalls.c index 13a7b0e..516c8d6 100644 --- a/source/core/gcc/retarget_syscalls.c +++ b/source/core/gcc/retarget_syscalls.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2023-2024 ARM Limited or its affiliates. All rights reserved. + * Copyright (C) 2023-2026 ARM Limited or its affiliates. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -35,14 +35,23 @@ #ifdef RTE_CMSIS_Compiler_STDERR #include "retarget_stderr.h" +#ifdef RTE_CMSIS_Compiler_STDERR_UART_CMSIS +#include "stderr_cmsis_uart_config.h" +#endif #endif #ifdef RTE_CMSIS_Compiler_STDIN #include "retarget_stdin.h" +#ifdef RTE_CMSIS_Compiler_STDIN_UART_CMSIS +#include "stdin_cmsis_uart_config.h" +#endif #endif #ifdef RTE_CMSIS_Compiler_STDOUT #include "retarget_stdout.h" +#ifdef RTE_CMSIS_Compiler_STDOUT_UART_CMSIS +#include "stdout_cmsis_uart_config.h" +#endif #endif #ifndef STDIN_ECHO diff --git a/source/core/stdio_cmsis_uart.c b/source/core/stdio_cmsis_uart.c new file mode 100644 index 0000000..7f4780e --- /dev/null +++ b/source/core/stdio_cmsis_uart.c @@ -0,0 +1,313 @@ +/*--------------------------------------------------------------------------- + * Copyright (c) 2026 Arm Limited (or its affiliates). + * All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *---------------------------------------------------------------------------*/ + +#include +#include "cmsis_compiler.h" + +#include "RTE_Components.h" + +#ifdef RTE_CMSIS_Compiler_STDERR_UART_CMSIS +#include "retarget_stderr.h" +#include "stderr_cmsis_uart_config.h" +#endif +#ifdef RTE_CMSIS_Compiler_STDIN_UART_CMSIS +#include "retarget_stdin.h" +#include "stdin_cmsis_uart_config.h" +#endif +#ifdef RTE_CMSIS_Compiler_STDOUT_UART_CMSIS +#include "retarget_stdout.h" +#include "stdout_cmsis_uart_config.h" +#endif + +#include "stdio_cmsis_uart_config.h" + +/* Global initialization function */ +extern int stdio_cmsis_uart_init (void); + +/* Reference to the underlying USART driver */ +#define ptrUSART (&ARM_Driver_USART_(STDIO_UART_DRIVER)) + +/* Global Initialization Flag */ +static uint8_t Initialized = 0U; + +/* UART Error Flags */ +#define UART_FLAG_RX_ERROR (0x01U) +#define UART_FLAG_TX_ERROR (0x02U) + +/* UART Input Buffer Structure */ +typedef struct { + uint8_t *data; /* Pointer to data buffer */ + uint32_t size; /* Size of data buffer */ + volatile uint32_t cnt; /* Number of characters transferred */ + volatile uint32_t idx; /* Buffer index */ + volatile uint32_t flags; /* Error flags */ +} UART_InBuffer; + +/* UART Output Buffer Structure */ +typedef struct { + uint8_t *data; /* Pointer to data buffer */ + uint32_t size; /* Size of data buffer */ + volatile uint32_t idx; /* Buffer index */ + volatile uint32_t flags; /* Error flags */ +} UART_OutBuffer; + +#if defined(RTE_CMSIS_Compiler_STDERR_UART_CMSIS) +/* STDERR Buffer Attribute */ +#define STDERR_UART_BUFFER_ATTRIBUTE __attribute__((section(STDERR_UART_BUFFER_SECTION), aligned(STDERR_UART_BUFFER_ALIGNMENT))) +/* STDERR Buffer Array */ +static uint8_t StdErrBuf[(STDERR_UART_BUFFER_SIZE == 0) ? 1 : STDERR_UART_BUFFER_SIZE] STDERR_UART_BUFFER_ATTRIBUTE; +/* STDERR Buffer Object */ +static UART_OutBuffer UART_StdErrBuf = { StdErrBuf, sizeof(StdErrBuf), 0, 0 }; +#endif + +#if defined(RTE_CMSIS_Compiler_STDIN_UART_CMSIS) +/* STDIN Buffer Attribute */ +#define STDIN_UART_BUFFER_ATTRIBUTE __attribute__((section(STDIN_UART_BUFFER_SECTION), aligned(STDIN_UART_BUFFER_ALIGNMENT))) +/* STDIN Buffer Array */ +static uint8_t StdInBuf[(STDIN_UART_BUFFER_SIZE == 0) ? 1 : STDIN_UART_BUFFER_SIZE] STDIN_UART_BUFFER_ATTRIBUTE; +/* STDIN Buffer Object */ +static UART_InBuffer UART_StdInBuf = { StdInBuf, sizeof(StdInBuf), 0, 0, 0 }; +#endif + +#if defined(RTE_CMSIS_Compiler_STDOUT_UART_CMSIS) +/* STDOUT Buffer Attribute */ +#define STDOUT_UART_BUFFER_ATTRIBUTE __attribute__((section(STDOUT_UART_BUFFER_SECTION), aligned(STDOUT_UART_BUFFER_ALIGNMENT))) +/* STDOUT Buffer Array */ +static uint8_t StdOutBuf[(STDOUT_UART_BUFFER_SIZE == 0) ? 1 : STDOUT_UART_BUFFER_SIZE] STDOUT_UART_BUFFER_ATTRIBUTE; +/* STDOUT Buffer Object */ +static UART_OutBuffer UART_StdOutBuf = { StdOutBuf, sizeof(StdOutBuf), 0, 0 }; +#endif + +/** + UART driver event callback + + \param event ARM_USART_EVENT_* notification mask + */ +void UART_Event_Callback(uint32_t event) { +#if defined(RTE_CMSIS_Compiler_STDIN_UART_CMSIS) + int32_t status; + + if (event & ARM_USART_EVENT_RECEIVE_COMPLETE) { + /* Increment number of received characters */ + UART_StdInBuf.cnt += UART_StdInBuf.size; + + /* Initiate new receive */ + status = ptrUSART->Receive(&UART_StdInBuf.data[0], UART_StdInBuf.size); + + if (status != ARM_DRIVER_OK) { + /* Set error flag */ + UART_StdInBuf.flags |= UART_FLAG_RX_ERROR; + } + } +#endif +} + +/* + Initialize stdio +*/ +__WEAK +int stdio_init (void) { + return stdio_cmsis_uart_init(); +} + +/** + Initialize stdio retarget to CMSIS-Driver UART + + \return 0 on success, or -1 on error. +*/ +int stdio_cmsis_uart_init (void) { + int rval; + + if (Initialized != 0U) { + /* Already initialized */ + return 0; + } + + if (ptrUSART->Initialize(UART_Event_Callback) != ARM_DRIVER_OK) { + /* CMSIS-Driver USART initialize failed */ + rval = -1; + } + else if (ptrUSART->PowerControl(ARM_POWER_FULL) != ARM_DRIVER_OK) { + /* CMSIS-Driver USART power full failed */ + rval = -2; + } + else if (ptrUSART->Control(ARM_USART_MODE_ASYNCHRONOUS | + ARM_USART_DATA_BITS_8 | + ARM_USART_PARITY_NONE | + ARM_USART_STOP_BITS_1 | + ARM_USART_FLOW_CONTROL_NONE, + STDIO_UART_BAUDRATE) != ARM_DRIVER_OK) { + /* CMSIS-Driver USART mode configuration failed */ + rval = -3; + } +#if defined(RTE_CMSIS_Compiler_STDERR_UART_CMSIS) || defined(RTE_CMSIS_Compiler_STDOUT_UART_CMSIS) + else if (ptrUSART->Control(ARM_USART_CONTROL_TX, 1U) != ARM_DRIVER_OK) { + /* CMSIS-Driver USART transmitter enable failed */ + rval = -4; + } +#endif +#if defined(RTE_CMSIS_Compiler_STDIN_UART_CMSIS) + else if (ptrUSART->Control(ARM_USART_CONTROL_RX, 1U) != ARM_DRIVER_OK) { + /* CMSIS-Driver USART receiver enable failed */ + rval = -5; + } + else if (ptrUSART->Receive(&UART_StdInBuf.data[0], UART_StdInBuf.size) != ARM_DRIVER_OK) { + /* CMSIS-Driver USART receive operation failed */ + rval = -6; + } +#endif + else { + /* CMSIS-Driver USART setup completed successfully */ + rval = 0; + + /* Set global initialized flag */ + Initialized = 1U; + } + + return rval; +} + +#if defined(RTE_CMSIS_Compiler_STDERR_UART_CMSIS) +/** + Put a character to the stderr + + \param[in] ch Character to output + \return The character written, or -1 on write error. +*/ +int stderr_putchar (int ch) { + int32_t status; + + if (Initialized == 0U) { + /* Initialize stdio if not already initialized */ + if (stdio_cmsis_uart_init() != 0) { + return -1; + } + } + + /* Write character at current index */ + UART_StdErrBuf.data[UART_StdErrBuf.idx] = (uint8_t)ch; + + /* Increment number of characters written */ + UART_StdErrBuf.idx++; + + /* Send when the buffer is full or on newline character */ + if ((UART_StdErrBuf.idx == UART_StdErrBuf.size) || (ch == '\n')) { + /* Send buffered characters */ + status = ptrUSART->Send(&UART_StdErrBuf.data[0], UART_StdErrBuf.idx); + + if (status != ARM_DRIVER_OK) { + /* Set error flag */ + UART_StdErrBuf.flags |= UART_FLAG_TX_ERROR; + } + + /* Wait for send to complete */ + while (ptrUSART->GetStatus().tx_busy != 0U); + + /* Reset transmit index */ + UART_StdErrBuf.idx = 0U; + } + + return ch; +} +#endif + +#if defined(RTE_CMSIS_Compiler_STDIN_UART_CMSIS) +/** + Get a character from the stdio + + \return The next character from the input, or -1 on read error. +*/ +int stdin_getchar (void) { + uint32_t rx_num; + uint32_t rx_cnt; + uint32_t rx_idx; + int ch = -1; + + if (Initialized == 0U) { + /* Initialize stdio if not already initialized */ + if (stdio_cmsis_uart_init() != 0) { + return -1; + } + } + + while (ch == -1) { + /* Get the number of received characters since last Receive operation */ + rx_num = ptrUSART->GetRxCount(); + + /* Determine total number of received characters */ + rx_cnt = UART_StdInBuf.cnt + rx_num; + + if (UART_StdInBuf.idx < rx_cnt) { + /* There are characters available to read */ + rx_idx = UART_StdInBuf.idx % UART_StdInBuf.size; + /* Read character at current index */ + ch = UART_StdInBuf.data[rx_idx]; + + /* Increment number of characters read */ + UART_StdInBuf.idx++; + } + } + + return ch; +} +#endif + +#if defined(RTE_CMSIS_Compiler_STDOUT_UART_CMSIS) +/** + Put a character to the stdout + + \param[in] ch Character to output + \return The character written, or -1 on write error. +*/ +int stdout_putchar (int ch) { + int32_t status; + + if (Initialized == 0U) { + /* Initialize stdio if not already initialized */ + if (stdio_cmsis_uart_init() != 0) { + return -1; + } + } + + /* Write character at current index */ + UART_StdOutBuf.data[UART_StdOutBuf.idx] = (uint8_t)ch; + + /* Increment number of characters written */ + UART_StdOutBuf.idx++; + + /* Send when the buffer is full or on newline character */ + if ((UART_StdOutBuf.idx == UART_StdOutBuf.size) || (ch == '\n')) { + /* Send buffered characters */ + status = ptrUSART->Send(&UART_StdOutBuf.data[0], UART_StdOutBuf.idx); + + if (status != ARM_DRIVER_OK) { + /* Set error flag */ + UART_StdOutBuf.flags |= UART_FLAG_TX_ERROR; + } + + /* Wait for send to complete */ + while (ptrUSART->GetStatus().tx_busy != 0U); + + /* Reset transmit index */ + UART_StdOutBuf.idx = 0U; + } + + return ch; +} +#endif