Skip to content

udev identifier inventory

Generated by scripts/gen_udev_inventory.py from the sweep in scripts/udev-sweep.sh. Do not edit by hand — regenerate.

Swept: 2026-09-12, debian-13
Packages shipping udev rules: 125
Distinct USB identifiers found: 1965
Already in our hardware catalog: 280
Available and not yet carried: 1685

What this is

A distribution's udev rules are a primary source about hardware we will never own, written and maintained by the people who ship the drivers. They are the same kind of asset as the Debian Blend task lists: curated, machine-readable, and unmined by anyone in this space.

The rtl-sdr entry is why this exists. It carried three identifiers and Debian's librtlsdr0 rule carries 42 — the missing 39 being rebadged DVB-T sticks from Hauppauge, Terratec, Dexatek and Gigabyte, all RTL2832U underneath. Every one of those meant a working device with no /dev symlink and no error message anywhere in the chain, which is the failure this catalog refuses to guess its way into, reached by omission instead.

Nothing is filtered out of the sweep. Every package in the archive that ships a udev rule is downloaded and read — a curated shortlist is how the rtl-sdr gap happened in the first place. The section split below decides only what gets a detailed table. That claim was true of packages and false of syntax until 2026-09-12: the parser read only ATTRS{idVendor}, and a rule written as ENV{PRODUCT}=="403/de58/*" or ENV{ID_VENDOR_ID} had no row — brltty's whole file, among others. All three syntaxes are read now (scripts/udev_rule_pairs.py, D-047); brltty itself ships no rules on Debian 13, and docs/reference/brltty-inventory.md measures it on the targets that do.

By archive section

Section Packages Identifiers Not yet carried
libs 28 273 203
utils 19 191 189
electronics 17 134 16
admin 16 273 272
science 8 20 9
misc 7 33 20
hamradio 5 9 5
devel 4 13 12
sound 3 88 88
graphics 2 35 35
games 2 59 59
net 2 23 23
libdevel 2 2 1
comm 2 720 715
video 2 49 49
python 2 8 8
metapackages 1 3 3
embedded 1 100 0
kde 1 7 7
perl 1 40 40

Bold sections are the ones detailed below. The others are printers, scanners, storage, input devices and desktop plumbing — swept and counted, not tabulated.

Packages worth mining

Ordered by how many identifiers they carry that we do not.

Package Section Rule file Identifiers Not yet carried
usb-modeswitch-data comm 40-usb_modeswitch.rules 414 414
modemmanager comm 77-mm-broadmobi-port-types.rules 320 315
libsigrok4t64 libs 60-libsigrok.rules 88 84
libgphoto2-6t64 libs 60-libgphoto2-6t64.rules 33 33
knxd net 60-knxd.rules 22 22
libifd-cyberjack6 libs 60-libifd-cyberjack6.rules 19 19
libnjb5 libs 45-libnjb.rules 14 14
libnitrokey-common libs 41-nitrokey.rules 12 11
qlcplus misc z65-anyma-udmx.rules 11 9
libam7xxx0.1 libs 60-libam7xxx0.1.rules 6 6
ola electronics 60-ola.rules 8 6
libticables2-8 libs 69-libticables2-8.rules 5 5
0xffff misc 60-0xffff.rules 4 4
libdjconsole-data libs 45-hpdjconsole.rules 4 4
libx52pro0 libs 60-x52pro.rules 4 4
dfu-util electronics 60-dfu-util.rules 3 3
goldencheetah misc 60-goldencheetah.rules 3 3
indi-dsi science 99-meadedsi.rules 3 3
libccid libs 92-libccid.rules 3 3
libfreenect0.5t64 libs 60-libfreenect0.5t64.rules 3 3
libhackrf0 libs 60-libhackrf0.rules 6 3
linuxcnc-uspace misc 99-shuttle.rules 3 3
tucnak hamradio 60-tucnak.rules 3 3
ubertooth science 40-ubertooth.rules 5 3
libbmusb6 libs 70-bmusb.rules 2 2
libm2k0.9.0 libs 53-adi-m2k-usb-0.9.0.rules 2 2
libmirisdr4 libs 60-libmirisdr4.rules 4 2
libmtp-common libs 69-libmtp.rules 2 2
libnxt electronics 60-libnxt.rules 2 2
usbrelay electronics 92-usbrelay.rules 2 2
direwolf hamradio 99-direwolf-cmedia.rules 1 1
dmrconfig hamradio 60-dmrconfig.rules 3 1
eegdev-plugins-free libs 60-eegdev-plugins-free.rules 1 1
eg25-manager net 80-modem-eg25.rules 1 1
galileo science 98-galileo.rules 1 1
galileo-daemon science 99-galileo-daemon.rules 1 1
indi-armadillo-platypus science 99-armadilloplatypus.rules 1 1
indi-ffmv science 99-fireflymv.rules 1 1
kodi-peripheral-xarcade libs 60-kodi-peripheral-xarcade.rules 1 1
libbladerf2 libs 88-nuand-bladerf1.rules 4 1
libirecovery-common libs 39-libirecovery.rules 1 1
libosmosdr0 libs 60-libosmosdr0.rules 1 1
libxtrxll0t64 libs 50-libxtrxll0t64.rules 1 1
limesuite-udev libs 64-limesuite.rules 5 1
mspdebug electronics 92-mspdebug.rules 1 1
nbc electronics 60-nbc.rules 1 1
qdmr hamradio 60-qdmr.rules 3 1
qflipper electronics 42-flipperzero.rules 3 1
solaar misc 60-solaar.rules 1 1
srcpd electronics 10-liusb.rules 1 1
t2n electronics 60-t2n.rules 1 1
w1retap electronics 60-w1retap.rules 1 1

Fully carried already: avarice, avrdude, flashrom, fpga-icestorm, gpsd, gr-funcube, libairspy0, libairspyhf1, libhamlib4t64, libnfc6, librtlsdr0, mtkbabel, openfpgaloader, openocd, qthid-fcd-controller, spectools, stlink-tools, uhd-host.

What the first sweep found

Curated, like the blocking assessment in gen_hardware_gaps.py: the counts above are measured, this section is judgement.

Two gaps closed without owning anything.

  • LimeSDR. The entry said "no USB identifier confirmed, and the maintainer does not own the hardware to confirm one". Debian's limesuite-udev ships 64-limesuite.rules, which names the board: 1d50:6108, plus the FT601 the Mini uses. Now status: supported with no maintainer_verified — the D-027 shape exactly.
  • Flipper Zero. Debian packages qflipper and its rule names all three modes. A device the catalog should obviously have carried, surfaced by a sweep rather than by someone remembering it.

The hazard, which is the mirror image of the gap this method fixed.

Not every identifier in a rule identifies the device the rule is for. 64-limesuite.rules also lists 0403:6001 (FTDI FT232 serial) and 04b4:8613 (the stock Cypress FX2 development kit); LimeSuite matches them because it probes, not because they mean LimeSDR. A SYMLINK on 0403:6001 would name every FTDI adapter on the machine /dev/limesdr.

0483:df11 is the sharper case: it is STMicroelectronics' generic STM32 DFU identifier, and this sweep found it in both qflipper's rule and dmrconfig's, where it is a TYT MD-UV380 radio. Two unrelated devices, one pair. It is safe as a firmware target, where the operator chose the device, and unsafe as a symlink rule, where the kernel matches whatever is attached — so the Flipper entry records it under firmware and not under usb_ids.

Under-matching is silent and over-matching is silent. A sweep produces candidates, not answers, and the judgement about which is which is the part that cannot be generated.

Still on the table, in rough order of value to this project:

Source Identifiers What it is
qdmr, dmrconfig 3 each DMR radio programming — TYT MD-UV380, Baofeng RD-5R/TD-5R
gpsd 11 GPS receivers: u-blox 5/6/7/8, Garmin, DeLorme. CLAUDE.md names GPS as a hardware need
gr-funcube 2 FUNcube Dongle Pro and Pro+
spectools 9 MetaGeek Wi-Spy 2.4 GHz spectrum analysers
direwolf 1 The "All In One Cable" packet interface
tucnak 3 OK1ZIA contest hardware and an antenna rotator
libsigrok4t64 88 Logic analysers and bench instruments — a plausible electronics profile
openocd, stlink-tools, avrdude, flashrom, openfpgaloader 200+ Programmers and flashers, for a hardware-hacking profile

The 1,800-odd remaining identifiers are printers, scanners, cameras, game controllers and desktop plumbing. Counted above so the number is honest, and deliberately not mined: an identifier is only worth carrying when a device entry gives it a purpose.

How to use this

An identifier here is evidence, not a device entry. Adding one means deciding which device or class it belongs to and writing the prose that makes it useful — this document says what is available, not what is already decided.

Every identifier added from a sweep cites the rule file it came from in its evidence field, exactly as a capture from real hardware cites the lsusb that produced it. Both are primary sources; neither is a guess.

This closes gaps for hardware nobody here owns, which is most of it. It does not make a device maintainer_verified — that is a separate claim about whether anyone ran it, and D-027 keeps the two apart.