X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=hardware%2Ffx2lafw%2Fcommand.c;h=3f2545e479ba3f922797c8b7bb96ea62ed84b674;hb=f6a0ac9f6217f808d02f1c64a49c7ead3afb06e1;hp=04ab56c56697a6109e1ddab437930dc1c1594941;hpb=7ae2f9d56fed0e53ad3dab25de65504acc3022a0;p=libsigrok.git diff --git a/hardware/fx2lafw/command.c b/hardware/fx2lafw/command.c index 04ab56c5..3f2545e4 100644 --- a/hardware/fx2lafw/command.c +++ b/hardware/fx2lafw/command.c @@ -18,40 +18,93 @@ */ #include +#include "libsigrok.h" +#include "libsigrok-internal.h" +#include "fx2lafw.h" #include "command.h" -#include "sigrok.h" -#include "sigrok-internal.h" + +SR_PRIV int command_get_fw_version(libusb_device_handle *devhdl, + struct version_info *vi) +{ + int ret; + + ret = libusb_control_transfer(devhdl, LIBUSB_REQUEST_TYPE_VENDOR | + LIBUSB_ENDPOINT_IN, CMD_GET_FW_VERSION, 0x0000, 0x0000, + (unsigned char *)vi, sizeof(struct version_info), 100); + + if (ret < 0) { + sr_err("Unable to get version info: %s.", + libusb_error_name(ret)); + return SR_ERR; + } + + return SR_OK; +} + +SR_PRIV int command_get_revid_version(libusb_device_handle *devhdl, + uint8_t *revid) +{ + int ret; + + ret = libusb_control_transfer(devhdl, LIBUSB_REQUEST_TYPE_VENDOR | + LIBUSB_ENDPOINT_IN, CMD_GET_REVID_VERSION, 0x0000, 0x0000, + revid, 1, 100); + + if (ret < 0) { + sr_err("Unable to get REVID: %s.", libusb_error_name(ret)); + return SR_ERR; + } + + return SR_OK; +} SR_PRIV int command_start_acquisition(libusb_device_handle *devhdl, - uint64_t samplerate) + uint64_t samplerate, gboolean samplewide) { struct cmd_start_acquisition cmd; int delay = 0, ret; /* Compute the sample rate. */ - if((SR_MHZ(48) % samplerate) == 0) { + if (samplewide && samplerate > MAX_16BIT_SAMPLE_RATE) { + sr_err("Unable to sample at %" PRIu64 "Hz " + "when collecting 16-bit samples.", samplerate); + return SR_ERR; + } + + 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) { + if (delay > MAX_SAMPLE_DELAY) + delay = 0; + } + + if (delay == 0 && (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); + sr_info("GPIF delay = %d, clocksource = %sMHz.", delay, + (cmd.flags & CMD_START_FLAGS_CLK_48MHZ) ? "48" : "30"); + + if (delay <= 0 || delay > MAX_SAMPLE_DELAY) { + sr_err("Unable to sample at %" PRIu64 "Hz.", samplerate); return SR_ERR; } - cmd.sample_delay = delay; + cmd.sample_delay_h = (delay >> 8) & 0xff; + cmd.sample_delay_l = delay & 0xff; + + /* Select the sampling width. */ + cmd.flags |= samplewide ? CMD_START_FLAGS_SAMPLE_16BIT : + CMD_START_FLAGS_SAMPLE_8BIT; /* 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); + sr_err("Unable to send start command: %s.", + libusb_error_name(ret)); return SR_ERR; }