newlibMinimal.h
Page last updated 11 Jan 2011, by
0
replies
.
/* * newlibMinimal.h * * Created on: Dec 15, 2010 * Author: dejagerd */ #ifndef NEWLIBMINIMAL_H_ #define NEWLIBMINIMAL_H_ #include <errno.h> #include <string.h> typedef struct { const char *name; int (*open_r)(struct _reent *r, const char *path, int flags, int mode); int (*close_r)(struct _reent *r, int fd); long (*write_r)(struct _reent *r, int fd, const char *ptr, int len); long (*read_r)(struct _reent *r, int fd, char *ptr, int len); } devoptab_t; __attribute__((warning("call to default open_r"))) int _undef_open_r(struct _reent *r, const char *path, int flags, int mode) { return -1; } __attribute__((warning("call to default close_r"))) int _undef_close_r(struct _reent *r, int fd) { return -1; } __attribute__((warning("call to default write_r"))) long _undef_write_r(struct _reent *r, int fd, const char *ptr, int len) { return len; } __attribute__((warning("call to default read_r"))) long _undef_read_r(struct _reent *r, int fd, char *ptr, int len) { return len; } __attribute__((weak)) const devoptab_t devoptab_tty0 = { "tty0", _undef_open_r, _undef_close_r, _undef_write_r, _undef_read_r }; const devoptab_t *devoptab_list[] = { &devoptab_tty0, /* standard input */ &devoptab_tty0, /* standard output */ &devoptab_tty0, /* standard error */ /*add more here as necessary*/ 0 /* terminates the list */ }; long _write_r(struct _reent *ptr, int fd, const void *buf, size_t cnt) { return devoptab_list[fd]->write_r(ptr, fd, buf, cnt); } long _read_r(struct _reent *ptr, int fd, char *buf, size_t cnt) { return devoptab_list[fd]->read_r(ptr, fd, buf, cnt); } int _open_r(struct _reent *ptr, const char *file, int flags, int mode) { int which_devoptab = 0; int fd = -1; /* search for "file" in dotab_list[]->name */ do { if (strcmp(devoptab_list[which_devoptab]->name, file) == 0) { fd = which_devoptab; break; } } while (devoptab_list[which_devoptab++] != 0); /* if we found the requested file/device, invoke the device's open_r() */ if (fd != -1) { devoptab_list[fd]->open_r(ptr, file, flags, mode); } /* it doesn't exist! */ else { ptr->_errno = ENODEV; } return fd; } long _close_r(struct _reent *ptr, int fd) { return devoptab_list[fd]->close_r(ptr, fd); } unsigned char _heap[0x1000]; char* _sbrk_r(int incr) { register char *SP asm ("sp"); extern char _end; /* Defined by the linker */ static char *heap_end; char *prev_heap_end; if (heap_end == 0) { heap_end = &_end; } prev_heap_end = heap_end; if (heap_end + incr > SP) { return 0; } heap_end += incr; return prev_heap_end; } #endif /* NEWLIBMINIMAL_H_ */
0 comments
You need to log in to post a comment