add: 逻辑分析仪后端适配DDR存储功能
This commit is contained in:
		@@ -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;
 | 
			
		||||
 | 
			
		||||
    /// <summary> 
 | 
			
		||||
    /// 0x0000_0000    R/W [ 0]      capture on:    置1开始等待捕获,0停止捕获。捕获到信号后该位自动清零。  <br/>
 | 
			
		||||
@@ -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;
 | 
			
		||||
 | 
			
		||||
    /// <summary> 
 | 
			
		||||
    /// 0x0100_0000 - 0x0100_03FF 只读 32位波形存储,得到的32位数据中低八位最先捕获,高八位最后捕获。<br/>
 | 
			
		||||
    ///                                共1024个地址,每个地址存储4组,深度为4096。<br/>
 | 
			
		||||
    /// </summary>
 | 
			
		||||
    public const UInt32 CAPTURE_DATA_ADDR = BASE + 0x0100_0000;
 | 
			
		||||
    public const Int32 CAPTURE_DATA_LENGTH = 1024;
 | 
			
		||||
    public const Int32 CAPTURE_DATA_PRELOAD = 512;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/// <summary>
 | 
			
		||||
@@ -231,21 +239,87 @@ public class Analyzer
 | 
			
		||||
    /// <returns>操作结果,成功返回true,否则返回异常信息</returns>
 | 
			
		||||
    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;
 | 
			
		||||
        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
 | 
			
		||||
        );
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user