xref: /nrf52832-nimble/rt-thread/components/libc/termios/posix_termios.c (revision 104654410c56c573564690304ae786df310c91fc)
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