#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);
#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);