<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Alessandro Vezzoli</title>
    <description>The latest articles on DEV Community by Alessandro Vezzoli (@alessandrovezzoli).</description>
    <link>https://dev.to/alessandrovezzoli</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4010530%2Fe1f147a6-4d15-4d25-9367-bd275afdb61e.png</url>
      <title>DEV Community: Alessandro Vezzoli</title>
      <link>https://dev.to/alessandrovezzoli</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/alessandrovezzoli"/>
    <language>en</language>
    <item>
      <title>Full Linux support for ASUS TUF Gaming A16 (FA608WV) — keyboard backlight, brightness, hibernate, all working</title>
      <dc:creator>Alessandro Vezzoli</dc:creator>
      <pubDate>Wed, 01 Jul 2026 08:44:00 +0000</pubDate>
      <link>https://dev.to/alessandrovezzoli/full-linux-support-for-asus-tuf-gaming-a16-fa608wv-keyboard-backlight-brightness-hibernate-18n2</link>
      <guid>https://dev.to/alessandrovezzoli/full-linux-support-for-asus-tuf-gaming-a16-fa608wv-keyboard-backlight-brightness-hibernate-18n2</guid>
      <description>&lt;p&gt;If you bought an &lt;strong&gt;ASUS TUF Gaming A16 FA608WV&lt;/strong&gt; (2024/2025, Ryzen AI 9 HX + RTX 4060 Laptop) and ran Linux on it, you probably hit every single one of these walls:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Keyboard RGB backlight: completely dead — &lt;code&gt;asusctl&lt;/code&gt;, &lt;code&gt;brightnessctl&lt;/code&gt;, every command returns success and nothing lights up&lt;/li&gt;
&lt;li&gt;Screen brightness in hybrid GPU mode: writes succeed in &lt;code&gt;/sys/class/backlight/...&lt;/code&gt; but the panel doesn't dim&lt;/li&gt;
&lt;li&gt;Sleep with the lid closed: laptop overheats in the backpack because the system never actually enters S3/S4&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://dev.to/sureshsaragadam/asus-tuf-gaming-a16-fa608wv-on-linux-screen-brightness-keyboard-backlight-a-deep-dive-into-a-3c04"&gt;@sureshsaragadam wrote a deep dive on dev.to in January 2026&lt;/a&gt; concluding that everything needed a kernel patch and we just had to wait. There's &lt;a href="https://github.com/asus-linux/asusctl/issues/700" rel="noopener noreferrer"&gt;an open asusctl issue (#700)&lt;/a&gt; tracking the same problem.&lt;/p&gt;

&lt;p&gt;It turns out &lt;strong&gt;every one of these is fixable from userspace today&lt;/strong&gt;. This post documents the complete chain: how I went from "nothing works" to "everything works" on a clean Pop!_OS 24.04 install, including an upstream-quality asusctl patch and a workaround stack for the screen.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;p&gt;If you have a FA608WV, you can have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ Keyboard RGB controllable from &lt;code&gt;asusctl&lt;/code&gt;, &lt;code&gt;rog-control-center&lt;/code&gt;, and CLI scripts — color, brightness, modes&lt;/li&gt;
&lt;li&gt;✅ Screen brightness Fn keys working in hybrid GPU mode (no need for discrete-GPU mode)&lt;/li&gt;
&lt;li&gt;✅ Real S4 hibernate (swapfile-backed), &lt;code&gt;HandleLidSwitch=hibernate&lt;/code&gt;, no more backpack-overheating&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Skip to the sections that interest you.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hardware context
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Model           ASUS TUF Gaming A16 FA608WV_FA608WV
CPU/iGPU        AMD Ryzen AI 9 HX (Radeon 880M)
dGPU            NVIDIA RTX 4060 (Laptop)
Distro          Pop!_OS 24.04 LTS (single OS, no Windows dual-boot)
Kernel          7.0.11-76070011-generic
BIOS            FA608WV.309 (2025-10-01)
asusctl         6.3.8 (patched, see below)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Part 1 — Keyboard RGB backlight via HID LampArray
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The diagnosis
&lt;/h3&gt;

&lt;p&gt;The keyboard on this SKU is &lt;strong&gt;NOT&lt;/strong&gt; behind &lt;code&gt;asus-wmi&lt;/code&gt; at all. The legacy &lt;code&gt;/sys/class/leds/asus::kbd_backlight&lt;/code&gt; node exists and accepts writes, but the writes go nowhere — the actual backlight controller is an &lt;strong&gt;ITE5570&lt;/strong&gt; on the &lt;strong&gt;I2C-HID&lt;/strong&gt; bus, vendor &lt;code&gt;0B05&lt;/code&gt; product &lt;code&gt;19B6&lt;/code&gt;, speaking the &lt;strong&gt;Microsoft HID LampArray&lt;/strong&gt; standard (HID Usage Tables 1.5, Usage Page &lt;code&gt;0x59&lt;/code&gt;).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;ls&lt;/span&gt; /sys/bus/hid/devices/ | &lt;span class="nb"&gt;grep &lt;/span&gt;0B05
0018:0B05:19B6.0002       &lt;span class="c"&gt;# BUS 0018 = I2C-HID, not USB&lt;/span&gt;

&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; /sys/bus/hid/devices/0018:0B05:19B6.0002/uevent
&lt;span class="nv"&gt;DRIVER&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;hid-generic
&lt;span class="nv"&gt;HID_ID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0018:00000B05:000019B6
&lt;span class="nv"&gt;HID_NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;ITE5570:00 0B05:19B6
&lt;span class="nv"&gt;HID_PHYS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;i2c-ITE5570:00

&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;xxd /sys/bus/hid/devices/0018:0B05:19B6.0002/report_descriptor | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="s2"&gt;"05 59"&lt;/span&gt;
&lt;span class="c"&gt;# match → LampArray Usage Page present&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;asusctl 6.3.x doesn't probe for HID LampArray devices and only walks USB-side parents. So nothing reaches the chip.&lt;/p&gt;

&lt;p&gt;The LampArray protocol is well-defined:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Report ID&lt;/th&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Direction&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;0x41&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;LampArrayAttributes&lt;/td&gt;
&lt;td&gt;Feature IN&lt;/td&gt;
&lt;td&gt;LampCount, bounding box, kind, min int.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;0x44&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;LampMultiUpdate&lt;/td&gt;
&lt;td&gt;Feature OUT&lt;/td&gt;
&lt;td&gt;Update up to 8 specific lamps&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;0x45&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;LampRangeUpdate&lt;/td&gt;
&lt;td&gt;Feature OUT&lt;/td&gt;
&lt;td&gt;Update a contiguous range with one RGBI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;0x46&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;LampArrayControl&lt;/td&gt;
&lt;td&gt;Feature OUT&lt;/td&gt;
&lt;td&gt;Disable autonomous (vendor) mode&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Working sequence:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Disable autonomous mode: &lt;code&gt;HIDIOCSFEATURE&lt;/code&gt; with &lt;code&gt;[0x46, 0x00]&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Send &lt;code&gt;LampRangeUpdate&lt;/code&gt;: &lt;code&gt;[0x45, 0x01, 0x00, 0x00, lamp_count-1, R, G, B, I]&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;On the FA608WV, &lt;code&gt;LampArrayAttributes&lt;/code&gt; reports &lt;code&gt;LampCount=1&lt;/code&gt; (single-zone), &lt;code&gt;Kind=Keyboard&lt;/code&gt;, bounding box ~310×144 mm.&lt;/p&gt;

&lt;h3&gt;
  
  
  Two ways to drive it from Linux
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Option A: standalone Python script (fastest)
&lt;/h4&gt;

&lt;p&gt;Doesn't require modifying asusctl. Stand-alone, ~70 lines of stdlib Python. Works immediately.&lt;/p&gt;

&lt;p&gt;Save as &lt;code&gt;/usr/local/bin/asus-tuf-kbd-led&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;#!/usr/bin/env python3
&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;asus-tuf-kbd-led — LampArray controller for ASUS TUF A16 FA608WV (0B05:19B6).&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;fcntl&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;struct&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;glob&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pathlib&lt;/span&gt;

&lt;span class="n"&gt;VID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;PID&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mh"&gt;0x0B05&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mh"&gt;0x19B6&lt;/span&gt;
&lt;span class="n"&gt;STATE_FILE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/var/lib/asus-tuf-kbd-led/state.json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;_IOC&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nf"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;HIDIOCSFEATURE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;_IOC&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;ord&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;H&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mh"&gt;0x06&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;HIDIOCGFEATURE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;_IOC&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;ord&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;H&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mh"&gt;0x07&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;HIDIOCGRAWINFO&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;_IOC&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;ord&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;H&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mh"&gt;0x03&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;RID_ATTRS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mh"&gt;0x41&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;RID_RANGE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mh"&gt;0x45&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;RID_CTRL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mh"&gt;0x46&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;find_hidraw&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;glob&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;glob&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/dev/hidraw*&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)):&lt;/span&gt;
        &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;rb+&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;fd&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;buf&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;bytearray&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="n"&gt;fcntl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ioctl&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;HIDIOCGRAWINFO&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;buf&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="n"&gt;bus&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;struct&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;unpack&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;&amp;lt;IHH&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;bytes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;buf&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
                &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;VID&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;PID&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt;
        &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;OSError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;continue&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;

&lt;span class="c1"&gt;# ... (autonomous, range_update, state load/save, dispatch — full script in the gist link below)
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;udev rule for non-root access:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# /etc/udev/rules.d/99-asus-tuf-lamparray.rules
KERNEL=="hidraw*", SUBSYSTEM=="hidraw", KERNELS=="0018:0B05:19B6.*", \
  MODE="0660", GROUP="input", TAG+="uaccess"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;systemd services for boot and resume:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="c"&gt;# /etc/systemd/system/asus-tuf-kbd-led.service
&lt;/span&gt;&lt;span class="nn"&gt;[Unit]&lt;/span&gt;
&lt;span class="py"&gt;Description&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;ASUS TUF kbd backlight (LampArray restore at boot)&lt;/span&gt;
&lt;span class="py"&gt;After&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;multi-user.target&lt;/span&gt;

&lt;span class="nn"&gt;[Service]&lt;/span&gt;
&lt;span class="py"&gt;Type&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;oneshot&lt;/span&gt;
&lt;span class="py"&gt;ExecStartPre&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;/bin/sleep 1&lt;/span&gt;
&lt;span class="py"&gt;ExecStart&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;/usr/local/bin/asus-tuf-kbd-led restore&lt;/span&gt;
&lt;span class="py"&gt;RemainAfterExit&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;yes&lt;/span&gt;

&lt;span class="nn"&gt;[Install]&lt;/span&gt;
&lt;span class="py"&gt;WantedBy&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;multi-user.target&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="c"&gt;# /etc/systemd/system/asus-tuf-kbd-led-resume.service
&lt;/span&gt;&lt;span class="nn"&gt;[Unit]&lt;/span&gt;
&lt;span class="py"&gt;Description&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;ASUS TUF kbd backlight (LampArray restore after resume)&lt;/span&gt;
&lt;span class="py"&gt;After&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;hibernate.target suspend.target hybrid-sleep.target&lt;/span&gt;

&lt;span class="nn"&gt;[Service]&lt;/span&gt;
&lt;span class="py"&gt;Type&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;oneshot&lt;/span&gt;
&lt;span class="py"&gt;ExecStartPre&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;/bin/sleep 1&lt;/span&gt;
&lt;span class="py"&gt;ExecStart&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;/usr/local/bin/asus-tuf-kbd-led restore&lt;/span&gt;

&lt;span class="nn"&gt;[Install]&lt;/span&gt;
&lt;span class="py"&gt;WantedBy&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;hibernate.target suspend.target hybrid-sleep.target sleep.target&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Usage:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;asus-tuf-kbd-led on             &lt;span class="c"&gt;# restore last state&lt;/span&gt;
asus-tuf-kbd-led off
asus-tuf-kbd-led white
asus-tuf-kbd-led red|green|blue
asus-tuf-kbd-led &lt;span class="nb"&gt;set &lt;/span&gt;ff8800     &lt;span class="c"&gt;# custom color (hex)&lt;/span&gt;
asus-tuf-kbd-led intensity 128  &lt;span class="c"&gt;# 0-255 brightness&lt;/span&gt;
asus-tuf-kbd-led info
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This works completely standalone and survives reboot, suspend, hibernate.&lt;/p&gt;

&lt;h4&gt;
  
  
  Option B: patched asusctl (upstream-quality fix)
&lt;/h4&gt;

&lt;p&gt;For the proper solution that makes &lt;code&gt;rog-control-center&lt;/code&gt; and &lt;code&gt;asusctl&lt;/code&gt; themselves work, I patched the asusctl codebase to add I2C-HID LampArray support. The patch is open as &lt;strong&gt;PR to &lt;code&gt;opengamingcollective/asusctl&lt;/code&gt;&lt;/strong&gt;: &lt;a href="https://github.com/OpenGamingCollective/asusctl/pull/147" rel="noopener noreferrer"&gt;https://github.com/OpenGamingCollective/asusctl/pull/147&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The patch:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;adds an I2C-HID fallback path to &lt;code&gt;aura_manager::init_hid_devices&lt;/code&gt; (existing USB path untouched)&lt;/li&gt;
&lt;li&gt;adds &lt;code&gt;DeviceHandle::maybe_lamparray()&lt;/code&gt; factory&lt;/li&gt;
&lt;li&gt;adds &lt;code&gt;Aura::is_lamparray&lt;/code&gt; flag and &lt;code&gt;lamparray_write_effect&lt;/code&gt;/&lt;code&gt;lamparray_set_brightness&lt;/code&gt;/&lt;code&gt;lamparray_set_aura_power&lt;/code&gt; methods&lt;/li&gt;
&lt;li&gt;routes the zbus methods through the LampArray branch when &lt;code&gt;is_lamparray=true&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;fixes a &lt;code&gt;HIDIOCGRAWINFO&lt;/code&gt; ioctl size bug (was &lt;code&gt;12&lt;/code&gt;, kernel struct is &lt;code&gt;8&lt;/code&gt; bytes)&lt;/li&gt;
&lt;li&gt;fixes &lt;code&gt;HID_ID&lt;/code&gt; parsing (was string compare on padded hex, now numeric)&lt;/li&gt;
&lt;li&gt;fixes a &lt;code&gt;tokio::Mutex&amp;lt;AuraConfig&amp;gt;&lt;/code&gt; deadlock between zbus method and internal write&lt;/li&gt;
&lt;li&gt;fixes a systemd &lt;code&gt;Type=dbus&lt;/code&gt; timeout by registering the bus name before discovery&lt;/li&gt;
&lt;li&gt;uses &lt;code&gt;O_NONBLOCK&lt;/code&gt; on the hidraw open to avoid blocking inside the i2c-hid kernel driver&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;After the patched binary is installed, the test sequence is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo install&lt;/span&gt; &lt;span class="nt"&gt;-m755&lt;/span&gt; target/release/asusd /usr/bin/asusd
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl restart asusd

&lt;span class="nv"&gt;$ &lt;/span&gt;busctl tree xyz.ljones.Asusd | &lt;span class="nb"&gt;grep &lt;/span&gt;aura
└─ /xyz/ljones/aura/lamparray_19b6

&lt;span class="nv"&gt;$ &lt;/span&gt;asusctl aura effect static &lt;span class="nt"&gt;-c&lt;/span&gt; ff0000   &lt;span class="c"&gt;# keyboard turns red&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;asusctl aura effect static &lt;span class="nt"&gt;-c&lt;/span&gt; 00ff00   &lt;span class="c"&gt;# green&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;asusctl aura effect static &lt;span class="nt"&gt;-c&lt;/span&gt; 0000ff   &lt;span class="c"&gt;# blue&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And &lt;code&gt;rog-control-center&lt;/code&gt; color picker on the keyboard tab now drives the hardware in real time.&lt;/p&gt;




&lt;h2&gt;
  
  
  Part 2 — Screen brightness in hybrid GPU mode
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The diagnosis (corrected)
&lt;/h3&gt;

&lt;p&gt;The internal panel is wired to the AMD iGPU, but in hybrid mode the kernel exposes three "backlight" devices, two of which are cosmetic:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Device&lt;/th&gt;
&lt;th&gt;Status on FA608WV&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;amdgpu_bl0&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;created but writes are no-ops (cosmetic)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;nvidia_0&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;created by NVIDIA DRM but cosmetic in hybrid (NVIDIA isn't driving the panel)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;nvidia_wmi_ec_backlight&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;the real one&lt;/strong&gt; — driver talks to the Embedded Controller via NVIDIA WMI&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The trick is that &lt;code&gt;nvidia_wmi_ec_backlight&lt;/code&gt; is the path that &lt;strong&gt;actually controls the panel&lt;/strong&gt; even though it's named "nvidia" — in hybrid mode, the EC accepts the WMI command and adjusts the panel backlight regardless of which GPU is "active". The earlier dev.to deep dive concluded amdgpu_bl0 was the right one because the kernel registers it; in practice on this BIOS, it's cosmetic and only &lt;code&gt;nvidia_wmi_ec_backlight&lt;/code&gt; works.&lt;/p&gt;

&lt;p&gt;If you've already added &lt;code&gt;acpi_backlight=native&lt;/code&gt; to your kernel cmdline or blacklisted &lt;code&gt;nvidia_wmi_ec_backlight&lt;/code&gt;, &lt;strong&gt;undo both&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo rm&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; /etc/modprobe.d/blacklist-nvidia-wmi-backlight.conf
&lt;span class="nb"&gt;sudo &lt;/span&gt;kernelstub &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'acpi_backlight=native'&lt;/span&gt;    &lt;span class="c"&gt;# if you previously added it&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;update-initramfs &lt;span class="nt"&gt;-u&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;reboot
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After reboot, only one backlight device should be present:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;ls&lt;/span&gt; /sys/class/backlight/
nvidia_wmi_ec_backlight

&lt;span class="nv"&gt;$ &lt;/span&gt;brightnessctl &lt;span class="nt"&gt;--device&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;nvidia_wmi_ec_backlight &lt;span class="nb"&gt;set &lt;/span&gt;30%   &lt;span class="c"&gt;# screen actually dims&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;brightnessctl &lt;span class="nt"&gt;--device&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;nvidia_wmi_ec_backlight &lt;span class="nb"&gt;set &lt;/span&gt;100%  &lt;span class="c"&gt;# back to bright&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Hook into COSMIC Fn keys
&lt;/h3&gt;

&lt;p&gt;If you're on Pop!_OS 24.04 with COSMIC desktop, override the system actions to use the real device:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# In ~/.config/cosmic/com.system76.CosmicSettings.Shortcuts/v1/system_actions&lt;/span&gt;
&lt;span class="c"&gt;# Replace the busctl-based BrightnessUp/Down with brightnessctl on the working device&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Set them to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;BrightnessUp:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"brightnessctl --device=nvidia_wmi_ec_backlight set +5%"&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;BrightnessDown:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"brightnessctl --device=nvidia_wmi_ec_backlight set 5%-"&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After logout/login, the laptop's Fn brightness keys work nat.&lt;/p&gt;

&lt;p&gt;Pop!_OS already grants the &lt;code&gt;video&lt;/code&gt; group write access to the brightness file, so no extra udev rule is needed.&lt;/p&gt;




&lt;h2&gt;
  
  
  Part 3 — Hibernate (S4) when closing the lid
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Why default suspend overheats
&lt;/h3&gt;

&lt;p&gt;The FA608WV firmware only advertises s2idle (&lt;code&gt;/sys/power/mem_sleep&lt;/code&gt; shows &lt;code&gt;[s2idle]&lt;/code&gt;), not S3 deep sleep. Closing the lid puts the system into Modern Standby, where the OS may keep waking the CPU to service spurious events. Inside a backpack, the laptop runs hot.&lt;/p&gt;

&lt;p&gt;S4 (hibernate-to-disk) on the other hand truly powers off the machine. The catch: Pop!_OS 24.04 doesn't enable hibernation by default — there's no resume swap, the kernel cmdline has no &lt;code&gt;resume=&lt;/code&gt;, and the COSMIC desktop masks &lt;code&gt;hibernate.target&lt;/code&gt; and &lt;code&gt;sleep.target&lt;/code&gt; to avoid double-handling with the compositor.&lt;/p&gt;

&lt;h3&gt;
  
  
  Enable real hibernation
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Create a swapfile&lt;/strong&gt; sized to your RAM (mine: 36 GB for 32 GB):
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   &lt;span class="nb"&gt;sudo dd &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/dev/zero &lt;span class="nv"&gt;of&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/swapfile &lt;span class="nv"&gt;bs&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1M &lt;span class="nv"&gt;count&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;36864 &lt;span class="nv"&gt;status&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;progress
   &lt;span class="nb"&gt;sudo chmod &lt;/span&gt;600 /swapfile
   &lt;span class="nb"&gt;sudo &lt;/span&gt;mkswap /swapfile
   &lt;span class="nb"&gt;sudo &lt;/span&gt;swapon /swapfile
   &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'/swapfile none swap sw 0 0'&lt;/span&gt; | &lt;span class="nb"&gt;sudo tee&lt;/span&gt; &lt;span class="nt"&gt;-a&lt;/span&gt; /etc/fstab
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Find the resume offset of the swapfile&lt;/strong&gt;:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   &lt;span class="nb"&gt;sudo &lt;/span&gt;filefrag &lt;span class="nt"&gt;-v&lt;/span&gt; /swapfile | &lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="s1"&gt;'/^ *0:/ {gsub(/\.\./,"",$4); print $4; exit}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Add kernel cmdline parameters via kernelstub&lt;/strong&gt; (Pop!_OS uses systemd-boot):
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   &lt;span class="nv"&gt;ROOT_UUID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;findmnt &lt;span class="nt"&gt;-no&lt;/span&gt; UUID /&lt;span class="si"&gt;)&lt;/span&gt;
   &lt;span class="nv"&gt;OFFSET&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;from step 2&amp;gt;
   &lt;span class="nb"&gt;sudo &lt;/span&gt;kernelstub &lt;span class="nt"&gt;-a&lt;/span&gt; &lt;span class="s2"&gt;"resume=UUID=&lt;/span&gt;&lt;span class="nv"&gt;$ROOT_UUID&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
   &lt;span class="nb"&gt;sudo &lt;/span&gt;kernelstub &lt;span class="nt"&gt;-a&lt;/span&gt; &lt;span class="s2"&gt;"resume_offset=&lt;/span&gt;&lt;span class="nv"&gt;$OFFSET&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Add resume configuration to initramfs&lt;/strong&gt;:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"RESUME=UUID=&lt;/span&gt;&lt;span class="nv"&gt;$ROOT_UUID&lt;/span&gt;&lt;span class="s2"&gt; resume_offset=&lt;/span&gt;&lt;span class="nv"&gt;$OFFSET&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; | &lt;span class="nb"&gt;sudo tee&lt;/span&gt; /etc/initramfs-tools/conf.d/resume
   &lt;span class="nb"&gt;sudo &lt;/span&gt;update-initramfs &lt;span class="nt"&gt;-u&lt;/span&gt; &lt;span class="nt"&gt;-k&lt;/span&gt; all
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Unmask the systemd sleep targets&lt;/strong&gt; (COSMIC blocks them by default):
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   &lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl unmask hibernate.target suspend.target hybrid-sleep.target suspend-then-hibernate.target sleep.target
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Disable zram&lt;/strong&gt; (otherwise systemd refuses to hibernate — zram is RAM, can't survive shutdown):
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   &lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl disable &lt;span class="nt"&gt;--now&lt;/span&gt; pop-default-settings-zram.service
   &lt;span class="nb"&gt;sudo &lt;/span&gt;apt remove pop-default-settings-zram
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Wire the lid close to hibernate&lt;/strong&gt;:
In &lt;code&gt;/etc/systemd/logind.conf&lt;/code&gt;:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight conf"&gt;&lt;code&gt;   &lt;span class="n"&gt;HandleLidSwitch&lt;/span&gt;=&lt;span class="n"&gt;hibernate&lt;/span&gt;
   &lt;span class="n"&gt;HandleLidSwitchExternalPower&lt;/span&gt;=&lt;span class="n"&gt;hibernate&lt;/span&gt;
   &lt;span class="n"&gt;HandleLidSwitchDocked&lt;/span&gt;=&lt;span class="n"&gt;ignore&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then &lt;code&gt;sudo systemctl restart systemd-logind&lt;/code&gt; (or just reboot).&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Test&lt;/strong&gt;:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   &lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl hibernate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The laptop should power off completely. Power back on and the session is restored, including all apps and browser tabs.&lt;/p&gt;

&lt;h3&gt;
  
  
  Verification
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;journalctl -b -1 | grep -iE 'hibern|S4'&lt;/code&gt; should show:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;ACPI: PM: Preparing to enter system sleep state S4
PM: hibernation: Creating image
PM: hibernation: Need to copy N pages
ACPI: PM: Waking up from system sleep state S4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And &lt;code&gt;last -x&lt;/code&gt; will show a &lt;code&gt;shutdown&lt;/code&gt; followed by a &lt;code&gt;reboot&lt;/code&gt; covering the entire hibernated window.&lt;/p&gt;

&lt;p&gt;The hibernation image takes a few seconds to write (depends on RAM in use), and resume is similar. Power consumption during hibernate is the same as a full shutdown.&lt;/p&gt;




&lt;h2&gt;
  
  
  What's &lt;em&gt;not&lt;/em&gt; yet fixed (FA608WV)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;per-key RGB&lt;/strong&gt;: the LampArray on this SKU reports &lt;code&gt;LampCount=1&lt;/code&gt;, so it's hardware-limited to single zone. No software fix.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;asus-armoury&lt;/code&gt; power-limit attributes&lt;/strong&gt;: the kernel &lt;code&gt;asus_armoury&lt;/code&gt; driver tries to read attributes that this BIOS doesn't expose. Spammy errors in journal but functionally harmless. Upstream kernel cleanup.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://usb.org/sites/default/files/hut1_5.pdf" rel="noopener noreferrer"&gt;Microsoft HID Usage Tables 1.5 — LampArray Section&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/sureshsaragadam/asus-tuf-gaming-a16-fa608wv-on-linux-screen-brightness-keyboard-backlight-a-deep-dive-into-a-3c04"&gt;Original FA608WV deep dive — dev.to / @sureshsaragadam (Jan 2026)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/asus-linux/asusctl/issues/700" rel="noopener noreferrer"&gt;asus-linux/asusctl issue #700 — FA608WV&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/asus-linux/asusctl/issues/578" rel="noopener noreferrer"&gt;asus-linux/asusctl issue #578 — FA608WI (sibling)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PR on OGC asusctl (this work)&lt;/strong&gt;: &lt;a href="https://github.com/OpenGamingCollective/asusctl/pull/147" rel="noopener noreferrer"&gt;https://github.com/OpenGamingCollective/asusctl/pull/147&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If your laptop is a sibling SKU (FA608WI, FA608WD, etc.), check &lt;code&gt;ls /sys/bus/hid/devices/ | grep 0B05&lt;/code&gt; and &lt;code&gt;sudo xxd /sys/bus/hid/devices/&amp;lt;id&amp;gt;/report_descriptor | grep "05 59"&lt;/code&gt;. If both produce output, the same approach should work — possibly with a different PID. Report back, I'll update the asusctl PID whitelist.&lt;/p&gt;

</description>
      <category>linux</category>
      <category>asus</category>
      <category>hardware</category>
      <category>hid</category>
    </item>
  </channel>
</rss>
