quirks: add R10 runtime TOML data and implementation report

Adds:
- local/recipes/system/redbear-quirks/source/quirks.d/40-hid.toml:
  967-line runtime override file with all 191 HID quirk entries
  (mirrors the compiled-in hid_table.rs; lets operators override,
  extend, or disable flags without rebuilding the driver)
- local/docs/QUIRKS-SYSTEM.md: 103-line R10 implementation report
  covering scope completed (items 1-6, 8 of the 8-item R10 plan),
  item 7 (consumer wiring) deferred to input-stack maturity,
  entry-count audit (191 not 500), flag-count audit (24 defined,
  9 used), bit-position audit (gaps at 0/8/9/15/24-27 for removed
  upstream flags), test progression (106 -> 114, +8 R10 tests)

Follows the commit pattern of R6 (5e44191c9) and R7-R9 (b56b810c0)
where the structural Rust code is committed first, then the runtime
data and docs update are committed as a follow-up.
This commit is contained in:
2026-06-07 13:17:08 +03:00
parent b324cf67ef
commit 6f1df4f044
2 changed files with 1070 additions and 0 deletions
+103
View File
@@ -2394,6 +2394,109 @@ pattern is already proven.
- `MULTI_INPUT` — combo keyboard/trackpad devices
- `NOGET` — devices failing GET_REPORT (KVM switches, gamepads)
#### Phase R10 Implementation Report (2026-06-07)
**Scope completed**: structural infrastructure (items 15, 6, 8). Item 7
(consumer wiring) is partially complete — the data is now queryable via
`redox_driver_sys::quirks::lookup_hid_quirks()`, but `usbhidd`/`evdevd`
do not yet call it during device initialization. That integration belongs
to the input stack work tracked in
`local/docs/IRQ-AND-LOWLEVEL-CONTROLLERS-ENHANCEMENT-PLAN.md`.
**Entry count audit (Phase R10)**:
The plan listed 500 entries; the actual `hid_quirks[]` array in Linux 7.1
`drivers/hid/hid-quirks.c` lines 27-223 contains **191 entries**. The
500-number is the count of *all* HID-related arrays in the file
(`hid_quirks[]` + `hid_have_special_driver[]` + `hid_ignore_list[]`),
not the quirk table. The 191 number is what the table actually contains.
Two of those 191 are `HID_BLUETOOTH_DEVICE` (not USB) and are kept in
the table for forward compatibility with the Bluetooth HID transport
work; the lookup function ignores the bus type, so no consumer-side
filtering is needed.
**Flag count audit (Phase R10)**:
The plan listed 24 flags; Linux 7.1 `include/linux/hid.h` actually defines
**24 `HID_QUIRK_*` flags** (NOTOUCH, IGNORE, NOGET, HIDDEV_FORCE, BADPAD,
MULTI_INPUT, HIDINPUT_FORCE, ALWAYS_POLL, INPUT_PER_APP, X_INVERT,
Y_INVERT, IGNORE_MOUSE, SKIP_OUTPUT_REPORTS, SKIP_OUTPUT_REPORT_ID,
NO_OUTPUT_REPORTS_ON_INTR_EP, HAVE_SPECIAL_DRIVER,
INCREMENT_USAGE_ON_DUPLICATE, NOINVERT, IGNORE_SPECIAL_DRIVER,
POWER_ON_AFTER_BACKLIGHT, FULLSPEED_INTERVAL, NO_INIT_REPORTS, NO_IGNORE,
NO_INPUT_SYNC). All 24 are defined as bits in `HidQuirkFlags`. Only 9
are actually used in `hid_quirks[]` entries:
- `HID_QUIRK_ALWAYS_POLL` — 48 entries
- `HID_QUIRK_MULTI_INPUT` — 51 entries
- `HID_QUIRK_NOGET` — 43 entries
- `HID_QUIRK_NO_INIT_REPORTS` — 39 entries
- `HID_QUIRK_BADPAD` — 11 entries
- `HID_QUIRK_INCREMENT_USAGE_ON_DUPLICATE` — 9 entries
- `HID_QUIRK_NOGET | HID_QUIRK_MULTI_INPUT` — 3 entries
- `HID_QUIRK_NO_INIT_REPORTS | HID_QUIRK_ALWAYS_POLL` — 6 entries
- `HID_QUIRK_MULTI_INPUT | HID_QUIRK_SKIP_OUTPUT_REPORTS` — 1 entry
- `HID_QUIRK_HIDINPUT_FORCE` — 1 entry
- `HID_QUIRK_FULLSPEED_INTERVAL` — 1 entry
The other 15 flags (e.g., `HID_QUIRK_HAVE_SPECIAL_DRIVER`,
`HID_QUIRK_IGNORE`, `HID_QUIRK_X_INVERT`) are reserved for future
hardware and runtime TOML overrides. They are reachable via
`[[hid_quirk]]` TOML entries.
**Bit position audit (Phase R10)**:
Linux's `include/linux/hid.h` has reserved bit gaps at positions 0, 8, 9,
15, 24, 25, 26, 27 — these correspond to removed/renamed flags
(`HID_QUIRK_INVERT` was removed in Linux 4.x; `HID_QUIRK_NO_EMPTY_INPUT`
and `HID_QUIRK_NO_INIT_INPUT_REPORTS` were renamed). The `HidQuirkFlags`
bitflags struct mirrors the gaps exactly so cross-referencing with
upstream documentation and debugging is clean.
**Files added/modified (Phase R10)**:
| File | Status | Lines | Purpose |
|------|--------|-------|---------|
| `quirks/mod.rs` | modified | +60 | `HidQuirkFlags` bitflags (24 bits), `HidQuirkEntry` struct, `lookup_hid_quirks()`, 8 R10 tests |
| `quirks/hid_table.rs` | NEW | 207 | 191 compiled-in entries with 5 `F_NN` const helpers for multi-flag entries |
| `quirks/toml_loader.rs` | modified | +85 | `HID_QUIRK_FLAG_NAMES` const, `load_hid_quirks()`, `read_toml_hid_entries()`, `parse_hid_toml()` |
| `local/recipes/system/redbear-quirks/source/quirks.d/40-hid.toml` | NEW | 967 | Runtime `[[hid_quirk]]` override file with all 191 entries |
**Tests added (Phase R10, 8 new tests, 114 total passing)**:
1. `phase_r10_hid_table_is_populated` — 191 entries loaded
2. `phase_r10_lookup_8bitdo_pro3_always_poll` — 8BitDo Pro 3 (0x2dc8:0x6009) → ALWAYS_POLL
3. `phase_r10_lookup_vendor_wildcard_matches_any_product` — ELAN (0x04f3, HID_ANY_ID) matches any product
4. `phase_r10_lookup_multi_flag_or_accumulates` — Corsair (0x1b1c:0x1b39) gets NO_INIT_REPORTS | ALWAYS_POLL
5. `phase_r10_lookup_unknown_returns_empty` — unknown IDs return empty
6. `phase_r10_hid_entry_matches_wildcard_vendor` — `HidQuirkEntry::matches()` wildcard semantics
7. `phase_r10_bit_positions_match_linux` — bit positions match `include/linux/hid.h` for all 9 used flags
8. `phase_r10_toml_hid_quirk_parses` — `[[hid_quirk]]` TOML parser produces correct entry
**Build status (Phase R10)**:
- `cargo build --lib`: clean, 0 errors, 0 warnings
- `cargo test --lib`: 114 passed, 0 failed (was 106 R8 → +8 R10)
- `cargo clippy --lib`: 30 warnings (was 29, +1 — new `load_hid_quirks()` follows existing `Result<_, ()>` pattern from R7-A/B/R8)
**Data extraction methodology (Phase R10)**:
The 191 entries were generated by a one-shot extraction script
(`/tmp/hid_quirks_extracted.txt` produced by the explore-agent
delegation `bg_cc6491e4`) and converted to Rust literals with
`awk` + decimal-to-hex conversion. Bit positions were verified
against `local/reference/linux-7.1/include/linux/hid.h`. Vendor
and product IDs were verified by spot-check against
`local/reference/linux-7.1/drivers/hid/hid-ids.h` for the 6d6
(AASHIMA), 04f3 (ELAN), 1b1c (Corsair), 2dc8 (8BitDo), and
0583 (Madcatz) entries.
**Open follow-ups (Phase R10)**:
- Item 7: Wire `lookup_hid_quirks()` into `usbhidd` and `evdevd`
device initialization. Currently `usbhidd` consumes the
`HID_QUIRK_*` data, but it has its own (minimal) lookup.
Tracked under input-stack maturity in the enhancement plan.
- DMI HID quirks: Linux has 33 DMI HID entries in
`drivers/hid/hid-dmi/quirks.c` (laptop keyboards, hotkeys).
These are *DMI-matched*, not vendor/product matched, and
follow a different pattern. Out of scope for Phase R10.
Tracked as Phase R13 (Laptop/Embedded DMI Quirks).
- `I2C_HID_QUIRK_*` flags: Linux has a parallel set of quirks
for I2C-HID devices (touchscreens). Out of scope for Phase R10
(separate header, separate table).
### Phase R11: ACPI DMI Quirk Expansion (23 days)
**Source:** Linux ACPI DMI tables (~115 total DMI rules across 8 subsystems)
@@ -0,0 +1,967 @@
# HID quirk database — runtime overrides (Phase R10, 2026-06-07).
#
# Mirrors Linux 7.1 `drivers/hid/hid-quirks.c` lines 27-223 (the
# `hid_quirks[]` array, 191 entries). These entries are also compiled
# into `HID_QUIRK_TABLE` in `redox-driver-sys`; this file exists so
# operators can override, extend, or disable HID flags at runtime
# without rebuilding the driver crate.
#
# Each entry is matched on (vendor, product) — either can be set to
# `0xffff` to wildcard. Flags are OR-accumulated across all matching
# entries; the compiled-in table is consulted first, then this file.
[[hid_quirk]]
vendor = 0x2dc8
product = 0x6009
flags = ["always_poll"]
[[hid_quirk]]
vendor = 0x6d6
product = 0x25
flags = ["badpad"]
[[hid_quirk]]
vendor = 0x6d6
product = 0x26
flags = ["badpad"]
[[hid_quirk]]
vendor = 0x125f
product = 0x7505
flags = ["always_poll"]
[[hid_quirk]]
vendor = 0x125f
product = 0x7506
flags = ["always_poll"]
[[hid_quirk]]
vendor = 0x15a4
product = 0x9016
flags = ["fullspeed_interval"]
[[hid_quirk]]
vendor = 0x1a2c
product = 0x2
flags = ["noget"]
[[hid_quirk]]
vendor = 0x9e8
product = 0x31
flags = ["no_init_reports"]
[[hid_quirk]]
vendor = 0x2011
product = 0x715
flags = ["no_init_reports"]
[[hid_quirk]]
vendor = 0x433
product = 0x1101
flags = ["badpad"]
[[hid_quirk]]
vendor = 0x46b
product = 0xff10
flags = ["always_poll"]
[[hid_quirk]]
vendor = 0x5ac
product = 0x24f
flags = ["always_poll"]
[[hid_quirk]]
vendor = 0x557
product = 0x2204
flags = ["noget"]
[[hid_quirk]]
vendor = 0x557
product = 0x2208
flags = ["noget"]
[[hid_quirk]]
vendor = 0x557
product = 0x2205
flags = ["noget"]
[[hid_quirk]]
vendor = 0x557
product = 0x2202
flags = ["noget"]
[[hid_quirk]]
vendor = 0x557
product = 0x2220
flags = ["noget"]
[[hid_quirk]]
vendor = 0x557
product = 0x2213
flags = ["noget"]
[[hid_quirk]]
vendor = 0x557
product = 0x8021
flags = ["noget"]
[[hid_quirk]]
vendor = 0x557
product = 0x2004
flags = ["noget"]
[[hid_quirk]]
vendor = 0x4f2
product = 0xb19d
flags = ["multi_input"]
[[hid_quirk]]
vendor = 0x4f2
product = 0x1053
flags = ["always_poll"]
[[hid_quirk]]
vendor = 0x4f2
product = 0x939
flags = ["always_poll"]
[[hid_quirk]]
vendor = 0x4f2
product = 0x618
flags = ["multi_input"]
[[hid_quirk]]
vendor = 0x5fe
product = 0x14
flags = ["badpad"]
[[hid_quirk]]
vendor = 0x68e
product = 0xd3
flags = ["noget"]
[[hid_quirk]]
vendor = 0x68e
product = 0x1c
flags = ["noget"]
[[hid_quirk]]
vendor = 0x68e
product = 0xf4
flags = ["noget"]
[[hid_quirk]]
vendor = 0x68e
product = 0xf3
flags = ["noget"]
[[hid_quirk]]
vendor = 0x68e
product = 0x51
flags = ["noget"]
[[hid_quirk]]
vendor = 0x68e
product = 0xff
flags = ["noget"]
[[hid_quirk]]
vendor = 0x68e
product = 0xf2
flags = ["noget"]
[[hid_quirk]]
vendor = 0x68e
product = 0xf1
flags = ["noget"]
[[hid_quirk]]
vendor = 0x2516
product = 0x1b7
flags = ["always_poll"]
[[hid_quirk]]
vendor = 0x1b1c
product = 0x1b17
flags = ["no_init_reports"]
[[hid_quirk]]
vendor = 0x1b1c
product = 0x1b39
flags = ["no_init_reports", "always_poll"]
[[hid_quirk]]
vendor = 0x1b1c
product = 0x1b13
flags = ["no_init_reports"]
[[hid_quirk]]
vendor = 0x1b1c
product = 0x1b38
flags = ["no_init_reports", "always_poll"]
[[hid_quirk]]
vendor = 0x1b1c
product = 0x1b09
flags = ["no_init_reports"]
[[hid_quirk]]
vendor = 0x1b1c
product = 0x1b11
flags = ["no_init_reports", "always_poll"]
[[hid_quirk]]
vendor = 0x1b1c
product = 0x1b12
flags = ["no_init_reports"]
[[hid_quirk]]
vendor = 0x1b1c
product = 0x1b34
flags = ["no_init_reports", "always_poll"]
[[hid_quirk]]
vendor = 0x1b1c
product = 0x1b3e
flags = ["no_init_reports", "always_poll"]
[[hid_quirk]]
vendor = 0x1b1c
product = 0x1b15
flags = ["no_init_reports", "always_poll"]
[[hid_quirk]]
vendor = 0x41e
product = 0x322c
flags = ["noget"]
[[hid_quirk]]
vendor = 0x413c
product = 0x301a
flags = ["always_poll"]
[[hid_quirk]]
vendor = 0x413c
product = 0x4503
flags = ["always_poll"]
[[hid_quirk]]
vendor = 0xc0b
product = 0x5fab
flags = ["noget"]
[[hid_quirk]]
vendor = 0x289b
product = 0x2
flags = ["multi_input"]
[[hid_quirk]]
vendor = 0x289b
product = 0x3
flags = ["multi_input"]
[[hid_quirk]]
vendor = 0x79
product = 0x6
flags = ["increment_usage_on_duplicate"]
[[hid_quirk]]
vendor = 0x79
product = 0x1803
flags = ["multi_input"]
[[hid_quirk]]
vendor = 0x79
product = 0x1843
flags = ["multi_input"]
[[hid_quirk]]
vendor = 0x79
product = 0x1846
flags = ["multi_input"]
[[hid_quirk]]
vendor = 0x79
product = 0x1801
flags = ["multi_input"]
[[hid_quirk]]
vendor = 0x79
product = 0x1800
flags = ["multi_input"]
[[hid_quirk]]
vendor = 0xeef
product = 0x1
flags = ["multi_input", "noget"]
[[hid_quirk]]
vendor = 0x2d99
product = 0xa101
flags = ["always_poll"]
[[hid_quirk]]
vendor = 0x4f3
product = 0xffff
flags = ["always_poll"]
[[hid_quirk]]
vendor = 0x4e7
product = 0x20
flags = ["noget"]
[[hid_quirk]]
vendor = 0x2006
product = 0x118
flags = ["multi_input"]
[[hid_quirk]]
vendor = 0x22b9
product = 0x2968
flags = ["multi_input"]
[[hid_quirk]]
vendor = 0x22b9
product = 0x6
flags = ["multi_input"]
[[hid_quirk]]
vendor = 0x147a
product = 0xe03e
flags = ["no_init_reports"]
[[hid_quirk]]
vendor = 0x15a2
product = 0x4f
flags = ["noget"]
[[hid_quirk]]
vendor = 0x547
product = 0x7000
flags = ["no_init_reports"]
[[hid_quirk]]
vendor = 0xe8f
product = 0x3010
flags = ["multi_input"]
[[hid_quirk]]
vendor = 0xe8f
product = 0x3013
flags = ["multi_input"]
[[hid_quirk]]
vendor = 0x27f8
product = 0xbbe
flags = ["increment_usage_on_duplicate"]
[[hid_quirk]]
vendor = 0x27f8
product = 0xbbf
flags = ["increment_usage_on_duplicate"]
[[hid_quirk]]
vendor = 0x78b
product = 0x10
flags = ["badpad", "multi_input"]
[[hid_quirk]]
vendor = 0x78b
product = 0x30
flags = ["badpad", "multi_input"]
[[hid_quirk]]
vendor = 0x78b
product = 0x20
flags = ["badpad", "multi_input"]
[[hid_quirk]]
vendor = 0x4d9
product = 0xa096
flags = ["no_init_reports"]
[[hid_quirk]]
vendor = 0x4d9
product = 0xa293
flags = ["always_poll"]
[[hid_quirk]]
vendor = 0x3f0
product = 0xa4a
flags = ["always_poll"]
[[hid_quirk]]
vendor = 0x3f0
product = 0x464a
flags = ["multi_input"]
[[hid_quirk]]
vendor = 0x3f0
product = 0xb4a
flags = ["always_poll"]
[[hid_quirk]]
vendor = 0x3f0
product = 0x134a
flags = ["always_poll"]
[[hid_quirk]]
vendor = 0x3f0
product = 0x94a
flags = ["always_poll"]
[[hid_quirk]]
vendor = 0x3f0
product = 0x941
flags = ["always_poll"]
[[hid_quirk]]
vendor = 0x3f0
product = 0x641
flags = ["always_poll"]
[[hid_quirk]]
vendor = 0x3f0
product = 0x1f4a
flags = ["always_poll"]
[[hid_quirk]]
vendor = 0x1cb6
product = 0x6680
flags = ["multi_input"]
[[hid_quirk]]
vendor = 0x1292
product = 0x4745
flags = ["multi_input"]
[[hid_quirk]]
vendor = 0x458
product = 0x137
flags = ["always_poll"]
[[hid_quirk]]
vendor = 0x458
product = 0x5005
flags = ["multi_input"]
[[hid_quirk]]
vendor = 0x458
product = 0x500f
flags = ["multi_input"]
[[hid_quirk]]
vendor = 0x458
product = 0x5010
flags = ["multi_input"]
[[hid_quirk]]
vendor = 0x458
product = 0x5011
flags = ["multi_input"]
[[hid_quirk]]
vendor = 0x458
product = 0x5012
flags = ["multi_input"]
[[hid_quirk]]
vendor = 0x458
product = 0x5013
flags = ["multi_input"]
[[hid_quirk]]
vendor = 0x458
product = 0x5014
flags = ["multi_input"]
[[hid_quirk]]
vendor = 0x458
product = 0x5015
flags = ["multi_input"]
[[hid_quirk]]
vendor = 0x458
product = 0x5016
flags = ["multi_input"]
[[hid_quirk]]
vendor = 0x458
product = 0x5017
flags = ["multi_input"]
[[hid_quirk]]
vendor = 0x458
product = 0x5019
flags = ["multi_input"]
[[hid_quirk]]
vendor = 0x458
product = 0x501a
flags = ["multi_input"]
[[hid_quirk]]
vendor = 0x458
product = 0x501b
flags = ["multi_input"]
[[hid_quirk]]
vendor = 0x1020
product = 0x8888
flags = ["always_poll"]
[[hid_quirk]]
vendor = 0x17ef
product = 0x6184
flags = ["multi_input"]
[[hid_quirk]]
vendor = 0x17ef
product = 0x61ed
flags = ["multi_input"]
[[hid_quirk]]
vendor = 0x17ef
product = 0x600e
flags = ["always_poll"]
[[hid_quirk]]
vendor = 0x17ef
product = 0x608d
flags = ["always_poll"]
[[hid_quirk]]
vendor = 0x17ef
product = 0x6019
flags = ["always_poll"]
[[hid_quirk]]
vendor = 0x17ef
product = 0x602e
flags = ["always_poll"]
[[hid_quirk]]
vendor = 0x17ef
product = 0x6093
flags = ["always_poll"]
[[hid_quirk]]
vendor = 0x46d
product = 0xc548
flags = ["always_poll"]
[[hid_quirk]]
vendor = 0x46d
product = 0xc007
flags = ["always_poll"]
[[hid_quirk]]
vendor = 0x46d
product = 0xc077
flags = ["always_poll"]
[[hid_quirk]]
vendor = 0x46d
product = 0xc24d
flags = ["noget"]
[[hid_quirk]]
vendor = 0x46d
product = 0xc01a
flags = ["always_poll"]
[[hid_quirk]]
vendor = 0x46d
product = 0xc05a
flags = ["always_poll"]
[[hid_quirk]]
vendor = 0x46d
product = 0xc06a
flags = ["always_poll"]
[[hid_quirk]]
vendor = 0x16d0
product = 0xbcc
flags = ["multi_input"]
[[hid_quirk]]
vendor = 0x45e
product = 0x783
flags = ["always_poll"]
[[hid_quirk]]
vendor = 0x45e
product = 0xcb
flags = ["always_poll"]
[[hid_quirk]]
vendor = 0x45e
product = 0x7da
flags = ["no_init_reports"]
[[hid_quirk]]
vendor = 0x45e
product = 0x7de
flags = ["no_init_reports"]
[[hid_quirk]]
vendor = 0x45e
product = 0x799
flags = ["no_init_reports"]
[[hid_quirk]]
vendor = 0x45e
product = 0x7a7
flags = ["no_init_reports"]
[[hid_quirk]]
vendor = 0x45e
product = 0x7a9
flags = ["no_init_reports"]
[[hid_quirk]]
vendor = 0x8282
product = 0x3201
flags = ["multi_input"]
[[hid_quirk]]
vendor = 0x1770
product = 0xff00
flags = ["no_init_reports"]
[[hid_quirk]]
vendor = 0x1781
product = 0xa9d
flags = ["multi_input"]
[[hid_quirk]]
vendor = 0x8b7
product = 0x1
flags = ["badpad"]
[[hid_quirk]]
vendor = 0x73e
product = 0x301
flags = ["badpad"]
[[hid_quirk]]
vendor = 0x1870
product = 0x110
flags = ["no_init_reports"]
[[hid_quirk]]
vendor = 0x1926
product = 0x3
flags = ["multi_input"]
[[hid_quirk]]
vendor = 0x603
product = 0x1602
flags = ["no_init_reports"]
[[hid_quirk]]
vendor = 0x1b96
product = 0x1500
flags = ["no_init_reports"]
[[hid_quirk]]
vendor = 0x810
product = 0x1
flags = ["multi_input", "skip_output_reports"]
[[hid_quirk]]
vendor = 0x14e1
product = 0x1610
flags = ["noget"]
[[hid_quirk]]
vendor = 0x14e1
product = 0x1640
flags = ["noget"]
[[hid_quirk]]
vendor = 0x5f3
product = 0xff
flags = ["hidinput_force"]
[[hid_quirk]]
vendor = 0x93a
product = 0x8002
flags = ["no_init_reports"]
[[hid_quirk]]
vendor = 0x93a
product = 0x8003
flags = ["no_init_reports"]
[[hid_quirk]]
vendor = 0x93a
product = 0x8001
flags = ["no_init_reports"]
[[hid_quirk]]
vendor = 0x93a
product = 0x2510
flags = ["always_poll"]
[[hid_quirk]]
vendor = 0x461
product = 0x4d22
flags = ["always_poll"]
[[hid_quirk]]
vendor = 0x461
product = 0x4e2a
flags = ["always_poll"]
[[hid_quirk]]
vendor = 0x461
product = 0x4d0f
flags = ["always_poll"]
[[hid_quirk]]
vendor = 0x461
product = 0x4d65
flags = ["always_poll"]
[[hid_quirk]]
vendor = 0x461
product = 0x4e22
flags = ["always_poll"]
[[hid_quirk]]
vendor = 0x5af
product = 0x3062
flags = ["noget"]
[[hid_quirk]]
vendor = 0x408
product = 0x3001
flags = ["noget"]
[[hid_quirk]]
vendor = 0x408
product = 0x3003
flags = ["noget"]
[[hid_quirk]]
vendor = 0x408
product = 0x3008
flags = ["noget"]
[[hid_quirk]]
vendor = 0xbda
product = 0x152
flags = ["no_init_reports"]
[[hid_quirk]]
vendor = 0xf000
product = 0x3
flags = ["increment_usage_on_duplicate"]
[[hid_quirk]]
vendor = 0xf000
product = 0xf1
flags = ["increment_usage_on_duplicate"]
[[hid_quirk]]
vendor = 0x6a3
product = 0xff17
flags = ["badpad"]
[[hid_quirk]]
vendor = 0x6a3
product = 0x75c
flags = ["increment_usage_on_duplicate"]
[[hid_quirk]]
vendor = 0x6a3
product = 0x255
flags = ["increment_usage_on_duplicate"]
[[hid_quirk]]
vendor = 0x6a3
product = 0x762
flags = ["increment_usage_on_duplicate"]
[[hid_quirk]]
vendor = 0x6a3
product = 0xb6a
flags = ["increment_usage_on_duplicate"]
[[hid_quirk]]
vendor = 0x1a2c
product = 0x27
flags = ["no_init_reports"]
[[hid_quirk]]
vendor = 0x1a2c
product = 0x23
flags = ["no_init_reports"]
[[hid_quirk]]
vendor = 0x1395
product = 0x2c
flags = ["noget"]
[[hid_quirk]]
vendor = 0x1c4f
product = 0x2
flags = ["no_init_reports"]
[[hid_quirk]]
vendor = 0x66f
product = 0x3780
flags = ["noget"]
[[hid_quirk]]
vendor = 0x457
product = 0x1030
flags = ["noget"]
[[hid_quirk]]
vendor = 0x457
product = 0x817
flags = ["noget"]
[[hid_quirk]]
vendor = 0x457
product = 0x9200
flags = ["noget"]
[[hid_quirk]]
vendor = 0x457
product = 0x1013
flags = ["no_init_reports"]
[[hid_quirk]]
vendor = 0x430
product = 0xcdab
flags = ["noget"]
[[hid_quirk]]
vendor = 0x5e0
product = 0x800
flags = ["noget"]
[[hid_quirk]]
vendor = 0x5e0
product = 0x1300
flags = ["noget"]
[[hid_quirk]]
vendor = 0x6cb
product = 0xac3
flags = ["no_init_reports"]
[[hid_quirk]]
vendor = 0x6cb
product = 0xaf8
flags = ["no_init_reports"]
[[hid_quirk]]
vendor = 0x6cb
product = 0x1d10
flags = ["no_init_reports"]
[[hid_quirk]]
vendor = 0x6cb
product = 0x1ac3
flags = ["no_init_reports"]
[[hid_quirk]]
vendor = 0x6cb
product = 0x5710
flags = ["no_init_reports"]
[[hid_quirk]]
vendor = 0x6cb
product = 0x2819
flags = ["no_init_reports"]
[[hid_quirk]]
vendor = 0x6cb
product = 0x6e21
flags = ["no_init_reports"]
[[hid_quirk]]
vendor = 0x663
product = 0x103
flags = ["badpad"]
[[hid_quirk]]
vendor = 0x1bfd
product = 0x1688
flags = ["multi_input"]
[[hid_quirk]]
vendor = 0x25aa
product = 0x8882
flags = ["noget"]
[[hid_quirk]]
vendor = 0x25aa
product = 0x8883
flags = ["noget"]
[[hid_quirk]]
vendor = 0x62a
product = 0x201
flags = ["noget"]
[[hid_quirk]]
vendor = 0x5543
product = 0x6001
flags = ["multi_input"]
[[hid_quirk]]
vendor = 0x5543
product = 0x64
flags = ["multi_input"]
[[hid_quirk]]
vendor = 0x2179
product = 0x4
flags = ["multi_input"]
[[hid_quirk]]
vendor = 0x483
product = 0xa44c
flags = ["always_poll"]
[[hid_quirk]]
vendor = 0x172f
product = 0x501
flags = ["multi_input"]
[[hid_quirk]]
vendor = 0x172f
product = 0x500
flags = ["multi_input"]
[[hid_quirk]]
vendor = 0x172f
product = 0x502
flags = ["multi_input"]
[[hid_quirk]]
vendor = 0x6677
product = 0x8802
flags = ["noget", "multi_input"]
[[hid_quirk]]
vendor = 0x925
product = 0x8800
flags = ["noget", "multi_input"]
[[hid_quirk]]
vendor = 0x16c0
product = 0x5e1
flags = ["multi_input"]
[[hid_quirk]]
vendor = 0x46d
product = 0x882
flags = ["noget"]