fix: make boundary scan work
This commit is contained in:
parent
1102bba40d
commit
eae67d04d4
|
@ -432,199 +432,44 @@ public class Jtag
|
|||
return Convert.ToUInt32(Common.Number.BytesToUInt64(retPackOpts.Data).Value);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 向指定的 JTAG 设备地址写入数据到 FIFO
|
||||
/// </summary>
|
||||
/// <param name="devAddr">目标设备地址</param>
|
||||
/// <param name="data">要写入的数据</param>
|
||||
/// <param name="delayMilliseconds">写入后的延迟时间(毫秒)</param>
|
||||
/// <returns>包含接收数据包的异步结果</returns>
|
||||
public async ValueTask<Result<RecvDataPackage>> WriteFIFO(UInt32 devAddr, UInt32 data, UInt32 delayMilliseconds = 0)
|
||||
{
|
||||
var ret = false;
|
||||
var opts = new SendAddrPackOptions();
|
||||
|
||||
|
||||
opts.BurstType = BurstType.FixedBurst;
|
||||
opts.BurstLength = 0;
|
||||
opts.CommandID = 0;
|
||||
opts.Address = devAddr;
|
||||
|
||||
// Write Jtag State Register
|
||||
opts.IsWrite = true;
|
||||
ret = await UDPClientPool.SendAddrPackAsync(ep, new SendAddrPackage(opts));
|
||||
if (!ret) return new(new Exception("Send 1st address package failed!"));
|
||||
// Send Data Package
|
||||
ret = await UDPClientPool.SendDataPackAsync(ep,
|
||||
new SendDataPackage(Common.Number.NumberToBytes(data, 4).Value));
|
||||
if (!ret) return new(new Exception("Send data package failed!"));
|
||||
|
||||
// Check Msg Bus
|
||||
if (!MsgBus.IsRunning)
|
||||
return new(new Exception("Message bus not working!"));
|
||||
// Wait for Write Ack
|
||||
var udpWriteAck = await MsgBus.UDPServer.WaitForAckAsync(address, port);
|
||||
if (!udpWriteAck.IsSuccessful) return new(udpWriteAck.Error);
|
||||
else if (!udpWriteAck.Value.IsSuccessful)
|
||||
return new(new Exception("Send address package failed"));
|
||||
|
||||
// Delay some time before read register
|
||||
await Task.Delay(TimeSpan.FromMilliseconds(delayMilliseconds));
|
||||
|
||||
// Read Jtag State Register
|
||||
opts.IsWrite = false;
|
||||
opts.Address = JtagAddr.STATE;
|
||||
ret = await UDPClientPool.SendAddrPackAsync(ep, new SendAddrPackage(opts));
|
||||
if (!ret) return new(new Exception("Send 2rd Address Package Failed!"));
|
||||
// Wait for Read Data
|
||||
var udpDataResp = await MsgBus.UDPServer.WaitForDataAsync(address, port);
|
||||
if (!udpDataResp.IsSuccessful) return new(udpDataResp.Error);
|
||||
else if (!udpDataResp.Value.IsSuccessful)
|
||||
return new(new Exception("Send address package failed"));
|
||||
|
||||
return udpDataResp.Value;
|
||||
}
|
||||
|
||||
async ValueTask<Result<RecvDataPackage>> WriteFIFO(UInt32 devAddr, byte[] dataArray, UInt32 delayMilliseconds = 0)
|
||||
{
|
||||
var ret = false;
|
||||
var opts = new SendAddrPackOptions();
|
||||
|
||||
|
||||
opts.BurstType = BurstType.FixedBurst;
|
||||
opts.CommandID = 0;
|
||||
opts.Address = devAddr;
|
||||
|
||||
// Check Msg Bus
|
||||
if (!MsgBus.IsRunning)
|
||||
return new(new Exception("Message bus not working!"));
|
||||
|
||||
var writeTimes = dataArray.Length / (256 * (32 / 8)) + 1;
|
||||
for (var i = 0; i < writeTimes; i++)
|
||||
{
|
||||
// Sperate Data Array
|
||||
var isLastData = i == writeTimes - 1;
|
||||
var sendDataArray =
|
||||
isLastData ?
|
||||
dataArray[(i * (256 * (32 / 8)))..] :
|
||||
dataArray[(i * (256 * (32 / 8)))..((i + 1) * (256 * (32 / 8)))];
|
||||
|
||||
// Write Jtag State Register
|
||||
opts.IsWrite = true;
|
||||
opts.BurstLength = ((byte)(sendDataArray.Length / 4 - 1));
|
||||
ret = await UDPClientPool.SendAddrPackAsync(ep, new SendAddrPackage(opts));
|
||||
if (!ret) return new(new Exception("Send 1st address package failed!"));
|
||||
|
||||
// Send Data Package
|
||||
ret = await UDPClientPool.SendDataPackAsync(ep, new SendDataPackage(sendDataArray));
|
||||
if (!ret) return new(new Exception("Send data package failed!"));
|
||||
|
||||
// Wait for Write Ack
|
||||
var udpWriteAck = await MsgBus.UDPServer.WaitForAckAsync(address, port);
|
||||
if (!udpWriteAck.IsSuccessful) return new(udpWriteAck.Error);
|
||||
else if (!udpWriteAck.Value.IsSuccessful)
|
||||
return new(new Exception("Send address package failed"));
|
||||
}
|
||||
|
||||
// Delay some time before read register
|
||||
await Task.Delay(TimeSpan.FromMilliseconds(delayMilliseconds));
|
||||
|
||||
// Read Jtag State Register
|
||||
opts.IsWrite = false;
|
||||
opts.BurstLength = 0;
|
||||
opts.Address = JtagAddr.STATE;
|
||||
ret = await UDPClientPool.SendAddrPackAsync(ep, new SendAddrPackage(opts));
|
||||
if (!ret) return new(new Exception("Send 2rd Address Package Failed!"));
|
||||
// Wait for Read Data
|
||||
var udpDataResp = await MsgBus.UDPServer.WaitForDataAsync(address, port);
|
||||
if (!udpDataResp.IsSuccessful) return new(udpDataResp.Error);
|
||||
else if (!udpDataResp.Value.IsSuccessful)
|
||||
return new(new Exception("Send address package failed"));
|
||||
|
||||
return udpDataResp.Value;
|
||||
}
|
||||
|
||||
async ValueTask<Result<bool>> WriteFIFO
|
||||
(UInt32 devAddr, UInt32 data, UInt32 result, UInt32 resultMask = 0xFF_FF_FF_FF, UInt32 delayMilliseconds = 0)
|
||||
{
|
||||
var ret = false;
|
||||
var retPack = await WriteFIFO(devAddr, data, delayMilliseconds);
|
||||
if (!retPack.IsSuccessful) return new(retPack.Error);
|
||||
{
|
||||
var ret = await UDPClientPool.WriteAddr(this.ep, devAddr, data, this.timeout);
|
||||
if (!ret.IsSuccessful) return new(ret.Error);
|
||||
if (!ret.Value) return new(new Exception("Write FIFO failed"));
|
||||
}
|
||||
|
||||
if (retPack.Value.Options.Data is null)
|
||||
return new(new Exception($"Data is Null, package: {retPack.Value.Options.ToString()}"));
|
||||
// Delay some time before read register
|
||||
await Task.Delay(TimeSpan.FromMilliseconds(delayMilliseconds));
|
||||
|
||||
var retPackLen = retPack.Value.Options.Data.Length;
|
||||
if (retPackLen != 4)
|
||||
return new(new Exception($"RecvDataPackage BodyData Length not Equal to 4: Total {retPackLen} bytes"));
|
||||
|
||||
if (Common.Number.BitsCheck(
|
||||
Common.Number.BytesToUInt64(retPack.Value.Options.Data).Value, result, resultMask))
|
||||
ret = true;
|
||||
|
||||
return ret;
|
||||
{
|
||||
var ret = await UDPClientPool.ReadAddrWithWait(this.ep, JtagAddr.STATE, result, resultMask, this.timeout);
|
||||
if (!ret.IsSuccessful) return new(ret.Error);
|
||||
return ret.Value;
|
||||
}
|
||||
}
|
||||
|
||||
async ValueTask<Result<bool>> WriteFIFO
|
||||
(UInt32 devAddr, byte[] data, UInt32 result, UInt32 resultMask = 0xFF_FF_FF_FF, UInt32 delayMilliseconds = 0)
|
||||
{
|
||||
var ret = false;
|
||||
var retPack = await WriteFIFO(devAddr, data, delayMilliseconds);
|
||||
|
||||
if (retPack.Value.Options.Data is null)
|
||||
return new(new Exception($"Data is Null, package: {retPack.Value.Options.ToString()}"));
|
||||
|
||||
var retPackLen = retPack.Value.Options.Data.Length;
|
||||
if (retPackLen != 4)
|
||||
return new(new Exception($"RecvDataPackage BodyData Length not Equal to 4: Total {retPackLen} bytes"));
|
||||
|
||||
if (Common.Number.BitsCheck(
|
||||
Common.Number.BytesToUInt64(retPack.Value.Options.Data).Value, result, resultMask))
|
||||
ret = true;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
async ValueTask<Result<bool>> WaitForWriteFIFO
|
||||
(UInt32 devAddr, byte[] data, UInt32 result,
|
||||
UInt32 resultMask = 0xFF_FF_FF_FF, UInt32 timeout = 10_000, UInt32 cycle = 500)
|
||||
{
|
||||
var ret = await UDPClientPool.WriteAddr(this.ep, devAddr, data, this.timeout);
|
||||
if (!ret.IsSuccessful) return new(ret.Error);
|
||||
if (!ret.Value) return new(new Exception("Write FIFO failed"));
|
||||
}
|
||||
|
||||
// Delay some time before read register
|
||||
await Task.Delay(TimeSpan.FromMilliseconds(delayMilliseconds));
|
||||
|
||||
{
|
||||
var wrRet = await WriteFIFO(devAddr, data, result, resultMask);
|
||||
|
||||
if (!wrRet.IsSuccessful) return new(wrRet.Error);
|
||||
if (wrRet.Value) return true;
|
||||
var ret = await UDPClientPool.ReadAddrWithWait(this.ep, JtagAddr.STATE, result, resultMask, this.timeout);
|
||||
if (!ret.IsSuccessful) return new(ret.Error);
|
||||
return ret.Value;
|
||||
}
|
||||
|
||||
// Wait some time
|
||||
var ret = false;
|
||||
var startTime = DateTime.Now;
|
||||
var isTimeout = false;
|
||||
var timeleft = TimeSpan.FromMilliseconds(timeout);
|
||||
while (!isTimeout)
|
||||
{
|
||||
// Check whether timeout
|
||||
var elapsed = DateTime.Now - startTime;
|
||||
isTimeout = elapsed >= TimeSpan.FromMilliseconds(timeout);
|
||||
if (isTimeout) break;
|
||||
timeleft = TimeSpan.FromMilliseconds(timeout) - elapsed;
|
||||
|
||||
// Check FIFO
|
||||
var retPack = await ReadFIFO(JtagAddr.STATE);
|
||||
if (Common.Number.BitsCheck(retPack.Value, result, resultMask))
|
||||
{
|
||||
ret = true;
|
||||
break;
|
||||
}
|
||||
|
||||
// Wait
|
||||
await Task.Delay(TimeSpan.FromMilliseconds(cycle));
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 清除所有 JTAG 寄存器
|
||||
/// </summary>
|
||||
|
@ -718,17 +563,16 @@ public class Jtag
|
|||
if (!ret.IsSuccessful) return new(ret.Error);
|
||||
else if (!ret.Value) return new(new Exception("Write CMD_JTAG_LOAD_DR_CAREI Failed"));
|
||||
}
|
||||
|
||||
{
|
||||
var ret = await WaitForWriteFIFO(
|
||||
var ret = await WriteFIFO(
|
||||
JtagAddr.WRITE_DATA,
|
||||
bytesArray, 0x01_00_00_00,
|
||||
JtagState.CMD_EXEC_FINISH,
|
||||
timeout, cycle);
|
||||
JtagState.CMD_EXEC_FINISH);
|
||||
|
||||
if (!ret.IsSuccessful) return new(ret.Error);
|
||||
else if (!ret.Value) return new(new Exception("Write Data Failed"));
|
||||
return ret.Value;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
async ValueTask<Result<UInt32>> LoadDRCareOutput(UInt32 UInt32Num)
|
||||
|
@ -753,7 +597,7 @@ public class Jtag
|
|||
var ret = await WriteFIFO(
|
||||
JtagAddr.WRITE_CMD,
|
||||
Common.Number.MultiBitsToNumber(JtagCmd.CMD_JTAG_LOAD_DR_CAREO, JtagCmd.LEN_CMD_JTAG, 32 * UInt32Num, 28).Value,
|
||||
0x01_00_00_00, JtagState.CMD_EXEC_FINISH);
|
||||
JtagState.CMD_EXEC_FINISH, JtagState.CMD_EXEC_FINISH);
|
||||
|
||||
if (ret.Value)
|
||||
{
|
||||
|
@ -955,11 +799,10 @@ public class Jtag
|
|||
|
||||
ret = await ExecRDCmd(JtagCmd.JTAG_DR_SAMPLE);
|
||||
if (!ret.IsSuccessful) return new(ret.Error);
|
||||
else if (!ret.Value) return new(new Exception("Jtag Execute Command JTAG_DR_JRST Failed"));
|
||||
else if (!ret.Value) return new(new Exception("Jtag Execute Command JTAG_DR_SAMPLE Failed"));
|
||||
|
||||
var retData = await LoadDRCareOutputArray(((uint)(portNum % 32 == 0 ? portNum / 32 : portNum / 32 + 1)));
|
||||
if (!retData.IsSuccessful)
|
||||
return new(new Exception("Read Status Reg Failed"));
|
||||
if (!retData.IsSuccessful) return new(retData.Error);
|
||||
|
||||
ret = await CloseTest();
|
||||
if (!ret.IsSuccessful) return new(ret.Error);
|
||||
|
|
Loading…
Reference in New Issue