HW/DAS/USBscopes/usbtm/lib/usbcommon.c

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