#include "usbcommon.h" int opendev(int tty, int *fd) { char name[100]; struct termios tios; sprintf(name, DEVNAME "%i", tty); *fd = open(name, O_RDWR); if(*fd < 0) return 0; tcgetattr(*fd, &tios); cfsetospeed(&tios, B921600); cfsetispeed(&tios, B921600); tios.c_iflag &= ~INPCK; cfmakeraw(&tios); tcsetattr(*fd, TCSANOW, &tios); return 1; } void closedev(int tty, int fd) { delaycycle(fd, 1); close(fd); } char *deverror(int tty) { static char msg[200]; sprintf(msg, "Nepodarilo se otevrit zarizeni %s%i!\n" "Zkontrolujte pritomnost specialniho souboru a pristupova prava.\n", DEVNAME, tty); return msg; } int readreg(int fd, unsigned char r, unsigned char *res) { unsigned char buf; buf = 0x60 | r; if(write(fd, &buf, 1) != 1) return 0; fsync(fd); if(read(fd, &buf, 1) != 1) return 0; *res = buf; return 1; } int readregdouble(int fd, unsigned char r, unsigned *res) { unsigned char a, b; if(!readreg(fd, r, &a)) return 0; if(!readreg(fd, r+1, &b)) return 0; *res = (((unsigned)b)<<8) + a; return 1; } int readregmulti(int fd, unsigned char r, int n, unsigned char *res) { unsigned char buf; int got, sum; buf = 0x40 | r; if(write(fd, &buf, 1) != 1) return 0; fsync(fd); sum = 0; do { got = read(fd, res + sum, n); if(!got) break; sum += got; } while(sum < n); if(n != sum) return 0; else return 1; } int writereg(int fd, unsigned char r, unsigned char val) { unsigned char buf[2]; buf[0] = 0x20 | r; buf[1] = val; if(write(fd, buf, 2) != 2) return 0; else return 1; } int writeregdouble(int fd, unsigned char r, unsigned val) { if(!writereg(fd, r, (unsigned)(val & 0xFF))) return 0; if(!writereg(fd, r+1, (unsigned)(val >> 8))) return 0; return 1; } int writeregquad(int fd, unsigned char r, unsigned val) { if(!writereg(fd, r+3, (unsigned)(val >> 24) & 0xFF)) return 0; if(!writereg(fd, r+2, (unsigned)(val >> 16) & 0xFF)) return 0; if(!writereg(fd, r+1, (unsigned)(val >> 8) & 0xFF)) return 0; if(!writereg(fd, r, (unsigned)(val & 0xFF))) return 0; return 1; } int writeregmulti(int fd, unsigned char *data, int n) { if(write(fd, data, n) != n) return 0; else return 1; } int changereg(int fd, unsigned char r, unsigned char andmask, unsigned char ormask) { unsigned char reg; if(!readreg(fd, r, ®)) return 0;; reg &= andmask; reg |= ormask; if(!writereg(fd, r, reg)) return 0; return 1; } int delaycycle(int fd, int cnt) { unsigned char ret; if(cnt < 1) cnt = 1; while(cnt--) if(!readreg(fd, 0xE, &ret)) return 0; return 1; } int usbtm_get_controller_rev(int fd, unsigned char *rev) { return readreg(fd, 0xE, rev); } int usbtm_set_trig_master(int fd, int state) { return changereg(fd, 0x0, ~0x40, state?0x40:0); } int usbtm_set_clock_master(int fd, int state) { return changereg(fd, 0x0, (unsigned char)~0x80, state?0x80:0); } int usbtm_set_detect_line(int fd, int master, int state) { return changereg(fd, 0x1, (unsigned char)~0x90, (state?0x80:0) | (master?0x10:0)); } int usbtm_get_detect_line(int fd, int *ret) { unsigned char res; if(!readreg(fd, 0x9, &res)) return 0; *ret = (res & 0x80) ? 1 : 0; return 1; } int usbtm_set_led_mode(int fd, int mode) { return changereg(fd, 0xA, ~0x60, mode << 5); }