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