fx2lafw: Implemented control of sample rates

This commit is contained in:
Joel Holdsworth 2012-03-04 14:10:44 +00:00
parent f92994fd91
commit dba024420f
3 changed files with 46 additions and 4 deletions

View File

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

View File

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

View 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;
}