*/
#include <libusb.h>
-
#include "command.h"
#include "sigrok.h"
#include "sigrok-internal.h"
-int command_start_acquisition(libusb_device_handle *devhdl)
+SR_PRIV int command_get_fw_version(libusb_device_handle *devhdl,
+ struct version_info *vi)
+{
+ const int 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("fx2lafw: Unable to get version info: %d.", ret);
+ return SR_ERR;
+ }
+
+ return SR_OK;
+}
+
+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;
}