#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);
}