]> sigrok.org Git - libsigrok.git/commitdiff
fx2lafw: Implemented control of sample rates
authorJoel Holdsworth <redacted>
Sun, 4 Mar 2012 14:10:44 +0000 (14:10 +0000)
committerJoel Holdsworth <redacted>
Wed, 7 Mar 2012 07:52:05 +0000 (07:52 +0000)
hardware/fx2lafw/command.c
hardware/fx2lafw/command.h
hardware/fx2lafw/fx2lafw.c

index 0e60c9aa673afb57d29c815e448237d8212abfd1..b3d3b6b60cb1f9698ddbf2b154d5192a28d087ce 100644 (file)
 #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);
index cbb76d7fff0713556bb680a2652f284c30e76eae..929118a0fc31a34a6648b255201babf05128e27d 100644 (file)
 #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);
index e213df9c2cd18ef4b6df5b090acc468a9d3b93a5..cb9963f52eac11389219968cc17570200dc264af 100644 (file)
@@ -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;
        }