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