1*5c591343SA. Cody Schuffelen /*
2*5c591343SA. Cody Schuffelen ******************************************************************************
3*5c591343SA. Cody Schuffelen File: syscalls.c
4*5c591343SA. Cody Schuffelen Info: Generated by Atollic TrueSTUDIO(R) 8.0.0 2017-10-17
5*5c591343SA. Cody Schuffelen
6*5c591343SA. Cody Schuffelen The MIT License (MIT)
7*5c591343SA. Cody Schuffelen Copyright (c) 2009-2017 Atollic AB
8*5c591343SA. Cody Schuffelen
9*5c591343SA. Cody Schuffelen Permission is hereby granted, free of charge, to any person obtaining a copy
10*5c591343SA. Cody Schuffelen of this software and associated documentation files (the "Software"), to deal
11*5c591343SA. Cody Schuffelen in the Software without restriction, including without limitation the rights
12*5c591343SA. Cody Schuffelen to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
13*5c591343SA. Cody Schuffelen copies of the Software, and to permit persons to whom the Software is
14*5c591343SA. Cody Schuffelen furnished to do so, subject to the following conditions:
15*5c591343SA. Cody Schuffelen
16*5c591343SA. Cody Schuffelen The above copyright notice and this permission notice shall be included in all
17*5c591343SA. Cody Schuffelen copies or substantial portions of the Software.
18*5c591343SA. Cody Schuffelen
19*5c591343SA. Cody Schuffelen THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20*5c591343SA. Cody Schuffelen IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21*5c591343SA. Cody Schuffelen FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
22*5c591343SA. Cody Schuffelen AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23*5c591343SA. Cody Schuffelen LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
24*5c591343SA. Cody Schuffelen OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
25*5c591343SA. Cody Schuffelen SOFTWARE.
26*5c591343SA. Cody Schuffelen
27*5c591343SA. Cody Schuffelen ******************************************************************************
28*5c591343SA. Cody Schuffelen */
29*5c591343SA. Cody Schuffelen
30*5c591343SA. Cody Schuffelen /* Includes */
31*5c591343SA. Cody Schuffelen #include <stdint.h>
32*5c591343SA. Cody Schuffelen #include <string.h>
33*5c591343SA. Cody Schuffelen #include <sys/stat.h>
34*5c591343SA. Cody Schuffelen #include <stdlib.h>
35*5c591343SA. Cody Schuffelen #include <errno.h>
36*5c591343SA. Cody Schuffelen #include <stdio.h>
37*5c591343SA. Cody Schuffelen #include <signal.h>
38*5c591343SA. Cody Schuffelen #include <time.h>
39*5c591343SA. Cody Schuffelen #include <sys/time.h>
40*5c591343SA. Cody Schuffelen #include <sys/times.h>
41*5c591343SA. Cody Schuffelen #include "stm32l4xx_hal.h"
42*5c591343SA. Cody Schuffelen #include "StmUtil.h"
43*5c591343SA. Cody Schuffelen
44*5c591343SA. Cody Schuffelen extern RTC_HandleTypeDef hrtc;
45*5c591343SA. Cody Schuffelen extern UART_HandleTypeDef huart2;
46*5c591343SA. Cody Schuffelen
47*5c591343SA. Cody Schuffelen /* Variables */
48*5c591343SA. Cody Schuffelen #undef errno
49*5c591343SA. Cody Schuffelen extern int32_t errno;
50*5c591343SA. Cody Schuffelen
51*5c591343SA. Cody Schuffelen uint8_t *__env[1] = { 0 };
52*5c591343SA. Cody Schuffelen uint8_t **environ = __env;
53*5c591343SA. Cody Schuffelen
54*5c591343SA. Cody Schuffelen /* Functions */
initialise_monitor_handles()55*5c591343SA. Cody Schuffelen void initialise_monitor_handles()
56*5c591343SA. Cody Schuffelen {
57*5c591343SA. Cody Schuffelen }
58*5c591343SA. Cody Schuffelen
_getpid(void)59*5c591343SA. Cody Schuffelen int _getpid(void)
60*5c591343SA. Cody Schuffelen {
61*5c591343SA. Cody Schuffelen errno = ENOSYS;
62*5c591343SA. Cody Schuffelen return -1;
63*5c591343SA. Cody Schuffelen }
64*5c591343SA. Cody Schuffelen
_gettimeofday(struct timeval * ptimeval,void * ptimezone)65*5c591343SA. Cody Schuffelen int _gettimeofday(struct timeval *ptimeval, void *ptimezone)
66*5c591343SA. Cody Schuffelen {
67*5c591343SA. Cody Schuffelen if(ptimezone)
68*5c591343SA. Cody Schuffelen {
69*5c591343SA. Cody Schuffelen struct timezone* tz = ptimezone;
70*5c591343SA. Cody Schuffelen tz->tz_minuteswest = _timezone / 60;
71*5c591343SA. Cody Schuffelen tz->tz_dsttime = _daylight;
72*5c591343SA. Cody Schuffelen }
73*5c591343SA. Cody Schuffelen
74*5c591343SA. Cody Schuffelen if(ptimeval)
75*5c591343SA. Cody Schuffelen {
76*5c591343SA. Cody Schuffelen RTC_TimeTypeDef time = {0};
77*5c591343SA. Cody Schuffelen RTC_DateTypeDef date = {0};
78*5c591343SA. Cody Schuffelen
79*5c591343SA. Cody Schuffelen if((HAL_RTC_GetTime(&hrtc, &time, RTC_FORMAT_BIN) != HAL_OK) ||
80*5c591343SA. Cody Schuffelen (HAL_RTC_GetDate(&hrtc, &date, RTC_FORMAT_BIN) != HAL_OK))
81*5c591343SA. Cody Schuffelen {
82*5c591343SA. Cody Schuffelen errno = ENOSYS;
83*5c591343SA. Cody Schuffelen return -1;
84*5c591343SA. Cody Schuffelen }
85*5c591343SA. Cody Schuffelen
86*5c591343SA. Cody Schuffelen struct tm local = {0};
87*5c591343SA. Cody Schuffelen local.tm_year = date.Year + 100;
88*5c591343SA. Cody Schuffelen local.tm_mon = date.Month - 1;
89*5c591343SA. Cody Schuffelen local.tm_mday = date.Date;
90*5c591343SA. Cody Schuffelen local.tm_wday = date.WeekDay - 1;
91*5c591343SA. Cody Schuffelen local.tm_hour = time.Hours;
92*5c591343SA. Cody Schuffelen local.tm_min = time.Minutes;
93*5c591343SA. Cody Schuffelen local.tm_sec = time.Seconds;
94*5c591343SA. Cody Schuffelen ptimeval->tv_sec = mktime(&local);
95*5c591343SA. Cody Schuffelen ptimeval->tv_usec = (time.SecondFraction * 1000 * 1000 / time.SubSeconds);
96*5c591343SA. Cody Schuffelen }
97*5c591343SA. Cody Schuffelen
98*5c591343SA. Cody Schuffelen return 0;
99*5c591343SA. Cody Schuffelen }
100*5c591343SA. Cody Schuffelen
_kill(int32_t pid,int32_t sig)101*5c591343SA. Cody Schuffelen int _kill(int32_t pid, int32_t sig)
102*5c591343SA. Cody Schuffelen {
103*5c591343SA. Cody Schuffelen errno = ENOSYS;
104*5c591343SA. Cody Schuffelen return -1;
105*5c591343SA. Cody Schuffelen }
106*5c591343SA. Cody Schuffelen
_exit(int32_t status)107*5c591343SA. Cody Schuffelen void _exit(int32_t status)
108*5c591343SA. Cody Schuffelen {
109*5c591343SA. Cody Schuffelen while (1) {} /* Make sure we hang here */
110*5c591343SA. Cody Schuffelen }
111*5c591343SA. Cody Schuffelen
_write(int32_t file,uint8_t * ptr,int32_t len)112*5c591343SA. Cody Schuffelen int _write(int32_t file, uint8_t *ptr, int32_t len)
113*5c591343SA. Cody Schuffelen {
114*5c591343SA. Cody Schuffelen #ifndef NDEBUG
115*5c591343SA. Cody Schuffelen if (file == 1) //STDOUT
116*5c591343SA. Cody Schuffelen {
117*5c591343SA. Cody Schuffelen HAL_UART_Transmit(&huart2, ptr, len, HAL_MAX_DELAY);
118*5c591343SA. Cody Schuffelen }
119*5c591343SA. Cody Schuffelen else if (file == 2) //STDERR
120*5c591343SA. Cody Schuffelen {
121*5c591343SA. Cody Schuffelen for(uint32_t n = 0; n < len; n++)
122*5c591343SA. Cody Schuffelen {
123*5c591343SA. Cody Schuffelen ITM_SendChar(ptr[n]);
124*5c591343SA. Cody Schuffelen }
125*5c591343SA. Cody Schuffelen return len;
126*5c591343SA. Cody Schuffelen }
127*5c591343SA. Cody Schuffelen else if ((file >= ITMFILENO) && (file < ITMFILENO + ITMCHANNELNO))
128*5c591343SA. Cody Schuffelen {
129*5c591343SA. Cody Schuffelen for(uint32_t n = 0; n < len; n++)
130*5c591343SA. Cody Schuffelen {
131*5c591343SA. Cody Schuffelen ITM_Out(file - ITMFILENO, ptr[n]);
132*5c591343SA. Cody Schuffelen }
133*5c591343SA. Cody Schuffelen return len;
134*5c591343SA. Cody Schuffelen }
135*5c591343SA. Cody Schuffelen #endif
136*5c591343SA. Cody Schuffelen errno = ENOSYS;
137*5c591343SA. Cody Schuffelen return -1;
138*5c591343SA. Cody Schuffelen }
139*5c591343SA. Cody Schuffelen
_sbrk(int32_t incr)140*5c591343SA. Cody Schuffelen void * _sbrk(int32_t incr)
141*5c591343SA. Cody Schuffelen {
142*5c591343SA. Cody Schuffelen extern char end; /* Set by linker. */
143*5c591343SA. Cody Schuffelen static char * heap_end;
144*5c591343SA. Cody Schuffelen char * prev_heap_end;
145*5c591343SA. Cody Schuffelen
146*5c591343SA. Cody Schuffelen if (heap_end == 0) {
147*5c591343SA. Cody Schuffelen heap_end = & end;
148*5c591343SA. Cody Schuffelen }
149*5c591343SA. Cody Schuffelen
150*5c591343SA. Cody Schuffelen prev_heap_end = heap_end;
151*5c591343SA. Cody Schuffelen heap_end += incr;
152*5c591343SA. Cody Schuffelen
153*5c591343SA. Cody Schuffelen return (void *) prev_heap_end;
154*5c591343SA. Cody Schuffelen }
155*5c591343SA. Cody Schuffelen
_close(int32_t file)156*5c591343SA. Cody Schuffelen int _close(int32_t file)
157*5c591343SA. Cody Schuffelen {
158*5c591343SA. Cody Schuffelen if ((file >= ITMFILENO) && (file < ITMFILENO + ITMCHANNELNO))
159*5c591343SA. Cody Schuffelen {
160*5c591343SA. Cody Schuffelen return 0;
161*5c591343SA. Cody Schuffelen }
162*5c591343SA. Cody Schuffelen errno = ENOSYS;
163*5c591343SA. Cody Schuffelen return -1;
164*5c591343SA. Cody Schuffelen }
165*5c591343SA. Cody Schuffelen
166*5c591343SA. Cody Schuffelen
_fstat(int32_t file,struct stat * st)167*5c591343SA. Cody Schuffelen int _fstat(int32_t file, struct stat *st)
168*5c591343SA. Cody Schuffelen {
169*5c591343SA. Cody Schuffelen if ((file >= ITMFILENO) && (file < ITMFILENO + ITMCHANNELNO))
170*5c591343SA. Cody Schuffelen {
171*5c591343SA. Cody Schuffelen st->st_mode = S_IFCHR;
172*5c591343SA. Cody Schuffelen st->st_size = 0;
173*5c591343SA. Cody Schuffelen return 0;
174*5c591343SA. Cody Schuffelen }
175*5c591343SA. Cody Schuffelen errno = ENOSYS;
176*5c591343SA. Cody Schuffelen return -1;
177*5c591343SA. Cody Schuffelen }
178*5c591343SA. Cody Schuffelen
_isatty(int32_t file)179*5c591343SA. Cody Schuffelen int _isatty(int32_t file)
180*5c591343SA. Cody Schuffelen {
181*5c591343SA. Cody Schuffelen if ((file >= ITMFILENO) && (file < ITMFILENO + ITMCHANNELNO))
182*5c591343SA. Cody Schuffelen {
183*5c591343SA. Cody Schuffelen return 1;
184*5c591343SA. Cody Schuffelen }
185*5c591343SA. Cody Schuffelen errno = ENOSYS;
186*5c591343SA. Cody Schuffelen return 0;
187*5c591343SA. Cody Schuffelen }
188*5c591343SA. Cody Schuffelen
_lseek(int32_t file,int32_t ptr,int32_t dir)189*5c591343SA. Cody Schuffelen int _lseek(int32_t file, int32_t ptr, int32_t dir)
190*5c591343SA. Cody Schuffelen {
191*5c591343SA. Cody Schuffelen if ((file >= ITMFILENO) && (file < ITMFILENO + ITMCHANNELNO))
192*5c591343SA. Cody Schuffelen {
193*5c591343SA. Cody Schuffelen return 0;
194*5c591343SA. Cody Schuffelen }
195*5c591343SA. Cody Schuffelen errno = ENOSYS;
196*5c591343SA. Cody Schuffelen return -1;
197*5c591343SA. Cody Schuffelen }
198*5c591343SA. Cody Schuffelen
_read(int32_t file,uint8_t * ptr,int32_t len)199*5c591343SA. Cody Schuffelen int _read(int32_t file, uint8_t *ptr, int32_t len)
200*5c591343SA. Cody Schuffelen {
201*5c591343SA. Cody Schuffelen errno = ENOSYS;
202*5c591343SA. Cody Schuffelen return -1;
203*5c591343SA. Cody Schuffelen }
204*5c591343SA. Cody Schuffelen
_readlink(const char * path,char * buf,size_t bufsize)205*5c591343SA. Cody Schuffelen int _readlink(const char *path, char *buf, size_t bufsize)
206*5c591343SA. Cody Schuffelen {
207*5c591343SA. Cody Schuffelen errno = ENOSYS;
208*5c591343SA. Cody Schuffelen return -1;
209*5c591343SA. Cody Schuffelen }
210*5c591343SA. Cody Schuffelen
_open(const uint8_t * path,int32_t flags,int32_t mode)211*5c591343SA. Cody Schuffelen int _open(const uint8_t *path, int32_t flags, int32_t mode)
212*5c591343SA. Cody Schuffelen {
213*5c591343SA. Cody Schuffelen unsigned int channel = 0;
214*5c591343SA. Cody Schuffelen if((strlen((char*)path) == 7 ) &&
215*5c591343SA. Cody Schuffelen !strncmp((char*)path, "ITM[", 4) &&
216*5c591343SA. Cody Schuffelen !strcmp((char*)&path[6], "]") &&
217*5c591343SA. Cody Schuffelen (sscanf((char*)&path[4],"%02u", &channel) == 1) &&
218*5c591343SA. Cody Schuffelen (channel < ITMCHANNELNO) &&
219*5c591343SA. Cody Schuffelen ((flags == 0x601) || (flags == 0x10601)))
220*5c591343SA. Cody Schuffelen {
221*5c591343SA. Cody Schuffelen return ITMFILENO + channel;
222*5c591343SA. Cody Schuffelen }
223*5c591343SA. Cody Schuffelen errno = ENOSYS;
224*5c591343SA. Cody Schuffelen return -1;
225*5c591343SA. Cody Schuffelen }
226*5c591343SA. Cody Schuffelen
_wait(int32_t * status)227*5c591343SA. Cody Schuffelen int _wait(int32_t *status)
228*5c591343SA. Cody Schuffelen {
229*5c591343SA. Cody Schuffelen errno = ENOSYS;
230*5c591343SA. Cody Schuffelen return -1;
231*5c591343SA. Cody Schuffelen }
232*5c591343SA. Cody Schuffelen
_unlink(const uint8_t * name)233*5c591343SA. Cody Schuffelen int _unlink(const uint8_t *name)
234*5c591343SA. Cody Schuffelen {
235*5c591343SA. Cody Schuffelen errno = ENOSYS;
236*5c591343SA. Cody Schuffelen return -1;
237*5c591343SA. Cody Schuffelen }
238*5c591343SA. Cody Schuffelen
_times(struct tms * buf)239*5c591343SA. Cody Schuffelen int _times(struct tms *buf)
240*5c591343SA. Cody Schuffelen {
241*5c591343SA. Cody Schuffelen RTC_TimeTypeDef time = {0};
242*5c591343SA. Cody Schuffelen RTC_DateTypeDef date = {0};
243*5c591343SA. Cody Schuffelen
244*5c591343SA. Cody Schuffelen if((HAL_RTC_GetTime(&hrtc, &time, RTC_FORMAT_BIN) != HAL_OK) ||
245*5c591343SA. Cody Schuffelen (HAL_RTC_GetDate(&hrtc, &date, RTC_FORMAT_BIN) != HAL_OK))
246*5c591343SA. Cody Schuffelen {
247*5c591343SA. Cody Schuffelen errno = ENOSYS;
248*5c591343SA. Cody Schuffelen return -1;
249*5c591343SA. Cody Schuffelen }
250*5c591343SA. Cody Schuffelen
251*5c591343SA. Cody Schuffelen struct tm local = {0};
252*5c591343SA. Cody Schuffelen local.tm_year = date.Year + 100;
253*5c591343SA. Cody Schuffelen local.tm_mon = date.Month - 1;
254*5c591343SA. Cody Schuffelen local.tm_mday = date.Date;
255*5c591343SA. Cody Schuffelen local.tm_wday = date.WeekDay - 1;
256*5c591343SA. Cody Schuffelen local.tm_hour = time.Hours;
257*5c591343SA. Cody Schuffelen local.tm_min = time.Minutes;
258*5c591343SA. Cody Schuffelen local.tm_sec = time.Seconds;
259*5c591343SA. Cody Schuffelen
260*5c591343SA. Cody Schuffelen buf->tms_utime = mktime(&local); /* user time */
261*5c591343SA. Cody Schuffelen buf->tms_stime = 0; /* system time */
262*5c591343SA. Cody Schuffelen buf->tms_cutime = 0; /* user time, children */
263*5c591343SA. Cody Schuffelen buf->tms_cstime = 0; /* system time, children */
264*5c591343SA. Cody Schuffelen return 0;
265*5c591343SA. Cody Schuffelen }
266*5c591343SA. Cody Schuffelen
_stat(const uint8_t * file,struct stat * st)267*5c591343SA. Cody Schuffelen int _stat(const uint8_t *file, struct stat *st)
268*5c591343SA. Cody Schuffelen {
269*5c591343SA. Cody Schuffelen errno = ENOSYS;
270*5c591343SA. Cody Schuffelen return -1;
271*5c591343SA. Cody Schuffelen }
272*5c591343SA. Cody Schuffelen
_symlink(const char * path1,const char * path2)273*5c591343SA. Cody Schuffelen int _symlink(const char *path1, const char *path2)
274*5c591343SA. Cody Schuffelen {
275*5c591343SA. Cody Schuffelen errno = ENOSYS;
276*5c591343SA. Cody Schuffelen return -1;
277*5c591343SA. Cody Schuffelen }
278*5c591343SA. Cody Schuffelen
_link(const uint8_t * old,const uint8_t * new)279*5c591343SA. Cody Schuffelen int _link(const uint8_t *old, const uint8_t *new)
280*5c591343SA. Cody Schuffelen {
281*5c591343SA. Cody Schuffelen errno = ENOSYS;
282*5c591343SA. Cody Schuffelen return -1;
283*5c591343SA. Cody Schuffelen }
284*5c591343SA. Cody Schuffelen
_fork(void)285*5c591343SA. Cody Schuffelen int _fork(void)
286*5c591343SA. Cody Schuffelen {
287*5c591343SA. Cody Schuffelen errno = ENOSYS;
288*5c591343SA. Cody Schuffelen return -1;
289*5c591343SA. Cody Schuffelen }
290*5c591343SA. Cody Schuffelen
_execve(const uint8_t * name,uint8_t * const * argv,uint8_t * const * env)291*5c591343SA. Cody Schuffelen int _execve(const uint8_t *name, uint8_t * const *argv, uint8_t * const *env)
292*5c591343SA. Cody Schuffelen {
293*5c591343SA. Cody Schuffelen errno = ENOSYS;
294*5c591343SA. Cody Schuffelen return -1;
295*5c591343SA. Cody Schuffelen }
296*5c591343SA. Cody Schuffelen
297