xref: /rk3399_rockchip-uboot/tools/gdb/serial.c (revision bca52d65cb24542cbe96584d08481a487042a593)
1*bca52d65Swdenk #include <unistd.h>
2*bca52d65Swdenk #include <string.h>
3*bca52d65Swdenk #include <fcntl.h>
4*bca52d65Swdenk #include <sys/time.h>
5*bca52d65Swdenk #include "serial.h"
6*bca52d65Swdenk 
7*bca52d65Swdenk #if defined(__sun__)	 || \
8*bca52d65Swdenk     defined(__OpenBSD__) || \
9*bca52d65Swdenk     defined(__FreeBSD__) || \
10*bca52d65Swdenk     defined(__NetBSD__)	 || \
11*bca52d65Swdenk     defined(__APPLE__)
12*bca52d65Swdenk static struct termios tios = { BRKINT, 0, B115200|CS8|CREAD, 0, { 0 } };
13*bca52d65Swdenk #else
14*bca52d65Swdenk static struct termios tios = { BRKINT, 0, B115200|CS8|CREAD, 0,   0   };
15*bca52d65Swdenk #endif
16*bca52d65Swdenk 
17*bca52d65Swdenk static struct speedmap {
18*bca52d65Swdenk     char *str;
19*bca52d65Swdenk     speed_t val;
20*bca52d65Swdenk } speedmap[] = {
21*bca52d65Swdenk     { "50", B50 },		{ "75", B75 },		{ "110", B110 },
22*bca52d65Swdenk     { "134", B134 },		{ "150", B150 },	{ "200", B200 },
23*bca52d65Swdenk     { "300", B300 },		{ "600", B600 },	{ "1200", B1200 },
24*bca52d65Swdenk     { "1800", B1800 },		{ "2400", B2400 },	{ "4800", B4800 },
25*bca52d65Swdenk     { "9600", B9600 },		{ "19200", B19200 },	{ "38400", B38400 },
26*bca52d65Swdenk     { "57600", B57600 },
27*bca52d65Swdenk #ifdef	B76800
28*bca52d65Swdenk     { "76800", B76800 },
29*bca52d65Swdenk #endif
30*bca52d65Swdenk     { "115200", B115200 },
31*bca52d65Swdenk #ifdef	B153600
32*bca52d65Swdenk     { "153600", B153600 },
33*bca52d65Swdenk #endif
34*bca52d65Swdenk     { "230400", B230400 },
35*bca52d65Swdenk #ifdef	B307200
36*bca52d65Swdenk     { "307200", B307200 },
37*bca52d65Swdenk #endif
38*bca52d65Swdenk #ifdef B460800
39*bca52d65Swdenk     { "460800", B460800 }
40*bca52d65Swdenk #endif
41*bca52d65Swdenk };
42*bca52d65Swdenk static int nspeeds = sizeof speedmap / sizeof speedmap[0];
43*bca52d65Swdenk 
44*bca52d65Swdenk speed_t
45*bca52d65Swdenk cvtspeed(char *str)
46*bca52d65Swdenk {
47*bca52d65Swdenk     struct speedmap *smp = speedmap, *esmp = &speedmap[nspeeds];
48*bca52d65Swdenk 
49*bca52d65Swdenk     while (smp < esmp) {
50*bca52d65Swdenk 	if (strcmp(str, smp->str) == 0)
51*bca52d65Swdenk 	    return (smp->val);
52*bca52d65Swdenk 	smp++;
53*bca52d65Swdenk     }
54*bca52d65Swdenk     return B0;
55*bca52d65Swdenk }
56*bca52d65Swdenk 
57*bca52d65Swdenk int
58*bca52d65Swdenk serialopen(char *device, speed_t speed)
59*bca52d65Swdenk {
60*bca52d65Swdenk     int fd;
61*bca52d65Swdenk 
62*bca52d65Swdenk     if (cfsetospeed(&tios, speed) < 0)
63*bca52d65Swdenk 	return -1;
64*bca52d65Swdenk 
65*bca52d65Swdenk     if ((fd = open(device, O_RDWR)) < 0)
66*bca52d65Swdenk 	return -1;
67*bca52d65Swdenk 
68*bca52d65Swdenk     if (tcsetattr(fd, TCSAFLUSH, &tios) < 0) {
69*bca52d65Swdenk 	(void)close(fd);
70*bca52d65Swdenk 	return -1;
71*bca52d65Swdenk     }
72*bca52d65Swdenk 
73*bca52d65Swdenk     return fd;
74*bca52d65Swdenk }
75*bca52d65Swdenk 
76*bca52d65Swdenk int
77*bca52d65Swdenk serialreadchar(int fd, int timeout)
78*bca52d65Swdenk {
79*bca52d65Swdenk     fd_set fds;
80*bca52d65Swdenk     struct timeval tv;
81*bca52d65Swdenk     int n;
82*bca52d65Swdenk     char ch;
83*bca52d65Swdenk 
84*bca52d65Swdenk     tv.tv_sec = timeout;
85*bca52d65Swdenk     tv.tv_usec = 0;
86*bca52d65Swdenk 
87*bca52d65Swdenk     FD_ZERO(&fds);
88*bca52d65Swdenk     FD_SET(fd, &fds);
89*bca52d65Swdenk 
90*bca52d65Swdenk     /* this is a fucking horrible quick hack - fix this */
91*bca52d65Swdenk 
92*bca52d65Swdenk     if ((n = select(fd + 1, &fds, 0, 0, &tv)) < 0)
93*bca52d65Swdenk 	return SERIAL_ERROR;
94*bca52d65Swdenk 
95*bca52d65Swdenk     if (n == 0)
96*bca52d65Swdenk 	return SERIAL_TIMEOUT;
97*bca52d65Swdenk 
98*bca52d65Swdenk     if ((n = read(fd, &ch, 1)) < 0)
99*bca52d65Swdenk 	return SERIAL_ERROR;
100*bca52d65Swdenk 
101*bca52d65Swdenk     if (n == 0)
102*bca52d65Swdenk 	return SERIAL_EOF;
103*bca52d65Swdenk 
104*bca52d65Swdenk     return ch;
105*bca52d65Swdenk }
106*bca52d65Swdenk 
107*bca52d65Swdenk int
108*bca52d65Swdenk serialwrite(int fd, char *buf, int len)
109*bca52d65Swdenk {
110*bca52d65Swdenk     int n;
111*bca52d65Swdenk 
112*bca52d65Swdenk     do {
113*bca52d65Swdenk 	n = write(fd, buf, len);
114*bca52d65Swdenk 	if (n < 0)
115*bca52d65Swdenk 	    return 1;
116*bca52d65Swdenk 	len -= n;
117*bca52d65Swdenk 	buf += n;
118*bca52d65Swdenk     } while (len > 0);
119*bca52d65Swdenk     return 0;
120*bca52d65Swdenk }
121*bca52d65Swdenk 
122*bca52d65Swdenk int
123*bca52d65Swdenk serialclose(int fd)
124*bca52d65Swdenk {
125*bca52d65Swdenk     return close(fd);
126*bca52d65Swdenk }
127