1 /* -------------------------------- Arctic Core ------------------------------
2 * Arctic Core - the open source AUTOSAR platform http://arccore.com
4 * Copyright (C) 2009 ArcCore AB <contact@arccore.com>
6 * This source code is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU General Public License version 2 as published by the
8 * Free Software Foundation; See <http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt>.
10 * This program is distributed in the hope that it will be useful, but
11 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
12 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * -------------------------------- Arctic Core ------------------------------*/
18 #include <sys/types.h>
23 #include "Std_Types.h"
26 #if defined(CFG_ARM_CM3)
27 #include "irq_types.h"
36 #define getpid _getpid
39 #define isatty _isatty
46 // Operation on Winidea terminal buffer
49 #define TWBUFF_SIZE 0x100
50 #define TRBUFF_SIZE 0x100
55 #define TWBUFF_LEN (TWBUFF_SIZE+TBUFF_PTR)
56 #define TRBUFF_LEN (TRBUFF_SIZE+TBUFF_PTR)
57 #define TWBUFF_TPTR (g_TWBuffer[TWBUFF_SIZE+0])
58 #define TWBUFF_CPTR (g_TWBuffer[TWBUFF_SIZE+1])
59 #define TWBUFF_INC(n) ((n + 1)&(TWBUFF_SIZE-1))
60 #define TWBUFF_FULL() (TWBUFF_TPTR==((TWBUFF_CPTR-1)&(TWBUFF_SIZE-1)))
62 #ifdef USE_WINIDEA_TERM
64 #if defined(MC912DG128A)
65 static volatile unsigned char g_TWBuffer[TWBUFF_LEN];
66 static volatile unsigned char g_TRBuffer[TRBUFF_LEN];
67 static volatile char g_TConn __attribute__ ((section (".winidea_port")));
70 static volatile unsigned char g_TWBuffer[TWBUFF_LEN] __attribute__ ((aligned (0x100))); // Transmit to WinIDEA terminal
71 static volatile unsigned char g_TRBuffer[TRBUFF_LEN] __attribute__ ((aligned (0x100)));
72 static volatile char g_TConn __attribute__ ((section (".winidea_port")));
84 // This must be in un-cached space....
86 static volatile char t32_outport __attribute__ ((section (".t32_outport")));
88 void t32_writebyte(char c)
90 /* T32 can hang here for several reasons;
91 * - term.view e:address.offset(v.address(t32_outport)) e:0
94 while (t32_outport != 0 ) ; /* wait until port is free */
95 t32_outport = c; /* send character */
103 int close( int fd ) {
108 char *__env[1] = { 0 };
109 char **environ = __env;
116 int execve(char *name, char **argv, char **env){
129 #include <sys/stat.h>
130 int fstat(int file, struct stat *st) {
132 st->st_mode = S_IFCHR;
136 /* Returns 1 if connected to a terminal. T32 can be a terminal
146 int fstat( int fd, struct stat *buf )
148 buf->st_mode = S_IFCHR;
155 /* reposition read/write file offset
156 * We can't seek, return error.*/
157 off_t lseek( int fd, off_t offset,int whence)
167 int open(const char *name, int flags, int mode){
172 #if defined(USE_RAMLOG)
173 if( strcmp(name,"ramlog") == 0 ) {
181 int read( int fd, char *buf, int nbytes )
186 #ifdef USE_WINIDEA_TERM
190 /* Only support write for now, return 0 read */
195 int write( int fd, char *buf, int nbytes)
197 //(void)fd; // Normally 0- ?, 1-stdout, 2-stderr,
201 #ifdef USE_WINIDEA_TERM
204 unsigned char nCnt,nLen;
205 for(nCnt=0; nCnt<nbytes; nCnt++)
207 while(TWBUFF_FULL());
209 g_TWBuffer[nLen]=buf[nCnt];
210 nLen=TWBUFF_INC(nLen);
217 for (int i = 0; i < nbytes; i++) {
218 if (*(buf + i) == '\n') {
219 t32_writebyte ('\r');
220 // t32_writebyte ('\n');
222 t32_writebyte (*(buf + i));
225 #ifdef USE_ARM_ITM_TERM
226 for (int i = 0; i < nbytes; i++) {
227 ITM_SendChar(*(buf + i));
234 #if defined(USE_RAMLOG)
236 if(fd == FILE_RAMLOG) {
237 for (int i = 0; i < nbytes; i++) {
238 ramlog_chr (*(buf + i));
247 int arc_putchar(int c) {
254 /* If we use malloc and it runs out of memory it calls sbrk()
260 //static char *curbrk = _end;
263 #define HEAPSIZE 16000
267 * The heap sadly have alignment that depends on the pagesize that
268 * you compile malloc newlib with. From what I can tell from the
269 * code that is a pagesize of 4096.
272 unsigned char _heap[HEAPSIZE] __attribute__((aligned (4)));
273 //__attribute__((section(".heap")));
275 caddr_t sbrk( int incr )
277 static unsigned char *heap_end;
278 unsigned char *prev_heap_end;
284 prev_heap_end = heap_end;
286 if( heap_end + incr - _heap > HEAPSIZE ) {
287 /* heap overflow - announce on stderr */
288 write( 2, "Heap overflow!\n", 15 );
294 return (caddr_t) prev_heap_end;
299 /* We use our own malloc */
304 int stat( const char *file, struct stat *st ) {
305 //int stat(char *file, struct stat *st) {
307 st->st_mode = S_IFCHR;
319 int kill(int pid, int sig){
327 /* Should not really be here, but .. */
340 void _exit( int status ) {