X-Git-Url: https://sigrok.org/gitweb/?p=libsigrok.git;a=blobdiff_plain;f=src%2Fhardware%2Fopenbench-logic-sniffer%2Fprotocol.c;h=3bfb890fddf6623f8af8af9495d667b25d71b028;hp=75e0c8a6194123401f75727904762ed88daeea41;hb=6745488b1a33acda728440e69f83e8bb0a0663f1;hpb=a394bd28136cad6536f6eab09803ae6f3fa9cb68
diff --git a/src/hardware/openbench-logic-sniffer/protocol.c b/src/hardware/openbench-logic-sniffer/protocol.c
index 75e0c8a6..3bfb890f 100644
--- a/src/hardware/openbench-logic-sniffer/protocol.c
+++ b/src/hardware/openbench-logic-sniffer/protocol.c
@@ -17,10 +17,9 @@
* along with this program. If not, see .
*/
+#include
#include "protocol.h"
-extern SR_PRIV struct sr_dev_driver ols_driver_info;
-
SR_PRIV int send_shortcommand(struct sr_serial_dev_inst *serial,
uint8_t command)
{
@@ -58,6 +57,18 @@ SR_PRIV int send_longcommand(struct sr_serial_dev_inst *serial,
return SR_OK;
}
+SR_PRIV int ols_send_reset(struct sr_serial_dev_inst *serial)
+{
+ unsigned int i;
+
+ for (i = 0; i < 5; i++) {
+ if (send_shortcommand(serial, CMD_RESET) != SR_OK)
+ return SR_ERR;
+ }
+
+ return SR_OK;
+}
+
/* Configures the channel mask based on which channels are enabled. */
SR_PRIV void ols_channel_mask(const struct sr_dev_inst *sdi)
{
@@ -130,7 +141,6 @@ SR_PRIV struct dev_context *ols_dev_new(void)
/* Acquisition settings */
devc->limit_samples = devc->capture_ratio = 0;
devc->trigger_at = -1;
- devc->channel_mask = 0xffffffff;
devc->flag_reg = 0;
return devc;
@@ -148,7 +158,6 @@ SR_PRIV struct sr_dev_inst *get_metadata(struct sr_serial_dev_inst *serial)
sdi = g_malloc0(sizeof(struct sr_dev_inst));
sdi->status = SR_ST_INACTIVE;
- sdi->driver = &ols_driver_info;
devc = ols_dev_new();
sdi->priv = devc;
@@ -314,15 +323,12 @@ SR_PRIV int ols_set_samplerate(const struct sr_dev_inst *sdi,
SR_PRIV void abort_acquisition(const struct sr_dev_inst *sdi)
{
- struct sr_datafeed_packet packet;
struct sr_serial_dev_inst *serial;
serial = sdi->conn;
serial_source_remove(sdi->session, serial);
- /* Terminate session */
- packet.type = SR_DF_END;
- sr_session_send(sdi, &packet);
+ std_session_send_df_end(sdi);
}
SR_PRIV int ols_receive_data(int fd, int revents, void *cb_data)
@@ -343,16 +349,12 @@ SR_PRIV int ols_receive_data(int fd, int revents, void *cb_data)
serial = sdi->conn;
devc = sdi->priv;
+ if (devc->num_transfers == 0 && revents == 0) {
+ /* Ignore timeouts as long as we haven't received anything */
+ return TRUE;
+ }
+
if (devc->num_transfers++ == 0) {
- /*
- * First time round, means the device started sending data,
- * and will not stop until done. If it stops sending for
- * longer than it takes to send a byte, that means it's
- * finished. We'll double that to 30ms to be sure...
- */
- serial_source_remove(sdi->session, serial);
- serial_source_add(sdi->session, serial, G_IO_IN, 30,
- ols_receive_data, cb_data);
devc->raw_sample_buf = g_try_malloc(devc->limit_samples * 4);
if (!devc->raw_sample_buf) {
sr_err("Sample buffer malloc failed.");
@@ -478,12 +480,12 @@ SR_PRIV int ols_receive_data(int fd, int revents, void *cb_data)
logic.unitsize = 4;
logic.data = devc->raw_sample_buf +
(devc->limit_samples - devc->num_samples) * 4;
- sr_session_send(cb_data, &packet);
+ sr_session_send(sdi, &packet);
}
/* Send the trigger. */
packet.type = SR_DF_TRIGGER;
- sr_session_send(cb_data, &packet);
+ sr_session_send(sdi, &packet);
/* Send post-trigger samples. */
packet.type = SR_DF_LOGIC;
@@ -492,7 +494,7 @@ SR_PRIV int ols_receive_data(int fd, int revents, void *cb_data)
logic.unitsize = 4;
logic.data = devc->raw_sample_buf + devc->trigger_at * 4 +
(devc->limit_samples - devc->num_samples) * 4;
- sr_session_send(cb_data, &packet);
+ sr_session_send(sdi, &packet);
} else {
/* no trigger was used */
packet.type = SR_DF_LOGIC;
@@ -501,7 +503,7 @@ SR_PRIV int ols_receive_data(int fd, int revents, void *cb_data)
logic.unitsize = 4;
logic.data = devc->raw_sample_buf +
(devc->limit_samples - devc->num_samples) * 4;
- sr_session_send(cb_data, &packet);
+ sr_session_send(sdi, &packet);
}
g_free(devc->raw_sample_buf);