X-Git-Url: http://sigrok.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=hardware%2Fhantek-dso%2Fapi.c;h=c5540b7458c709be3fefb522a8de1f3417e50e9e;hb=4c7aca66defecb82245d2fd8b62b3ff70049982a;hp=27f37e7f44ecc0ab29d72854f6f411c1c9c7c533;hpb=d40073113bc1c09f3924cac275791e53905bbab5;p=libsigrok.git diff --git a/hardware/hantek-dso/api.c b/hardware/hantek-dso/api.c index 27f37e7f..c5540b74 100644 --- a/hardware/hantek-dso/api.c +++ b/hardware/hantek-dso/api.c @@ -37,6 +37,9 @@ /* TODO tune this properly */ #define TICK 1 +#define NUM_TIMEBASE 10 +#define NUM_VDIV 8 + static const int32_t devopts[] = { SR_CONF_OSCILLOSCOPE, SR_CONF_LIMIT_FRAMES, @@ -49,6 +52,8 @@ static const int32_t devopts[] = { SR_CONF_FILTER, SR_CONF_VDIV, SR_CONF_COUPLING, + SR_CONF_NUM_TIMEBASE, + SR_CONF_NUM_VDIV, }; static const char *probe_names[] = { @@ -56,29 +61,38 @@ static const char *probe_names[] = { NULL, }; +static const uint64_t buffersizes_32k[] = { + 10240, 32768, +}; +static const uint64_t buffersizes_512k[] = { + 10240, 524288, +}; +static const uint64_t buffersizes_14k[] = { + 10240, 14336, +}; + static const struct dso_profile dev_profiles[] = { { 0x04b4, 0x2090, 0x04b5, 0x2090, "Hantek", "DSO-2090", + buffersizes_32k, FIRMWARE_DIR "/hantek-dso-2090.fw" }, { 0x04b4, 0x2150, 0x04b5, 0x2150, "Hantek", "DSO-2150", + buffersizes_32k, FIRMWARE_DIR "/hantek-dso-2150.fw" }, { 0x04b4, 0x2250, 0x04b5, 0x2250, "Hantek", "DSO-2250", + buffersizes_512k, FIRMWARE_DIR "/hantek-dso-2250.fw" }, { 0x04b4, 0x5200, 0x04b5, 0x5200, "Hantek", "DSO-5200", + buffersizes_14k, FIRMWARE_DIR "/hantek-dso-5200.fw" }, { 0x04b4, 0x520a, 0x04b5, 0x520a, "Hantek", "DSO-5200A", + buffersizes_512k, FIRMWARE_DIR "/hantek-dso-5200A.fw" }, - { 0, 0, 0, 0, 0, 0, 0 }, -}; - -static const uint64_t buffersizes[] = { - 10240, - 32768, - /* TODO: 65535 */ + { 0, 0, 0, 0, 0, 0, 0, 0 }, }; static const uint64_t timebases[][2] = { @@ -402,6 +416,25 @@ static int hw_cleanup(void) return SR_OK; } +static int config_get(int id, GVariant **data, const struct sr_dev_inst *sdi) +{ + + (void)sdi; + + switch (id) { + case SR_CONF_NUM_TIMEBASE: + *data = g_variant_new_int32(NUM_TIMEBASE); + break; + case SR_CONF_NUM_VDIV: + *data = g_variant_new_int32(NUM_VDIV); + break; + default: + return SR_ERR_ARG; + } + + return SR_OK; +} + static int config_set(int id, GVariant *data, const struct sr_dev_inst *sdi) { struct dev_context *devc; @@ -437,13 +470,13 @@ static int config_set(int id, GVariant *data, const struct sr_dev_inst *sdi) break; case SR_CONF_BUFFERSIZE: tmp_u64 = g_variant_get_uint64(data); - for (i = 0; buffersizes[i]; i++) { - if (buffersizes[i] == tmp_u64) { + for (i = 0; i < 2; i++) { + if (devc->profile->buffersizes[i] == tmp_u64) { devc->framesize = tmp_u64; break; } } - if (buffersizes[i] == 0) + if (i == 2) ret = SR_ERR_ARG; break; case SR_CONF_TIMEBASE: @@ -531,9 +564,17 @@ static int config_set(int id, GVariant *data, const struct sr_dev_inst *sdi) static int config_list(int key, GVariant **data, const struct sr_dev_inst *sdi) { + struct dev_context *devc; + GVariant *tuple, *rational[2]; + GVariantBuilder gvb; + unsigned int i; (void)sdi; + if (!sdi) + return SR_ERR_ARG; + + devc = sdi->priv; switch (key) { case SR_CONF_DEVICE_OPTIONS: *data = g_variant_new_fixed_array(G_VARIANT_TYPE_INT32, @@ -541,22 +582,34 @@ static int config_list(int key, GVariant **data, const struct sr_dev_inst *sdi) break; case SR_CONF_BUFFERSIZE: *data = g_variant_new_fixed_array(G_VARIANT_TYPE_UINT64, - buffersizes, ARRAY_SIZE(buffersizes), sizeof(uint64_t)); + devc->profile->buffersizes, 2, sizeof(uint64_t)); break; case SR_CONF_COUPLING: *data = g_variant_new_strv(coupling, ARRAY_SIZE(coupling)); break; case SR_CONF_VDIV: - *data = g_variant_new_fixed_array(G_VARIANT_TYPE_UINT64, - vdivs, ARRAY_SIZE(vdivs) * 2, sizeof(uint64_t)); + g_variant_builder_init(&gvb, G_VARIANT_TYPE_ARRAY); + for (i = 0; i < ARRAY_SIZE(vdivs); i++) { + rational[0] = g_variant_new_uint64(vdivs[i][0]); + rational[1] = g_variant_new_uint64(vdivs[i][1]); + tuple = g_variant_new_tuple(rational, 2); + g_variant_builder_add_value(&gvb, tuple); + } + *data = g_variant_builder_end(&gvb); break; case SR_CONF_FILTER: *data = g_variant_new_strv(filter_targets, ARRAY_SIZE(filter_targets)); break; case SR_CONF_TIMEBASE: - *data = g_variant_new_fixed_array(G_VARIANT_TYPE_UINT64, - timebases, ARRAY_SIZE(timebases) * 2, sizeof(uint64_t)); + g_variant_builder_init(&gvb, G_VARIANT_TYPE_ARRAY); + for (i = 0; i < ARRAY_SIZE(timebases); i++) { + rational[0] = g_variant_new_uint64(timebases[i][0]); + rational[1] = g_variant_new_uint64(timebases[i][1]); + tuple = g_variant_new_tuple(rational, 2); + g_variant_builder_add_value(&gvb, tuple); + } + *data = g_variant_builder_end(&gvb); break; case SR_CONF_TRIGGER_SOURCE: *data = g_variant_new_strv(trigger_sources, @@ -895,7 +948,7 @@ SR_PRIV struct sr_dev_driver hantek_dso_driver_info = { .scan = hw_scan, .dev_list = hw_dev_list, .dev_clear = clear_instances, - .config_get = NULL, + .config_get = config_get, .config_set = config_set, .config_list = config_list, .dev_open = hw_dev_open,