File 0009-fix-drop-2-samples-for-hardware-BUG-and-ensure-pre_s.patch of Package libsigrok

From 89ca48fbf10b1646ed7db3f57a438ceb678982f8 Mon Sep 17 00:00:00 2001
From: taorye <taorye@outlook.com>
Date: Fri, 12 Dec 2025 11:53:29 +0800
Subject: [PATCH 09/17] fix: drop 2 samples for hardware BUG and ensure
 pre_samples to be sent

---
 src/hardware/sipeed-slogic-analyzer/api.c     | 37 +++++++++----------
 .../sipeed-slogic-analyzer/protocol.c         | 13 +++++++
 2 files changed, 31 insertions(+), 19 deletions(-)

diff --git a/src/hardware/sipeed-slogic-analyzer/api.c b/src/hardware/sipeed-slogic-analyzer/api.c
index 683d8f7c0..f9e478efa 100644
--- a/src/hardware/sipeed-slogic-analyzer/api.c
+++ b/src/hardware/sipeed-slogic-analyzer/api.c
@@ -736,27 +736,26 @@ int slogic_soft_trigger_raw_data(void *data, size_t len,
 	int64_t trigger_offset = soft_trigger_logic_check(devc->stl, ptr, len, &pre_trigger_samples);
 	if (trigger_offset > -1) {
 		ret += pre_trigger_samples * uintsize;
-		if (ret) {
-			int need = devc->samples_need_nbytes - devc->samples_got_nbytes - ret;
-
-			if (need > 0) {
-				int remain = len - trigger_offset * uintsize;
-				if (need < remain)
-					remain = need;
-
-				sr_session_send(sdi, &(struct sr_datafeed_packet){
-							.type = SR_DF_LOGIC,
-							.payload = &(struct sr_datafeed_logic){
-								.length = remain,
-								.unitsize = uintsize,
-								.data = ptr + trigger_offset * uintsize,
-							} });
-
-				ret += remain;
-			}
 
-			devc->samples_got_nbytes += ret;
+		int need = devc->samples_need_nbytes - devc->samples_got_nbytes - ret;
+
+		if (need > 0) {
+			int remain = len - trigger_offset * uintsize;
+			if (need < remain)
+				remain = need;
+
+			sr_session_send(sdi, &(struct sr_datafeed_packet){
+						.type = SR_DF_LOGIC,
+						.payload = &(struct sr_datafeed_logic){
+							.length = remain,
+							.unitsize = uintsize,
+							.data = ptr + trigger_offset * uintsize,
+						} });
+
+			ret += remain;
 		}
+
+		devc->samples_got_nbytes += ret;
 	}
 
 	if (nCh < 8)
diff --git a/src/hardware/sipeed-slogic-analyzer/protocol.c b/src/hardware/sipeed-slogic-analyzer/protocol.c
index ba04f6de9..3862a9b0d 100644
--- a/src/hardware/sipeed-slogic-analyzer/protocol.c
+++ b/src/hardware/sipeed-slogic-analyzer/protocol.c
@@ -51,6 +51,7 @@ static void LIBUSB_CALL receive_transfer(struct libusb_transfer *transfer)
 	case LIBUSB_TRANSFER_COMPLETED: /* normal case */
 	case LIBUSB_TRANSFER_TIMED_OUT: /* may have received some data */
 	{
+		int first_here = devc->transfers_reached_time_latest == devc->transfers_reached_time_start;
 		devc->transfers_reached_time_latest =
 			transfers_reached_time_now;
 
@@ -58,6 +59,18 @@ static void LIBUSB_CALL receive_transfer(struct libusb_transfer *transfer)
 		devc->transfers_reached_nbytes +=
 			devc->transfers_reached_nbytes_latest;
 
+		// remove 2 samples for hardware bug workaround
+		if (first_here) {
+			size_t drop_bytes = (2*devc->cur_samplechannel/8)?:1;
+			if (transfer->actual_length >= drop_bytes) {
+				transfer->actual_length -= drop_bytes;
+				memmove(transfer->buffer, transfer->buffer + drop_bytes,
+					transfer->actual_length);
+			} else {
+				devc->transfers_reached_time_latest = devc->transfers_reached_time_start;
+			}
+		}
+
 		if (devc->trigger_fired && transfer->actual_length >
 		    devc->samples_need_nbytes - devc->samples_got_nbytes)
 			transfer->actual_length = devc->samples_need_nbytes -
-- 
2.52.0

openSUSE Build Service is sponsored by