zeroplus: Split into api.c and protocol.c.

This commit is contained in:
Uwe Hermann 2013-02-07 22:09:39 +01:00
parent c7142604a2
commit 58c5f2ed17
4 changed files with 167 additions and 140 deletions

View File

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

View File

@ -17,16 +17,6 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/time.h>
#include <inttypes.h>
#include <glib.h>
#include <libusb.h>
#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)
{

View File

@ -0,0 +1,126 @@
/*
* This file is part of the sigrok project.
*
* Copyright (C) 2010-2012 Bert Vermeulen <bert@biot.com>
*
* 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 <http://www.gnu.org/licenses/>.
*/
#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);
}

View File

@ -21,6 +21,13 @@
#ifndef LIBSIGROK_HARDWARE_ZEROPLUS_LOGIC_CUBE_PROTOCOL_H
#define LIBSIGROK_HARDWARE_ZEROPLUS_LOGIC_CUBE_PROTOCOL_H
#include <stdint.h>
#include <glib.h>
#include <libusb.h>
#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