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