diff options
Diffstat (limited to 'source/application/hal/platforms/bare-metal/bsp/bsp-core/retarget.c')
-rw-r--r-- | source/application/hal/platforms/bare-metal/bsp/bsp-core/retarget.c | 235 |
1 files changed, 235 insertions, 0 deletions
diff --git a/source/application/hal/platforms/bare-metal/bsp/bsp-core/retarget.c b/source/application/hal/platforms/bare-metal/bsp/bsp-core/retarget.c new file mode 100644 index 0000000..cf31a53 --- /dev/null +++ b/source/application/hal/platforms/bare-metal/bsp/bsp-core/retarget.c @@ -0,0 +1,235 @@ +/* + * Copyright (c) 2021 Arm Limited. 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 + * + * http://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. + */ +#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + +#include "uart_stdout.h" +#include "bsp_core_log.h" + +#if defined (MPS3_PLATFORM) +#include "smm_mps3.h" +#endif /* MPS3_PLATFORM */ + +#include <stdio.h> +#include <string.h> +#include <time.h> +#include <rt_misc.h> +#include <rt_sys.h> + + +/* Standard IO device handles. */ +#define STDIN 0x8001 +#define STDOUT 0x8002 +#define STDERR 0x8003 + +/* Standard IO device name defines. */ +const char __stdin_name[] = "STDIN"; +const char __stdout_name[] = "STDOUT"; +const char __stderr_name[] = "STDERR"; + +int fputc(int ch, FILE *f) +{ + UNUSED(f); + return (UartPutc(ch)); +} + +int fgetc(FILE *f) +{ + UNUSED(f); + return (UartPutc(UartGetc())); +} + +int ferror(FILE *f) +{ + UNUSED(f); + /* Your implementation of ferror */ + return EOF; +} + +void _ttywrch(int ch) +{ + UartPutc(ch); +} + +FILEHANDLE _sys_open(const char *name, int openmode) +{ + UNUSED(openmode); + + /* Register standard Input Output devices. */ + if (strcmp(name, "STDIN") == 0) + { + return (STDIN); + } + if (strcmp(name, "STDOUT") == 0) + { + return (STDOUT); + } + if (strcmp(name, "STDERR") == 0) + { + return (STDERR); + } + return (-1); +} + +int _sys_close(FILEHANDLE fh) +{ + if (fh > 0x8000) + { + return (0); + } + return (-1); +} + +int _sys_write(FILEHANDLE fh, const unsigned char *buf, unsigned int len, int mode) +{ + UNUSED(mode); + if (fh == STDOUT || fh == STDERR ) + { + /* Standard Output device. */ + for (; len; len--) + { + UartPutc(*buf++); + } + return (0); + } + + if (fh > 0x8000) + { + return (-1); + } + return (-1); +} + +int _sys_read(FILEHANDLE fh, unsigned char *buf, unsigned int len, int mode) +{ + UNUSED(mode); + if (fh == STDIN) + { + /* Standard Input device. */ + for (; len; len--) + { + *buf++ = UartGetc(); + } + return (0); + } + + if (fh > 0x8000) + { + return (-1); + } + return (-1); +} + +int _sys_istty(FILEHANDLE fh) +{ + if (fh > 0x8000) + { + return (1); + } + return (0); +} + +int _sys_seek(FILEHANDLE fh, long pos) +{ + UNUSED(pos); + if (fh > 0x8000) + { + return (-1); + } + return (-1); +} + +int _sys_ensure(FILEHANDLE fh) +{ + if (fh > 0x8000) + { + return (-1); + } + return (-1); +} + +long _sys_flen(FILEHANDLE fh) +{ + if (fh > 0x8000) + { + return (0); + } + return (-1); +} + +int _sys_tmpnam(char *name, int sig, unsigned maxlen) +{ + UNUSED(name); + UNUSED(sig); + UNUSED(maxlen); + return (1); +} + +char *_sys_command_string(char *cmd, int len) +{ + UNUSED(len); + return (cmd); +} + +void _sys_exit(int return_code) +{ + UartEndSimulation(return_code); +} + +int system(const char *cmd) +{ + UNUSED(cmd); + return (0); +} + +time_t time(time_t *timer) +{ + time_t current; + +#if defined (MPS3_PLATFORM) + current = MPS3_FPGAIO->COUNTER; +#else /* MPS3_PLATFORM */ + current = 0; /* No RTC implementation available. */ +#endif /* MPS3_PLATFORM */ + + if (timer != NULL) { + *timer = current; + } + + return (current); +} + +#else /* #if defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) */ + +/******************************************************************************/ +/* Retarget functions for GNU Tools for ARM Embedded Processors */ +/******************************************************************************/ +#include <stdio.h> +#include <sys/stat.h> + +extern unsigned char UartPutc(unsigned char my_ch); + +__attribute__((used)) int _write(int fd, char *ptr, int len) +{ + size_t i; + for (i = 0; i < len; i++) + { + UartPutc(ptr[i]); /* call character output function. */ + } + return len; +} + +#endif /* #if defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) */ |