]> git.sur5r.net Git - freertos/blob
c6d794da1a284c8b1f19322b7f1e236a0382247a
[freertos] /
1 /*******************************************************************************\r
2  * (c) Copyright 2009-2013 Microsemi SoC Products Group.  All rights reserved.\r
3  * \r
4  * Stubs for Newlib system calls.\r
5  *  \r
6  * SVN $Revision: 5269 $\r
7  * SVN $Date: 2013-03-21 20:53:38 +0000 (Thu, 21 Mar 2013) $\r
8  */\r
9 #include <stdlib.h>\r
10 #include <sys/unistd.h>\r
11 #include <sys/stat.h>\r
12 #include <sys/times.h>\r
13 #include <errno.h>\r
14 \r
15 /*==============================================================================\r
16  * Redirection of standard output to a SmartFusion2 MSS UART.\r
17  *------------------------------------------------------------------------------\r
18  * A default implementation for the redirection of the output of printf() to a\r
19  * UART is provided at the bottom of this file. This redirection is enabled by\r
20  * adding the symbol/define MICROSEMI_STDIO_THRU_MMUART0 or\r
21  * MICROSEMI_STDIO_THRU_MMUART0 to your project settings and specifying the baud\r
22  * rate using the MICROSEMI_STDIO_BAUD_RATE define.\r
23  */\r
24 #ifdef MICROSEMI_STDIO_THRU_MMUART0\r
25 #ifndef MICROSEMI_STDIO_THRU_UART\r
26 #define MICROSEMI_STDIO_THRU_UART\r
27 #endif\r
28 #endif  /* MICROSEMI_STDIO_THRU_MMUART0 */\r
29 \r
30 #ifdef MICROSEMI_STDIO_THRU_MMUART1\r
31 #ifndef MICROSEMI_STDIO_THRU_UART\r
32 #define MICROSEMI_STDIO_THRU_UART\r
33 #endif\r
34 #endif  /* MICROSEMI_STDIO_THRU_MMUART1 */\r
35 \r
36 /*\r
37  * Select which MMUART will be used for stdio and what baud rate will be used.\r
38  * Default to 57600 baud if no baud rate is specified using the\r
39  * MICROSEMI_STDIO_BAUD_RATE #define.\r
40  */ \r
41 #ifdef MICROSEMI_STDIO_THRU_UART\r
42 #include "../../drivers/mss_uart/mss_uart.h"\r
43 \r
44 #ifndef MICROSEMI_STDIO_BAUD_RATE\r
45 #define MICROSEMI_STDIO_BAUD_RATE  MSS_UART_57600_BAUD\r
46 #endif\r
47 \r
48 #ifdef MICROSEMI_STDIO_THRU_MMUART0\r
49 static mss_uart_instance_t * const gp_my_uart = &g_mss_uart0;\r
50 #else\r
51 static mss_uart_instance_t * const gp_my_uart = &g_mss_uart1;\r
52 #endif\r
53 \r
54 /*------------------------------------------------------------------------------\r
55  * Global flag used to indicate if the UART driver needs to be initialized.\r
56  */\r
57 static int g_stdio_uart_init_done = 0;\r
58 \r
59 #endif /* MICROSEMI_STDIO_THRU_UART */\r
60 \r
61 /*==============================================================================\r
62  * Environment variables.\r
63  * A pointer to a list of environment variables and their values. For a minimal\r
64  * environment, this empty list is adequate:\r
65  */\r
66 char *__env[1] = { 0 };\r
67 char **environ = __env;\r
68 \r
69 /*==============================================================================\r
70  * Close a file.\r
71  */\r
72 int _close(int file)\r
73 {\r
74     return -1;\r
75 }\r
76 \r
77 /*==============================================================================\r
78  * Transfer control to a new process.\r
79  */\r
80 int _execve(char *name, char **argv, char **env)\r
81 {\r
82     errno = ENOMEM;\r
83     return -1;\r
84 }\r
85 \r
86 /*==============================================================================\r
87  * Exit a program without cleaning up files.\r
88  */\r
89 void _exit( int code )\r
90 {\r
91     /* Should we force a system reset? */\r
92     while( 1 )\r
93     {\r
94         ;\r
95     }\r
96 }\r
97 \r
98 /*==============================================================================\r
99  * Create a new process.\r
100  */\r
101 int _fork(void)\r
102 {\r
103     errno = EAGAIN;\r
104     return -1;\r
105 }\r
106 \r
107 /*==============================================================================\r
108  * Status of an open file.\r
109  */\r
110 int _fstat(int file, struct stat *st)\r
111 {\r
112     st->st_mode = S_IFCHR;\r
113     return 0;\r
114 }\r
115 \r
116 /*==============================================================================\r
117  * Process-ID\r
118  */\r
119 int _getpid(void)\r
120 {\r
121     return 1;\r
122 }\r
123 \r
124 /*==============================================================================\r
125  * Query whether output stream is a terminal.\r
126  */\r
127 int _isatty(int file)\r
128 {\r
129     return 1;\r
130 }\r
131 \r
132 /*==============================================================================\r
133  * Send a signal.\r
134  */\r
135 int _kill(int pid, int sig)\r
136 {\r
137     errno = EINVAL;\r
138     return -1;\r
139 }\r
140 \r
141 /*==============================================================================\r
142  * Establish a new name for an existing file.\r
143  */\r
144 int _link(char *old, char *new)\r
145 {\r
146     errno = EMLINK;\r
147     return -1;\r
148 }\r
149 \r
150 /*==============================================================================\r
151  * Set position in a file.\r
152  */\r
153 int _lseek(int file, int ptr, int dir)\r
154 {\r
155     return 0;\r
156 }\r
157 \r
158 /*==============================================================================\r
159  * Open a file.\r
160  */\r
161 int _open(const char *name, int flags, int mode)\r
162 {\r
163     return -1;\r
164 }\r
165 \r
166 /*==============================================================================\r
167  * Read from a file.\r
168  */\r
169 int _read(int file, char *ptr, int len)\r
170 {\r
171     return 0;\r
172 }\r
173 \r
174 /*==============================================================================\r
175  * Write to a file. libc subroutines will use this system routine for output to\r
176  * all files, including stdout\97so if you need to generate any output, for\r
177  * example to a serial port for debugging, you should make your minimal write\r
178  * capable of doing this.\r
179  */\r
180 int _write_r( void * reent, int file, char * ptr, int len )\r
181 {\r
182 #ifdef MICROSEMI_STDIO_THRU_UART\r
183     /*--------------------------------------------------------------------------\r
184      * Initialize the UART driver if it is the first time this function is\r
185      * called.\r
186      */\r
187     if(!g_stdio_uart_init_done)\r
188     {\r
189         MSS_UART_init(gp_my_uart,\r
190                       MICROSEMI_STDIO_BAUD_RATE,\r
191                       MSS_UART_DATA_8_BITS | MSS_UART_NO_PARITY);\r
192                       \r
193         g_stdio_uart_init_done = 1;\r
194     }\r
195     \r
196     /*--------------------------------------------------------------------------\r
197      * Output text to the UART.\r
198      */\r
199     MSS_UART_polled_tx(gp_my_uart, (uint8_t *)ptr, len);\r
200     \r
201     return len;\r
202 #else   /* MICROSEMI_STDIO_THRU_UART */\r
203     return 0;\r
204 #endif  /* MICROSEMI_STDIO_THRU_UART */\r
205 }\r
206 \r
207 /*==============================================================================\r
208  * Increase program data space. As malloc and related functions depend on this,\r
209  * it is useful to have a working implementation. The following suffices for a\r
210  * standalone system; it exploits the symbol _end automatically defined by the\r
211  * GNU linker. \r
212  */\r
213 caddr_t _sbrk(int incr)\r
214 {\r
215     extern char _end;        /* Defined by the linker */\r
216     static char *heap_end;\r
217     char *prev_heap_end;\r
218     char * stack_ptr;\r
219     \r
220     if (heap_end == 0)\r
221     {\r
222       heap_end = &_end;\r
223     }\r
224     \r
225     prev_heap_end = heap_end;\r
226     asm volatile ("MRS %0, msp" : "=r" (stack_ptr) );\r
227     if (heap_end + incr > stack_ptr)\r
228     {\r
229       _write_r ((void *)0, 1, "Heap and stack collision\n", 25);\r
230       _exit (1);\r
231     }\r
232   \r
233     heap_end += incr;\r
234     return (caddr_t) prev_heap_end;\r
235 }\r
236 \r
237 /*==============================================================================\r
238  * Status of a file (by name).\r
239  */\r
240 int _stat(char *file, struct stat *st)\r
241 {\r
242     st->st_mode = S_IFCHR;\r
243     return 0;\r
244 }\r
245 \r
246 /*==============================================================================\r
247  * Timing information for current process.\r
248  */\r
249 int _times(struct tms *buf)\r
250 {\r
251     return -1;\r
252 }\r
253 \r
254 /*==============================================================================\r
255  * Remove a file's directory entry.\r
256  */\r
257 int _unlink(char *name)\r
258 {\r
259     errno = ENOENT;\r
260     return -1;\r
261 }\r
262 \r
263 /*==============================================================================\r
264  * Wait for a child process.\r
265  */\r
266 int _wait(int *status)\r
267 {\r
268     errno = ECHILD;\r
269     return -1;\r
270 }\r
271 \r
272 \r
273 \r