X-Git-Url: http://sigrok.org/gitweb/?a=blobdiff_plain;f=src%2Fhardware%2Ffx2lafw%2Fapi.c;h=dd82729ec9a2b398c272a3160a586c16f3bc6c33;hb=f9c6b5cfd3c0f6cb737f6a68f69034ce6819f36d;hp=73365494629a661bebee22327c694a86eb607c35;hpb=a04b28ce2c2e504e38b23fcfff236bdb527a5097;p=libsigrok.git diff --git a/src/hardware/fx2lafw/api.c b/src/hardware/fx2lafw/api.c index 73365494..dd82729e 100644 --- a/src/hardware/fx2lafw/api.c +++ b/src/hardware/fx2lafw/api.c @@ -47,6 +47,13 @@ static const struct fx2lafw_profile supported_fx2[] = { "fx2lafw-cwav-usbeesx.fw", 0, NULL, NULL}, + /* + * CWAV USBee ZX + */ + { 0x08a9, 0x0005, "CWAV", "USBee ZX", NULL, + "fx2lafw-cwav-usbeezx.fw", + 0, NULL, NULL}, + /* DreamSourceLab DSLogic (before FW upload) */ { 0x2a0e, 0x0001, "DreamSourceLab", "DSLogic", NULL, "dreamsourcelab-dslogic-fx2.fw", @@ -143,7 +150,7 @@ static const uint32_t dslogic_devopts[] = { SR_CONF_TRIGGER_MATCH | SR_CONF_LIST, SR_CONF_CAPTURE_RATIO | SR_CONF_GET | SR_CONF_SET, SR_CONF_EXTERNAL_CLOCK | SR_CONF_GET | SR_CONF_SET, - SR_CONF_CLOCK_EDGE | SR_CONF_GET | SR_CONF_SET | SR_CONF_LIST + SR_CONF_CLOCK_EDGE | SR_CONF_GET | SR_CONF_SET | SR_CONF_LIST, }; static const int32_t soft_trigger_matches[] = { @@ -154,8 +161,7 @@ static const int32_t soft_trigger_matches[] = { SR_TRIGGER_EDGE, }; -/* Names assigned to available edge slope choices. - */ +/* Names assigned to available edge slope choices. */ static const char *const signal_edge_names[] = { [DS_EDGE_RISING] = "rising", [DS_EDGE_FALLING] = "falling", @@ -166,8 +172,8 @@ static const struct { gdouble low; gdouble high; } volt_thresholds[] = { - { DS_VOLTAGE_RANGE_18_33_V, 0.7, 1.4 }, - { DS_VOLTAGE_RANGE_5_V, 1.4, 3.6 }, + { DS_VOLTAGE_RANGE_18_33_V, 0.7, 1.4 }, + { DS_VOLTAGE_RANGE_5_V, 1.4, 3.6 }, }; static const uint64_t samplerates[] = { @@ -208,8 +214,6 @@ static const uint64_t dslogic_samplerates[] = { SR_MHZ(400), }; -SR_PRIV struct sr_dev_driver fx2lafw_driver_info; - static GSList *scan(struct sr_dev_driver *di, GSList *options) { struct drv_context *drvc; @@ -326,7 +330,6 @@ static GSList *scan(struct sr_dev_driver *di, GSList *options) sdi->vendor = g_strdup(prof->vendor); sdi->model = g_strdup(prof->model); sdi->version = g_strdup(prof->model_version); - sdi->driver = di; sdi->serial_num = g_strdup(serial_num); sdi->connection_id = g_strdup(connection_id); @@ -362,7 +365,6 @@ static GSList *scan(struct sr_dev_driver *di, GSList *options) if ((prof->dev_caps & DEV_CAPS_16BIT) || (prof->dev_caps & DEV_CAPS_AX_ANALOG)) devc->sample_wide = TRUE; sdi->priv = devc; - drvc->instances = g_slist_append(drvc->instances, sdi); devices = g_slist_append(devices, sdi); if (!strcmp(prof->model, "DSLogic") @@ -406,7 +408,7 @@ static GSList *scan(struct sr_dev_driver *di, GSList *options) libusb_free_device_list(devlist, 1); g_slist_free_full(conn_devices, (GDestroyNotify)sr_usb_dev_inst_free); - return devices; + return std_scan_complete(di, devices); } static void clear_dev_context(void *priv) @@ -516,6 +518,7 @@ static int dev_close(struct sr_dev_inst *sdi) struct sr_usb_dev_inst *usb; usb = sdi->conn; + if (!usb->devhdl) return SR_ERR; @@ -529,8 +532,8 @@ static int dev_close(struct sr_dev_inst *sdi) return SR_OK; } -static int config_get(uint32_t key, GVariant **data, const struct sr_dev_inst *sdi, - const struct sr_channel_group *cg) +static int config_get(uint32_t key, GVariant **data, + const struct sr_dev_inst *sdi, const struct sr_channel_group *cg) { struct dev_context *devc; struct sr_usb_dev_inst *usb; @@ -586,7 +589,7 @@ static int config_get(uint32_t key, GVariant **data, const struct sr_dev_inst *s i = devc->dslogic_clock_edge; if (i >= ARRAY_SIZE(signal_edge_names)) return SR_ERR_BUG; - *data = g_variant_new_string(signal_edge_names[0]);//idx]); + *data = g_variant_new_string(signal_edge_names[0]); break; default: return SR_ERR_NA; @@ -595,8 +598,8 @@ static int config_get(uint32_t key, GVariant **data, const struct sr_dev_inst *s return SR_OK; } - -/* Helper for mapping a string-typed configuration value to an index +/* + * Helper for mapping a string-typed configuration value to an index * within a table of possible values. */ static int lookup_index(GVariant *value, const char *const *table, int len) @@ -617,8 +620,8 @@ static int lookup_index(GVariant *value, const char *const *table, int len) return -1; } -static int config_set(uint32_t key, GVariant *data, const struct sr_dev_inst *sdi, - const struct sr_channel_group *cg) +static int config_set(uint32_t key, GVariant *data, + const struct sr_dev_inst *sdi, const struct sr_channel_group *cg) { struct dev_context *devc; uint64_t arg; @@ -671,7 +674,7 @@ static int config_set(uint32_t key, GVariant *data, const struct sr_dev_inst *sd ret = dslogic_fpga_firmware_upload(sdi, DSLOGIC_FPGA_FIRMWARE_5V); else ret = dslogic_fpga_firmware_upload(sdi, DSLOGIC_FPGA_FIRMWARE_3V3); - }else if (!strcmp(devc->profile->model, "DSLogic Pro")){ + } else if (!strcmp(devc->profile->model, "DSLogic Pro")) { ret = dslogic_fpga_firmware_upload(sdi, DSLOGIC_PRO_FPGA_FIRMWARE); } break; @@ -695,8 +698,8 @@ static int config_set(uint32_t key, GVariant *data, const struct sr_dev_inst *sd return ret; } -static int config_list(uint32_t key, GVariant **data, const struct sr_dev_inst *sdi, - const struct sr_channel_group *cg) +static int config_list(uint32_t key, GVariant **data, + const struct sr_dev_inst *sdi, const struct sr_channel_group *cg) { struct dev_context *devc; GVariant *gvar, *range[2]; @@ -711,10 +714,10 @@ static int config_list(uint32_t key, GVariant **data, const struct sr_dev_inst * scanopts, ARRAY_SIZE(scanopts), sizeof(uint32_t)); break; case SR_CONF_DEVICE_OPTIONS: - if (!sdi) + if (!sdi) { *data = g_variant_new_fixed_array(G_VARIANT_TYPE_UINT32, - drvopts, ARRAY_SIZE(drvopts), sizeof(uint32_t)); - else{ + drvopts, ARRAY_SIZE(drvopts), sizeof(uint32_t)); + } else { devc = sdi->priv; if (!devc->dslogic) *data = g_variant_new_fixed_array(G_VARIANT_TYPE_UINT32, @@ -725,9 +728,11 @@ static int config_list(uint32_t key, GVariant **data, const struct sr_dev_inst * } break; case SR_CONF_VOLTAGE_THRESHOLD: - if (!sdi->priv) return SR_ERR_ARG; + if (!sdi->priv) + return SR_ERR_ARG; devc = sdi->priv; - if (!devc->dslogic) return SR_ERR_NA; + if (!devc->dslogic) + return SR_ERR_NA; g_variant_builder_init(&gvb, G_VARIANT_TYPE_ARRAY); for (i = 0; i < ARRAY_SIZE(volt_thresholds); i++) { range[0] = g_variant_new_double(volt_thresholds[i].low); @@ -738,8 +743,6 @@ static int config_list(uint32_t key, GVariant **data, const struct sr_dev_inst * *data = g_variant_builder_end(&gvb); break; case SR_CONF_SAMPLERATE: - if (!sdi->priv) - return SR_ERR_ARG; devc = sdi->priv; g_variant_builder_init(&gvb, G_VARIANT_TYPE("a{sv}")); gvar = g_variant_new_fixed_array(G_VARIANT_TYPE("t"), devc->samplerates, @@ -813,8 +816,8 @@ static int start_transfers(const struct sr_dev_inst *sdi) //if (devc->dslogic) // num_transfers = dslogic_get_number_of_transfers(devc); - if ( devc->dslogic){ - if(devc->cur_samplerate == SR_MHZ(100)) + if (devc->dslogic) { + if (devc->cur_samplerate == SR_MHZ(100)) num_transfers = 16; else if (devc->cur_samplerate == SR_MHZ(200)) num_transfers = 8; @@ -861,7 +864,7 @@ static int start_transfers(const struct sr_dev_inst *sdi) else devc->send_data_proc = la_send_data_proc; - std_session_send_df_header(sdi, LOG_PREFIX); + std_session_send_df_header(sdi); return SR_OK; } @@ -877,7 +880,7 @@ static void LIBUSB_CALL dslogic_trigger_receive(struct libusb_transfer *transfer if (transfer->status == LIBUSB_TRANSFER_CANCELLED) { sr_dbg("Trigger transfer canceled."); /* Terminate session. */ - std_session_send_df_end(sdi, LOG_PREFIX); + std_session_send_df_end(sdi); usb_source_remove(sdi->session, devc->ctx); devc->num_transfers = 0; g_free(devc->transfers); @@ -888,8 +891,9 @@ static void LIBUSB_CALL dslogic_trigger_receive(struct libusb_transfer *transfer } else if (transfer->status == LIBUSB_TRANSFER_COMPLETED && transfer->actual_length == sizeof(struct dslogic_trigger_pos)) { tpos = (struct dslogic_trigger_pos *)transfer->buffer; - sr_info("tpos real_pos %d ram_saddr %d cnt %d", tpos->real_pos, tpos->ram_saddr, tpos->remain_cnt); - devc->trigger_pos = tpos->real_pos; + sr_info("tpos real_pos %d ram_saddr %d cnt %d", tpos->real_pos, + tpos->ram_saddr, tpos->remain_cnt); + devc->trigger_pos = tpos->real_pos; g_free(tpos); start_transfers(sdi); } @@ -913,11 +917,11 @@ static int dslogic_trigger_request(const struct sr_dev_inst *sdi) if ((ret = dslogic_fpga_configure(sdi)) != SR_OK) return ret; - /* if this is a dslogic pro, set the voltage threshold */ + /* If this is a DSLogic Pro, set the voltage threshold. */ if (!strcmp(devc->profile->model, "DSLogic Pro")){ - if(devc->dslogic_voltage_threshold == DS_VOLTAGE_RANGE_18_33_V){ + if (devc->dslogic_voltage_threshold == DS_VOLTAGE_RANGE_18_33_V) { dslogic_set_vth(sdi, 1.4); - }else{ + } else { dslogic_set_vth(sdi, 3.3); } } @@ -1038,7 +1042,7 @@ static int dev_acquisition_stop(struct sr_dev_inst *sdi) return SR_OK; } -SR_PRIV struct sr_dev_driver fx2lafw_driver_info = { +static struct sr_dev_driver fx2lafw_driver_info = { .name = "fx2lafw", .longname = "fx2lafw (generic driver for FX2 based LAs)", .api_version = 1, @@ -1056,3 +1060,4 @@ SR_PRIV struct sr_dev_driver fx2lafw_driver_info = { .dev_acquisition_stop = dev_acquisition_stop, .context = NULL, }; +SR_REGISTER_DEV_DRIVER(fx2lafw_driver_info);