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/08/30 Bernard The first version
9*10465441SEvalZero */
10*10465441SEvalZero #include <stdlib.h>
11*10465441SEvalZero #include <string.h>
12*10465441SEvalZero #include <rtthread.h>
13*10465441SEvalZero #include <dfs_posix.h>
14*10465441SEvalZero
15*10465441SEvalZero #include <termios.h>
16*10465441SEvalZero
tcgetattr(int fd,struct termios * tio)17*10465441SEvalZero int tcgetattr(int fd, struct termios *tio)
18*10465441SEvalZero {
19*10465441SEvalZero /* Get the current serial port settings. */
20*10465441SEvalZero if (ioctl(fd, TCGETA, tio))
21*10465441SEvalZero return -1;
22*10465441SEvalZero
23*10465441SEvalZero return 0;
24*10465441SEvalZero }
25*10465441SEvalZero
tcsetattr(int fd,int act,const struct termios * tio)26*10465441SEvalZero int tcsetattr(int fd, int act, const struct termios *tio)
27*10465441SEvalZero {
28*10465441SEvalZero switch (act)
29*10465441SEvalZero {
30*10465441SEvalZero case TCSANOW:
31*10465441SEvalZero /* make the change immediately */
32*10465441SEvalZero return (ioctl(fd, TCSETA, (void*)tio));
33*10465441SEvalZero case TCSADRAIN:
34*10465441SEvalZero /*
35*10465441SEvalZero * Don't make the change until all currently written data
36*10465441SEvalZero * has been transmitted.
37*10465441SEvalZero */
38*10465441SEvalZero return (ioctl(fd, TCSETAW, (void*)tio));
39*10465441SEvalZero case TCSAFLUSH:
40*10465441SEvalZero /* Don't make the change until all currently written data
41*10465441SEvalZero * has been transmitted, at which point any received but
42*10465441SEvalZero * unread data is also discarded.
43*10465441SEvalZero */
44*10465441SEvalZero return (ioctl(fd, TCSETAF, (void*)tio));
45*10465441SEvalZero default:
46*10465441SEvalZero errno = EINVAL;
47*10465441SEvalZero return (-1);
48*10465441SEvalZero }
49*10465441SEvalZero }
50*10465441SEvalZero
51*10465441SEvalZero /**
52*10465441SEvalZero * this function gets process group ID for session leader for controlling
53*10465441SEvalZero * terminal
54*10465441SEvalZero *
55*10465441SEvalZero * @return always 0
56*10465441SEvalZero */
tcgetsid(int fd)57*10465441SEvalZero pid_t tcgetsid(int fd)
58*10465441SEvalZero {
59*10465441SEvalZero return 0;
60*10465441SEvalZero }
61*10465441SEvalZero
cfgetospeed(const struct termios * tio)62*10465441SEvalZero speed_t cfgetospeed(const struct termios *tio)
63*10465441SEvalZero {
64*10465441SEvalZero return tio->c_cflag & CBAUD;
65*10465441SEvalZero }
66*10465441SEvalZero
cfgetispeed(const struct termios * tio)67*10465441SEvalZero speed_t cfgetispeed(const struct termios *tio)
68*10465441SEvalZero {
69*10465441SEvalZero return cfgetospeed(tio);
70*10465441SEvalZero }
71*10465441SEvalZero
cfsetospeed(struct termios * tio,speed_t speed)72*10465441SEvalZero int cfsetospeed(struct termios *tio, speed_t speed)
73*10465441SEvalZero {
74*10465441SEvalZero if (speed & ~CBAUD)
75*10465441SEvalZero {
76*10465441SEvalZero errno = EINVAL;
77*10465441SEvalZero return -1;
78*10465441SEvalZero }
79*10465441SEvalZero
80*10465441SEvalZero tio->c_cflag &= ~CBAUD;
81*10465441SEvalZero tio->c_cflag |= speed;
82*10465441SEvalZero return 0;
83*10465441SEvalZero }
84*10465441SEvalZero
cfsetispeed(struct termios * tio,speed_t speed)85*10465441SEvalZero int cfsetispeed(struct termios *tio, speed_t speed)
86*10465441SEvalZero {
87*10465441SEvalZero return speed ? cfsetospeed(tio, speed) : 0;
88*10465441SEvalZero }
89*10465441SEvalZero
tcsendbreak(int fd,int dur)90*10465441SEvalZero int tcsendbreak(int fd, int dur)
91*10465441SEvalZero {
92*10465441SEvalZero /* nonzero duration is implementation-defined, so ignore it */
93*10465441SEvalZero return 0;
94*10465441SEvalZero }
95*10465441SEvalZero
tcflush(int fd,int queue)96*10465441SEvalZero int tcflush(int fd, int queue)
97*10465441SEvalZero {
98*10465441SEvalZero return ioctl(fd, TCFLSH, (void*)queue);
99*10465441SEvalZero }
100*10465441SEvalZero
tcflow(int fd,int action)101*10465441SEvalZero int tcflow(int fd, int action)
102*10465441SEvalZero {
103*10465441SEvalZero return ioctl(fd, TCXONC, (void*)action);
104*10465441SEvalZero }
105*10465441SEvalZero
106*10465441SEvalZero /**
107*10465441SEvalZero * this function waits for transmission of output
108*10465441SEvalZero */
tcdrain(int fd)109*10465441SEvalZero int tcdrain(int fd)
110*10465441SEvalZero {
111*10465441SEvalZero return 0;
112*10465441SEvalZero }
113*10465441SEvalZero
isatty(int fd)114*10465441SEvalZero int isatty (int fd)
115*10465441SEvalZero {
116*10465441SEvalZero struct termios term;
117*10465441SEvalZero
118*10465441SEvalZero return tcgetattr (fd, &term) == 0;
119*10465441SEvalZero }
120*10465441SEvalZero
121*10465441SEvalZero #if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
cfmakeraw(struct termios * t)122*10465441SEvalZero void cfmakeraw(struct termios *t)
123*10465441SEvalZero {
124*10465441SEvalZero t->c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP|INLCR|IGNCR|ICRNL|IXON);
125*10465441SEvalZero t->c_oflag &= ~OPOST;
126*10465441SEvalZero t->c_lflag &= ~(ECHO|ECHONL|ICANON|ISIG|IEXTEN);
127*10465441SEvalZero t->c_cflag &= ~(CSIZE|PARENB);
128*10465441SEvalZero t->c_cflag |= CS8;
129*10465441SEvalZero t->c_cc[VMIN] = 1;
130*10465441SEvalZero t->c_cc[VTIME] = 0;
131*10465441SEvalZero }
132*10465441SEvalZero
cfsetspeed(struct termios * tio,speed_t speed)133*10465441SEvalZero int cfsetspeed(struct termios *tio, speed_t speed)
134*10465441SEvalZero {
135*10465441SEvalZero return cfsetospeed(tio, speed);
136*10465441SEvalZero }
137*10465441SEvalZero #endif
138*10465441SEvalZero
139