static uint64_t cur_samplerate = MHZ(200);
static uint32_t limit_msec = 0;
static struct timeval start_tv;
+static int cur_firmware = -1;
static uint64_t supported_samplerates[] = {
MHZ(200),
0x2a, 0x3a, 0x40, 0x03, 0x20, 0x38,
};
-static int sigma_read(void *buf, size_t size)
+static const char *firmware_files[] =
+{
+ "asix-sigma-50.firmware", /* Supports fractions (8 bits) */
+ "asix-sigma-50sync.firmware", /* Asynchronous sampling */
+ "asix-sigma-100.firmware", /* 100 MHz */
+ "asix-sigma-200.firmware", /* 200 MHz */
+ "asix-sigma-phasor.firmware", /* Frequency counter */
+};
+
+static int sigma_read(void* buf, size_t size)
{
int ret;
return 1;
}
-static int hw_opendev(int device_index)
+static int upload_firmware(int firmware_idx)
{
int ret;
unsigned char *buf;
unsigned char pins;
size_t buf_size;
- struct sigrok_device_instance *sdi;
unsigned char result[32];
+ char firmware_file[64];
/* Make sure it's an ASIX SIGMA. */
if ((ret = ftdi_usb_open_desc(&ftdic,
break;
}
- /* Prepare firmware. */
- if (-1 == bin2bitbang(FIRMWARE, &buf, &buf_size)) {
+ /* Prepare firmware */
+ snprintf(firmware_file, sizeof(firmware_file), "%s/%s", FIRMWARE_DIR,
+ firmware_files[firmware_idx]);
+
+ if (-1 == bin2bitbang(firmware_file, &buf, &buf_size)) {
g_warning("An error occured while reading the firmware: %s",
FIRMWARE);
return SIGROK_ERR;
g_free(buf);
if ((ret = ftdi_set_bitmode(&ftdic, 0x00, BITMODE_RESET)) < 0) {
- g_warning("ftdi_set_bitmode failed: %s",
+ g_warning("ftdi_set_bitmode failed: %s",
ftdi_get_error_string(&ftdic));
return SIGROK_ERR;
}
return SIGROK_ERR;
}
- /* Works like a charm... */
+ cur_firmware = firmware_idx;
+
+ return SIGROK_OK;
+}
+
+static int hw_opendev(int device_index)
+{
+ struct sigrok_device_instance *sdi;
+ int ret;
+
+ /* Make sure it's an ASIX SIGMA */
+ if ((ret = ftdi_usb_open_desc(&ftdic,
+ USB_VENDOR, USB_PRODUCT, USB_DESCRIPTION, NULL)) < 0) {
+
+ g_warning("ftdi_usb_open failed: %s",
+ ftdi_get_error_string(&ftdic));
+
+ return 0;
+ }
if (!(sdi = get_sigrok_device_instance(device_instances, device_index)))
return SIGROK_ERR;
sdi->status = ST_ACTIVE;
+ return SIGROK_OK;
+}
+
+static int set_samplerate(struct sigrok_device_instance *sdi, uint64_t samplerate)
+{
+ int i;
+
+ sdi = sdi;
+
+ for (i = 0; supported_samplerates[i]; i++) {
+ if (supported_samplerates[i] == samplerate)
+ break;
+ }
+ if (supported_samplerates[i] == 0)
+ return SIGROK_ERR_SAMPLERATE;
+
+ cur_samplerate = samplerate;
+
+ upload_firmware(3);
+
g_message("Firmware uploaded");
return SIGROK_OK;
{
struct sigrok_device_instance *sdi;
int ret;
- uint64_t *tmp_u64;
+
+ fprintf(stderr, "Set config: %d\n", capability);
if (!(sdi = get_sigrok_device_instance(device_instances, device_index)))
return SIGROK_ERR;
if (capability == HWCAP_SAMPLERATE) {
- tmp_u64 = (uint64_t *) value;
- /* Only 200 MHz implemented */
- ret = SIGROK_OK;
+ ret = set_samplerate(sdi, *(uint64_t*) value);
} else if (capability == HWCAP_PROBECONFIG) {
ret = SIGROK_OK;
} else if (capability == HWCAP_LIMIT_MSEC) {