1 /*******************************************************************************
\r
2 * (c) Copyright 2016-2018 Microsemi SoC Products Group. All rights reserved.
\r
5 * @author Microsemi SoC Products Group
\r
6 * @brief Stubs for system calls.
\r
8 * SVN $Revision: 9661 $
\r
9 * SVN $Date: 2018-01-15 16:13:33 +0530 (Mon, 15 Jan 2018) $
\r
16 #include <sys/stat.h>
\r
17 #include <sys/times.h>
\r
21 #include "encoding.h"
\r
23 #ifdef MSCC_STDIO_THRU_CORE_UART_APB
\r
25 #include "core_uart_apb.h"
\r
26 #include "hw_platform.h"
\r
28 #endif /*MSCC_STDIO_THRU_CORE_UART_APB*/
\r
34 #ifdef MSCC_STDIO_THRU_CORE_UART_APB
\r
36 /*------------------------------------------------------------------------------
\r
37 * CoreUARTapb instance data for the CoreUARTapb instance used for standard
\r
40 static UART_instance_t g_stdio_uart;
\r
42 /*==============================================================================
\r
43 * Flag used to indicate if the UART driver needs to be initialized.
\r
45 static int g_stdio_uart_init_done = 0;
\r
46 #endif /*MSCC_STDIO_THRU_CORE_UART_APB*/
\r
51 char *__env[1] = { 0 };
\r
52 char **environ = __env;
\r
54 void write_hex(int fd, uint32_t hex)
\r
61 write( fd , "0x", 2 );
\r
63 for (ii = 8 ; ii > 0; ii--)
\r
66 digit = ((hex & (0xF << (jj*4))) >> (jj*4));
\r
67 towrite = digit < 0xA ? ('0' + digit) : ('A' + (digit - 0xA));
\r
68 write( fd, &towrite, 1);
\r
73 void _exit(int code)
\r
75 #ifdef MSCC_STDIO_THRU_CORE_UART_APB
\r
76 const char * message = "\nProgam has exited with code:";
\r
78 write(STDERR_FILENO, message, strlen(message));
\r
79 write_hex(STDERR_FILENO, code);
\r
85 void *_sbrk(ptrdiff_t incr)
\r
88 extern char _heap_end[];
\r
89 static char *curbrk = _end;
\r
91 if ((curbrk + incr < _end) || (curbrk + incr > _heap_end))
\r
93 return ((char *) - 1);
\r
97 return curbrk - incr;
\r
100 int _isatty(int fd)
\r
102 if (fd == STDOUT_FILENO || fd == STDERR_FILENO)
\r
111 static int stub(int err)
\r
117 int _open(const char* name, int flags, int mode)
\r
119 return stub(ENOENT);
\r
122 int _openat(int dirfd, const char* name, int flags, int mode)
\r
124 return stub(ENOENT);
\r
129 return stub(EBADF);
\r
132 int _execve(const char* name, char* const argv[], char* const env[])
\r
134 return stub(ENOMEM);
\r
139 return stub(EAGAIN);
\r
142 int _fstat(int fd, struct stat *st)
\r
146 st->st_mode = S_IFCHR;
\r
150 return stub(EBADF);
\r
158 int _kill(int pid, int sig)
\r
160 return stub(EINVAL);
\r
163 int _link(const char *old_name, const char *new_name)
\r
165 return stub(EMLINK);
\r
168 off_t _lseek(int fd, off_t ptr, int dir)
\r
175 return stub(EBADF);
\r
178 ssize_t _read(int fd, void* ptr, size_t len)
\r
180 #ifdef MSCC_STDIO_THRU_CORE_UART_APB
\r
183 /*--------------------------------------------------------------------------
\r
184 * Initialize the UART driver if it is the first time this function is
\r
187 if ( !g_stdio_uart_init_done )
\r
189 /******************************************************************************
\r
191 * This value is calculated using the following equation:
\r
192 * BAUD_VALUE = (CLOCK / (16 * BAUD_RATE)) - 1
\r
193 *****************************************************************************/
\r
194 UART_init( &g_stdio_uart, MSCC_STDIO_UART_BASE_ADDR, ((SYS_CLK_FREQ/(16 * MSCC_STDIO_BAUD_VALUE))-1), (DATA_8_BITS | NO_PARITY));
\r
195 g_stdio_uart_init_done = 1;
\r
198 return UART_get_rx(&g_stdio_uart, (uint8_t*) ptr, len);
\r
202 return stub(EBADF);
\r
205 int _stat(const char* file, struct stat* st)
\r
207 return stub(EACCES);
\r
210 clock_t _times(struct tms* buf)
\r
212 return stub(EACCES);
\r
215 int _unlink(const char* name)
\r
217 return stub(ENOENT);
\r
220 int _wait(int* status)
\r
222 return stub(ECHILD);
\r
225 ssize_t _write(int fd, const void* ptr, size_t len)
\r
228 #ifdef MSCC_STDIO_THRU_CORE_UART_APB
\r
229 const uint8_t * current = (const uint8_t *) ptr;
\r
234 /*--------------------------------------------------------------------------
\r
235 * Initialize the UART driver if it is the first time this function is
\r
238 if ( !g_stdio_uart_init_done )
\r
240 /******************************************************************************
\r
242 * This value is calculated using the following equation:
\r
243 * BAUD_VALUE = (CLOCK / (16 * BAUD_RATE)) - 1
\r
244 *****************************************************************************/
\r
245 UART_init( &g_stdio_uart, MSCC_STDIO_UART_BASE_ADDR, ((SYS_CLK_FREQ/(16 * MSCC_STDIO_BAUD_VALUE))-1), (DATA_8_BITS | NO_PARITY));
\r
246 g_stdio_uart_init_done = 1;
\r
249 for (jj = 0; jj < len; jj++)
\r
251 UART_send(&g_stdio_uart, current + jj, 1);
\r
252 if (current[jj] == '\n')
\r
254 UART_send(&g_stdio_uart, (const uint8_t *)"\r", 1);
\r
261 return stub(EBADF);
\r