newlib.c 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. #include <errno.h>
  2. #include <sys/stat.h>
  3. #include <sys/times.h>
  4. #include <sys/unistd.h>
  5. #include <sys/time.h>
  6. #include <stm32f10x.h>
  7. extern uint32_t __get_MSP(void);
  8. #define STDOUT_USART USART1
  9. #define STDERR_USART USART1
  10. #define STDIN_USART USART1
  11. #undef errno
  12. extern int errno;
  13. char *__env[1] = { 0 };
  14. char **environ = __env;
  15. int _write(int file, char *ptr, int len);
  16. void _exit(int status)
  17. {
  18. while (1);
  19. }
  20. int _close(int file)
  21. {
  22. return -1;
  23. }
  24. int _execve(char *name, char **argv, char **env)
  25. {
  26. errno = ENOMEM;
  27. return -1;
  28. }
  29. int _fork()
  30. {
  31. errno = EAGAIN;
  32. return -1;
  33. }
  34. int _fstat(int file, struct stat *st)
  35. {
  36. st->st_mode = S_IFCHR;
  37. return 0;
  38. }
  39. int _getpid()
  40. {
  41. return 1;
  42. }
  43. int _gettimeofday(struct timeval *tv, struct timezone *tz)
  44. {
  45. tv->tv_sec = RTC_GetCounter();
  46. tv->tv_usec = 0;
  47. return 0;
  48. }
  49. int _isatty(int file)
  50. {
  51. switch (file)
  52. {
  53. case STDOUT_FILENO:
  54. case STDERR_FILENO:
  55. case STDIN_FILENO:
  56. return 1;
  57. default:
  58. //errno = ENOTTY;
  59. errno = EBADF;
  60. return 0;
  61. }
  62. }
  63. int _kill(int pid, int sig)
  64. {
  65. errno = EINVAL;
  66. return (-1);
  67. }
  68. int _link(char *old, char *new)
  69. {
  70. errno = EMLINK;
  71. return -1;
  72. }
  73. int _lseek(int file, int ptr, int dir)
  74. {
  75. return 0;
  76. }
  77. caddr_t _sbrk(int incr)
  78. {
  79. extern char _ebss;
  80. static char *heap_end;
  81. char *prev_heap_end;
  82. if (heap_end == 0)
  83. {
  84. heap_end = &_ebss;
  85. }
  86. prev_heap_end = heap_end;
  87. char * stack = (char*) __get_MSP();
  88. if (heap_end + incr > stack)
  89. {
  90. _write(STDERR_FILENO, "Heap and stack collision\n", 25);
  91. errno = ENOMEM;
  92. return (caddr_t) - 1;
  93. //abort ();
  94. }
  95. heap_end += incr;
  96. return (caddr_t) prev_heap_end;
  97. }
  98. int _read(int file, char *ptr, int len)
  99. {
  100. switch (file)
  101. {
  102. case STDIN_FILENO:
  103. while (USART_GetFlagStatus(STDIN_USART, USART_FLAG_RXNE) == RESET);
  104. char c = (char)(USART_ReceiveData(STDIN_USART) & (uint16_t) 0x01FF);
  105. *ptr++ = c;
  106. return 1;
  107. break;
  108. default:
  109. errno = EBADF;
  110. return -1;
  111. }
  112. }
  113. int _stat(const char *filepath, struct stat *st)
  114. {
  115. st->st_mode = S_IFCHR;
  116. return 0;
  117. }
  118. clock_t _times(struct tms *buf)
  119. {
  120. return -1;
  121. }
  122. int _unlink(char *name)
  123. {
  124. errno = ENOENT;
  125. return -1;
  126. }
  127. int _wait(int *status)
  128. {
  129. errno = ECHILD;
  130. return -1;
  131. }
  132. int _write(int file, char *ptr, int len)
  133. {
  134. int n;
  135. switch (file)
  136. {
  137. case STDOUT_FILENO: /*stdout*/
  138. for (n = 0; n < len; n++)
  139. {
  140. while (USART_GetFlagStatus(STDOUT_USART, USART_FLAG_TC) == RESET);
  141. USART_SendData(STDOUT_USART, (uint8_t) * ptr++);
  142. }
  143. break;
  144. case STDERR_FILENO: /* stderr */
  145. for (n = 0; n < len; n++)
  146. {
  147. while (USART_GetFlagStatus(STDERR_USART, USART_FLAG_TC) == RESET);
  148. USART_SendData(STDERR_USART, (uint8_t) * ptr++);
  149. }
  150. break;
  151. default:
  152. errno = EBADF;
  153. return -1;
  154. }
  155. return len;
  156. }