diff --git a/.gitea/workflows/build-installer.yaml b/.gitea/workflows/build-installer.yaml index 2edbb56..0c82834 100644 --- a/.gitea/workflows/build-installer.yaml +++ b/.gitea/workflows/build-installer.yaml @@ -118,7 +118,8 @@ jobs: $kpWheel = Get-ChildItem "local_service_win" -Filter "KneronPLUS*.whl" -ErrorAction SilentlyContinue | Select-Object -First 1 if ($kpWheel) { Copy-Item $kpWheel.FullName "$base\installer\payload\scripts\" } New-Item -ItemType Directory -Force -Path "$base\installer\payload\drivers\amd64" - Copy-Item "$base\server\scripts\drivers\kneron_winusb.inf" "$base\installer\payload\drivers\" + Copy-Item "local_service_win\LocalAPI\win_driver\installer_x64.exe" "$base\installer\payload\drivers\" + Copy-Item "local_service_win\LocalAPI\win_driver\kneron_kl520.inf" "$base\installer\payload\drivers\" Copy-Item "local_service_win\LocalAPI\win_driver\amd64\WdfCoInstaller01011.dll" "$base\installer\payload\drivers\amd64\" Copy-Item "local_service_win\LocalAPI\win_driver\amd64\winusbcoinstaller2.dll" "$base\installer\payload\drivers\amd64\" diff --git a/.github/workflows/build-installer.yaml b/.github/workflows/build-installer.yaml index 2edbb56..0c82834 100644 --- a/.github/workflows/build-installer.yaml +++ b/.github/workflows/build-installer.yaml @@ -118,7 +118,8 @@ jobs: $kpWheel = Get-ChildItem "local_service_win" -Filter "KneronPLUS*.whl" -ErrorAction SilentlyContinue | Select-Object -First 1 if ($kpWheel) { Copy-Item $kpWheel.FullName "$base\installer\payload\scripts\" } New-Item -ItemType Directory -Force -Path "$base\installer\payload\drivers\amd64" - Copy-Item "$base\server\scripts\drivers\kneron_winusb.inf" "$base\installer\payload\drivers\" + Copy-Item "local_service_win\LocalAPI\win_driver\installer_x64.exe" "$base\installer\payload\drivers\" + Copy-Item "local_service_win\LocalAPI\win_driver\kneron_kl520.inf" "$base\installer\payload\drivers\" Copy-Item "local_service_win\LocalAPI\win_driver\amd64\WdfCoInstaller01011.dll" "$base\installer\payload\drivers\amd64\" Copy-Item "local_service_win\LocalAPI\win_driver\amd64\winusbcoinstaller2.dll" "$base\installer\payload\drivers\amd64\" diff --git a/edge-ai-platform/Makefile b/edge-ai-platform/Makefile index 9b8cde3..5d9e148 100644 --- a/edge-ai-platform/Makefile +++ b/edge-ai-platform/Makefile @@ -137,8 +137,9 @@ installer-payload: build-server-tray ## Stage payload files for GUI installer fi @# Copy WinUSB driver files (for Windows installer) @mkdir -p installer/payload/drivers/amd64 - cp server/scripts/drivers/kneron_winusb.inf installer/payload/drivers/ - @if [ -d "../local_service_win/LocalAPI/win_driver/amd64" ]; then \ + @if [ -d "../local_service_win/LocalAPI/win_driver" ]; then \ + cp ../local_service_win/LocalAPI/win_driver/installer_x64.exe installer/payload/drivers/; \ + cp ../local_service_win/LocalAPI/win_driver/kneron_kl520.inf installer/payload/drivers/; \ cp ../local_service_win/LocalAPI/win_driver/amd64/WdfCoInstaller01011.dll installer/payload/drivers/amd64/; \ cp ../local_service_win/LocalAPI/win_driver/amd64/winusbcoinstaller2.dll installer/payload/drivers/amd64/; \ echo " WinUSB driver files bundled."; \ diff --git a/edge-ai-platform/installer/platform_windows.go b/edge-ai-platform/installer/platform_windows.go index 7e16705..dbe7dbe 100644 --- a/edge-ai-platform/installer/platform_windows.go +++ b/edge-ai-platform/installer/platform_windows.go @@ -86,35 +86,42 @@ func installLibusb(installDir string) error { return nil } -// installWinUSBDriver extracts the WinUSB driver package from the payload -// and installs it via pnputil so libusb can access Kneron USB devices. +// installWinUSBDriver extracts the Kneron driver installer from the payload +// and runs it to install the WinUSB driver for Kneron USB devices. +// The installer_x64.exe is a libwdi-based tool that handles driver signing +// automatically (self-signed certificate), which pnputil cannot do with +// unsigned INF files. func installWinUSBDriver(installDir string) { driverDir := filepath.Join(installDir, "drivers") - os.MkdirAll(filepath.Join(driverDir, "amd64"), 0755) + os.MkdirAll(driverDir, 0755) - // Extract driver files from embedded payload + // Extract the Kneron driver installer from payload + installerPath := filepath.Join(driverDir, "installer_x64.exe") + data, err := payloadFS.ReadFile("payload/drivers/installer_x64.exe") + if err != nil { + return // not bundled, skip + } + if err := os.WriteFile(installerPath, data, 0755); err != nil { + return + } + + // Also extract the INF + co-installer files (installer_x64.exe needs them in the same directory) driverFiles := map[string]string{ - "payload/drivers/kneron_winusb.inf": filepath.Join(driverDir, "kneron_winusb.inf"), - "payload/drivers/amd64/WdfCoInstaller01011.dll": filepath.Join(driverDir, "amd64", "WdfCoInstaller01011.dll"), - "payload/drivers/amd64/winusbcoinstaller2.dll": filepath.Join(driverDir, "amd64", "winusbcoinstaller2.dll"), + "payload/drivers/kneron_kl520.inf": filepath.Join(driverDir, "kneron_kl520.inf"), + "payload/drivers/amd64/WdfCoInstaller01011.dll": filepath.Join(driverDir, "amd64", "WdfCoInstaller01011.dll"), + "payload/drivers/amd64/winusbcoinstaller2.dll": filepath.Join(driverDir, "amd64", "winusbcoinstaller2.dll"), } - + os.MkdirAll(filepath.Join(driverDir, "amd64"), 0755) for src, dst := range driverFiles { - data, err := payloadFS.ReadFile(src) - if err != nil { - return // driver files not bundled, skip silently - } - if err := os.WriteFile(dst, data, 0644); err != nil { - return + if d, e := payloadFS.ReadFile(src); e == nil { + os.WriteFile(dst, d, 0644) } } - infPath := filepath.Join(driverDir, "kneron_winusb.inf") - - // Use pnputil to add driver to the driver store and install on matching devices. - // This requires admin privileges; pnputil will trigger a UAC prompt if needed. - cmd := exec.Command("pnputil", "/add-driver", infPath, "/install") - cmd.CombinedOutput() // best effort — non-fatal if it fails + // Run the Kneron driver installer (libwdi-based, handles signing automatically) + cmd := exec.Command(installerPath) + cmd.Dir = driverDir + cmd.CombinedOutput() // best effort — non-fatal, may trigger UAC prompt } func checkLibusbInstalled() bool { diff --git a/edge-ai-platform/scripts/build-installer.ps1 b/edge-ai-platform/scripts/build-installer.ps1 index 418a024..d4c3f8b 100644 --- a/edge-ai-platform/scripts/build-installer.ps1 +++ b/edge-ai-platform/scripts/build-installer.ps1 @@ -94,16 +94,17 @@ if ($kpWheel) { Write-Host " KneronPLUS wheel not found, skipping." -ForegroundColor Yellow } -# Copy WinUSB driver files +# Copy WinUSB driver files (Kneron official installer + INF + co-installers) New-Item -ItemType Directory -Force -Path installer\payload\drivers\amd64 | Out-Null -Copy-Item server\scripts\drivers\kneron_winusb.inf installer\payload\drivers\ -$winDriverDir = Join-Path $repoRoot "local_service_win\LocalAPI\win_driver\amd64" -if (Test-Path $winDriverDir) { - Copy-Item (Join-Path $winDriverDir "WdfCoInstaller01011.dll") installer\payload\drivers\amd64\ - Copy-Item (Join-Path $winDriverDir "winusbcoinstaller2.dll") installer\payload\drivers\amd64\ +$winDriverBase = Join-Path $repoRoot "local_service_win\LocalAPI\win_driver" +if (Test-Path $winDriverBase) { + Copy-Item (Join-Path $winDriverBase "installer_x64.exe") installer\payload\drivers\ + Copy-Item (Join-Path $winDriverBase "kneron_kl520.inf") installer\payload\drivers\ + Copy-Item (Join-Path $winDriverBase "amd64\WdfCoInstaller01011.dll") installer\payload\drivers\amd64\ + Copy-Item (Join-Path $winDriverBase "amd64\winusbcoinstaller2.dll") installer\payload\drivers\amd64\ Write-Host " WinUSB driver files bundled." -ForegroundColor Green } else { - Write-Host " WinUSB co-installer DLLs not found, skipping." -ForegroundColor Yellow + Write-Host " WinUSB driver files not found, skipping." -ForegroundColor Yellow } $fileCount = (Get-ChildItem -Recurse installer\payload -File).Count