1 /*
2 * Copyright (c) 2006-2018, RT-Thread Development Team
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 *
6 * Change Logs:
7 * Date Author Notes
8 * 2017/10/15 bernard implement stdio for armcc.
9 */
10
11 #include <stdio.h>
12 #include <stdlib.h>
13 #include <string.h>
14
15 #include <rtthread.h>
16 #include "libc.h"
17
18 #if defined(RT_USING_DFS) && defined(RT_USING_DFS_DEVFS)
19 #include <dfs_posix.h>
20
21 #define STDIO_DEVICE_NAME_MAX 32
22
23 static int std_fd = -1;
libc_stdio_set_console(const char * device_name,int mode)24 int libc_stdio_set_console(const char* device_name, int mode)
25 {
26 int fd;
27 char name[STDIO_DEVICE_NAME_MAX];
28
29 snprintf(name, sizeof(name) - 1, "/dev/%s", device_name);
30 name[STDIO_DEVICE_NAME_MAX - 1] = '\0';
31
32 fd = open(name, mode, 0);
33 if (fd >= 0)
34 {
35 if (std_fd >= 0)
36 {
37 close(std_fd);
38 }
39 std_fd = fd;
40 }
41
42 return std_fd;
43 }
44
libc_stdio_get_console(void)45 int libc_stdio_get_console(void)
46 {
47 return std_fd;
48 }
49
libc_stdio_read(void * buffer,size_t size)50 int libc_stdio_read(void *buffer, size_t size)
51 {
52 if (std_fd >= 0)
53 {
54 return read(std_fd, buffer, size);
55 }
56 else
57 {
58 rt_kprintf("Illegal stdio input!\n");
59 return 0;
60 }
61 }
62
libc_stdio_write(const void * buffer,size_t size)63 int libc_stdio_write(const void *buffer, size_t size)
64 {
65 if (std_fd >= 0)
66 {
67 return write(std_fd, buffer, size);
68 }
69 else
70 {
71 rt_kprintf("Illegal stdio output!\n");
72 return size;
73 }
74 }
75 #endif
76