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