You plug the USBasp in, Windows chimes, and then nothing works. Device Manager shows a yellow triangle on an “Unknown Device”, and avrdude answers with the line every AVR beginner has met: could not find USB device with vid=0x16c0 pid=0x5dc. The programmer isn’t broken and the cable is fine — Windows simply has no driver that speaks libusb, and USBasp needs one. Zadig installs it in about sixty seconds. Here’s the tool, the exact clicks, and how to undo it if you point it at the wrong device.

⬇ Zadig 2.9 (official build)

Windows 7 → 11 · 5.3 MB · portable, no install · signed drivers

Download Zadig 2.9

File: Zadig-2.9.zip · 5.1 MB · SHA-256: a1a653be3be514116eea78fb024bf44cc1927907e54daed29277142c3b60dd5f · unmodified mirror of GitHub pbatard/libwdi, release v1.5.1 · the zadig-2.9.exe inside (5,334,088 bytes) hashes 4ecaa95df3da3621486a043aef8b3050b8bafe7c901402871e816229ef82039b, identical to the official asset re-downloaded on 22 Oct 2026

Unmodified official build from the libwdi project. Single executable inside the ZIP — nothing is installed on your PC until you press the button in Zadig itself.

Zadig is versioned separately from the libwdi library it is built on, which is why the GitHub release is called “libwdi 1.5.1” and the file is zadig-2.9.exe. The table is read from the releases API of pbatard/libwdi on 22 Oct 2026; 2.9 is still the current build and the only one whose libusb-win32 driver also installs on Windows 11 ARM64.

Zadig libwdi release Date Official asset What changed
2.9 (current) v1.5.1 13 Jun 2024 zadig-2.9.exe, 5,334,088 bytes libusb-win32 ARM64 installation, UAC fix, filter-installer fix (release notes)
2.8 v1.5.0 1 Mar 2023 zadig-2.8.exe, 5,256,264 bytes ARM64 for WinUSB and USB Serial only; the libusb-win32 1.3.0.2 notes warn of an issue with 2.8
2.7 v1.4.1 1 Nov 2021 zadig-2.7.exe, 5,185,080 bytes maintenance
2.6 v1.4.0 (tag b755) 4 Sep 2021 zadig-2.6.exe, 5,168,184 bytes maintenance
2.5 v1.3.1 (tag b730) 30 Mar 2020 zadig-2.5.exe, 5,157,432 bytes maintenance
2.4 tag b721 27 Dec 2018 zadig-2.4.exe, 5,158,456 bytes the build most old forum guides still link

What Zadig actually does

A USBasp doesn’t pretend to be a COM port or a keyboard. It’s a raw USB device, and the software talking to it — avrdude, the Arduino IDE, khazama — reaches it through a generic USB library. Windows ships no such driver and no automatic match for vendor ID 16C0, product ID 05DC, so the device sits unclaimed forever.

Zadig is a driver installer, not a driver. It takes one of four generic drivers and binds it to the device you select, generating the .inf and certificate on the fly. That’s why the same tool shows up in guides for the USBasp, for STM32 DFU flashing, for SDR dongles and for game controllers: different hardware, same missing plumbing.

Install the USBasp driver, step by step

  1. Plug the USBasp into a rear USB port, directly on the PC — not through a hub;
  2. Extract the ZIP and run zadig-2.9.exe. It asks for admin rights; that’s expected, driver binding needs them;
  3. Open Options → List All Devices. Without this checkbox the dropdown is usually empty and people give up here;
  4. In the dropdown, select USBasp. Confirm the USB ID underneath reads 16C0 05DC — that’s the proof you picked the right device;
  5. In the driver box on the right, click the little arrows until it shows libusb-win32;
  6. Press Install Driver (or Replace Driver) and wait. It takes ten to thirty seconds and the window may look frozen — let it finish;
  7. Unplug and replug the programmer. In Device Manager it now appears under libusb-win32 devices as USBasp, with no yellow triangle.

Now avrdude -c usbasp -p m328p -v should report the device instead of the vid/pid error.

Which of the four drivers to pick

This is where most people guess, and a wrong guess costs a reinstall. The short version: for USBasp with avrdude or the Arduino IDE, choose libusb-win32.

Driver in the Zadig box Version embedded in Zadig 2.9 Pick it for Why
libusb-win32 (libusb0.sys) 1.4.0.0, 22 Feb 2024 (the libusb-win32 release notes name Zadig 2.9 as its installer) USBasp, USBtinyISP and anything driven by classic avrdude 6.x, including the avrdude 6.3 inside Arduino AVR Boards up to 1.8.6 implements the old libusb-0.1 API those builds expect
WinUSB Microsoft’s, from the Windows Kits 8.0 redistributable libwdi embeds (6.1.7600.16385) avrdude 7.x and 8.x official MSVC builds, dfu-util, STM32 DFU, ST-Link utilities the avrdude project’s wiki: its MSVC builds support “the native WinUSB driver” and “the legacy driver libusb0.sys”
libusbK 3.1.0.0 the second thing to try when “Upload Using Programmer” in the Arduino IDE fails on Windows 11 with libusb-win32 bound Arduino forum thread 1384943 (May 2025): libusb-win32 gave “cannot query manufacturer for device”, switching the same USBasp to libusbK fixed it
USB Serial (CDC) (usbser) Windows’ own CDC hardware whose own driver is missing turns the device into a COM port; never for a USBasp

The USB ID you check in step 4 comes from avrdude.conf: the usbasp entry carries usbvid = 0x16c0 (“VOTI”) and usbpid = 0x05dc (“Obdev’s free shared PID”), and the usbtiny entry 0x1781:0x0c9f. The exact failure line, could not find USB device with vid=0x16c0 pid=0x5dc, and the warning cannot set sck period; please check for usbasp firmware update are both printed by src/usbasp.c.

If you installed libusb-win32 and your tool still can’t see the device, running Zadig again and switching to WinUSB is a perfectly reasonable second attempt. The two are interchangeable at the click level; only the library on the software side decides which one is right.

When it still doesn’t work

The dropdown is empty. Options → List All Devices wasn’t ticked, or the device isn’t enumerating at all. If Device Manager shows nothing new when you replug, suspect a charge-only USB cable — the single most common false alarm on any bench.

“Driver Installation: FAILED (Access denied)”. The line is Zadig’s own: zadig.c prints “Driver Installation: FAILED (%s)” with libwdi’s error text, and “Access denied” is WDI_ERROR_ACCESS. Zadig wasn’t elevated, or a security suite blocked it. Right-click → Run as administrator, and close any programmer software that might be holding the device open.

The install hangs for minutes. Windows is looking for a driver online. Wait it out once; it completes. Disconnecting from the network first makes it noticeably faster.

You replaced the driver on the wrong device. It happens — List All Devices shows your mouse too. Fix: Device Manager → View → Show hidden devices → right-click the device → Uninstall device, tick Delete the driver software for this device, then replug. Windows restores its own driver. This is why step 4 above says to verify 16C0 05DC before clicking.

avrdude finds the device but says “cannot set sck period”. Good news, actually: the driver is working. That warning comes from old USBasp firmware on clone boards and is usually harmless. If the target genuinely fails to program, fit the slow-SCK jumper (JP3 on most clones) — required when the target’s clock is below about 1.5 MHz, which includes any factory-fresh ATmega running on its 1 MHz internal oscillator.

The numbers behind that sentence are worth knowing, because they make the failure predictable rather than mysterious: a factory ATmega328P runs at 1 MHz, its datasheet caps ISP clock at a quarter of that (250 kHz), and a stock USBasp defaults to 375 kHz. We work it through, with the -B values that fix it, in the AVRDUDE for Windows guide.

“Target doesn’t answer” or signature 0x000000. Not a driver problem anymore. Check the ISP cable orientation, that pin 1 matches on both ends, and that the target actually has power.

What else Zadig is for

Keep it on the bench — the same fix applies well beyond AVR work. USBtinyISP and other V-USB programmers need libusb-win32 exactly like the USBasp. STM32 boards in DFU mode, ST-Link clones and dfu-util workflows want WinUSB. SDR dongles and various logic analysers ship with instructions that boil down to “run Zadig, pick WinUSB”. The cheap FX2 logic analyzer is the fiddliest of the bunch: it renumerates after firmware upload, so you have to run Zadig twice — see the PulseView download guide.

One important exception: serial adapters and the CH341A programmer do not use Zadig. Those have real manufacturer drivers — the CH341A uses the WCH package, and USB-to-serial chips use their own: CH340, CP2102 or the troublesome PL2303. Running Zadig on a working COM port device only breaks it. There is one exception to that exception: if you drive the CH341A with flashrom on Windows instead of AsProgrammer, flashrom speaks libusb and does want WinUSB bound with Zadig — swap it back to the WCH driver when you return to AsProgrammer.

And one trap that costs people their board: on a composite device, the interface you pick in the Zadig dropdown matters as much as the driver. A Raspberry Pi Pico in BOOTSEL mode exposes two — interface 0 is the mass-storage drive, interface 1 is the vendor-specific one picotool needs. Bind WinUSB to interface 0 by mistake and the RPI-RP2 drive vanishes until you undo it in Device Manager. The guide to a Pico that is not detected has the full symptom table and the undo procedure.

FAQ

Is Zadig safe? Yes. It’s open source, part of the libwdi project by the author of Rufus, and the drivers it installs are digitally signed — no test mode, no Secure Boot fiddling. The risk isn’t the tool, it’s selecting the wrong device in the dropdown.

Do I need to install Zadig? No. It’s a single portable executable; run it, use it, keep it in your tools folder. Nothing is left running in the background.

Does it work on Windows 11? Yes. Zadig 2.9 (June 2024) is the current build, its libusb-win32 is the 1.4.0.0 release of February 2024, and 2.9 is the first that also installs libusb-win32 on Windows 11 ARM64. The one Windows 11 report in the Arduino forum where libusb-win32 stopped working (thread 1384943) was fixed by binding libusbK instead; see the table above.

Will this give me a COM port? No, and it shouldn’t. A USBasp is not a serial device; there will be no entry under Ports (COM & LPT). Success looks like a clean “USBasp” under libusb-win32 devices.

Do I have to run it again after every reboot? No. The driver binding is permanent, per device. Plug the same USBasp into a different USB port and Windows reuses it. A different USBasp with the same VID/PID also works straight away.

My USBasp worked on the old PC without any of this. Then someone had already run Zadig — or an installer that bundles the same libusb driver — on that machine. Nothing has changed in the hardware.

Can I use it with the Arduino IDE? Yes. Once the driver is bound, choose Tools → Programmer → USBasp and use “Upload Using Programmer”. The IDE calls the same avrdude underneath.

One gotcha if you drive the USBasp from NeoProgrammer: releases 2.2.0.5 and 2.2.0.7 shipped new USBasp firmware and made the upgrade mandatory. Zadig gets Windows talking to the device, but stale firmware still breaks AVR and I²C operations in ways that look like bad wiring — see the NeoProgrammer guide.

Verdict

The USBasp is a five-dollar programmer that fails at the first hurdle for a reason that has nothing to do with its price: Windows has no generic USB driver to give it. Zadig closes that gap in a minute, with no installer, no signup and no lasting footprint — check the 16C0 05DC ID before you click, pick libusb-win32, and get back to burning bootloaders. If you’ve outgrown ISP programming and want something that reads and writes chips off-board, the TL866II Plus and the XGecu T48 are the natural next bench purchases.

One device to never point Zadig at: a USB microscope or any other camera. Those are USB Video Class devices, and Windows already has the right driver for them — swapping it for WinUSB makes the camera disappear from every application on the machine. See USB microscope software for why the driver you are looking for is already installed.

Sources