├── 99-rogue-enemy.preset ├── etc └── systemd │ └── logind.conf.d │ └── 00-handheld-power.conf ├── ROGueENEMY.service ├── grub ├── mt76:-mt7921:-Disable-powersave-features-by-default.patch ├── LICENSE ├── install-custom-kernel.sh ├── 0001-patch_realtek-Fix-ROG-ALLY-X-audio.patch ├── rog-ally-motion-evdev.spec ├── rog-ally-evdevhook2.spec ├── rog-ally-pipewire-enhance.spec ├── 0001-patch_radeon-Remove__counted_by_from_StateArray_states.patch ├── README.md ├── install_vanilla_kernel.sh ├── ROGueENEMY.spec ├── inputplumber.spec └── drivers ├── gpu └── drm │ └── radeon │ └── pptable.h └── hid ├── hid-asus.c └── hid-ids.h /99-rogue-enemy.preset: -------------------------------------------------------------------------------- 1 | # 99-rogue-enemy.preset 2 | enable rogue-enemy.service 3 | enable stray-ally.service 4 | -------------------------------------------------------------------------------- /etc/systemd/logind.conf.d/00-handheld-power.conf: -------------------------------------------------------------------------------- 1 | [Login] 2 | HandlePowerKey=suspend 3 | HandlePowerKeyLongPress=ignore 4 | -------------------------------------------------------------------------------- /ROGueENEMY.service: -------------------------------------------------------------------------------- 1 | [Unit] 2 | Description=ROGueENEMY service 3 | 4 | [Service] 5 | Type=simple 6 | Restart=always 7 | RestartSec=5 8 | WorkingDirectory=/usr/bin 9 | ExecStart=/usr/bin/ROGueENEMY 10 | 11 | [Install] 12 | WantedBy=multi-user.target 13 | -------------------------------------------------------------------------------- /grub: -------------------------------------------------------------------------------- 1 | GRUB_DEFAULT='saved' 2 | GRUB_DISABLE_RECOVERY='true' 3 | GRUB_DISABLE_SUBMENU='true' 4 | GRUB_ENABLE_BLSCFG='true' 5 | GRUB_TERMINAL_OUTPUT='console' 6 | GRUB_TIMEOUT='5' 7 | GRUB_CMDLINE_LINUX_DEFAULT='iomem=relaxed quiet splash' 8 | GRUB_DISTRIBUTOR='Nobara Linux' 9 | GRUB_SAVEDEFAULT='true' 10 | -------------------------------------------------------------------------------- /mt76:-mt7921:-Disable-powersave-features-by-default.patch: -------------------------------------------------------------------------------- 1 | diff --git a/drivers/net/wireless/mediatek/mt76/mt7921/init.c b/drivers/net/wireless/mediatek/mt76/mt7921/init.c 2 | index ff63f37..510c714 100644 3 | --- a/drivers/net/wireless/mediatek/mt76/mt7921/init.c 4 | +++ b/drivers/net/wireless/mediatek/mt76/mt7921/init.c 5 | @@ -220,12 +220,6 @@ int mt7921_register_device(struct mt792x_dev *dev) 6 | dev->pm.idle_timeout = MT792x_PM_TIMEOUT; 7 | dev->pm.stats.last_wake_event = jiffies; 8 | dev->pm.stats.last_doze_event = jiffies; 9 | - if (!mt76_is_usb(&dev->mt76)) { 10 | - dev->pm.enable_user = true; 11 | - dev->pm.enable = true; 12 | - dev->pm.ds_enable_user = true; 13 | - dev->pm.ds_enable = true; 14 | - } 15 | 16 | if (!mt76_is_mmio(&dev->mt76)) 17 | hw->extra_tx_headroom += MT_SDIO_TXD_SIZE + MT_SDIO_HDR_SIZE; 18 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 jlobue10 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /install-custom-kernel.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/bash 2 | # A simple script to automate the compiling of the custom kernel fixes 3 | # necessary to get the volume buttons, side buttons and audio buttons 4 | # working on the ASUS ROG ALLY in Nobara. The latest available kernel 5 | # at the time of writing this script did not have the necessary fixes 6 | # in place. The AUdio fix no longer requires a DSD ACPI override with 7 | # proper kernel patches. 8 | # https://lore.kernel.org/all/20230823011008.13146-1-luke@ljones.dev/ 9 | 10 | CURRENT_WD=$(pwd) 11 | dnf install fedpkg fedora-packager rpmdevtools rpmlint ncurses-devel pesign grubby qt5-qtbase-devel libXi-devel gcc-c++\ 12 | bpftool dwarves elfutils-devel gcc-plugin-devel glibc-static kernel-rpm-macros perl-devel perl-generators python3-devel systemd-boot-unsigned 13 | wget https://github.com/jlobue10/ALLY_Nobara_fixes/releases/download/v1.9.0/kernel-6.7.0.rc3-200.fsync.ally.fc38.src.rpm 14 | rm -rf $HOME/rpmbuild/ 15 | rpm -Uvh kernel-6.7.0.rc3-200.fsync.ally.fc38.src.rpm 16 | rpmbuild -bp $HOME/rpmbuild/SPECS/kernel.spec 17 | sleep 1 18 | cp $CURRENT_WD/{.config,Makefile} $HOME/rpmbuild/BUILD/kernel-6.7-rc3-14-gdf60cee26a2e/linux-6.7.0.rc3-200.fsync.ally.fc38.x86_64/ 19 | cd $HOME/rpmbuild/BUILD/kernel-6.7-rc3-14-gdf60cee26a2e/linux-6.7.0.rc3-200.fsync.ally.fc38.x86_64/ 20 | time make bzImage -j8 && make modules -j8 21 | make modules_install -j8 22 | make install 23 | 24 | ANS=$? 25 | if [[ $ANS == 0 ]]; then 26 | echo -e "\nCustom ROG ALLY kernel compilation and installation successful.\n" 27 | else 28 | echo -e "\nAn error has occurred. Refer to command line output for details.\n" 29 | exit 1 30 | fi 31 | -------------------------------------------------------------------------------- /0001-patch_realtek-Fix-ROG-ALLY-X-audio.patch: -------------------------------------------------------------------------------- 1 | From ac9fa29b679959fc58c9180942a74e6687a63584 Mon Sep 17 00:00:00 2001 2 | From: Jonathan LoBue 3 | Date: Thu, 25 Jul 2024 08:22:38 -0700 4 | Subject: [PATCH] ALSA: hda/realtek: tas2781: Fix ROG ALLY X audio 5 | 6 | Fix the loading of the proper TI TAS2781 amplifier 7 | for the ROG ALLY X, while keeping the other Realtek 8 | codec and pin portions from original ROG ALLY. 9 | 10 | Add proper credit and tag lines before submitting... 11 | This patch is for sharing and testing (6.10.1) 12 | --- 13 | sound/pci/hda/patch_realtek.c | 8 ++++++++ 14 | 1 file changed, 8 insertions(+) 15 | 16 | diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c 17 | index 766f0b1..8d118df 100644 18 | --- a/sound/pci/hda/patch_realtek.c 19 | +++ b/sound/pci/hda/patch_realtek.c 20 | @@ -7409,6 +7409,7 @@ enum { 21 | ALC285_FIXUP_THINKPAD_X1_GEN7, 22 | ALC285_FIXUP_THINKPAD_HEADSET_JACK, 23 | ALC294_FIXUP_ASUS_ALLY, 24 | + ALC294_FIXUP_ASUS_ALLY_X, 25 | ALC294_FIXUP_ASUS_ALLY_PINS, 26 | ALC294_FIXUP_ASUS_ALLY_VERBS, 27 | ALC294_FIXUP_ASUS_ALLY_SPEAKER, 28 | @@ -8875,6 +8876,12 @@ static const struct hda_fixup alc269_fixups[] = { 29 | .chained = true, 30 | .chain_id = ALC294_FIXUP_ASUS_ALLY_PINS 31 | }, 32 | + [ALC294_FIXUP_ASUS_ALLY_X] = { 33 | + .type = HDA_FIXUP_FUNC, 34 | + .v.func = tas2781_fixup_i2c, 35 | + .chained = true, 36 | + .chain_id = ALC294_FIXUP_ASUS_ALLY_PINS 37 | + }, 38 | [ALC294_FIXUP_ASUS_ALLY_PINS] = { 39 | .type = HDA_FIXUP_PINS, 40 | .v.pins = (const struct hda_pintbl[]) { 41 | @@ -10306,6 +10313,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = { 42 | SND_PCI_QUIRK(0x1043, 0x1740, "ASUS UX430UA", ALC295_FIXUP_ASUS_DACS), 43 | SND_PCI_QUIRK(0x1043, 0x17d1, "ASUS UX431FL", ALC294_FIXUP_ASUS_DUAL_SPK), 44 | SND_PCI_QUIRK(0x1043, 0x17f3, "ROG Ally NR2301L/X", ALC294_FIXUP_ASUS_ALLY), 45 | + SND_PCI_QUIRK(0x1043, 0x1eb3, "ROG Ally X RC72LA", ALC294_FIXUP_ASUS_ALLY_X), 46 | SND_PCI_QUIRK(0x1043, 0x1863, "ASUS UX6404VI/VV", ALC245_FIXUP_CS35L41_SPI_2), 47 | SND_PCI_QUIRK(0x1043, 0x1881, "ASUS Zephyrus S/M", ALC294_FIXUP_ASUS_GX502_PINS), 48 | SND_PCI_QUIRK(0x1043, 0x18b1, "Asus MJ401TA", ALC256_FIXUP_ASUS_HEADSET_MIC), 49 | -- 50 | 2.45.2 51 | -------------------------------------------------------------------------------- /rog-ally-motion-evdev.spec: -------------------------------------------------------------------------------- 1 | %global _name ALLY-motion-evdev 2 | 3 | Name: ally-motion-evdev 4 | Version: 1.0.0 5 | Release: 1%{?dist} 6 | Summary: Exposes bmi323 chip over an evdev interface 7 | 8 | License: BSD 9 | URL: https://github.com/NeroReflex/ally-motion-evdev/ 10 | Source0: rog-ally-motion-evdev-main.zip 11 | Source1: ally-motion-evdev.service 12 | Source2: 10-ally-motion-evdev.rule 13 | 14 | BuildRequires: cmake 15 | Provides: ally-motion-evdev 16 | 17 | %description 18 | Exposes bmi323 chip over an evdev interface. 19 | 20 | %prep 21 | rm -rf %{_builddir}/ally-motion-evdev 22 | cd $RPM_SOURCE_DIR 23 | rm -f rog-ally-motion-evdev-main.zip 24 | wget https://github.com/NeroReflex/ally-motion-evdev/archive/refs/heads/master.zip 25 | mv master.zip rog-ally-motion-evdev-main.zip 26 | unzip -j $RPM_SOURCE_DIR/rog-ally-motion-evdev-main.zip -d %{_builddir}/ally-motion-evdev 27 | 28 | %build 29 | cd %{_builddir}/ally-motion-evdev/ 30 | cmake \ 31 | -B build \ 32 | -G 'Unix Makefiles' \ 33 | -DCMAKE_BUILD_TYPE:STRING='Release' \ 34 | -DCMAKE_INSTALL_PREFIX:PATH='/usr' \ 35 | -Wno-dev 36 | 37 | cd %{_builddir}/ally-motion-evdev/ 38 | cmake --build build 39 | 40 | %install 41 | DESTDIR=%{buildroot} cmake --install ally-motion-evdev/build 42 | 43 | mkdir -p %{buildroot}/usr/lib/systemd/system/ 44 | mkdir -p %{buildroot}/usr/lib/udev/rules.d/ 45 | 46 | install -m 644 %{SOURCE1} %{buildroot}/usr/lib/systemd/system/ 47 | install -m 644 %{SOURCE2} %{buildroot}/usr/lib/udev/rules.d/ 48 | 49 | # The license file installation was commented out in the original PKGBUILD. 50 | #install -D -m 644 LICENSE %{buildroot}/usr/share/licenses/%{name}/ 51 | 52 | %post 53 | systemctl daemon-reload 54 | systemctl enable ally-motion-evdev.service 55 | systemctl start ally-motion-evdev.service 56 | udevadm control --reload-rules && udevadm trigger 57 | 58 | %preun 59 | systemctl stop ally-motion-evdev.service 60 | systemctl disable ally-motion-evdev.service 61 | systemctl daemon-reload 62 | 63 | %files 64 | /usr/bin/ally-motion-evdev 65 | /usr/lib/systemd/system/ally-motion-evdev.service 66 | /usr/lib/udev/rules.d/10-ally-motion-evdev.rule 67 | 68 | %changelog 69 | * Thu Oct 26 2023 Jon LoBue - 1.0.0-1 70 | - Initial package 71 | -------------------------------------------------------------------------------- /rog-ally-evdevhook2.spec: -------------------------------------------------------------------------------- 1 | %global _name evdevhook2 2 | 3 | Name: evdevhook2 4 | Version: 1.0.1 5 | Release: 1%{?dist} 6 | Summary: Cemuhook UDP server for devices with modern Linux drivers 7 | 8 | License: GPL3 9 | URL: https://github.com/v1993/evdevhook2 10 | Source0: evdevhook2-main.zip 11 | Source1: evdevhook2.service 12 | Source2: rog-ally-bmi323.patch 13 | 14 | BuildRequires: git meson vala 15 | Requires: glib2 zlib systemd-devel libevdev libgee ally-motion-evdev 16 | Recommends: upower 17 | Provides: evdevhook2 18 | Conflicts: evdevhook2 19 | 20 | %description 21 | Cemuhook UDP server for devices with modern Linux drivers 22 | 23 | %prep 24 | rm -rf %{_builddir}/evdevhook2 25 | cd $RPM_SOURCE_DIR 26 | rm -f evdevhook2-main.zip 27 | wget https://github.com/v1993/evdevhook2/archive/refs/heads/main.zip 28 | mv main.zip evdevhook2-main.zip 29 | unzip $RPM_SOURCE_DIR/evdevhook2-main.zip -d %{_builddir} 30 | mkdir -p %{_builddir}/evdevhook2 31 | cp -rf %{_builddir}/evdevhook2-main/* %{_builddir}/evdevhook2 32 | rm -rf %{_builddir}/evdevhook2-main 33 | cd %{_builddir}/evdevhook2 34 | patch -Np1 -i %{SOURCE2} 35 | meson subprojects download 36 | 37 | %build 38 | meson setup %{_builddir}/evdevhook2 build 39 | meson compile -C build 40 | 41 | %install 42 | meson install -C build --destdir=%{buildroot} 43 | mkdir -p %{buildroot}/usr/bin 44 | cp %{buildroot}/usr/local/bin/evdevhook2 %{buildroot}/usr/bin/evdevhook2 45 | rm -rf %{buildroot}/usr/local/bin/ 46 | 47 | mkdir -p %{buildroot}/usr/lib/systemd/system/ 48 | mkdir -p %{buildroot}/usr/share/licenses/evdevhook2/ 49 | 50 | install -m 644 %{SOURCE1} %{buildroot}/usr/lib/systemd/system/ 51 | install -m 644 evdevhook2/LICENSE %{buildroot}/usr/share/licenses/evdevhook2/ 52 | 53 | %post 54 | systemctl daemon-reload 55 | systemctl enable evdevhook2.service 56 | systemctl start evdevhook2.service 57 | 58 | %preun 59 | systemctl stop rog-ally-evdevhook2.service 60 | systemctl disable rog-ally-evdevhook2.service 61 | systemctl daemon-reload 62 | 63 | %files 64 | /usr/lib/systemd/system/evdevhook2.service 65 | /usr/share/licenses/evdevhook2/LICENSE 66 | /usr/bin/evdevhook2 67 | /usr/local/share/doc/evdevhook2/ExampleConfig.ini 68 | 69 | %changelog 70 | * Thu Oct 26 2023 Jon LoBue [1.0.1-1] 71 | - Initial package 72 | -------------------------------------------------------------------------------- /rog-ally-pipewire-enhance.spec: -------------------------------------------------------------------------------- 1 | %global _name rog-ally-pipewire-enhance 2 | Name: rog-ally-pipewire-enhance 3 | Version: 1.0.0 4 | Release: 1%{?dist} 5 | Summary: Enhance the default audio experience for ASUS ROG ALLY 6 | 7 | License: GPL3 8 | URL: https://github.com/jlobue10/ALLY_Nobara_fixes 9 | Source0: atmos.wav 10 | Source1: game.wav 11 | Source2: neutral.wav 12 | Source3: razor.wav 13 | Source4: headphone-connection-monitor-new.sh 14 | Source5: convolver.conf 15 | Source6: convolver-2.conf 16 | Source7: convolver-3.conf 17 | Source8: convolver-4.conf 18 | Source9: Dolby_Surround_Pro_Logic.wav 19 | 20 | Provides: rog-ally-pipewire-enhance 21 | Conflicts: rog-ally-pipewire-enhance 22 | 23 | %description 24 | Audio enhancement for ASUS ROG ALLY 25 | 26 | %prep 27 | 28 | %build 29 | 30 | %install 31 | mkdir -p %{buildroot}/etc/pipewire 32 | mkdir -p %{buildroot}/etc/pipewire/pipewire.conf.d 33 | mkdir -p %{buildroot}/usr/bin 34 | 35 | install -m 644 %{SOURCE0} %{buildroot}/etc/pipewire/ 36 | install -m 644 %{SOURCE1} %{buildroot}/etc/pipewire/ 37 | install -m 644 %{SOURCE2} %{buildroot}/etc/pipewire/ 38 | install -m 644 %{SOURCE3} %{buildroot}/etc/pipewire/ 39 | install -m 777 %{SOURCE4} %{buildroot}/usr/bin/ 40 | install -m 644 %{SOURCE9} %{buildroot}/etc/pipewire/ 41 | install -m 644 %{SOURCE5} %{buildroot}/etc/pipewire/pipewire.conf.d/ 42 | install -m 644 %{SOURCE6} %{buildroot}/etc/pipewire/pipewire.conf.d/ 43 | install -m 644 %{SOURCE7} %{buildroot}/etc/pipewire/pipewire.conf.d/ 44 | install -m 644 %{SOURCE8} %{buildroot}/etc/pipewire/pipewire.conf.d/ 45 | 46 | %post 47 | mv /usr/bin/headphone-connection-monitor.sh /usr/bin/headphone-connection-monitor-bkp.sh 48 | mv /usr/bin/headphone-connection-monitor-new.sh /usr/bin/headphone-connection-monitor.sh 49 | 50 | %preun 51 | mv /usr/bin/headphone-connection-monitor.sh /usr/bin/headphone-connection-monitor-new.sh 52 | mv /usr/bin/headphone-connection-monitor-bkp.sh /usr/bin/headphone-connection-monitor.sh 53 | 54 | %files 55 | /usr/bin/headphone-connection-monitor-new.sh 56 | /etc/pipewire/atmos.wav 57 | /etc/pipewire/game.wav 58 | /etc/pipewire/neutral.wav 59 | /etc/pipewire/razor.wav 60 | /etc/pipewire/Dolby_Surround_Pro_Logic.wav 61 | /etc/pipewire/pipewire.conf.d/convolver.conf 62 | /etc/pipewire/pipewire.conf.d/convolver-2.conf 63 | /etc/pipewire/pipewire.conf.d/convolver-3.conf 64 | /etc/pipewire/pipewire.conf.d/convolver-4.conf 65 | 66 | %changelog 67 | * Tue Nov 28 2023 Jon LoBue [1.0.0-1] 68 | - Initial package 69 | -------------------------------------------------------------------------------- /0001-patch_radeon-Remove__counted_by_from_StateArray_states.patch: -------------------------------------------------------------------------------- 1 | From: Nathan Chancellor @ 2024-05-29 21:54 UTC 2 | To: Alex Deucher, Christian König 3 | Cc: Kees Cook, Gustavo A. R. Silva, Bill Wendling, Justin Stitt, 4 | amd-gfx, dri-devel, linux-hardening, llvm, patches, stable, 5 | Nathan Chancellor 6 | 7 | From: Bill Wendling 8 | 9 | Work for __counted_by on generic pointers in structures (not just 10 | flexible array members) has started landing in Clang 19 (current tip of 11 | tree). During the development of this feature, a restriction was added 12 | to __counted_by to prevent the flexible array member's element type from 13 | including a flexible array member itself such as: 14 | 15 | struct foo { 16 | int count; 17 | char buf[]; 18 | }; 19 | 20 | struct bar { 21 | int count; 22 | struct foo data[] __counted_by(count); 23 | }; 24 | 25 | because the size of data cannot be calculated with the standard array 26 | size formula: 27 | 28 | sizeof(struct foo) * count 29 | 30 | This restriction was downgraded to a warning but due to CONFIG_WERROR, 31 | it can still break the build. The application of __counted_by on the 32 | states member of 'struct _StateArray' triggers this restriction, 33 | resulting in: 34 | 35 | drivers/gpu/drm/radeon/pptable.h:442:5: error: 'counted_by' should not be applied to an array with element of unknown size because 'ATOM_PPLIB_STATE_V2' (aka 'struct _ATOM_PPLIB_STATE_V2') is a struct type with a flexible array member. This will be an error in a future compiler version [-Werror,-Wbounds-safety-counted-by-elt-type-unknown-size] 36 | 442 | ATOM_PPLIB_STATE_V2 states[] __counted_by(ucNumEntries); 37 | | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~ 38 | 1 error generated. 39 | 40 | Remove this use of __counted_by to fix the warning/error. However, 41 | rather than remove it altogether, leave it commented, as it may be 42 | possible to support this in future compiler releases. 43 | 44 | Cc: stable@vger.kernel.org 45 | Closes: https://github.com/ClangBuiltLinux/linux/issues/2028 46 | Fixes: efade6fe50e7 ("drm/radeon: silence UBSAN warning (v3)") 47 | Signed-off-by: Bill Wendling 48 | Co-developed-by: Nathan Chancellor 49 | Signed-off-by: Nathan Chancellor 50 | --- 51 | drivers/gpu/drm/radeon/pptable.h | 2 +- 52 | 1 file changed, 1 insertion(+), 1 deletion(-) 53 | 54 | diff --git a/drivers/gpu/drm/radeon/pptable.h b/drivers/gpu/drm/radeon/pptable.h 55 | index b7f2259..969a8fb 100644 56 | --- a/drivers/gpu/drm/radeon/pptable.h 57 | +++ b/drivers/gpu/drm/radeon/pptable.h 58 | @@ -439,7 +439,7 @@ typedef struct _StateArray{ 59 | //how many states we have 60 | UCHAR ucNumEntries; 61 | 62 | - ATOM_PPLIB_STATE_V2 states[] __counted_by(ucNumEntries); 63 | + ATOM_PPLIB_STATE_V2 states[] /* __counted_by(ucNumEntries) */; 64 | }StateArray; 65 | 66 | 67 | -- 68 | 2.45.2 69 | 70 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # README Needs Updating 2 | 3 | Most everything has been baked in to stock Nobara for quite some time now (as of June 2024). Many thanks to GloriousEggroll for the fantastic distro (Nobara) and many others such as Matt Schwartz, NeroReflex, Luke Jones, ChimeraOS devs, Bazzite devs, CachyOS devs and anybody else who may have contributed to the very good Linux experience on the ASUS ROG ALLY. This repo is now mainly maintained for historical purposes and providing Zen4 LTO compiled kernels that are as close to Nobara stock kernels as possible while trying to also have relevant up-to-date patches from Luke Jones (and any other relevant patch sources). 4 | 5 | ## **Custom kernel script Installation (please use RPMs instead... left online for my own testing...)** 6 | 7 | An automated kernel installer has been added. As is, it downloads the latest source kernel from Nobara copr, unpacks it, adds the ROG ALLY patches and compiles the kernel, the kernel modules and installs them (both kernel and modules). 8 | 9 | Steps to perform the custom kernel compile and installation. 10 | 11 | ``` 12 | git clone https://github.com/jlobue10/ALLY_Nobara_fixes 13 | cd ALLY_Nobara_fixes 14 | chmod +x install-custom-kernel.sh 15 | sudo ./install-custom-kernel.sh 16 | ``` 17 | 18 | Removal of the custom kernel from the script requires some manual steps. (Comments below are preceeded by '#') 19 | 20 | ``` 21 | ls -alh /boot 22 | 23 | # Take note of the kernel version number that you want to manually remove 24 | # You are interested in removing the vmlinuz, System.map and initramfs files 25 | # Manually delete all three of these with 'sudo rm filename' (replace with actual filename) 26 | # Then one more step is needed to clean up the GRUB entry 27 | 28 | sudo ls -alh /boot/loader/entries 29 | 30 | # Delete the entry there as well with 'sudo rm' and you should be fully cleaned up 31 | ``` 32 | 33 | ## **Kernel RPM Installation method** 34 | 35 | RPMs have been provided on the release page as an alternative to the local compile. If you download the tarball with the kernel RPMs, this would be the install procedure after changing into the directory where that tarball was downloaded. Kernels are now being compiled with clang llvm lto as this method seems to benefit the ASUS ROG ALLY's performance. 36 | 37 | ``` 38 | tar xvf kernel-version-blah-blah.fsync.ally.fc38.x86_64.tar.gz 39 | cd RPM 40 | sudo dnf install *.rpm 41 | ``` 42 | 43 | RPM uninstall example: 44 | 45 | ``` 46 | sudo dnf remove kernel-6.5.9-200.fsync.ally.fc38.x86_64 kernel-core-6.5.9-200.fsync.ally.fc38.x86_64 kernel-devel-6.5.9-200.fsync.ally.fc38.x86_64 kernel-modules-6.5.9-200.fsync.ally.fc38.x86_64 kernel-modules-core-6.5.9-200.fsync.ally.fc38.x86_64 kernel-modules-extra-6.5.9-200.fsync.ally.fc38.x86_64 47 | ``` 48 | 49 | ## Linux kernel upstream contributions ## 50 | 51 | [For ROG ALLY/ ALLY X bmi323 gyro driver loading](https://lore.kernel.org/all/CAF6rpDwZaCJOpLEYayVW8_aXQwKdpcLCDSRjbTNk1rr43EPriQ@mail.gmail.com/) 52 | 53 | [ROG ALLY X audio amplifier driver loading properly](https://lore.kernel.org/lkml/87cymedlrt.wl-tiwai@suse.de/T/#m627fc2a7dd1030c65412a38212828571ba22e1fc) 54 | 55 | ## **References** 56 | 57 | [ACPI patch info for audio](https://asus-linux.org/wiki/cirrus-amps/) 58 | 59 | [Info to compile custom kernel and modules for Fedora](https://fedoraproject.org/wiki/Building_a_custom_kernel) 60 | 61 | [Building kernel from src RPM](https://fedoraproject.org/wiki/Building_a_custom_kernel/Source_RPM) 62 | 63 | [Asus Linux Discord](https://discord.gg/4ZKGd7Un5t) 64 | -------------------------------------------------------------------------------- /install_vanilla_kernel.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | cd $HOME 4 | mkdir -p $HOME/vanilla_Nero_kernel 5 | cd $HOME/vanilla_Nero_kernel 6 | wget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.6.2.tar.xz 7 | tar xvf linux-6.6.2.tar.xz 8 | cd linux-6.6.2 9 | echo -e "\nSave and exit on next step menuconfig...\n" 10 | make menuconfig 11 | rm $HOME/vanilla_Nero_kernel/linux-6.6.2/.config 12 | wget https://github.com/jlobue10/ALLY_Nobara_fixes/raw/main/.config 13 | # NeroReflex patches for DS4 virtual controller... https://github.com/NeroReflex/linux-chimeraos/blob/v6.6/linux/PKGBUILD 14 | wget https://github.com/NeroReflex/linux-chimeraos/raw/v6.6/linux/0001-ZEN-Add-sysctl-and-CONFIG-to-disallow-unprivileged-C.patch 15 | wget https://github.com/NeroReflex/linux-chimeraos/raw/v6.6/linux/0004-sphinx-kfigure.py-Convert-outdir-to-str-before-using.patch 16 | wget https://github.com/NeroReflex/linux-chimeraos/raw/v6.6/linux/0001-mm-Support-soft-dirty-flag-reset-for-VA-range.patch 17 | wget https://github.com/NeroReflex/linux-chimeraos/raw/v6.6/linux/0001-add-hid_id-and-keys-for-ASUS-ROG-ALLY.patch 18 | wget https://github.com/NeroReflex/linux-chimeraos/raw/v6.6/linux/0002-usb-Add-a-mode-switch-for-the-controller-embedded-on.patch 19 | wget https://github.com/NeroReflex/linux-chimeraos/raw/v6.6/linux/0003-asus-hid-set-led-brightness-at-resume-as-it-was-left.patch 20 | wget https://github.com/NeroReflex/linux-chimeraos/raw/v6.6/linux/0004-hid-asus-Improve-function-signature.patch 21 | wget https://github.com/NeroReflex/linux-chimeraos/raw/v6.6/linux/0005-hid-asis-add-platform-device-and-relative-sysfs.patch 22 | wget https://github.com/NeroReflex/linux-chimeraos/raw/v6.6/linux/0006-Add-asus-platform-and-send-USB-ABORT_PIPE-befor-slee.patch 23 | wget https://github.com/NeroReflex/linux-chimeraos/raw/v6.6/linux/ROG-ALLY-NCT6775-PLATFORM.patch 24 | wget https://github.com/NeroReflex/linux-chimeraos/raw/v6.6/linux/0001-add-GPU-reset-sysfs-event.patch 25 | wget https://github.com/NeroReflex/linux-chimeraos/raw/v6.6/linux/0001-HDR.patch 26 | wget https://github.com/NeroReflex/linux-chimeraos/raw/v6.6/linux/0012-misc-additions.patch 27 | wget https://github.com/NeroReflex/linux-chimeraos/raw/v6.6/linux/0007-fsync1_via_futex_waitv.patch 28 | wget https://github.com/NeroReflex/linux-chimeraos/raw/v6.6/linux/0006-add-acs-overrides_iommu.patch 29 | wget https://github.com/NeroReflex/linux-chimeraos/raw/v6.6/linux/more-uarches-for-kernel-5.17%2B.patch 30 | wget https://github.com/NeroReflex/linux-chimeraos/raw/v6.6/linux/0007-winesync.patch 31 | wget https://github.com/NeroReflex/linux-chimeraos/raw/v6.6/linux/0013-optimize_harder_O3.patch 32 | wget https://github.com/NeroReflex/linux-chimeraos/raw/v6.6/linux/0001-add-acpi_call.patch 33 | wget https://github.com/NeroReflex/linux-chimeraos/raw/v6.6/linux/bmc150.patch 34 | wget https://github.com/NeroReflex/linux-chimeraos/raw/v6.6/linux/uinput.patch 35 | # end NeroReflex patch additions 36 | wget https://github.com/jlobue10/ALLY_Nobara_fixes/raw/main/rog-ally-audio-fix.patch 37 | patch -p1 < 0001-ZEN-Add-sysctl-and-CONFIG-to-disallow-unprivileged-C.patch 38 | patch -p1 < 0004-sphinx-kfigure.py-Convert-outdir-to-str-before-using.patch 39 | patch -p1 < 0001-mm-Support-soft-dirty-flag-reset-for-VA-range.patch 40 | patch -p1 < 0001-add-hid_id-and-keys-for-ASUS-ROG-ALLY.patch 41 | patch -p1 < 0002-usb-Add-a-mode-switch-for-the-controller-embedded-on.patch 42 | patch -p1 < 0003-asus-hid-set-led-brightness-at-resume-as-it-was-left.patch 43 | patch -p1 < 0004-hid-asus-Improve-function-signature.patch 44 | patch -p1 < 0005-hid-asis-add-platform-device-and-relative-sysfs.patch 45 | patch -p1 < 0006-Add-asus-platform-and-send-USB-ABORT_PIPE-befor-slee.patch 46 | patch -p1 < ROG-ALLY-NCT6775-PLATFORM.patch 47 | patch -p1 < 0001-add-GPU-reset-sysfs-event.patch 48 | patch -p1 < 0001-HDR.patch 49 | patch -p1 < 0012-misc-additions.patch 50 | patch -p1 < 0007-fsync1_via_futex_waitv.patch 51 | patch -p1 < 0006-add-acs-overrides_iommu.patch 52 | patch -p1 < more-uarches-for-kernel-5.17%2B.patch 53 | patch -p1 < 0007-winesync.patch 54 | patch -p1 < 0013-optimize_harder_O3.patch 55 | patch -p1 < 0001-add-acpi_call.patch 56 | patch -p1 < bmc150.patch 57 | patch -p1 < uinput.patch 58 | patch -p1 < rog-ally-audio-fix.patch 59 | time make bzImage -j8 && make modules -j8 60 | sudo make modules_install -j8 61 | sudo make install 62 | 63 | ANS=$? 64 | if [[ $ANS == 0 ]]; then 65 | echo -e "\nCustom ROG ALLY kernel compilation and installation successful.\n" 66 | else 67 | echo -e "\nAn error has occurred. Refer to command line output for details.\n" 68 | exit 1 69 | fi 70 | -------------------------------------------------------------------------------- /ROGueENEMY.spec: -------------------------------------------------------------------------------- 1 | %global _name rogue-enemy 2 | 3 | Name: rogue-enemy 4 | Version: 2.2.1 5 | Release: 1%{?dist} 6 | Summary: Convert ROG Ally [RC71L] input to DualShock4 or DualSense and allows mode switching with a long CC press 7 | 8 | License: GPL3 9 | URL: https://github.com/NeroReflex/ROGueENEMY 10 | Source1: rogue-enemy.service 11 | Source2: stray-ally.service 12 | Source3: 80-playstation.rules 13 | Source4: 80-playstation-no-libinput.rules 14 | Source5: 99-js-block.rules 15 | Source6: 99-xbox360-block.rules 16 | Source7: config.cfg 17 | Source8: rogue-enemy_iio_buffer_off.sh 18 | Source9: rogue-enemy_iio_buffer_on.sh 19 | Source10: 99-rogue-enemy.preset 20 | 21 | BuildRequires: cmake libconfig-devel libevdev-devel libudev-devel 22 | Requires: libconfig libevdev 23 | Recommends: steam gamescope-session 24 | Provides: rogue-enemy 25 | Conflicts: rogue-enemy 26 | 27 | %description 28 | Convert ROG Ally [RC71L] input to DualShock4 or DualSense and allows mode switching with a long CC press 29 | 30 | %prep 31 | rm -rf %{_builddir}/ROGueENEMY 32 | cd %{_builddir} 33 | git clone %{url} 34 | mkdir -p %{_builddir}/ROGueENEMY/build 35 | cp %{_builddir}/ROGueENEMY/80-playstation.rules $RPM_SOURCE_DIR 36 | cp %{_builddir}/ROGueENEMY/80-playstation-no-libinput.rules $RPM_SOURCE_DIR 37 | cp %{_builddir}/ROGueENEMY/99-js-block.rules $RPM_SOURCE_DIR 38 | cp %{_builddir}/ROGueENEMY/99-xbox360-block.rules $RPM_SOURCE_DIR 39 | cp %{_builddir}/ROGueENEMY/config.cfg.default $RPM_SOURCE_DIR/config.cfg 40 | cp %{_builddir}/ROGueENEMY/rogue-enemy_iio_buffer_off.sh $RPM_SOURCE_DIR 41 | cp %{_builddir}/ROGueENEMY/rogue-enemy_iio_buffer_on.sh $RPM_SOURCE_DIR 42 | cd $RPM_SOURCE_DIR 43 | wget https://github.com/rog-ally-gaming/rogue-enemy/raw/main/rogue-enemy.service 44 | wget https://github.com/rog-ally-gaming/rogue-enemy/raw/main/stray-ally.service 45 | wget https://github.com/jlobue10/ALLY_Nobara_fixes/raw/main/99-rogue-enemy.preset 46 | 47 | %build 48 | cd %{_builddir}/ROGueENEMY/build 49 | rm -f %{_builddir}/ROGueENEMY/Makefile 50 | cmake .. 51 | make 52 | 53 | %install 54 | mkdir -p %{buildroot}/usr/bin 55 | cp %{_builddir}/ROGueENEMY/build/rogue-enemy %{buildroot}/usr/bin/rogue-enemy 56 | cp %{_builddir}/ROGueENEMY/build/stray-ally %{buildroot}/usr/bin/stray-ally 57 | cp %{_builddir}/ROGueENEMY/build/allynone %{buildroot}/usr/bin/allynone 58 | mkdir -p %{buildroot}/usr/lib/systemd/system/ 59 | mkdir -p %{buildroot}/usr/lib/systemd/system-preset/ 60 | mkdir -p %{buildroot}/usr/lib/udev/rules.d/ 61 | mkdir -p %{buildroot}/etc/ROGueENEMY 62 | 63 | install -m 644 %{SOURCE1} %{buildroot}/usr/lib/systemd/system/ 64 | install -m 644 %{SOURCE2} %{buildroot}/usr/lib/systemd/system/ 65 | install -m 644 %{SOURCE3} %{buildroot}/usr/lib/udev/rules.d/ 66 | install -m 644 %{SOURCE4} %{buildroot}/usr/lib/udev/rules.d/ 67 | install -m 644 %{SOURCE5} %{buildroot}/usr/lib/udev/rules.d/ 68 | install -m 644 %{SOURCE6} %{buildroot}/usr/lib/udev/rules.d/ 69 | install -m 644 %{SOURCE7} %{buildroot}/etc/ROGueENEMY/config.cfg 70 | install -m 755 %{SOURCE8} %{buildroot}/usr/bin/ 71 | install -m 755 %{SOURCE9} %{buildroot}/usr/bin/ 72 | install -m 644 %{SOURCE10} %{buildroot}/usr/lib/systemd/system-preset/ 73 | 74 | %post 75 | udevadm control --reload-rules 76 | udevadm trigger 77 | systemctl daemon-reload 78 | systemctl enable rogue-enemy.service 79 | systemctl start rogue-enemy.service 80 | systemctl enable stray-ally.service 81 | systemctl start stray-ally.service 82 | 83 | %preun 84 | systemctl stop rogue-enemy.servce 85 | systemctl disable rogue-enemy.servce 86 | systemctl stop stray-ally.service 87 | systemctl disable stray-ally.service 88 | %systemd_preun rogue-enemy.service 89 | %systemd_preun stray-ally.service 90 | 91 | %files 92 | /usr/lib/systemd/system/rogue-enemy.service 93 | /usr/lib/systemd/system/stray-ally.service 94 | /usr/lib/systemd/system-preset/99-rogue-enemy.preset 95 | /usr/bin/rogue-enemy 96 | /usr/bin/stray-ally 97 | /usr/bin/allynone 98 | /usr/lib/udev/rules.d/80-playstation.rules 99 | /usr/lib/udev/rules.d/80-playstation-no-libinput.rules 100 | /usr/lib/udev/rules.d/99-js-block.rules 101 | /usr/lib/udev/rules.d/99-xbox360-block.rules 102 | /etc/ROGueENEMY/config.cfg 103 | /usr/bin/rogue-enemy_iio_buffer_off.sh 104 | /usr/bin/rogue-enemy_iio_buffer_on.sh 105 | 106 | %changelog 107 | * Mon Jan 15 2024 Denis Benato [2.2.1-1] 108 | - Updated polling mode for gyro data 109 | 110 | * Sun Jan 7 2024 Denis Benato [2.1.1-1] 111 | - Initial package 112 | -------------------------------------------------------------------------------- /inputplumber.spec: -------------------------------------------------------------------------------- 1 | %global _name inputplumber 2 | 3 | Name: inputplumber 4 | Version: 0.33.1 5 | Release: 0%{?dist} 6 | Summary: InputPlumber is an open source input routing and control daemon for Linux. It can be used to combine any number of input devices (like gamepads, mice, and keyboards) and translate their input to a variety of virtual device formats. 7 | 8 | License: GPLv3+ 9 | URL: https://github.com/ShadowBlip/InputPlumber 10 | 11 | BuildRequires: libevdev-devel libiio-devel git make cargo libudev-devel llvm-devel clang-devel 12 | Requires: libevdev libiio 13 | Recommends: steam gamescope-session linuxconsoletools 14 | Provides: inputplumber 15 | Conflicts: hhd 16 | 17 | %description 18 | InputPlumber is an open source input routing and control daemon for Linux. It can be used to combine any number of input devices (like gamepads, mice, and keyboards) and translate their input to a variety of virtual device formats. 19 | 20 | %prep 21 | rm -rf %{_builddir}/InputPlumber 22 | cd %{_builddir} 23 | git clone %{url} 24 | 25 | %build 26 | cd %{_builddir}/InputPlumber 27 | make build 28 | 29 | %install 30 | mkdir -p %{buildroot}/usr/bin 31 | mkdir -p %{buildroot}/usr/share/dbus-1/system.d 32 | mkdir -p %{buildroot}/usr/lib/systemd/system 33 | mkdir -p %{buildroot}/usr/lib/udev/hwdb.d 34 | mkdir -p %{buildroot}/usr/share/inputplumber/capability_maps 35 | mkdir -p %{buildroot}/usr/share/inputplumber/devices 36 | mkdir -p %{buildroot}/usr/share/inputplumber/profiles 37 | mkdir -p %{buildroot}/usr/share/inputplumber/schema 38 | 39 | install -D -m 755 %{_builddir}/InputPlumber/target/release/inputplumber %{buildroot}/usr/bin/inputplumber 40 | install -D -m 644 %{_builddir}/InputPlumber/rootfs/usr/share/dbus-1/system.d/org.shadowblip.InputPlumber.conf %{buildroot}/usr/share/dbus-1/system.d/org.shadowblip.InputPlumber.conf 41 | install -D -m 644 %{_builddir}/InputPlumber/rootfs/usr/lib/systemd/system/* %{buildroot}/usr/lib/systemd/system/ 42 | install -D -m 644 %{_builddir}/InputPlumber/rootfs/usr/lib/udev/hwdb.d/59-inputplumber.hwdb %{buildroot}/usr/lib/udev/hwdb.d/59-inputplumber.hwdb 43 | install -D -m 644 %{_builddir}/InputPlumber/rootfs/usr/share/inputplumber/capability_maps/* %{buildroot}/usr/share/inputplumber/capability_maps/ 44 | install -D -m 644 %{_builddir}/InputPlumber/rootfs/usr/share/inputplumber/devices/* %{buildroot}/usr/share/inputplumber/devices/ 45 | install -D -m 644 %{_builddir}/InputPlumber/rootfs/usr/share/inputplumber/profiles/* %{buildroot}/usr/share/inputplumber/profiles/ 46 | install -D -m 644 %{_builddir}/InputPlumber/rootfs/usr/share/inputplumber/schema/* %{buildroot}/usr/share/inputplumber/schema/ 47 | 48 | %post 49 | udevadm control --reload-rules 50 | udevadm trigger 51 | systemctl daemon-reload 52 | systemctl enable inputplumber.service 53 | systemctl start inputplumber.service 54 | 55 | %preun 56 | systemctl stop inputplumber.servce 57 | systemctl disable inputplumber.servce 58 | %systemd_preun inputplumber.service 59 | 60 | %files 61 | /usr/bin/inputplumber 62 | /usr/share/dbus-1/system.d/org.shadowblip.InputPlumber.conf 63 | /usr/lib/systemd/system/inputplumber.service 64 | /usr/lib/systemd/system/inputplumber-resume.service 65 | /usr/lib/udev/hwdb.d/59-inputplumber.hwdb 66 | /usr/share/inputplumber/capability_maps/ally_type1.yaml 67 | /usr/share/inputplumber/capability_maps/anbernic_type1.yaml 68 | /usr/share/inputplumber/capability_maps/ayaneo_type1.yaml 69 | /usr/share/inputplumber/capability_maps/ayaneo_type2.yaml 70 | /usr/share/inputplumber/capability_maps/ayaneo_type3.yaml 71 | /usr/share/inputplumber/capability_maps/ayaneo_type4.yaml 72 | /usr/share/inputplumber/capability_maps/ayaneo_type5.yaml 73 | /usr/share/inputplumber/capability_maps/ayaneo_type6.yaml 74 | /usr/share/inputplumber/capability_maps/ayn_type1.yaml 75 | /usr/share/inputplumber/capability_maps/gpd_type1.yaml 76 | /usr/share/inputplumber/capability_maps/gpd_type2.yaml 77 | /usr/share/inputplumber/capability_maps/gpd_type3.yaml 78 | /usr/share/inputplumber/capability_maps/msiclaw_type1.yaml 79 | /usr/share/inputplumber/capability_maps/onexplayer_type1.yaml 80 | /usr/share/inputplumber/capability_maps/onexplayer_type2.yaml 81 | /usr/share/inputplumber/capability_maps/onexplayer_type3.yaml 82 | /usr/share/inputplumber/capability_maps/onexplayer_type4.yaml 83 | /usr/share/inputplumber/capability_maps/orangepi_type1.yaml 84 | /usr/share/inputplumber/devices/10-ignore_unsupported.yaml 85 | /usr/share/inputplumber/devices/50-anbernic_win600.yaml 86 | /usr/share/inputplumber/devices/50-aokzoe_a1.yaml 87 | /usr/share/inputplumber/devices/50-ayaneo_2021.yaml 88 | /usr/share/inputplumber/devices/50-ayaneo_2s.yaml 89 | /usr/share/inputplumber/devices/50-ayaneo_2.yaml 90 | /usr/share/inputplumber/devices/50-ayaneo_air_1s.yaml 91 | /usr/share/inputplumber/devices/50-ayaneo_air_plus_mendo.yaml 92 | /usr/share/inputplumber/devices/50-ayaneo_air_plus.yaml 93 | /usr/share/inputplumber/devices/50-ayaneo_air.yaml 94 | /usr/share/inputplumber/devices/50-ayaneo_flip.yaml 95 | /usr/share/inputplumber/devices/50-ayaneo_kun.yaml 96 | /usr/share/inputplumber/devices/50-ayaneo_next.yaml 97 | /usr/share/inputplumber/devices/50-ayaneo_slide.yaml 98 | /usr/share/inputplumber/devices/50-ayn_loki_max.yaml 99 | /usr/share/inputplumber/devices/50-ayn_loki_mini_pro.yaml 100 | /usr/share/inputplumber/devices/50-ayn_loki_zero.yaml 101 | /usr/share/inputplumber/devices/50-gpd_win3.yaml 102 | /usr/share/inputplumber/devices/50-gpd_win4.yaml 103 | /usr/share/inputplumber/devices/50-gpd_winmax2.yaml 104 | /usr/share/inputplumber/devices/50-gpd_winmini.yaml 105 | /usr/share/inputplumber/devices/50-legion_go.yaml 106 | /usr/share/inputplumber/devices/50-msi_claw.yaml 107 | /usr/share/inputplumber/devices/50-onexplayer_2.yaml 108 | /usr/share/inputplumber/devices/50-onexplayer_amd.yaml 109 | /usr/share/inputplumber/devices/50-onexplayer_intel.yaml 110 | /usr/share/inputplumber/devices/50-onexplayer_mini_a07.yaml 111 | /usr/share/inputplumber/devices/50-onexplayer_mini_pro.yaml 112 | /usr/share/inputplumber/devices/50-onexplayer_onexfly.yaml 113 | /usr/share/inputplumber/devices/50-orangepi_neo.yaml 114 | /usr/share/inputplumber/devices/50-rog_ally_x.yaml 115 | /usr/share/inputplumber/devices/50-rog_ally.yaml 116 | /usr/share/inputplumber/devices/50-steam_deck.yaml 117 | /usr/share/inputplumber/devices/60-ps4_gamepad.yaml 118 | /usr/share/inputplumber/devices/60-ps5_ds-edge_gamepad.yaml 119 | /usr/share/inputplumber/devices/60-ps5_ds_gamepad.yaml 120 | /usr/share/inputplumber/devices/60-switch_pro.yaml 121 | /usr/share/inputplumber/devices/60-xbox_360_gamepad.yaml 122 | /usr/share/inputplumber/devices/60-xbox_gamepad.yaml 123 | /usr/share/inputplumber/devices/60-xbox_one_bt_gamepad.yaml 124 | /usr/share/inputplumber/devices/60-xbox_one_elite_gamepad.yaml 125 | /usr/share/inputplumber/devices/60-xbox_one_gamepad.yaml 126 | /usr/share/inputplumber/devices/69-ignore_generic.yaml 127 | /usr/share/inputplumber/devices/70-generic_gamepad.yaml 128 | /usr/share/inputplumber/profiles/default.yaml 129 | /usr/share/inputplumber/profiles/mouse_keyboard_wasd.yaml 130 | /usr/share/inputplumber/profiles/test.yaml 131 | /usr/share/inputplumber/schema/capability_map_v1.json 132 | /usr/share/inputplumber/schema/composite_device_v1.json 133 | /usr/share/inputplumber/schema/device_profile_v1.json 134 | 135 | %changelog 136 | * Tue Aug 6 2024 William Edwards [0.33.1-0] 137 | - Initial spec file for Fedora based testing and distribution (please refer to https://github.com/ShadowBlip/InputPlumber) 138 | -------------------------------------------------------------------------------- /drivers/gpu/drm/radeon/pptable.h: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2013 Advanced Micro Devices, Inc. 3 | * 4 | * Permission is hereby granted, free of charge, to any person obtaining a 5 | * copy of this software and associated documentation files (the "Software"), 6 | * to deal in the Software without restriction, including without limitation 7 | * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8 | * and/or sell copies of the Software, and to permit persons to whom the 9 | * Software is furnished to do so, subject to the following conditions: 10 | * 11 | * The above copyright notice and this permission notice shall be included in 12 | * all copies or substantial portions of the Software. 13 | * 14 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 17 | * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 18 | * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 19 | * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 20 | * OTHER DEALINGS IN THE SOFTWARE. 21 | */ 22 | 23 | #ifndef _PPTABLE_H 24 | #define _PPTABLE_H 25 | 26 | #pragma pack(1) 27 | 28 | typedef struct _ATOM_PPLIB_THERMALCONTROLLER 29 | 30 | { 31 | UCHAR ucType; // one of ATOM_PP_THERMALCONTROLLER_* 32 | UCHAR ucI2cLine; // as interpreted by DAL I2C 33 | UCHAR ucI2cAddress; 34 | UCHAR ucFanParameters; // Fan Control Parameters. 35 | UCHAR ucFanMinRPM; // Fan Minimum RPM (hundreds) -- for display purposes only. 36 | UCHAR ucFanMaxRPM; // Fan Maximum RPM (hundreds) -- for display purposes only. 37 | UCHAR ucReserved; // ---- 38 | UCHAR ucFlags; // to be defined 39 | } ATOM_PPLIB_THERMALCONTROLLER; 40 | 41 | #define ATOM_PP_FANPARAMETERS_TACHOMETER_PULSES_PER_REVOLUTION_MASK 0x0f 42 | #define ATOM_PP_FANPARAMETERS_NOFAN 0x80 // No fan is connected to this controller. 43 | 44 | #define ATOM_PP_THERMALCONTROLLER_NONE 0 45 | #define ATOM_PP_THERMALCONTROLLER_LM63 1 // Not used by PPLib 46 | #define ATOM_PP_THERMALCONTROLLER_ADM1032 2 // Not used by PPLib 47 | #define ATOM_PP_THERMALCONTROLLER_ADM1030 3 // Not used by PPLib 48 | #define ATOM_PP_THERMALCONTROLLER_MUA6649 4 // Not used by PPLib 49 | #define ATOM_PP_THERMALCONTROLLER_LM64 5 50 | #define ATOM_PP_THERMALCONTROLLER_F75375 6 // Not used by PPLib 51 | #define ATOM_PP_THERMALCONTROLLER_RV6xx 7 52 | #define ATOM_PP_THERMALCONTROLLER_RV770 8 53 | #define ATOM_PP_THERMALCONTROLLER_ADT7473 9 54 | #define ATOM_PP_THERMALCONTROLLER_KONG 10 55 | #define ATOM_PP_THERMALCONTROLLER_EXTERNAL_GPIO 11 56 | #define ATOM_PP_THERMALCONTROLLER_EVERGREEN 12 57 | #define ATOM_PP_THERMALCONTROLLER_EMC2103 13 /* 0x0D */ // Only fan control will be implemented, do NOT show this in PPGen. 58 | #define ATOM_PP_THERMALCONTROLLER_SUMO 14 /* 0x0E */ // Sumo type, used internally 59 | #define ATOM_PP_THERMALCONTROLLER_NISLANDS 15 60 | #define ATOM_PP_THERMALCONTROLLER_SISLANDS 16 61 | #define ATOM_PP_THERMALCONTROLLER_LM96163 17 62 | #define ATOM_PP_THERMALCONTROLLER_CISLANDS 18 63 | #define ATOM_PP_THERMALCONTROLLER_KAVERI 19 64 | 65 | 66 | // Thermal controller 'combo type' to use an external controller for Fan control and an internal controller for thermal. 67 | // We probably should reserve the bit 0x80 for this use. 68 | // To keep the number of these types low we should also use the same code for all ASICs (i.e. do not distinguish RV6xx and RV7xx Internal here). 69 | // The driver can pick the correct internal controller based on the ASIC. 70 | 71 | #define ATOM_PP_THERMALCONTROLLER_ADT7473_WITH_INTERNAL 0x89 // ADT7473 Fan Control + Internal Thermal Controller 72 | #define ATOM_PP_THERMALCONTROLLER_EMC2103_WITH_INTERNAL 0x8D // EMC2103 Fan Control + Internal Thermal Controller 73 | 74 | typedef struct _ATOM_PPLIB_STATE 75 | { 76 | UCHAR ucNonClockStateIndex; 77 | UCHAR ucClockStateIndices[]; // variable-sized 78 | } ATOM_PPLIB_STATE; 79 | 80 | 81 | typedef struct _ATOM_PPLIB_FANTABLE 82 | { 83 | UCHAR ucFanTableFormat; // Change this if the table format changes or version changes so that the other fields are not the same. 84 | UCHAR ucTHyst; // Temperature hysteresis. Integer. 85 | USHORT usTMin; // The temperature, in 0.01 centigrades, below which we just run at a minimal PWM. 86 | USHORT usTMed; // The middle temperature where we change slopes. 87 | USHORT usTHigh; // The high point above TMed for adjusting the second slope. 88 | USHORT usPWMMin; // The minimum PWM value in percent (0.01% increments). 89 | USHORT usPWMMed; // The PWM value (in percent) at TMed. 90 | USHORT usPWMHigh; // The PWM value at THigh. 91 | } ATOM_PPLIB_FANTABLE; 92 | 93 | typedef struct _ATOM_PPLIB_FANTABLE2 94 | { 95 | ATOM_PPLIB_FANTABLE basicTable; 96 | USHORT usTMax; // The max temperature 97 | } ATOM_PPLIB_FANTABLE2; 98 | 99 | typedef struct _ATOM_PPLIB_FANTABLE3 100 | { 101 | ATOM_PPLIB_FANTABLE2 basicTable2; 102 | UCHAR ucFanControlMode; 103 | USHORT usFanPWMMax; 104 | USHORT usFanOutputSensitivity; 105 | } ATOM_PPLIB_FANTABLE3; 106 | 107 | typedef struct _ATOM_PPLIB_EXTENDEDHEADER 108 | { 109 | USHORT usSize; 110 | ULONG ulMaxEngineClock; // For Overdrive. 111 | ULONG ulMaxMemoryClock; // For Overdrive. 112 | // Add extra system parameters here, always adjust size to include all fields. 113 | USHORT usVCETableOffset; //points to ATOM_PPLIB_VCE_Table 114 | USHORT usUVDTableOffset; //points to ATOM_PPLIB_UVD_Table 115 | USHORT usSAMUTableOffset; //points to ATOM_PPLIB_SAMU_Table 116 | USHORT usPPMTableOffset; //points to ATOM_PPLIB_PPM_Table 117 | USHORT usACPTableOffset; //points to ATOM_PPLIB_ACP_Table 118 | USHORT usPowerTuneTableOffset; //points to ATOM_PPLIB_POWERTUNE_Table 119 | } ATOM_PPLIB_EXTENDEDHEADER; 120 | 121 | //// ATOM_PPLIB_POWERPLAYTABLE::ulPlatformCaps 122 | #define ATOM_PP_PLATFORM_CAP_BACKBIAS 1 123 | #define ATOM_PP_PLATFORM_CAP_POWERPLAY 2 124 | #define ATOM_PP_PLATFORM_CAP_SBIOSPOWERSOURCE 4 125 | #define ATOM_PP_PLATFORM_CAP_ASPM_L0s 8 126 | #define ATOM_PP_PLATFORM_CAP_ASPM_L1 16 127 | #define ATOM_PP_PLATFORM_CAP_HARDWAREDC 32 128 | #define ATOM_PP_PLATFORM_CAP_GEMINIPRIMARY 64 129 | #define ATOM_PP_PLATFORM_CAP_STEPVDDC 128 130 | #define ATOM_PP_PLATFORM_CAP_VOLTAGECONTROL 256 131 | #define ATOM_PP_PLATFORM_CAP_SIDEPORTCONTROL 512 132 | #define ATOM_PP_PLATFORM_CAP_TURNOFFPLL_ASPML1 1024 133 | #define ATOM_PP_PLATFORM_CAP_HTLINKCONTROL 2048 134 | #define ATOM_PP_PLATFORM_CAP_MVDDCONTROL 4096 135 | #define ATOM_PP_PLATFORM_CAP_GOTO_BOOT_ON_ALERT 0x2000 // Go to boot state on alerts, e.g. on an AC->DC transition. 136 | #define ATOM_PP_PLATFORM_CAP_DONT_WAIT_FOR_VBLANK_ON_ALERT 0x4000 // Do NOT wait for VBLANK during an alert (e.g. AC->DC transition). 137 | #define ATOM_PP_PLATFORM_CAP_VDDCI_CONTROL 0x8000 // Does the driver control VDDCI independently from VDDC. 138 | #define ATOM_PP_PLATFORM_CAP_REGULATOR_HOT 0x00010000 // Enable the 'regulator hot' feature. 139 | #define ATOM_PP_PLATFORM_CAP_BACO 0x00020000 // Does the driver supports BACO state. 140 | #define ATOM_PP_PLATFORM_CAP_NEW_CAC_VOLTAGE 0x00040000 // Does the driver supports new CAC voltage table. 141 | #define ATOM_PP_PLATFORM_CAP_REVERT_GPIO5_POLARITY 0x00080000 // Does the driver supports revert GPIO5 polarity. 142 | #define ATOM_PP_PLATFORM_CAP_OUTPUT_THERMAL2GPIO17 0x00100000 // Does the driver supports thermal2GPIO17. 143 | #define ATOM_PP_PLATFORM_CAP_VRHOT_GPIO_CONFIGURABLE 0x00200000 // Does the driver supports VR HOT GPIO Configurable. 144 | #define ATOM_PP_PLATFORM_CAP_TEMP_INVERSION 0x00400000 // Does the driver supports Temp Inversion feature. 145 | #define ATOM_PP_PLATFORM_CAP_EVV 0x00800000 146 | 147 | typedef struct _ATOM_PPLIB_POWERPLAYTABLE 148 | { 149 | ATOM_COMMON_TABLE_HEADER sHeader; 150 | 151 | UCHAR ucDataRevision; 152 | 153 | UCHAR ucNumStates; 154 | UCHAR ucStateEntrySize; 155 | UCHAR ucClockInfoSize; 156 | UCHAR ucNonClockSize; 157 | 158 | // offset from start of this table to array of ucNumStates ATOM_PPLIB_STATE structures 159 | USHORT usStateArrayOffset; 160 | 161 | // offset from start of this table to array of ASIC-specific structures, 162 | // currently ATOM_PPLIB_CLOCK_INFO. 163 | USHORT usClockInfoArrayOffset; 164 | 165 | // offset from start of this table to array of ATOM_PPLIB_NONCLOCK_INFO 166 | USHORT usNonClockInfoArrayOffset; 167 | 168 | USHORT usBackbiasTime; // in microseconds 169 | USHORT usVoltageTime; // in microseconds 170 | USHORT usTableSize; //the size of this structure, or the extended structure 171 | 172 | ULONG ulPlatformCaps; // See ATOM_PPLIB_CAPS_* 173 | 174 | ATOM_PPLIB_THERMALCONTROLLER sThermalController; 175 | 176 | USHORT usBootClockInfoOffset; 177 | USHORT usBootNonClockInfoOffset; 178 | 179 | } ATOM_PPLIB_POWERPLAYTABLE; 180 | 181 | typedef struct _ATOM_PPLIB_POWERPLAYTABLE2 182 | { 183 | ATOM_PPLIB_POWERPLAYTABLE basicTable; 184 | UCHAR ucNumCustomThermalPolicy; 185 | USHORT usCustomThermalPolicyArrayOffset; 186 | }ATOM_PPLIB_POWERPLAYTABLE2, *LPATOM_PPLIB_POWERPLAYTABLE2; 187 | 188 | typedef struct _ATOM_PPLIB_POWERPLAYTABLE3 189 | { 190 | ATOM_PPLIB_POWERPLAYTABLE2 basicTable2; 191 | USHORT usFormatID; // To be used ONLY by PPGen. 192 | USHORT usFanTableOffset; 193 | USHORT usExtendendedHeaderOffset; 194 | } ATOM_PPLIB_POWERPLAYTABLE3, *LPATOM_PPLIB_POWERPLAYTABLE3; 195 | 196 | typedef struct _ATOM_PPLIB_POWERPLAYTABLE4 197 | { 198 | ATOM_PPLIB_POWERPLAYTABLE3 basicTable3; 199 | ULONG ulGoldenPPID; // PPGen use only 200 | ULONG ulGoldenRevision; // PPGen use only 201 | USHORT usVddcDependencyOnSCLKOffset; 202 | USHORT usVddciDependencyOnMCLKOffset; 203 | USHORT usVddcDependencyOnMCLKOffset; 204 | USHORT usMaxClockVoltageOnDCOffset; 205 | USHORT usVddcPhaseShedLimitsTableOffset; // Points to ATOM_PPLIB_PhaseSheddingLimits_Table 206 | USHORT usMvddDependencyOnMCLKOffset; 207 | } ATOM_PPLIB_POWERPLAYTABLE4, *LPATOM_PPLIB_POWERPLAYTABLE4; 208 | 209 | typedef struct _ATOM_PPLIB_POWERPLAYTABLE5 210 | { 211 | ATOM_PPLIB_POWERPLAYTABLE4 basicTable4; 212 | ULONG ulTDPLimit; 213 | ULONG ulNearTDPLimit; 214 | ULONG ulSQRampingThreshold; 215 | USHORT usCACLeakageTableOffset; // Points to ATOM_PPLIB_CAC_Leakage_Table 216 | ULONG ulCACLeakage; // The iLeakage for driver calculated CAC leakage table 217 | USHORT usTDPODLimit; 218 | USHORT usLoadLineSlope; // in milliOhms * 100 219 | } ATOM_PPLIB_POWERPLAYTABLE5, *LPATOM_PPLIB_POWERPLAYTABLE5; 220 | 221 | //// ATOM_PPLIB_NONCLOCK_INFO::usClassification 222 | #define ATOM_PPLIB_CLASSIFICATION_UI_MASK 0x0007 223 | #define ATOM_PPLIB_CLASSIFICATION_UI_SHIFT 0 224 | #define ATOM_PPLIB_CLASSIFICATION_UI_NONE 0 225 | #define ATOM_PPLIB_CLASSIFICATION_UI_BATTERY 1 226 | #define ATOM_PPLIB_CLASSIFICATION_UI_BALANCED 3 227 | #define ATOM_PPLIB_CLASSIFICATION_UI_PERFORMANCE 5 228 | // 2, 4, 6, 7 are reserved 229 | 230 | #define ATOM_PPLIB_CLASSIFICATION_BOOT 0x0008 231 | #define ATOM_PPLIB_CLASSIFICATION_THERMAL 0x0010 232 | #define ATOM_PPLIB_CLASSIFICATION_LIMITEDPOWERSOURCE 0x0020 233 | #define ATOM_PPLIB_CLASSIFICATION_REST 0x0040 234 | #define ATOM_PPLIB_CLASSIFICATION_FORCED 0x0080 235 | #define ATOM_PPLIB_CLASSIFICATION_3DPERFORMANCE 0x0100 236 | #define ATOM_PPLIB_CLASSIFICATION_OVERDRIVETEMPLATE 0x0200 237 | #define ATOM_PPLIB_CLASSIFICATION_UVDSTATE 0x0400 238 | #define ATOM_PPLIB_CLASSIFICATION_3DLOW 0x0800 239 | #define ATOM_PPLIB_CLASSIFICATION_ACPI 0x1000 240 | #define ATOM_PPLIB_CLASSIFICATION_HD2STATE 0x2000 241 | #define ATOM_PPLIB_CLASSIFICATION_HDSTATE 0x4000 242 | #define ATOM_PPLIB_CLASSIFICATION_SDSTATE 0x8000 243 | 244 | //// ATOM_PPLIB_NONCLOCK_INFO::usClassification2 245 | #define ATOM_PPLIB_CLASSIFICATION2_LIMITEDPOWERSOURCE_2 0x0001 246 | #define ATOM_PPLIB_CLASSIFICATION2_ULV 0x0002 247 | #define ATOM_PPLIB_CLASSIFICATION2_MVC 0x0004 //Multi-View Codec (BD-3D) 248 | 249 | //// ATOM_PPLIB_NONCLOCK_INFO::ulCapsAndSettings 250 | #define ATOM_PPLIB_SINGLE_DISPLAY_ONLY 0x00000001 251 | #define ATOM_PPLIB_SUPPORTS_VIDEO_PLAYBACK 0x00000002 252 | 253 | // 0 is 2.5Gb/s, 1 is 5Gb/s 254 | #define ATOM_PPLIB_PCIE_LINK_SPEED_MASK 0x00000004 255 | #define ATOM_PPLIB_PCIE_LINK_SPEED_SHIFT 2 256 | 257 | // lanes - 1: 1, 2, 4, 8, 12, 16 permitted by PCIE spec 258 | #define ATOM_PPLIB_PCIE_LINK_WIDTH_MASK 0x000000F8 259 | #define ATOM_PPLIB_PCIE_LINK_WIDTH_SHIFT 3 260 | 261 | // lookup into reduced refresh-rate table 262 | #define ATOM_PPLIB_LIMITED_REFRESHRATE_VALUE_MASK 0x00000F00 263 | #define ATOM_PPLIB_LIMITED_REFRESHRATE_VALUE_SHIFT 8 264 | 265 | #define ATOM_PPLIB_LIMITED_REFRESHRATE_UNLIMITED 0 266 | #define ATOM_PPLIB_LIMITED_REFRESHRATE_50HZ 1 267 | // 2-15 TBD as needed. 268 | 269 | #define ATOM_PPLIB_SOFTWARE_DISABLE_LOADBALANCING 0x00001000 270 | #define ATOM_PPLIB_SOFTWARE_ENABLE_SLEEP_FOR_TIMESTAMPS 0x00002000 271 | 272 | #define ATOM_PPLIB_DISALLOW_ON_DC 0x00004000 273 | 274 | #define ATOM_PPLIB_ENABLE_VARIBRIGHT 0x00008000 275 | 276 | //memory related flags 277 | #define ATOM_PPLIB_SWSTATE_MEMORY_DLL_OFF 0x000010000 278 | 279 | //M3 Arb //2bits, current 3 sets of parameters in total 280 | #define ATOM_PPLIB_M3ARB_MASK 0x00060000 281 | #define ATOM_PPLIB_M3ARB_SHIFT 17 282 | 283 | #define ATOM_PPLIB_ENABLE_DRR 0x00080000 284 | 285 | // remaining 16 bits are reserved 286 | typedef struct _ATOM_PPLIB_THERMAL_STATE 287 | { 288 | UCHAR ucMinTemperature; 289 | UCHAR ucMaxTemperature; 290 | UCHAR ucThermalAction; 291 | }ATOM_PPLIB_THERMAL_STATE, *LPATOM_PPLIB_THERMAL_STATE; 292 | 293 | // Contained in an array starting at the offset 294 | // in ATOM_PPLIB_POWERPLAYTABLE::usNonClockInfoArrayOffset. 295 | // referenced from ATOM_PPLIB_STATE_INFO::ucNonClockStateIndex 296 | #define ATOM_PPLIB_NONCLOCKINFO_VER1 12 297 | #define ATOM_PPLIB_NONCLOCKINFO_VER2 24 298 | typedef struct _ATOM_PPLIB_NONCLOCK_INFO 299 | { 300 | USHORT usClassification; 301 | UCHAR ucMinTemperature; 302 | UCHAR ucMaxTemperature; 303 | ULONG ulCapsAndSettings; 304 | UCHAR ucRequiredPower; 305 | USHORT usClassification2; 306 | ULONG ulVCLK; 307 | ULONG ulDCLK; 308 | UCHAR ucUnused[5]; 309 | } ATOM_PPLIB_NONCLOCK_INFO; 310 | 311 | // Contained in an array starting at the offset 312 | // in ATOM_PPLIB_POWERPLAYTABLE::usClockInfoArrayOffset. 313 | // referenced from ATOM_PPLIB_STATE::ucClockStateIndices 314 | typedef struct _ATOM_PPLIB_R600_CLOCK_INFO 315 | { 316 | USHORT usEngineClockLow; 317 | UCHAR ucEngineClockHigh; 318 | 319 | USHORT usMemoryClockLow; 320 | UCHAR ucMemoryClockHigh; 321 | 322 | USHORT usVDDC; 323 | USHORT usUnused1; 324 | USHORT usUnused2; 325 | 326 | ULONG ulFlags; // ATOM_PPLIB_R600_FLAGS_* 327 | 328 | } ATOM_PPLIB_R600_CLOCK_INFO; 329 | 330 | // ulFlags in ATOM_PPLIB_R600_CLOCK_INFO 331 | #define ATOM_PPLIB_R600_FLAGS_PCIEGEN2 1 332 | #define ATOM_PPLIB_R600_FLAGS_UVDSAFE 2 333 | #define ATOM_PPLIB_R600_FLAGS_BACKBIASENABLE 4 334 | #define ATOM_PPLIB_R600_FLAGS_MEMORY_ODT_OFF 8 335 | #define ATOM_PPLIB_R600_FLAGS_MEMORY_DLL_OFF 16 336 | #define ATOM_PPLIB_R600_FLAGS_LOWPOWER 32 // On the RV770 use 'low power' setting (sequencer S0). 337 | 338 | typedef struct _ATOM_PPLIB_RS780_CLOCK_INFO 339 | 340 | { 341 | USHORT usLowEngineClockLow; // Low Engine clock in MHz (the same way as on the R600). 342 | UCHAR ucLowEngineClockHigh; 343 | USHORT usHighEngineClockLow; // High Engine clock in MHz. 344 | UCHAR ucHighEngineClockHigh; 345 | USHORT usMemoryClockLow; // For now one of the ATOM_PPLIB_RS780_SPMCLK_XXXX constants. 346 | UCHAR ucMemoryClockHigh; // Currentyl unused. 347 | UCHAR ucPadding; // For proper alignment and size. 348 | USHORT usVDDC; // For the 780, use: None, Low, High, Variable 349 | UCHAR ucMaxHTLinkWidth; // From SBIOS - {2, 4, 8, 16} 350 | UCHAR ucMinHTLinkWidth; // From SBIOS - {2, 4, 8, 16}. Effective only if CDLW enabled. Minimum down stream width could 351 | USHORT usHTLinkFreq; // See definition ATOM_PPLIB_RS780_HTLINKFREQ_xxx or in MHz(>=200). 352 | ULONG ulFlags; 353 | } ATOM_PPLIB_RS780_CLOCK_INFO; 354 | 355 | #define ATOM_PPLIB_RS780_VOLTAGE_NONE 0 356 | #define ATOM_PPLIB_RS780_VOLTAGE_LOW 1 357 | #define ATOM_PPLIB_RS780_VOLTAGE_HIGH 2 358 | #define ATOM_PPLIB_RS780_VOLTAGE_VARIABLE 3 359 | 360 | #define ATOM_PPLIB_RS780_SPMCLK_NONE 0 // We cannot change the side port memory clock, leave it as it is. 361 | #define ATOM_PPLIB_RS780_SPMCLK_LOW 1 362 | #define ATOM_PPLIB_RS780_SPMCLK_HIGH 2 363 | 364 | #define ATOM_PPLIB_RS780_HTLINKFREQ_NONE 0 365 | #define ATOM_PPLIB_RS780_HTLINKFREQ_LOW 1 366 | #define ATOM_PPLIB_RS780_HTLINKFREQ_HIGH 2 367 | 368 | typedef struct _ATOM_PPLIB_EVERGREEN_CLOCK_INFO 369 | { 370 | USHORT usEngineClockLow; 371 | UCHAR ucEngineClockHigh; 372 | 373 | USHORT usMemoryClockLow; 374 | UCHAR ucMemoryClockHigh; 375 | 376 | USHORT usVDDC; 377 | USHORT usVDDCI; 378 | USHORT usUnused; 379 | 380 | ULONG ulFlags; // ATOM_PPLIB_R600_FLAGS_* 381 | 382 | } ATOM_PPLIB_EVERGREEN_CLOCK_INFO; 383 | 384 | typedef struct _ATOM_PPLIB_SI_CLOCK_INFO 385 | { 386 | USHORT usEngineClockLow; 387 | UCHAR ucEngineClockHigh; 388 | 389 | USHORT usMemoryClockLow; 390 | UCHAR ucMemoryClockHigh; 391 | 392 | USHORT usVDDC; 393 | USHORT usVDDCI; 394 | UCHAR ucPCIEGen; 395 | UCHAR ucUnused1; 396 | 397 | ULONG ulFlags; // ATOM_PPLIB_SI_FLAGS_*, no flag is necessary for now 398 | 399 | } ATOM_PPLIB_SI_CLOCK_INFO; 400 | 401 | typedef struct _ATOM_PPLIB_CI_CLOCK_INFO 402 | { 403 | USHORT usEngineClockLow; 404 | UCHAR ucEngineClockHigh; 405 | 406 | USHORT usMemoryClockLow; 407 | UCHAR ucMemoryClockHigh; 408 | 409 | UCHAR ucPCIEGen; 410 | USHORT usPCIELane; 411 | } ATOM_PPLIB_CI_CLOCK_INFO; 412 | 413 | typedef struct _ATOM_PPLIB_SUMO_CLOCK_INFO{ 414 | USHORT usEngineClockLow; //clockfrequency & 0xFFFF. The unit is in 10khz 415 | UCHAR ucEngineClockHigh; //clockfrequency >> 16. 416 | UCHAR vddcIndex; //2-bit vddc index; 417 | USHORT tdpLimit; 418 | //please initalize to 0 419 | USHORT rsv1; 420 | //please initialize to 0s 421 | ULONG rsv2[2]; 422 | }ATOM_PPLIB_SUMO_CLOCK_INFO; 423 | 424 | typedef struct _ATOM_PPLIB_STATE_V2 425 | { 426 | //number of valid dpm levels in this state; Driver uses it to calculate the whole 427 | //size of the state: struct_size(ATOM_PPLIB_STATE_V2, clockInfoIndex, ucNumDPMLevels) 428 | UCHAR ucNumDPMLevels; 429 | 430 | //a index to the array of nonClockInfos 431 | UCHAR nonClockInfoIndex; 432 | /** 433 | * Driver will read the first ucNumDPMLevels in this array 434 | */ 435 | UCHAR clockInfoIndex[] __counted_by(ucNumDPMLevels); 436 | } ATOM_PPLIB_STATE_V2; 437 | 438 | typedef struct _StateArray{ 439 | //how many states we have 440 | UCHAR ucNumEntries; 441 | 442 | ATOM_PPLIB_STATE_V2 states[] /* __counted_by(ucNumEntries) */; 443 | }StateArray; 444 | 445 | 446 | typedef struct _ClockInfoArray{ 447 | //how many clock levels we have 448 | UCHAR ucNumEntries; 449 | 450 | //sizeof(ATOM_PPLIB_CLOCK_INFO) 451 | UCHAR ucEntrySize; 452 | 453 | UCHAR clockInfo[] __counted_by(ucNumEntries); 454 | }ClockInfoArray; 455 | 456 | typedef struct _NonClockInfoArray{ 457 | 458 | //how many non-clock levels we have. normally should be same as number of states 459 | UCHAR ucNumEntries; 460 | //sizeof(ATOM_PPLIB_NONCLOCK_INFO) 461 | UCHAR ucEntrySize; 462 | 463 | ATOM_PPLIB_NONCLOCK_INFO nonClockInfo[] __counted_by(ucNumEntries); 464 | }NonClockInfoArray; 465 | 466 | typedef struct _ATOM_PPLIB_Clock_Voltage_Dependency_Record 467 | { 468 | USHORT usClockLow; 469 | UCHAR ucClockHigh; 470 | USHORT usVoltage; 471 | }ATOM_PPLIB_Clock_Voltage_Dependency_Record; 472 | 473 | typedef struct _ATOM_PPLIB_Clock_Voltage_Dependency_Table 474 | { 475 | UCHAR ucNumEntries; // Number of entries. 476 | ATOM_PPLIB_Clock_Voltage_Dependency_Record entries[1]; // Dynamically allocate entries. 477 | }ATOM_PPLIB_Clock_Voltage_Dependency_Table; 478 | 479 | typedef struct _ATOM_PPLIB_Clock_Voltage_Limit_Record 480 | { 481 | USHORT usSclkLow; 482 | UCHAR ucSclkHigh; 483 | USHORT usMclkLow; 484 | UCHAR ucMclkHigh; 485 | USHORT usVddc; 486 | USHORT usVddci; 487 | }ATOM_PPLIB_Clock_Voltage_Limit_Record; 488 | 489 | typedef struct _ATOM_PPLIB_Clock_Voltage_Limit_Table 490 | { 491 | UCHAR ucNumEntries; // Number of entries. 492 | ATOM_PPLIB_Clock_Voltage_Limit_Record entries[1]; // Dynamically allocate entries. 493 | }ATOM_PPLIB_Clock_Voltage_Limit_Table; 494 | 495 | union _ATOM_PPLIB_CAC_Leakage_Record 496 | { 497 | struct 498 | { 499 | USHORT usVddc; // We use this field for the "fake" standardized VDDC for power calculations; For CI and newer, we use this as the real VDDC value. in CI we read it as StdVoltageHiSidd 500 | ULONG ulLeakageValue; // For CI and newer we use this as the "fake" standar VDDC value. in CI we read it as StdVoltageLoSidd 501 | 502 | }; 503 | struct 504 | { 505 | USHORT usVddc1; 506 | USHORT usVddc2; 507 | USHORT usVddc3; 508 | }; 509 | }; 510 | 511 | typedef union _ATOM_PPLIB_CAC_Leakage_Record ATOM_PPLIB_CAC_Leakage_Record; 512 | 513 | typedef struct _ATOM_PPLIB_CAC_Leakage_Table 514 | { 515 | UCHAR ucNumEntries; // Number of entries. 516 | ATOM_PPLIB_CAC_Leakage_Record entries[1]; // Dynamically allocate entries. 517 | }ATOM_PPLIB_CAC_Leakage_Table; 518 | 519 | typedef struct _ATOM_PPLIB_PhaseSheddingLimits_Record 520 | { 521 | USHORT usVoltage; 522 | USHORT usSclkLow; 523 | UCHAR ucSclkHigh; 524 | USHORT usMclkLow; 525 | UCHAR ucMclkHigh; 526 | }ATOM_PPLIB_PhaseSheddingLimits_Record; 527 | 528 | typedef struct _ATOM_PPLIB_PhaseSheddingLimits_Table 529 | { 530 | UCHAR ucNumEntries; // Number of entries. 531 | ATOM_PPLIB_PhaseSheddingLimits_Record entries[1]; // Dynamically allocate entries. 532 | }ATOM_PPLIB_PhaseSheddingLimits_Table; 533 | 534 | typedef struct _VCEClockInfo{ 535 | USHORT usEVClkLow; 536 | UCHAR ucEVClkHigh; 537 | USHORT usECClkLow; 538 | UCHAR ucECClkHigh; 539 | }VCEClockInfo; 540 | 541 | typedef struct _VCEClockInfoArray{ 542 | UCHAR ucNumEntries; 543 | VCEClockInfo entries[1]; 544 | }VCEClockInfoArray; 545 | 546 | typedef struct _ATOM_PPLIB_VCE_Clock_Voltage_Limit_Record 547 | { 548 | USHORT usVoltage; 549 | UCHAR ucVCEClockInfoIndex; 550 | }ATOM_PPLIB_VCE_Clock_Voltage_Limit_Record; 551 | 552 | typedef struct _ATOM_PPLIB_VCE_Clock_Voltage_Limit_Table 553 | { 554 | UCHAR numEntries; 555 | ATOM_PPLIB_VCE_Clock_Voltage_Limit_Record entries[1]; 556 | }ATOM_PPLIB_VCE_Clock_Voltage_Limit_Table; 557 | 558 | typedef struct _ATOM_PPLIB_VCE_State_Record 559 | { 560 | UCHAR ucVCEClockInfoIndex; 561 | UCHAR ucClockInfoIndex; //highest 2 bits indicates memory p-states, lower 6bits indicates index to ClockInfoArrary 562 | }ATOM_PPLIB_VCE_State_Record; 563 | 564 | typedef struct _ATOM_PPLIB_VCE_State_Table 565 | { 566 | UCHAR numEntries; 567 | ATOM_PPLIB_VCE_State_Record entries[1]; 568 | }ATOM_PPLIB_VCE_State_Table; 569 | 570 | 571 | typedef struct _ATOM_PPLIB_VCE_Table 572 | { 573 | UCHAR revid; 574 | // VCEClockInfoArray array; 575 | // ATOM_PPLIB_VCE_Clock_Voltage_Limit_Table limits; 576 | // ATOM_PPLIB_VCE_State_Table states; 577 | }ATOM_PPLIB_VCE_Table; 578 | 579 | 580 | typedef struct _UVDClockInfo{ 581 | USHORT usVClkLow; 582 | UCHAR ucVClkHigh; 583 | USHORT usDClkLow; 584 | UCHAR ucDClkHigh; 585 | }UVDClockInfo; 586 | 587 | typedef struct _UVDClockInfoArray{ 588 | UCHAR ucNumEntries; 589 | UVDClockInfo entries[1]; 590 | }UVDClockInfoArray; 591 | 592 | typedef struct _ATOM_PPLIB_UVD_Clock_Voltage_Limit_Record 593 | { 594 | USHORT usVoltage; 595 | UCHAR ucUVDClockInfoIndex; 596 | }ATOM_PPLIB_UVD_Clock_Voltage_Limit_Record; 597 | 598 | typedef struct _ATOM_PPLIB_UVD_Clock_Voltage_Limit_Table 599 | { 600 | UCHAR numEntries; 601 | ATOM_PPLIB_UVD_Clock_Voltage_Limit_Record entries[1]; 602 | }ATOM_PPLIB_UVD_Clock_Voltage_Limit_Table; 603 | 604 | typedef struct _ATOM_PPLIB_UVD_Table 605 | { 606 | UCHAR revid; 607 | // UVDClockInfoArray array; 608 | // ATOM_PPLIB_UVD_Clock_Voltage_Limit_Table limits; 609 | }ATOM_PPLIB_UVD_Table; 610 | 611 | typedef struct _ATOM_PPLIB_SAMClk_Voltage_Limit_Record 612 | { 613 | USHORT usVoltage; 614 | USHORT usSAMClockLow; 615 | UCHAR ucSAMClockHigh; 616 | }ATOM_PPLIB_SAMClk_Voltage_Limit_Record; 617 | 618 | typedef struct _ATOM_PPLIB_SAMClk_Voltage_Limit_Table{ 619 | UCHAR numEntries; 620 | ATOM_PPLIB_SAMClk_Voltage_Limit_Record entries[1]; 621 | }ATOM_PPLIB_SAMClk_Voltage_Limit_Table; 622 | 623 | typedef struct _ATOM_PPLIB_SAMU_Table 624 | { 625 | UCHAR revid; 626 | ATOM_PPLIB_SAMClk_Voltage_Limit_Table limits; 627 | }ATOM_PPLIB_SAMU_Table; 628 | 629 | typedef struct _ATOM_PPLIB_ACPClk_Voltage_Limit_Record 630 | { 631 | USHORT usVoltage; 632 | USHORT usACPClockLow; 633 | UCHAR ucACPClockHigh; 634 | }ATOM_PPLIB_ACPClk_Voltage_Limit_Record; 635 | 636 | typedef struct _ATOM_PPLIB_ACPClk_Voltage_Limit_Table{ 637 | UCHAR numEntries; 638 | ATOM_PPLIB_ACPClk_Voltage_Limit_Record entries[1]; 639 | }ATOM_PPLIB_ACPClk_Voltage_Limit_Table; 640 | 641 | typedef struct _ATOM_PPLIB_ACP_Table 642 | { 643 | UCHAR revid; 644 | ATOM_PPLIB_ACPClk_Voltage_Limit_Table limits; 645 | }ATOM_PPLIB_ACP_Table; 646 | 647 | typedef struct _ATOM_PowerTune_Table{ 648 | USHORT usTDP; 649 | USHORT usConfigurableTDP; 650 | USHORT usTDC; 651 | USHORT usBatteryPowerLimit; 652 | USHORT usSmallPowerLimit; 653 | USHORT usLowCACLeakage; 654 | USHORT usHighCACLeakage; 655 | }ATOM_PowerTune_Table; 656 | 657 | typedef struct _ATOM_PPLIB_POWERTUNE_Table 658 | { 659 | UCHAR revid; 660 | ATOM_PowerTune_Table power_tune_table; 661 | }ATOM_PPLIB_POWERTUNE_Table; 662 | 663 | typedef struct _ATOM_PPLIB_POWERTUNE_Table_V1 664 | { 665 | UCHAR revid; 666 | ATOM_PowerTune_Table power_tune_table; 667 | USHORT usMaximumPowerDeliveryLimit; 668 | USHORT usReserve[7]; 669 | } ATOM_PPLIB_POWERTUNE_Table_V1; 670 | 671 | #define ATOM_PPM_A_A 1 672 | #define ATOM_PPM_A_I 2 673 | typedef struct _ATOM_PPLIB_PPM_Table 674 | { 675 | UCHAR ucRevId; 676 | UCHAR ucPpmDesign; //A+I or A+A 677 | USHORT usCpuCoreNumber; 678 | ULONG ulPlatformTDP; 679 | ULONG ulSmallACPlatformTDP; 680 | ULONG ulPlatformTDC; 681 | ULONG ulSmallACPlatformTDC; 682 | ULONG ulApuTDP; 683 | ULONG ulDGpuTDP; 684 | ULONG ulDGpuUlvPower; 685 | ULONG ulTjmax; 686 | } ATOM_PPLIB_PPM_Table; 687 | 688 | #pragma pack() 689 | 690 | #endif 691 | -------------------------------------------------------------------------------- /drivers/hid/hid-asus.c: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: GPL-2.0-or-later 2 | /* 3 | * HID driver for Asus notebook built-in keyboard. 4 | * Fixes small logical maximum to match usage maximum. 5 | * 6 | * Currently supported devices are: 7 | * EeeBook X205TA 8 | * VivoBook E200HA 9 | * 10 | * Copyright (c) 2016 Yusuke Fujimaki 11 | * 12 | * This module based on hid-ortek by 13 | * Copyright (c) 2010 Johnathon Harris 14 | * Copyright (c) 2011 Jiri Kosina 15 | * 16 | * This module has been updated to add support for Asus i2c touchpad. 17 | * 18 | * Copyright (c) 2016 Brendan McGrath 19 | * Copyright (c) 2016 Victor Vlasenko 20 | * Copyright (c) 2016 Frederik Wenigwieser 21 | */ 22 | 23 | /* 24 | */ 25 | 26 | #include 27 | #include 28 | #include 29 | #include 30 | #include 31 | #include /* For to_usb_interface for T100 touchpad intf check */ 32 | #include 33 | #include 34 | 35 | #include "hid-ids.h" 36 | 37 | MODULE_AUTHOR("Yusuke Fujimaki "); 38 | MODULE_AUTHOR("Brendan McGrath "); 39 | MODULE_AUTHOR("Victor Vlasenko "); 40 | MODULE_AUTHOR("Frederik Wenigwieser "); 41 | MODULE_DESCRIPTION("Asus HID Keyboard and TouchPad"); 42 | 43 | #define T100_TPAD_INTF 2 44 | #define MEDION_E1239T_TPAD_INTF 1 45 | 46 | #define E1239T_TP_TOGGLE_REPORT_ID 0x05 47 | #define T100CHI_MOUSE_REPORT_ID 0x06 48 | #define FEATURE_REPORT_ID 0x0d 49 | #define INPUT_REPORT_ID 0x5d 50 | #define FEATURE_KBD_REPORT_ID 0x5a 51 | #define FEATURE_KBD_REPORT_SIZE 16 52 | #define FEATURE_KBD_LED_REPORT_ID1 0x5d 53 | #define FEATURE_KBD_LED_REPORT_ID2 0x5e 54 | 55 | #define ALLY_CFG_INTF_IN_ADDRESS 0x83 56 | #define ALLY_CFG_INTF_OUT_ADDRESS 0x04 57 | #define ALLY_X_INTERFACE_ADDRESS 0x87 58 | 59 | #define SUPPORT_KBD_BACKLIGHT BIT(0) 60 | 61 | #define MAX_TOUCH_MAJOR 8 62 | #define MAX_PRESSURE 128 63 | 64 | #define BTN_LEFT_MASK 0x01 65 | #define CONTACT_TOOL_TYPE_MASK 0x80 66 | #define CONTACT_X_MSB_MASK 0xf0 67 | #define CONTACT_Y_MSB_MASK 0x0f 68 | #define CONTACT_TOUCH_MAJOR_MASK 0x07 69 | #define CONTACT_PRESSURE_MASK 0x7f 70 | 71 | #define BATTERY_REPORT_ID (0x03) 72 | #define BATTERY_REPORT_SIZE (1 + 8) 73 | #define BATTERY_LEVEL_MAX ((u8)255) 74 | #define BATTERY_STAT_DISCONNECT (0) 75 | #define BATTERY_STAT_CHARGING (1) 76 | #define BATTERY_STAT_FULL (2) 77 | 78 | #define QUIRK_FIX_NOTEBOOK_REPORT BIT(0) 79 | #define QUIRK_NO_INIT_REPORTS BIT(1) 80 | #define QUIRK_SKIP_INPUT_MAPPING BIT(2) 81 | #define QUIRK_IS_MULTITOUCH BIT(3) 82 | #define QUIRK_NO_CONSUMER_USAGES BIT(4) 83 | #define QUIRK_USE_KBD_BACKLIGHT BIT(5) 84 | #define QUIRK_T100_KEYBOARD BIT(6) 85 | #define QUIRK_T100CHI BIT(7) 86 | #define QUIRK_G752_KEYBOARD BIT(8) 87 | #define QUIRK_T90CHI BIT(9) 88 | #define QUIRK_MEDION_E1239T BIT(10) 89 | #define QUIRK_ROG_NKEY_KEYBOARD BIT(11) 90 | #define QUIRK_ROG_CLAYMORE_II_KEYBOARD BIT(12) 91 | #define QUIRK_ROG_ALLY_XPAD BIT(13) 92 | 93 | #define I2C_KEYBOARD_QUIRKS (QUIRK_FIX_NOTEBOOK_REPORT | \ 94 | QUIRK_NO_INIT_REPORTS | \ 95 | QUIRK_NO_CONSUMER_USAGES) 96 | #define I2C_TOUCHPAD_QUIRKS (QUIRK_NO_INIT_REPORTS | \ 97 | QUIRK_SKIP_INPUT_MAPPING | \ 98 | QUIRK_IS_MULTITOUCH) 99 | 100 | #define TRKID_SGN ((TRKID_MAX + 1) >> 1) 101 | 102 | struct asus_kbd_leds { 103 | struct led_classdev cdev; 104 | struct hid_device *hdev; 105 | struct work_struct work; 106 | unsigned int brightness; 107 | spinlock_t lock; 108 | bool removed; 109 | }; 110 | 111 | struct asus_touchpad_info { 112 | int max_x; 113 | int max_y; 114 | int res_x; 115 | int res_y; 116 | int contact_size; 117 | int max_contacts; 118 | int report_size; 119 | }; 120 | 121 | struct asus_drvdata { 122 | unsigned long quirks; 123 | struct hid_device *hdev; 124 | struct input_dev *input; 125 | struct input_dev *tp_kbd_input; 126 | struct asus_kbd_leds *kbd_backlight; 127 | const struct asus_touchpad_info *tp; 128 | bool enable_backlight; 129 | struct power_supply *battery; 130 | struct power_supply_desc battery_desc; 131 | int battery_capacity; 132 | int battery_stat; 133 | bool battery_in_query; 134 | unsigned long battery_next_query; 135 | }; 136 | 137 | static int asus_report_battery(struct asus_drvdata *, u8 *, int); 138 | 139 | static const struct asus_touchpad_info asus_i2c_tp = { 140 | .max_x = 2794, 141 | .max_y = 1758, 142 | .contact_size = 5, 143 | .max_contacts = 5, 144 | .report_size = 28 /* 2 byte header + 5 * 5 + 1 byte footer */, 145 | }; 146 | 147 | static const struct asus_touchpad_info asus_t100ta_tp = { 148 | .max_x = 2240, 149 | .max_y = 1120, 150 | .res_x = 30, /* units/mm */ 151 | .res_y = 27, /* units/mm */ 152 | .contact_size = 5, 153 | .max_contacts = 5, 154 | .report_size = 28 /* 2 byte header + 5 * 5 + 1 byte footer */, 155 | }; 156 | 157 | static const struct asus_touchpad_info asus_t100ha_tp = { 158 | .max_x = 2640, 159 | .max_y = 1320, 160 | .res_x = 30, /* units/mm */ 161 | .res_y = 29, /* units/mm */ 162 | .contact_size = 5, 163 | .max_contacts = 5, 164 | .report_size = 28 /* 2 byte header + 5 * 5 + 1 byte footer */, 165 | }; 166 | 167 | static const struct asus_touchpad_info asus_t200ta_tp = { 168 | .max_x = 3120, 169 | .max_y = 1716, 170 | .res_x = 30, /* units/mm */ 171 | .res_y = 28, /* units/mm */ 172 | .contact_size = 5, 173 | .max_contacts = 5, 174 | .report_size = 28 /* 2 byte header + 5 * 5 + 1 byte footer */, 175 | }; 176 | 177 | static const struct asus_touchpad_info asus_t100chi_tp = { 178 | .max_x = 2640, 179 | .max_y = 1320, 180 | .res_x = 31, /* units/mm */ 181 | .res_y = 29, /* units/mm */ 182 | .contact_size = 3, 183 | .max_contacts = 4, 184 | .report_size = 15 /* 2 byte header + 3 * 4 + 1 byte footer */, 185 | }; 186 | 187 | static const struct asus_touchpad_info medion_e1239t_tp = { 188 | .max_x = 2640, 189 | .max_y = 1380, 190 | .res_x = 29, /* units/mm */ 191 | .res_y = 28, /* units/mm */ 192 | .contact_size = 5, 193 | .max_contacts = 5, 194 | .report_size = 32 /* 2 byte header + 5 * 5 + 5 byte footer */, 195 | }; 196 | 197 | static void asus_report_contact_down(struct asus_drvdata *drvdat, 198 | int toolType, u8 *data) 199 | { 200 | struct input_dev *input = drvdat->input; 201 | int touch_major, pressure, x, y; 202 | 203 | x = (data[0] & CONTACT_X_MSB_MASK) << 4 | data[1]; 204 | y = drvdat->tp->max_y - ((data[0] & CONTACT_Y_MSB_MASK) << 8 | data[2]); 205 | 206 | input_report_abs(input, ABS_MT_POSITION_X, x); 207 | input_report_abs(input, ABS_MT_POSITION_Y, y); 208 | 209 | if (drvdat->tp->contact_size < 5) 210 | return; 211 | 212 | if (toolType == MT_TOOL_PALM) { 213 | touch_major = MAX_TOUCH_MAJOR; 214 | pressure = MAX_PRESSURE; 215 | } else { 216 | touch_major = (data[3] >> 4) & CONTACT_TOUCH_MAJOR_MASK; 217 | pressure = data[4] & CONTACT_PRESSURE_MASK; 218 | } 219 | 220 | input_report_abs(input, ABS_MT_TOUCH_MAJOR, touch_major); 221 | input_report_abs(input, ABS_MT_PRESSURE, pressure); 222 | } 223 | 224 | /* Required for Synaptics Palm Detection */ 225 | static void asus_report_tool_width(struct asus_drvdata *drvdat) 226 | { 227 | struct input_mt *mt = drvdat->input->mt; 228 | struct input_mt_slot *oldest; 229 | int oldid, i; 230 | 231 | if (drvdat->tp->contact_size < 5) 232 | return; 233 | 234 | oldest = NULL; 235 | oldid = mt->trkid; 236 | 237 | for (i = 0; i < mt->num_slots; ++i) { 238 | struct input_mt_slot *ps = &mt->slots[i]; 239 | int id = input_mt_get_value(ps, ABS_MT_TRACKING_ID); 240 | 241 | if (id < 0) 242 | continue; 243 | if ((id - oldid) & TRKID_SGN) { 244 | oldest = ps; 245 | oldid = id; 246 | } 247 | } 248 | 249 | if (oldest) { 250 | input_report_abs(drvdat->input, ABS_TOOL_WIDTH, 251 | input_mt_get_value(oldest, ABS_MT_TOUCH_MAJOR)); 252 | } 253 | } 254 | 255 | static int asus_report_input(struct asus_drvdata *drvdat, u8 *data, int size) 256 | { 257 | int i, toolType = MT_TOOL_FINGER; 258 | u8 *contactData = data + 2; 259 | 260 | if (size != drvdat->tp->report_size) 261 | return 0; 262 | 263 | for (i = 0; i < drvdat->tp->max_contacts; i++) { 264 | bool down = !!(data[1] & BIT(i+3)); 265 | 266 | if (drvdat->tp->contact_size >= 5) 267 | toolType = contactData[3] & CONTACT_TOOL_TYPE_MASK ? 268 | MT_TOOL_PALM : MT_TOOL_FINGER; 269 | 270 | input_mt_slot(drvdat->input, i); 271 | input_mt_report_slot_state(drvdat->input, toolType, down); 272 | 273 | if (down) { 274 | asus_report_contact_down(drvdat, toolType, contactData); 275 | contactData += drvdat->tp->contact_size; 276 | } 277 | } 278 | 279 | input_report_key(drvdat->input, BTN_LEFT, data[1] & BTN_LEFT_MASK); 280 | asus_report_tool_width(drvdat); 281 | 282 | input_mt_sync_frame(drvdat->input); 283 | input_sync(drvdat->input); 284 | 285 | return 1; 286 | } 287 | 288 | static int asus_e1239t_event(struct asus_drvdata *drvdat, u8 *data, int size) 289 | { 290 | if (size != 3) 291 | return 0; 292 | 293 | /* Handle broken mute key which only sends press events */ 294 | if (!drvdat->tp && 295 | data[0] == 0x02 && data[1] == 0xe2 && data[2] == 0x00) { 296 | input_report_key(drvdat->input, KEY_MUTE, 1); 297 | input_sync(drvdat->input); 298 | input_report_key(drvdat->input, KEY_MUTE, 0); 299 | input_sync(drvdat->input); 300 | return 1; 301 | } 302 | 303 | /* Handle custom touchpad toggle key which only sends press events */ 304 | if (drvdat->tp_kbd_input && 305 | data[0] == 0x05 && data[1] == 0x02 && data[2] == 0x28) { 306 | input_report_key(drvdat->tp_kbd_input, KEY_F21, 1); 307 | input_sync(drvdat->tp_kbd_input); 308 | input_report_key(drvdat->tp_kbd_input, KEY_F21, 0); 309 | input_sync(drvdat->tp_kbd_input); 310 | return 1; 311 | } 312 | 313 | return 0; 314 | } 315 | 316 | static int asus_event(struct hid_device *hdev, struct hid_field *field, 317 | struct hid_usage *usage, __s32 value) 318 | { 319 | if ((usage->hid & HID_USAGE_PAGE) == 0xff310000 && 320 | (usage->hid & HID_USAGE) != 0x00 && 321 | (usage->hid & HID_USAGE) != 0xff && !usage->type) { 322 | hid_warn(hdev, "Unmapped Asus vendor usagepage code 0x%02x\n", 323 | usage->hid & HID_USAGE); 324 | } 325 | 326 | return 0; 327 | } 328 | 329 | static int asus_raw_event(struct hid_device *hdev, 330 | struct hid_report *report, u8 *data, int size) 331 | { 332 | struct asus_drvdata *drvdata = hid_get_drvdata(hdev); 333 | 334 | if (drvdata->battery && data[0] == BATTERY_REPORT_ID) 335 | return asus_report_battery(drvdata, data, size); 336 | 337 | if (drvdata->tp && data[0] == INPUT_REPORT_ID) 338 | return asus_report_input(drvdata, data, size); 339 | 340 | if (drvdata->quirks & QUIRK_MEDION_E1239T) 341 | return asus_e1239t_event(drvdata, data, size); 342 | 343 | /* 344 | * Skip these report ID, the device emits a continuous stream associated 345 | * with the AURA mode it is in which looks like an 'echo'. 346 | */ 347 | if (report->id == FEATURE_KBD_LED_REPORT_ID1 || report->id == FEATURE_KBD_LED_REPORT_ID2) 348 | return -1; 349 | if (drvdata->quirks & QUIRK_ROG_NKEY_KEYBOARD) { 350 | /* 351 | * G713 and G733 send these codes on some keypresses, depending on 352 | * the key pressed it can trigger a shutdown event if not caught. 353 | */ 354 | if (data[0] == 0x02 && data[1] == 0x30) { 355 | return -1; 356 | } 357 | } 358 | 359 | if (drvdata->quirks & QUIRK_ROG_CLAYMORE_II_KEYBOARD) { 360 | /* 361 | * CLAYMORE II keyboard sends this packet when it goes to sleep 362 | * this causes the whole system to go into suspend. 363 | */ 364 | 365 | if(size == 2 && data[0] == 0x02 && data[1] == 0x00) { 366 | return -1; 367 | } 368 | } 369 | 370 | return 0; 371 | } 372 | 373 | static int asus_kbd_set_report(struct hid_device *hdev, const u8 *buf, size_t buf_size) 374 | { 375 | unsigned char *dmabuf; 376 | int ret; 377 | 378 | dmabuf = kmemdup(buf, buf_size, GFP_KERNEL); 379 | if (!dmabuf) 380 | return -ENOMEM; 381 | 382 | /* 383 | * The report ID should be set from the incoming buffer due to LED and key 384 | * interfaces having different pages 385 | */ 386 | ret = hid_hw_raw_request(hdev, buf[0], dmabuf, 387 | buf_size, HID_FEATURE_REPORT, 388 | HID_REQ_SET_REPORT); 389 | kfree(dmabuf); 390 | 391 | return ret; 392 | } 393 | 394 | static int asus_kbd_init(struct hid_device *hdev, u8 report_id) 395 | { 396 | const u8 buf[] = { report_id, 0x41, 0x53, 0x55, 0x53, 0x20, 0x54, 397 | 0x65, 0x63, 0x68, 0x2e, 0x49, 0x6e, 0x63, 0x2e, 0x00 }; 398 | int ret; 399 | 400 | ret = asus_kbd_set_report(hdev, buf, sizeof(buf)); 401 | if (ret < 0) 402 | hid_err(hdev, "Asus failed to send init command: %d\n", ret); 403 | 404 | return ret; 405 | } 406 | 407 | static int asus_kbd_get_functions(struct hid_device *hdev, 408 | unsigned char *kbd_func, 409 | u8 report_id) 410 | { 411 | const u8 buf[] = { report_id, 0x05, 0x20, 0x31, 0x00, 0x08 }; 412 | u8 *readbuf; 413 | int ret; 414 | 415 | ret = asus_kbd_set_report(hdev, buf, sizeof(buf)); 416 | if (ret < 0) { 417 | hid_err(hdev, "Asus failed to send configuration command: %d\n", ret); 418 | return ret; 419 | } 420 | 421 | readbuf = kzalloc(FEATURE_KBD_REPORT_SIZE, GFP_KERNEL); 422 | if (!readbuf) 423 | return -ENOMEM; 424 | 425 | ret = hid_hw_raw_request(hdev, FEATURE_KBD_REPORT_ID, readbuf, 426 | FEATURE_KBD_REPORT_SIZE, HID_FEATURE_REPORT, 427 | HID_REQ_GET_REPORT); 428 | if (ret < 0) { 429 | hid_err(hdev, "Asus failed to request functions: %d\n", ret); 430 | kfree(readbuf); 431 | return ret; 432 | } 433 | 434 | *kbd_func = readbuf[6]; 435 | 436 | kfree(readbuf); 437 | return ret; 438 | } 439 | 440 | static void asus_schedule_work(struct asus_kbd_leds *led) 441 | { 442 | unsigned long flags; 443 | 444 | spin_lock_irqsave(&led->lock, flags); 445 | if (!led->removed) 446 | schedule_work(&led->work); 447 | spin_unlock_irqrestore(&led->lock, flags); 448 | } 449 | 450 | static void asus_kbd_backlight_set(struct led_classdev *led_cdev, 451 | enum led_brightness brightness) 452 | { 453 | struct asus_kbd_leds *led = container_of(led_cdev, struct asus_kbd_leds, 454 | cdev); 455 | unsigned long flags; 456 | 457 | spin_lock_irqsave(&led->lock, flags); 458 | led->brightness = brightness; 459 | spin_unlock_irqrestore(&led->lock, flags); 460 | 461 | asus_schedule_work(led); 462 | } 463 | 464 | static enum led_brightness asus_kbd_backlight_get(struct led_classdev *led_cdev) 465 | { 466 | struct asus_kbd_leds *led = container_of(led_cdev, struct asus_kbd_leds, 467 | cdev); 468 | enum led_brightness brightness; 469 | unsigned long flags; 470 | 471 | spin_lock_irqsave(&led->lock, flags); 472 | brightness = led->brightness; 473 | spin_unlock_irqrestore(&led->lock, flags); 474 | 475 | return brightness; 476 | } 477 | 478 | static void asus_kbd_backlight_work(struct work_struct *work) 479 | { 480 | struct asus_kbd_leds *led = container_of(work, struct asus_kbd_leds, work); 481 | u8 buf[] = { FEATURE_KBD_REPORT_ID, 0xba, 0xc5, 0xc4, 0x00 }; 482 | int ret; 483 | unsigned long flags; 484 | 485 | spin_lock_irqsave(&led->lock, flags); 486 | buf[4] = led->brightness; 487 | spin_unlock_irqrestore(&led->lock, flags); 488 | 489 | ret = asus_kbd_set_report(led->hdev, buf, sizeof(buf)); 490 | if (ret < 0) 491 | hid_err(led->hdev, "Asus failed to set keyboard backlight: %d\n", ret); 492 | } 493 | 494 | /* WMI-based keyboard backlight LED control (via asus-wmi driver) takes 495 | * precedence. We only activate HID-based backlight control when the 496 | * WMI control is not available. 497 | */ 498 | static bool asus_kbd_wmi_led_control_present(struct hid_device *hdev) 499 | { 500 | struct asus_drvdata *drvdata = hid_get_drvdata(hdev); 501 | u32 value; 502 | int ret; 503 | 504 | if (!IS_ENABLED(CONFIG_ASUS_WMI)) 505 | return false; 506 | 507 | if (drvdata->quirks & QUIRK_ROG_NKEY_KEYBOARD && 508 | dmi_check_system(asus_use_hid_led_dmi_ids)) { 509 | hid_info(hdev, "using HID for asus::kbd_backlight\n"); 510 | return false; 511 | } 512 | 513 | ret = asus_wmi_evaluate_method(ASUS_WMI_METHODID_DSTS, 514 | ASUS_WMI_DEVID_KBD_BACKLIGHT, 0, &value); 515 | hid_dbg(hdev, "WMI backlight check: rc %d value %x", ret, value); 516 | if (ret) 517 | return false; 518 | 519 | return !!(value & ASUS_WMI_DSTS_PRESENCE_BIT); 520 | } 521 | 522 | static int asus_kbd_register_leds(struct hid_device *hdev) 523 | { 524 | struct asus_drvdata *drvdata = hid_get_drvdata(hdev); 525 | unsigned char kbd_func; 526 | int ret; 527 | 528 | if (drvdata->quirks & QUIRK_ROG_NKEY_KEYBOARD) { 529 | /* Initialize keyboard */ 530 | ret = asus_kbd_init(hdev, FEATURE_KBD_REPORT_ID); 531 | if (ret < 0) 532 | return ret; 533 | 534 | /* The LED endpoint is initialised in two HID */ 535 | ret = asus_kbd_init(hdev, FEATURE_KBD_LED_REPORT_ID1); 536 | if (ret < 0) 537 | return ret; 538 | 539 | ret = asus_kbd_init(hdev, FEATURE_KBD_LED_REPORT_ID2); 540 | if (ret < 0) 541 | return ret; 542 | } else { 543 | /* Initialize keyboard */ 544 | ret = asus_kbd_init(hdev, FEATURE_KBD_REPORT_ID); 545 | if (ret < 0) 546 | return ret; 547 | 548 | /* Get keyboard functions */ 549 | ret = asus_kbd_get_functions(hdev, &kbd_func, FEATURE_KBD_REPORT_ID); 550 | if (ret < 0) 551 | return ret; 552 | 553 | /* Check for backlight support */ 554 | if (!(kbd_func & SUPPORT_KBD_BACKLIGHT)) 555 | return -ENODEV; 556 | } 557 | 558 | drvdata->kbd_backlight = devm_kzalloc(&hdev->dev, 559 | sizeof(struct asus_kbd_leds), 560 | GFP_KERNEL); 561 | if (!drvdata->kbd_backlight) 562 | return -ENOMEM; 563 | 564 | drvdata->kbd_backlight->removed = false; 565 | drvdata->kbd_backlight->brightness = 0; 566 | drvdata->kbd_backlight->hdev = hdev; 567 | drvdata->kbd_backlight->cdev.name = "asus::kbd_backlight"; 568 | drvdata->kbd_backlight->cdev.max_brightness = 3; 569 | drvdata->kbd_backlight->cdev.brightness_set = asus_kbd_backlight_set; 570 | drvdata->kbd_backlight->cdev.brightness_get = asus_kbd_backlight_get; 571 | INIT_WORK(&drvdata->kbd_backlight->work, asus_kbd_backlight_work); 572 | spin_lock_init(&drvdata->kbd_backlight->lock); 573 | 574 | ret = devm_led_classdev_register(&hdev->dev, &drvdata->kbd_backlight->cdev); 575 | if (ret < 0) { 576 | /* No need to have this still around */ 577 | devm_kfree(&hdev->dev, drvdata->kbd_backlight); 578 | } 579 | 580 | return ret; 581 | } 582 | 583 | /* 584 | * [0] REPORT_ID (same value defined in report descriptor) 585 | * [1] rest battery level. range [0..255] 586 | * [2]..[7] Bluetooth hardware address (MAC address) 587 | * [8] charging status 588 | * = 0 : AC offline / discharging 589 | * = 1 : AC online / charging 590 | * = 2 : AC online / fully charged 591 | */ 592 | static int asus_parse_battery(struct asus_drvdata *drvdata, u8 *data, int size) 593 | { 594 | u8 sts; 595 | u8 lvl; 596 | int val; 597 | 598 | lvl = data[1]; 599 | sts = data[8]; 600 | 601 | drvdata->battery_capacity = ((int)lvl * 100) / (int)BATTERY_LEVEL_MAX; 602 | 603 | switch (sts) { 604 | case BATTERY_STAT_CHARGING: 605 | val = POWER_SUPPLY_STATUS_CHARGING; 606 | break; 607 | case BATTERY_STAT_FULL: 608 | val = POWER_SUPPLY_STATUS_FULL; 609 | break; 610 | case BATTERY_STAT_DISCONNECT: 611 | default: 612 | val = POWER_SUPPLY_STATUS_DISCHARGING; 613 | break; 614 | } 615 | drvdata->battery_stat = val; 616 | 617 | return 0; 618 | } 619 | 620 | static int asus_report_battery(struct asus_drvdata *drvdata, u8 *data, int size) 621 | { 622 | /* notify only the autonomous event by device */ 623 | if ((drvdata->battery_in_query == false) && 624 | (size == BATTERY_REPORT_SIZE)) 625 | power_supply_changed(drvdata->battery); 626 | 627 | return 0; 628 | } 629 | 630 | static int asus_battery_query(struct asus_drvdata *drvdata) 631 | { 632 | u8 *buf; 633 | int ret = 0; 634 | 635 | buf = kmalloc(BATTERY_REPORT_SIZE, GFP_KERNEL); 636 | if (!buf) 637 | return -ENOMEM; 638 | 639 | drvdata->battery_in_query = true; 640 | ret = hid_hw_raw_request(drvdata->hdev, BATTERY_REPORT_ID, 641 | buf, BATTERY_REPORT_SIZE, 642 | HID_INPUT_REPORT, HID_REQ_GET_REPORT); 643 | drvdata->battery_in_query = false; 644 | if (ret == BATTERY_REPORT_SIZE) 645 | ret = asus_parse_battery(drvdata, buf, BATTERY_REPORT_SIZE); 646 | else 647 | ret = -ENODATA; 648 | 649 | kfree(buf); 650 | 651 | return ret; 652 | } 653 | 654 | static enum power_supply_property asus_battery_props[] = { 655 | POWER_SUPPLY_PROP_STATUS, 656 | POWER_SUPPLY_PROP_PRESENT, 657 | POWER_SUPPLY_PROP_CAPACITY, 658 | POWER_SUPPLY_PROP_SCOPE, 659 | POWER_SUPPLY_PROP_MODEL_NAME, 660 | }; 661 | 662 | #define QUERY_MIN_INTERVAL (60 * HZ) /* 60[sec] */ 663 | 664 | static int asus_battery_get_property(struct power_supply *psy, 665 | enum power_supply_property psp, 666 | union power_supply_propval *val) 667 | { 668 | struct asus_drvdata *drvdata = power_supply_get_drvdata(psy); 669 | int ret = 0; 670 | 671 | switch (psp) { 672 | case POWER_SUPPLY_PROP_STATUS: 673 | case POWER_SUPPLY_PROP_CAPACITY: 674 | if (time_before(drvdata->battery_next_query, jiffies)) { 675 | drvdata->battery_next_query = 676 | jiffies + QUERY_MIN_INTERVAL; 677 | ret = asus_battery_query(drvdata); 678 | if (ret) 679 | return ret; 680 | } 681 | if (psp == POWER_SUPPLY_PROP_STATUS) 682 | val->intval = drvdata->battery_stat; 683 | else 684 | val->intval = drvdata->battery_capacity; 685 | break; 686 | case POWER_SUPPLY_PROP_PRESENT: 687 | val->intval = 1; 688 | break; 689 | case POWER_SUPPLY_PROP_SCOPE: 690 | val->intval = POWER_SUPPLY_SCOPE_DEVICE; 691 | break; 692 | case POWER_SUPPLY_PROP_MODEL_NAME: 693 | val->strval = drvdata->hdev->name; 694 | break; 695 | default: 696 | ret = -EINVAL; 697 | break; 698 | } 699 | 700 | return ret; 701 | } 702 | 703 | static int asus_battery_probe(struct hid_device *hdev) 704 | { 705 | struct asus_drvdata *drvdata = hid_get_drvdata(hdev); 706 | struct power_supply_config pscfg = { .drv_data = drvdata }; 707 | int ret = 0; 708 | 709 | drvdata->battery_capacity = 0; 710 | drvdata->battery_stat = POWER_SUPPLY_STATUS_UNKNOWN; 711 | drvdata->battery_in_query = false; 712 | 713 | drvdata->battery_desc.properties = asus_battery_props; 714 | drvdata->battery_desc.num_properties = ARRAY_SIZE(asus_battery_props); 715 | drvdata->battery_desc.get_property = asus_battery_get_property; 716 | drvdata->battery_desc.type = POWER_SUPPLY_TYPE_BATTERY; 717 | drvdata->battery_desc.use_for_apm = 0; 718 | drvdata->battery_desc.name = devm_kasprintf(&hdev->dev, GFP_KERNEL, 719 | "asus-keyboard-%s-battery", 720 | strlen(hdev->uniq) ? 721 | hdev->uniq : dev_name(&hdev->dev)); 722 | if (!drvdata->battery_desc.name) 723 | return -ENOMEM; 724 | 725 | drvdata->battery_next_query = jiffies; 726 | 727 | drvdata->battery = devm_power_supply_register(&hdev->dev, 728 | &(drvdata->battery_desc), &pscfg); 729 | if (IS_ERR(drvdata->battery)) { 730 | ret = PTR_ERR(drvdata->battery); 731 | drvdata->battery = NULL; 732 | hid_err(hdev, "Unable to register battery device\n"); 733 | return ret; 734 | } 735 | 736 | power_supply_powers(drvdata->battery, &hdev->dev); 737 | 738 | return ret; 739 | } 740 | 741 | static int asus_input_configured(struct hid_device *hdev, struct hid_input *hi) 742 | { 743 | struct input_dev *input = hi->input; 744 | struct asus_drvdata *drvdata = hid_get_drvdata(hdev); 745 | 746 | /* T100CHI uses MULTI_INPUT, bind the touchpad to the mouse hid_input */ 747 | if (drvdata->quirks & QUIRK_T100CHI && 748 | hi->report->id != T100CHI_MOUSE_REPORT_ID) 749 | return 0; 750 | 751 | /* Handle MULTI_INPUT on E1239T mouse/touchpad USB interface */ 752 | if (drvdata->tp && (drvdata->quirks & QUIRK_MEDION_E1239T)) { 753 | switch (hi->report->id) { 754 | case E1239T_TP_TOGGLE_REPORT_ID: 755 | input_set_capability(input, EV_KEY, KEY_F21); 756 | input->name = "Asus Touchpad Keys"; 757 | drvdata->tp_kbd_input = input; 758 | return 0; 759 | case INPUT_REPORT_ID: 760 | break; /* Touchpad report, handled below */ 761 | default: 762 | return 0; /* Ignore other reports */ 763 | } 764 | } 765 | 766 | if (drvdata->tp) { 767 | int ret; 768 | 769 | input_set_abs_params(input, ABS_MT_POSITION_X, 0, 770 | drvdata->tp->max_x, 0, 0); 771 | input_set_abs_params(input, ABS_MT_POSITION_Y, 0, 772 | drvdata->tp->max_y, 0, 0); 773 | input_abs_set_res(input, ABS_MT_POSITION_X, drvdata->tp->res_x); 774 | input_abs_set_res(input, ABS_MT_POSITION_Y, drvdata->tp->res_y); 775 | 776 | if (drvdata->tp->contact_size >= 5) { 777 | input_set_abs_params(input, ABS_TOOL_WIDTH, 0, 778 | MAX_TOUCH_MAJOR, 0, 0); 779 | input_set_abs_params(input, ABS_MT_TOUCH_MAJOR, 0, 780 | MAX_TOUCH_MAJOR, 0, 0); 781 | input_set_abs_params(input, ABS_MT_PRESSURE, 0, 782 | MAX_PRESSURE, 0, 0); 783 | } 784 | 785 | __set_bit(BTN_LEFT, input->keybit); 786 | __set_bit(INPUT_PROP_BUTTONPAD, input->propbit); 787 | 788 | ret = input_mt_init_slots(input, drvdata->tp->max_contacts, 789 | INPUT_MT_POINTER); 790 | 791 | if (ret) { 792 | hid_err(hdev, "Asus input mt init slots failed: %d\n", ret); 793 | return ret; 794 | } 795 | } 796 | 797 | drvdata->input = input; 798 | 799 | if (drvdata->enable_backlight && 800 | !asus_kbd_wmi_led_control_present(hdev) && 801 | asus_kbd_register_leds(hdev)) 802 | hid_warn(hdev, "Failed to initialize backlight.\n"); 803 | 804 | return 0; 805 | } 806 | 807 | #define asus_map_key_clear(c) hid_map_usage_clear(hi, usage, bit, \ 808 | max, EV_KEY, (c)) 809 | static int asus_input_mapping(struct hid_device *hdev, 810 | struct hid_input *hi, struct hid_field *field, 811 | struct hid_usage *usage, unsigned long **bit, 812 | int *max) 813 | { 814 | struct asus_drvdata *drvdata = hid_get_drvdata(hdev); 815 | 816 | if (drvdata->quirks & QUIRK_SKIP_INPUT_MAPPING) { 817 | /* Don't map anything from the HID report. 818 | * We do it all manually in asus_input_configured 819 | */ 820 | return -1; 821 | } 822 | 823 | /* 824 | * Ignore a bunch of bogus collections in the T100CHI descriptor. 825 | * This avoids a bunch of non-functional hid_input devices getting 826 | * created because of the T100CHI using HID_QUIRK_MULTI_INPUT. 827 | */ 828 | if ((drvdata->quirks & (QUIRK_T100CHI | QUIRK_T90CHI)) && 829 | (field->application == (HID_UP_GENDESK | 0x0080) || 830 | field->application == HID_GD_MOUSE || 831 | usage->hid == (HID_UP_GENDEVCTRLS | 0x0024) || 832 | usage->hid == (HID_UP_GENDEVCTRLS | 0x0025) || 833 | usage->hid == (HID_UP_GENDEVCTRLS | 0x0026))) 834 | return -1; 835 | 836 | /* ASUS-specific keyboard hotkeys and led backlight */ 837 | if ((usage->hid & HID_USAGE_PAGE) == HID_UP_ASUSVENDOR) { 838 | switch (usage->hid & HID_USAGE) { 839 | case 0x10: asus_map_key_clear(KEY_BRIGHTNESSDOWN); break; 840 | case 0x20: asus_map_key_clear(KEY_BRIGHTNESSUP); break; 841 | case 0x35: asus_map_key_clear(KEY_DISPLAY_OFF); break; 842 | case 0x6c: asus_map_key_clear(KEY_SLEEP); break; 843 | case 0x7c: asus_map_key_clear(KEY_MICMUTE); break; 844 | case 0x82: asus_map_key_clear(KEY_CAMERA); break; 845 | case 0x88: asus_map_key_clear(KEY_RFKILL); break; 846 | case 0xb5: asus_map_key_clear(KEY_CALC); break; 847 | case 0xc4: asus_map_key_clear(KEY_KBDILLUMUP); break; 848 | case 0xc5: asus_map_key_clear(KEY_KBDILLUMDOWN); break; 849 | case 0xc7: asus_map_key_clear(KEY_KBDILLUMTOGGLE); break; 850 | 851 | case 0x6b: asus_map_key_clear(KEY_F21); break; /* ASUS touchpad toggle */ 852 | case 0x38: asus_map_key_clear(KEY_PROG1); break; /* ROG key */ 853 | case 0xba: asus_map_key_clear(KEY_PROG2); break; /* Fn+C ASUS Splendid */ 854 | case 0x5c: asus_map_key_clear(KEY_PROG3); break; /* Fn+Space Power4Gear */ 855 | case 0x99: asus_map_key_clear(KEY_PROG4); break; /* Fn+F5 "fan" symbol */ 856 | case 0xae: asus_map_key_clear(KEY_PROG4); break; /* Fn+F5 "fan" symbol */ 857 | case 0x92: asus_map_key_clear(KEY_CALC); break; /* Fn+Ret "Calc" symbol */ 858 | case 0xb2: asus_map_key_clear(KEY_PROG2); break; /* Fn+Left previous aura */ 859 | case 0xb3: asus_map_key_clear(KEY_PROG3); break; /* Fn+Left next aura */ 860 | case 0x6a: asus_map_key_clear(KEY_F13); break; /* Screenpad toggle */ 861 | case 0x4b: asus_map_key_clear(KEY_F14); break; /* Arrows/Pg-Up/Dn toggle */ 862 | case 0xa5: asus_map_key_clear(KEY_F15); break; /* ROG Ally left back */ 863 | case 0xa6: asus_map_key_clear(KEY_F16); break; /* ROG Ally QAM button */ 864 | case 0xa7: asus_map_key_clear(KEY_F17); break; /* ROG Ally ROG long-press */ 865 | case 0xa8: asus_map_key_clear(KEY_F18); break; /* ROG Ally ROG long-press-release */ 866 | 867 | default: 868 | /* ASUS lazily declares 256 usages, ignore the rest, 869 | * as some make the keyboard appear as a pointer device. */ 870 | return -1; 871 | } 872 | 873 | /* 874 | * Check and enable backlight only on devices with UsagePage == 875 | * 0xff31 to avoid initializing the keyboard firmware multiple 876 | * times on devices with multiple HID descriptors but same 877 | * PID/VID. 878 | */ 879 | if (drvdata->quirks & QUIRK_USE_KBD_BACKLIGHT) 880 | drvdata->enable_backlight = true; 881 | 882 | set_bit(EV_REP, hi->input->evbit); 883 | return 1; 884 | } 885 | 886 | if ((usage->hid & HID_USAGE_PAGE) == HID_UP_MSVENDOR) { 887 | switch (usage->hid & HID_USAGE) { 888 | case 0xff01: asus_map_key_clear(BTN_1); break; 889 | case 0xff02: asus_map_key_clear(BTN_2); break; 890 | case 0xff03: asus_map_key_clear(BTN_3); break; 891 | case 0xff04: asus_map_key_clear(BTN_4); break; 892 | case 0xff05: asus_map_key_clear(BTN_5); break; 893 | case 0xff06: asus_map_key_clear(BTN_6); break; 894 | case 0xff07: asus_map_key_clear(BTN_7); break; 895 | case 0xff08: asus_map_key_clear(BTN_8); break; 896 | case 0xff09: asus_map_key_clear(BTN_9); break; 897 | case 0xff0a: asus_map_key_clear(BTN_A); break; 898 | case 0xff0b: asus_map_key_clear(BTN_B); break; 899 | case 0x00f1: asus_map_key_clear(KEY_WLAN); break; 900 | case 0x00f2: asus_map_key_clear(KEY_BRIGHTNESSDOWN); break; 901 | case 0x00f3: asus_map_key_clear(KEY_BRIGHTNESSUP); break; 902 | case 0x00f4: asus_map_key_clear(KEY_DISPLAY_OFF); break; 903 | case 0x00f7: asus_map_key_clear(KEY_CAMERA); break; 904 | case 0x00f8: asus_map_key_clear(KEY_PROG1); break; 905 | default: 906 | return 0; 907 | } 908 | 909 | set_bit(EV_REP, hi->input->evbit); 910 | return 1; 911 | } 912 | 913 | if (drvdata->quirks & QUIRK_NO_CONSUMER_USAGES && 914 | (usage->hid & HID_USAGE_PAGE) == HID_UP_CONSUMER) { 915 | switch (usage->hid & HID_USAGE) { 916 | case 0xe2: /* Mute */ 917 | case 0xe9: /* Volume up */ 918 | case 0xea: /* Volume down */ 919 | return 0; 920 | default: 921 | /* Ignore dummy Consumer usages which make the 922 | * keyboard incorrectly appear as a pointer device. 923 | */ 924 | return -1; 925 | } 926 | } 927 | 928 | /* 929 | * The mute button is broken and only sends press events, we 930 | * deal with this in our raw_event handler, so do not map it. 931 | */ 932 | if ((drvdata->quirks & QUIRK_MEDION_E1239T) && 933 | usage->hid == (HID_UP_CONSUMER | 0xe2)) { 934 | input_set_capability(hi->input, EV_KEY, KEY_MUTE); 935 | return -1; 936 | } 937 | 938 | return 0; 939 | } 940 | 941 | static int asus_start_multitouch(struct hid_device *hdev) 942 | { 943 | int ret; 944 | static const unsigned char buf[] = { 945 | FEATURE_REPORT_ID, 0x00, 0x03, 0x01, 0x00 946 | }; 947 | unsigned char *dmabuf = kmemdup(buf, sizeof(buf), GFP_KERNEL); 948 | 949 | if (!dmabuf) { 950 | ret = -ENOMEM; 951 | hid_err(hdev, "Asus failed to alloc dma buf: %d\n", ret); 952 | return ret; 953 | } 954 | 955 | ret = hid_hw_raw_request(hdev, dmabuf[0], dmabuf, sizeof(buf), 956 | HID_FEATURE_REPORT, HID_REQ_SET_REPORT); 957 | 958 | kfree(dmabuf); 959 | 960 | if (ret != sizeof(buf)) { 961 | hid_err(hdev, "Asus failed to start multitouch: %d\n", ret); 962 | return ret; 963 | } 964 | 965 | return 0; 966 | } 967 | 968 | static int __maybe_unused asus_resume(struct hid_device *hdev) { 969 | struct asus_drvdata *drvdata = hid_get_drvdata(hdev); 970 | int ret = 0; 971 | 972 | if (drvdata->kbd_backlight) { 973 | const u8 buf[] = { FEATURE_KBD_REPORT_ID, 0xba, 0xc5, 0xc4, 974 | drvdata->kbd_backlight->cdev.brightness }; 975 | ret = asus_kbd_set_report(hdev, buf, sizeof(buf)); 976 | if (ret < 0) { 977 | hid_err(hdev, "Asus failed to set keyboard backlight: %d\n", ret); 978 | goto asus_resume_err; 979 | } 980 | } 981 | 982 | asus_resume_err: 983 | return ret; 984 | } 985 | 986 | static int __maybe_unused asus_reset_resume(struct hid_device *hdev) 987 | { 988 | struct asus_drvdata *drvdata = hid_get_drvdata(hdev); 989 | 990 | if (drvdata->tp) 991 | return asus_start_multitouch(hdev); 992 | 993 | return 0; 994 | } 995 | 996 | static int asus_probe(struct hid_device *hdev, const struct hid_device_id *id) 997 | { 998 | int ret; 999 | struct asus_drvdata *drvdata; 1000 | 1001 | drvdata = devm_kzalloc(&hdev->dev, sizeof(*drvdata), GFP_KERNEL); 1002 | if (drvdata == NULL) { 1003 | hid_err(hdev, "Can't alloc Asus descriptor\n"); 1004 | return -ENOMEM; 1005 | } 1006 | 1007 | hid_set_drvdata(hdev, drvdata); 1008 | 1009 | drvdata->quirks = id->driver_data; 1010 | 1011 | /* Ignore these endpoints as they will be used by other drivers */ 1012 | if (drvdata->quirks & QUIRK_ROG_ALLY_XPAD) { 1013 | struct usb_interface *intf = to_usb_interface(hdev->dev.parent); 1014 | struct usb_host_endpoint *ep = intf->cur_altsetting->endpoint; 1015 | 1016 | if (ep->desc.bEndpointAddress == ALLY_X_INTERFACE_ADDRESS || 1017 | ep->desc.bEndpointAddress == ALLY_CFG_INTF_IN_ADDRESS || 1018 | ep->desc.bEndpointAddress == ALLY_CFG_INTF_OUT_ADDRESS) 1019 | return -ENODEV; 1020 | } 1021 | 1022 | /* 1023 | * T90CHI's keyboard dock returns same ID values as T100CHI's dock. 1024 | * Thus, identify T90CHI dock with product name string. 1025 | */ 1026 | if (strstr(hdev->name, "T90CHI")) { 1027 | drvdata->quirks &= ~QUIRK_T100CHI; 1028 | drvdata->quirks |= QUIRK_T90CHI; 1029 | } 1030 | 1031 | if (drvdata->quirks & QUIRK_IS_MULTITOUCH) 1032 | drvdata->tp = &asus_i2c_tp; 1033 | 1034 | if ((drvdata->quirks & QUIRK_T100_KEYBOARD) && hid_is_usb(hdev)) { 1035 | struct usb_interface *intf = to_usb_interface(hdev->dev.parent); 1036 | 1037 | if (intf->altsetting->desc.bInterfaceNumber == T100_TPAD_INTF) { 1038 | drvdata->quirks = QUIRK_SKIP_INPUT_MAPPING; 1039 | /* 1040 | * The T100HA uses the same USB-ids as the T100TAF and 1041 | * the T200TA uses the same USB-ids as the T100TA, while 1042 | * both have different max x/y values as the T100TA[F]. 1043 | */ 1044 | if (dmi_match(DMI_PRODUCT_NAME, "T100HAN")) 1045 | drvdata->tp = &asus_t100ha_tp; 1046 | else if (dmi_match(DMI_PRODUCT_NAME, "T200TA")) 1047 | drvdata->tp = &asus_t200ta_tp; 1048 | else 1049 | drvdata->tp = &asus_t100ta_tp; 1050 | } 1051 | } 1052 | 1053 | if (drvdata->quirks & QUIRK_T100CHI) { 1054 | /* 1055 | * All functionality is on a single HID interface and for 1056 | * userspace the touchpad must be a separate input_dev. 1057 | */ 1058 | hdev->quirks |= HID_QUIRK_MULTI_INPUT; 1059 | drvdata->tp = &asus_t100chi_tp; 1060 | } 1061 | 1062 | if ((drvdata->quirks & QUIRK_MEDION_E1239T) && hid_is_usb(hdev)) { 1063 | struct usb_host_interface *alt = 1064 | to_usb_interface(hdev->dev.parent)->altsetting; 1065 | 1066 | if (alt->desc.bInterfaceNumber == MEDION_E1239T_TPAD_INTF) { 1067 | /* For separate input-devs for tp and tp toggle key */ 1068 | hdev->quirks |= HID_QUIRK_MULTI_INPUT; 1069 | drvdata->quirks |= QUIRK_SKIP_INPUT_MAPPING; 1070 | drvdata->tp = &medion_e1239t_tp; 1071 | } 1072 | } 1073 | 1074 | if (drvdata->quirks & QUIRK_NO_INIT_REPORTS) 1075 | hdev->quirks |= HID_QUIRK_NO_INIT_REPORTS; 1076 | 1077 | drvdata->hdev = hdev; 1078 | 1079 | if (drvdata->quirks & (QUIRK_T100CHI | QUIRK_T90CHI)) { 1080 | ret = asus_battery_probe(hdev); 1081 | if (ret) { 1082 | hid_err(hdev, 1083 | "Asus hid battery_probe failed: %d\n", ret); 1084 | return ret; 1085 | } 1086 | } 1087 | 1088 | ret = hid_parse(hdev); 1089 | if (ret) { 1090 | hid_err(hdev, "Asus hid parse failed: %d\n", ret); 1091 | return ret; 1092 | } 1093 | 1094 | ret = hid_hw_start(hdev, HID_CONNECT_DEFAULT); 1095 | if (ret) { 1096 | hid_err(hdev, "Asus hw start failed: %d\n", ret); 1097 | return ret; 1098 | } 1099 | 1100 | if (!drvdata->input) { 1101 | hid_err(hdev, "Asus input not registered\n"); 1102 | ret = -ENOMEM; 1103 | goto err_stop_hw; 1104 | } 1105 | 1106 | if (drvdata->tp) { 1107 | drvdata->input->name = "Asus TouchPad"; 1108 | } else { 1109 | drvdata->input->name = "Asus Keyboard"; 1110 | } 1111 | 1112 | if (drvdata->tp) { 1113 | ret = asus_start_multitouch(hdev); 1114 | if (ret) 1115 | goto err_stop_hw; 1116 | } 1117 | 1118 | return 0; 1119 | err_stop_hw: 1120 | hid_hw_stop(hdev); 1121 | return ret; 1122 | } 1123 | 1124 | static void asus_remove(struct hid_device *hdev) 1125 | { 1126 | struct asus_drvdata *drvdata = hid_get_drvdata(hdev); 1127 | unsigned long flags; 1128 | 1129 | if (drvdata->kbd_backlight) { 1130 | spin_lock_irqsave(&drvdata->kbd_backlight->lock, flags); 1131 | drvdata->kbd_backlight->removed = true; 1132 | spin_unlock_irqrestore(&drvdata->kbd_backlight->lock, flags); 1133 | 1134 | cancel_work_sync(&drvdata->kbd_backlight->work); 1135 | } 1136 | 1137 | hid_hw_stop(hdev); 1138 | } 1139 | 1140 | static const __u8 asus_g752_fixed_rdesc[] = { 1141 | 0x19, 0x00, /* Usage Minimum (0x00) */ 1142 | 0x2A, 0xFF, 0x00, /* Usage Maximum (0xFF) */ 1143 | }; 1144 | 1145 | static __u8 *asus_report_fixup(struct hid_device *hdev, __u8 *rdesc, 1146 | unsigned int *rsize) 1147 | { 1148 | struct asus_drvdata *drvdata = hid_get_drvdata(hdev); 1149 | 1150 | if (drvdata->quirks & QUIRK_FIX_NOTEBOOK_REPORT && 1151 | *rsize >= 56 && rdesc[54] == 0x25 && rdesc[55] == 0x65) { 1152 | hid_info(hdev, "Fixing up Asus notebook report descriptor\n"); 1153 | rdesc[55] = 0xdd; 1154 | } 1155 | /* For the T100TA/T200TA keyboard dock */ 1156 | if (drvdata->quirks & QUIRK_T100_KEYBOARD && 1157 | (*rsize == 76 || *rsize == 101) && 1158 | rdesc[73] == 0x81 && rdesc[74] == 0x01) { 1159 | hid_info(hdev, "Fixing up Asus T100 keyb report descriptor\n"); 1160 | rdesc[74] &= ~HID_MAIN_ITEM_CONSTANT; 1161 | } 1162 | /* For the T100CHI/T90CHI keyboard dock */ 1163 | if (drvdata->quirks & (QUIRK_T100CHI | QUIRK_T90CHI)) { 1164 | int rsize_orig; 1165 | int offs; 1166 | 1167 | if (drvdata->quirks & QUIRK_T100CHI) { 1168 | rsize_orig = 403; 1169 | offs = 388; 1170 | } else { 1171 | rsize_orig = 306; 1172 | offs = 291; 1173 | } 1174 | 1175 | /* 1176 | * Change Usage (76h) to Usage Minimum (00h), Usage Maximum 1177 | * (FFh) and clear the flags in the Input() byte. 1178 | * Note the descriptor has a bogus 0 byte at the end so we 1179 | * only need 1 extra byte. 1180 | */ 1181 | if (*rsize == rsize_orig && 1182 | rdesc[offs] == 0x09 && rdesc[offs + 1] == 0x76) { 1183 | *rsize = rsize_orig + 1; 1184 | rdesc = kmemdup(rdesc, *rsize, GFP_KERNEL); 1185 | if (!rdesc) 1186 | return NULL; 1187 | 1188 | hid_info(hdev, "Fixing up %s keyb report descriptor\n", 1189 | drvdata->quirks & QUIRK_T100CHI ? 1190 | "T100CHI" : "T90CHI"); 1191 | memmove(rdesc + offs + 4, rdesc + offs + 2, 12); 1192 | rdesc[offs] = 0x19; 1193 | rdesc[offs + 1] = 0x00; 1194 | rdesc[offs + 2] = 0x29; 1195 | rdesc[offs + 3] = 0xff; 1196 | rdesc[offs + 14] = 0x00; 1197 | } 1198 | } 1199 | 1200 | if (drvdata->quirks & QUIRK_G752_KEYBOARD && 1201 | *rsize == 75 && rdesc[61] == 0x15 && rdesc[62] == 0x00) { 1202 | /* report is missing usage mninum and maximum */ 1203 | __u8 *new_rdesc; 1204 | size_t new_size = *rsize + sizeof(asus_g752_fixed_rdesc); 1205 | 1206 | new_rdesc = devm_kzalloc(&hdev->dev, new_size, GFP_KERNEL); 1207 | if (new_rdesc == NULL) 1208 | return rdesc; 1209 | 1210 | hid_info(hdev, "Fixing up Asus G752 keyb report descriptor\n"); 1211 | /* copy the valid part */ 1212 | memcpy(new_rdesc, rdesc, 61); 1213 | /* insert missing part */ 1214 | memcpy(new_rdesc + 61, asus_g752_fixed_rdesc, sizeof(asus_g752_fixed_rdesc)); 1215 | /* copy remaining data */ 1216 | memcpy(new_rdesc + 61 + sizeof(asus_g752_fixed_rdesc), rdesc + 61, *rsize - 61); 1217 | 1218 | *rsize = new_size; 1219 | rdesc = new_rdesc; 1220 | } 1221 | 1222 | if (drvdata->quirks & QUIRK_ROG_NKEY_KEYBOARD && 1223 | *rsize == 331 && rdesc[190] == 0x85 && rdesc[191] == 0x5a && 1224 | rdesc[204] == 0x95 && rdesc[205] == 0x05) { 1225 | hid_info(hdev, "Fixing up Asus N-KEY keyb report descriptor\n"); 1226 | rdesc[205] = 0x01; 1227 | } 1228 | 1229 | /* match many more n-key devices */ 1230 | if (drvdata->quirks & QUIRK_ROG_NKEY_KEYBOARD && *rsize > 15) { 1231 | for (int i = 0; i < *rsize - 15; i++) { 1232 | /* offset to the count from 0x5a report part always 14 */ 1233 | if (rdesc[i] == 0x85 && rdesc[i + 1] == 0x5a && 1234 | rdesc[i + 14] == 0x95 && rdesc[i + 15] == 0x05) { 1235 | hid_info(hdev, "Fixing up Asus N-Key report descriptor\n"); 1236 | rdesc[i + 15] = 0x01; 1237 | break; 1238 | } 1239 | } 1240 | } 1241 | 1242 | return rdesc; 1243 | } 1244 | 1245 | static const struct hid_device_id asus_devices[] = { 1246 | { HID_I2C_DEVICE(USB_VENDOR_ID_ASUSTEK, 1247 | USB_DEVICE_ID_ASUSTEK_I2C_KEYBOARD), I2C_KEYBOARD_QUIRKS}, 1248 | { HID_I2C_DEVICE(USB_VENDOR_ID_ASUSTEK, 1249 | USB_DEVICE_ID_ASUSTEK_I2C_TOUCHPAD), I2C_TOUCHPAD_QUIRKS }, 1250 | { HID_USB_DEVICE(USB_VENDOR_ID_ASUSTEK, 1251 | USB_DEVICE_ID_ASUSTEK_ROG_KEYBOARD1), QUIRK_USE_KBD_BACKLIGHT }, 1252 | { HID_USB_DEVICE(USB_VENDOR_ID_ASUSTEK, 1253 | USB_DEVICE_ID_ASUSTEK_ROG_KEYBOARD2), QUIRK_USE_KBD_BACKLIGHT }, 1254 | { HID_USB_DEVICE(USB_VENDOR_ID_ASUSTEK, 1255 | USB_DEVICE_ID_ASUSTEK_ROG_KEYBOARD3), QUIRK_G752_KEYBOARD }, 1256 | { HID_USB_DEVICE(USB_VENDOR_ID_ASUSTEK, 1257 | USB_DEVICE_ID_ASUSTEK_FX503VD_KEYBOARD), 1258 | QUIRK_USE_KBD_BACKLIGHT }, 1259 | { HID_USB_DEVICE(USB_VENDOR_ID_ASUSTEK, 1260 | USB_DEVICE_ID_ASUSTEK_ROG_NKEY_KEYBOARD), 1261 | QUIRK_USE_KBD_BACKLIGHT | QUIRK_ROG_NKEY_KEYBOARD }, 1262 | { HID_USB_DEVICE(USB_VENDOR_ID_ASUSTEK, 1263 | USB_DEVICE_ID_ASUSTEK_ROG_NKEY_KEYBOARD2), 1264 | QUIRK_USE_KBD_BACKLIGHT | QUIRK_ROG_NKEY_KEYBOARD }, 1265 | { HID_USB_DEVICE(USB_VENDOR_ID_ASUSTEK, 1266 | USB_DEVICE_ID_ASUSTEK_ROG_NKEY_KEYBOARD3), 1267 | QUIRK_USE_KBD_BACKLIGHT | QUIRK_ROG_NKEY_KEYBOARD }, 1268 | { HID_USB_DEVICE(USB_VENDOR_ID_ASUSTEK, 1269 | USB_DEVICE_ID_ASUSTEK_ROG_Z13_LIGHTBAR), 1270 | QUIRK_USE_KBD_BACKLIGHT | QUIRK_ROG_NKEY_KEYBOARD }, 1271 | { HID_USB_DEVICE(USB_VENDOR_ID_ASUSTEK, 1272 | USB_DEVICE_ID_ASUSTEK_ROG_NKEY_ALLY), 1273 | QUIRK_USE_KBD_BACKLIGHT | QUIRK_ROG_NKEY_KEYBOARD | QUIRK_ROG_ALLY_XPAD}, 1274 | { HID_USB_DEVICE(USB_VENDOR_ID_ASUSTEK, 1275 | USB_DEVICE_ID_ASUSTEK_ROG_NKEY_ALLY_X), 1276 | QUIRK_USE_KBD_BACKLIGHT | QUIRK_ROG_NKEY_KEYBOARD | QUIRK_ROG_ALLY_XPAD }, 1277 | { HID_USB_DEVICE(USB_VENDOR_ID_ASUSTEK, 1278 | USB_DEVICE_ID_ASUSTEK_ROG_CLAYMORE_II_KEYBOARD), 1279 | QUIRK_ROG_CLAYMORE_II_KEYBOARD }, 1280 | { HID_USB_DEVICE(USB_VENDOR_ID_ASUSTEK, 1281 | USB_DEVICE_ID_ASUSTEK_T100TA_KEYBOARD), 1282 | QUIRK_T100_KEYBOARD | QUIRK_NO_CONSUMER_USAGES }, 1283 | { HID_USB_DEVICE(USB_VENDOR_ID_ASUSTEK, 1284 | USB_DEVICE_ID_ASUSTEK_T100TAF_KEYBOARD), 1285 | QUIRK_T100_KEYBOARD | QUIRK_NO_CONSUMER_USAGES }, 1286 | { HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_ASUS_AK1D) }, 1287 | { HID_USB_DEVICE(USB_VENDOR_ID_TURBOX, USB_DEVICE_ID_ASUS_MD_5110) }, 1288 | { HID_USB_DEVICE(USB_VENDOR_ID_JESS, USB_DEVICE_ID_ASUS_MD_5112) }, 1289 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_ASUSTEK, 1290 | USB_DEVICE_ID_ASUSTEK_T100CHI_KEYBOARD), QUIRK_T100CHI }, 1291 | { HID_USB_DEVICE(USB_VENDOR_ID_ITE, USB_DEVICE_ID_ITE_MEDION_E1239T), 1292 | QUIRK_MEDION_E1239T }, 1293 | /* 1294 | * Note bind to the HID_GROUP_GENERIC group, so that we only bind to the keyboard 1295 | * part, while letting hid-multitouch.c handle the touchpad. 1296 | */ 1297 | { HID_DEVICE(BUS_USB, HID_GROUP_GENERIC, 1298 | USB_VENDOR_ID_ASUSTEK, USB_DEVICE_ID_ASUSTEK_T101HA_KEYBOARD) }, 1299 | { } 1300 | }; 1301 | MODULE_DEVICE_TABLE(hid, asus_devices); 1302 | 1303 | static struct hid_driver asus_driver = { 1304 | .name = "asus", 1305 | .id_table = asus_devices, 1306 | .report_fixup = asus_report_fixup, 1307 | .probe = asus_probe, 1308 | .remove = asus_remove, 1309 | .input_mapping = asus_input_mapping, 1310 | .input_configured = asus_input_configured, 1311 | #ifdef CONFIG_PM 1312 | .reset_resume = asus_reset_resume, 1313 | .resume = asus_resume, 1314 | #endif 1315 | .event = asus_event, 1316 | .raw_event = asus_raw_event 1317 | }; 1318 | module_hid_driver(asus_driver); 1319 | 1320 | MODULE_LICENSE("GPL"); 1321 | -------------------------------------------------------------------------------- /drivers/hid/hid-ids.h: -------------------------------------------------------------------------------- 1 | /* SPDX-License-Identifier: GPL-2.0-or-later */ 2 | /* 3 | * USB HID quirks support for Linux 4 | * 5 | * Copyright (c) 1999 Andreas Gal 6 | * Copyright (c) 2000-2005 Vojtech Pavlik 7 | * Copyright (c) 2005 Michael Haboustak for Concept2, Inc 8 | * Copyright (c) 2006-2007 Jiri Kosina 9 | */ 10 | 11 | /* 12 | */ 13 | 14 | #ifndef HID_IDS_H_FILE 15 | #define HID_IDS_H_FILE 16 | 17 | #define USB_VENDOR_ID_258A 0x258a 18 | #define USB_DEVICE_ID_258A_6A88 0x6a88 19 | 20 | #define USB_VENDOR_ID_3M 0x0596 21 | #define USB_DEVICE_ID_3M1968 0x0500 22 | #define USB_DEVICE_ID_3M2256 0x0502 23 | #define USB_DEVICE_ID_3M3266 0x0506 24 | 25 | #define USB_VENDOR_ID_A4TECH 0x09da 26 | #define USB_DEVICE_ID_A4TECH_WCP32PU 0x0006 27 | #define USB_DEVICE_ID_A4TECH_X5_005D 0x000a 28 | #define USB_DEVICE_ID_A4TECH_RP_649 0x001a 29 | #define USB_DEVICE_ID_A4TECH_NB_95 0x022b 30 | 31 | #define USB_VENDOR_ID_AASHIMA 0x06d6 32 | #define USB_DEVICE_ID_AASHIMA_GAMEPAD 0x0025 33 | #define USB_DEVICE_ID_AASHIMA_PREDATOR 0x0026 34 | 35 | #define USB_VENDOR_ID_ACECAD 0x0460 36 | #define USB_DEVICE_ID_ACECAD_FLAIR 0x0004 37 | #define USB_DEVICE_ID_ACECAD_302 0x0008 38 | 39 | #define USB_VENDOR_ID_ACRUX 0x1a34 40 | 41 | #define USB_VENDOR_ID_ACTIONSTAR 0x2101 42 | #define USB_DEVICE_ID_ACTIONSTAR_1011 0x1011 43 | 44 | #define USB_VENDOR_ID_ADS_TECH 0x06e1 45 | #define USB_DEVICE_ID_ADS_TECH_RADIO_SI470X 0xa155 46 | 47 | #define USB_VENDOR_ID_AFATECH 0x15a4 48 | #define USB_DEVICE_ID_AFATECH_AF9016 0x9016 49 | 50 | #define USB_VENDOR_ID_AIPTEK 0x08ca 51 | #define USB_DEVICE_ID_AIPTEK_01 0x0001 52 | #define USB_DEVICE_ID_AIPTEK_10 0x0010 53 | #define USB_DEVICE_ID_AIPTEK_20 0x0020 54 | #define USB_DEVICE_ID_AIPTEK_21 0x0021 55 | #define USB_DEVICE_ID_AIPTEK_22 0x0022 56 | #define USB_DEVICE_ID_AIPTEK_23 0x0023 57 | #define USB_DEVICE_ID_AIPTEK_24 0x0024 58 | 59 | #define USB_VENDOR_ID_AIRCABLE 0x16CA 60 | #define USB_DEVICE_ID_AIRCABLE1 0x1502 61 | 62 | #define USB_VENDOR_ID_AIREN 0x1a2c 63 | #define USB_DEVICE_ID_AIREN_SLIMPLUS 0x0002 64 | 65 | #define USB_VENDOR_ID_AKAI 0x2011 66 | #define USB_DEVICE_ID_AKAI_MPKMINI2 0x0715 67 | 68 | #define USB_VENDOR_ID_AKAI_09E8 0x09E8 69 | #define USB_DEVICE_ID_AKAI_09E8_MIDIMIX 0x0031 70 | 71 | #define USB_VENDOR_ID_ALCOR 0x058f 72 | #define USB_DEVICE_ID_ALCOR_USBRS232 0x9720 73 | #define USB_DEVICE_ID_ALCOR_MALTRON_KB 0x9410 74 | 75 | #define USB_VENDOR_ID_ALPS 0x0433 76 | #define USB_DEVICE_ID_IBM_GAMEPAD 0x1101 77 | 78 | #define USB_VENDOR_ID_ALPS_JP 0x044E 79 | #define HID_DEVICE_ID_ALPS_U1_DUAL 0x120B 80 | #define HID_DEVICE_ID_ALPS_U1 0x1215 81 | #define HID_DEVICE_ID_ALPS_U1_UNICORN_LEGACY 0x121E 82 | #define HID_DEVICE_ID_ALPS_T4_BTNLESS 0x120C 83 | 84 | #define USB_VENDOR_ID_AMI 0x046b 85 | #define USB_DEVICE_ID_AMI_VIRT_KEYBOARD_AND_MOUSE 0xff10 86 | 87 | #define USB_VENDOR_ID_ANTON 0x1130 88 | #define USB_DEVICE_ID_ANTON_TOUCH_PAD 0x3101 89 | 90 | #define USB_VENDOR_ID_APPLE 0x05ac 91 | #define BT_VENDOR_ID_APPLE 0x004c 92 | #define USB_DEVICE_ID_APPLE_MIGHTYMOUSE 0x0304 93 | #define USB_DEVICE_ID_APPLE_MAGICMOUSE 0x030d 94 | #define USB_DEVICE_ID_APPLE_MAGICMOUSE2 0x0269 95 | #define USB_DEVICE_ID_APPLE_MAGICTRACKPAD 0x030e 96 | #define USB_DEVICE_ID_APPLE_MAGICTRACKPAD2 0x0265 97 | #define USB_DEVICE_ID_APPLE_FOUNTAIN_ANSI 0x020e 98 | #define USB_DEVICE_ID_APPLE_FOUNTAIN_ISO 0x020f 99 | #define USB_DEVICE_ID_APPLE_GEYSER_ANSI 0x0214 100 | #define USB_DEVICE_ID_APPLE_GEYSER_ISO 0x0215 101 | #define USB_DEVICE_ID_APPLE_GEYSER_JIS 0x0216 102 | #define USB_DEVICE_ID_APPLE_GEYSER3_ANSI 0x0217 103 | #define USB_DEVICE_ID_APPLE_GEYSER3_ISO 0x0218 104 | #define USB_DEVICE_ID_APPLE_GEYSER3_JIS 0x0219 105 | #define USB_DEVICE_ID_APPLE_GEYSER4_ANSI 0x021a 106 | #define USB_DEVICE_ID_APPLE_GEYSER4_ISO 0x021b 107 | #define USB_DEVICE_ID_APPLE_GEYSER4_JIS 0x021c 108 | #define USB_DEVICE_ID_APPLE_ALU_MINI_ANSI 0x021d 109 | #define USB_DEVICE_ID_APPLE_ALU_MINI_ISO 0x021e 110 | #define USB_DEVICE_ID_APPLE_ALU_MINI_JIS 0x021f 111 | #define USB_DEVICE_ID_APPLE_ALU_ANSI 0x0220 112 | #define USB_DEVICE_ID_APPLE_ALU_ISO 0x0221 113 | #define USB_DEVICE_ID_APPLE_ALU_JIS 0x0222 114 | #define USB_DEVICE_ID_APPLE_WELLSPRING_ANSI 0x0223 115 | #define USB_DEVICE_ID_APPLE_WELLSPRING_ISO 0x0224 116 | #define USB_DEVICE_ID_APPLE_WELLSPRING_JIS 0x0225 117 | #define USB_DEVICE_ID_APPLE_GEYSER4_HF_ANSI 0x0229 118 | #define USB_DEVICE_ID_APPLE_GEYSER4_HF_ISO 0x022a 119 | #define USB_DEVICE_ID_APPLE_GEYSER4_HF_JIS 0x022b 120 | #define USB_DEVICE_ID_APPLE_ALU_WIRELESS_ANSI 0x022c 121 | #define USB_DEVICE_ID_APPLE_ALU_WIRELESS_ISO 0x022d 122 | #define USB_DEVICE_ID_APPLE_ALU_WIRELESS_JIS 0x022e 123 | #define USB_DEVICE_ID_APPLE_WELLSPRING2_ANSI 0x0230 124 | #define USB_DEVICE_ID_APPLE_WELLSPRING2_ISO 0x0231 125 | #define USB_DEVICE_ID_APPLE_WELLSPRING2_JIS 0x0232 126 | #define USB_DEVICE_ID_APPLE_WELLSPRING3_ANSI 0x0236 127 | #define USB_DEVICE_ID_APPLE_WELLSPRING3_ISO 0x0237 128 | #define USB_DEVICE_ID_APPLE_WELLSPRING3_JIS 0x0238 129 | #define USB_DEVICE_ID_APPLE_WELLSPRING4_ANSI 0x023f 130 | #define USB_DEVICE_ID_APPLE_WELLSPRING4_ISO 0x0240 131 | #define USB_DEVICE_ID_APPLE_WELLSPRING4_JIS 0x0241 132 | #define USB_DEVICE_ID_APPLE_WELLSPRING4A_ANSI 0x0242 133 | #define USB_DEVICE_ID_APPLE_WELLSPRING4A_ISO 0x0243 134 | #define USB_DEVICE_ID_APPLE_WELLSPRING4A_JIS 0x0244 135 | #define USB_DEVICE_ID_APPLE_WELLSPRING5_ANSI 0x0245 136 | #define USB_DEVICE_ID_APPLE_WELLSPRING5_ISO 0x0246 137 | #define USB_DEVICE_ID_APPLE_WELLSPRING5_JIS 0x0247 138 | #define USB_DEVICE_ID_APPLE_ALU_REVB_ANSI 0x024f 139 | #define USB_DEVICE_ID_APPLE_ALU_REVB_ISO 0x0250 140 | #define USB_DEVICE_ID_APPLE_ALU_REVB_JIS 0x0251 141 | #define USB_DEVICE_ID_APPLE_WELLSPRING5A_ANSI 0x0252 142 | #define USB_DEVICE_ID_APPLE_WELLSPRING5A_ISO 0x0253 143 | #define USB_DEVICE_ID_APPLE_WELLSPRING5A_JIS 0x0254 144 | #define USB_DEVICE_ID_APPLE_WELLSPRING7A_ANSI 0x0259 145 | #define USB_DEVICE_ID_APPLE_WELLSPRING7A_ISO 0x025a 146 | #define USB_DEVICE_ID_APPLE_WELLSPRING7A_JIS 0x025b 147 | #define USB_DEVICE_ID_APPLE_WELLSPRING6A_ANSI 0x0249 148 | #define USB_DEVICE_ID_APPLE_WELLSPRING6A_ISO 0x024a 149 | #define USB_DEVICE_ID_APPLE_WELLSPRING6A_JIS 0x024b 150 | #define USB_DEVICE_ID_APPLE_WELLSPRING6_ANSI 0x024c 151 | #define USB_DEVICE_ID_APPLE_WELLSPRING6_ISO 0x024d 152 | #define USB_DEVICE_ID_APPLE_WELLSPRING6_JIS 0x024e 153 | #define USB_DEVICE_ID_APPLE_WELLSPRING7_ANSI 0x0262 154 | #define USB_DEVICE_ID_APPLE_WELLSPRING7_ISO 0x0263 155 | #define USB_DEVICE_ID_APPLE_WELLSPRING7_JIS 0x0264 156 | #define USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ANSI 0x0239 157 | #define USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ISO 0x023a 158 | #define USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_JIS 0x023b 159 | #define USB_DEVICE_ID_APPLE_ALU_WIRELESS_2011_ANSI 0x0255 160 | #define USB_DEVICE_ID_APPLE_ALU_WIRELESS_2011_ISO 0x0256 161 | #define USB_DEVICE_ID_APPLE_ALU_WIRELESS_2011_JIS 0x0257 162 | #define USB_DEVICE_ID_APPLE_MAGIC_KEYBOARD_2015 0x0267 163 | #define USB_DEVICE_ID_APPLE_MAGIC_KEYBOARD_NUMPAD_2015 0x026c 164 | #define USB_DEVICE_ID_APPLE_WELLSPRING8_ANSI 0x0290 165 | #define USB_DEVICE_ID_APPLE_WELLSPRING8_ISO 0x0291 166 | #define USB_DEVICE_ID_APPLE_WELLSPRING8_JIS 0x0292 167 | #define USB_DEVICE_ID_APPLE_WELLSPRING9_ANSI 0x0272 168 | #define USB_DEVICE_ID_APPLE_WELLSPRING9_ISO 0x0273 169 | #define USB_DEVICE_ID_APPLE_WELLSPRING9_JIS 0x0274 170 | #define USB_DEVICE_ID_APPLE_WELLSPRINGT2_J140K 0x027a 171 | #define USB_DEVICE_ID_APPLE_WELLSPRINGT2_J132 0x027b 172 | #define USB_DEVICE_ID_APPLE_WELLSPRINGT2_J680 0x027c 173 | #define USB_DEVICE_ID_APPLE_WELLSPRINGT2_J213 0x027d 174 | #define USB_DEVICE_ID_APPLE_WELLSPRINGT2_J214K 0x027e 175 | #define USB_DEVICE_ID_APPLE_WELLSPRINGT2_J223 0x027f 176 | #define USB_DEVICE_ID_APPLE_WELLSPRINGT2_J230K 0x0280 177 | #define USB_DEVICE_ID_APPLE_WELLSPRINGT2_J152F 0x0340 178 | #define USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY 0x030a 179 | #define USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY 0x030b 180 | #define USB_DEVICE_ID_APPLE_IRCONTROL 0x8240 181 | #define USB_DEVICE_ID_APPLE_IRCONTROL2 0x1440 182 | #define USB_DEVICE_ID_APPLE_IRCONTROL3 0x8241 183 | #define USB_DEVICE_ID_APPLE_IRCONTROL4 0x8242 184 | #define USB_DEVICE_ID_APPLE_IRCONTROL5 0x8243 185 | #define USB_DEVICE_ID_APPLE_MAGIC_KEYBOARD_2021 0x029c 186 | #define USB_DEVICE_ID_APPLE_MAGIC_KEYBOARD_FINGERPRINT_2021 0x029a 187 | #define USB_DEVICE_ID_APPLE_MAGIC_KEYBOARD_NUMPAD_2021 0x029f 188 | #define USB_DEVICE_ID_APPLE_TOUCHBAR_BACKLIGHT 0x8102 189 | #define USB_DEVICE_ID_APPLE_TOUCHBAR_DISPLAY 0x8302 190 | 191 | #define USB_VENDOR_ID_ASUS 0x0486 192 | #define USB_DEVICE_ID_ASUS_T91MT 0x0185 193 | #define USB_DEVICE_ID_ASUSTEK_MULTITOUCH_YFO 0x0186 194 | 195 | #define USB_VENDOR_ID_ASUSTEK 0x0b05 196 | #define USB_DEVICE_ID_ASUSTEK_LCM 0x1726 197 | #define USB_DEVICE_ID_ASUSTEK_LCM2 0x175b 198 | #define USB_DEVICE_ID_ASUSTEK_T100TA_KEYBOARD 0x17e0 199 | #define USB_DEVICE_ID_ASUSTEK_T100TAF_KEYBOARD 0x1807 200 | #define USB_DEVICE_ID_ASUSTEK_T100CHI_KEYBOARD 0x8502 201 | #define USB_DEVICE_ID_ASUSTEK_T101HA_KEYBOARD 0x183d 202 | #define USB_DEVICE_ID_ASUSTEK_T304_KEYBOARD 0x184a 203 | #define USB_DEVICE_ID_ASUSTEK_I2C_KEYBOARD 0x8585 204 | #define USB_DEVICE_ID_ASUSTEK_I2C_TOUCHPAD 0x0101 205 | #define USB_DEVICE_ID_ASUSTEK_ROG_KEYBOARD1 0x1854 206 | #define USB_DEVICE_ID_ASUSTEK_ROG_KEYBOARD2 0x1837 207 | #define USB_DEVICE_ID_ASUSTEK_ROG_KEYBOARD3 0x1822 208 | #define USB_DEVICE_ID_ASUSTEK_ROG_NKEY_KEYBOARD 0x1866 209 | #define USB_DEVICE_ID_ASUSTEK_ROG_NKEY_KEYBOARD2 0x19b6 210 | #define USB_DEVICE_ID_ASUSTEK_ROG_NKEY_KEYBOARD3 0x1a30 211 | #define USB_DEVICE_ID_ASUSTEK_ROG_Z13_LIGHTBAR 0x18c6 212 | #define USB_DEVICE_ID_ASUSTEK_ROG_RAIKIRI_PAD 0x1abb 213 | #define USB_DEVICE_ID_ASUSTEK_ROG_NKEY_ALLY 0x1abe 214 | #define USB_DEVICE_ID_ASUSTEK_ROG_NKEY_ALLY_X 0x1b4c 215 | #define USB_DEVICE_ID_ASUSTEK_ROG_CLAYMORE_II_KEYBOARD 0x196b 216 | #define USB_DEVICE_ID_ASUSTEK_FX503VD_KEYBOARD 0x1869 217 | 218 | #define USB_VENDOR_ID_ATEN 0x0557 219 | #define USB_DEVICE_ID_ATEN_UC100KM 0x2004 220 | #define USB_DEVICE_ID_ATEN_CS124U 0x2202 221 | #define USB_DEVICE_ID_ATEN_2PORTKVM 0x2204 222 | #define USB_DEVICE_ID_ATEN_4PORTKVM 0x2205 223 | #define USB_DEVICE_ID_ATEN_4PORTKVMC 0x2208 224 | #define USB_DEVICE_ID_ATEN_CS682 0x2213 225 | #define USB_DEVICE_ID_ATEN_CS692 0x8021 226 | #define USB_DEVICE_ID_ATEN_CS1758 0x2220 227 | 228 | #define USB_VENDOR_ID_ATMEL 0x03eb 229 | #define USB_DEVICE_ID_ATMEL_MULTITOUCH 0x211c 230 | #define USB_DEVICE_ID_ATMEL_MXT_DIGITIZER 0x2118 231 | #define USB_VENDOR_ID_ATMEL_V_USB 0x16c0 232 | #define USB_DEVICE_ID_ATMEL_V_USB 0x05df 233 | 234 | #define USB_VENDOR_ID_AUREAL 0x0755 235 | #define USB_DEVICE_ID_AUREAL_W01RN 0x2626 236 | 237 | #define USB_VENDOR_ID_AVERMEDIA 0x07ca 238 | #define USB_DEVICE_ID_AVER_FM_MR800 0xb800 239 | 240 | #define USB_VENDOR_ID_AXENTIA 0x12cf 241 | #define USB_DEVICE_ID_AXENTIA_FM_RADIO 0x7111 242 | 243 | #define USB_VENDOR_ID_BAANTO 0x2453 244 | #define USB_DEVICE_ID_BAANTO_MT_190W2 0x0100 245 | 246 | #define USB_VENDOR_ID_BELKIN 0x050d 247 | #define USB_DEVICE_ID_FLIP_KVM 0x3201 248 | 249 | #define USB_VENDOR_ID_BERKSHIRE 0x0c98 250 | #define USB_DEVICE_ID_BERKSHIRE_PCWD 0x1140 251 | 252 | #define USB_VENDOR_ID_BETOP_2185BFM 0x11c2 253 | #define USB_VENDOR_ID_BETOP_2185PC 0x11c0 254 | #define USB_VENDOR_ID_BETOP_2185V2PC 0x8380 255 | #define USB_VENDOR_ID_BETOP_2185V2BFM 0x20bc 256 | 257 | #define USB_VENDOR_ID_BIGBEN 0x146b 258 | #define USB_DEVICE_ID_BIGBEN_PS3OFMINIPAD 0x0902 259 | 260 | #define USB_VENDOR_ID_BTC 0x046e 261 | #define USB_DEVICE_ID_BTC_EMPREX_REMOTE 0x5578 262 | #define USB_DEVICE_ID_BTC_EMPREX_REMOTE_2 0x5577 263 | 264 | #define USB_VENDOR_ID_CANDO 0x2087 265 | #define USB_DEVICE_ID_CANDO_PIXCIR_MULTI_TOUCH 0x0703 266 | #define USB_DEVICE_ID_CANDO_MULTI_TOUCH 0x0a01 267 | #define USB_DEVICE_ID_CANDO_MULTI_TOUCH_10_1 0x0a02 268 | #define USB_DEVICE_ID_CANDO_MULTI_TOUCH_11_6 0x0b03 269 | #define USB_DEVICE_ID_CANDO_MULTI_TOUCH_15_6 0x0f01 270 | 271 | #define USB_VENDOR_ID_CH 0x068e 272 | #define USB_DEVICE_ID_CH_PRO_THROTTLE 0x00f1 273 | #define USB_DEVICE_ID_CH_PRO_PEDALS 0x00f2 274 | #define USB_DEVICE_ID_CH_FIGHTERSTICK 0x00f3 275 | #define USB_DEVICE_ID_CH_COMBATSTICK 0x00f4 276 | #define USB_DEVICE_ID_CH_FLIGHT_SIM_ECLIPSE_YOKE 0x0051 277 | #define USB_DEVICE_ID_CH_FLIGHT_SIM_YOKE 0x00ff 278 | #define USB_DEVICE_ID_CH_3AXIS_5BUTTON_STICK 0x00d3 279 | #define USB_DEVICE_ID_CH_AXIS_295 0x001c 280 | 281 | #define USB_VENDOR_ID_CHERRY 0x046a 282 | #define USB_DEVICE_ID_CHERRY_CYMOTION 0x0023 283 | #define USB_DEVICE_ID_CHERRY_CYMOTION_SOLAR 0x0027 284 | 285 | #define USB_VENDOR_ID_CHIC 0x05fe 286 | #define USB_DEVICE_ID_CHIC_GAMEPAD 0x0014 287 | 288 | #define USB_VENDOR_ID_CHICONY 0x04f2 289 | #define USB_DEVICE_ID_CHICONY_TACTICAL_PAD 0x0418 290 | #define USB_DEVICE_ID_CHICONY_MULTI_TOUCH 0xb19d 291 | #define USB_DEVICE_ID_CHICONY_WIRELESS 0x0618 292 | #define USB_DEVICE_ID_CHICONY_PIXART_USB_OPTICAL_MOUSE 0x1053 293 | #define USB_DEVICE_ID_CHICONY_PIXART_USB_OPTICAL_MOUSE2 0x0939 294 | #define USB_DEVICE_ID_CHICONY_WIRELESS2 0x1123 295 | #define USB_DEVICE_ID_CHICONY_WIRELESS3 0x1236 296 | #define USB_DEVICE_ID_ASUS_AK1D 0x1125 297 | #define USB_DEVICE_ID_CHICONY_TOSHIBA_WT10A 0x1408 298 | #define USB_DEVICE_ID_CHICONY_ACER_SWITCH12 0x1421 299 | 300 | #define USB_VENDOR_ID_CHUNGHWAT 0x2247 301 | #define USB_DEVICE_ID_CHUNGHWAT_MULTITOUCH 0x0001 302 | 303 | #define USB_VENDOR_ID_CIDC 0x1677 304 | 305 | #define I2C_VENDOR_ID_CIRQUE 0x0488 306 | #define I2C_PRODUCT_ID_CIRQUE_1063 0x1063 307 | 308 | #define USB_VENDOR_ID_CJTOUCH 0x24b8 309 | #define USB_DEVICE_ID_CJTOUCH_MULTI_TOUCH_0020 0x0020 310 | #define USB_DEVICE_ID_CJTOUCH_MULTI_TOUCH_0040 0x0040 311 | 312 | #define USB_VENDOR_ID_CLAY_LOGIC 0x20a0 313 | #define USB_DEVICE_ID_NITROKEY_U2F 0x4287 314 | 315 | #define USB_VENDOR_ID_CMEDIA 0x0d8c 316 | #define USB_DEVICE_ID_CM109 0x000e 317 | #define USB_DEVICE_ID_CMEDIA_HS100B 0x0014 318 | #define USB_DEVICE_ID_CM6533 0x0022 319 | 320 | #define USB_VENDOR_ID_CODEMERCS 0x07c0 321 | #define USB_DEVICE_ID_CODEMERCS_IOW_FIRST 0x1500 322 | #define USB_DEVICE_ID_CODEMERCS_IOW_LAST 0x15ff 323 | 324 | #define USB_VENDOR_ID_CORSAIR 0x1b1c 325 | #define USB_DEVICE_ID_CORSAIR_K90 0x1b02 326 | #define USB_DEVICE_ID_CORSAIR_K70R 0x1b09 327 | #define USB_DEVICE_ID_CORSAIR_K95RGB 0x1b11 328 | #define USB_DEVICE_ID_CORSAIR_M65RGB 0x1b12 329 | #define USB_DEVICE_ID_CORSAIR_K70RGB 0x1b13 330 | #define USB_DEVICE_ID_CORSAIR_STRAFE 0x1b15 331 | #define USB_DEVICE_ID_CORSAIR_K65RGB 0x1b17 332 | #define USB_DEVICE_ID_CORSAIR_GLAIVE_RGB 0x1b34 333 | #define USB_DEVICE_ID_CORSAIR_K70RGB_RAPIDFIRE 0x1b38 334 | #define USB_DEVICE_ID_CORSAIR_K65RGB_RAPIDFIRE 0x1b39 335 | #define USB_DEVICE_ID_CORSAIR_SCIMITAR_PRO_RGB 0x1b3e 336 | 337 | #define USB_VENDOR_ID_CREATIVELABS 0x041e 338 | #define USB_DEVICE_ID_CREATIVE_SB_OMNI_SURROUND_51 0x322c 339 | #define USB_DEVICE_ID_PRODIKEYS_PCMIDI 0x2801 340 | #define USB_DEVICE_ID_CREATIVE_SB0540 0x3100 341 | 342 | #define USB_VENDOR_ID_CVTOUCH 0x1ff7 343 | #define USB_DEVICE_ID_CVTOUCH_SCREEN 0x0013 344 | 345 | #define USB_VENDOR_ID_CYGNAL 0x10c4 346 | #define USB_DEVICE_ID_CYGNAL_RADIO_SI470X 0x818a 347 | #define USB_DEVICE_ID_FOCALTECH_FTXXXX_MULTITOUCH 0x81b9 348 | #define USB_DEVICE_ID_CYGNAL_CP2112 0xea90 349 | #define USB_DEVICE_ID_U2F_ZERO 0x8acf 350 | 351 | #define USB_DEVICE_ID_CYGNAL_RADIO_SI4713 0x8244 352 | 353 | #define USB_VENDOR_ID_CYPRESS 0x04b4 354 | #define USB_DEVICE_ID_CYPRESS_MOUSE 0x0001 355 | #define USB_DEVICE_ID_CYPRESS_HIDCOM 0x5500 356 | #define USB_DEVICE_ID_CYPRESS_ULTRAMOUSE 0x7417 357 | #define USB_DEVICE_ID_CYPRESS_BARCODE_1 0xde61 358 | #define USB_DEVICE_ID_CYPRESS_BARCODE_2 0xde64 359 | #define USB_DEVICE_ID_CYPRESS_BARCODE_3 0xbca1 360 | #define USB_DEVICE_ID_CYPRESS_BARCODE_4 0xed81 361 | #define USB_DEVICE_ID_CYPRESS_TRUETOUCH 0xc001 362 | 363 | #define USB_DEVICE_ID_CYPRESS_VARMILO_VA104M_07B1 0X07b1 364 | 365 | #define USB_VENDOR_ID_DATA_MODUL 0x7374 366 | #define USB_VENDOR_ID_DATA_MODUL_EASYMAXTOUCH 0x1201 367 | 368 | #define USB_VENDOR_ID_DEALEXTREAME 0x10c5 369 | #define USB_DEVICE_ID_DEALEXTREAME_RADIO_SI4701 0x819a 370 | 371 | #define USB_VENDOR_ID_DELCOM 0x0fc5 372 | #define USB_DEVICE_ID_DELCOM_VISUAL_IND 0xb080 373 | 374 | #define USB_VENDOR_ID_DELL 0x413c 375 | #define USB_DEVICE_ID_DELL_PIXART_USB_OPTICAL_MOUSE 0x301a 376 | #define USB_DEVICE_ID_DELL_PRO_WIRELESS_KM5221W 0x4503 377 | 378 | #define USB_VENDOR_ID_DELORME 0x1163 379 | #define USB_DEVICE_ID_DELORME_EARTHMATE 0x0100 380 | #define USB_DEVICE_ID_DELORME_EM_LT20 0x0200 381 | 382 | #define USB_VENDOR_ID_DMI 0x0c0b 383 | #define USB_DEVICE_ID_DMI_ENC 0x5fab 384 | 385 | #define USB_VENDOR_ID_DRAGONRISE 0x0079 386 | #define USB_DEVICE_ID_REDRAGON_SEYMUR2 0x0006 387 | #define USB_DEVICE_ID_DRAGONRISE_WIIU 0x1800 388 | #define USB_DEVICE_ID_DRAGONRISE_PS3 0x1801 389 | #define USB_DEVICE_ID_DRAGONRISE_DOLPHINBAR 0x1803 390 | #define USB_DEVICE_ID_DRAGONRISE_GAMECUBE1 0x1843 391 | #define USB_DEVICE_ID_DRAGONRISE_GAMECUBE2 0x1844 392 | #define USB_DEVICE_ID_DRAGONRISE_GAMECUBE3 0x1846 393 | 394 | #define USB_VENDOR_ID_DWAV 0x0eef 395 | #define USB_DEVICE_ID_EGALAX_TOUCHCONTROLLER 0x0001 396 | #define USB_DEVICE_ID_DWAV_TOUCHCONTROLLER 0x0002 397 | #define USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_480D 0x480d 398 | #define USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_480E 0x480e 399 | #define USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_7207 0x7207 400 | #define USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_720C 0x720c 401 | #define USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_7224 0x7224 402 | #define USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_722A 0x722A 403 | #define USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_725E 0x725e 404 | #define USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_7262 0x7262 405 | #define USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_726B 0x726b 406 | #define USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_72A1 0x72a1 407 | #define USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_72AA 0x72aa 408 | #define USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_72C4 0x72c4 409 | #define USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_72D0 0x72d0 410 | #define USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_72FA 0x72fa 411 | #define USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_7302 0x7302 412 | #define USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_7349 0x7349 413 | #define USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_73F7 0x73f7 414 | #define USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_A001 0xa001 415 | #define USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_C002 0xc002 416 | 417 | #define USB_VENDOR_ID_ELAN 0x04f3 418 | #define USB_DEVICE_ID_TOSHIBA_CLICK_L9W 0x0401 419 | #define USB_DEVICE_ID_HP_X2 0x074d 420 | #define USB_DEVICE_ID_HP_X2_10_COVER 0x0755 421 | #define I2C_DEVICE_ID_HP_ENVY_X360_15 0x2d05 422 | #define I2C_DEVICE_ID_HP_ENVY_X360_15T_DR100 0x29CF 423 | #define I2C_DEVICE_ID_HP_ENVY_X360_EU0009NV 0x2CF9 424 | #define I2C_DEVICE_ID_HP_SPECTRE_X360_15 0x2817 425 | #define I2C_DEVICE_ID_HP_SPECTRE_X360_13_AW0020NG 0x29DF 426 | #define I2C_DEVICE_ID_ASUS_TP420IA_TOUCHSCREEN 0x2BC8 427 | #define I2C_DEVICE_ID_ASUS_GV301RA_TOUCHSCREEN 0x2C82 428 | #define I2C_DEVICE_ID_ASUS_UX3402_TOUCHSCREEN 0x2F2C 429 | #define I2C_DEVICE_ID_ASUS_UX6404_TOUCHSCREEN 0x4116 430 | #define USB_DEVICE_ID_ASUS_UX550VE_TOUCHSCREEN 0x2544 431 | #define USB_DEVICE_ID_ASUS_UX550_TOUCHSCREEN 0x2706 432 | #define I2C_DEVICE_ID_SURFACE_GO_TOUCHSCREEN 0x261A 433 | #define I2C_DEVICE_ID_SURFACE_GO2_TOUCHSCREEN 0x2A1C 434 | #define I2C_DEVICE_ID_LENOVO_YOGA_C630_TOUCHSCREEN 0x279F 435 | #define I2C_DEVICE_ID_HP_SPECTRE_X360_13T_AW100 0x29F5 436 | #define I2C_DEVICE_ID_HP_SPECTRE_X360_14T_EA100_V1 0x2BED 437 | #define I2C_DEVICE_ID_HP_SPECTRE_X360_14T_EA100_V2 0x2BEE 438 | #define I2C_DEVICE_ID_HP_ENVY_X360_15_EU0556NG 0x2D02 439 | #define I2C_DEVICE_ID_CHROMEBOOK_TROGDOR_POMPOM 0x2F81 440 | 441 | #define USB_VENDOR_ID_ELECOM 0x056e 442 | #define USB_DEVICE_ID_ELECOM_BM084 0x0061 443 | #define USB_DEVICE_ID_ELECOM_M_XGL20DLBK 0x00e6 444 | #define USB_DEVICE_ID_ELECOM_M_XT3URBK 0x00fb 445 | #define USB_DEVICE_ID_ELECOM_M_XT3DRBK 0x00fc 446 | #define USB_DEVICE_ID_ELECOM_M_XT4DRBK 0x00fd 447 | #define USB_DEVICE_ID_ELECOM_M_DT1URBK 0x00fe 448 | #define USB_DEVICE_ID_ELECOM_M_DT1DRBK 0x00ff 449 | #define USB_DEVICE_ID_ELECOM_M_HT1URBK 0x010c 450 | #define USB_DEVICE_ID_ELECOM_M_HT1DRBK_010D 0x010d 451 | #define USB_DEVICE_ID_ELECOM_M_HT1DRBK_011C 0x011c 452 | 453 | #define USB_VENDOR_ID_DREAM_CHEEKY 0x1d34 454 | #define USB_DEVICE_ID_DREAM_CHEEKY_WN 0x0004 455 | #define USB_DEVICE_ID_DREAM_CHEEKY_FA 0x000a 456 | 457 | #define USB_VENDOR_ID_ELITEGROUP 0x03fc 458 | #define USB_DEVICE_ID_ELITEGROUP_05D8 0x05d8 459 | 460 | #define USB_VENDOR_ID_ELO 0x04E7 461 | #define USB_DEVICE_ID_ELO_TS2515 0x0022 462 | #define USB_DEVICE_ID_ELO_TS2700 0x0020 463 | #define USB_DEVICE_ID_ELO_ACCUTOUCH_2216 0x0050 464 | 465 | #define USB_VENDOR_ID_EMS 0x2006 466 | #define USB_DEVICE_ID_EMS_TRIO_LINKER_PLUS_II 0x0118 467 | 468 | #define USB_VENDOR_ID_EVISION 0x320f 469 | #define USB_DEVICE_ID_EVISION_ICL01 0x5041 470 | 471 | #define USB_VENDOR_ID_FLATFROG 0x25b5 472 | #define USB_DEVICE_ID_MULTITOUCH_3200 0x0002 473 | 474 | #define USB_VENDOR_ID_FUTABA 0x0547 475 | #define USB_DEVICE_ID_LED_DISPLAY 0x7000 476 | 477 | #define USB_VENDOR_ID_FUTURE_TECHNOLOGY 0x0403 478 | #define USB_DEVICE_ID_RETRODE2 0x97c1 479 | #define USB_DEVICE_ID_FT260 0x6030 480 | 481 | #define USB_VENDOR_ID_ESSENTIAL_REALITY 0x0d7f 482 | #define USB_DEVICE_ID_ESSENTIAL_REALITY_P5 0x0100 483 | 484 | #define USB_VENDOR_ID_ETT 0x0664 485 | #define USB_DEVICE_ID_TC5UH 0x0309 486 | #define USB_DEVICE_ID_TC4UM 0x0306 487 | 488 | #define USB_VENDOR_ID_ETURBOTOUCH 0x22b9 489 | #define USB_DEVICE_ID_ETURBOTOUCH 0x0006 490 | #define USB_DEVICE_ID_ETURBOTOUCH_2968 0x2968 491 | 492 | #define USB_VENDOR_ID_EZKEY 0x0518 493 | #define USB_DEVICE_ID_BTC_8193 0x0002 494 | 495 | #define USB_VENDOR_ID_FORMOSA 0x147a 496 | #define USB_DEVICE_ID_FORMOSA_IR_RECEIVER 0xe03e 497 | 498 | #define USB_VENDOR_ID_FREESCALE 0x15A2 499 | #define USB_DEVICE_ID_FREESCALE_MX28 0x004F 500 | 501 | #define USB_VENDOR_ID_FRUCTEL 0x25B6 502 | #define USB_DEVICE_ID_GAMETEL_MT_MODE 0x0002 503 | 504 | #define USB_VENDOR_ID_GAMEVICE 0x27F8 505 | #define USB_DEVICE_ID_GAMEVICE_GV186 0x0BBE 506 | #define USB_DEVICE_ID_GAMEVICE_KISHI 0x0BBF 507 | 508 | #define USB_VENDOR_ID_GAMERON 0x0810 509 | #define USB_DEVICE_ID_GAMERON_DUAL_PSX_ADAPTOR 0x0001 510 | #define USB_DEVICE_ID_GAMERON_DUAL_PCS_ADAPTOR 0x0002 511 | 512 | #define USB_VENDOR_ID_GEMBIRD 0x11ff 513 | #define USB_DEVICE_ID_GEMBIRD_JPD_DUALFORCE2 0x3331 514 | 515 | #define USB_VENDOR_ID_GENERAL_TOUCH 0x0dfc 516 | #define USB_DEVICE_ID_GENERAL_TOUCH_WIN7_TWOFINGERS 0x0003 517 | #define USB_DEVICE_ID_GENERAL_TOUCH_WIN8_PWT_TENFINGERS 0x0100 518 | #define USB_DEVICE_ID_GENERAL_TOUCH_WIN8_PIT_0101 0x0101 519 | #define USB_DEVICE_ID_GENERAL_TOUCH_WIN8_PIT_0102 0x0102 520 | #define USB_DEVICE_ID_GENERAL_TOUCH_WIN8_PIT_0106 0x0106 521 | #define USB_DEVICE_ID_GENERAL_TOUCH_WIN8_PIT_010A 0x010a 522 | #define USB_DEVICE_ID_GENERAL_TOUCH_WIN8_PIT_E100 0xe100 523 | 524 | #define I2C_VENDOR_ID_GOODIX 0x27c6 525 | #define I2C_DEVICE_ID_GOODIX_01F0 0x01f0 526 | 527 | #define USB_VENDOR_ID_GOODTOUCH 0x1aad 528 | #define USB_DEVICE_ID_GOODTOUCH_000f 0x000f 529 | 530 | #define USB_VENDOR_ID_GOOGLE 0x18d1 531 | #define USB_DEVICE_ID_GOOGLE_HAMMER 0x5022 532 | #define USB_DEVICE_ID_GOOGLE_TOUCH_ROSE 0x5028 533 | #define USB_DEVICE_ID_GOOGLE_STAFF 0x502b 534 | #define USB_DEVICE_ID_GOOGLE_WAND 0x502d 535 | #define USB_DEVICE_ID_GOOGLE_WHISKERS 0x5030 536 | #define USB_DEVICE_ID_GOOGLE_MASTERBALL 0x503c 537 | #define USB_DEVICE_ID_GOOGLE_MAGNEMITE 0x503d 538 | #define USB_DEVICE_ID_GOOGLE_MOONBALL 0x5044 539 | #define USB_DEVICE_ID_GOOGLE_DON 0x5050 540 | #define USB_DEVICE_ID_GOOGLE_EEL 0x5057 541 | #define USB_DEVICE_ID_GOOGLE_JEWEL 0x5061 542 | #define USB_DEVICE_ID_GOOGLE_STADIA 0x9400 543 | 544 | #define USB_VENDOR_ID_GOTOP 0x08f2 545 | #define USB_DEVICE_ID_SUPER_Q2 0x007f 546 | #define USB_DEVICE_ID_GOGOPEN 0x00ce 547 | #define USB_DEVICE_ID_PENPOWER 0x00f4 548 | 549 | #define USB_VENDOR_ID_GREENASIA 0x0e8f 550 | #define USB_DEVICE_ID_GREENASIA_DUAL_SAT_ADAPTOR 0x3010 551 | #define USB_DEVICE_ID_GREENASIA_DUAL_USB_JOYPAD 0x3013 552 | 553 | #define USB_VENDOR_ID_GRETAGMACBETH 0x0971 554 | #define USB_DEVICE_ID_GRETAGMACBETH_HUEY 0x2005 555 | 556 | #define USB_VENDOR_ID_GRIFFIN 0x077d 557 | #define USB_DEVICE_ID_POWERMATE 0x0410 558 | #define USB_DEVICE_ID_SOUNDKNOB 0x04AA 559 | #define USB_DEVICE_ID_RADIOSHARK 0x627a 560 | 561 | #define USB_VENDOR_ID_GTCO 0x078c 562 | #define USB_DEVICE_ID_GTCO_90 0x0090 563 | #define USB_DEVICE_ID_GTCO_100 0x0100 564 | #define USB_DEVICE_ID_GTCO_101 0x0101 565 | #define USB_DEVICE_ID_GTCO_103 0x0103 566 | #define USB_DEVICE_ID_GTCO_104 0x0104 567 | #define USB_DEVICE_ID_GTCO_105 0x0105 568 | #define USB_DEVICE_ID_GTCO_106 0x0106 569 | #define USB_DEVICE_ID_GTCO_107 0x0107 570 | #define USB_DEVICE_ID_GTCO_108 0x0108 571 | #define USB_DEVICE_ID_GTCO_200 0x0200 572 | #define USB_DEVICE_ID_GTCO_201 0x0201 573 | #define USB_DEVICE_ID_GTCO_202 0x0202 574 | #define USB_DEVICE_ID_GTCO_203 0x0203 575 | #define USB_DEVICE_ID_GTCO_204 0x0204 576 | #define USB_DEVICE_ID_GTCO_205 0x0205 577 | #define USB_DEVICE_ID_GTCO_206 0x0206 578 | #define USB_DEVICE_ID_GTCO_207 0x0207 579 | #define USB_DEVICE_ID_GTCO_300 0x0300 580 | #define USB_DEVICE_ID_GTCO_301 0x0301 581 | #define USB_DEVICE_ID_GTCO_302 0x0302 582 | #define USB_DEVICE_ID_GTCO_303 0x0303 583 | #define USB_DEVICE_ID_GTCO_304 0x0304 584 | #define USB_DEVICE_ID_GTCO_305 0x0305 585 | #define USB_DEVICE_ID_GTCO_306 0x0306 586 | #define USB_DEVICE_ID_GTCO_307 0x0307 587 | #define USB_DEVICE_ID_GTCO_308 0x0308 588 | #define USB_DEVICE_ID_GTCO_309 0x0309 589 | #define USB_DEVICE_ID_GTCO_400 0x0400 590 | #define USB_DEVICE_ID_GTCO_401 0x0401 591 | #define USB_DEVICE_ID_GTCO_402 0x0402 592 | #define USB_DEVICE_ID_GTCO_403 0x0403 593 | #define USB_DEVICE_ID_GTCO_404 0x0404 594 | #define USB_DEVICE_ID_GTCO_405 0x0405 595 | #define USB_DEVICE_ID_GTCO_500 0x0500 596 | #define USB_DEVICE_ID_GTCO_501 0x0501 597 | #define USB_DEVICE_ID_GTCO_502 0x0502 598 | #define USB_DEVICE_ID_GTCO_503 0x0503 599 | #define USB_DEVICE_ID_GTCO_504 0x0504 600 | #define USB_DEVICE_ID_GTCO_1000 0x1000 601 | #define USB_DEVICE_ID_GTCO_1001 0x1001 602 | #define USB_DEVICE_ID_GTCO_1002 0x1002 603 | #define USB_DEVICE_ID_GTCO_1003 0x1003 604 | #define USB_DEVICE_ID_GTCO_1004 0x1004 605 | #define USB_DEVICE_ID_GTCO_1005 0x1005 606 | #define USB_DEVICE_ID_GTCO_1006 0x1006 607 | #define USB_DEVICE_ID_GTCO_1007 0x1007 608 | 609 | #define USB_VENDOR_ID_GYRATION 0x0c16 610 | #define USB_DEVICE_ID_GYRATION_REMOTE 0x0002 611 | #define USB_DEVICE_ID_GYRATION_REMOTE_2 0x0003 612 | #define USB_DEVICE_ID_GYRATION_REMOTE_3 0x0008 613 | 614 | #define I2C_VENDOR_ID_HANTICK 0x0911 615 | #define I2C_PRODUCT_ID_HANTICK_5288 0x5288 616 | 617 | #define USB_VENDOR_ID_HANWANG 0x0b57 618 | #define USB_DEVICE_ID_HANWANG_TABLET_FIRST 0x5000 619 | #define USB_DEVICE_ID_HANWANG_TABLET_LAST 0x8fff 620 | 621 | #define USB_VENDOR_ID_HANVON 0x20b3 622 | #define USB_DEVICE_ID_HANVON_MULTITOUCH 0x0a18 623 | 624 | #define USB_VENDOR_ID_HANVON_ALT 0x22ed 625 | #define USB_DEVICE_ID_HANVON_ALT_MULTITOUCH 0x1010 626 | 627 | #define USB_VENDOR_ID_HAPP 0x078b 628 | #define USB_DEVICE_ID_UGCI_DRIVING 0x0010 629 | #define USB_DEVICE_ID_UGCI_FLYING 0x0020 630 | #define USB_DEVICE_ID_UGCI_FIGHTING 0x0030 631 | 632 | #define USB_VENDOR_ID_HP 0x03f0 633 | #define USB_PRODUCT_ID_HP_ELITE_PRESENTER_MOUSE_464A 0x464a 634 | #define USB_PRODUCT_ID_HP_LOGITECH_OEM_USB_OPTICAL_MOUSE_0A4A 0x0a4a 635 | #define USB_PRODUCT_ID_HP_LOGITECH_OEM_USB_OPTICAL_MOUSE_0B4A 0x0b4a 636 | #define USB_PRODUCT_ID_HP_PIXART_OEM_USB_OPTICAL_MOUSE 0x134a 637 | #define USB_PRODUCT_ID_HP_PIXART_OEM_USB_OPTICAL_MOUSE_094A 0x094a 638 | #define USB_PRODUCT_ID_HP_PIXART_OEM_USB_OPTICAL_MOUSE_0941 0x0941 639 | #define USB_PRODUCT_ID_HP_PIXART_OEM_USB_OPTICAL_MOUSE_0641 0x0641 640 | #define USB_PRODUCT_ID_HP_PIXART_OEM_USB_OPTICAL_MOUSE_1f4a 0x1f4a 641 | 642 | #define USB_VENDOR_ID_HUION 0x256c 643 | #define USB_DEVICE_ID_HUION_TABLET 0x006e 644 | #define USB_DEVICE_ID_HUION_TABLET2 0x006d 645 | 646 | #define USB_VENDOR_ID_IBM 0x04b3 647 | #define USB_DEVICE_ID_IBM_SCROLLPOINT_III 0x3100 648 | #define USB_DEVICE_ID_IBM_SCROLLPOINT_PRO 0x3103 649 | #define USB_DEVICE_ID_IBM_SCROLLPOINT_OPTICAL 0x3105 650 | #define USB_DEVICE_ID_IBM_SCROLLPOINT_800DPI_OPTICAL 0x3108 651 | #define USB_DEVICE_ID_IBM_SCROLLPOINT_800DPI_OPTICAL_PRO 0x3109 652 | 653 | #define USB_VENDOR_ID_IDEACOM 0x1cb6 654 | #define USB_DEVICE_ID_IDEACOM_IDC6650 0x6650 655 | #define USB_DEVICE_ID_IDEACOM_IDC6651 0x6651 656 | #define USB_DEVICE_ID_IDEACOM_IDC6680 0x6680 657 | 658 | #define USB_VENDOR_ID_ILITEK 0x222a 659 | #define USB_DEVICE_ID_ILITEK_MULTITOUCH 0x0001 660 | 661 | #define USB_VENDOR_ID_INTEL_0 0x8086 662 | #define USB_VENDOR_ID_INTEL_1 0x8087 663 | #define USB_DEVICE_ID_INTEL_HID_SENSOR_0 0x09fa 664 | #define USB_DEVICE_ID_INTEL_HID_SENSOR_1 0x0a04 665 | 666 | #define USB_VENDOR_ID_STM_0 0x0483 667 | #define USB_DEVICE_ID_STM_HID_SENSOR 0x91d1 668 | #define USB_DEVICE_ID_STM_HID_SENSOR_1 0x9100 669 | 670 | #define USB_VENDOR_ID_ION 0x15e4 671 | #define USB_DEVICE_ID_ICADE 0x0132 672 | 673 | #define USB_VENDOR_ID_HOLTEK 0x1241 674 | #define USB_DEVICE_ID_HOLTEK_ON_LINE_GRIP 0x5015 675 | 676 | #define USB_VENDOR_ID_HOLTEK_ALT 0x04d9 677 | #define USB_DEVICE_ID_HOLTEK_ALT_KEYBOARD 0xa055 678 | #define USB_DEVICE_ID_HOLTEK_ALT_MOUSE_A04A 0xa04a 679 | #define USB_DEVICE_ID_HOLTEK_ALT_MOUSE_A067 0xa067 680 | #define USB_DEVICE_ID_HOLTEK_ALT_MOUSE_A070 0xa070 681 | #define USB_DEVICE_ID_HOLTEK_ALT_MOUSE_A072 0xa072 682 | #define USB_DEVICE_ID_HOLTEK_ALT_MOUSE_A081 0xa081 683 | #define USB_DEVICE_ID_HOLTEK_ALT_MOUSE_A0C2 0xa0c2 684 | #define USB_DEVICE_ID_HOLTEK_ALT_KEYBOARD_A096 0xa096 685 | #define USB_DEVICE_ID_HOLTEK_ALT_KEYBOARD_A293 0xa293 686 | 687 | #define USB_VENDOR_ID_IMATION 0x0718 688 | #define USB_DEVICE_ID_DISC_STAKKA 0xd000 689 | 690 | #define USB_VENDOR_ID_IRTOUCHSYSTEMS 0x6615 691 | #define USB_DEVICE_ID_IRTOUCH_INFRARED_USB 0x0070 692 | 693 | #define USB_VENDOR_ID_INNOMEDIA 0x1292 694 | #define USB_DEVICE_ID_INNEX_GENESIS_ATARI 0x4745 695 | 696 | #define USB_VENDOR_ID_ITE 0x048d 697 | #define I2C_VENDOR_ID_ITE 0x103c 698 | #define I2C_DEVICE_ID_ITE_VOYO_WINPAD_A15 0x184f 699 | #define USB_DEVICE_ID_ITE_LENOVO_YOGA 0x8386 700 | #define USB_DEVICE_ID_ITE_LENOVO_YOGA2 0x8350 701 | #define I2C_DEVICE_ID_ITE_LENOVO_LEGION_Y720 0x837a 702 | #define USB_DEVICE_ID_ITE_LENOVO_YOGA900 0x8396 703 | #define USB_DEVICE_ID_ITE8595 0x8595 704 | #define USB_DEVICE_ID_ITE_MEDION_E1239T 0xce50 705 | 706 | #define USB_VENDOR_ID_JABRA 0x0b0e 707 | #define USB_DEVICE_ID_JABRA_SPEAK_410 0x0412 708 | #define USB_DEVICE_ID_JABRA_SPEAK_510 0x0420 709 | #define USB_DEVICE_ID_JABRA_GN9350E 0x9350 710 | 711 | #define USB_VENDOR_ID_JESS 0x0c45 712 | #define USB_DEVICE_ID_JESS_YUREX 0x1010 713 | #define USB_DEVICE_ID_ASUS_MD_5112 0x5112 714 | #define USB_DEVICE_ID_REDRAGON_ASURA 0x760b 715 | 716 | #define USB_VENDOR_ID_JESS2 0x0f30 717 | #define USB_DEVICE_ID_JESS2_COLOR_RUMBLE_PAD 0x0111 718 | 719 | #define USB_VENDOR_ID_KBGEAR 0x084e 720 | #define USB_DEVICE_ID_KBGEAR_JAMSTUDIO 0x1001 721 | 722 | #define USB_VENDOR_ID_KENSINGTON 0x047d 723 | #define USB_DEVICE_ID_KS_SLIMBLADE 0x2041 724 | 725 | #define USB_VENDOR_ID_KWORLD 0x1b80 726 | #define USB_DEVICE_ID_KWORLD_RADIO_FM700 0xd700 727 | 728 | #define USB_VENDOR_ID_KEYTOUCH 0x0926 729 | #define USB_DEVICE_ID_KEYTOUCH_IEC 0x3333 730 | 731 | #define USB_VENDOR_ID_KYE 0x0458 732 | #define USB_DEVICE_ID_KYE_ERGO_525V 0x0087 733 | #define USB_DEVICE_ID_GENIUS_GILA_GAMING_MOUSE 0x0138 734 | #define USB_DEVICE_ID_GENIUS_MANTICORE 0x0153 735 | #define USB_DEVICE_ID_GENIUS_GX_IMPERATOR 0x4018 736 | #define USB_DEVICE_ID_KYE_GPEN_560 0x5003 737 | #define USB_DEVICE_ID_KYE_EASYPEN_M406 0x5005 738 | #define USB_DEVICE_ID_KYE_EASYPEN_M506 0x500F 739 | #define USB_DEVICE_ID_KYE_EASYPEN_I405X 0x5010 740 | #define USB_DEVICE_ID_KYE_MOUSEPEN_I608X 0x5011 741 | #define USB_DEVICE_ID_KYE_EASYPEN_M406W 0x5012 742 | #define USB_DEVICE_ID_KYE_EASYPEN_M610X 0x5013 743 | #define USB_DEVICE_ID_KYE_EASYPEN_340 0x5014 744 | #define USB_DEVICE_ID_KYE_PENSKETCH_M912 0x5015 745 | #define USB_DEVICE_ID_KYE_MOUSEPEN_M508WX 0x5016 746 | #define USB_DEVICE_ID_KYE_MOUSEPEN_M508X 0x5017 747 | #define USB_DEVICE_ID_KYE_EASYPEN_M406XE 0x5019 748 | #define USB_DEVICE_ID_KYE_MOUSEPEN_I608X_V2 0x501A 749 | #define USB_DEVICE_ID_KYE_PENSKETCH_T609A 0x501B 750 | 751 | #define USB_VENDOR_ID_LABTEC 0x1020 752 | #define USB_DEVICE_ID_LABTEC_WIRELESS_KEYBOARD 0x0006 753 | #define USB_DEVICE_ID_LABTEC_ODDOR_HANDBRAKE 0x8888 754 | 755 | #define USB_VENDOR_ID_LAVIEW 0x22D4 756 | #define USB_DEVICE_ID_GLORIOUS_MODEL_I 0x1503 757 | 758 | #define USB_VENDOR_ID_LCPOWER 0x1241 759 | #define USB_DEVICE_ID_LCPOWER_LC1000 0xf767 760 | 761 | #define USB_VENDOR_ID_LD 0x0f11 762 | #define USB_DEVICE_ID_LD_CASSY 0x1000 763 | #define USB_DEVICE_ID_LD_CASSY2 0x1001 764 | #define USB_DEVICE_ID_LD_POCKETCASSY 0x1010 765 | #define USB_DEVICE_ID_LD_POCKETCASSY2 0x1011 766 | #define USB_DEVICE_ID_LD_MOBILECASSY 0x1020 767 | #define USB_DEVICE_ID_LD_MOBILECASSY2 0x1021 768 | #define USB_DEVICE_ID_LD_MICROCASSYVOLTAGE 0x1031 769 | #define USB_DEVICE_ID_LD_MICROCASSYCURRENT 0x1032 770 | #define USB_DEVICE_ID_LD_MICROCASSYTIME 0x1033 771 | #define USB_DEVICE_ID_LD_MICROCASSYTEMPERATURE 0x1035 772 | #define USB_DEVICE_ID_LD_MICROCASSYPH 0x1038 773 | #define USB_DEVICE_ID_LD_POWERANALYSERCASSY 0x1040 774 | #define USB_DEVICE_ID_LD_CONVERTERCONTROLLERCASSY 0x1042 775 | #define USB_DEVICE_ID_LD_MACHINETESTCASSY 0x1043 776 | #define USB_DEVICE_ID_LD_JWM 0x1080 777 | #define USB_DEVICE_ID_LD_DMMP 0x1081 778 | #define USB_DEVICE_ID_LD_UMIP 0x1090 779 | #define USB_DEVICE_ID_LD_UMIC 0x10A0 780 | #define USB_DEVICE_ID_LD_UMIB 0x10B0 781 | #define USB_DEVICE_ID_LD_XRAY 0x1100 782 | #define USB_DEVICE_ID_LD_XRAY2 0x1101 783 | #define USB_DEVICE_ID_LD_XRAYCT 0x1110 784 | #define USB_DEVICE_ID_LD_VIDEOCOM 0x1200 785 | #define USB_DEVICE_ID_LD_MOTOR 0x1210 786 | #define USB_DEVICE_ID_LD_COM3LAB 0x2000 787 | #define USB_DEVICE_ID_LD_TELEPORT 0x2010 788 | #define USB_DEVICE_ID_LD_NETWORKANALYSER 0x2020 789 | #define USB_DEVICE_ID_LD_POWERCONTROL 0x2030 790 | #define USB_DEVICE_ID_LD_MACHINETEST 0x2040 791 | #define USB_DEVICE_ID_LD_MOSTANALYSER 0x2050 792 | #define USB_DEVICE_ID_LD_MOSTANALYSER2 0x2051 793 | #define USB_DEVICE_ID_LD_ABSESP 0x2060 794 | #define USB_DEVICE_ID_LD_AUTODATABUS 0x2070 795 | #define USB_DEVICE_ID_LD_MCT 0x2080 796 | #define USB_DEVICE_ID_LD_HYBRID 0x2090 797 | #define USB_DEVICE_ID_LD_HEATCONTROL 0x20A0 798 | 799 | #define USB_VENDOR_ID_LENOVO 0x17ef 800 | #define USB_DEVICE_ID_LENOVO_TPKBD 0x6009 801 | #define USB_DEVICE_ID_LENOVO_CUSBKBD 0x6047 802 | #define USB_DEVICE_ID_LENOVO_TPIIUSBKBD 0x60ee 803 | #define USB_DEVICE_ID_LENOVO_CBTKBD 0x6048 804 | #define USB_DEVICE_ID_LENOVO_TPIIBTKBD 0x60e1 805 | #define USB_DEVICE_ID_LENOVO_SCROLLPOINT_OPTICAL 0x6049 806 | #define USB_DEVICE_ID_LENOVO_TP10UBKBD 0x6062 807 | #define USB_DEVICE_ID_LENOVO_TPPRODOCK 0x6067 808 | #define USB_DEVICE_ID_LENOVO_X1_COVER 0x6085 809 | #define USB_DEVICE_ID_LENOVO_X1_TAB 0x60a3 810 | #define USB_DEVICE_ID_LENOVO_X1_TAB3 0x60b5 811 | #define USB_DEVICE_ID_LENOVO_X12_TAB 0x60fe 812 | #define USB_DEVICE_ID_LENOVO_OPTICAL_USB_MOUSE_600E 0x600e 813 | #define USB_DEVICE_ID_LENOVO_PIXART_USB_MOUSE_608D 0x608d 814 | #define USB_DEVICE_ID_LENOVO_PIXART_USB_MOUSE_6019 0x6019 815 | #define USB_DEVICE_ID_LENOVO_PIXART_USB_MOUSE_602E 0x602e 816 | #define USB_DEVICE_ID_LENOVO_PIXART_USB_MOUSE_6093 0x6093 817 | 818 | #define USB_VENDOR_ID_LETSKETCH 0x6161 819 | #define USB_DEVICE_ID_WP9620N 0x4d15 820 | 821 | #define USB_VENDOR_ID_LG 0x1fd2 822 | #define USB_DEVICE_ID_LG_MULTITOUCH 0x0064 823 | #define USB_DEVICE_ID_LG_MELFAS_MT 0x6007 824 | #define I2C_DEVICE_ID_LG_8001 0x8001 825 | #define I2C_DEVICE_ID_LG_7010 0x7010 826 | 827 | #define USB_VENDOR_ID_LOGITECH 0x046d 828 | #define USB_DEVICE_ID_LOGITECH_Z_10_SPK 0x0a07 829 | #define USB_DEVICE_ID_LOGITECH_AUDIOHUB 0x0a0e 830 | #define USB_DEVICE_ID_LOGITECH_T651 0xb00c 831 | #define USB_DEVICE_ID_LOGITECH_DINOVO_EDGE_KBD 0xb309 832 | #define USB_DEVICE_ID_LOGITECH_CASA_TOUCHPAD 0xbb00 833 | #define USB_DEVICE_ID_LOGITECH_C007 0xc007 834 | #define USB_DEVICE_ID_LOGITECH_C077 0xc077 835 | #define USB_DEVICE_ID_LOGITECH_RECEIVER 0xc101 836 | #define USB_DEVICE_ID_LOGITECH_HARMONY_FIRST 0xc110 837 | #define USB_DEVICE_ID_LOGITECH_HARMONY_LAST 0xc14f 838 | #define USB_DEVICE_ID_LOGITECH_HARMONY_PS3 0x0306 839 | #define USB_DEVICE_ID_LOGITECH_KEYBOARD_G710_PLUS 0xc24d 840 | #define USB_DEVICE_ID_LOGITECH_MOUSE_C01A 0xc01a 841 | #define USB_DEVICE_ID_LOGITECH_MOUSE_C05A 0xc05a 842 | #define USB_DEVICE_ID_LOGITECH_MOUSE_C06A 0xc06a 843 | #define USB_DEVICE_ID_LOGITECH_RUMBLEPAD_CORD 0xc20a 844 | #define USB_DEVICE_ID_LOGITECH_RUMBLEPAD 0xc211 845 | #define USB_DEVICE_ID_LOGITECH_EXTREME_3D 0xc215 846 | #define USB_DEVICE_ID_LOGITECH_DUAL_ACTION 0xc216 847 | #define USB_DEVICE_ID_LOGITECH_RUMBLEPAD2 0xc218 848 | #define USB_DEVICE_ID_LOGITECH_RUMBLEPAD2_2 0xc219 849 | #define USB_DEVICE_ID_LOGITECH_G15_LCD 0xc222 850 | #define USB_DEVICE_ID_LOGITECH_G11 0xc225 851 | #define USB_DEVICE_ID_LOGITECH_G15_V2_LCD 0xc227 852 | #define USB_DEVICE_ID_LOGITECH_G510 0xc22d 853 | #define USB_DEVICE_ID_LOGITECH_G510_USB_AUDIO 0xc22e 854 | #define USB_DEVICE_ID_LOGITECH_G29_WHEEL 0xc24f 855 | #define USB_DEVICE_ID_LOGITECH_G920_WHEEL 0xc262 856 | #define USB_DEVICE_ID_LOGITECH_G923_PS4_WHEEL 0xc267 857 | #define USB_DEVICE_ID_LOGITECH_G923_XBOX_WHEEL 0xc26e 858 | #define USB_DEVICE_ID_LOGITECH_WINGMAN_F3D 0xc283 859 | #define USB_DEVICE_ID_LOGITECH_FORCE3D_PRO 0xc286 860 | #define USB_DEVICE_ID_LOGITECH_FLIGHT_SYSTEM_G940 0xc287 861 | #define USB_DEVICE_ID_LOGITECH_WINGMAN_FG 0xc20e 862 | #define USB_DEVICE_ID_LOGITECH_WINGMAN_FFG 0xc293 863 | #define USB_DEVICE_ID_LOGITECH_WHEEL 0xc294 864 | #define USB_DEVICE_ID_LOGITECH_MOMO_WHEEL 0xc295 865 | #define USB_DEVICE_ID_LOGITECH_DFP_WHEEL 0xc298 866 | #define USB_DEVICE_ID_LOGITECH_G25_WHEEL 0xc299 867 | #define USB_DEVICE_ID_LOGITECH_DFGT_WHEEL 0xc29a 868 | #define USB_DEVICE_ID_LOGITECH_G27_WHEEL 0xc29b 869 | #define USB_DEVICE_ID_LOGITECH_WII_WHEEL 0xc29c 870 | #define USB_DEVICE_ID_LOGITECH_ELITE_KBD 0xc30a 871 | #define USB_DEVICE_ID_LOGITECH_GROUP_AUDIO 0x0882 872 | #define USB_DEVICE_ID_S510_RECEIVER 0xc50c 873 | #define USB_DEVICE_ID_S510_RECEIVER_2 0xc517 874 | #define USB_DEVICE_ID_LOGITECH_CORDLESS_DESKTOP_LX500 0xc512 875 | #define USB_DEVICE_ID_MX3000_RECEIVER 0xc513 876 | #define USB_DEVICE_ID_LOGITECH_27MHZ_MOUSE_RECEIVER 0xc51b 877 | #define USB_DEVICE_ID_LOGITECH_UNIFYING_RECEIVER 0xc52b 878 | #define USB_DEVICE_ID_LOGITECH_NANO_RECEIVER 0xc52f 879 | #define USB_DEVICE_ID_LOGITECH_G700_RECEIVER 0xc531 880 | #define USB_DEVICE_ID_LOGITECH_UNIFYING_RECEIVER_2 0xc532 881 | #define USB_DEVICE_ID_LOGITECH_NANO_RECEIVER_2 0xc534 882 | #define USB_DEVICE_ID_LOGITECH_NANO_RECEIVER_LIGHTSPEED_1 0xc539 883 | #define USB_DEVICE_ID_LOGITECH_NANO_RECEIVER_LIGHTSPEED_1_1 0xc53f 884 | #define USB_DEVICE_ID_LOGITECH_NANO_RECEIVER_POWERPLAY 0xc53a 885 | #define USB_DEVICE_ID_SPACETRAVELLER 0xc623 886 | #define USB_DEVICE_ID_SPACENAVIGATOR 0xc626 887 | #define USB_DEVICE_ID_DINOVO_DESKTOP 0xc704 888 | #define USB_DEVICE_ID_MX5000_RECEIVER_MOUSE_DEV 0xc70a 889 | #define USB_DEVICE_ID_MX5000_RECEIVER_KBD_DEV 0xc70e 890 | #define USB_DEVICE_ID_DINOVO_EDGE_RECEIVER_KBD_DEV 0xc713 891 | #define USB_DEVICE_ID_DINOVO_EDGE_RECEIVER_MOUSE_DEV 0xc714 892 | #define USB_DEVICE_ID_MX5500_RECEIVER_KBD_DEV 0xc71b 893 | #define USB_DEVICE_ID_MX5500_RECEIVER_MOUSE_DEV 0xc71c 894 | #define USB_DEVICE_ID_DINOVO_MINI_RECEIVER_KBD_DEV 0xc71e 895 | #define USB_DEVICE_ID_DINOVO_MINI_RECEIVER_MOUSE_DEV 0xc71f 896 | #define USB_DEVICE_ID_LOGITECH_MOMO_WHEEL2 0xca03 897 | #define USB_DEVICE_ID_LOGITECH_VIBRATION_WHEEL 0xca04 898 | 899 | #define USB_VENDOR_ID_LUMIO 0x202e 900 | #define USB_DEVICE_ID_CRYSTALTOUCH 0x0006 901 | #define USB_DEVICE_ID_CRYSTALTOUCH_DUAL 0x0007 902 | 903 | #define USB_VENDOR_ID_MADCATZ 0x0738 904 | #define USB_DEVICE_ID_MADCATZ_BEATPAD 0x4540 905 | #define USB_DEVICE_ID_MADCATZ_RAT5 0x1705 906 | #define USB_DEVICE_ID_MADCATZ_RAT9 0x1709 907 | #define USB_DEVICE_ID_MADCATZ_MMO7 0x1713 908 | 909 | #define USB_VENDOR_ID_MCC 0x09db 910 | #define USB_DEVICE_ID_MCC_PMD1024LS 0x0076 911 | #define USB_DEVICE_ID_MCC_PMD1208LS 0x007a 912 | 913 | #define USB_VENDOR_ID_MCS 0x16d0 914 | #define USB_DEVICE_ID_MCS_GAMEPADBLOCK 0x0bcc 915 | 916 | #define USB_VENDOR_MEGAWORLD 0x07b5 917 | #define USB_DEVICE_ID_MEGAWORLD_GAMEPAD 0x0312 918 | 919 | #define USB_VENDOR_ID_MGE 0x0463 920 | #define USB_DEVICE_ID_MGE_UPS 0xffff 921 | #define USB_DEVICE_ID_MGE_UPS1 0x0001 922 | 923 | #define USB_VENDOR_ID_MICROCHIP 0x04d8 924 | #define USB_DEVICE_ID_PICKIT1 0x0032 925 | #define USB_DEVICE_ID_PICKIT2 0x0033 926 | #define USB_DEVICE_ID_PICOLCD 0xc002 927 | #define USB_DEVICE_ID_PICOLCD_BOOTLOADER 0xf002 928 | #define USB_DEVICE_ID_PICK16F1454 0x0042 929 | #define USB_DEVICE_ID_PICK16F1454_V2 0xf2f7 930 | #define USB_DEVICE_ID_LUXAFOR 0xf372 931 | #define USB_DEVICE_ID_MCP2200 0x00df 932 | #define USB_DEVICE_ID_MCP2221 0x00dd 933 | 934 | #define USB_VENDOR_ID_MICROSOFT 0x045e 935 | #define USB_DEVICE_ID_SIDEWINDER_GV 0x003b 936 | #define USB_DEVICE_ID_MS_OFFICE_KB 0x0048 937 | #define USB_DEVICE_ID_WIRELESS_OPTICAL_DESKTOP_3_0 0x009d 938 | #define USB_DEVICE_ID_MS_DIGITAL_MEDIA_7K 0x00b4 939 | #define USB_DEVICE_ID_MS_NE4K 0x00db 940 | #define USB_DEVICE_ID_MS_NE4K_JP 0x00dc 941 | #define USB_DEVICE_ID_MS_LK6K 0x00f9 942 | #define USB_DEVICE_ID_MS_PRESENTER_8K_BT 0x0701 943 | #define USB_DEVICE_ID_MS_PRESENTER_8K_USB 0x0713 944 | #define USB_DEVICE_ID_MS_NE7K 0x071d 945 | #define USB_DEVICE_ID_MS_DIGITAL_MEDIA_3K 0x0730 946 | #define USB_DEVICE_ID_MS_DIGITAL_MEDIA_3KV1 0x0732 947 | #define USB_DEVICE_ID_MS_DIGITAL_MEDIA_600 0x0750 948 | #define USB_DEVICE_ID_MS_COMFORT_MOUSE_4500 0x076c 949 | #define USB_DEVICE_ID_MS_COMFORT_KEYBOARD 0x00e3 950 | #define USB_DEVICE_ID_MS_SURFACE_PRO_2 0x0799 951 | #define USB_DEVICE_ID_MS_TOUCH_COVER_2 0x07a7 952 | #define USB_DEVICE_ID_MS_TYPE_COVER_2 0x07a9 953 | #define USB_DEVICE_ID_MS_POWER_COVER 0x07da 954 | #define USB_DEVICE_ID_MS_SURFACE3_COVER 0x07de 955 | /* 956 | * For a description of the Xbox controller models, refer to: 957 | * https://en.wikipedia.org/wiki/Xbox_Wireless_Controller#Summary 958 | */ 959 | #define USB_DEVICE_ID_MS_XBOX_CONTROLLER_MODEL_1708 0x02fd 960 | #define USB_DEVICE_ID_MS_XBOX_CONTROLLER_MODEL_1708_BLE 0x0b20 961 | #define USB_DEVICE_ID_MS_XBOX_CONTROLLER_MODEL_1914 0x0b13 962 | #define USB_DEVICE_ID_MS_XBOX_CONTROLLER_MODEL_1797 0x0b05 963 | #define USB_DEVICE_ID_MS_XBOX_CONTROLLER_MODEL_1797_BLE 0x0b22 964 | #define USB_DEVICE_ID_MS_PIXART_MOUSE 0x00cb 965 | #define USB_DEVICE_ID_8BITDO_SN30_PRO_PLUS 0x02e0 966 | #define USB_DEVICE_ID_MS_MOUSE_0783 0x0783 967 | 968 | #define USB_VENDOR_ID_MOJO 0x8282 969 | #define USB_DEVICE_ID_RETRO_ADAPTER 0x3201 970 | 971 | #define USB_VENDOR_ID_MONTEREY 0x0566 972 | #define USB_DEVICE_ID_GENIUS_KB29E 0x3004 973 | 974 | #define USB_VENDOR_ID_MSI 0x1770 975 | #define USB_DEVICE_ID_MSI_GT683R_LED_PANEL 0xff00 976 | 977 | #define USB_VENDOR_ID_NATIONAL_SEMICONDUCTOR 0x0400 978 | #define USB_DEVICE_ID_N_S_HARMONY 0xc359 979 | 980 | #define USB_VENDOR_ID_NATSU 0x08b7 981 | #define USB_DEVICE_ID_NATSU_GAMEPAD 0x0001 982 | 983 | #define USB_VENDOR_ID_NCR 0x0404 984 | #define USB_DEVICE_ID_NCR_FIRST 0x0300 985 | #define USB_DEVICE_ID_NCR_LAST 0x03ff 986 | 987 | #define USB_VENDOR_ID_NEC 0x073e 988 | #define USB_DEVICE_ID_NEC_USB_GAME_PAD 0x0301 989 | 990 | #define USB_VENDOR_ID_NEXIO 0x1870 991 | #define USB_DEVICE_ID_NEXIO_MULTITOUCH_420 0x010d 992 | #define USB_DEVICE_ID_NEXIO_MULTITOUCH_PTI0750 0x0110 993 | 994 | #define USB_VENDOR_ID_NEXTWINDOW 0x1926 995 | #define USB_DEVICE_ID_NEXTWINDOW_TOUCHSCREEN 0x0003 996 | 997 | #define USB_VENDOR_ID_NINTENDO 0x057e 998 | #define USB_DEVICE_ID_NINTENDO_WIIMOTE 0x0306 999 | #define USB_DEVICE_ID_NINTENDO_WIIMOTE2 0x0330 1000 | #define USB_DEVICE_ID_NINTENDO_JOYCONL 0x2006 1001 | #define USB_DEVICE_ID_NINTENDO_JOYCONR 0x2007 1002 | #define USB_DEVICE_ID_NINTENDO_PROCON 0x2009 1003 | #define USB_DEVICE_ID_NINTENDO_CHRGGRIP 0x200e 1004 | #define USB_DEVICE_ID_NINTENDO_SNESCON 0x2017 1005 | #define USB_DEVICE_ID_NINTENDO_GENCON 0x201e 1006 | #define USB_DEVICE_ID_NINTENDO_N64CON 0x2019 1007 | 1008 | #define USB_VENDOR_ID_NOVATEK 0x0603 1009 | #define USB_DEVICE_ID_NOVATEK_PCT 0x0600 1010 | #define USB_DEVICE_ID_NOVATEK_MOUSE 0x1602 1011 | 1012 | #define USB_VENDOR_ID_NTI 0x0757 1013 | #define USB_DEVICE_ID_USB_SUN 0x0a00 1014 | 1015 | #define USB_VENDOR_ID_NTRIG 0x1b96 1016 | #define USB_DEVICE_ID_NTRIG_TOUCH_SCREEN 0x0001 1017 | #define USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_1 0x0003 1018 | #define USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_2 0x0004 1019 | #define USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_3 0x0005 1020 | #define USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_4 0x0006 1021 | #define USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_5 0x0007 1022 | #define USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_6 0x0008 1023 | #define USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_7 0x0009 1024 | #define USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_8 0x000A 1025 | #define USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_9 0x000B 1026 | #define USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_10 0x000C 1027 | #define USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_11 0x000D 1028 | #define USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_12 0x000E 1029 | #define USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_13 0x000F 1030 | #define USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_14 0x0010 1031 | #define USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_15 0x0011 1032 | #define USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_16 0x0012 1033 | #define USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_17 0x0013 1034 | #define USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_18 0x0014 1035 | #define USB_DEVICE_ID_NTRIG_DUOSENSE 0x1500 1036 | 1037 | #define USB_VENDOR_ID_NVIDIA 0x0955 1038 | #define USB_DEVICE_ID_NVIDIA_THUNDERSTRIKE_CONTROLLER 0x7214 1039 | 1040 | #define USB_VENDOR_ID_ONTRAK 0x0a07 1041 | #define USB_DEVICE_ID_ONTRAK_ADU100 0x0064 1042 | 1043 | #define USB_VENDOR_ID_ORTEK 0x05a4 1044 | #define USB_DEVICE_ID_ORTEK_PKB1700 0x1700 1045 | #define USB_DEVICE_ID_ORTEK_WKB2000 0x2000 1046 | #define USB_DEVICE_ID_ORTEK_IHOME_IMAC_A210S 0x8003 1047 | 1048 | #define USB_VENDOR_ID_PLANTRONICS 0x047f 1049 | #define USB_DEVICE_ID_PLANTRONICS_BLACKWIRE_3210_SERIES 0xc055 1050 | #define USB_DEVICE_ID_PLANTRONICS_BLACKWIRE_3220_SERIES 0xc056 1051 | #define USB_DEVICE_ID_PLANTRONICS_BLACKWIRE_3215_SERIES 0xc057 1052 | #define USB_DEVICE_ID_PLANTRONICS_BLACKWIRE_3225_SERIES 0xc058 1053 | 1054 | #define USB_VENDOR_ID_PANASONIC 0x04da 1055 | #define USB_DEVICE_ID_PANABOARD_UBT780 0x1044 1056 | #define USB_DEVICE_ID_PANABOARD_UBT880 0x104d 1057 | 1058 | #define USB_VENDOR_ID_PANJIT 0x134c 1059 | 1060 | #define USB_VENDOR_ID_PANTHERLORD 0x0810 1061 | #define USB_DEVICE_ID_PANTHERLORD_TWIN_USB_JOYSTICK 0x0001 1062 | 1063 | #define USB_VENDOR_ID_PENMOUNT 0x14e1 1064 | #define USB_DEVICE_ID_PENMOUNT_PCI 0x3500 1065 | #define USB_DEVICE_ID_PENMOUNT_1610 0x1610 1066 | #define USB_DEVICE_ID_PENMOUNT_1640 0x1640 1067 | #define USB_DEVICE_ID_PENMOUNT_6000 0x6000 1068 | 1069 | #define USB_VENDOR_ID_PETALYNX 0x18b1 1070 | #define USB_DEVICE_ID_PETALYNX_MAXTER_REMOTE 0x0037 1071 | 1072 | #define USB_VENDOR_ID_PETZL 0x2122 1073 | #define USB_DEVICE_ID_PETZL_HEADLAMP 0x1234 1074 | 1075 | #define USB_VENDOR_ID_PHILIPS 0x0471 1076 | #define USB_DEVICE_ID_PHILIPS_IEEE802154_DONGLE 0x0617 1077 | 1078 | #define USB_VENDOR_ID_PI_ENGINEERING 0x05f3 1079 | #define USB_DEVICE_ID_PI_ENGINEERING_VEC_USB_FOOTPEDAL 0xff 1080 | 1081 | #define USB_VENDOR_ID_PIXART 0x093a 1082 | #define USB_DEVICE_ID_PIXART_USB_OPTICAL_MOUSE_ID2 0x0137 1083 | #define USB_DEVICE_ID_PIXART_USB_OPTICAL_MOUSE 0x2510 1084 | #define USB_DEVICE_ID_PIXART_OPTICAL_TOUCH_SCREEN 0x8001 1085 | #define USB_DEVICE_ID_PIXART_OPTICAL_TOUCH_SCREEN1 0x8002 1086 | #define USB_DEVICE_ID_PIXART_OPTICAL_TOUCH_SCREEN2 0x8003 1087 | 1088 | #define USB_VENDOR_ID_PLAYDOTCOM 0x0b43 1089 | #define USB_DEVICE_ID_PLAYDOTCOM_EMS_USBII 0x0003 1090 | 1091 | #define USB_VENDOR_ID_POWERCOM 0x0d9f 1092 | #define USB_DEVICE_ID_POWERCOM_UPS 0x0002 1093 | 1094 | #define USB_VENDOR_ID_PRODIGE 0x05af 1095 | #define USB_DEVICE_ID_PRODIGE_CORDLESS 0x3062 1096 | 1097 | #define USB_VENDOR_ID_QUANTA 0x0408 1098 | #define USB_DEVICE_ID_QUANTA_OPTICAL_TOUCH 0x3000 1099 | #define USB_DEVICE_ID_QUANTA_OPTICAL_TOUCH_3001 0x3001 1100 | #define USB_DEVICE_ID_QUANTA_OPTICAL_TOUCH_3003 0x3003 1101 | #define USB_DEVICE_ID_QUANTA_OPTICAL_TOUCH_3008 0x3008 1102 | 1103 | #define I2C_VENDOR_ID_RAYDIUM 0x2386 1104 | #define I2C_PRODUCT_ID_RAYDIUM_4B33 0x4b33 1105 | #define I2C_PRODUCT_ID_RAYDIUM_3118 0x3118 1106 | 1107 | #define USB_VENDOR_ID_RAZER 0x1532 1108 | #define USB_DEVICE_ID_RAZER_BLACKWIDOW_ULTIMATE 0x010D 1109 | #define USB_DEVICE_ID_RAZER_BLACKWIDOW 0x010e 1110 | #define USB_DEVICE_ID_RAZER_BLACKWIDOW_CLASSIC 0x011b 1111 | #define USB_DEVICE_ID_RAZER_BLADE_14 0x011D 1112 | 1113 | #define USB_VENDOR_ID_REALTEK 0x0bda 1114 | #define USB_DEVICE_ID_REALTEK_READER 0x0152 1115 | 1116 | #define USB_VENDOR_ID_REDOCTANE 0x1430 1117 | #define USB_DEVICE_ID_REDOCTANE_GUITAR_DONGLE 0x474c 1118 | #define USB_DEVICE_ID_REDOCTANE_PS4_GHLIVE_DONGLE 0x07bb 1119 | 1120 | #define USB_VENDOR_ID_RETROUSB 0xf000 1121 | #define USB_DEVICE_ID_RETROUSB_SNES_RETROPAD 0x0003 1122 | #define USB_DEVICE_ID_RETROUSB_SNES_RETROPORT 0x00f1 1123 | 1124 | #define USB_VENDOR_ID_ROCCAT 0x1e7d 1125 | #define USB_DEVICE_ID_ROCCAT_ARVO 0x30d4 1126 | #define USB_DEVICE_ID_ROCCAT_ISKU 0x319c 1127 | #define USB_DEVICE_ID_ROCCAT_ISKUFX 0x3264 1128 | #define USB_DEVICE_ID_ROCCAT_KONE 0x2ced 1129 | #define USB_DEVICE_ID_ROCCAT_KONEPLUS 0x2d51 1130 | #define USB_DEVICE_ID_ROCCAT_KONEPURE 0x2dbe 1131 | #define USB_DEVICE_ID_ROCCAT_KONEPURE_OPTICAL 0x2db4 1132 | #define USB_DEVICE_ID_ROCCAT_KONEXTD 0x2e22 1133 | #define USB_DEVICE_ID_ROCCAT_KOVAPLUS 0x2d50 1134 | #define USB_DEVICE_ID_ROCCAT_LUA 0x2c2e 1135 | #define USB_DEVICE_ID_ROCCAT_PYRA_WIRED 0x2c24 1136 | #define USB_DEVICE_ID_ROCCAT_PYRA_WIRELESS 0x2cf6 1137 | #define USB_DEVICE_ID_ROCCAT_RYOS_MK 0x3138 1138 | #define USB_DEVICE_ID_ROCCAT_RYOS_MK_GLOW 0x31ce 1139 | #define USB_DEVICE_ID_ROCCAT_RYOS_MK_PRO 0x3232 1140 | #define USB_DEVICE_ID_ROCCAT_SAVU 0x2d5a 1141 | 1142 | #define USB_VENDOR_ID_SAI 0x17dd 1143 | 1144 | #define USB_VENDOR_ID_SAITEK 0x06a3 1145 | #define USB_DEVICE_ID_SAITEK_RUMBLEPAD 0xff17 1146 | #define USB_DEVICE_ID_SAITEK_PS1000 0x0621 1147 | #define USB_DEVICE_ID_SAITEK_RAT7_OLD 0x0ccb 1148 | #define USB_DEVICE_ID_SAITEK_RAT7_CONTAGION 0x0ccd 1149 | #define USB_DEVICE_ID_SAITEK_RAT7 0x0cd7 1150 | #define USB_DEVICE_ID_SAITEK_RAT9 0x0cfa 1151 | #define USB_DEVICE_ID_SAITEK_MMO7 0x0cd0 1152 | #define USB_DEVICE_ID_SAITEK_X52 0x075c 1153 | #define USB_DEVICE_ID_SAITEK_X52_2 0x0255 1154 | #define USB_DEVICE_ID_SAITEK_X52_PRO 0x0762 1155 | #define USB_DEVICE_ID_SAITEK_X65 0x0b6a 1156 | 1157 | #define USB_VENDOR_ID_SAMSUNG 0x0419 1158 | #define USB_VENDOR_ID_SAMSUNG_ELECTRONICS 0x04e8 1159 | #define USB_DEVICE_ID_SAMSUNG_IR_REMOTE 0x0001 1160 | #define USB_DEVICE_ID_SAMSUNG_WIRELESS_KBD_MOUSE 0x0600 1161 | #define USB_DEVICE_ID_SAMSUNG_WIRELESS_KBD 0x7021 1162 | #define USB_DEVICE_ID_SAMSUNG_WIRELESS_GAMEPAD 0xa000 1163 | #define USB_DEVICE_ID_SAMSUNG_WIRELESS_ACTIONMOUSE 0xa004 1164 | #define USB_DEVICE_ID_SAMSUNG_WIRELESS_BOOKCOVER 0xa005 1165 | #define USB_DEVICE_ID_SAMSUNG_WIRELESS_UNIVERSAL_KBD 0xa006 1166 | #define USB_DEVICE_ID_SAMSUNG_WIRELESS_MULTI_HOGP_KBD 0xa064 1167 | 1168 | #define USB_VENDOR_ID_SEMICO 0x1a2c 1169 | #define USB_DEVICE_ID_SEMICO_USB_KEYKOARD 0x0023 1170 | #define USB_DEVICE_ID_SEMICO_USB_KEYKOARD2 0x0027 1171 | 1172 | #define USB_VENDOR_ID_SEMITEK 0x1ea7 1173 | #define USB_DEVICE_ID_SEMITEK_KEYBOARD 0x0907 1174 | 1175 | #define USB_VENDOR_ID_SENNHEISER 0x1395 1176 | #define USB_DEVICE_ID_SENNHEISER_BTD500USB 0x002c 1177 | 1178 | #define USB_VENDOR_ID_SIGMA_MICRO 0x1c4f 1179 | #define USB_DEVICE_ID_SIGMA_MICRO_KEYBOARD 0x0002 1180 | #define USB_DEVICE_ID_SIGMA_MICRO_KEYBOARD2 0x0059 1181 | 1182 | #define USB_VENDOR_ID_SIGMATEL 0x066F 1183 | #define USB_DEVICE_ID_SIGMATEL_STMP3780 0x3780 1184 | 1185 | #define USB_VENDOR_ID_SINOWEALTH 0x258a 1186 | #define USB_DEVICE_ID_GLORIOUS_MODEL_D 0x0033 1187 | #define USB_DEVICE_ID_GLORIOUS_MODEL_O 0x0036 1188 | 1189 | #define USB_VENDOR_ID_SIS_TOUCH 0x0457 1190 | #define USB_DEVICE_ID_SIS9200_TOUCH 0x9200 1191 | #define USB_DEVICE_ID_SIS817_TOUCH 0x0817 1192 | #define USB_DEVICE_ID_SIS_TS 0x1013 1193 | #define USB_DEVICE_ID_SIS1030_TOUCH 0x1030 1194 | 1195 | #define USB_VENDOR_ID_SKYCABLE 0x1223 1196 | #define USB_DEVICE_ID_SKYCABLE_WIRELESS_PRESENTER 0x3F07 1197 | 1198 | #define USB_VENDOR_ID_SMK 0x0609 1199 | #define USB_DEVICE_ID_SMK_PS3_BDREMOTE 0x0306 1200 | #define USB_DEVICE_ID_SMK_NSG_MR5U_REMOTE 0x0368 1201 | #define USB_DEVICE_ID_SMK_NSG_MR7U_REMOTE 0x0369 1202 | 1203 | 1204 | #define USB_VENDOR_ID_SONY 0x054c 1205 | #define USB_DEVICE_ID_SONY_VAIO_VGX_MOUSE 0x024b 1206 | #define USB_DEVICE_ID_SONY_VAIO_VGP_MOUSE 0x0374 1207 | #define USB_DEVICE_ID_SONY_PS3_BDREMOTE 0x0306 1208 | #define USB_DEVICE_ID_SONY_PS3_CONTROLLER 0x0268 1209 | #define USB_DEVICE_ID_SONY_PS4_CONTROLLER 0x05c4 1210 | #define USB_DEVICE_ID_SONY_PS4_CONTROLLER_2 0x09cc 1211 | #define USB_DEVICE_ID_SONY_PS4_CONTROLLER_DONGLE 0x0ba0 1212 | #define USB_DEVICE_ID_SONY_PS5_CONTROLLER 0x0ce6 1213 | #define USB_DEVICE_ID_SONY_PS5_CONTROLLER_2 0x0df2 1214 | #define USB_DEVICE_ID_SONY_MOTION_CONTROLLER 0x03d5 1215 | #define USB_DEVICE_ID_SONY_NAVIGATION_CONTROLLER 0x042f 1216 | #define USB_DEVICE_ID_SONY_BUZZ_CONTROLLER 0x0002 1217 | #define USB_DEVICE_ID_SONY_WIRELESS_BUZZ_CONTROLLER 0x1000 1218 | 1219 | #define USB_VENDOR_ID_SONY_RHYTHM 0x12ba 1220 | #define USB_DEVICE_ID_SONY_PS3WIIU_GHLIVE_DONGLE 0x074b 1221 | #define USB_DEVICE_ID_SONY_PS3_GUITAR_DONGLE 0x0100 1222 | 1223 | #define USB_VENDOR_ID_SINO_LITE 0x1345 1224 | #define USB_DEVICE_ID_SINO_LITE_CONTROLLER 0x3008 1225 | 1226 | #define USB_VENDOR_ID_SOLID_YEAR 0x060b 1227 | #define USB_DEVICE_ID_MACALLY_IKEY_KEYBOARD 0x0001 1228 | #define USB_DEVICE_ID_COUGAR_500K_GAMING_KEYBOARD 0x500a 1229 | #define USB_DEVICE_ID_COUGAR_700K_GAMING_KEYBOARD 0x700a 1230 | 1231 | #define USB_VENDOR_ID_SOUNDGRAPH 0x15c2 1232 | #define USB_DEVICE_ID_SOUNDGRAPH_IMON_FIRST 0x0034 1233 | #define USB_DEVICE_ID_SOUNDGRAPH_IMON_LAST 0x0046 1234 | 1235 | #define USB_VENDOR_ID_STANTUM 0x1f87 1236 | #define USB_DEVICE_ID_MTP 0x0002 1237 | 1238 | #define USB_VENDOR_ID_STANTUM_STM 0x0483 1239 | #define USB_DEVICE_ID_MTP_STM 0x3261 1240 | 1241 | #define USB_VENDOR_ID_STANTUM_SITRONIX 0x1403 1242 | #define USB_DEVICE_ID_MTP_SITRONIX 0x5001 1243 | 1244 | #define USB_VENDOR_ID_VALVE 0x28de 1245 | #define USB_DEVICE_ID_STEAM_CONTROLLER 0x1102 1246 | #define USB_DEVICE_ID_STEAM_CONTROLLER_WIRELESS 0x1142 1247 | #define USB_DEVICE_ID_STEAM_DECK 0x1205 1248 | 1249 | #define USB_VENDOR_ID_STEELSERIES 0x1038 1250 | #define USB_DEVICE_ID_STEELSERIES_SRWS1 0x1410 1251 | 1252 | #define USB_VENDOR_ID_SUN 0x0430 1253 | #define USB_DEVICE_ID_RARITAN_KVM_DONGLE 0xcdab 1254 | 1255 | #define USB_VENDOR_ID_SUNPLUS 0x04fc 1256 | #define USB_DEVICE_ID_SUNPLUS_WDESKTOP 0x05d8 1257 | 1258 | #define USB_VENDOR_ID_SYMBOL 0x05e0 1259 | #define USB_DEVICE_ID_SYMBOL_SCANNER_1 0x0800 1260 | #define USB_DEVICE_ID_SYMBOL_SCANNER_2 0x1300 1261 | #define USB_DEVICE_ID_SYMBOL_SCANNER_3 0x1200 1262 | 1263 | #define I2C_VENDOR_ID_SYNAPTICS 0x06cb 1264 | #define I2C_PRODUCT_ID_SYNAPTICS_SYNA2393 0x7a13 1265 | 1266 | #define USB_VENDOR_ID_SYNAPTICS 0x06cb 1267 | #define USB_DEVICE_ID_SYNAPTICS_TP 0x0001 1268 | #define USB_DEVICE_ID_SYNAPTICS_INT_TP 0x0002 1269 | #define USB_DEVICE_ID_SYNAPTICS_CPAD 0x0003 1270 | #define USB_DEVICE_ID_SYNAPTICS_TS 0x0006 1271 | #define USB_DEVICE_ID_SYNAPTICS_STICK 0x0007 1272 | #define USB_DEVICE_ID_SYNAPTICS_WP 0x0008 1273 | #define USB_DEVICE_ID_SYNAPTICS_COMP_TP 0x0009 1274 | #define USB_DEVICE_ID_SYNAPTICS_WTP 0x0010 1275 | #define USB_DEVICE_ID_SYNAPTICS_DPAD 0x0013 1276 | #define USB_DEVICE_ID_SYNAPTICS_LTS1 0x0af8 1277 | #define USB_DEVICE_ID_SYNAPTICS_LTS2 0x1d10 1278 | #define USB_DEVICE_ID_SYNAPTICS_HD 0x0ac3 1279 | #define USB_DEVICE_ID_SYNAPTICS_QUAD_HD 0x1ac3 1280 | #define USB_DEVICE_ID_SYNAPTICS_DELL_K12A 0x2819 1281 | #define USB_DEVICE_ID_SYNAPTICS_ACER_SWITCH5_012 0x2968 1282 | #define USB_DEVICE_ID_SYNAPTICS_TP_V103 0x5710 1283 | #define USB_DEVICE_ID_SYNAPTICS_DELL_K15A 0x6e21 1284 | #define USB_DEVICE_ID_SYNAPTICS_ACER_ONE_S1002 0x73f4 1285 | #define USB_DEVICE_ID_SYNAPTICS_ACER_ONE_S1003 0x73f5 1286 | #define USB_DEVICE_ID_SYNAPTICS_ACER_SWITCH5_017 0x73f6 1287 | #define USB_DEVICE_ID_SYNAPTICS_ACER_SWITCH5 0x81a7 1288 | 1289 | #define USB_VENDOR_ID_TEXAS_INSTRUMENTS 0x2047 1290 | #define USB_DEVICE_ID_TEXAS_INSTRUMENTS_LENOVO_YOGA 0x0855 1291 | 1292 | #define USB_VENDOR_ID_THINGM 0x27b8 1293 | #define USB_DEVICE_ID_BLINK1 0x01ed 1294 | 1295 | #define USB_VENDOR_ID_THQ 0x20d6 1296 | #define USB_DEVICE_ID_THQ_PS3_UDRAW 0xcb17 1297 | 1298 | #define USB_VENDOR_ID_THRUSTMASTER 0x044f 1299 | 1300 | #define USB_VENDOR_ID_TIVO 0x150a 1301 | #define USB_DEVICE_ID_TIVO_SLIDE_BT 0x1200 1302 | #define USB_DEVICE_ID_TIVO_SLIDE 0x1201 1303 | #define USB_DEVICE_ID_TIVO_SLIDE_PRO 0x1203 1304 | 1305 | #define USB_VENDOR_ID_TOPRE 0x0853 1306 | #define USB_DEVICE_ID_TOPRE_REALFORCE_R2_108 0x0148 1307 | #define USB_DEVICE_ID_TOPRE_REALFORCE_R2_87 0x0146 1308 | 1309 | #define USB_VENDOR_ID_TOPSEED 0x0766 1310 | #define USB_DEVICE_ID_TOPSEED_CYBERLINK 0x0204 1311 | 1312 | #define USB_VENDOR_ID_TOPSEED2 0x1784 1313 | #define USB_DEVICE_ID_TOPSEED2_RF_COMBO 0x0004 1314 | #define USB_DEVICE_ID_TOPSEED2_PERIPAD_701 0x0016 1315 | 1316 | #define USB_VENDOR_ID_TOPMAX 0x0663 1317 | #define USB_DEVICE_ID_TOPMAX_COBRAPAD 0x0103 1318 | 1319 | #define USB_VENDOR_ID_TOUCH_INTL 0x1e5e 1320 | #define USB_DEVICE_ID_TOUCH_INTL_MULTI_TOUCH 0x0313 1321 | 1322 | #define USB_VENDOR_ID_TOUCHPACK 0x1bfd 1323 | #define USB_DEVICE_ID_TOUCHPACK_RTS 0x1688 1324 | 1325 | #define USB_VENDOR_ID_TPV 0x25aa 1326 | #define USB_DEVICE_ID_TPV_OPTICAL_TOUCHSCREEN_8882 0x8882 1327 | #define USB_DEVICE_ID_TPV_OPTICAL_TOUCHSCREEN_8883 0x8883 1328 | 1329 | #define USB_VENDOR_ID_TRUST 0x145f 1330 | #define USB_DEVICE_ID_TRUST_PANORA_TABLET 0x0212 1331 | 1332 | #define USB_VENDOR_ID_TURBOX 0x062a 1333 | #define USB_DEVICE_ID_TURBOX_KEYBOARD 0x0201 1334 | #define USB_DEVICE_ID_ASUS_MD_5110 0x5110 1335 | #define USB_DEVICE_ID_TURBOX_TOUCHSCREEN_MOSART 0x7100 1336 | 1337 | #define USB_VENDOR_ID_TWINHAN 0x6253 1338 | #define USB_DEVICE_ID_TWINHAN_IR_REMOTE 0x0100 1339 | 1340 | #define USB_VENDOR_ID_UCLOGIC 0x5543 1341 | #define USB_DEVICE_ID_UCLOGIC_TABLET_PF1209 0x0042 1342 | #define USB_DEVICE_ID_UCLOGIC_TABLET_KNA5 0x6001 1343 | #define USB_DEVICE_ID_UCLOGIC_TABLET_TWA60 0x0064 1344 | #define USB_DEVICE_ID_UCLOGIC_TABLET_WP4030U 0x0003 1345 | #define USB_DEVICE_ID_UCLOGIC_TABLET_WP5540U 0x0004 1346 | #define USB_DEVICE_ID_UCLOGIC_TABLET_WP8060U 0x0005 1347 | #define USB_DEVICE_ID_UCLOGIC_TABLET_WP1062 0x0064 1348 | #define USB_DEVICE_ID_UCLOGIC_WIRELESS_TABLET_TWHL850 0x0522 1349 | #define USB_DEVICE_ID_UCLOGIC_TABLET_TWHA60 0x0781 1350 | #define USB_DEVICE_ID_UCLOGIC_DRAWIMAGE_G3 0x3031 1351 | #define USB_DEVICE_ID_UCLOGIC_UGEE_TABLET_81 0x0081 1352 | #define USB_DEVICE_ID_UCLOGIC_UGEE_TABLET_45 0x0045 1353 | #define USB_DEVICE_ID_UCLOGIC_UGEE_TABLET_47 0x0047 1354 | #define USB_DEVICE_ID_YIYNOVA_TABLET 0x004d 1355 | 1356 | #define USB_VENDOR_ID_UGEE 0x28bd 1357 | #define USB_DEVICE_ID_UGEE_PARBLO_A610_PRO 0x1903 1358 | #define USB_DEVICE_ID_UGEE_XPPEN_TABLET_G540 0x0075 1359 | #define USB_DEVICE_ID_UGEE_XPPEN_TABLET_G640 0x0094 1360 | #define USB_DEVICE_ID_UGEE_XPPEN_TABLET_DECO01 0x0042 1361 | #define USB_DEVICE_ID_UGEE_XPPEN_TABLET_DECO01_V2 0x0905 1362 | #define USB_DEVICE_ID_UGEE_XPPEN_TABLET_DECO_L 0x0935 1363 | #define USB_DEVICE_ID_UGEE_XPPEN_TABLET_DECO_PRO_MW 0x0934 1364 | #define USB_DEVICE_ID_UGEE_XPPEN_TABLET_DECO_PRO_S 0x0909 1365 | #define USB_DEVICE_ID_UGEE_XPPEN_TABLET_DECO_PRO_SW 0x0933 1366 | #define USB_DEVICE_ID_UGEE_XPPEN_TABLET_STAR06 0x0078 1367 | #define USB_DEVICE_ID_UGEE_TABLET_G5 0x0074 1368 | #define USB_DEVICE_ID_UGEE_TABLET_EX07S 0x0071 1369 | #define USB_DEVICE_ID_UGEE_TABLET_RAINBOW_CV720 0x0055 1370 | 1371 | #define USB_VENDOR_ID_UNITEC 0x227d 1372 | #define USB_DEVICE_ID_UNITEC_USB_TOUCH_0709 0x0709 1373 | #define USB_DEVICE_ID_UNITEC_USB_TOUCH_0A19 0x0a19 1374 | 1375 | #define USB_VENDOR_ID_VELLEMAN 0x10cf 1376 | #define USB_DEVICE_ID_VELLEMAN_K8055_FIRST 0x5500 1377 | #define USB_DEVICE_ID_VELLEMAN_K8055_LAST 0x5503 1378 | #define USB_DEVICE_ID_VELLEMAN_K8061_FIRST 0x8061 1379 | #define USB_DEVICE_ID_VELLEMAN_K8061_LAST 0x8068 1380 | 1381 | #define USB_VENDOR_ID_VTL 0x0306 1382 | #define USB_DEVICE_ID_VTL_MULTITOUCH_FF3F 0xff3f 1383 | 1384 | #define USB_VENDOR_ID_WACOM 0x056a 1385 | #define USB_DEVICE_ID_WACOM_GRAPHIRE_BLUETOOTH 0x81 1386 | #define USB_DEVICE_ID_WACOM_INTUOS4_BLUETOOTH 0x00BD 1387 | 1388 | #define USB_VENDOR_ID_WALTOP 0x172f 1389 | #define USB_DEVICE_ID_WALTOP_SLIM_TABLET_5_8_INCH 0x0032 1390 | #define USB_DEVICE_ID_WALTOP_SLIM_TABLET_12_1_INCH 0x0034 1391 | #define USB_DEVICE_ID_WALTOP_Q_PAD 0x0037 1392 | #define USB_DEVICE_ID_WALTOP_PID_0038 0x0038 1393 | #define USB_DEVICE_ID_WALTOP_MEDIA_TABLET_10_6_INCH 0x0501 1394 | #define USB_DEVICE_ID_WALTOP_MEDIA_TABLET_14_1_INCH 0x0500 1395 | #define USB_DEVICE_ID_WALTOP_SIRIUS_BATTERY_FREE_TABLET 0x0502 1396 | 1397 | #define USB_VENDOR_ID_WEIDA 0x2575 1398 | #define USB_DEVICE_ID_WEIDA_8752 0xC300 1399 | #define USB_DEVICE_ID_WEIDA_8755 0xC301 1400 | 1401 | #define USB_VENDOR_ID_WINBOND 0x0416 1402 | #define USB_DEVICE_ID_TSTP_MTOUCH 0xc168 1403 | 1404 | #define USB_VENDOR_ID_WISEGROUP 0x0925 1405 | #define USB_DEVICE_ID_SMARTJOY_PLUS 0x0005 1406 | #define USB_DEVICE_ID_SUPER_JOY_BOX_3 0x8888 1407 | #define USB_DEVICE_ID_QUAD_USB_JOYPAD 0x8800 1408 | #define USB_DEVICE_ID_DUAL_USB_JOYPAD 0x8866 1409 | 1410 | #define USB_VENDOR_ID_WISEGROUP_LTD 0x6666 1411 | #define USB_VENDOR_ID_WISEGROUP_LTD2 0x6677 1412 | #define USB_DEVICE_ID_SMARTJOY_DUAL_PLUS 0x8802 1413 | #define USB_DEVICE_ID_SUPER_JOY_BOX_3_PRO 0x8801 1414 | #define USB_DEVICE_ID_SUPER_DUAL_BOX_PRO 0x8802 1415 | #define USB_DEVICE_ID_SUPER_JOY_BOX_5_PRO 0x8804 1416 | 1417 | #define USB_VENDOR_ID_WISTRON 0x0fb8 1418 | #define USB_DEVICE_ID_WISTRON_OPTICAL_TOUCH 0x1109 1419 | 1420 | #define USB_VENDOR_ID_X_TENSIONS 0x1ae7 1421 | #define USB_DEVICE_ID_SPEEDLINK_VAD_CEZANNE 0x9001 1422 | 1423 | #define USB_VENDOR_ID_XAT 0x2505 1424 | #define USB_DEVICE_ID_XAT_CSR 0x0220 1425 | 1426 | #define USB_VENDOR_ID_XIAOMI 0x2717 1427 | #define USB_DEVICE_ID_MI_SILENT_MOUSE 0x5014 1428 | 1429 | #define USB_VENDOR_ID_XIN_MO 0x16c0 1430 | #define USB_DEVICE_ID_XIN_MO_DUAL_ARCADE 0x05e1 1431 | #define USB_DEVICE_ID_THT_2P_ARCADE 0x75e1 1432 | 1433 | #define USB_VENDOR_ID_XIROKU 0x1477 1434 | #define USB_DEVICE_ID_XIROKU_SPX 0x1006 1435 | #define USB_DEVICE_ID_XIROKU_MPX 0x1007 1436 | #define USB_DEVICE_ID_XIROKU_CSR 0x100e 1437 | #define USB_DEVICE_ID_XIROKU_SPX1 0x1021 1438 | #define USB_DEVICE_ID_XIROKU_CSR1 0x1022 1439 | #define USB_DEVICE_ID_XIROKU_MPX1 0x1023 1440 | #define USB_DEVICE_ID_XIROKU_SPX2 0x1024 1441 | #define USB_DEVICE_ID_XIROKU_CSR2 0x1025 1442 | #define USB_DEVICE_ID_XIROKU_MPX2 0x1026 1443 | 1444 | #define USB_VENDOR_ID_YEALINK 0x6993 1445 | #define USB_DEVICE_ID_YEALINK_P1K_P4K_B2K 0xb001 1446 | 1447 | #define USB_VENDOR_ID_ZEROPLUS 0x0c12 1448 | 1449 | #define USB_VENDOR_ID_ZYDACRON 0x13EC 1450 | #define USB_DEVICE_ID_ZYDACRON_REMOTE_CONTROL 0x0006 1451 | 1452 | #define USB_VENDOR_ID_ZYTRONIC 0x14c8 1453 | #define USB_DEVICE_ID_ZYTRONIC_ZXY100 0x0005 1454 | 1455 | #define USB_VENDOR_ID_PRIMAX 0x0461 1456 | #define USB_DEVICE_ID_PRIMAX_MOUSE_4D22 0x4d22 1457 | #define USB_DEVICE_ID_PRIMAX_MOUSE_4E2A 0x4e2a 1458 | #define USB_DEVICE_ID_PRIMAX_KEYBOARD 0x4e05 1459 | #define USB_DEVICE_ID_PRIMAX_REZEL 0x4e72 1460 | #define USB_DEVICE_ID_PRIMAX_PIXART_MOUSE_4D0F 0x4d0f 1461 | #define USB_DEVICE_ID_PRIMAX_PIXART_MOUSE_4D65 0x4d65 1462 | #define USB_DEVICE_ID_PRIMAX_PIXART_MOUSE_4E22 0x4e22 1463 | 1464 | 1465 | #define USB_VENDOR_ID_RISO_KAGAKU 0x1294 /* Riso Kagaku Corp. */ 1466 | #define USB_DEVICE_ID_RI_KA_WEBMAIL 0x1320 /* Webmail Notifier */ 1467 | 1468 | #define USB_VENDOR_ID_MULTIPLE_1781 0x1781 1469 | #define USB_DEVICE_ID_RAPHNET_4NES4SNES_OLD 0x0a9d 1470 | #define USB_DEVICE_ID_PHOENIXRC 0x0898 1471 | 1472 | #define USB_VENDOR_ID_DRACAL_RAPHNET 0x289b 1473 | #define USB_DEVICE_ID_RAPHNET_2NES2SNES 0x0002 1474 | #define USB_DEVICE_ID_RAPHNET_4NES4SNES 0x0003 1475 | 1476 | #define USB_VENDOR_ID_UGTIZER 0x2179 1477 | #define USB_DEVICE_ID_UGTIZER_TABLET_GP0610 0x0053 1478 | #define USB_DEVICE_ID_UGTIZER_TABLET_GT5040 0x0077 1479 | #define USB_DEVICE_ID_UGTIZER_TABLET_WP5540 0x0004 1480 | 1481 | #define USB_VENDOR_ID_VIEWSONIC 0x0543 1482 | #define USB_DEVICE_ID_VIEWSONIC_PD1011 0xe621 1483 | 1484 | #define USB_VENDOR_ID_SIGNOTEC 0x2133 1485 | #define USB_DEVICE_ID_SIGNOTEC_VIEWSONIC_PD1011 0x0018 1486 | 1487 | #endif 1488 | --------------------------------------------------------------------------------