blob: cf31a531e3943f01f068432b9675775c094da133 [file] [log] [blame]
/*
* 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) */