From: Joel Holdsworth Date: Sun, 4 Mar 2012 14:10:44 +0000 (+0000) Subject: fx2lafw: Implemented control of sample rates X-Git-Tag: libsigrok-0.1.0~56 X-Git-Url: http://sigrok.org/gitweb/?a=commitdiff_plain;h=dba024420f934ff10f18eebbaad1f4e97c739259;p=libsigrok.git fx2lafw: Implemented control of sample rates --- diff --git a/hardware/fx2lafw/command.c b/hardware/fx2lafw/command.c index 0e60c9aa..b3d3b6b6 100644 --- a/hardware/fx2lafw/command.c +++ b/hardware/fx2lafw/command.c @@ -23,12 +23,37 @@ #include "sigrok.h" #include "sigrok-internal.h" -int command_start_acquisition(libusb_device_handle *devhdl) +int command_start_acquisition(libusb_device_handle *devhdl, + uint64_t samplerate) { + struct cmd_start_acquisition cmd; + int delay = 0; + + /* 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 that sample_delay=0 is treated as sample_delay=256 */ + if (delay <= 0 || delay > 256) { + sr_err("fx2lafw: Unable to sample at %dHz", + samplerate); + return SR_ERR; + } + + cmd.sample_delay = delay; + + /* Send the control message */ const int res = libusb_control_transfer(devhdl, LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_ENDPOINT_OUT, CMD_START, 0x0000, - 0x0000, NULL, 0, 100); + 0x0000, (unsigned char*)&cmd, + sizeof(cmd), 100); if (res < 0) { sr_err("fx2lafw: Unable to send start command: %d", res); diff --git a/hardware/fx2lafw/command.h b/hardware/fx2lafw/command.h index cbb76d7f..929118a0 100644 --- a/hardware/fx2lafw/command.h +++ b/hardware/fx2lafw/command.h @@ -21,4 +21,20 @@ #define CMD_GET_FW_VERSION 0xb0 #define CMD_START 0xb1 -int command_start_acquisition(libusb_device_handle *devhdl); +#define CMD_START_FLAGS_CLK_SRC_POS 6 + +#define CMD_START_FLAGS_CLK_30MHZ (0 << CMD_START_FLAGS_CLK_SRC_POS) +#define CMD_START_FLAGS_CLK_48MHZ (1 << CMD_START_FLAGS_CLK_SRC_POS) + +#pragma pack(push, 1) + +struct cmd_start_acquisition +{ + uint8_t flags; + uint8_t sample_delay; +}; + +#pragma pack(pop) + +int command_start_acquisition(libusb_device_handle *devhdl, + uint64_t samplerate); diff --git a/hardware/fx2lafw/fx2lafw.c b/hardware/fx2lafw/fx2lafw.c index e213df9c..cb9963f5 100644 --- a/hardware/fx2lafw/fx2lafw.c +++ b/hardware/fx2lafw/fx2lafw.c @@ -625,7 +625,8 @@ static int hw_dev_acquisition_start(int dev_index, void *cb_data) return SR_ERR_MALLOC; } - if ((err = command_start_acquisition (ctx->usb->devhdl)) != SR_OK) { + if ((err = command_start_acquisition (ctx->usb->devhdl, + ctx->cur_samplerate)) != SR_OK) { return err; }