diff --git a/.justfile b/.justfile
index e71e46d..6bf715f 100644
--- a/.justfile
+++ b/.justfile
@@ -39,9 +39,11 @@ run-web:
npm run build
npm run preview
+dev: dev-server
+
# 测试服务器
dev-server: _show-dir
- cd server && dotnet run
+ cd server && dotnet run --watch
# 运行网页客户端
dev-web:
diff --git a/package-lock.json b/package-lock.json
index 519c9a5..2dce99e 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -25,7 +25,6 @@
"@tailwindcss/postcss": "^4.0.12",
"@tsconfig/node22": "^22.0.0",
"@types/node": "^22.13.4",
- "@vitejs/plugin-basic-ssl": "^2.0.0",
"@vitejs/plugin-vue": "^5.2.1",
"@vitejs/plugin-vue-jsx": "^4.1.1",
"@vue/tsconfig": "^0.7.0",
@@ -1647,19 +1646,6 @@
"undici-types": "~6.21.0"
}
},
- "node_modules/@vitejs/plugin-basic-ssl": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-2.0.0.tgz",
- "integrity": "sha512-gc9Tjg8bUxBVSTzeWT3Njc0Cl3PakHFKdNfABnZWiUgbxqmHDEn7uECv3fHVylxoYgNzAcmU7ZrILz+BwSo3sA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": "^18.0.0 || ^20.0.0 || >=22.0.0"
- },
- "peerDependencies": {
- "vite": "^6.0.0"
- }
- },
"node_modules/@vitejs/plugin-vue": {
"version": "5.2.3",
"resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.2.3.tgz",
diff --git a/package.json b/package.json
index dfc9ea7..85e520b 100644
--- a/package.json
+++ b/package.json
@@ -31,7 +31,6 @@
"@tailwindcss/postcss": "^4.0.12",
"@tsconfig/node22": "^22.0.0",
"@types/node": "^22.13.4",
- "@vitejs/plugin-basic-ssl": "^2.0.0",
"@vitejs/plugin-vue": "^5.2.1",
"@vitejs/plugin-vue-jsx": "^4.1.1",
"@vue/tsconfig": "^0.7.0",
diff --git a/server/src/Controllers.cs b/server/src/Controllers.cs
index de626a8..66cb836 100644
--- a/server/src/Controllers.cs
+++ b/server/src/Controllers.cs
@@ -192,26 +192,6 @@ public class JtagController : ControllerBase
return "This is Jtag Controller";
}
- ///
- /// 执行一个Jtag命令
- ///
- /// 设备地址
- /// 设备端口
- /// 16进制设备目的地址(Jtag)
- /// 16进制命令
- [HttpPost("RunCommand")]
- [ProducesResponseType(StatusCodes.Status200OK)]
- [ProducesResponseType(StatusCodes.Status500InternalServerError)]
- public async ValueTask RunCommand(string address, int port, string hexDevAddr, string hexCmd)
- {
- var jtagCtrl = new JtagClient.Jtag(address, port);
- var ret = await jtagCtrl.WriteFIFO(Convert.ToUInt32(hexDevAddr, 16), Convert.ToUInt32(hexCmd, 16));
-
- if (ret.IsSuccessful) { return TypedResults.Ok(ret.Value); }
- else { return TypedResults.InternalServerError(ret.Error); }
- }
-
-
///
/// 获取Jtag ID Code
///
@@ -349,6 +329,11 @@ public class JtagController : ControllerBase
return TypedResults.InternalServerError(retBuffer.Error);
revBuffer = retBuffer.Value;
+ for (int i = 0; i < revBuffer.Length; i++)
+ {
+ revBuffer[i] = Common.Number.ReverseBits(revBuffer[i]);
+ }
+
await memoryStream.WriteAsync(revBuffer, 0, bytesRead);
totalBytesRead += bytesRead;
}
diff --git a/server/src/JtagClient.cs b/server/src/JtagClient.cs
index 2153ec3..7a3f7b3 100644
--- a/server/src/JtagClient.cs
+++ b/server/src/JtagClient.cs
@@ -432,199 +432,44 @@ public class Jtag
return Convert.ToUInt32(Common.Number.BytesToUInt64(retPackOpts.Data).Value);
}
- ///
- /// 向指定的 JTAG 设备地址写入数据到 FIFO
- ///
- /// 目标设备地址
- /// 要写入的数据
- /// 写入后的延迟时间(毫秒)
- /// 包含接收数据包的异步结果
- public async ValueTask> WriteFIFO(UInt32 devAddr, UInt32 data, UInt32 delayMilliseconds = 0)
+ async ValueTask> WriteFIFO
+ (UInt32 devAddr, UInt32 data, UInt32 result, UInt32 resultMask = 0xFF_FF_FF_FF, 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> 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"));
+ 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));
- // 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> 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);
-
- 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;
+ {
+ 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> 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> WaitForWriteFIFO
- (UInt32 devAddr, byte[] data, UInt32 result,
- UInt32 resultMask = 0xFF_FF_FF_FF, UInt32 timeout = 10_000, UInt32 cycle = 500)
{
{
- var wrRet = await WriteFIFO(devAddr, data, result, resultMask);
-
- if (!wrRet.IsSuccessful) return new(wrRet.Error);
- if (wrRet.Value) return true;
+ 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"));
}
- // Wait some time
- var ret = false;
- var startTime = DateTime.Now;
- var isTimeout = false;
- var timeleft = TimeSpan.FromMilliseconds(timeout);
- while (!isTimeout)
+ // Delay some time before read register
+ await Task.Delay(TimeSpan.FromMilliseconds(delayMilliseconds));
+
{
- // 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));
+ var ret = await UDPClientPool.ReadAddrWithWait(this.ep, JtagAddr.STATE, result, resultMask, this.timeout);
+ if (!ret.IsSuccessful) return new(ret.Error);
+ return ret.Value;
}
-
- return ret;
}
-
///
/// 清除所有 JTAG 寄存器
///
@@ -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> 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);
diff --git a/src/App.vue b/src/App.vue
index ff979bf..a887650 100644
--- a/src/App.vue
+++ b/src/App.vue
@@ -1,7 +1,10 @@
@@ -54,7 +61,7 @@ provide("theme", {
-