Add multitrack and write support
[magstrip.git] / uart.c
1 /*
2  * Copyright (C) 2009 Nils Faerber <nils.faerber@kernelconcepts.de>
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation; either version 2 of the License, or
7  * (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
17  */
18
19 #include <stdio.h>
20 #include <errno.h>
21 #include <fcntl.h>
22 #include <unistd.h>
23 #include <string.h>
24 #include <stdint.h>
25 #include <termios.h>
26
27
28 static int fd = -1;
29
30 int open_uart(char *device, speed_t baud)
31 {
32         struct termios ti;
33
34         if (!device)
35                 device = "/dev/ttyS0";
36         fd = open(device, O_RDWR | O_NOCTTY);
37         if (fd < 0) {
38                 fprintf(stderr, "Can't open serial port '%s': %s (%d)\n", device, strerror(errno), errno);
39                 fd = -1;
40                 return -1;
41         }
42         tcflush(fd, TCIOFLUSH);
43         if (tcgetattr(fd, &ti) < 0) {
44                 fprintf(stderr, "Can't get port settings: %s (%d)\n", strerror(errno), errno);
45                 close(fd);
46                 fd = -1;
47                 return -1;
48         }
49         cfmakeraw(&ti);
50         ti.c_cflag |=  CLOCAL;
51         ti.c_cflag &= ~CRTSCTS;
52         //ti.c_cflag |= CRTSCTS;
53         //ti.c_cflag |= PARENB;
54         ti.c_cflag |= IGNBRK;
55         ti.c_cc[VMIN] = 1;
56         ti.c_cc[VTIME] = 0;
57         if (baud == 0)
58                 baud = B115200;
59         cfsetospeed(&ti, baud);
60         if (tcsetattr(fd, TCSANOW, &ti) < 0) {
61                 fprintf(stderr, "Can't change port settings: %s (%d)\n", strerror(errno), errno);
62                 close(fd);
63                 fd = -1;
64                 return -1;
65         }
66         tcflush(fd, TCIOFLUSH);
67         if (fcntl(fd, F_SETFL, fcntl(fd, F_GETFL, 0) | O_NONBLOCK) < 0) {
68                 fprintf(stderr, "Can't set non blocking mode: %s (%d)\n", strerror(errno), errno);
69                 close(fd);
70                 fd = -1;
71                 return -1;
72         }
73         return 0;
74 }
75
76 int uart_get_fd(void)
77 {
78         return fd;
79 }
80
81 void put_uart(uint8_t ch)
82 {
83         if (write(fd, &ch, 1) < 0)
84                 fprintf(stderr, "UART write error\n");
85 }
86
87 void write_uart(char *buf, int size)
88 {
89 int remain = size;
90 int ret;
91
92         do {
93                 ret = write(fd, buf, size);
94                 if (ret < 0)
95                         fprintf(stderr, "UART write error\n");
96                 remain -= ret;
97                 buf += ret;
98         } while (remain && (ret>=0));
99 }
100
101 uint8_t get_uart(uint8_t *ch)
102 {
103         int res = read(fd, ch, 1);
104         return res > 0 ? res : 0;
105 }
106
107 int uart_read(char *rxbuf, int maxlen)
108 {
109         return read(fd, rxbuf, maxlen);
110 }
111
112 void close_uart(void)
113 {
114         close(fd);
115         fd = -1;
116 }