X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=hardware%2Ffx2lafw%2Fcommand.c;h=04ab56c56697a6109e1ddab437930dc1c1594941;hb=69cfcfc8f0f3f4358714d706268fc05aaa70ca23;hp=0e60c9aa673afb57d29c815e448237d8212abfd1;hpb=f6582cd7bf62bc945ecadda09123fde6c3676107;p=libsigrok.git diff --git a/hardware/fx2lafw/command.c b/hardware/fx2lafw/command.c index 0e60c9aa..04ab56c5 100644 --- a/hardware/fx2lafw/command.c +++ b/hardware/fx2lafw/command.c @@ -18,20 +18,40 @@ */ #include - #include "command.h" #include "sigrok.h" #include "sigrok-internal.h" -int command_start_acquisition(libusb_device_handle *devhdl) +SR_PRIV int command_start_acquisition(libusb_device_handle *devhdl, + uint64_t samplerate) { - const int res = libusb_control_transfer(devhdl, - LIBUSB_REQUEST_TYPE_VENDOR | - LIBUSB_ENDPOINT_OUT, CMD_START, 0x0000, - 0x0000, NULL, 0, 100); - if (res < 0) { - sr_err("fx2lafw: Unable to send start command: %d", - res); + struct cmd_start_acquisition cmd; + int delay = 0, ret; + + /* Compute the sample rate. */ + if((SR_MHZ(48) % samplerate) == 0) { + cmd.flags = CMD_START_FLAGS_CLK_48MHZ; + delay = SR_MHZ(48) / samplerate - 1; + } else if((SR_MHZ(30) % samplerate) == 0) { + cmd.flags = CMD_START_FLAGS_CLK_30MHZ; + delay = SR_MHZ(30) / samplerate - 1; + } + + /* Note: sample_delay=0 is treated as sample_delay=256. */ + if (delay <= 0 || delay > 256) { + sr_err("fx2lafw: Unable to sample at %" PRIu64 "Hz.", + samplerate); + return SR_ERR; + } + + cmd.sample_delay = delay; + + /* Send the control message. */ + ret = libusb_control_transfer(devhdl, LIBUSB_REQUEST_TYPE_VENDOR | + LIBUSB_ENDPOINT_OUT, CMD_START, 0x0000, 0x0000, + (unsigned char *)&cmd, sizeof(cmd), 100); + if (ret < 0) { + sr_err("fx2lafw: Unable to send start command: %d.", ret); return SR_ERR; }