X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=hardware%2Fzeroplus-logic-cube%2Fzeroplus.c;h=e48bf5e699714bd61739104b343e18a5a34771ec;hb=6bb5c5fadfe011ae7797138fb9e9ade32edb0caf;hp=a2d616f21f7f7713ce8a47e8cc250bcf8ee8b4f3;hpb=b53738baf76219237e0a6629905981d7a1f2508e;p=libsigrok.git diff --git a/hardware/zeroplus-logic-cube/zeroplus.c b/hardware/zeroplus-logic-cube/zeroplus.c index a2d616f2..e48bf5e6 100644 --- a/hardware/zeroplus-logic-cube/zeroplus.c +++ b/hardware/zeroplus-logic-cube/zeroplus.c @@ -118,6 +118,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; @@ -370,12 +371,19 @@ static int hw_opendev(int device_index) return SR_OK; } -static void hw_closedev(int device_index) +static int hw_closedev(int device_index) { struct sr_device_instance *sdi; - if ((sdi = sr_get_device_instance(device_instances, device_index))) - close_device(sdi); + if (!(sdi = sr_get_device_instance(device_instances, device_index))) { + sr_err("lap-c: %s: sdi was NULL", __func__); + return SR_ERR; /* TODO: SR_ERR_ARG? */ + } + + /* TODO */ + close_device(sdi); + + return SR_OK; } static void hw_cleanup(void) @@ -445,7 +453,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)) @@ -454,6 +462,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; } @@ -481,11 +490,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; @@ -500,50 +511,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("zeroplus: %s: buf malloc failed", __func__); + 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; } @@ -565,17 +574,17 @@ static void hw_stop_acquisition(int device_index, gpointer session_device_id) } struct sr_device_plugin zeroplus_logic_cube_plugin_info = { - "zeroplus-logic-cube", - "Zeroplus Logic Cube LAP-C series", - 1, - hw_init, - hw_cleanup, - hw_opendev, - hw_closedev, - hw_get_device_info, - hw_get_status, - hw_get_capabilities, - hw_set_configuration, - hw_start_acquisition, - hw_stop_acquisition, + .name = "zeroplus-logic-cube", + .longname = "Zeroplus Logic Cube LAP-C series", + .api_version = 1, + .init = hw_init, + .cleanup = hw_cleanup, + .opendev = hw_opendev, + .closedev = hw_closedev, + .get_device_info = hw_get_device_info, + .get_status = hw_get_status, + .get_capabilities = hw_get_capabilities, + .set_configuration = hw_set_configuration, + .start_acquisition = hw_start_acquisition, + .stop_acquisition = hw_stop_acquisition, };