diff --git a/server/src/Peripherals/LogicAnalyzerClient.cs b/server/src/Peripherals/LogicAnalyzerClient.cs index 8f8d3cc..db0a43e 100644 --- a/server/src/Peripherals/LogicAnalyzerClient.cs +++ b/server/src/Peripherals/LogicAnalyzerClient.cs @@ -8,6 +8,8 @@ namespace Peripherals.LogicAnalyzerClient; static class AnalyzerAddr { const UInt32 BASE = 0x9000_0000; + const UInt32 DMA1_BASE = 0x7000_0000; + const UInt32 DDR_BASE = 0x0000_0000; /// /// 0x0000_0000 R/W [ 0] capture on: 置1开始等待捕获,0停止捕获。捕获到信号后该位自动清零。
@@ -53,13 +55,19 @@ static class AnalyzerAddr BASE + 0x0000_0016, BASE + 0x0000_0017, }; + public const UInt32 LOAD_NUM_ADDR = BASE + 0x0000_0002; + public const UInt32 PRE_LOAD_NUM_ADDR = BASE + 0x0000_0003; + public const UInt32 DMA1_START_WRITE_ADDR = DMA1_BASE + 0x0000_0012; + public const UInt32 DMA1_END_WRITE_ADDR = DMA1_BASE + 0x0000_0013; + public const UInt32 DMA1_CAPTURE_CTRL_ADDR = DMA1_BASE + 0x0000_0014; + public const UInt32 STORE_OFFSET_ADDR = DDR_BASE + 0x0010_0000; /// /// 0x0100_0000 - 0x0100_03FF 只读 32位波形存储,得到的32位数据中低八位最先捕获,高八位最后捕获。
/// 共1024个地址,每个地址存储4组,深度为4096。
///
- public const UInt32 CAPTURE_DATA_ADDR = BASE + 0x0100_0000; public const Int32 CAPTURE_DATA_LENGTH = 1024; + public const Int32 CAPTURE_DATA_PRELOAD = 512; } /// @@ -231,21 +239,87 @@ public class Analyzer /// 操作结果,成功返回true,否则返回异常信息 public async ValueTask> SetCaptureMode(bool captureOn, bool force) { + { + var ret = await UDPClientPool.WriteAddr(this.ep, this.taskID, AnalyzerAddr.LOAD_NUM_ADDR, AnalyzerAddr.CAPTURE_DATA_LENGTH - 1, this.timeout); + if (!ret.IsSuccessful) + { + logger.Error($"Failed to set LOAD_NUM_ADDR: {ret.Error}"); + return new(ret.Error); + } + if (!ret.Value) + { + logger.Error("WriteAddr to LOAD_NUM_ADDR returned false"); + return new(new Exception("Failed to set LOAD_NUM_ADDR")); + } + } + { + var ret = await UDPClientPool.WriteAddr(this.ep, this.taskID, AnalyzerAddr.PRE_LOAD_NUM_ADDR, AnalyzerAddr.CAPTURE_DATA_PRELOAD - 1, this.timeout); + if (!ret.IsSuccessful) + { + logger.Error($"Failed to set PRE_LOAD_NUM_ADDR: {ret.Error}"); + return new(ret.Error); + } + if (!ret.Value) + { + logger.Error("WriteAddr to PRE_LOAD_NUM_ADDR returned false"); + return new(new Exception("Failed to set PRE_LOAD_NUM_ADDR")); + } + } + { + var ret = await UDPClientPool.WriteAddr(this.ep, this.taskID, AnalyzerAddr.DMA1_START_WRITE_ADDR, AnalyzerAddr.STORE_OFFSET_ADDR, this.timeout); + if (!ret.IsSuccessful) + { + logger.Error($"Failed to set DMA1_START_WRITE_ADDR: {ret.Error}"); + return new(ret.Error); + } + if (!ret.Value) + { + logger.Error("WriteAddr to DMA1_START_WRITE_ADDR returned false"); + return new(new Exception("Failed to set DMA1_START_WRITE_ADDR")); + } + } + { + var ret = await UDPClientPool.WriteAddr(this.ep, this.taskID, AnalyzerAddr.DMA1_END_WRITE_ADDR, AnalyzerAddr.STORE_OFFSET_ADDR + AnalyzerAddr.CAPTURE_DATA_LENGTH - 1, this.timeout); + if (!ret.IsSuccessful) + { + logger.Error($"Failed to set DMA1_END_WRITE_ADDR: {ret.Error}"); + return new(ret.Error); + } + if (!ret.Value) + { + logger.Error("WriteAddr to DMA1_END_WRITE_ADDR returned false"); + return new(new Exception("Failed to set DMA1_END_WRITE_ADDR")); + } + } // 构造寄存器值 UInt32 value = 0; if (captureOn) value |= 1 << 0; - if (force) value |= 1 << 8; - - var ret = await UDPClientPool.WriteAddr(this.ep, this.taskID, AnalyzerAddr.CAPTURE_MODE, value, this.timeout); - if (!ret.IsSuccessful) { - logger.Error($"Failed to set capture mode: {ret.Error}"); - return new(ret.Error); + var ret = await UDPClientPool.WriteAddr(this.ep, this.taskID, AnalyzerAddr.DMA1_CAPTURE_CTRL_ADDR, value, this.timeout); + if (!ret.IsSuccessful) + { + logger.Error($"Failed to set DMA1_CAPTURE_CTRL_ADDR: {ret.Error}"); + return new(ret.Error); + } + if (!ret.Value) + { + logger.Error("WriteAddr to DMA1_CAPTURE_CTRL_ADDR returned false"); + return new(new Exception("Failed to set DMA1_CAPTURE_CTRL_ADDR")); + } } - if (!ret.Value) + if (force) value |= 1 << 8; { - logger.Error("WriteAddr to CAPTURE_MODE returned false"); - return new(new Exception("Failed to set capture mode")); + var ret = await UDPClientPool.WriteAddr(this.ep, this.taskID, AnalyzerAddr.CAPTURE_MODE, value, this.timeout); + if (!ret.IsSuccessful) + { + logger.Error($"Failed to set capture mode: {ret.Error}"); + return new(ret.Error); + } + if (!ret.Value) + { + logger.Error("WriteAddr to CAPTURE_MODE returned false"); + return new(new Exception("Failed to set capture mode")); + } } return true; } @@ -332,7 +406,7 @@ public class Analyzer var ret = await UDPClientPool.ReadAddr4BytesAsync( this.ep, this.taskID, - AnalyzerAddr.CAPTURE_DATA_ADDR, + AnalyzerAddr.STORE_OFFSET_ADDR, AnalyzerAddr.CAPTURE_DATA_LENGTH, this.timeout );