From 58c5f2ed1785ead87d1398c28b5dbe60ba4610dd Mon Sep 17 00:00:00 2001 From: Uwe Hermann Date: Thu, 7 Feb 2013 22:09:39 +0100 Subject: [PATCH] zeroplus: Split into api.c and protocol.c. --- hardware/zeroplus-logic-cube/Makefile.am | 6 +- .../zeroplus-logic-cube/{zeroplus.c => api.c} | 141 +----------------- hardware/zeroplus-logic-cube/protocol.c | 126 ++++++++++++++++ hardware/zeroplus-logic-cube/protocol.h | 34 +++++ 4 files changed, 167 insertions(+), 140 deletions(-) rename hardware/zeroplus-logic-cube/{zeroplus.c => api.c} (81%) create mode 100644 hardware/zeroplus-logic-cube/protocol.c 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