diff --git a/hardware/zeroplus-logic-cube/Makefile.am b/hardware/zeroplus-logic-cube/Makefile.am
index 92313ec3..6e2e2633 100644
--- a/hardware/zeroplus-logic-cube/Makefile.am
+++ b/hardware/zeroplus-logic-cube/Makefile.am
@@ -23,11 +23,13 @@ if LA_ZEROPLUS_LOGIC_CUBE
noinst_LTLIBRARIES = libsigrokhwzeroplus.la
libsigrokhwzeroplus_la_SOURCES = \
+ api.c \
+ protocol.c \
+ protocol.h \
analyzer.c \
analyzer.h \
gl_usb.c \
- gl_usb.h \
- zeroplus.c
+ gl_usb.h
libsigrokhwzeroplus_la_CFLAGS = \
-I$(top_srcdir)
diff --git a/hardware/zeroplus-logic-cube/zeroplus.c b/hardware/zeroplus-logic-cube/api.c
similarity index 81%
rename from hardware/zeroplus-logic-cube/zeroplus.c
rename to hardware/zeroplus-logic-cube/api.c
index 4d3df029..7fbe25d8 100644
--- a/hardware/zeroplus-logic-cube/zeroplus.c
+++ b/hardware/zeroplus-logic-cube/api.c
@@ -17,16 +17,6 @@
* along with this program. If not, see .
*/
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include "libsigrok.h"
-#include "libsigrok-internal.h"
-#include "analyzer.h"
#include "protocol.h"
#define USB_VENDOR 0x0c12
@@ -104,7 +94,7 @@ static struct sr_dev_driver *di = &zeroplus_logic_cube_driver_info;
* TODO: We shouldn't support 150MHz and 200MHz on devices that don't go up
* that high.
*/
-static const uint64_t supported_samplerates[] = {
+const uint64_t zp_supported_samplerates[] = {
SR_HZ(100),
SR_HZ(500),
SR_KHZ(1),
@@ -130,44 +120,11 @@ static const struct sr_samplerates samplerates = {
.low = 0,
.high = 0,
.step = 0,
- .list = supported_samplerates,
-};
-
-/* Private, per-device-instance driver context. */
-struct dev_context {
- uint64_t cur_samplerate;
- uint64_t max_samplerate;
- uint64_t limit_samples;
- int num_channels; /* TODO: This isn't initialized before it's needed :( */
- int memory_size;
- unsigned int max_memory_size;
- //uint8_t probe_mask;
- //uint8_t trigger_mask[NUM_TRIGGER_STAGES];
- //uint8_t trigger_value[NUM_TRIGGER_STAGES];
- // uint8_t trigger_buffer[NUM_TRIGGER_STAGES];
- int trigger;
- unsigned int capture_ratio;
-
- /* TODO: this belongs in the device instance */
- struct sr_usb_dev_inst *usb;
+ .list = zp_supported_samplerates,
};
static int hw_dev_close(struct sr_dev_inst *sdi);
-static unsigned int get_memory_size(int type)
-{
- if (type == MEMORY_SIZE_8K)
- return 8 * 1024;
- else if (type == MEMORY_SIZE_64K)
- return 64 * 1024;
- else if (type == MEMORY_SIZE_128K)
- return 128 * 1024;
- else if (type == MEMORY_SIZE_512K)
- return 512 * 1024;
- else
- return 0;
-}
-
#if 0
static int configure_probes(const struct sr_dev_inst *sdi)
{
@@ -532,69 +489,6 @@ static int config_get(int id, const void **data, const struct sr_dev_inst *sdi)
return SR_OK;
}
-static int set_samplerate(struct dev_context *devc, uint64_t samplerate)
-{
- int i;
-
- for (i = 0; supported_samplerates[i]; i++)
- if (samplerate == supported_samplerates[i])
- break;
-
- if (!supported_samplerates[i] || samplerate > devc->max_samplerate) {
- sr_err("Unsupported samplerate.");
- return SR_ERR_ARG;
- }
-
- sr_info("Setting samplerate to %" PRIu64 "Hz.", samplerate);
-
- if (samplerate >= SR_MHZ(1))
- analyzer_set_freq(samplerate / SR_MHZ(1), FREQ_SCALE_MHZ);
- else if (samplerate >= SR_KHZ(1))
- analyzer_set_freq(samplerate / SR_KHZ(1), FREQ_SCALE_KHZ);
- else
- analyzer_set_freq(samplerate, FREQ_SCALE_HZ);
-
- devc->cur_samplerate = samplerate;
-
- return SR_OK;
-}
-
-static int set_limit_samples(struct dev_context *devc, uint64_t samples)
-{
- devc->limit_samples = samples;
-
- if (samples <= 2 * 1024)
- devc->memory_size = MEMORY_SIZE_8K;
- else if (samples <= 16 * 1024)
- devc->memory_size = MEMORY_SIZE_64K;
- else if (samples <= 32 * 1024 ||
- devc->max_memory_size <= 32 * 1024)
- devc->memory_size = MEMORY_SIZE_128K;
- else
- devc->memory_size = MEMORY_SIZE_512K;
-
- sr_info("Setting memory size to %dK.",
- get_memory_size(devc->memory_size) / 1024);
-
- analyzer_set_memory_size(devc->memory_size);
-
- return SR_OK;
-}
-
-static int set_capture_ratio(struct dev_context *devc, uint64_t ratio)
-{
- if (ratio > 100) {
- sr_err("Invalid capture ratio: %" PRIu64 ".", ratio);
- return SR_ERR_ARG;
- }
-
- devc->capture_ratio = ratio;
-
- sr_info("Setting capture ratio to %d%%.", devc->capture_ratio);
-
- return SR_OK;
-}
-
static int config_set(int id, const void *value, const struct sr_dev_inst *sdi)
{
struct dev_context *devc;
@@ -611,7 +505,7 @@ static int config_set(int id, const void *value, const struct sr_dev_inst *sdi)
switch (id) {
case SR_CONF_SAMPLERATE:
- return set_samplerate(devc, *(const uint64_t *)value);
+ return zp_set_samplerate(devc, *(const uint64_t *)value);
case SR_CONF_LIMIT_SAMPLES:
return set_limit_samples(devc, *(const uint64_t *)value);
case SR_CONF_CAPTURE_RATIO:
@@ -642,35 +536,6 @@ static int config_list(int key, const void **data, const struct sr_dev_inst *sdi
return SR_OK;
}
-static void set_triggerbar(struct dev_context *devc)
-{
- unsigned int ramsize;
- unsigned int n;
- unsigned int triggerbar;
-
- ramsize = get_memory_size(devc->memory_size) / 4;
- if (devc->trigger) {
- n = ramsize;
- if (devc->max_memory_size < n)
- n = devc->max_memory_size;
- if (devc->limit_samples < n)
- n = devc->limit_samples;
- n = n * devc->capture_ratio / 100;
- if (n > ramsize - 8)
- triggerbar = ramsize - 8;
- else
- triggerbar = n;
- } else {
- triggerbar = 0;
- }
- analyzer_set_triggerbar_address(triggerbar);
- analyzer_set_ramsize_trigger_address(ramsize - triggerbar);
-
- sr_dbg("triggerbar_address = %d(0x%x)", triggerbar, triggerbar);
- sr_dbg("ramsize_triggerbar_address = %d(0x%x)",
- ramsize - triggerbar, ramsize - triggerbar);
-}
-
static int hw_dev_acquisition_start(const struct sr_dev_inst *sdi,
void *cb_data)
{
diff --git a/hardware/zeroplus-logic-cube/protocol.c b/hardware/zeroplus-logic-cube/protocol.c
new file mode 100644
index 00000000..30296da1
--- /dev/null
+++ b/hardware/zeroplus-logic-cube/protocol.c
@@ -0,0 +1,126 @@
+/*
+ * This file is part of the sigrok project.
+ *
+ * Copyright (C) 2010-2012 Bert Vermeulen
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+#include "protocol.h"
+
+SR_PRIV unsigned int get_memory_size(int type)
+{
+ if (type == MEMORY_SIZE_8K)
+ return 8 * 1024;
+ else if (type == MEMORY_SIZE_64K)
+ return 64 * 1024;
+ else if (type == MEMORY_SIZE_128K)
+ return 128 * 1024;
+ else if (type == MEMORY_SIZE_512K)
+ return 512 * 1024;
+ else
+ return 0;
+}
+
+SR_PRIV int zp_set_samplerate(struct dev_context *devc, uint64_t samplerate)
+{
+ int i;
+
+ for (i = 0; zp_supported_samplerates[i]; i++)
+ if (samplerate == zp_supported_samplerates[i])
+ break;
+
+ if (!zp_supported_samplerates[i] || samplerate > devc->max_samplerate) {
+ sr_err("Unsupported samplerate.");
+ return SR_ERR_ARG;
+ }
+
+ sr_info("Setting samplerate to %" PRIu64 "Hz.", samplerate);
+
+ if (samplerate >= SR_MHZ(1))
+ analyzer_set_freq(samplerate / SR_MHZ(1), FREQ_SCALE_MHZ);
+ else if (samplerate >= SR_KHZ(1))
+ analyzer_set_freq(samplerate / SR_KHZ(1), FREQ_SCALE_KHZ);
+ else
+ analyzer_set_freq(samplerate, FREQ_SCALE_HZ);
+
+ devc->cur_samplerate = samplerate;
+
+ return SR_OK;
+}
+
+SR_PRIV int set_limit_samples(struct dev_context *devc, uint64_t samples)
+{
+ devc->limit_samples = samples;
+
+ if (samples <= 2 * 1024)
+ devc->memory_size = MEMORY_SIZE_8K;
+ else if (samples <= 16 * 1024)
+ devc->memory_size = MEMORY_SIZE_64K;
+ else if (samples <= 32 * 1024 ||
+ devc->max_memory_size <= 32 * 1024)
+ devc->memory_size = MEMORY_SIZE_128K;
+ else
+ devc->memory_size = MEMORY_SIZE_512K;
+
+ sr_info("Setting memory size to %dK.",
+ get_memory_size(devc->memory_size) / 1024);
+
+ analyzer_set_memory_size(devc->memory_size);
+
+ return SR_OK;
+}
+
+SR_PRIV int set_capture_ratio(struct dev_context *devc, uint64_t ratio)
+{
+ if (ratio > 100) {
+ sr_err("Invalid capture ratio: %" PRIu64 ".", ratio);
+ return SR_ERR_ARG;
+ }
+
+ devc->capture_ratio = ratio;
+
+ sr_info("Setting capture ratio to %d%%.", devc->capture_ratio);
+
+ return SR_OK;
+}
+
+SR_PRIV void set_triggerbar(struct dev_context *devc)
+{
+ unsigned int ramsize;
+ unsigned int n;
+ unsigned int triggerbar;
+
+ ramsize = get_memory_size(devc->memory_size) / 4;
+ if (devc->trigger) {
+ n = ramsize;
+ if (devc->max_memory_size < n)
+ n = devc->max_memory_size;
+ if (devc->limit_samples < n)
+ n = devc->limit_samples;
+ n = n * devc->capture_ratio / 100;
+ if (n > ramsize - 8)
+ triggerbar = ramsize - 8;
+ else
+ triggerbar = n;
+ } else {
+ triggerbar = 0;
+ }
+ analyzer_set_triggerbar_address(triggerbar);
+ analyzer_set_ramsize_trigger_address(ramsize - triggerbar);
+
+ sr_dbg("triggerbar_address = %d(0x%x)", triggerbar, triggerbar);
+ sr_dbg("ramsize_triggerbar_address = %d(0x%x)",
+ ramsize - triggerbar, ramsize - triggerbar);
+}
diff --git a/hardware/zeroplus-logic-cube/protocol.h b/hardware/zeroplus-logic-cube/protocol.h
index 9710cf30..e2c5d9e3 100644
--- a/hardware/zeroplus-logic-cube/protocol.h
+++ b/hardware/zeroplus-logic-cube/protocol.h
@@ -21,6 +21,13 @@
#ifndef LIBSIGROK_HARDWARE_ZEROPLUS_LOGIC_CUBE_PROTOCOL_H
#define LIBSIGROK_HARDWARE_ZEROPLUS_LOGIC_CUBE_PROTOCOL_H
+#include
+#include
+#include
+#include "libsigrok.h"
+#include "libsigrok-internal.h"
+#include "analyzer.h"
+
/* Message logging helpers with driver-specific prefix string. */
#define DRIVER_LOG_DOMAIN "zeroplus: "
#define sr_log(l, s, args...) sr_log(l, DRIVER_LOG_DOMAIN s, ## args)
@@ -30,4 +37,31 @@
#define sr_warn(s, args...) sr_warn(DRIVER_LOG_DOMAIN s, ## args)
#define sr_err(s, args...) sr_err(DRIVER_LOG_DOMAIN s, ## args)
+/* Private, per-device-instance driver context. */
+struct dev_context {
+ uint64_t cur_samplerate;
+ uint64_t max_samplerate;
+ uint64_t limit_samples;
+ int num_channels; /* TODO: This isn't initialized before it's needed :( */
+ int memory_size;
+ unsigned int max_memory_size;
+ //uint8_t probe_mask;
+ //uint8_t trigger_mask[NUM_TRIGGER_STAGES];
+ //uint8_t trigger_value[NUM_TRIGGER_STAGES];
+ // uint8_t trigger_buffer[NUM_TRIGGER_STAGES];
+ int trigger;
+ unsigned int capture_ratio;
+
+ /* TODO: this belongs in the device instance */
+ struct sr_usb_dev_inst *usb;
+};
+
+extern const uint64_t zp_supported_samplerates[];
+
+SR_PRIV unsigned int get_memory_size(int type);
+SR_PRIV int zp_set_samplerate(struct dev_context *devc, uint64_t samplerate);
+SR_PRIV int set_limit_samples(struct dev_context *devc, uint64_t samples);
+SR_PRIV int set_capture_ratio(struct dev_context *devc, uint64_t ratio);
+SR_PRIV void set_triggerbar(struct dev_context *devc);
+
#endif