view rvinterf/old/openport.c @ 562:b1358d6c4496
L1: l1_func.c compiles
| author |
Michael Spacefalcon <msokolov@ivan.Harhan.ORG> |
| date |
Tue, 05 Aug 2014 22:03:06 +0000 (2014-08-05) |
| parents |
f42854da4563 |
| children |
|
line source
/*
* This module takes care of opening the serial port and setting the
* proper "raw" termios modes, including the baud rate.
*/
#include <sys/types.h>
#include <sys/file.h>
#include <sys/ioctl.h>
#include <termios.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <strings.h>
#include <unistd.h>
int target_fd;
char *baudrate_name = "115200";
static struct baudrate {
char *name;
speed_t termios_code;
} baud_rate_table[] = {
{"19200", B19200},
{"38400", B38400},
{"57600", B57600},
{"115200", B115200},
/* non-standard high baud rates "remapped" by CP2102 usb2serial IC */
{"203125", B230400},
{"406250", B460800},
{"812500", B921600},
/* table search terminator */
{NULL, B0}
};
static speed_t
get_baud_rate()
{
struct baudrate *br;
for (br = baud_rate_table; br->name; br++)
if (!strcmp(br->name, baudrate_name))
break;
if (!br->name) {
fprintf(stderr, "baud rate \"%s\" unknown/unsupported\n",
baudrate_name);
exit(1);
}
return br->termios_code;
}
open_target_serial(ttydev)
char *ttydev;
{
struct termios target_termios;
speed_t br_code;
br_code = get_baud_rate();
target_fd = open(ttydev, O_RDWR|O_NONBLOCK);
if (target_fd < 0) {
perror(ttydev);
exit(1);
}
target_termios.c_iflag = IGNBRK;
target_termios.c_oflag = 0;
target_termios.c_cflag = CLOCAL|HUPCL|CREAD|CS8;
target_termios.c_lflag = 0;
target_termios.c_cc[VMIN] = 1;
target_termios.c_cc[VTIME] = 0;
cfsetispeed(&target_termios, br_code);
cfsetospeed(&target_termios, br_code);
if (tcsetattr(target_fd, TCSAFLUSH, &target_termios) < 0) {
perror("initial tcsetattr on target");
exit(1);
}
return 0;
}
set_serial_nonblock(state)
int state;
{
ioctl(target_fd, FIONBIO, &state);
}