103 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			103 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| # HID-BPF programs
 | |
| 
 | |
| This directory contains various fixes for devices. They add new features or
 | |
| fix some behaviors without being entirely mandatory. It is better to load them
 | |
| when you have such a device, but they should not be a requirement for a device
 | |
| to be working during the boot stage.
 | |
| 
 | |
| The .bpf.c files provided here are not automatically compiled in the kernel.
 | |
| They should be loaded in the kernel by `udev-hid-bpf`:
 | |
| 
 | |
| https://gitlab.freedesktop.org/libevdev/udev-hid-bpf
 | |
| 
 | |
| The main reasons for these fixes to be here is to have a central place to
 | |
| "upstream" them, but also this way we can test them thanks to the HID
 | |
| selftests.
 | |
| 
 | |
| Once a .bpf.c file is accepted here, it is duplicated in `udev-hid-bpf`
 | |
| in the `src/bpf/stable` directory, and distributions are encouraged to
 | |
| only ship those bpf objects. So adding a file here should eventually
 | |
| land in distributions when they update `udev-hid-bpf`
 | |
| 
 | |
| ## Compilation
 | |
| 
 | |
| Just run `make`
 | |
| 
 | |
| ## Installation
 | |
| 
 | |
| ### Automated way
 | |
| 
 | |
| Just run `sudo udev-hid-bpf install ./my-awesome-fix.bpf.o`
 | |
| 
 | |
| ### Manual way
 | |
| 
 | |
| - copy the `.bpf.o` you want in `/etc/udev-hid-bpf/`
 | |
| - create a new udev rule to automatically load it
 | |
| 
 | |
| The following should do the trick (assuming udev-hid-bpf is available in
 | |
| /usr/bin):
 | |
| 
 | |
| ```
 | |
| $> cp xppen-ArtistPro16Gen2.bpf.o /etc/udev-hid-bpf/
 | |
| $> udev-hid-bpf inspect xppen-ArtistPro16Gen2.bpf.o
 | |
| [
 | |
|   {
 | |
|     "name": "xppen-ArtistPro16Gen2.bpf.o",
 | |
|     "devices": [
 | |
|       {
 | |
|         "bus": "0x0003",
 | |
|         "group": "0x0001",
 | |
|         "vid": "0x28BD",
 | |
|         "pid": "0x095A"
 | |
|       },
 | |
|       {
 | |
|         "bus": "0x0003",
 | |
|         "group": "0x0001",
 | |
|         "vid": "0x28BD",
 | |
|         "pid": "0x095B"
 | |
|       }
 | |
|     ],
 | |
| ...
 | |
| $> cat <EOF > /etc/udev/rules.d/99-load-hid-bpf-xppen-ArtistPro16Gen2.rules
 | |
| ACTION!="add|remove", GOTO="hid_bpf_end"
 | |
| SUBSYSTEM!="hid", GOTO="hid_bpf_end"
 | |
| 
 | |
| # xppen-ArtistPro16Gen2.bpf.o
 | |
| ACTION=="add",ENV{MODALIAS}=="hid:b0003g0001v000028BDp0000095A", RUN{program}+="/usr/local/bin/udev-hid-bpf add $sys$devpath /etc/udev-hid-bpf/xppen-ArtistPro16Gen2.bpf.o"
 | |
| ACTION=="remove",ENV{MODALIAS}=="hid:b0003g0001v000028BDp0000095A", RUN{program}+="/usr/local/bin/udev-hid-bpf remove $sys$devpath "
 | |
| # xppen-ArtistPro16Gen2.bpf.o
 | |
| ACTION=="add",ENV{MODALIAS}=="hid:b0003g0001v000028BDp0000095B", RUN{program}+="/usr/local/bin/udev-hid-bpf add $sys$devpath /etc/udev-hid-bpf/xppen-ArtistPro16Gen2.bpf.o"
 | |
| ACTION=="remove",ENV{MODALIAS}=="hid:b0003g0001v000028BDp0000095B", RUN{program}+="/usr/local/bin/udev-hid-bpf remove $sys$devpath "
 | |
| 
 | |
| LABEL="hid_bpf_end"
 | |
| EOF
 | |
| $> udevadm control --reload
 | |
| ```
 | |
| 
 | |
| Then unplug and replug the device.
 | |
| 
 | |
| ## Checks
 | |
| 
 | |
| ### udev rule
 | |
| 
 | |
| You can check that the udev rule is correctly working by issuing
 | |
| 
 | |
| ```
 | |
| $> udevadm test /sys/bus/hid/devices/0003:28BD:095B*
 | |
| ...
 | |
| run: '/usr/local/bin/udev-hid-bpf add /sys/devices/virtual/misc/uhid/0003:28BD:095B.0E57 /etc/udev-hid-bpf/xppen-ArtistPro16Gen2.bpf.o'
 | |
| ```
 | |
| 
 | |
| ### program loaded
 | |
| 
 | |
| You can check that the program has been properly loaded with `bpftool`
 | |
| 
 | |
| ```
 | |
| $> bpftool prog
 | |
| ...
 | |
| 247: tracing  name xppen_16_fix_eraser tag 18d389353ed2ef07  gpl
 | |
| 	loaded_at 2024-03-28T16:02:28+0100  uid 0
 | |
| 	xlated 120B  jited 77B  memlock 4096B
 | |
| 	btf_id 487
 | |
| ```
 |