X-Git-Url: http://sigrok.org/gitweb/?a=blobdiff_plain;f=hardware%2Fasix-sigma%2Fasix-sigma.c;h=723b2445f454a77cd7b1d4772d60b54a985996f8;hb=c37d2b1ba12b62d63590509879bf58adf842896d;hp=e33b5b7959242376ed2c7573867303cd488d4e29;hpb=340cfac0f0629aa3ee84a0a4db53381d04079fe3;p=libsigrok.git diff --git a/hardware/asix-sigma/asix-sigma.c b/hardware/asix-sigma/asix-sigma.c index e33b5b79..723b2445 100644 --- a/hardware/asix-sigma/asix-sigma.c +++ b/hardware/asix-sigma/asix-sigma.c @@ -29,8 +29,8 @@ #include #include #include -#include -#include +#include "sigrok.h" +#include "sigrok-internal.h" #include "asix-sigma.h" #define USB_VENDOR 0xa600 @@ -40,6 +40,7 @@ #define USB_MODEL_NAME "SIGMA" #define USB_MODEL_VERSION "" #define TRIGGER_TYPES "rf10" +#define NUM_PROBES 16 static GSList *device_instances = NULL; @@ -57,6 +58,26 @@ static uint64_t supported_samplerates[] = { 0, }; +static const char *probe_names[NUM_PROBES + 1] = { + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + "10", + "11", + "12", + "13", + "14", + "15", + NULL, +}; + static struct sr_samplerates samplerates = { SR_KHZ(200), SR_MHZ(200), @@ -98,7 +119,7 @@ static const char *firmware_files[] = { "asix-sigma-phasor.fw", /* Frequency counter */ }; -static void hw_stop_acquisition(int device_index, gpointer session_device_id); +static void hw_stop_acquisition(int device_index, gpointer session_data); static int sigma_read(void *buf, size_t size, struct sigma *sigma) { @@ -400,7 +421,7 @@ static int hw_init(const char *deviceinfo) struct sigma *sigma; /* Avoid compiler warnings. */ - deviceinfo = deviceinfo; + (void)deviceinfo; if (!(sigma = g_try_malloc(sizeof(struct sigma)))) { sr_err("sigma: %s: sigma malloc failed", __func__); @@ -415,6 +436,7 @@ static int hw_init(const char *deviceinfo) goto free; sigma->cur_samplerate = 0; + sigma->period_ps = 0; sigma->limit_msec = 0; sigma->cur_firmware = -1; sigma->num_probes = 0; @@ -585,6 +607,7 @@ static int set_samplerate(struct sr_device_instance *sdi, } sigma->cur_samplerate = samplerate; + sigma->period_ps = 1000000000000 / samplerate; sigma->samples_per_event = 16 / sigma->num_probes; sigma->state.state = SIGMA_IDLE; @@ -722,7 +745,7 @@ static void *hw_get_device_info(int device_index, int device_info_id) void *info = NULL; if (!(sdi = sr_get_device_instance(device_instances, device_index))) { - fprintf(stderr, "It's NULL.\n"); + sr_err("It's NULL.\n"); return NULL; } @@ -733,7 +756,10 @@ static void *hw_get_device_info(int device_index, int device_info_id) info = sdi; break; case SR_DI_NUM_PROBES: - info = GINT_TO_POINTER(16); + info = GINT_TO_POINTER(NUM_PROBES); + break; + case SR_DI_PROBE_NAMES: + info = probe_names; break; case SR_DI_SAMPLERATES: info = &samplerates; @@ -841,13 +867,14 @@ static int get_trigger_offset(uint16_t *samples, uint16_t last_sample, */ static int decode_chunk_ts(uint8_t *buf, uint16_t *lastts, uint16_t *lastsample, int triggerpos, - uint16_t limit_chunk, void *user_data) + uint16_t limit_chunk, void *session_data) { - struct sr_device_instance *sdi = user_data; + struct sr_device_instance *sdi = session_data; struct sigma *sigma = sdi->priv; uint16_t tsdiff, ts; uint16_t samples[65536 * sigma->samples_per_event]; struct sr_datafeed_packet packet; + struct sr_datafeed_logic logic; int i, j, k, l, numpad, tosend; size_t n = 0, sent = 0; int clustersize = EVENTS_PER_CLUSTER * sigma->samples_per_event; @@ -892,9 +919,13 @@ static int decode_chunk_ts(uint8_t *buf, uint16_t *lastts, tosend = MIN(2048, n - sent); packet.type = SR_DF_LOGIC; - packet.length = tosend * sizeof(uint16_t); - packet.unitsize = 2; - packet.payload = samples + sent; + /* TODO: fill in timeoffset and duration */ + packet.timeoffset = 0; + packet.duration = 0; + packet.payload = &logic; + logic.length = tosend * sizeof(uint16_t); + logic.unitsize = 2; + logic.data = samples + sent; sr_session_bus(sigma->session_id, &packet); sent += tosend; @@ -936,9 +967,13 @@ static int decode_chunk_ts(uint8_t *buf, uint16_t *lastts, if (tosend > 0) { packet.type = SR_DF_LOGIC; - packet.length = tosend * sizeof(uint16_t); - packet.unitsize = 2; - packet.payload = samples; + /* TODO: fill in timeoffset and duration */ + packet.timeoffset = 0; + packet.duration = 0; + packet.payload = &logic; + logic.length = tosend * sizeof(uint16_t); + logic.unitsize = 2; + logic.data = samples; sr_session_bus(sigma->session_id, &packet); sent += tosend; @@ -947,8 +982,9 @@ static int decode_chunk_ts(uint8_t *buf, uint16_t *lastts, /* Only send trigger if explicitly enabled. */ if (sigma->use_triggers) { packet.type = SR_DF_TRIGGER; - packet.length = 0; - packet.payload = 0; + /* TODO: fill in timeoffset only */ + packet.timeoffset = 0; + packet.duration = 0; sr_session_bus(sigma->session_id, &packet); } } @@ -958,9 +994,13 @@ static int decode_chunk_ts(uint8_t *buf, uint16_t *lastts, if (tosend > 0) { packet.type = SR_DF_LOGIC; - packet.length = tosend * sizeof(uint16_t); - packet.unitsize = 2; - packet.payload = samples + sent; + /* TODO: fill in timeoffset and duration */ + packet.timeoffset = 0; + packet.duration = 0; + packet.payload = &logic; + logic.length = tosend * sizeof(uint16_t); + logic.unitsize = 2; + logic.data = samples + sent; sr_session_bus(sigma->session_id, &packet); } @@ -970,9 +1010,9 @@ static int decode_chunk_ts(uint8_t *buf, uint16_t *lastts, return SR_OK; } -static int receive_data(int fd, int revents, void *user_data) +static int receive_data(int fd, int revents, void *session_data) { - struct sr_device_instance *sdi = user_data; + struct sr_device_instance *sdi = session_data; struct sigma *sigma = sdi->priv; struct sr_datafeed_packet packet; const int chunks_per_read = 32; @@ -981,8 +1021,9 @@ static int receive_data(int fd, int revents, void *user_data) uint64_t running_msec; struct timeval tv; - fd = fd; - revents = revents; + /* Avoid compiler warnings. */ + (void)fd; + (void)revents; numchunks = (sigma->state.stoppos + 511) / 512; @@ -999,7 +1040,7 @@ static int receive_data(int fd, int revents, void *user_data) if (running_msec < sigma->limit_msec && numchunks < 32767) return FALSE; - hw_stop_acquisition(sdi->index, user_data); + hw_stop_acquisition(sdi->index, session_data); return FALSE; @@ -1007,7 +1048,6 @@ static int receive_data(int fd, int revents, void *user_data) if (sigma->state.chunks_downloaded >= numchunks) { /* End of samples. */ packet.type = SR_DF_END; - packet.length = 0; sr_session_bus(sigma->session_id, &packet); sigma->state.state = SIGMA_IDLE; @@ -1023,6 +1063,8 @@ static int receive_data(int fd, int revents, void *user_data) bufsz = sigma_read_dram(sigma->state.chunks_downloaded, newchunks, buf, sigma); + /* TODO: Check bufsz. For now, just avoid compiler warnings. */ + (void)bufsz; /* Find first ts. */ if (sigma->state.chunks_downloaded == 0) { @@ -1046,12 +1088,12 @@ static int receive_data(int fd, int revents, void *user_data) &sigma->state.lastts, &sigma->state.lastsample, sigma->state.triggerpos & 0x1ff, - limit_chunk, user_data); + limit_chunk, session_data); else decode_chunk_ts(buf + (i * CHUNK_SIZE), &sigma->state.lastts, &sigma->state.lastsample, - -1, limit_chunk, user_data); + -1, limit_chunk, session_data); ++sigma->state.chunks_downloaded; } @@ -1216,7 +1258,7 @@ static int build_basic_trigger(struct triggerlut *lut, struct sigma *sigma) return SR_OK; } -static int hw_start_acquisition(int device_index, gpointer session_device_id) +static int hw_start_acquisition(int device_index, gpointer session_data) { struct sr_device_instance *sdi; struct sigma *sigma; @@ -1228,7 +1270,8 @@ static int hw_start_acquisition(int device_index, gpointer session_device_id) struct triggerinout triggerinout_conf; struct triggerlut lut; - session_device_id = session_device_id; + /* Avoid compiler warnings. */ + (void)session_data; if (!(sdi = sr_get_device_instance(device_instances, device_index))) return SR_ERR; @@ -1313,19 +1356,17 @@ static int hw_start_acquisition(int device_index, gpointer session_device_id) gettimeofday(&sigma->start_tv, 0); sigma_set_register(WRITE_MODE, 0x0d, sigma); - sigma->session_id = session_device_id; + sigma->session_id = session_data; /* Send header packet to the session bus. */ packet.type = SR_DF_HEADER; - packet.length = sizeof(struct sr_datafeed_header); packet.payload = &header; header.feed_version = 1; gettimeofday(&header.starttime, NULL); header.samplerate = sigma->cur_samplerate; - header.protocol_id = SR_PROTO_RAW; header.num_logic_probes = sigma->num_probes; header.num_analog_probes = 0; - sr_session_bus(session_device_id, &packet); + sr_session_bus(session_data, &packet); /* Add capture source. */ sr_source_add(0, G_IO_IN, 10, receive_data, sdi); @@ -1335,7 +1376,7 @@ static int hw_start_acquisition(int device_index, gpointer session_device_id) return SR_OK; } -static void hw_stop_acquisition(int device_index, gpointer session_device_id) +static void hw_stop_acquisition(int device_index, gpointer session_data) { struct sr_device_instance *sdi; struct sigma *sigma; @@ -1346,7 +1387,8 @@ static void hw_stop_acquisition(int device_index, gpointer session_device_id) sigma = sdi->priv; - session_device_id = session_device_id; + /* Avoid compiler warnings. */ + (void)session_data; /* Stop acquisition. */ sigma_set_register(WRITE_MODE, 0x11, sigma);