Keyboard backlight color/uptime control by any means necessary!

Puffer Man

New Member
Joined
Jan 28, 2021
Messages
23
Reaction score
13
Credits
244
Greetings.

I own an A70 HYB Standard, produced by Avell, a brazilian Clevo re-seller. The laptop comes with a RGB membrane backlit keyboard whose properties I wish to manipulate. Quick Set-up/Arch install configuration just in case it's needed:

Hardware
  • Host: A70 HYB Standard
  • GPU: Intel Alder Lake-P
  • GPU: NVIDIA GeForce RTX 3060 Mobile / Max-Q
  • Memory: 64047MiB
  • Storage: 2 NVMe SSDs (2 TB each)
  • Resolution: 2560x1440

Arch Installation
  • Boot-loader: GRUB
  • OS: Arch Linux x86_64
  • Kernel: 6.1.21-1-lts
  • WM: kwin
  • DE: Plasma 5.27.3
  • Wayland

Default Keyboard behavior
When booting the keyboard changes colors quickly, once GDM pops up a blue color prevails until the machine is turned off. The keyboard's back-light stays on for a some minutes, and after a while of inactivity its back-light intensity is dropped off until the next key is pressed. The fn keys are a hit/miss, some work some don't. The light intensity fn keys work. No configuration was made by me.

What have I tried until now:
First I attempted to get some info in regards to the physical hardware by running "hwinfo --keyboard":
Code:
36: PS/2 00.0: 10800 Keyboard                                   
  [Created at input.226]
  Unique ID: 3FDI.+49ps10DtUF
  Hardware Class: keyboard
  Model: "AT Translated Set 2 keyboard"
  Vendor: 0x0001 
  Device: 0x0001 "AT Translated Set 2 keyboard"
  Compatible to: int 0x0211 0x0001
  Device File: /dev/input/event5
  Device Files: /dev/input/event5, /dev/input/by-path/platform-i8042-serio-0-event-kbd
  Device Number: char 13:69
  Driver Info #0:
    XkbRules: xfree86
    XkbModel: pc104
  Config Status: cfg=new, avail=yes, need=no, active=unknown

As you can see the model name is "AT Translated Set 2 keyboard", which doesn't help that much in my pursuit. I tried entering in contact with the support but they tell me such info is unavailable from their end. Next I tried to gather info from /dev, "ls /dev/input/by-path/ -la":
Code:
total 0
drwxr-xr-x 2 root root 160 mar 26 15:32 .
drwxr-xr-x 4 root root 560 mar 26 15:32 ..
lrwxrwxrwx 1 root root  10 mar 26 14:13 pci-0000:00:14.0-usb-0:5:1.0-event -> ../event12
lrwxrwxrwx 1 root root  10 mar 26 14:13 pci-0000:00:15.0-platform-i2c_designware.0-event-mouse -> ../event18
lrwxrwxrwx 1 root root   9 mar 26 14:13 pci-0000:00:15.0-platform-i2c_designware.0-mouse -> ../mouse1
lrwxrwxrwx 1 root root   9 mar 26 14:13 platform-INTC1070:00-event -> ../event6
lrwxrwxrwx 1 root root   9 mar 26 14:13 platform-i8042-serio-0-event-kbd -> ../event5
lrwxrwxrwx 1 root root   9 mar 26 14:13 platform-pcspkr-event-spkr -> ../event7

At least I found out that the keyboard can't be fount in the .../by-ip/ sub directory. No luck in /sys/class/leds either:
Code:
total 0
drwxr-xr-x  2 root root 0 mar 26 14:13 .
drwxr-xr-x 80 root root 0 mar 26 14:13 ..
lrwxrwxrwx  1 root root 0 mar 26 14:13 input5::capslock -> ../../devices/platform/i8042/serio0/input/input5/input5::capslock
lrwxrwxrwx  1 root root 0 mar 26 14:13 input5::numlock -> ../../devices/platform/i8042/serio0/input/input5/input5::numlock
lrwxrwxrwx  1 root root 0 mar 26 14:13 input5::scrolllock -> ../../devices/platform/i8042/serio0/input/input5/input5::scrolllock
lrwxrwxrwx  1 root root 0 mar 26 15:26 phy0-led -> ../../devices/pci0000:00/0000:00:14.3/leds/phy0-led

By the way I see no num-lock led, nor scrolllock LEDs. In total I see 7 major LEDs zones in the laptop: the touch pad; the keyboard itself, power button, caps lock indicator, charging LED, webcam and a "fan speed" button that has no use nor response under "xev" under Linux.
After some digging and trying every back-light related package from the AUR and official repositories I gave up for some time; that was until I found out that the laptop has a proprietary Windows software to tweak the keyboard properties.
With that info in mind and knowing that I couldn't find any reverse engineered project on Git-Hub for this model in specific, I decided to make a QEMU/KVM W11 guest machine in order to attempt to install it.

The QEMU/VM set-up:
XML:
Code:
<domain type="kvm">
  <name>win11</name>
  <uuid>9f5a7587-be64-4f1c-9e71-8889c6542b0e</uuid>
  <metadata>
    <libosinfo:libosinfo xmlns:libosinfo="http://libosinfo.org/xmlns/libvirt/domain/1.0">
      <libosinfo:os id="http://microsoft.com/win/11"/>
    </libosinfo:libosinfo>
  </metadata>
  <memory unit="KiB">32768000</memory>
  <currentMemory unit="KiB">32768000</currentMemory>
  <vcpu placement="static">18</vcpu>
  <os>
    <type arch="x86_64" machine="pc-q35-7.2">hvm</type>
    <loader readonly="yes" secure="yes" type="pflash">/usr/share/edk2/x64/OVMF_CODE.secboot.4m.fd</loader>
    <nvram>/var/lib/libvirt/qemu/nvram/win11_VARS.fd</nvram>
    <bootmenu enable="yes"/>
  </os>
  <features>
    <acpi/>
    <apic/>
    <hyperv mode="custom">
      <relaxed state="on"/>
      <vapic state="on"/>
      <spinlocks state="on" retries="8191"/>
    </hyperv>
    <vmport state="off"/>
    <smm state="on"/>
  </features>
  <cpu mode="host-passthrough" check="none" migratable="on">
    <topology sockets="1" dies="1" cores="9" threads="2"/>
  </cpu>
  <clock offset="localtime">
    <timer name="rtc" tickpolicy="catchup"/>
    <timer name="pit" tickpolicy="delay"/>
    <timer name="hpet" present="no"/>
    <timer name="hypervclock" present="yes"/>
  </clock>
  <on_poweroff>destroy</on_poweroff>
  <on_reboot>restart</on_reboot>
  <on_crash>destroy</on_crash>
  <pm>
    <suspend-to-mem enabled="no"/>
    <suspend-to-disk enabled="no"/>
  </pm>
  <devices>
    <emulator>/usr/bin/qemu-system-x86_64</emulator>
    <disk type="file" device="disk">
      <driver name="qemu" type="qcow2"/>
      <source file="/home/puffer/virtualization/W11Storage/win11.snapshot1"/>
      <backingStore type="file">
        <format type="qcow2"/>
        <source file="/home/puffer/virtualization/W11Storage/win11.qcow2"/>
      </backingStore>
      <target dev="sda" bus="sata"/>
      <boot order="1"/>
      <address type="drive" controller="0" bus="0" target="0" unit="0"/>
    </disk>
    <disk type="file" device="cdrom">
      <driver name="qemu" type="raw"/>
      <source file="/home/puffer/Downloads/ISOS/Win11_22H2_English_x64v1.iso"/>
      <target dev="sdb" bus="sata"/>
      <readonly/>
      <address type="drive" controller="0" bus="0" target="0" unit="1"/>
    </disk>
    <disk type="file" device="cdrom">
      <driver name="qemu" type="raw"/>
      <source file="/var/lib/libvirt/images/virtio-win.iso"/>
      <target dev="sdd" bus="sata"/>
      <readonly/>
      <boot order="2"/>
      <address type="drive" controller="0" bus="0" target="0" unit="3"/>
    </disk>
    <controller type="usb" index="0" model="qemu-xhci" ports="15">
      <address type="pci" domain="0x0000" bus="0x02" slot="0x00" function="0x0"/>
    </controller>
    <controller type="pci" index="0" model="pcie-root"/>
    <controller type="pci" index="1" model="pcie-root-port">
      <model name="pcie-root-port"/>
      <target chassis="1" port="0x10"/>
      <address type="pci" domain="0x0000" bus="0x00" slot="0x02" function="0x0" multifunction="on"/>
    </controller>
    <controller type="pci" index="2" model="pcie-root-port">
      <model name="pcie-root-port"/>
      <target chassis="2" port="0x11"/>
      <address type="pci" domain="0x0000" bus="0x00" slot="0x02" function="0x1"/>
    </controller>
    <controller type="pci" index="3" model="pcie-root-port">
      <model name="pcie-root-port"/>
      <target chassis="3" port="0x12"/>
      <address type="pci" domain="0x0000" bus="0x00" slot="0x02" function="0x2"/>
    </controller>
    <controller type="pci" index="4" model="pcie-root-port">
      <model name="pcie-root-port"/>
      <target chassis="4" port="0x13"/>
      <address type="pci" domain="0x0000" bus="0x00" slot="0x02" function="0x3"/>
    </controller>
    <controller type="pci" index="5" model="pcie-root-port">
      <model name="pcie-root-port"/>
      <target chassis="5" port="0x14"/>
      <address type="pci" domain="0x0000" bus="0x00" slot="0x02" function="0x4"/>
    </controller>
    <controller type="pci" index="6" model="pcie-root-port">
      <model name="pcie-root-port"/>
      <target chassis="6" port="0x15"/>
      <address type="pci" domain="0x0000" bus="0x00" slot="0x02" function="0x5"/>
    </controller>
    <controller type="pci" index="7" model="pcie-root-port">
      <model name="pcie-root-port"/>
      <target chassis="7" port="0x16"/>
      <address type="pci" domain="0x0000" bus="0x00" slot="0x02" function="0x6"/>
    </controller>
    <controller type="pci" index="8" model="pcie-root-port">
      <model name="pcie-root-port"/>
      <target chassis="8" port="0x17"/>
      <address type="pci" domain="0x0000" bus="0x00" slot="0x02" function="0x7"/>
    </controller>
    <controller type="pci" index="9" model="pcie-root-port">
      <model name="pcie-root-port"/>
      <target chassis="9" port="0x18"/>
      <address type="pci" domain="0x0000" bus="0x00" slot="0x03" function="0x0" multifunction="on"/>
    </controller>
    <controller type="pci" index="10" model="pcie-root-port">
      <model name="pcie-root-port"/>
      <target chassis="10" port="0x19"/>
      <address type="pci" domain="0x0000" bus="0x00" slot="0x03" function="0x1"/>
    </controller>
    <controller type="pci" index="11" model="pcie-root-port">
      <model name="pcie-root-port"/>
      <target chassis="11" port="0x1a"/>
      <address type="pci" domain="0x0000" bus="0x00" slot="0x03" function="0x2"/>
    </controller>
    <controller type="pci" index="12" model="pcie-root-port">
      <model name="pcie-root-port"/>
      <target chassis="12" port="0x1b"/>
      <address type="pci" domain="0x0000" bus="0x00" slot="0x03" function="0x3"/>
    </controller>
    <controller type="pci" index="13" model="pcie-root-port">
      <model name="pcie-root-port"/>
      <target chassis="13" port="0x1c"/>
      <address type="pci" domain="0x0000" bus="0x00" slot="0x03" function="0x4"/>
    </controller>
    <controller type="pci" index="14" model="pcie-root-port">
      <model name="pcie-root-port"/>
      <target chassis="14" port="0x1d"/>
      <address type="pci" domain="0x0000" bus="0x00" slot="0x03" function="0x5"/>
    </controller>
    <controller type="sata" index="0">
      <address type="pci" domain="0x0000" bus="0x00" slot="0x1f" function="0x2"/>
    </controller>
    <controller type="virtio-serial" index="0">
      <address type="pci" domain="0x0000" bus="0x03" slot="0x00" function="0x0"/>
    </controller>
    <interface type="network">
      <mac address="52:54:00:a1:c8:a5"/>
      <source network="default"/>
      <model type="virtio"/>
      <link state="up"/>
      <address type="pci" domain="0x0000" bus="0x01" slot="0x00" function="0x0"/>
    </interface>
    <serial type="pty">
      <target type="isa-serial" port="0">
        <model name="isa-serial"/>
      </target>
    </serial>
    <console type="pty">
      <target type="serial" port="0"/>
    </console>
    <channel type="spicevmc">
      <target type="virtio" name="com.redhat.spice.0"/>
      <address type="virtio-serial" controller="0" bus="0" port="1"/>
    </channel>
    <input type="evdev">
      <source dev="/dev/input/by-path/pci-0000:00:14.0-usb-0:5:1.0-event"/>
    </input>
    <input type="evdev">
      <source dev="/dev/input/by-path/platform-i8042-serio-0-event-kbd" grab="all" grabToggle="ctrl-ctrl" repeat="on"/>
    </input>
    <input type="mouse" bus="virtio">
      <address type="pci" domain="0x0000" bus="0x07" slot="0x00" function="0x0"/>
    </input>
    <input type="keyboard" bus="virtio">
      <address type="pci" domain="0x0000" bus="0x08" slot="0x00" function="0x0"/>
    </input>
    <input type="mouse" bus="ps2"/>
    <input type="keyboard" bus="ps2"/>
    <tpm model="tpm-crb">
      <backend type="emulator" version="2.0"/>
    </tpm>
    <graphics type="spice" port="-1" autoport="no">
      <listen type="address"/>
      <image compression="off"/>
      <gl enable="no"/>
    </graphics>
    <sound model="ich9">
      <address type="pci" domain="0x0000" bus="0x00" slot="0x1b" function="0x0"/>
    </sound>
    <audio id="1" type="spice"/>
    <video>
      <model type="qxl" ram="65536" vram="65536" vgamem="16384" heads="1" primary="yes"/>
      <address type="pci" domain="0x0000" bus="0x00" slot="0x01" function="0x0"/>
    </video>
    <hostdev mode="subsystem" type="pci" managed="yes">
      <source>
        <address domain="0x0000" bus="0x01" slot="0x00" function="0x0"/>
      </source>
      <address type="pci" domain="0x0000" bus="0x05" slot="0x00" function="0x0"/>
    </hostdev>
    <hostdev mode="subsystem" type="pci" managed="yes">
      <source>
        <address domain="0x0000" bus="0x01" slot="0x00" function="0x1"/>
      </source>
      <address type="pci" domain="0x0000" bus="0x06" slot="0x00" function="0x0"/>
    </hostdev>
    <redirdev bus="usb" type="spicevmc">
      <address type="usb" bus="0" port="2"/>
    </redirdev>
    <redirdev bus="usb" type="spicevmc">
      <address type="usb" bus="0" port="3"/>
    </redirdev>
    <watchdog model="itco" action="reset"/>
    <memballoon model="virtio">
      <address type="pci" domain="0x0000" bus="0x04" slot="0x00" function="0x0"/>
    </memballoon>
  </devices>
</domain>

Based on the setup above I attempted to replicated to the best of my ability the laptop config with 32 GB of ram. I even went as far as to use the PCI Pass-through functionality, more precisely the DGPU, touch pad and keyboard.
I them proceed to install W11 on it. After installing the drivers that the re-seller itself provide I went for the management software. The first hurdle was that some sort of signature was out of date resulting in me having to set my date to last year to correctly install the software, at least I think that the software is correctly installed, I couldn't tell you how to do that in Windows through a terminal even if my life depended on it.

When looking on the "Device Manager" application it shows the same Keyboard name. Once inside the app is clear that the software had some issues since not all graphs load correctly and the only option I have to configure in regards to the keyboard is the time its back light will stay on, though it doesn't work. I also realized that the management software comes with some sorts of "Windows keys", once I opened it I could see that it had something to do with the keyboard colors. I can't remember the file extension now, but I can provide it if needed.

Is there any other thing I can try? Maybe I didn't set the vm correclty or maybe I didn't even needed a VM in the first place, any input is appreciated and I can provide further information on request, thanks in advance.
 


Maybe try these?
 
Maybe try these?
Unfortunatelly I've already tried all of the options above; maybe I've installed them wrongly, though I doubt since the guides were clear and no errors were returned (execept the keyboard matching off course). I'll try contacting the support and see if they have a "commercial" name for this keyboard.
 

Members online


Top