add: 逻辑分析仪后端适配DDR存储功能

This commit is contained in:
alivender 2025-07-29 20:38:31 +08:00
parent 6c5250f9c2
commit 6dfd275091
1 changed files with 85 additions and 11 deletions

View File

@ -8,6 +8,8 @@ namespace Peripherals.LogicAnalyzerClient;
static class AnalyzerAddr static class AnalyzerAddr
{ {
const UInt32 BASE = 0x9000_0000; const UInt32 BASE = 0x9000_0000;
const UInt32 DMA1_BASE = 0x7000_0000;
const UInt32 DDR_BASE = 0x0000_0000;
/// <summary> /// <summary>
/// 0x0000_0000 R/W [ 0] capture on: 置1开始等待捕获0停止捕获。捕获到信号后该位自动清零。 <br/> /// 0x0000_0000 R/W [ 0] capture on: 置1开始等待捕获0停止捕获。捕获到信号后该位自动清零。 <br/>
@ -53,13 +55,19 @@ static class AnalyzerAddr
BASE + 0x0000_0016, BASE + 0x0000_0016,
BASE + 0x0000_0017, 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;
/// <summary> /// <summary>
/// 0x0100_0000 - 0x0100_03FF 只读 32位波形存储得到的32位数据中低八位最先捕获高八位最后捕获。<br/> /// 0x0100_0000 - 0x0100_03FF 只读 32位波形存储得到的32位数据中低八位最先捕获高八位最后捕获。<br/>
/// 共1024个地址每个地址存储4组深度为4096。<br/> /// 共1024个地址每个地址存储4组深度为4096。<br/>
/// </summary> /// </summary>
public const UInt32 CAPTURE_DATA_ADDR = BASE + 0x0100_0000;
public const Int32 CAPTURE_DATA_LENGTH = 1024; public const Int32 CAPTURE_DATA_LENGTH = 1024;
public const Int32 CAPTURE_DATA_PRELOAD = 512;
} }
/// <summary> /// <summary>
@ -231,11 +239,76 @@ public class Analyzer
/// <returns>操作结果成功返回true否则返回异常信息</returns> /// <returns>操作结果成功返回true否则返回异常信息</returns>
public async ValueTask<Result<bool>> SetCaptureMode(bool captureOn, bool force) public async ValueTask<Result<bool>> 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; UInt32 value = 0;
if (captureOn) value |= 1 << 0; if (captureOn) value |= 1 << 0;
{
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 (force) value |= 1 << 8; if (force) value |= 1 << 8;
{
var ret = await UDPClientPool.WriteAddr(this.ep, this.taskID, AnalyzerAddr.CAPTURE_MODE, value, this.timeout); var ret = await UDPClientPool.WriteAddr(this.ep, this.taskID, AnalyzerAddr.CAPTURE_MODE, value, this.timeout);
if (!ret.IsSuccessful) if (!ret.IsSuccessful)
{ {
@ -247,6 +320,7 @@ public class Analyzer
logger.Error("WriteAddr to CAPTURE_MODE returned false"); logger.Error("WriteAddr to CAPTURE_MODE returned false");
return new(new Exception("Failed to set capture mode")); return new(new Exception("Failed to set capture mode"));
} }
}
return true; return true;
} }
@ -332,7 +406,7 @@ public class Analyzer
var ret = await UDPClientPool.ReadAddr4BytesAsync( var ret = await UDPClientPool.ReadAddr4BytesAsync(
this.ep, this.ep,
this.taskID, this.taskID,
AnalyzerAddr.CAPTURE_DATA_ADDR, AnalyzerAddr.STORE_OFFSET_ADDR,
AnalyzerAddr.CAPTURE_DATA_LENGTH, AnalyzerAddr.CAPTURE_DATA_LENGTH,
this.timeout this.timeout
); );