X-Git-Url: http://sigrok.org/gitweb/?a=blobdiff_plain;f=hardware%2Fzeroplus-logic-cube%2Fzeroplus.c;h=066d4c7697e47cec83a50c8de793740b5aa1e788;hb=c37d2b1ba12b62d63590509879bf58adf842896d;hp=875291ee9a63de5574fee21165e3a56cb11c0409;hpb=340cfac0f0629aa3ee84a0a4db53381d04079fe3;p=libsigrok.git diff --git a/hardware/zeroplus-logic-cube/zeroplus.c b/hardware/zeroplus-logic-cube/zeroplus.c index 875291ee..066d4c76 100644 --- a/hardware/zeroplus-logic-cube/zeroplus.c +++ b/hardware/zeroplus-logic-cube/zeroplus.c @@ -24,8 +24,8 @@ #include #include #include -#include -#include +#include "sigrok.h" +#include "sigrok-internal.h" #include "analyzer.h" #define USB_VENDOR 0x0c12 @@ -73,6 +73,42 @@ static int capabilities[] = { 0, }; +static const char *probe_names[] = { + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + "10", + "11", + "12", + "13", + "14", + "15", + "16", + "17", + "18", + "19", + "20", + "21", + "22", + "23", + "24", + "25", + "26", + "27", + "28", + "29", + "30", + "31", + NULL, +}; + /* List of struct sr_device_instance, maintained by opendev()/closedev(). */ static GSList *device_instances = NULL; @@ -118,6 +154,7 @@ static struct sr_samplerates samplerates = { /* TODO: All of these should go in a device-specific struct. */ static uint64_t cur_samplerate = 0; +static uint64_t period_ps = 0; static uint64_t limit_samples = 0; static int num_channels = 32; /* TODO: This isn't initialized before it's needed :( */ static uint64_t memory_size = 0; @@ -283,7 +320,7 @@ static int hw_init(const char *deviceinfo) int err, devcnt, i; /* Avoid compiler warnings. */ - deviceinfo = deviceinfo; + (void)deviceinfo; if (libusb_init(&usb_context) != 0) { sr_warn("Failed to initialize USB."); @@ -419,6 +456,9 @@ static void *hw_get_device_info(int device_index, int device_info_id) case SR_DI_NUM_PROBES: info = GINT_TO_POINTER(num_channels); break; + case SR_DI_PROBE_NAMES: + info = probe_names; + break; case SR_DI_SAMPLERATES: info = &samplerates; break; @@ -452,7 +492,7 @@ static int *hw_get_capabilities(void) /* TODO: This will set the same samplerate for all devices. */ static int set_configuration_samplerate(uint64_t samplerate) { - sr_info("%s(%" PRIu64 ")", __FUNCTION__, samplerate); + sr_info("%s(%" PRIu64 ")", __func__, samplerate); if (samplerate > SR_MHZ(1)) analyzer_set_freq(samplerate / SR_MHZ(1), FREQ_SCALE_MHZ); else if (samplerate > SR_KHZ(1)) @@ -461,6 +501,7 @@ static int set_configuration_samplerate(uint64_t samplerate) analyzer_set_freq(samplerate, FREQ_SCALE_HZ); cur_samplerate = samplerate; + period_ps = 1000000000000 / samplerate; return SR_OK; } @@ -488,11 +529,13 @@ static int hw_set_configuration(int device_index, int capability, void *value) } } -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 sr_datafeed_packet packet; + struct sr_datafeed_logic logic; struct sr_datafeed_header header; + uint64_t samples_read; int res; unsigned int packet_num; unsigned char *buf; @@ -507,50 +550,48 @@ static int hw_start_acquisition(int device_index, gpointer session_device_id) sr_info("Waiting for data"); analyzer_wait_data(sdi->usb->devhdl); - sr_info("Stop address = 0x%x", - analyzer_get_stop_address(sdi->usb->devhdl)); - sr_info("Now address = 0x%x", - analyzer_get_now_address(sdi->usb->devhdl)); - sr_info("Trigger address = 0x%x", - analyzer_get_trigger_address(sdi->usb->devhdl)); + sr_info("Stop address = 0x%x", analyzer_get_stop_address(sdi->usb->devhdl)); + sr_info("Now address = 0x%x", analyzer_get_now_address(sdi->usb->devhdl)); + sr_info("Trigger address = 0x%x", analyzer_get_trigger_address(sdi->usb->devhdl)); packet.type = SR_DF_HEADER; - packet.length = sizeof(struct sr_datafeed_header); - packet.payload = (unsigned char *)&header; + packet.payload = &header; header.feed_version = 1; gettimeofday(&header.starttime, NULL); header.samplerate = cur_samplerate; - header.protocol_id = SR_PROTO_RAW; header.num_logic_probes = num_channels; header.num_analog_probes = 0; - sr_session_bus(session_device_id, &packet); + sr_session_bus(session_data, &packet); if (!(buf = g_try_malloc(PACKET_SIZE))) { sr_err("lap-c: %s: buf malloc failed", __func__); return SR_ERR_MALLOC; } + samples_read = 0; analyzer_read_start(sdi->usb->devhdl); /* Send the incoming transfer to the session bus. */ for (packet_num = 0; packet_num < (memory_size * 4 / PACKET_SIZE); packet_num++) { res = analyzer_read_data(sdi->usb->devhdl, buf, PACKET_SIZE); -#if 0 sr_info("Tried to read %llx bytes, actually read %x bytes", PACKET_SIZE, res); -#endif packet.type = SR_DF_LOGIC; - packet.length = PACKET_SIZE; - packet.unitsize = 4; - packet.payload = buf; - sr_session_bus(session_device_id, &packet); + packet.timeoffset = samples_read * period_ps; + packet.duration = res / 4 * period_ps; + packet.payload = &logic; + logic.length = PACKET_SIZE; + logic.unitsize = 4; + logic.data = buf; + sr_session_bus(session_data, &packet); + samples_read += res / 4; } analyzer_read_stop(sdi->usb->devhdl); g_free(buf); packet.type = SR_DF_END; - sr_session_bus(session_device_id, &packet); + sr_session_bus(session_data, &packet); return SR_OK; }