Every USB device reports a vendor ID (VID) and product ID (PID). Instead of getting your own VID from the USB-IF, for RP-series products Raspberry Pi offers PIDs under its own VID 0x2E8A, with the USB-IF's permission.
First question: do you need a PID at all?
Raspberry Pi's guidance: usually only if Windows must load a vendor-specific driver for your device, since Windows uses the PID for that.
If your device uses standard class drivers, for example CDC (serial) or HID (keyboard, mouse, touch), you can keep a standard VID/PID and identify your product by its USB strings (iManufacturer, iProduct, iSerial). Check them on Linux with lsusb -v.
Identify your device on Linux by its product string
A udev rule can match the product string instead of a PID:
ATTRS{product}=="*MY-SENSOR*", MODE="660", GROUP="plugdev", TAG+="uaccess"
udev blocks while a RUN+= script runs; start long-running work via a systemd service instead of doing it in the script.
If you do need your own PID
- Fill in the application form linked from the
raspberrypi/usb-pidREADME. Explain why a separate PID is needed, and say if a standard interface combination would do. - If you want to reserve a PID before your product is public, select that option. You must then open a pull request adding your product to the list when you go public, otherwise the allocation is lost.
The repository's table also shows which PIDs Raspberry Pi uses itself (e.g. the RP2040 and RP2350 boot ROMs, Pico SDK CDC UART, Debug Probe, MicroPython), useful when you see an unknown 0x2E8A device.