From 1102bba40de6a70bdba43f8fe3a06cab959585e2 Mon Sep 17 00:00:00 2001 From: SikongJueluo Date: Tue, 13 May 2025 13:19:26 +0800 Subject: [PATCH 1/5] fix: jtag download failed --- .justfile | 4 +++- package-lock.json | 14 -------------- package.json | 1 - server/src/Controllers.cs | 5 +++++ vite.config.ts | 2 -- 5 files changed, 8 insertions(+), 18 deletions(-) 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..da9a5d9 100644 --- a/server/src/Controllers.cs +++ b/server/src/Controllers.cs @@ -349,6 +349,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/vite.config.ts b/vite.config.ts index 10dbf8b..fc60a23 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -6,7 +6,6 @@ import vueJsx from '@vitejs/plugin-vue-jsx' import vueDevTools from 'vite-plugin-vue-devtools' import tailwindcss from '@tailwindcss/postcss' import autoprefixer from 'autoprefixer' -import basicSsl from '@vitejs/plugin-basic-ssl' // https://vite.dev/config/ export default defineConfig({ @@ -21,7 +20,6 @@ export default defineConfig({ }), vueJsx(), vueDevTools(), - // basicSsl() ], resolve: { alias: { From eae67d04d4bc247e9fbc81198ebeaaf04e4838cf Mon Sep 17 00:00:00 2001 From: SikongJueluo Date: Tue, 13 May 2025 13:57:57 +0800 Subject: [PATCH 2/5] fix: make boundary scan work --- server/src/JtagClient.cs | 209 +++++---------------------------------- 1 file changed, 26 insertions(+), 183 deletions(-) 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); From eea03f5bc88941ebf673823a4cc158468f52d4b3 Mon Sep 17 00:00:00 2001 From: SikongJueluo Date: Tue, 13 May 2025 18:14:57 +0800 Subject: [PATCH 3/5] feat: upload and download bitstream from the component of project view --- server/src/Controllers.cs | 20 - src/App.vue | 11 +- src/components/CollapsibleSection.vue | 116 +- src/components/Navbar.vue | 11 - src/components/PropertyEditor.vue | 202 +- src/components/PropertyPanel.vue | 352 +- src/components/diagramManager.ts | 3 + src/components/equipments/ETH.vue | 54 +- src/components/equipments/MotherBoard.vue | 128 +- .../templates/PG2L100H_Pango100pro.json | 4118 ++++++++++++++--- src/router/index.ts | 2 - src/views/JtagTest.vue | 45 - src/views/ProjectView.vue | 537 ++- src/views/TestView.vue | 4 +- tsconfig.json | 5 +- 15 files changed, 4243 insertions(+), 1365 deletions(-) delete mode 100644 src/views/JtagTest.vue diff --git a/server/src/Controllers.cs b/server/src/Controllers.cs index da9a5d9..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 /// 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 @@ @@ -105,22 +182,10 @@ defineExpose({ export function getDefaultProps() { return { size: 1, + jtagAddr: "127.0.0.1", + jtagPort: "1234", }; } -// -// export function getCapabilities() { -// return ( -//
-// -// {" "} -// -//
-// ); -// }