/* * 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 #include #include #include #include /* 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 #include 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) */