diff options
-rw-r--r-- | .gitignore | 6 | ||||
-rw-r--r-- | makefile | 23 | ||||
-rw-r--r-- | ptt.c | 79 |
3 files changed, 108 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9155431 --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +tmp/ +valgrind-out.* +a.out +core +.gdb_history +ptt diff --git a/makefile b/makefile new file mode 100644 index 0000000..c8fbebd --- /dev/null +++ b/makefile @@ -0,0 +1,23 @@ +DESTDIR=/ +CC=cc +MYCFLAGS=-O0 -Wall -Wextra -Wformat -pedantic -g -I. # -fsanitize=address +MYLDFLAGS= + +default: ptt + +ptt: ptt.c + $(CC) $(MYCFLAGS) $(CFLAGS) $< -o$@ $(MYLDFLAGS) $(LDFLAGS) + +install: + mkdir -p $(DESTDIR)/usr/bin/ + cp ptt $(DESTDIR)/usr/bin/ + +distclean: clean + +clean: + rm -rf tmp + +valgrind: + valgrind --error-exitcode=59 --leak-check=full --show-leak-kinds=all --track-origins=yes --verbose --log-file=valgrind-out.txt $(CMD) + +.PHONY: default install distclean clean valgrind @@ -0,0 +1,79 @@ +/* stiskanje ptt poteka z uporabo RTS (request to send) linije RS-232. + * to linijo nastavlja terminal --- računalnik. če gledamo terminalov konektor: + * + * potrebujemo en N-channel enchancement MOSFET od -15 V do +15 V UGS in 3,3 V UDS za majhen tok + * + * * * * * * <- GND priklopimo na skupen ground plane + * * * * * + * ^-. RTS ima napetost od +3 V do +15 V, ko je v stanju 1 + * | ima napetost od -3 V do -15 V, ko je v stanju 0 + * >-[ R ]-> GND + * | + * G + * GND <-S D-v-[ R ]-> 3V3 + * | + * `-> PTT je torej 0, ko je RTS 1, torej takrat odddaja + * ko je RTS 0 ali pa je odklopljen, pa je PTT 1, torej ne TXa + * + * da preprečimo smetenje spektra, je treba v primeru programske napake, torej ko ptt() ne vrne 0, + * zapreti celoten program z neničelno kodo. lupina, ki program zažene, mora v primeru neničelne kode + * pognati program ptt z argumentom 0, ki izklopi PTT. v kolikor še program ptt vrne neničelno kodo, + * lahko lupina poizkusi še s programom ptt0, ki je suid datoteka, ali pa izklopi računalnik. + * + * ptt0 bo, v kolikor nastavitev RTS ni uspela, sam izklopil računalnik. računalnik je treba izklopiti zato, ker stanje RTS ostane nespremenjeno po izklopu procesa, ki je odprl tty napravo in lahko le s prekinitvijo napajanja zagotovimo, da gre RTS v stanje 0 + * + * program ptt dobimo tako, da prevedemo to datoteko direktno -- ne kot #include. + * program ptt0 dobimo tako, da prevedemo to datoteko direktno in dodamo -DPTT0=/dev/ttyS0 stikalo v prevajalnik, kjer je treba pravilno nastaviti pot do uporabljene serijske naprave + * */ +#include <stdio.h> +#include <stdlib.h> +#include <termios.h> +#include <sys/ioctl.h> +#include <sys/types.h> +#include <fcntl.h> +#include <string.h> +#include <time.h> +#include <error.h> +#include <errno.h> +#include <unistd.h> +#define S0(x) ((x) ? (x) : "") +int ptt (int fd, int stanje) { + int status; + if (fd < 0) + return EBADF; + if (ioctl(fd, TIOCMGET, &status) == -1) + return errno; + status &= ~TIOCM_RTS; + if (stanje) + status |= TIOCM_RTS; + if (ioctl(fd, TIOCMSET, &status) == -1) + return errno; + return 0; +} +#if __INCLUDE_LEVEL__ == 0 +int main (int argc, char ** argv) { + int r = 0; +#ifndef PTT0 + if (argc != 1+2) + error_at_line(1, 0, __FILE__, __LINE__, "%s /dev/ttyS0 0/1", S0(argv[0])); +#define DEV (argv[1]) +#define STATUS (atoi(argv[2])) +#else +#define DEV (PTT0) +#define STATUS (0) +#endif + int dev = open(DEV, O_RDWR); + if (dev == -1) + error_at_line(2, errno, __FILE__, __LINE__, "open(DEV, O_RDWR)"); + int ret = ptt(dev, STATUS); + if (ret) { + error_at_line(0, ret, __FILE__, __LINE__, "ptt(dev, STATUS)"); + r = 3; + goto r; + } +r: + if (close(dev) == -1) + error_at_line(0, errno, __FILE__, __LINE__, "close(dev)"); + return r; +} +#endif |