130 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			130 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								 * Copyright (c) 2006-2021, RT-Thread Development Team
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * SPDX-License-Identifier: Apache-2.0
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * Change Logs:
							 | 
						||
| 
								 | 
							
								 * Date           Author       Notes
							 | 
						||
| 
								 | 
							
								 * 2017/08/30     Bernard      The first version
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <stdlib.h>
							 | 
						||
| 
								 | 
							
								#include <string.h>
							 | 
						||
| 
								 | 
							
								#include <unistd.h>
							 | 
						||
| 
								 | 
							
								#include <sys/errno.h>
							 | 
						||
| 
								 | 
							
								#include "termios.h"
							 | 
						||
| 
								 | 
							
								#include <rtthread.h>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								int tcgetattr(int fd, struct termios *tio)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    /* Get the current serial port settings. */
							 | 
						||
| 
								 | 
							
								    if (ioctl(fd, TCGETA, tio))
							 | 
						||
| 
								 | 
							
								        return -1;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    return 0;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								int tcsetattr(int fd, int act, const struct termios *tio)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    switch (act)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								    case TCSANOW:
							 | 
						||
| 
								 | 
							
								        /* make the change immediately */
							 | 
						||
| 
								 | 
							
								        return (ioctl(fd, TCSETA, (void*)tio));
							 | 
						||
| 
								 | 
							
								    case TCSADRAIN:
							 | 
						||
| 
								 | 
							
								        /*
							 | 
						||
| 
								 | 
							
								         * Don't make the change until all currently written data
							 | 
						||
| 
								 | 
							
								         * has been transmitted.
							 | 
						||
| 
								 | 
							
								         */
							 | 
						||
| 
								 | 
							
								        return (ioctl(fd, TCSETAW, (void*)tio));
							 | 
						||
| 
								 | 
							
								    case TCSAFLUSH:
							 | 
						||
| 
								 | 
							
								        /* Don't make the change until all currently written data
							 | 
						||
| 
								 | 
							
								         * has been transmitted, at which point any received but
							 | 
						||
| 
								 | 
							
								         * unread data is also discarded.
							 | 
						||
| 
								 | 
							
								         */
							 | 
						||
| 
								 | 
							
								        return (ioctl(fd, TCSETAF, (void*)tio));
							 | 
						||
| 
								 | 
							
								    default:
							 | 
						||
| 
								 | 
							
								        errno = EINVAL;
							 | 
						||
| 
								 | 
							
								        return (-1);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * this function gets process group ID for session leader for controlling
							 | 
						||
| 
								 | 
							
								 * terminal
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @return always 0
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								pid_t tcgetsid(int fd)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    return 0;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								speed_t cfgetospeed(const struct termios *tio)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    return tio->c_cflag & CBAUD;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								speed_t cfgetispeed(const struct termios *tio)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    return cfgetospeed(tio);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								int cfsetospeed(struct termios *tio, speed_t speed)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    if (speed & ~CBAUD)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        errno = EINVAL;
							 | 
						||
| 
								 | 
							
								        return -1;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    tio->c_cflag &= ~CBAUD;
							 | 
						||
| 
								 | 
							
								    tio->c_cflag |= speed;
							 | 
						||
| 
								 | 
							
								    return 0;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								int cfsetispeed(struct termios *tio, speed_t speed)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    return speed ? cfsetospeed(tio, speed) : 0;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								int tcsendbreak(int fd, int dur)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    /* nonzero duration is implementation-defined, so ignore it */
							 | 
						||
| 
								 | 
							
								    return 0;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								int tcflush(int fd, int queue)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    return ioctl(fd, TCFLSH, (void*)(rt_ubase_t)queue);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								int tcflow(int fd, int action)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    return ioctl(fd, TCXONC, (void*)(rt_ubase_t)action);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * this function waits for transmission of output
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								int tcdrain(int fd)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    return 0;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void cfmakeraw(struct termios *t)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    t->c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP|INLCR|IGNCR|ICRNL|IXON);
							 | 
						||
| 
								 | 
							
								    t->c_oflag &= ~OPOST;
							 | 
						||
| 
								 | 
							
								    t->c_lflag &= ~(ECHO|ECHONL|ICANON|ISIG|IEXTEN);
							 | 
						||
| 
								 | 
							
								    t->c_cflag &= ~(CSIZE|PARENB);
							 | 
						||
| 
								 | 
							
								    t->c_cflag |= CS8;
							 | 
						||
| 
								 | 
							
								    t->c_cc[VMIN] = 1;
							 | 
						||
| 
								 | 
							
								    t->c_cc[VTIME] = 0;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								int cfsetspeed(struct termios *tio, speed_t speed)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    return cfsetospeed(tio, speed);
							 | 
						||
| 
								 | 
							
								}
							 |