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

#include "usbpulse.h"

int pulse100_set_xyz(int fd, int x, int y, int z) {
  if(x >= 0) if(!writeregquad(fd, 0x5, x)) return 0;
  if(y >= 0) if(!writeregquad(fd, 0xF, y)) return 0;
  if(z >= 0) if(!writeregquad(fd, 0x13, z)) return 0;
  return 1;
}

int pulse100_set_pll(int fd, int m, int n, int u, int dly) {
  unsigned char reg, temp;
  unsigned int pllbits;
  double fout, ratio;
  int obmux = 2, bit;
  if(!readreg(fd, 0xA, &reg)) return 0;
  reg &= 0xE0;
  if(!writereg(fd, 0xA, reg | 0x00)) return 0;   /* "set dynamic mode" - no change?*/
  if(!writereg(fd, 0xA, reg | 0x02)) return 0;   /* PLL Shift Hi */
  fout = 12.5E6 * m/(n*u);
  ratio = (n*u)/(double)m;
  if(ratio == (int)ratio)
    obmux = 1, u = ratio;
  n--; m--; u--;
  pllbits = n | (m << 5) | (u << 11) | (obmux<<17) | (1<<20) | (dly<<22) | (1<<26);
  for(bit = 0; bit < 27; bit++) {
    temp = reg | 0x02 | (pllbits&1?0x4:0x0);
    if(!writereg(fd, 0xA, temp)) return 0;       /* Data in */
    if(!writereg(fd, 0xA, temp | 0x1)) return 0; /* Clock up */
    if(!writereg(fd, 0xA, temp)) return 0;       /* Clock down */
    pllbits >>= 1;
  }
  if(!writereg(fd, 0xA, reg | 0x00)) return 0;   /* Disable shift */
  if(!writereg(fd, 0xA, reg | 0x0A)) return 0;   /* Update */
  if(!writereg(fd, 0xA, reg | 0x10)) return 0;   /* Update done */
  return 1;
}

int pulse100_set_amplitude(int fd, float val) {
  unsigned code;
  if(val < 1.5) val = 1.5;
  if(val > 5) val = 5;
  code = (val-1.5) * 255 / (5-1.5);
  if(code > 255) code = 255;
  if(!writereg(fd, 0x3, 2)) return 0;
  if(!writereg(fd, 0x4, code)) return 0;
  return delaycycle(fd, 6);
}
  
int pulse100_set_run(int fd, int state) {
  return changereg(fd, 0x0, ~0x09, state?0x01:0x08);
}

int pulse100_set_arm(int fd, int state) {
  return changereg(fd, 0x0, ~0x02, state?0x02:0);
}

int pulse100_set_bypass(int fd, int state) {
  return changereg(fd, 0x0, ~0x0C, state?0x04:0);
}

int pulse100_set_trigger(int fd, int state) {
  return changereg(fd, 0x0, ~0x20, state?0x20:0);
}
  
int pulse100_set_invert(int fd, int state) {
  return changereg(fd, 0x1, ~0x01, state?0x01:0);
}

int pulse100_set_enable(int fd, int state) {
  return changereg(fd, 0x1, ~0x02, state?0x02:0);
}

int pulse100_set_prng(int fd, int state) {
  return changereg(fd, 0x2, ~0x01, state?0x01:0);
}

int pulse100_set_oneshot(int fd, int state) {
  return changereg(fd, 0x2, ~0x02, state?0x02:0);
}

int pulse100_init_pulse(int fd, int master) {
  if(!writereg(fd, 0x0, 0)) return 0;
  if(!writereg(fd, 0x1, 0)) return 0;
  if(!writereg(fd, 0x2, 0)) return 0;
  if(!writereg(fd, 0x1, 0x20)) return 0;
  if(!writereg(fd, 0x1, 0x24)) return 0;
  if(!writereg(fd, 0x1, 0x04)) return 0;
  if(!writereg(fd, 0x1, 0x24)) return 0;
  if(!usbtm_set_clock_master(fd, master)) return 0;
  /*if(!usbtm_set_trig_master(fd, 1)) return 0;
  if(!pulse100_set_trigger(fd, 0)) return 0;
  if(!pulse100_set_arm(fd, 1)) return 0;
  if(!pulse100_set_run(fd, 1)) return 0;*/
  if(!usbtm_set_led_mode(fd, USBTM_LED_MODE_NORMAL)) return 0;
  return 1;
}