X-Git-Url: http://sigrok.org/gitweb/?a=blobdiff_plain;f=hardware%2Ffx2lafw%2Fcommand.c;h=9bd634b51a283e63a0cac8e36b7976bc01d9f5d1;hb=0a88ec3d9c97d20a26f2c0d8813ce7ba075421f6;hp=fe16506aefbfc4a373e397fe085dc6edda16f6c5;hpb=897c1a2ee5c7397a4ab281a5c83f8f5c34ea0aa1;p=libsigrok.git diff --git a/hardware/fx2lafw/command.c b/hardware/fx2lafw/command.c index fe16506a..9bd634b5 100644 --- a/hardware/fx2lafw/command.c +++ b/hardware/fx2lafw/command.c @@ -59,28 +59,45 @@ SR_PRIV int command_get_revid_version(libusb_device_handle *devhdl, } 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 (samplewide && samplerate > MAX_16BIT_SAMPLE_RATE) { + sr_err("fx2lafw: 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; } + sr_info("fx2lafw: GPIF delay = %d, clocksource = %sMHz", delay, + (cmd.flags & CMD_START_FLAGS_CLK_48MHZ) ? "48" : "30"); + if (delay <= 0 || delay > MAX_SAMPLE_DELAY) { sr_err("fx2lafw: Unable to sample at %" PRIu64 "Hz.", samplerate); return SR_ERR; } - cmd.sample_delay_h = (delay >> 8) & 0x00FF; - cmd.sample_delay_l = delay & 0x00FF; + 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 |