diff --git a/src/hardware/ikalogic-scanaquad/api.c b/src/hardware/ikalogic-scanaquad/api.c index de2c9a38..41bffb21 100644 --- a/src/hardware/ikalogic-scanaquad/api.c +++ b/src/hardware/ikalogic-scanaquad/api.c @@ -44,39 +44,33 @@ static const uint32_t devopts[] = { SR_CONF_LOGIC_THRESHOLD | SR_CONF_GET | SR_CONF_SET | SR_CONF_LIST, SR_CONF_LOGIC_THRESHOLD_CUSTOM | SR_CONF_GET | SR_CONF_SET, - /* "frame is a single capture" -> don't use here, not applicable */ - /*SR_CONF_LIMIT_FRAMES | SR_CONF_GET | SR_CONF_SET,*/ + /*SR_CONF_TRIGGER_MATCH | SR_CONF_LIST,*/ - /* - * TODO: - * * CAPTURE_RATIO: units?: int 0..100 - * * LIMIT_MSEC: units?: milliseconds - * * LIMIT_SAMPLES: units?: samples - * * SAMPLERATE: "overdrive" to 200 MHz on SQ50 possible??? yes! - * - * * VOLTAGE_THRESHOLD vs LOGIC_THRESHOLD? LOGIC_THRESHOLD_CUSTOM: ??? - * * VOLTAGE_THRESHOLD: 2 double values, custom selection? - * * LOGIC_THRESHOLD: selection of (max value) voltages - * * LOGIC_THRESHOLD_CUSTOM: custom ^ + /* list of TODO stuff: + * * VOLTAGE_THRESHOLD vs LOGIC_THRESHOLD? LOGIC_THRESHOLD_CUSTOM? + * * VOLTAGE_THRESHOLD: 2 double values (min, max) with a slider selection GUI + * * LOGIC_THRESHOLD: selection of (max, not thresh value) voltages + * * LOGIC_THRESHOLD_CUSTOM: custom ^, so kinda boils down to VOLTAGE_THRESHOLD? * * see kingst-la2016/api.c - * * VOLTAGE, VOLTAGE_TARGET: ??? - * * not applicable here - * * except maybe VOLTAGE_TARGET is, for PATTERN_MODE? - * * BUFFERSIZE: ??? - * * DATALOG: ??? - * * PATTERN_MODE: ??? - * * string of a pattern name?? so uuuh, fuck (-> filename of blob to upload?) - * * OUTPUT_FREQUENCY: ??? (used in PATTERN_MODE instead of SAMPLERATE?) - * * not applicable here, for analog stuff only - * * CONN: ??? - * * if you need to specify eg. a serial port. not really applicable here - * (need to scan by vid:pid) + * * currently implemnted as all of them, pulseview gives a simple slider + * without value indication, which is not that practical to use... + * LOGIC_THRESHOLD(_CUSTOM) seems to give no UI? * - * * trigger stuff aaa (TRIGGER_SOURCE, TRIGGER_MATCH, TRIGGER_LEVEL, TRIGGER_PATTERN) - * * TRIGGER_SOURCE: probably not useful - * * TRIGGER_MATCH: on what can we match? (hi, lo, rise, fall) -> LIST only - * * TRIGGER_LEVEL: seems to be an analog thing, not applicable here + * * BUFFERSIZE, DATALOG, PATTERN_MODE: should this be used? + * + * * trigger stuff: + * * TRIGGER_MATCH: uncomment when TRIGGER_PATTERN is implemented * * TRIGGER_PATTERN: freeform string + * * see asix-sigma/protocol.c:1603 , it has some proposed formats, + * however, these aren't sufficient here as the SQ series also allows + * varying pulse widths for each trigger step... + * * TRIGGER_LEVEL, TRIGGER_SOURCE: not applicable here + * + * * the SQ50 accepts 200 MHz samplerate and a buffer size longer than it + * has available physical backing for, so it's not unlikely that modding + * it to have more memory is possible. so maybe memory and frequency + * option shouldn't be strictly checked? + * see also: https://git.lain.faith/BLAHAJ/sq50-re/wiki/Hardware-info */ }; @@ -89,18 +83,25 @@ static const uint64_t samplerates[] = { * blob makes it look like it can */ /* also, looks like the SQ50 can totally do 100 and 200 MHz... */ SR_MHZ(200), SR_MHZ(100), - SR_MHZ(50), SR_MHZ(25), SR_MHZ(10), SR_MHZ(5), SR_MHZ(1), + SR_MHZ( 50), SR_MHZ( 25), SR_MHZ( 10), SR_MHZ( 5), SR_MHZ( 1), SR_KHZ(500), SR_KHZ(250), SR_KHZ(100), SR_KHZ(50), SR_KHZ(10) }; static const char *thresholds[] = { - "1.8V", // 0x46 0x1e | 1.8 0.8 ~44% - "2.8V", // 0x6e 0x2c | 2.8 1.1 ~40% - "3.3V", // 0x81 0x46 | 3.3 1.8 ~55% - "3.6V", // 0x8d 0x4f | 3.6 2.0 ~55% - "5V" , // 0xc4 0x72 | 5.0 2.9 ~58% - "5VTTL",// 0xc3 0x3b | 5.0 1.5 - "User" // VOLTAGE_THRESHOLD == LOGIC_THRESHOLD_CUSTOM (?) + "1.8V", /* 0x46 0x1e | 1.8 0.8 ~44% */ + "2.8V", /* 0x6e 0x2c | 2.8 1.1 ~40% */ + "3.3V", /* 0x81 0x46 | 3.3 1.8 ~55% */ + "3.6V", /* 0x8d 0x4f | 3.6 2.0 ~55% */ + "5V" , /* 0xc4 0x72 | 5.0 2.9 ~58% */ + "5VTTL",/* 0xc3 0x3b | 5.0 1.5 */ + "User" /* VOLTAGE_THRESHOLD == LOGIC_THRESHOLD_CUSTOM (?) */ +}; + +static const int matches[] = { + SR_TRIGGER_ZERO, + SR_TRIGGER_ONE, + SR_TRIGGER_RISING, + SR_TRIGGER_FALLING, }; static uint64_t dc_samples_to_msec(struct dev_context *dc, uint64_t samples) @@ -370,15 +371,18 @@ static int config_set(uint32_t key, GVariant *data, dc->samplerate = g_variant_get_uint64(data); break; case SR_CONF_LIMIT_MSEC: - /*printf("msec = %lu\n", g_variant_get_uint64(data));*/ dc->limit_samples = dc_msec_to_samples(dc, g_variant_get_uint64(data)); + /* TODO: make this check optional */ + if (dc->limit_samples > dc->memsize_max * 4) + dc->limit_samples = dc->memsize_max * 4; break; case SR_CONF_LIMIT_SAMPLES: - /*printf("samples = %lu\n", g_variant_get_uint64(data));*/ dc->limit_samples = g_variant_get_uint64(data); + /* TODO: make this check optional */ + if (dc->limit_samples > dc->memsize_max * 4) + dc->limit_samples = dc->memsize_max * 4; break; case SR_CONF_CAPTURE_RATIO: - /*printf("ratio = %lu\n", g_variant_get_uint64(data));*/ dc->capture_ratio = g_variant_get_uint64(data); break; case SR_CONF_VOLTAGE_THRESHOLD: @@ -389,12 +393,11 @@ static int config_set(uint32_t key, GVariant *data, /* in the LOGIC_THRESHOLD_CUSTOM case: see 'if' stmt before switch */ dc->voltage_idx = 6; /* user */ dc->voltage.thresh = (int)(volt * 39.2); - /* emulate vendor software values in a shitty way. not 100% exact but + /* emulate vendor software values in a naive way. not 100% exact but * oh well. */ dc->voltage.level = (dc->voltage.thresh < 0x30) ? (int)(volt * 39.2 / 0.40) : (int)(volt * 39.2 / 0.55); - /*printf("voltage: %02x %02x\n", dc->voltage.level, dc->voltage.thresh);*/ break; default: sr_err("%s no conf key %u", __func__, key); @@ -421,7 +424,10 @@ static int config_list(uint32_t key, GVariant **data, *data = std_gvar_min_max_step_thresholds(0.8, 2.9, 0.1); break; case SR_CONF_LOGIC_THRESHOLD: - *data = g_variant_new_strv(thresholds, ARRAY_SIZE(thresholds)); + *data = g_variant_new_strv(ARRAY_AND_SIZE(thresholds)); + break; + case SR_CONF_TRIGGER_MATCH: + *data = std_gvar_array_i32(ARRAY_AND_SIZE(matches)); break; default: sr_err("%s no conf key %u", __func__, key); diff --git a/src/hardware/ikalogic-scanaquad/protocol.c b/src/hardware/ikalogic-scanaquad/protocol.c index fc002106..f39ebe1e 100644 --- a/src/hardware/ikalogic-scanaquad/protocol.c +++ b/src/hardware/ikalogic-scanaquad/protocol.c @@ -30,11 +30,11 @@ SR_PRIV struct dev_context *sq_new(struct ftdi_context *ft) dc = (struct dev_context *)g_malloc0(sizeof(struct dev_context)); dc->ft = ft; - /* some sensible defaults */ + /* some sensible defaults (mostly the vendor software defaults) */ dc->samplerate = SR_MHZ(25); - dc->capture_ratio = 10; + dc->capture_ratio = 10; /* 10% in */ dc->voltage.level = 0x81; /* 3.3v */ - dc->voltage.thresh = 0x46; /* 1.8v (3.3v cmos thresh- */ + dc->voltage.thresh = 0x46; /* 1.8v (3.3v cmos thresh) */ dc->voltage_idx = 2; /* "3.3V" */ return dc; @@ -589,9 +589,9 @@ SR_PRIV int scanaquad_apply_current_settings(struct dev_context *dc, gboolean pa /* TODO: more than just capture mode */ samplim = dc->limit_samples / 4; - /* TODO: switch to override this check */ - ms1 = (samplim > dc->memsize_max) ? dc->memsize_max : samplim; - ms2 = (samplim > dc->memsize_max) ? dc->memsize_max : samplim; + /* sample limit vs LA physical memory size check is done in api.c */ + ms1 = samplim; + ms2 = samplim; ms3 = (uint32_t)(dc->memsize_max * (1 - dc->capture_ratio * 0.01)); sett.memsetting1[0] = (ms1>> 0) & 0xff; @@ -623,6 +623,7 @@ SR_PRIV int scanaquad_apply_current_triggers(struct dev_context *dc) } +/* finally, we can implement the higher-level functions. */ SR_PRIV int scanaquad_acquisition_start(struct dev_context *dc) @@ -680,11 +681,6 @@ static void scanaquad_unpack_samples(uint8_t *rdata, size_t totalunpackbytes) rdata[i*2-1] = (rdata[i-1] & 0xf0) >> 4; rdata[i*2-2] = (rdata[i-1] & 0x0f) >> 0; } - - /*for (i = 0; i < totalunpackbytes; ++i) { - printf("%01x ", rdata[i]); - if ((i & 15) == 15) printf("\n"); - }*/ } SR_PRIV int scanaquad_acquisition_finish(struct sr_dev_inst *sdi, struct dev_context *dc) @@ -736,6 +732,7 @@ SR_PRIV int scanaquad_acquisition_finish(struct sr_dev_inst *sdi, struct dev_con scanaquad_unpack_samples(rdata, nbytes * 2); + /* 3 packets, for trigger indicator */ logic1.length = trig_instant; logic1.unitsize = 1; logic1.data = rdata; @@ -757,7 +754,7 @@ SR_PRIV int scanaquad_acquisition_finish(struct sr_dev_inst *sdi, struct dev_con sr_session_send(sdi, &packet2); sr_session_send(sdi, &packet3); - /* I hope this is fine to do?? */ + /* i hope this is fine to do? seems like it does work just fine with pulseview */ g_free(rdata); return SR_OK; @@ -797,8 +794,6 @@ SR_PRIV int scanaquad_receive_data(int fd, int revents, void *cb_data) (void)fd; (void)revents; - /*sr_spew("receive data");*/ - if (!(sdi = cb_data)) return TRUE; if (!(dc = sdi->priv)) return TRUE; if (!dc->ft) return TRUE;