1*04b3e5abSBenjamin Tissoires# HID-BPF programs 2*04b3e5abSBenjamin Tissoires 3*04b3e5abSBenjamin TissoiresThis directory contains various fixes for devices. They add new features or 4*04b3e5abSBenjamin Tissoiresfix some behaviors without being entirely mandatory. It is better to load them 5*04b3e5abSBenjamin Tissoireswhen you have such a device, but they should not be a requirement for a device 6*04b3e5abSBenjamin Tissoiresto be working during the boot stage. 7*04b3e5abSBenjamin Tissoires 8*04b3e5abSBenjamin TissoiresThe .bpf.c files provided here are not automatically compiled in the kernel. 9*04b3e5abSBenjamin TissoiresThey should be loaded in the kernel by `udev-hid-bpf`: 10*04b3e5abSBenjamin Tissoires 11*04b3e5abSBenjamin Tissoireshttps://gitlab.freedesktop.org/libevdev/udev-hid-bpf 12*04b3e5abSBenjamin Tissoires 13*04b3e5abSBenjamin TissoiresThe main reasons for these fixes to be here is to have a central place to 14*04b3e5abSBenjamin Tissoires"upstream" them, but also this way we can test them thanks to the HID 15*04b3e5abSBenjamin Tissoiresselftests. 16*04b3e5abSBenjamin Tissoires 17*04b3e5abSBenjamin TissoiresOnce a .bpf.c file is accepted here, it is duplicated in `udev-hid-bpf` 18*04b3e5abSBenjamin Tissoiresin the `src/bpf/stable` directory, and distributions are encouraged to 19*04b3e5abSBenjamin Tissoiresonly ship those bpf objects. So adding a file here should eventually 20*04b3e5abSBenjamin Tissoiresland in distributions when they update `udev-hid-bpf` 21*04b3e5abSBenjamin Tissoires 22*04b3e5abSBenjamin Tissoires## Compilation 23*04b3e5abSBenjamin Tissoires 24*04b3e5abSBenjamin TissoiresJust run `make` 25*04b3e5abSBenjamin Tissoires 26*04b3e5abSBenjamin Tissoires## Installation 27*04b3e5abSBenjamin Tissoires 28*04b3e5abSBenjamin Tissoires### Automated way 29*04b3e5abSBenjamin Tissoires 30*04b3e5abSBenjamin TissoiresJust run `sudo udev-hid-bpf install ./my-awesome-fix.bpf.o` 31*04b3e5abSBenjamin Tissoires 32*04b3e5abSBenjamin Tissoires### Manual way 33*04b3e5abSBenjamin Tissoires 34*04b3e5abSBenjamin Tissoires- copy the `.bpf.o` you want in `/etc/udev-hid-bpf/` 35*04b3e5abSBenjamin Tissoires- create a new udev rule to automatically load it 36*04b3e5abSBenjamin Tissoires 37*04b3e5abSBenjamin TissoiresThe following should do the trick (assuming udev-hid-bpf is available in 38*04b3e5abSBenjamin Tissoires/usr/bin): 39*04b3e5abSBenjamin Tissoires 40*04b3e5abSBenjamin Tissoires``` 41*04b3e5abSBenjamin Tissoires$> cp xppen-ArtistPro16Gen2.bpf.o /etc/udev-hid-bpf/ 42*04b3e5abSBenjamin Tissoires$> udev-hid-bpf inspect xppen-ArtistPro16Gen2.bpf.o 43*04b3e5abSBenjamin Tissoires[ 44*04b3e5abSBenjamin Tissoires { 45*04b3e5abSBenjamin Tissoires "name": "xppen-ArtistPro16Gen2.bpf.o", 46*04b3e5abSBenjamin Tissoires "devices": [ 47*04b3e5abSBenjamin Tissoires { 48*04b3e5abSBenjamin Tissoires "bus": "0x0003", 49*04b3e5abSBenjamin Tissoires "group": "0x0001", 50*04b3e5abSBenjamin Tissoires "vid": "0x28BD", 51*04b3e5abSBenjamin Tissoires "pid": "0x095A" 52*04b3e5abSBenjamin Tissoires }, 53*04b3e5abSBenjamin Tissoires { 54*04b3e5abSBenjamin Tissoires "bus": "0x0003", 55*04b3e5abSBenjamin Tissoires "group": "0x0001", 56*04b3e5abSBenjamin Tissoires "vid": "0x28BD", 57*04b3e5abSBenjamin Tissoires "pid": "0x095B" 58*04b3e5abSBenjamin Tissoires } 59*04b3e5abSBenjamin Tissoires ], 60*04b3e5abSBenjamin Tissoires... 61*04b3e5abSBenjamin Tissoires$> cat <EOF > /etc/udev/rules.d/99-load-hid-bpf-xppen-ArtistPro16Gen2.rules 62*04b3e5abSBenjamin TissoiresACTION!="add|remove", GOTO="hid_bpf_end" 63*04b3e5abSBenjamin TissoiresSUBSYSTEM!="hid", GOTO="hid_bpf_end" 64*04b3e5abSBenjamin Tissoires 65*04b3e5abSBenjamin Tissoires# xppen-ArtistPro16Gen2.bpf.o 66*04b3e5abSBenjamin TissoiresACTION=="add",ENV{MODALIAS}=="hid:b0003g0001v000028BDp0000095A", RUN{program}+="/usr/local/bin/udev-hid-bpf add $sys$devpath /etc/udev-hid-bpf/xppen-ArtistPro16Gen2.bpf.o" 67*04b3e5abSBenjamin TissoiresACTION=="remove",ENV{MODALIAS}=="hid:b0003g0001v000028BDp0000095A", RUN{program}+="/usr/local/bin/udev-hid-bpf remove $sys$devpath " 68*04b3e5abSBenjamin Tissoires# xppen-ArtistPro16Gen2.bpf.o 69*04b3e5abSBenjamin TissoiresACTION=="add",ENV{MODALIAS}=="hid:b0003g0001v000028BDp0000095B", RUN{program}+="/usr/local/bin/udev-hid-bpf add $sys$devpath /etc/udev-hid-bpf/xppen-ArtistPro16Gen2.bpf.o" 70*04b3e5abSBenjamin TissoiresACTION=="remove",ENV{MODALIAS}=="hid:b0003g0001v000028BDp0000095B", RUN{program}+="/usr/local/bin/udev-hid-bpf remove $sys$devpath " 71*04b3e5abSBenjamin Tissoires 72*04b3e5abSBenjamin TissoiresLABEL="hid_bpf_end" 73*04b3e5abSBenjamin TissoiresEOF 74*04b3e5abSBenjamin Tissoires$> udevadm control --reload 75*04b3e5abSBenjamin Tissoires``` 76*04b3e5abSBenjamin Tissoires 77*04b3e5abSBenjamin TissoiresThen unplug and replug the device. 78*04b3e5abSBenjamin Tissoires 79*04b3e5abSBenjamin Tissoires## Checks 80*04b3e5abSBenjamin Tissoires 81*04b3e5abSBenjamin Tissoires### udev rule 82*04b3e5abSBenjamin Tissoires 83*04b3e5abSBenjamin TissoiresYou can check that the udev rule is correctly working by issuing 84*04b3e5abSBenjamin Tissoires 85*04b3e5abSBenjamin Tissoires``` 86*04b3e5abSBenjamin Tissoires$> udevadm test /sys/bus/hid/devices/0003:28BD:095B* 87*04b3e5abSBenjamin Tissoires... 88*04b3e5abSBenjamin Tissoiresrun: '/usr/local/bin/udev-hid-bpf add /sys/devices/virtual/misc/uhid/0003:28BD:095B.0E57 /etc/udev-hid-bpf/xppen-ArtistPro16Gen2.bpf.o' 89*04b3e5abSBenjamin Tissoires``` 90*04b3e5abSBenjamin Tissoires 91*04b3e5abSBenjamin Tissoires### program loaded 92*04b3e5abSBenjamin Tissoires 93*04b3e5abSBenjamin TissoiresYou can check that the program has been properly loaded with `bpftool` 94*04b3e5abSBenjamin Tissoires 95*04b3e5abSBenjamin Tissoires``` 96*04b3e5abSBenjamin Tissoires$> bpftool prog 97*04b3e5abSBenjamin Tissoires... 98*04b3e5abSBenjamin Tissoires247: tracing name xppen_16_fix_eraser tag 18d389353ed2ef07 gpl 99*04b3e5abSBenjamin Tissoires loaded_at 2024-03-28T16:02:28+0100 uid 0 100*04b3e5abSBenjamin Tissoires xlated 120B jited 77B memlock 4096B 101*04b3e5abSBenjamin Tissoires btf_id 487 102*04b3e5abSBenjamin Tissoires``` 103